@faicad/faijs 0.13.2 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +30 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts +19 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +51 -10
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +8 -7
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +45 -0
- package/dist/api/compound-geom.d.ts.map +1 -0
- package/dist/api/compound-geom.js +85 -0
- package/dist/api/compound-geom.js.map +1 -0
- package/dist/api/compound.d.ts +2 -0
- package/dist/api/compound.d.ts.map +1 -1
- package/dist/api/compound.js +2 -0
- package/dist/api/compound.js.map +1 -1
- package/dist/api/copy.d.ts +1 -0
- package/dist/api/copy.d.ts.map +1 -1
- package/dist/api/copy.js +4 -2
- package/dist/api/copy.js.map +1 -1
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +7 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +1 -0
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +131 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +7 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/fai_drill.d.ts +1 -1
- package/dist/api/fai_drill.d.ts.map +1 -1
- package/dist/api/fai_drill.js +31 -18
- package/dist/api/fai_drill.js.map +1 -1
- package/dist/api/fai_extrude.d.ts +1 -1
- package/dist/api/fai_extrude.d.ts.map +1 -1
- package/dist/api/fai_extrude.js +2 -1
- package/dist/api/fai_extrude.js.map +1 -1
- package/dist/api/fai_split.d.ts +1 -1
- package/dist/api/fai_split.d.ts.map +1 -1
- package/dist/api/fai_split.js +2 -1
- package/dist/api/fai_split.js.map +1 -1
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +6 -5
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/operations.js +16 -16
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +0 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -4
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -3
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -48
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +20 -62
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/import-brep.d.ts +36 -0
- package/dist/api/import-brep.d.ts.map +1 -0
- package/dist/api/import-brep.js +72 -0
- package/dist/api/import-brep.js.map +1 -0
- package/dist/api/import-step.d.ts +28 -0
- package/dist/api/import-step.d.ts.map +1 -0
- package/dist/api/import-step.js +57 -0
- package/dist/api/import-step.js.map +1 -0
- package/dist/api/index.d.ts +7 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +19 -5
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +2 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +1 -0
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/load.d.ts +3 -1
- package/dist/api/load.d.ts.map +1 -1
- package/dist/api/load.js +3 -1
- package/dist/api/load.js.map +1 -1
- package/dist/api/pattern.d.ts +32 -0
- package/dist/api/pattern.d.ts.map +1 -0
- package/dist/api/pattern.js +121 -0
- package/dist/api/pattern.js.map +1 -0
- package/dist/api/place.d.ts +35 -0
- package/dist/api/place.d.ts.map +1 -0
- package/dist/api/place.js +113 -0
- package/dist/api/place.js.map +1 -0
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +10 -3
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +1 -0
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +1 -0
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +1 -0
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split.d.ts +31 -0
- package/dist/api/split.d.ts.map +1 -0
- package/dist/api/split.js +96 -0
- package/dist/api/split.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +9 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +49 -30
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/svgExtrude.d.ts.map +1 -1
- package/dist/api/svgExtrude.js +1 -0
- package/dist/api/svgExtrude.js.map +1 -1
- package/dist/api/text.d.ts.map +1 -1
- package/dist/api/text.js +1 -0
- package/dist/api/text.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +65 -3
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +4 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +44 -12
- package/dist/api/transform.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +34 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +62 -22
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +8 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +6 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +24 -1
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +17 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +49 -6
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +6 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +78 -8
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +130 -17
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +27 -1
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +19 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +21 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +44 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +46 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +2 -0
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +9 -1
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +14 -4
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/module-registry.d.ts +3 -1
- package/dist/cad-runtime/module-registry.d.ts.map +1 -1
- package/dist/cad-runtime/module-registry.js +13 -1
- package/dist/cad-runtime/module-registry.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +7 -0
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
- package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
- package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
- package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
- package/dist/cad-runtime/runtime.d.ts +54 -2
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +186 -10
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +22 -0
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +82 -12
- package/dist/define-op.js.map +1 -1
- package/dist/fcstd/attachment.d.ts +8 -1
- package/dist/fcstd/attachment.d.ts.map +1 -1
- package/dist/fcstd/attachment.js +7 -1
- package/dist/fcstd/attachment.js.map +1 -1
- package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
- package/dist/fcstd/build-fai-zip.js +12 -7
- package/dist/fcstd/build-fai-zip.js.map +1 -1
- package/dist/fcstd/codegen.d.ts +10 -1
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +150 -48
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/contour.d.ts.map +1 -1
- package/dist/fcstd/contour.js +23 -24
- package/dist/fcstd/contour.js.map +1 -1
- package/dist/fcstd/convert.d.ts +2 -18
- package/dist/fcstd/convert.d.ts.map +1 -1
- package/dist/fcstd/convert.js +35 -53
- package/dist/fcstd/convert.js.map +1 -1
- package/dist/fcstd/external-geo.d.ts +12 -1
- package/dist/fcstd/external-geo.d.ts.map +1 -1
- package/dist/fcstd/external-geo.js +15 -1
- package/dist/fcstd/external-geo.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts +21 -1
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +108 -6
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts +83 -0
- package/dist/fcstd/structural-types.d.ts.map +1 -0
- package/dist/fcstd/structural-types.js +116 -0
- package/dist/fcstd/structural-types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +62 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -0
- package/dist/lang/determinism-scanner.js +619 -0
- package/dist/lang/determinism-scanner.js.map +1 -0
- package/dist/lang/symbol-table.generated.d.ts +7 -3
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +7 -3
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +3 -2
- package/dist/mesh/index.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +56 -2
- package/dist/node-host/cli.js.map +1 -1
- package/dist/runtime-state.d.ts +18 -6
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +9 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/shape.d.ts +15 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +26 -3
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/build-naming.d.ts +14 -30
- package/dist/topology/naming/build-naming.d.ts.map +1 -1
- package/dist/topology/naming/build-naming.js +21 -54
- package/dist/topology/naming/build-naming.js.map +1 -1
- package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
- package/dist/topology/naming/capture-topo-ref.js +5 -0
- package/dist/topology/naming/capture-topo-ref.js.map +1 -1
- package/dist/topology/naming/index.d.ts +3 -0
- package/dist/topology/naming/index.d.ts.map +1 -1
- package/dist/topology/naming/index.js +3 -0
- package/dist/topology/naming/index.js.map +1 -1
- package/dist/topology/naming/lineage-resolve.d.ts +80 -0
- package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
- package/dist/topology/naming/lineage-resolve.js +120 -0
- package/dist/topology/naming/lineage-resolve.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +349 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -0
- package/dist/topology/naming/lineage.js +398 -0
- package/dist/topology/naming/lineage.js.map +1 -0
- package/dist/topology/naming/migrate.d.ts +41 -0
- package/dist/topology/naming/migrate.d.ts.map +1 -0
- package/dist/topology/naming/migrate.js +88 -0
- package/dist/topology/naming/migrate.js.map +1 -0
- package/dist/topology/naming/role-name.d.ts +176 -0
- package/dist/topology/naming/role-name.d.ts.map +1 -0
- package/dist/topology/naming/role-name.js +344 -0
- package/dist/topology/naming/role-name.js.map +1 -0
- package/dist/topology/naming/roles.d.ts +20 -22
- package/dist/topology/naming/roles.d.ts.map +1 -1
- package/dist/topology/naming/roles.js +51 -49
- package/dist/topology/naming/roles.js.map +1 -1
- package/dist/topology/naming/types.d.ts +65 -18
- package/dist/topology/naming/types.d.ts.map +1 -1
- package/dist/topology/naming/types.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-registry.js","sourceRoot":"","sources":["../../src/cad-runtime/module-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * module-registry — 多文件模块注册表(§4.5 / A-8/A-9/A-10)\n *\n * 无 IR 通道的多文件装载:主模块(runtime 直接执行)的顶层相对 import\n * (`import { bp } from './x.fai.js'`)指向项目内其它 `.fai.js` 模块。\n * 每个依赖模块用**独立 ctx** 执行(经注入的 ModuleRunner),产出导出面:\n * - values:模块存活 ctx 键中的 shape/常量(非函数);\n * - fns:模块内顶层函数;\n * - liveShapes:computeLiveShapes 对该模块自身的存活终端(模块内消费判定生效——\n * A-9:A 内被消费的 shape 不在 liveShapes → B 引用报错)。\n *\n * 名字契约(D6):A 的 LHS 名 = 导出名;B 的 import 绑定名 = 引用名;绑定必须 ∈\n * A.liveShapes ∪ A.fns(A-8 缺失导出名 → ModuleRegistryError)。普通常量不在此列——\n * 具名 import 常量被拒,见\n * .agents/notes/rejected/architecture/2026-09-09-named-import-of-constants.md。\n * 跨文件引用 ≠ 消费:B 引用 A 的 shape 不影响 A 的 liveShapes(A 单独执行时计算)。\n *\n * 装载:DFS 递归(相对 specifier → moduleKey 归一 → readSource → 提取其 import →\n * 先装依赖 → 带 seed 执行自身);循环依赖 → MODULE_CYCLE(failedAt 带环路径)。\n * 本实现每次调用重建缓存(execute/append 各轮全量重读重执行;fingerprint 增量缓存\n * 留作 v2)。\n */\n\nimport { extractMetadata } from '../lang/metadata-extractor'\nimport type { UiMetadata } from '../lang/metadata-extractor'\nimport { assertSecure, type SecurityPolicy, S6_MAX_DEPTH, S6_MAX_MODULES } from '../lang/security-scanner'\nimport { computeLiveShapes, type KeepRegistration } from './live-shapes'\nimport type { ExecKeepRecord } from './direct-executor'\nimport type { ProjectLoader } from './ports'\nimport { asPartName, type PartName } from '../identity'\nimport { ParseError } from '../lang/parse-error'\n\n// ── 导出类型 ──\n\n/** 模块导出面(§4.5 FaiModuleExports)。 */\nexport interface FaiModuleExports {\n /** 存活 shape + 常量(params)——ctx 非函数键 */\n values: Record<string, unknown>\n /** 顶层函数(ctx 函数键) */\n fns: Record<string, (...a: unknown[]) => unknown>\n /** 存活 shape 名(引用校验;模块内消费生效) */\n liveShapes: Set<string>\n}\n\n/** 已装载模块。 */\nexport interface FaiModule {\n key: string\n exports: FaiModuleExports\n}\n\n/** 模块执行视图(ModuleRunner 返回;DirectExecutor 满足该形状)。 */\nexport interface ModuleRunResult {\n listCtxKeys(): string[]\n getCtxVar(name: string): unknown\n listKeepLines(): number[]\n getKeepByLine(lineNo: number): ExecKeepRecord | undefined\n /** P25 §3.7.4:原地写回登记(裸调用行 → 写回目标变量名;DirectExecutor 提供)。 */\n getInplaceWrites?(): Map<number, string>\n}\n\n/** 模块执行回调:独立 ctx 执行模块源码(imports = 该模块自己的 seed)。 */\nexport type ModuleRunner = (code: string, imports: Record<string, unknown>) => Promise<ModuleRunResult>\n\n/** 多文件装载错误码(runtime 归并为 ExecutionResult.failedAt)。 */\nexport type ModuleRegistryErrorCode =\n | 'MODULE_NOT_FOUND'\n | 'MODULE_CYCLE'\n | 'MODULE_EXEC_FAILED'\n | 'BINDING_NOT_EXPORTED'\n | 'MODULE_SECURITY'\n | 'MODULE_DEPTH_EXCEEDED'\n | 'MODULE_COUNT_EXCEEDED'\n\n/** 多文件装载错误(带 lineNo/callee,供 failedAt 定位 import 行)。 */\nexport class ModuleRegistryError extends Error {\n /** 错误码(MODULE_NOT_FOUND / MODULE_CYCLE / MODULE_EXEC_FAILED / BINDING_NOT_EXPORTED)。 */\n readonly code: ModuleRegistryErrorCode\n /** import 行号(failedAt.lineNo 定位用;可选)。 */\n readonly lineNo?: number\n /** 绑定名 / callee(failedAt.callee 用;可选)。 */\n readonly callee?: string\n constructor(code: ModuleRegistryErrorCode, message: string, info?: { lineNo?: number; callee?: string }) {\n super(message)\n this.name = 'ModuleRegistryError'\n this.code = code\n this.lineNo = info?.lineNo\n this.callee = info?.callee\n }\n}\n\n// ── 路径归一 ──\n\n/**\n * 相对 specifier 判定('./x' / '../x' / '/x';裸 specifier = libLoader 通道,不在此)。\n * @param specifier - import 说明符。\n * @returns 该 specifier 是否指向项目内相对路径模块。\n */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith('./') || specifier.startsWith('../') || specifier.startsWith('/')\n}\n\n/**\n * 相对 specifier → moduleKey(POSIX 斜杠归一 + ./.. 段消解;相对 baseKey 目录)。\n * @param specifier - import 说明符(如 './bp.fai.js')。\n * @param baseKey - 所在模块的 moduleKey(取其目录为解析基准);主模块可省。\n * @returns 归一后的 moduleKey(与 loader.listModules() 精确匹配)。\n */\nexport function normalizeModuleKey(specifier: string, baseKey?: string): string {\n const spec = specifier.replace(/\\\\/g, '/')\n const baseDir = baseKey && baseKey.includes('/')\n ? baseKey.slice(0, baseKey.lastIndexOf('/') + 1)\n : ''\n // 绝对形态(/x)不拼 baseDir;相对形态按 baseKey 目录解析\n const combined = spec.startsWith('/') ? spec.slice(1) : `${baseDir}${spec}`\n const segs: string[] = []\n for (const seg of combined.split('/')) {\n if (seg === '' || seg === '.') continue\n if (seg === '..') {\n segs.pop()\n continue\n }\n segs.push(seg)\n }\n return segs.join('/')\n}\n\n// ── ModuleRegistry ──\n\n/**\n * 多文件模块注册表:装载/导出/绑定校验。每次调用实例化(缓存仅存活单轮装载)。\n */\nexport class ModuleRegistry {\n private cache = new Map<string, FaiModule>()\n private loadCount = 0\n\n constructor(\n private readonly loader: ProjectLoader,\n private readonly run: ModuleRunner,\n private readonly securityPolicy: SecurityPolicy = 'strict',\n ) {}\n\n /**\n * 装载 import 表对应的全部依赖并返回 seed(绑定名 → 值)。\n * @param imports - 顶层 import 条目(UiMetadata.imports 同构)。\n * @param baseKey - 所在模块的 moduleKey(相对 specifier 解析基准);主模块无 key。\n * @returns seed map(供 DirectExecutor opts.imports / params 预置 ctx)。\n * @throws ModuleRegistryError — 环 / 模块缺失 / 依赖执行失败 / 绑定未导出。\n */\n /**\n * 装载 import 表对应的全部依赖并返回 seed(绑定名 → 值)。\n * @param imports - 顶层 import 条目(UiMetadata.imports 同构)。\n * @param baseKey - 所在模块的 moduleKey(相对 specifier 解析基准);主模块无 key。\n * @param stack - 循环依赖检测栈(内部递归使用;外部调用缺省 [])。\n * @returns seed map(供 DirectExecutor opts.imports / params 预置 ctx)。\n * @throws ModuleRegistryError — 环 / 模块缺失 / 依赖执行失败 / 绑定未导出。\n */\n async resolveImports(\n imports: UiMetadata['imports'],\n baseKey?: string,\n stack: string[] = [],\n ): Promise<Record<string, unknown>> {\n const seed: Record<string, unknown> = {}\n for (const imp of imports ?? []) {\n if (!isRelativeSpecifier(imp.specifier)) continue // 裸 specifier → libLoader 通道\n const depKey = normalizeModuleKey(imp.specifier, baseKey)\n const dep = await this.load(depKey, stack)\n if (imp.kind === 'namespace' || imp.kind === 'default') {\n if (imp.localName) seed[imp.localName] = this.namespaceView(dep)\n continue\n }\n // named:每个绑定分别校验\n for (const binding of imp.bindings) {\n const value = this.resolveBinding(binding, dep, imp.lineNo)\n if (value !== undefined) seed[binding] = value\n }\n }\n return seed\n }\n\n /** 装载并执行单个模块(递归装其依赖;缓存本装载轮)。 */\n private async load(key: string, stack: string[]): Promise<FaiModule> {\n const cached = this.cache.get(key)\n if (cached) return cached\n if (stack.includes(key)) {\n throw new ModuleRegistryError(\n 'MODULE_CYCLE',\n `module cycle detected: ${[...stack, key].join(' -> ')}`,\n )\n }\n // S6:装载深度上限\n if (stack.length >= S6_MAX_DEPTH) {\n throw new ModuleRegistryError(\n 'MODULE_DEPTH_EXCEEDED',\n `module loading depth exceeded ${S6_MAX_DEPTH} (stack: ${stack.join(' -> ')})`,\n )\n }\n // S6:模块总数上限\n if (this.loadCount >= S6_MAX_MODULES) {\n throw new ModuleRegistryError(\n 'MODULE_COUNT_EXCEEDED',\n `total module count exceeded ${S6_MAX_MODULES} limit`,\n )\n }\n const available = this.loader.listModules()\n if (!available.includes(key)) {\n throw new ModuleRegistryError(\n 'MODULE_NOT_FOUND',\n `module \"${key}\" not found in project (available: ${available.length > 0 ? available.join(', ') : 'none'})`,\n )\n }\n const source = await this.loader.readSource(key)\n // A3:子模块安全扫描前置(固定 strict;违规 → MODULE_SECURITY)\n try {\n assertSecure(source, {\n policy: 'strict',\n knownNames: ['cad'],\n defaultNs: 'cad',\n })\n } catch (err) {\n if (err instanceof ParseError) {\n throw new ModuleRegistryError(\n 'MODULE_SECURITY',\n `module \"${key}\" failed security check: ${err.message}`,\n { lineNo: err.line, callee: key },\n )\n }\n throw err\n }\n this.loadCount++\n const meta = extractMetadata(source, { security: 'strict' })\n const seed = await this.resolveImports(meta.imports ?? [], key, [...stack, key])\n const result = await this.run(source, seed) // 执行失败 → runner 抛 ModuleRegistryError\n const module = { key, exports: this.buildExports(meta, result) }\n this.cache.set(key, module)\n return module\n }\n\n private buildExports(meta: UiMetadata, result: ModuleRunResult): FaiModuleExports {\n const values: Record<string, unknown> = {}\n const fns: Record<string, (...a: unknown[]) => unknown> = {}\n const shapeVarNames = new Set<PartName>()\n for (const name of result.listCtxKeys()) {\n const v = result.getCtxVar(name)\n if (v === undefined) continue\n if (typeof v === 'function') {\n fns[name] = v as (...a: unknown[]) => unknown\n } else {\n values[name] = v\n if (v !== null && typeof v === 'object' && ('positions' in v || 'children' in v)) {\n shapeVarNames.add(asPartName(name))\n }\n }\n }\n // 模块自身的存活终端:函数体 keep 登记读 ModuleRunResult(DirectExecutor.keepByLine)\n const ipw = result.getInplaceWrites?.()\n const terminals = computeLiveShapes({\n lines: meta.lines,\n blocks: meta.blocks,\n keep: {\n lineEntries: (lineNo) => meta.keep.get(lineNo),\n functionBody: (lineNo): KeepRegistration | undefined => result.getKeepByLine(lineNo),\n },\n shapeVarNames,\n ...(ipw && ipw.size > 0 ? { inplaceWrites: ipw } : {}),\n })\n const liveShapes = new Set<string>(terminals.map((t) => String(t.id)))\n return { values, fns, liveShapes }\n }\n\n /** named 绑定解析:liveShapes ∪ fns;缺失 → BINDING_NOT_EXPORTED。 */\n private resolveBinding(binding: string, dep: FaiModule, lineNo: number): unknown | undefined {\n if (dep.exports.liveShapes.has(binding)) return dep.exports.values[binding]\n if (Object.prototype.hasOwnProperty.call(dep.exports.fns, binding)) return dep.exports.fns[binding]\n throw new ModuleRegistryError(\n 'BINDING_NOT_EXPORTED',\n `\"${binding}\" is not exported by module \"${dep.key}\" (live shapes: ${[...dep.exports.liveShapes].join(', ') || 'none'})`,\n { lineNo, callee: binding },\n )\n }\n\n /** 命名空间/默认 import 的模块视图:values + fns。 */\n private namespaceView(dep: FaiModule): Record<string, unknown> {\n return { ...dep.exports.values, ...dep.exports.fns }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"module-registry.js","sourceRoot":"","sources":["../../src/cad-runtime/module-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * module-registry — 多文件模块注册表(§4.5 / A-8/A-9/A-10)\n *\n * 无 IR 通道的多文件装载:主模块(runtime 直接执行)的顶层相对 import\n * (`import { bp } from './x.fai.js'`)指向项目内其它 `.fai.js` 模块。\n * 每个依赖模块用**独立 ctx** 执行(经注入的 ModuleRunner),产出导出面:\n * - values:模块存活 ctx 键中的 shape/常量(非函数);\n * - fns:模块内顶层函数;\n * - liveShapes:computeLiveShapes 对该模块自身的存活终端(模块内消费判定生效——\n * A-9:A 内被消费的 shape 不在 liveShapes → B 引用报错)。\n *\n * 名字契约(D6):A 的 LHS 名 = 导出名;B 的 import 绑定名 = 引用名;绑定必须 ∈\n * A.liveShapes ∪ A.fns(A-8 缺失导出名 → ModuleRegistryError)。普通常量不在此列——\n * 具名 import 常量被拒,见\n * .agents/notes/rejected/architecture/2026-09-09-named-import-of-constants.md。\n * 跨文件引用 ≠ 消费:B 引用 A 的 shape 不影响 A 的 liveShapes(A 单独执行时计算)。\n *\n * 装载:DFS 递归(相对 specifier → moduleKey 归一 → readSource → 提取其 import →\n * 先装依赖 → 带 seed 执行自身);循环依赖 → MODULE_CYCLE(failedAt 带环路径)。\n * 本实现每次调用重建缓存(execute/append 各轮全量重读重执行;fingerprint 增量缓存\n * 留作 v2)。\n */\n\nimport { extractMetadata } from '../lang/metadata-extractor'\nimport type { UiMetadata } from '../lang/metadata-extractor'\nimport { assertSecure, type SecurityPolicy, S6_MAX_DEPTH, S6_MAX_MODULES } from '../lang/security-scanner'\nimport { scanDeterminism, type DeterminismPolicy } from '../lang/determinism-scanner'\nimport { computeLiveShapes, type KeepRegistration } from './live-shapes'\nimport type { ExecKeepRecord } from './direct-executor'\nimport type { ProjectLoader } from './ports'\nimport { asPartName, type PartName } from '../identity'\nimport { ParseError } from '../lang/parse-error'\n\n// ── 导出类型 ──\n\n/** 模块导出面(§4.5 FaiModuleExports)。 */\nexport interface FaiModuleExports {\n /** 存活 shape + 常量(params)——ctx 非函数键 */\n values: Record<string, unknown>\n /** 顶层函数(ctx 函数键) */\n fns: Record<string, (...a: unknown[]) => unknown>\n /** 存活 shape 名(引用校验;模块内消费生效) */\n liveShapes: Set<string>\n}\n\n/** 已装载模块。 */\nexport interface FaiModule {\n key: string\n exports: FaiModuleExports\n}\n\n/** 模块执行视图(ModuleRunner 返回;DirectExecutor 满足该形状)。 */\nexport interface ModuleRunResult {\n listCtxKeys(): string[]\n getCtxVar(name: string): unknown\n listKeepLines(): number[]\n getKeepByLine(lineNo: number): ExecKeepRecord | undefined\n /** P25 §3.7.4:原地写回登记(裸调用行 → 写回目标变量名;DirectExecutor 提供)。 */\n getInplaceWrites?(): Map<number, string>\n}\n\n/** 模块执行回调:独立 ctx 执行模块源码(imports = 该模块自己的 seed)。 */\nexport type ModuleRunner = (code: string, imports: Record<string, unknown>) => Promise<ModuleRunResult>\n\n/** 多文件装载错误码(runtime 归并为 ExecutionResult.failedAt)。 */\nexport type ModuleRegistryErrorCode =\n | 'MODULE_NOT_FOUND'\n | 'MODULE_CYCLE'\n | 'MODULE_EXEC_FAILED'\n | 'BINDING_NOT_EXPORTED'\n | 'MODULE_SECURITY'\n | 'MODULE_DEPTH_EXCEEDED'\n | 'MODULE_COUNT_EXCEEDED'\n\n/** 多文件装载错误(带 lineNo/callee,供 failedAt 定位 import 行)。 */\nexport class ModuleRegistryError extends Error {\n /** 错误码(MODULE_NOT_FOUND / MODULE_CYCLE / MODULE_EXEC_FAILED / BINDING_NOT_EXPORTED)。 */\n readonly code: ModuleRegistryErrorCode\n /** import 行号(failedAt.lineNo 定位用;可选)。 */\n readonly lineNo?: number\n /** 绑定名 / callee(failedAt.callee 用;可选)。 */\n readonly callee?: string\n constructor(code: ModuleRegistryErrorCode, message: string, info?: { lineNo?: number; callee?: string }) {\n super(message)\n this.name = 'ModuleRegistryError'\n this.code = code\n this.lineNo = info?.lineNo\n this.callee = info?.callee\n }\n}\n\n// ── 路径归一 ──\n\n/**\n * 相对 specifier 判定('./x' / '../x' / '/x';裸 specifier = libLoader 通道,不在此)。\n * @param specifier - import 说明符。\n * @returns 该 specifier 是否指向项目内相对路径模块。\n */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith('./') || specifier.startsWith('../') || specifier.startsWith('/')\n}\n\n/**\n * 相对 specifier → moduleKey(POSIX 斜杠归一 + ./.. 段消解;相对 baseKey 目录)。\n * @param specifier - import 说明符(如 './bp.fai.js')。\n * @param baseKey - 所在模块的 moduleKey(取其目录为解析基准);主模块可省。\n * @returns 归一后的 moduleKey(与 loader.listModules() 精确匹配)。\n */\nexport function normalizeModuleKey(specifier: string, baseKey?: string): string {\n const spec = specifier.replace(/\\\\/g, '/')\n const baseDir = baseKey && baseKey.includes('/')\n ? baseKey.slice(0, baseKey.lastIndexOf('/') + 1)\n : ''\n // 绝对形态(/x)不拼 baseDir;相对形态按 baseKey 目录解析\n const combined = spec.startsWith('/') ? spec.slice(1) : `${baseDir}${spec}`\n const segs: string[] = []\n for (const seg of combined.split('/')) {\n if (seg === '' || seg === '.') continue\n if (seg === '..') {\n segs.pop()\n continue\n }\n segs.push(seg)\n }\n return segs.join('/')\n}\n\n// ── ModuleRegistry ──\n\n/**\n * 多文件模块注册表:装载/导出/绑定校验。每次调用实例化(缓存仅存活单轮装载)。\n */\nexport class ModuleRegistry {\n private cache = new Map<string, FaiModule>()\n private loadCount = 0\n\n constructor(\n private readonly loader: ProjectLoader,\n private readonly run: ModuleRunner,\n private readonly securityPolicy: SecurityPolicy = 'strict',\n private readonly determinismPolicy: DeterminismPolicy = 'off',\n ) {}\n\n /**\n * 装载 import 表对应的全部依赖并返回 seed(绑定名 → 值)。\n * @param imports - 顶层 import 条目(UiMetadata.imports 同构)。\n * @param baseKey - 所在模块的 moduleKey(相对 specifier 解析基准);主模块无 key。\n * @returns seed map(供 DirectExecutor opts.imports / params 预置 ctx)。\n * @throws ModuleRegistryError — 环 / 模块缺失 / 依赖执行失败 / 绑定未导出。\n */\n /**\n * 装载 import 表对应的全部依赖并返回 seed(绑定名 → 值)。\n * @param imports - 顶层 import 条目(UiMetadata.imports 同构)。\n * @param baseKey - 所在模块的 moduleKey(相对 specifier 解析基准);主模块无 key。\n * @param stack - 循环依赖检测栈(内部递归使用;外部调用缺省 [])。\n * @returns seed map(供 DirectExecutor opts.imports / params 预置 ctx)。\n * @throws ModuleRegistryError — 环 / 模块缺失 / 依赖执行失败 / 绑定未导出。\n */\n async resolveImports(\n imports: UiMetadata['imports'],\n baseKey?: string,\n stack: string[] = [],\n ): Promise<Record<string, unknown>> {\n const seed: Record<string, unknown> = {}\n for (const imp of imports ?? []) {\n if (!isRelativeSpecifier(imp.specifier)) continue // 裸 specifier → libLoader 通道\n const depKey = normalizeModuleKey(imp.specifier, baseKey)\n const dep = await this.load(depKey, stack)\n if (imp.kind === 'namespace' || imp.kind === 'default') {\n if (imp.localName) seed[imp.localName] = this.namespaceView(dep)\n continue\n }\n // named:每个绑定分别校验\n for (const binding of imp.bindings) {\n const value = this.resolveBinding(binding, dep, imp.lineNo)\n if (value !== undefined) seed[binding] = value\n }\n }\n return seed\n }\n\n /** 装载并执行单个模块(递归装其依赖;缓存本装载轮)。 */\n private async load(key: string, stack: string[]): Promise<FaiModule> {\n const cached = this.cache.get(key)\n if (cached) return cached\n if (stack.includes(key)) {\n throw new ModuleRegistryError(\n 'MODULE_CYCLE',\n `module cycle detected: ${[...stack, key].join(' -> ')}`,\n )\n }\n // S6:装载深度上限\n if (stack.length >= S6_MAX_DEPTH) {\n throw new ModuleRegistryError(\n 'MODULE_DEPTH_EXCEEDED',\n `module loading depth exceeded ${S6_MAX_DEPTH} (stack: ${stack.join(' -> ')})`,\n )\n }\n // S6:模块总数上限\n if (this.loadCount >= S6_MAX_MODULES) {\n throw new ModuleRegistryError(\n 'MODULE_COUNT_EXCEEDED',\n `total module count exceeded ${S6_MAX_MODULES} limit`,\n )\n }\n const available = this.loader.listModules()\n if (!available.includes(key)) {\n throw new ModuleRegistryError(\n 'MODULE_NOT_FOUND',\n `module \"${key}\" not found in project (available: ${available.length > 0 ? available.join(', ') : 'none'})`,\n )\n }\n const source = await this.loader.readSource(key)\n // A3:子模块安全扫描前置(固定 strict;违规 → MODULE_SECURITY)\n try {\n assertSecure(source, {\n policy: 'strict',\n knownNames: ['cad'],\n defaultNs: 'cad',\n })\n } catch (err) {\n if (err instanceof ParseError) {\n throw new ModuleRegistryError(\n 'MODULE_SECURITY',\n `module \"${key}\" failed security check: ${err.message}`,\n { lineNo: err.line, callee: key },\n )\n }\n throw err\n }\n this.loadCount++\n const meta = extractMetadata(source, { security: 'strict' })\n // 确定性扫描(B 档 taint):违规 → MODULE_SECURITY(error 档);warn 档静默放行\n if (this.determinismPolicy !== 'off') {\n const ns = (meta.imports ?? []).filter((i) => i.kind === 'namespace' && i.localName).map((i) => i.localName!)\n const cals = (meta.imports ?? []).filter((i) => i.kind === 'named').flatMap((i) => i.bindings)\n const det = scanDeterminism(source, { defaultNs: 'cad', extraNamespaces: ns, extraCallees: cals })\n if (det.violations.length > 0 && this.determinismPolicy === 'error') {\n throw new ModuleRegistryError(\n 'MODULE_SECURITY',\n `module \"${key}\" failed determinism check: ${det.violations[0]!.message}`,\n { lineNo: det.violations[0]!.lineNo, callee: 'determinism' },\n )\n }\n }\n const seed = await this.resolveImports(meta.imports ?? [], key, [...stack, key])\n const result = await this.run(source, seed) // 执行失败 → runner 抛 ModuleRegistryError\n const module = { key, exports: this.buildExports(meta, result) }\n this.cache.set(key, module)\n return module\n }\n\n private buildExports(meta: UiMetadata, result: ModuleRunResult): FaiModuleExports {\n const values: Record<string, unknown> = {}\n const fns: Record<string, (...a: unknown[]) => unknown> = {}\n const shapeVarNames = new Set<PartName>()\n for (const name of result.listCtxKeys()) {\n const v = result.getCtxVar(name)\n if (v === undefined) continue\n if (typeof v === 'function') {\n fns[name] = v as (...a: unknown[]) => unknown\n } else {\n values[name] = v\n if (v !== null && typeof v === 'object' && ('positions' in v || 'children' in v)) {\n shapeVarNames.add(asPartName(name))\n }\n }\n }\n // 模块自身的存活终端:函数体 keep 登记读 ModuleRunResult(DirectExecutor.keepByLine)\n const ipw = result.getInplaceWrites?.()\n const terminals = computeLiveShapes({\n lines: meta.lines,\n blocks: meta.blocks,\n keep: {\n lineEntries: (lineNo) => meta.keep.get(lineNo),\n functionBody: (lineNo): KeepRegistration | undefined => result.getKeepByLine(lineNo),\n },\n shapeVarNames,\n ...(ipw && ipw.size > 0 ? { inplaceWrites: ipw } : {}),\n })\n const liveShapes = new Set<string>(terminals.map((t) => String(t.id)))\n return { values, fns, liveShapes }\n }\n\n /** named 绑定解析:liveShapes ∪ fns;缺失 → BINDING_NOT_EXPORTED。 */\n private resolveBinding(binding: string, dep: FaiModule, lineNo: number): unknown | undefined {\n if (dep.exports.liveShapes.has(binding)) return dep.exports.values[binding]\n if (Object.prototype.hasOwnProperty.call(dep.exports.fns, binding)) return dep.exports.fns[binding]\n throw new ModuleRegistryError(\n 'BINDING_NOT_EXPORTED',\n `\"${binding}\" is not exported by module \"${dep.key}\" (live shapes: ${[...dep.exports.liveShapes].join(', ') || 'none'})`,\n { lineNo, callee: binding },\n )\n }\n\n /** 命名空间/默认 import 的模块视图:values + fns。 */\n private namespaceView(dep: FaiModule): Record<string, unknown> {\n return { ...dep.exports.values, ...dep.exports.fns }\n }\n}\n"]}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { PartName } from '../identity.js';
|
|
13
13
|
import type { StdlibNamespace } from '../runtime-state.js';
|
|
14
|
+
import type { Provenance } from '../topology/naming/lineage.js';
|
|
14
15
|
/** 网格数据(与 csg.ts ManifoldMeshData 同构) */
|
|
15
16
|
export interface MeshData {
|
|
16
17
|
positions: Float32Array;
|
|
@@ -156,6 +157,12 @@ export interface LibLoader {
|
|
|
156
157
|
* (原 CLI 即按 autoLift=false 运行)。逐库关掉提升恢复 CLI 等价行为。
|
|
157
158
|
*/
|
|
158
159
|
autoLiftFor?: (packageName: string) => boolean | undefined;
|
|
160
|
+
/**
|
|
161
|
+
* Phase 2.11-②:按 packageName 的逐库 `naming` 声明(库 package.json 的
|
|
162
|
+
* `faijs.naming` 外置字段,与 `faijs.autoLift` 同构)。返回 undefined 时
|
|
163
|
+
* 回落到 `admitCompatLib` 的 blanket unmodeled 兜底(2.11-③ 处置其去留)。
|
|
164
|
+
*/
|
|
165
|
+
namingFor?: (packageName: string) => Provenance | undefined;
|
|
159
166
|
};
|
|
160
167
|
/**
|
|
161
168
|
* 可选源码扫描钩子(§6.2 ②):宿主返回库源码时走同一 SecurityScanner(A4,固定 strict);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG","sourcesContent":["/**\n * Ports 接口定义 — Host 注入的环境能力\n *\n *\n * L2 CadRuntime 通过这些接口获取所有环境能力(CSG 计算、SDF 求值、字体、纹理、资产、事件)。\n * 不直接 import 任何 ?worker、window、document、zustand store——这些由 Host 实现。\n *\n * 两个宿主各自实现:\n * - browser host: WorkerCsgBackend / WorkerSdfBackend / BrowserFontProvider / ...\n * - node host (P3): InlineCsgBackend / InlineSdfBackend / NodeFontProvider / ...\n */\n\nimport type { PartName } from '../identity'\nimport type { StdlibNamespace } from '../runtime-state'\n\n// ── 共享类型 ──\n\n/** 网格数据(与 csg.ts ManifoldMeshData 同构) */\nexport interface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/** 平面参数 */\nexport interface PlaneParams {\n normal: [number, number, number]\n offset: number\n}\n\n// Re-export joinery param types from boolean/geo-convert to ensure\n// structural identity across CsgBackend interface and implementations.\nexport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\nimport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\n\n/** 分割结果 */\nexport interface SplitResult {\n front: MeshData\n back: MeshData\n wedge: MeshData | null\n}\n\n// ── CsgBackend ──\n\n/**\n * CSG 后端接口 — mesh 路径的布尔/分割操作。\n *\n * browser 实现:WorkerCsgBackend(经 csg-worker postMessage)\n * node 实现 (P3):InlineCsgBackend(主线程直跑 manifold-3d)\n */\nexport interface CsgBackend {\n boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData>\n splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }>\n splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: DovetailGrooveParams\n },\n ): Promise<SplitResult>\n splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n}\n\n// ── SdfBackend ──\n\n/**\n * SDF 后端接口 — SDF 求值。\n *\n * browser 实现:WorkerSdfBackend(经 sdf-worker postMessage)\n * node 实现 (P3):InlineSdfBackend(主线程直跑)\n */\nexport interface SdfBackend {\n runSdf(\n code: string,\n params: Record<string, number>,\n bounds: [number, number, number, number, number, number],\n edgeLength: number,\n level?: number,\n tolerance?: number,\n ): Promise<MeshData>\n}\n\n// ── FontProvider ──\n\n/**\n * 字体提供者接口。\n *\n * browser 实现:BrowserFontProvider(?url + fetch + fontRegistry DI)\n * node 实现 (P3):NodeFontProvider(fs 字体加载)\n */\nexport interface FontProvider {\n /** 加载字体字节(按 key/path),返回 ArrayBuffer */\n loadFont(key: string): Promise<ArrayBuffer>\n /** 列出可用字体 key(node 端为资产目录,browser 端为注册表) */\n listFonts(): string[]\n}\n\n// ── TextureSampler ──\n\n/**\n * 纹理采样接口 — knurl 纹理。\n *\n * browser 实现:CanvasTextureSampler(Image + canvas)\n * node 实现 (P3):纯数据解码\n */\nexport interface TextureSampler {\n /** 采样纹理在 (u, v) 处的值 [0,1] */\n sample(u: number, v: number): number\n /** 纹理尺寸 */\n readonly width: number\n readonly height: number\n}\n\n// ── AssetResolver ──\n\n/**\n * 资产解析接口 — load* 操作的字节来源。\n *\n * browser 实现:FaicadAssetResolver(faicad 会话缓存)\n * node 实现 (P3):FsAssetResolver(--assets 目录/manifest)\n */\nexport interface AssetResolver {\n /** loadByKey 的 headless 等价物 */\n resolveByKey(key: string): Promise<{ bytes: ArrayBuffer; format?: string }>\n /** 本地文件路径(browser 下抛错) */\n resolveFile(path: string): Promise<ArrayBuffer>\n /** 网络 URL(两环境通用) */\n resolveUrl(url: string): Promise<ArrayBuffer>\n}\n\n// ── EventSink ──\n\n/**\n * 事件通知接口 — BREP 丢失等事件。\n *\n * browser 实现:BrowserEventSink(window.dispatchEvent → toast)\n * node 实现 (P3):CliEventSink(写入 stderr + 收集到 events 数组)\n */\nexport interface EventSink {\n emit(event: 'part-brep-lost', detail: { partName: PartName; callee: string; reason: string }): void\n}\n\n// ── LibLoader ──\n\n/**\n * 库加载器接口 — 按 packageName 自动装载未注册的第三方库。\n *\n * 宿主实现:\n * - node CLI(createNodePorts):白名单 + Node 原生 `import(name)`(monorepo\n * workspace symlink 直接把裸包解析到包源码)。\n * - browser / demo:静态 `LIB_MODULES` 映射表(value 必须是静态字面量\n * specifier,Vite/Rollup 才能静态分析打包;禁止变量传参的 import(name))。\n * - vitest:复用浏览器映射表写法 + `await import('@faicad/…')`(alias 落位活源码)。\n */\nexport interface LibLoader {\n /** 按 packageName 加载库模块,返回其导出命名空间对象(与 registerLib 的 ns 同形)。 */\n loadLib(packageName: string): Promise<StdlibNamespace>\n /** 列出当前可加载的 packageName(check 阶段同步校验 import specifier 用)。 */\n listLibs(): string[]\n /** 自动装载的注册选项;缺省由推断式决定(有 dual-op 的库不提升,全裸函数库自动提升,与手动注入一致)。 */\n options?: {\n autoLift?: boolean\n /**\n * 按 packageName 的逐库 `autoLift` 覆盖(优先于 `options.autoLift`)。\n * 返回 `undefined` 时回落到全局选项 / 推断式。用于别名库:如 cq-compat 在\n * 浏览器 host 被全局 autoLift 提升后,compat 边界的 borrowDeep 会把实参里的\n * faijs Shape 替换成 brepjs 借用视图,破坏其内部「以 Shape 受众」的借面逻辑\n * (原 CLI 即按 autoLift=false 运行)。逐库关掉提升恢复 CLI 等价行为。\n */\n autoLiftFor?: (packageName: string) => boolean | undefined\n }\n /**\n * 可选源码扫描钩子(§6.2 ②):宿主返回库源码时走同一 SecurityScanner(A4,固定 strict);\n * 不提供或返回 undefined 则跳过。不改 loadLib 返回值——返回 StdlibNamespace,\n * 往里挂 source 会被 admitCompatLib 当成导出值并污染命名空间。\n * @param packageName - the npm package name.\n * @returns the library source text if available, otherwise undefined.\n */\n loadSource?(packageName: string): Promise<string | undefined>\n}\n\n// ── ProjectLoader ──\n\n/**\n * 项目文件加载器(多文件,§4.5)——按 moduleKey 读取/枚举项目内 .fai.js 模块源码。\n *\n * moduleKey 约定:host 决定字符串形态(项目根相对路径等);引擎只做最小归一\n * (POSIX 斜杠、去掉 `./`/`../`/前导 `/` 前缀),随后按 `listModules()` 精确匹配。\n *\n * host 实现:\n * - 3d_editor / browser:项目文件表 + session 内缓存;\n * - node / vitest:内存映射表或 fs 读取(fixture 目录)。\n */\nexport interface ProjectLoader {\n /** 列出当前可加载的 moduleKey(装载前预检 / 错误提示用)。 */\n listModules(): string[]\n /** 按 moduleKey 读取模块源码(.fai.js 文本)。 */\n readSource(moduleKey: string): Promise<string>\n /** 模块内容指纹(增量缓存用;不提供则每次全量重读重执行)。 */\n fingerprint?(moduleKey: string): Promise<string>\n}\n\n// ── HostPorts 汇总 ──\n\n/**\n * Host 在 createRuntime 时注入的全部环境能力。\n *\n * 所有字段可选——node 测试环境可只提供 occt kernel(不注入 csg/sdf),\n * BREP-path ops 不依赖这些 Port。\n */\nexport interface HostPorts {\n csg?: CsgBackend\n sdf?: SdfBackend\n fonts?: FontProvider\n texture?: TextureSampler\n assets?: AssetResolver\n events: EventSink // events 必填——断链通知是基础能力\n /** 库加载器(execute 自动装载未注册库;check 用它做 specifier 预检)。可选——无则仅手工 registerLib。 */\n libLoader?: LibLoader\n /** 项目文件加载器(相对 specifier 的多文件模块,§4.5)。可选——不提供则单文件行为不变。 */\n projectLoader?: ProjectLoader\n}\n\n// ── 执行模式 ──\n\n/**\n * 执行模式(设计文档 §4.4)。\n *\n * - `auto`(默认):优先 BREP,断链后自动切 mesh + EventSink 通知\n * - `brep`:强制 BREP,断链即报错 E_BREP_UNSUPPORTED,不自动切换\n * - `mesh`:全部走 mesh 路径\n */\nexport type ExecutionMode = 'auto' | 'brep' | 'mesh'\n"]}
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG","sourcesContent":["/**\n * Ports 接口定义 — Host 注入的环境能力\n *\n *\n * L2 CadRuntime 通过这些接口获取所有环境能力(CSG 计算、SDF 求值、字体、纹理、资产、事件)。\n * 不直接 import 任何 ?worker、window、document、zustand store——这些由 Host 实现。\n *\n * 两个宿主各自实现:\n * - browser host: WorkerCsgBackend / WorkerSdfBackend / BrowserFontProvider / ...\n * - node host (P3): InlineCsgBackend / InlineSdfBackend / NodeFontProvider / ...\n */\n\nimport type { PartName } from '../identity'\nimport type { StdlibNamespace } from '../runtime-state'\nimport type { Provenance } from '../topology/naming/lineage'\n\n// ── 共享类型 ──\n\n/** 网格数据(与 csg.ts ManifoldMeshData 同构) */\nexport interface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/** 平面参数 */\nexport interface PlaneParams {\n normal: [number, number, number]\n offset: number\n}\n\n// Re-export joinery param types from boolean/geo-convert to ensure\n// structural identity across CsgBackend interface and implementations.\nexport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\nimport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\n\n/** 分割结果 */\nexport interface SplitResult {\n front: MeshData\n back: MeshData\n wedge: MeshData | null\n}\n\n// ── CsgBackend ──\n\n/**\n * CSG 后端接口 — mesh 路径的布尔/分割操作。\n *\n * browser 实现:WorkerCsgBackend(经 csg-worker postMessage)\n * node 实现 (P3):InlineCsgBackend(主线程直跑 manifold-3d)\n */\nexport interface CsgBackend {\n boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData>\n splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }>\n splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: DovetailGrooveParams\n },\n ): Promise<SplitResult>\n splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeOriginOffset: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n}\n\n// ── SdfBackend ──\n\n/**\n * SDF 后端接口 — SDF 求值。\n *\n * browser 实现:WorkerSdfBackend(经 sdf-worker postMessage)\n * node 实现 (P3):InlineSdfBackend(主线程直跑)\n */\nexport interface SdfBackend {\n runSdf(\n code: string,\n params: Record<string, number>,\n bounds: [number, number, number, number, number, number],\n edgeLength: number,\n level?: number,\n tolerance?: number,\n ): Promise<MeshData>\n}\n\n// ── FontProvider ──\n\n/**\n * 字体提供者接口。\n *\n * browser 实现:BrowserFontProvider(?url + fetch + fontRegistry DI)\n * node 实现 (P3):NodeFontProvider(fs 字体加载)\n */\nexport interface FontProvider {\n /** 加载字体字节(按 key/path),返回 ArrayBuffer */\n loadFont(key: string): Promise<ArrayBuffer>\n /** 列出可用字体 key(node 端为资产目录,browser 端为注册表) */\n listFonts(): string[]\n}\n\n// ── TextureSampler ──\n\n/**\n * 纹理采样接口 — knurl 纹理。\n *\n * browser 实现:CanvasTextureSampler(Image + canvas)\n * node 实现 (P3):纯数据解码\n */\nexport interface TextureSampler {\n /** 采样纹理在 (u, v) 处的值 [0,1] */\n sample(u: number, v: number): number\n /** 纹理尺寸 */\n readonly width: number\n readonly height: number\n}\n\n// ── AssetResolver ──\n\n/**\n * 资产解析接口 — load* 操作的字节来源。\n *\n * browser 实现:FaicadAssetResolver(faicad 会话缓存)\n * node 实现 (P3):FsAssetResolver(--assets 目录/manifest)\n */\nexport interface AssetResolver {\n /** loadByKey 的 headless 等价物 */\n resolveByKey(key: string): Promise<{ bytes: ArrayBuffer; format?: string }>\n /** 本地文件路径(browser 下抛错) */\n resolveFile(path: string): Promise<ArrayBuffer>\n /** 网络 URL(两环境通用) */\n resolveUrl(url: string): Promise<ArrayBuffer>\n}\n\n// ── EventSink ──\n\n/**\n * 事件通知接口 — BREP 丢失等事件。\n *\n * browser 实现:BrowserEventSink(window.dispatchEvent → toast)\n * node 实现 (P3):CliEventSink(写入 stderr + 收集到 events 数组)\n */\nexport interface EventSink {\n emit(event: 'part-brep-lost', detail: { partName: PartName; callee: string; reason: string }): void\n}\n\n// ── LibLoader ──\n\n/**\n * 库加载器接口 — 按 packageName 自动装载未注册的第三方库。\n *\n * 宿主实现:\n * - node CLI(createNodePorts):白名单 + Node 原生 `import(name)`(monorepo\n * workspace symlink 直接把裸包解析到包源码)。\n * - browser / demo:静态 `LIB_MODULES` 映射表(value 必须是静态字面量\n * specifier,Vite/Rollup 才能静态分析打包;禁止变量传参的 import(name))。\n * - vitest:复用浏览器映射表写法 + `await import('@faicad/…')`(alias 落位活源码)。\n */\nexport interface LibLoader {\n /** 按 packageName 加载库模块,返回其导出命名空间对象(与 registerLib 的 ns 同形)。 */\n loadLib(packageName: string): Promise<StdlibNamespace>\n /** 列出当前可加载的 packageName(check 阶段同步校验 import specifier 用)。 */\n listLibs(): string[]\n /** 自动装载的注册选项;缺省由推断式决定(有 dual-op 的库不提升,全裸函数库自动提升,与手动注入一致)。 */\n options?: {\n autoLift?: boolean\n /**\n * 按 packageName 的逐库 `autoLift` 覆盖(优先于 `options.autoLift`)。\n * 返回 `undefined` 时回落到全局选项 / 推断式。用于别名库:如 cq-compat 在\n * 浏览器 host 被全局 autoLift 提升后,compat 边界的 borrowDeep 会把实参里的\n * faijs Shape 替换成 brepjs 借用视图,破坏其内部「以 Shape 受众」的借面逻辑\n * (原 CLI 即按 autoLift=false 运行)。逐库关掉提升恢复 CLI 等价行为。\n */\n autoLiftFor?: (packageName: string) => boolean | undefined\n /**\n * Phase 2.11-②:按 packageName 的逐库 `naming` 声明(库 package.json 的\n * `faijs.naming` 外置字段,与 `faijs.autoLift` 同构)。返回 undefined 时\n * 回落到 `admitCompatLib` 的 blanket unmodeled 兜底(2.11-③ 处置其去留)。\n */\n namingFor?: (packageName: string) => Provenance | undefined\n }\n /**\n * 可选源码扫描钩子(§6.2 ②):宿主返回库源码时走同一 SecurityScanner(A4,固定 strict);\n * 不提供或返回 undefined 则跳过。不改 loadLib 返回值——返回 StdlibNamespace,\n * 往里挂 source 会被 admitCompatLib 当成导出值并污染命名空间。\n * @param packageName - the npm package name.\n * @returns the library source text if available, otherwise undefined.\n */\n loadSource?(packageName: string): Promise<string | undefined>\n}\n\n// ── ProjectLoader ──\n\n/**\n * 项目文件加载器(多文件,§4.5)——按 moduleKey 读取/枚举项目内 .fai.js 模块源码。\n *\n * moduleKey 约定:host 决定字符串形态(项目根相对路径等);引擎只做最小归一\n * (POSIX 斜杠、去掉 `./`/`../`/前导 `/` 前缀),随后按 `listModules()` 精确匹配。\n *\n * host 实现:\n * - 3d_editor / browser:项目文件表 + session 内缓存;\n * - node / vitest:内存映射表或 fs 读取(fixture 目录)。\n */\nexport interface ProjectLoader {\n /** 列出当前可加载的 moduleKey(装载前预检 / 错误提示用)。 */\n listModules(): string[]\n /** 按 moduleKey 读取模块源码(.fai.js 文本)。 */\n readSource(moduleKey: string): Promise<string>\n /** 模块内容指纹(增量缓存用;不提供则每次全量重读重执行)。 */\n fingerprint?(moduleKey: string): Promise<string>\n}\n\n// ── HostPorts 汇总 ──\n\n/**\n * Host 在 createRuntime 时注入的全部环境能力。\n *\n * 所有字段可选——node 测试环境可只提供 occt kernel(不注入 csg/sdf),\n * BREP-path ops 不依赖这些 Port。\n */\nexport interface HostPorts {\n csg?: CsgBackend\n sdf?: SdfBackend\n fonts?: FontProvider\n texture?: TextureSampler\n assets?: AssetResolver\n events: EventSink // events 必填——断链通知是基础能力\n /** 库加载器(execute 自动装载未注册库;check 用它做 specifier 预检)。可选——无则仅手工 registerLib。 */\n libLoader?: LibLoader\n /** 项目文件加载器(相对 specifier 的多文件模块,§4.5)。可选——不提供则单文件行为不变。 */\n projectLoader?: ProjectLoader\n}\n\n// ── 执行模式 ──\n\n/**\n * 执行模式(设计文档 §4.4)。\n *\n * - `auto`(默认):优先 BREP,断链后自动切 mesh + EventSink 通知\n * - `brep`:强制 BREP,断链即报错 E_BREP_UNSUPPORTED,不自动切换\n * - `mesh`:全部走 mesh 路径\n */\nexport type ExecutionMode = 'auto' | 'brep' | 'mesh'\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-concurrent-error — 并发执行拒绝错误(C1)
|
|
3
|
+
*
|
|
4
|
+
* 独立叶子文件(与 execution-limit-error.ts 同法):CadRuntime 的三个执行入口
|
|
5
|
+
* (execute / append / update)共用,code = 'E_RUNTIME_CONCURRENT'
|
|
6
|
+
* (宿主可按 code 识别,区别于普通执行错误)。
|
|
7
|
+
*
|
|
8
|
+
* ## 为什么必须拒绝,而不是"尽力而为"
|
|
9
|
+
*
|
|
10
|
+
* `setCurrentStmt`、全局 backends 配置(`configureBackends`)、BREP 内核单例都是
|
|
11
|
+
* **进程级单例**。两个 CadRuntime 交错执行时,后进入者的 `claimBackends()` 会把
|
|
12
|
+
* 全局 backends 指向自己,先进入者的后续语句被**静默劫持**(dispatch 走错槽、
|
|
13
|
+
* 缓存键漂移、顶替释放旧句柄后拓扑重建撞悬空句柄)——症状远离根因,是最难查的一类。
|
|
14
|
+
*
|
|
15
|
+
* 旧代码只在注释里承认"并发交错仍会互踩"(`runtime.ts` 的 claimBackends 文档)。
|
|
16
|
+
* 按项目红线「能力缺口要暴露,不是加旁路开关」,这里改成**显式抛错**:
|
|
17
|
+
* 并发不是"可能不安全",而是**不受支持**,必须让调用方当场知道。
|
|
18
|
+
*
|
|
19
|
+
* 用户已裁决:**不允许并发执行多 runtime**(开发计划 §4.7 C1)。
|
|
20
|
+
*/
|
|
21
|
+
export declare class RuntimeConcurrentError extends Error {
|
|
22
|
+
/** 当前持有执行态的那个 runtime 的 id。 */
|
|
23
|
+
readonly holderId: number;
|
|
24
|
+
/** 被拒绝的 runtime 的 id。 */
|
|
25
|
+
readonly rejectedId: number;
|
|
26
|
+
/** 被拒绝的入口名(execute / append / update)。 */
|
|
27
|
+
readonly entry: string;
|
|
28
|
+
/** 宿主可按 code 识别的错误码:'E_RUNTIME_CONCURRENT'。 */
|
|
29
|
+
readonly code = "E_RUNTIME_CONCURRENT";
|
|
30
|
+
constructor(
|
|
31
|
+
/** 当前持有执行态的那个 runtime 的 id。 */
|
|
32
|
+
holderId: number,
|
|
33
|
+
/** 被拒绝的 runtime 的 id。 */
|
|
34
|
+
rejectedId: number,
|
|
35
|
+
/** 被拒绝的入口名(execute / append / update)。 */
|
|
36
|
+
entry: string);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=runtime-concurrent-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-concurrent-error.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/runtime-concurrent-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAI7C,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,yBAAyB;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM;IARxB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,0BAAyB;;IAEpC,+BAA+B;IACtB,QAAQ,EAAE,MAAM;IACzB,yBAAyB;IAChB,UAAU,EAAE,MAAM;IAC3B,0CAA0C;IACjC,KAAK,EAAE,MAAM;CASzB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-concurrent-error — 并发执行拒绝错误(C1)
|
|
3
|
+
*
|
|
4
|
+
* 独立叶子文件(与 execution-limit-error.ts 同法):CadRuntime 的三个执行入口
|
|
5
|
+
* (execute / append / update)共用,code = 'E_RUNTIME_CONCURRENT'
|
|
6
|
+
* (宿主可按 code 识别,区别于普通执行错误)。
|
|
7
|
+
*
|
|
8
|
+
* ## 为什么必须拒绝,而不是"尽力而为"
|
|
9
|
+
*
|
|
10
|
+
* `setCurrentStmt`、全局 backends 配置(`configureBackends`)、BREP 内核单例都是
|
|
11
|
+
* **进程级单例**。两个 CadRuntime 交错执行时,后进入者的 `claimBackends()` 会把
|
|
12
|
+
* 全局 backends 指向自己,先进入者的后续语句被**静默劫持**(dispatch 走错槽、
|
|
13
|
+
* 缓存键漂移、顶替释放旧句柄后拓扑重建撞悬空句柄)——症状远离根因,是最难查的一类。
|
|
14
|
+
*
|
|
15
|
+
* 旧代码只在注释里承认"并发交错仍会互踩"(`runtime.ts` 的 claimBackends 文档)。
|
|
16
|
+
* 按项目红线「能力缺口要暴露,不是加旁路开关」,这里改成**显式抛错**:
|
|
17
|
+
* 并发不是"可能不安全",而是**不受支持**,必须让调用方当场知道。
|
|
18
|
+
*
|
|
19
|
+
* 用户已裁决:**不允许并发执行多 runtime**(开发计划 §4.7 C1)。
|
|
20
|
+
*/
|
|
21
|
+
export class RuntimeConcurrentError extends Error {
|
|
22
|
+
holderId;
|
|
23
|
+
rejectedId;
|
|
24
|
+
entry;
|
|
25
|
+
/** 宿主可按 code 识别的错误码:'E_RUNTIME_CONCURRENT'。 */
|
|
26
|
+
code = 'E_RUNTIME_CONCURRENT';
|
|
27
|
+
constructor(
|
|
28
|
+
/** 当前持有执行态的那个 runtime 的 id。 */
|
|
29
|
+
holderId,
|
|
30
|
+
/** 被拒绝的 runtime 的 id。 */
|
|
31
|
+
rejectedId,
|
|
32
|
+
/** 被拒绝的入口名(execute / append / update)。 */
|
|
33
|
+
entry) {
|
|
34
|
+
super(`[faijs] E_RUNTIME_CONCURRENT: runtime #${rejectedId} cannot ${entry} ` +
|
|
35
|
+
`while runtime #${holderId} is executing — concurrent multi-runtime execution is not supported ` +
|
|
36
|
+
`(setCurrentStmt / backends / kernel are process-wide singletons). Serialize your runtimes.`);
|
|
37
|
+
this.holderId = holderId;
|
|
38
|
+
this.rejectedId = rejectedId;
|
|
39
|
+
this.entry = entry;
|
|
40
|
+
this.name = 'RuntimeConcurrentError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=runtime-concurrent-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-concurrent-error.js","sourceRoot":"","sources":["../../src/cad-runtime/runtime-concurrent-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAKpC;IAEA;IAEA;IARX,+CAA+C;IACtC,IAAI,GAAG,sBAAsB,CAAA;IACtC;IACE,+BAA+B;IACtB,QAAgB;IACzB,yBAAyB;IAChB,UAAkB;IAC3B,0CAA0C;IACjC,KAAa;QAEtB,KAAK,CACH,0CAA0C,UAAU,WAAW,KAAK,GAAG;YACrE,kBAAkB,QAAQ,sEAAsE;YAChG,4FAA4F,CAC/F,CAAA;QAVQ,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,eAAU,GAAV,UAAU,CAAQ;QAElB,UAAK,GAAL,KAAK,CAAQ;QAOtB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF","sourcesContent":["/**\n * runtime-concurrent-error — 并发执行拒绝错误(C1)\n *\n * 独立叶子文件(与 execution-limit-error.ts 同法):CadRuntime 的三个执行入口\n * (execute / append / update)共用,code = 'E_RUNTIME_CONCURRENT'\n * (宿主可按 code 识别,区别于普通执行错误)。\n *\n * ## 为什么必须拒绝,而不是\"尽力而为\"\n *\n * `setCurrentStmt`、全局 backends 配置(`configureBackends`)、BREP 内核单例都是\n * **进程级单例**。两个 CadRuntime 交错执行时,后进入者的 `claimBackends()` 会把\n * 全局 backends 指向自己,先进入者的后续语句被**静默劫持**(dispatch 走错槽、\n * 缓存键漂移、顶替释放旧句柄后拓扑重建撞悬空句柄)——症状远离根因,是最难查的一类。\n *\n * 旧代码只在注释里承认\"并发交错仍会互踩\"(`runtime.ts` 的 claimBackends 文档)。\n * 按项目红线「能力缺口要暴露,不是加旁路开关」,这里改成**显式抛错**:\n * 并发不是\"可能不安全\",而是**不受支持**,必须让调用方当场知道。\n *\n * 用户已裁决:**不允许并发执行多 runtime**(开发计划 §4.7 C1)。\n */\nexport class RuntimeConcurrentError extends Error {\n /** 宿主可按 code 识别的错误码:'E_RUNTIME_CONCURRENT'。 */\n readonly code = 'E_RUNTIME_CONCURRENT'\n constructor(\n /** 当前持有执行态的那个 runtime 的 id。 */\n readonly holderId: number,\n /** 被拒绝的 runtime 的 id。 */\n readonly rejectedId: number,\n /** 被拒绝的入口名(execute / append / update)。 */\n readonly entry: string,\n ) {\n super(\n `[faijs] E_RUNTIME_CONCURRENT: runtime #${rejectedId} cannot ${entry} ` +\n `while runtime #${holderId} is executing — concurrent multi-runtime execution is not supported ` +\n `(setCurrentStmt / backends / kernel are process-wide singletons). Serialize your runtimes.`,\n )\n this.name = 'RuntimeConcurrentError'\n }\n}\n"]}
|
|
@@ -32,6 +32,8 @@ export { computeContentKey } from './content-key.js';
|
|
|
32
32
|
export { stableFingerprint } from './content-key.js';
|
|
33
33
|
import { type CompoundShape } from '../shape.js';
|
|
34
34
|
import type { PartNaming } from '../topology/naming/types.js';
|
|
35
|
+
import type { Provenance } from '../topology/naming/lineage.js';
|
|
36
|
+
import { type DeterminismPolicy } from '../lang/determinism-scanner.js';
|
|
35
37
|
/**
|
|
36
38
|
* A single validation error produced by CadRuntime.check.
|
|
37
39
|
*/
|
|
@@ -186,6 +188,7 @@ export interface ExecuteOptions {
|
|
|
186
188
|
executionTimeoutMs?: number;
|
|
187
189
|
}
|
|
188
190
|
export { ExecutionLimitError } from './execution-limit-error.js';
|
|
191
|
+
export { RuntimeConcurrentError } from './runtime-concurrent-error.js';
|
|
189
192
|
/**
|
|
190
193
|
* Thrown by CadRuntime.append when a newly appended statement references a
|
|
191
194
|
* variable that is not in the persistent context — its producer was never
|
|
@@ -203,11 +206,13 @@ export declare class AppendPrefixError extends Error {
|
|
|
203
206
|
/** The referenced variable missing from the persistent ctx. */
|
|
204
207
|
missingVar: string);
|
|
205
208
|
}
|
|
209
|
+
export type { DeterminismPolicy };
|
|
206
210
|
/**
|
|
207
211
|
* CadRuntime 构造选项(第 4 参;缺省全部可选)。
|
|
208
212
|
*
|
|
209
213
|
* direct 是唯一执行路径。security 透传给 DirectExecutor 与 extractMetadata
|
|
210
|
-
* (A1/A2/A3 缺省 'strict')。
|
|
214
|
+
* (A1/A2/A3 缺省 'strict')。determinism 在 execute/append 前 对源码做 B 档
|
|
215
|
+
* taint 扫描(缺省 'error',见 docs/reproducibility-contract.md §3)。
|
|
211
216
|
*/
|
|
212
217
|
export interface CadRuntimeOptions {
|
|
213
218
|
/** 安全策略档位(缺省 'strict';透传给 DirectExecutor 与 extractMetadata) */
|
|
@@ -218,6 +223,12 @@ export interface CadRuntimeOptions {
|
|
|
218
223
|
* 使用——见 docs/plans/2026-09-14-no-eval-interpreter-backend-design.md。
|
|
219
224
|
*/
|
|
220
225
|
execBackend?: ExecBackendChoice;
|
|
226
|
+
/**
|
|
227
|
+
* 确定性扫描档位(缺省 'error')。执行前对 .fai.js 源码及其 import 的项目模块
|
|
228
|
+
* / @faicad/* 库源码做 B 档 taint 扫描,违规按档位处理。库源码经
|
|
229
|
+
* `ports.libLoader.loadSource` 获取(宿主未提供则跳过库扫描)。
|
|
230
|
+
*/
|
|
231
|
+
determinism?: DeterminismPolicy;
|
|
221
232
|
}
|
|
222
233
|
/**
|
|
223
234
|
* CadRuntime is the execution core of the L2 orchestration layer.
|
|
@@ -270,8 +281,14 @@ export declare class CadRuntime {
|
|
|
270
281
|
private topologyCache;
|
|
271
282
|
/** 无 IR 执行器(DirectExecutor,T5 后唯一执行路径) */
|
|
272
283
|
private readonly directExecutor;
|
|
284
|
+
/** 实例 id(仅用于 C1 并发错误信息里的定位,不参与任何语义判定)。 */
|
|
285
|
+
private readonly runtimeId;
|
|
273
286
|
/** 安全策略档位(透传给 extractMetadata 与 DirectExecutor;缺省 'strict') */
|
|
274
287
|
private readonly securityPolicy;
|
|
288
|
+
/** 确定性扫描档位(缺省 'error';execute/append 前对源码做 B 档 taint 扫描)。 */
|
|
289
|
+
private readonly determinismPolicy;
|
|
290
|
+
/** warn 档位下收集的确定性警告,合并进最终 ExecutionResult.infos。 */
|
|
291
|
+
private determinismWarnings;
|
|
275
292
|
/** 宿主注册库(含 cad:由根门面 createRuntime 包装注入;注入编译产物 fn 的第二参 ns) */
|
|
276
293
|
private readonly libs;
|
|
277
294
|
/** 库内容身份表 (binding → content hash),增量 key 用(B2,§7.3) */
|
|
@@ -318,6 +335,7 @@ export declare class CadRuntime {
|
|
|
318
335
|
default?: boolean;
|
|
319
336
|
autoLift?: boolean;
|
|
320
337
|
packageName?: string;
|
|
338
|
+
naming?: Provenance;
|
|
321
339
|
}): void;
|
|
322
340
|
/** The runtime's default namespace binding name (host-declared; 'cad' by default). */
|
|
323
341
|
get defaultNs(): string;
|
|
@@ -328,7 +346,11 @@ export declare class CadRuntime {
|
|
|
328
346
|
* 先前 runtime 的后续 execute 会被静默劫持(dispatch 走错槽、缓存键漂移、
|
|
329
347
|
* 顶替释放旧 BREP 句柄后拓扑重建撞上悬空句柄)。因此除构造外,每个执行入口
|
|
330
348
|
* (execute,所有执行路径的汇聚点)都必须先重新认领本实例的配置。
|
|
331
|
-
*
|
|
349
|
+
*
|
|
350
|
+
* ⚠️ 并发交错执行多个 runtime **仍会互踩**——这条限制现在由全局执行态锁强制
|
|
351
|
+
* ({@link withExecutionLock}):第二个 runtime 在他人执行态时抛
|
|
352
|
+
* {@link RuntimeConcurrentError}(E_RUNTIME_CONCURRENT),不再"尽力而为"。
|
|
353
|
+
* 用户已裁决不允许并发(开发计划 §4.7 C1)。
|
|
332
354
|
* ⚠️ getter 的 this 指向所在对象字面量,用箭头闭包捕获实例(避免 no-this-alias)。
|
|
333
355
|
*/
|
|
334
356
|
private claimBackends;
|
|
@@ -339,11 +361,25 @@ export declare class CadRuntime {
|
|
|
339
361
|
* 现有宿主无需改动即恢复默认 BREP 行为;换引擎仍是静态的(装配期注册其它引擎即可)。
|
|
340
362
|
*/
|
|
341
363
|
private ensureBrepChain;
|
|
364
|
+
/**
|
|
365
|
+
* 取全局执行态锁并运行 `fn`(C1)。跨实例并发 → 抛 {@link RuntimeConcurrentError};
|
|
366
|
+
* 本实例重入(update 内部落到 executeDirectText/appendDirectText)放行。
|
|
367
|
+
*
|
|
368
|
+
* 刻意**同步**取锁(不在取锁前 await):这样 `runtimeA.execute(...)` 尚未 await 时
|
|
369
|
+
* 紧接着调 `runtimeB.execute(...)` 必然被拒绝,行为可确定、可测试。
|
|
370
|
+
* @param entry - 入口名(execute / append / update),仅用于错误信息。
|
|
371
|
+
* @param fn - 实际执行体。
|
|
372
|
+
* @returns fn 的结果;无论成功失败都释放锁(finally)。
|
|
373
|
+
*/
|
|
374
|
+
private withExecutionLock;
|
|
375
|
+
/** 当前执行态持有者的入口名(诊断;无持有者时 null)。 */
|
|
376
|
+
static get executingEntry(): string | null;
|
|
342
377
|
/**
|
|
343
378
|
* Full execution from code text: parse → execute every statement.
|
|
344
379
|
* @param code - the .fai.js source text.
|
|
345
380
|
* @param opts - optional execution options.
|
|
346
381
|
* @returns promise resolving to the ExecutionResult.
|
|
382
|
+
* @throws {RuntimeConcurrentError} when another CadRuntime is already executing (C1).
|
|
347
383
|
*/
|
|
348
384
|
execute(code: string, opts?: ExecuteOptions): Promise<ExecutionResult>;
|
|
349
385
|
/**
|
|
@@ -353,8 +389,23 @@ export declare class CadRuntime {
|
|
|
353
389
|
* @param code - the new .fai.js source text to append.
|
|
354
390
|
* @param opts - optional execution options.
|
|
355
391
|
* @returns promise resolving to the ExecutionResult.
|
|
392
|
+
* @throws {RuntimeConcurrentError} when another CadRuntime is already executing (C1).
|
|
356
393
|
*/
|
|
357
394
|
append(code: string, opts?: ExecuteOptions): Promise<ExecutionResult>;
|
|
395
|
+
/**
|
|
396
|
+
* 确定性扫描门(B 档 taint):执行前对源码做静态扫描,违规按 determinismPolicy 处理。
|
|
397
|
+
*
|
|
398
|
+
* 扫描范围:主文件 + @faicad/* 库源码(经 libLoader.loadSource,若宿主提供)。
|
|
399
|
+
* 项目内相对 import 模块的扫描由 ModuleRegistry.load 内部完成(构造时传入 policy)。
|
|
400
|
+
*
|
|
401
|
+
* @returns ExecutionResult(违规 + policy='error' 时),null(通过或 warn/off)。
|
|
402
|
+
* warn 档位下警告收集到 this.determinismWarnings,由调用方合并进 infos。
|
|
403
|
+
*/
|
|
404
|
+
private runDeterminismGate;
|
|
405
|
+
/** 从 meta.imports 提取扫描提示:namespace import → extraNamespaces,named import → extraCallees。 */
|
|
406
|
+
private extractDeterminismHints;
|
|
407
|
+
/** 扫描库源码(可能含 TS 语法 → sucrase 脱后扫;失败则当 JS 直扫)。 */
|
|
408
|
+
private scanLibrarySource;
|
|
358
409
|
/**
|
|
359
410
|
* Direct-mode full execution: the code text runs on the DirectExecutor
|
|
360
411
|
* and outputs/terminals are assembled from the persistent ctx +
|
|
@@ -444,6 +495,7 @@ export declare class CadRuntime {
|
|
|
444
495
|
* @param newCode - the .fai.js source text after the edit.
|
|
445
496
|
* @param opts - optional execution options.
|
|
446
497
|
* @returns promise resolving to the ExecutionResult.
|
|
498
|
+
* @throws {RuntimeConcurrentError} when another CadRuntime is already executing (C1).
|
|
447
499
|
*/
|
|
448
500
|
update(oldCode: string, newCode: string, opts?: ExecuteOptions): Promise<ExecutionResult>;
|
|
449
501
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAI9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAKxD,OAAO,EAAc,KAAK,QAAQ,EAAe,MAAM,aAAa,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAKvD,OAAO,EAEkB,KAAK,eAAe,EAC3C,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/runtime.ts"],"names":[],"mappings":"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"}
|