Files
Web_FreeCAD_Bitbybit/native/freecad-naming-probe/abi-candidate-smoke.ts
wangdequan f97eae4153
Some checks failed
real-verification / chrome (push) Has been cancelled
real-verification / freecad-oracle (push) Has been cancelled
real-verification / wasm (push) Has been cancelled
feat: add candidate FreeCAD naming SDK and attachment oracles
Build and verify the candidate-only FreeCAD naming bridge and OCCT worker path, including three-stage StringHasher restoration. Add Datum, ShapeBinder, attachment-mode, and PartDesign structure oracles plus offline SDK build plans and CI boundary checks.
2026-08-13 17:16:07 -04:00

75 lines
3.4 KiB
TypeScript

import createProbe from './dist/freecad-private-naming-source-probe.js'
import { parseElementMap2 } from '../../src/facade/elementMap2'
import {
captureFreeCadPrivateNamingEvidence,
createFreeCadPrivateNamingAbiRequest,
probeFreeCadPrivateNamingAbi,
type NativeFreeCadNamingAbiModule,
} from '../../src/facade/nativeNamingAbi'
type CandidateProbe = {
freecadNamingCandidateAbiVersion(): number
freecadNamingCandidateCapabilitiesJson(): string
freecadNamingCandidateEvidenceJson(requestJson: string): string
}
const native = await createProbe() as CandidateProbe
const candidate: NativeFreeCadNamingAbiModule = {
freecadNamingAbiVersion: () => native.freecadNamingCandidateAbiVersion(),
freecadNamingCapabilitiesJson: () => native.freecadNamingCandidateCapabilitiesJson(),
freecadNamingEvidenceJson: (requestJson) => {
const response = JSON.parse(native.freecadNamingCandidateEvidenceJson(requestJson)) as Record<string, unknown>
const elementMap2Text = response.elementMap2Text
if (typeof elementMap2Text !== 'string') throw new TypeError('Candidate response omitted native ElementMap2 text.')
delete response.elementMap2Text
response.elementMap2 = parseElementMap2(elementMap2Text)
return JSON.stringify(response)
},
}
const abiProbe = probeFreeCadPrivateNamingAbi(candidate)
if (abiProbe.availability !== 'available') throw new Error(`Candidate ABI probe failed: ${abiProbe.reason}`)
const request = createFreeCadPrivateNamingAbiRequest({
requestId: 'source-candidate-request',
documentId: 'source-candidate-document',
documentVersion: 1,
operationId: 'source-candidate-cut',
operation: 'cut',
stageId: 'source-candidate:stage:0',
resultObjectId: 'source-candidate:result',
resultObjectTag: 99,
inputs: [
{ inputId: 'object', objectId: 'source-candidate:object', role: 'object', step: 'ISO-10303-21; probe object', objectTag: 42 },
{ inputId: 'tool', objectId: 'source-candidate:tool', role: 'tool', step: 'ISO-10303-21; probe tool', objectTag: 43 },
],
stages: [{ stageId: 'source-candidate:stage:0', operation: 'cut', inputIds: ['object', 'tool'], ordinal: 0 }],
resultStep: 'ISO-10303-21; probe result',
history: {
provider: 'occt-native',
occtVersion: '8.0.0',
hasModified: true,
hasGenerated: false,
hasDeleted: false,
resultStep: 'ISO-10303-21; probe result',
records: [{ relation: 'modified', source: 'object', kind: 'face', sourceIndex: 0, resultIndex: 2 }],
},
})
const evidence = captureFreeCadPrivateNamingEvidence(candidate, request, abiProbe)
if (!evidence || evidence.status !== 'native-evidence') throw new Error('Candidate ABI returned no native evidence.')
if (evidence.mappedNames?.[0]?.reference.name !== '#1' || evidence.mappedNames[0].reference.postfix !== ';:H2a,F') throw new Error('Candidate ABI mapped-name reference is unexpected.')
if (evidence.stringHasher?.entries.length !== 1 || evidence.elementMap2?.maps.length !== 1) throw new Error('Candidate ABI native resource evidence is incomplete.')
console.log(JSON.stringify({
status: 'freecad-private-naming-abi-candidate-pass',
descriptor: abiProbe.descriptor,
evidence: {
stageId: evidence.stageId,
resultObjectId: evidence.resultObjectId,
mappedNames: evidence.mappedNames.length,
stringHasherEntries: evidence.stringHasher.entries.length,
elementMaps: evidence.elementMap2.maps.length,
},
productionCallbacksExported: false,
productionWorkerLinked: false,
}, null, 2))