@aiwg/cli 2026.10.3 → 2026.10.5

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.
Files changed (279) hide show
  1. package/README.md +2 -2
  2. package/agentic/code/providers/model-capabilities.v1.json +96 -4
  3. package/bin/aiwg.mjs +50 -27
  4. package/dist/src/agents/grounding/knowledge-base.js +54 -6
  5. package/dist/src/artifacts/browser-export.js +6 -0
  6. package/dist/src/artifacts/checksum-manifest.js +1 -0
  7. package/dist/src/artifacts/citation-parser.js +173 -92
  8. package/dist/src/artifacts/citation-table-schema.js +59 -0
  9. package/dist/src/artifacts/cli.js +69 -18
  10. package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
  11. package/dist/src/artifacts/corpus-tools/vision-extract.js +2 -0
  12. package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
  13. package/dist/src/artifacts/corpus-views/renderers.js +3 -3
  14. package/dist/src/artifacts/discovery-eval.js +6 -4
  15. package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
  16. package/dist/src/artifacts/fortemi-core-sync.js +166 -40
  17. package/dist/src/artifacts/framework-capabilities.js +171 -0
  18. package/dist/src/artifacts/framework-index-paths.js +73 -0
  19. package/dist/src/artifacts/framework-source-digest.js +75 -0
  20. package/dist/src/artifacts/index-builder.js +286 -131
  21. package/dist/src/artifacts/index-files.js +132 -18
  22. package/dist/src/artifacts/index-preparation.js +130 -0
  23. package/dist/src/artifacts/index-refresh.js +591 -0
  24. package/dist/src/artifacts/index-worker.mjs +11 -0
  25. package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
  26. package/dist/src/artifacts/prebuilt-deployment.js +46 -0
  27. package/dist/src/artifacts/prebuilt-relations.js +80 -0
  28. package/dist/src/artifacts/query-engine.js +410 -88
  29. package/dist/src/artifacts/relations-builder.js +168 -0
  30. package/dist/src/artifacts/relations.js +148 -0
  31. package/dist/src/artifacts/stats.js +5 -2
  32. package/dist/src/artifacts/types.js +30 -10
  33. package/dist/src/artifacts/watcher.js +1 -1
  34. package/dist/src/auth/credential-store.js +2 -1
  35. package/dist/src/catalog/cli.d.mts +5 -0
  36. package/dist/src/channel/manager.d.mts +20 -0
  37. package/dist/src/channel/manager.mjs +19 -2
  38. package/dist/src/cli/command-log.js +2 -3
  39. package/dist/src/cli/handlers/artifacts.js +3 -0
  40. package/dist/src/cli/handlers/auth.js +3 -0
  41. package/dist/src/cli/handlers/decision.js +19 -12
  42. package/dist/src/cli/handlers/diagnose.js +4 -3
  43. package/dist/src/cli/handlers/effect.js +4 -2
  44. package/dist/src/cli/handlers/evidence.js +3 -0
  45. package/dist/src/cli/handlers/help.js +1 -0
  46. package/dist/src/cli/handlers/index.js +3 -1
  47. package/dist/src/cli/handlers/init.js +4 -1
  48. package/dist/src/cli/handlers/lint.js +5 -0
  49. package/dist/src/cli/handlers/models.js +104 -8
  50. package/dist/src/cli/handlers/ralph-launcher.js +2 -0
  51. package/dist/src/cli/handlers/refresh.js +12 -0
  52. package/dist/src/cli/handlers/resource-versions.js +3 -0
  53. package/dist/src/cli/handlers/rules.js +195 -0
  54. package/dist/src/cli/handlers/run.js +4 -0
  55. package/dist/src/cli/handlers/runtime-info.js +1 -2
  56. package/dist/src/cli/handlers/script-runner.js +3 -2
  57. package/dist/src/cli/handlers/session.js +19 -9
  58. package/dist/src/cli/handlers/sessions.js +137 -43
  59. package/dist/src/cli/handlers/setup-manifest.js +39 -44
  60. package/dist/src/cli/handlers/setup.js +41 -0
  61. package/dist/src/cli/handlers/steward.js +11 -0
  62. package/dist/src/cli/handlers/subcommands.js +57 -2
  63. package/dist/src/cli/handlers/uhp.js +3 -0
  64. package/dist/src/cli/handlers/use.js +294 -55
  65. package/dist/src/cli/handlers/utilities.js +26 -10
  66. package/dist/src/cli/handlers/version.js +8 -0
  67. package/dist/src/cli/router.js +15 -1
  68. package/dist/src/cli/services/deployment-verification.js +19 -9
  69. package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
  70. package/dist/src/cli/skill-usage.js +2 -3
  71. package/dist/src/config/aiwg-config.js +87 -37
  72. package/dist/src/config/cli.js +111 -5
  73. package/dist/src/config/decision-config.js +106 -0
  74. package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
  75. package/dist/src/config/gitignore.js +50 -0
  76. package/dist/src/config/index-graph-overrides.js +36 -0
  77. package/dist/src/config/project-artifacts-health.d.mts +37 -0
  78. package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
  79. package/dist/src/config/user-config-dir.d.mts +9 -0
  80. package/dist/src/config/user-config.js +2 -1
  81. package/dist/src/config/user-registry.js +23 -15
  82. package/dist/src/config/user-state.js +7 -0
  83. package/dist/src/decision/ask.js +203 -43
  84. package/dist/src/decision/context-live-qualification.js +2 -2
  85. package/dist/src/decision/driver.js +13 -8
  86. package/dist/src/decision/ensemble/aggregate.js +23 -10
  87. package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
  88. package/dist/src/decision/entry.js +2 -15
  89. package/dist/src/decision/graph-live-qualification.js +1 -1
  90. package/dist/src/decision/graph-run.js +9 -0
  91. package/dist/src/decision/heldout/collector.js +5 -13
  92. package/dist/src/decision/heldout/contract.js +30 -7
  93. package/dist/src/decision/jev-credentials.js +15 -1
  94. package/dist/src/decision/ledger.js +131 -28
  95. package/dist/src/decision/offload-activation.js +137 -0
  96. package/dist/src/decision/offload.js +550 -0
  97. package/dist/src/decision/qualification/load.js +4 -6
  98. package/dist/src/decision/savings.js +28 -0
  99. package/dist/src/effects/types.js +5 -1
  100. package/dist/src/effects/verifiers/git.js +2 -1
  101. package/dist/src/effects/verifiers/tracker.js +26 -14
  102. package/dist/src/extensions/commands/definitions.js +19 -0
  103. package/dist/src/extensions/project-local-remove.js +36 -1
  104. package/dist/src/gates/providers/loader.js +61 -17
  105. package/dist/src/installation/manager-command.d.mts +18 -0
  106. package/dist/src/installation/manager-command.mjs +14 -2
  107. package/dist/src/installation/manager.d.mts +49 -0
  108. package/dist/src/installation/manager.mjs +78 -3
  109. package/dist/src/issues/cli.js +4 -4
  110. package/dist/src/issues/local.js +24 -5
  111. package/dist/src/jobs/runner.js +1 -1
  112. package/dist/src/lint/cli.js +27 -1
  113. package/dist/src/lint/loader.js +2 -1
  114. package/dist/src/lint/reporters.js +25 -1
  115. package/dist/src/lint/rule-activation.js +43 -0
  116. package/dist/src/lint/runner.js +137 -62
  117. package/dist/src/mcp/adapters/codex-runtime.js +7 -1
  118. package/dist/src/mcp/claude-install.d.mts +4 -0
  119. package/dist/src/mcp/claude-install.mjs +41 -0
  120. package/dist/src/mcp/cli.d.mts +1 -0
  121. package/dist/src/mcp/cli.mjs +36 -11
  122. package/dist/src/mcp/config-file.d.mts +28 -0
  123. package/dist/src/mcp/config-layers.d.mts +36 -0
  124. package/dist/src/mcp/credentials.d.mts +51 -0
  125. package/dist/src/mcp/grok-build-config.d.mts +6 -0
  126. package/dist/src/mcp/grok-build-config.mjs +1 -1
  127. package/dist/src/mcp/helpers.mjs +3 -2
  128. package/dist/src/mcp/muse-native-config.d.mts +13 -0
  129. package/dist/src/mcp/muse-native-config.mjs +1 -0
  130. package/dist/src/mcp/omp-config.d.mts +4 -0
  131. package/dist/src/mcp/registry.js +3 -93
  132. package/dist/src/mcp/registry.mjs +3 -87
  133. package/dist/src/mcp/server-config.d.mts +3 -0
  134. package/dist/src/mcp/server-config.mjs +89 -0
  135. package/dist/src/mcp/server.mjs +37 -375
  136. package/dist/src/mcp/test-simple.mjs +2 -1
  137. package/dist/src/mcp/toml-editor.d.mts +4 -0
  138. package/dist/src/mcp/toml-string.d.mts +1 -0
  139. package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
  140. package/dist/src/mcp/tool-filters.d.mts +46 -0
  141. package/dist/src/mcp/tools/decision.mjs +12 -11
  142. package/dist/src/mcp/tools/discovery.mjs +62 -55
  143. package/dist/src/mcp/tools/orchestration.mjs +12 -2
  144. package/dist/src/mcp/tools/worker-invoke.mjs +1340 -23
  145. package/dist/src/mcp/tools/worker-shell-control.mjs +52 -21
  146. package/dist/src/mcp/tools/worker-stdin-runtime.mjs +3 -3
  147. package/dist/src/mission-protocol/codecs.js +8 -0
  148. package/dist/src/models/config-loader.js +7 -2
  149. package/dist/src/models/model-capabilities.v1.json +96 -4
  150. package/dist/src/models/model-discovery.js +76 -11
  151. package/dist/src/models/provider-policy.js +101 -7
  152. package/dist/src/models/qualification-digest.d.mts +2 -0
  153. package/dist/src/models/resolver.js +12 -10
  154. package/dist/src/models/worker-direct-readiness.js +65 -44
  155. package/dist/src/models/worker-dispatch-offer.js +3 -3
  156. package/dist/src/models/worker-health-readiness.js +16 -3
  157. package/dist/src/models/worker-installation.d.mts +39 -0
  158. package/dist/src/models/worker-installation.mjs +135 -28
  159. package/dist/src/process/bounded-child-process.d.mts +84 -0
  160. package/dist/src/process/bounded-child-process.mjs +43 -0
  161. package/dist/src/process/cli-command.d.mts +16 -0
  162. package/dist/src/process/signal-child.d.mts +6 -0
  163. package/dist/src/process/signal-child.mjs +7 -0
  164. package/dist/src/providers/deployed-skill-roots.js +20 -0
  165. package/dist/src/providers/grok-build-acp.js +3 -2
  166. package/dist/src/providers/grok-build-headless.js +12 -4
  167. package/dist/src/providers/grok-build-inspect.js +1 -0
  168. package/dist/src/providers/omp-agent.d.mts +8 -0
  169. package/dist/src/providers/omp-diagnostics.d.mts +1 -0
  170. package/dist/src/providers/omp-paths.d.mts +13 -0
  171. package/dist/src/providers/skill-ownership.d.mts +9 -0
  172. package/dist/src/providers/skill-ownership.mjs +88 -0
  173. package/dist/src/rules/activation.d.mts +21 -0
  174. package/dist/src/rules/activation.mjs +62 -0
  175. package/dist/src/rules/inline-budget.d.mts +26 -0
  176. package/dist/src/rules/inline-budget.mjs +66 -0
  177. package/dist/src/rules/inventory.js +129 -0
  178. package/dist/src/rules/pin-state.js +73 -0
  179. package/dist/src/rules/pins.d.mts +14 -0
  180. package/dist/src/rules/pins.mjs +112 -0
  181. package/dist/src/rules/rule-frontmatter.schema.json +197 -0
  182. package/dist/src/serve/mission-conductor.js +38 -12
  183. package/dist/src/serve/worker-invocation.js +30 -10
  184. package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
  185. package/dist/src/sessions/adapter-registry.js +23 -19
  186. package/dist/src/sessions/adapters/claude.js +39 -54
  187. package/dist/src/sessions/adapters/codex.js +95 -67
  188. package/dist/src/sessions/adapters/copilot.js +4 -4
  189. package/dist/src/sessions/adapters/cursor.js +40 -57
  190. package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
  191. package/dist/src/sessions/adapters/factory.js +31 -27
  192. package/dist/src/sessions/adapters/generic.js +10 -10
  193. package/dist/src/sessions/adapters/grok-build.js +11 -11
  194. package/dist/src/sessions/adapters/grokbot.js +24 -13
  195. package/dist/src/sessions/adapters/hermes.js +27 -29
  196. package/dist/src/sessions/adapters/muse-workspace-scan.js +31 -11
  197. package/dist/src/sessions/adapters/muse.js +150 -93
  198. package/dist/src/sessions/adapters/omp.js +28 -14
  199. package/dist/src/sessions/adapters/openclaw.js +89 -79
  200. package/dist/src/sessions/adapters/opencode.js +27 -24
  201. package/dist/src/sessions/adapters/openhuman.js +18 -60
  202. package/dist/src/sessions/adapters/pi.js +29 -14
  203. package/dist/src/sessions/adapters/warp.js +3 -3
  204. package/dist/src/sessions/adapters/windsurf.js +19 -48
  205. package/dist/src/sessions/batch-contracts.js +16 -8
  206. package/dist/src/sessions/batch-import.js +252 -12
  207. package/dist/src/sessions/contracts.js +50 -3
  208. package/dist/src/sessions/coverage-preflight.js +27 -2
  209. package/dist/src/sessions/export-plan.js +4 -3
  210. package/dist/src/sessions/import-exclusions.js +72 -0
  211. package/dist/src/sessions/import-lease.js +34 -18
  212. package/dist/src/sessions/import-limits.js +37 -0
  213. package/dist/src/sessions/importer.js +60 -38
  214. package/dist/src/sessions/lifecycle.js +45 -0
  215. package/dist/src/sessions/policy.js +145 -26
  216. package/dist/src/sessions/readers.js +106 -53
  217. package/dist/src/sessions/refresh.js +105 -0
  218. package/dist/src/sessions/repository.js +151 -54
  219. package/dist/src/sessions/workspace-discovery.js +292 -60
  220. package/dist/src/sessions/workspace-matching.js +107 -0
  221. package/dist/src/skills/importer.js +1 -0
  222. package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
  223. package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
  224. package/dist/src/smiths/context-pipeline/finalization.js +6 -5
  225. package/dist/src/smiths/context-pipeline/generator.js +21 -4
  226. package/dist/src/smiths/context-pipeline/parallelism-section.js +7 -15
  227. package/dist/src/smiths/mcpsmith/generator.js +1 -1
  228. package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
  229. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +76 -18
  230. package/dist/src/storage/backends/fs.js +18 -76
  231. package/dist/src/storage/backends/obsidian.js +1 -0
  232. package/dist/src/tracker/forge-http.js +2 -1
  233. package/dist/src/update/checker.d.mts +2 -0
  234. package/dist/src/update/service.d.mts +22 -0
  235. package/dist/src/utils/contained-filesystem.d.mts +37 -0
  236. package/dist/src/utils/contained-filesystem.mjs +683 -0
  237. package/dist/src/utils/temporary-directory.js +36 -0
  238. package/dist/src/writing/example-generator.js +1 -1
  239. package/package.json +15 -2
  240. package/schemas/models/model-catalog.v1.schema.json +1 -1
  241. package/schemas/models/provider-model-capabilities.v1.schema.json +6 -0
  242. package/tools/_resolve-impl.mjs +13 -15
  243. package/tools/agents/deploy-agents.mjs +49 -21
  244. package/tools/agents/providers/base.mjs +104 -134
  245. package/tools/agents/providers/claude.mjs +8 -24
  246. package/tools/agents/providers/codex.mjs +18 -11
  247. package/tools/agents/providers/cursor.mjs +19 -18
  248. package/tools/agents/providers/grok-build.mjs +3 -1
  249. package/tools/agents/providers/hermes.mjs +57 -47
  250. package/tools/agents/providers/openclaw.mjs +9 -4
  251. package/tools/agents/providers/pi.mjs +5 -0
  252. package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
  253. package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
  254. package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
  255. package/tools/agents/providers/rule-delivery.mjs +1270 -0
  256. package/tools/agents/providers/warp.mjs +20 -26
  257. package/tools/cli/decision-offload-report.mjs +40 -0
  258. package/tools/cli/workspace-status.mjs +862 -0
  259. package/tools/plugin/package-plugins.mjs +186 -8
  260. package/tools/plugin/plugin-links.mjs +114 -0
  261. package/tools/providers/antigravity-transport.mjs +3 -1
  262. package/tools/providers/deepseek-harness-transport.mjs +6 -4
  263. package/tools/providers/omp-transport.mjs +4 -2
  264. package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
  265. package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
  266. package/tools/ralph-external/lib/omp-adapter.mjs +1 -1
  267. package/tools/ralph-external/lib/pi-adapter.mjs +0 -4
  268. package/tools/ralph-external/lib/provider-adapter.mjs +59 -1
  269. package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
  270. package/tools/ralph-external/lib/session-environment.mjs +28 -0
  271. package/tools/ralph-external/lib/systemd-client.mjs +49 -0
  272. package/tools/ralph-external/lib/worker-health.mjs +1 -1
  273. package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
  274. package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
  275. package/tools/ralph-external/process-monitor.mjs +1017 -0
  276. package/tools/ralph-external/session-launcher.mjs +5057 -0
  277. package/tools/scripts/resource-preflight.mjs +541 -0
  278. package/tools/skills/deploy-skills-codex.mjs +2 -1
  279. package/vscode-extension/schemas/aiwg.config.v1.json +1194 -231
@@ -1,17 +1,20 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
+ import { hostname } from 'node:os';
5
+ export class DirectoryLockContentionError extends Error {
6
+ }
4
7
  /**
5
8
  * Acquire a cross-process directory lock and return an ownership-safe release.
6
9
  *
7
- * The lock deliberately fails after a bounded wait instead of deleting a lock
8
- * that may belong to a slow but healthy package build.
10
+ * Package builds fail after a bounded wait. Maintenance can opt into recovery
11
+ * of owners proven dead on the same host; healthy or unknown owners are retained.
9
12
  */
10
13
  export async function acquireDirectoryLock(lockPath, options = {}) {
11
14
  const timeoutMs = options.timeoutMs ?? 180_000;
12
15
  const pollMs = options.pollMs ?? 100;
13
16
  const deadline = Date.now() + timeoutMs;
14
- const token = `${process.pid}:${randomUUID()}`;
17
+ const token = `${process.pid}:${randomUUID()}:${hostname()}`;
15
18
  const ownerPath = path.join(lockPath, 'owner');
16
19
  await mkdir(path.dirname(lockPath), { recursive: true });
17
20
  while (true) {
@@ -29,8 +32,10 @@ export async function acquireDirectoryLock(lockPath, options = {}) {
29
32
  catch (error) {
30
33
  if (error.code !== 'EEXIST')
31
34
  throw error;
35
+ if (options.reclaimDeadOwner && await reclaimDeadLock(lockPath))
36
+ continue;
32
37
  if (Date.now() >= deadline) {
33
- throw new Error(`timed out waiting for build lock: ${lockPath}`);
38
+ throw new DirectoryLockContentionError(`timed out waiting for build lock: ${lockPath}`);
34
39
  }
35
40
  await new Promise((resolve) => setTimeout(resolve, pollMs));
36
41
  }
@@ -46,4 +51,42 @@ export async function acquireDirectoryLock(lockPath, options = {}) {
46
51
  await rm(lockPath, { recursive: true, force: true });
47
52
  };
48
53
  }
54
+ /** Serialize stale-owner recovery so two waiters cannot remove a new lease. */
55
+ async function reclaimDeadLock(lockPath) {
56
+ let release;
57
+ try {
58
+ release = await acquireDirectoryLock(`${lockPath}.recovery`, { timeoutMs: 0, reclaimDeadOwner: true });
59
+ }
60
+ catch (error) {
61
+ if (error instanceof DirectoryLockContentionError)
62
+ return false;
63
+ throw error;
64
+ }
65
+ try {
66
+ let owner;
67
+ try {
68
+ owner = (await readFile(path.join(lockPath, 'owner'), 'utf8')).trim();
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ const [pidText, , host] = owner.split(':');
74
+ const pid = Number(pidText);
75
+ if (host !== hostname() || !Number.isSafeInteger(pid) || pid <= 0)
76
+ return false;
77
+ try {
78
+ process.kill(pid, 0);
79
+ return false;
80
+ }
81
+ catch (error) {
82
+ if (error.code !== 'ESRCH')
83
+ return false;
84
+ }
85
+ await rm(lockPath, { recursive: true, force: true });
86
+ return true;
87
+ }
88
+ finally {
89
+ await release();
90
+ }
91
+ }
49
92
  //# sourceMappingURL=prebuilt-build-lock.js.map
@@ -0,0 +1,46 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { resolveFrameworkCorpusRoot, resolveFrameworkIndexRoot } from './framework-index-paths.js';
5
+ import { frameworkSourceDigest } from './framework-source-digest.js';
6
+ import { selectPrebuiltRelations } from './relations.js';
7
+ import { getFortemiCorePrebuiltStatus } from './fortemi-core-sync.js';
8
+ import { loadFortemiCoreMetadataEntries } from './fortemi-core-query-adapter.js';
9
+ /** The shipped search export is usable only while both it and its source-bound
10
+ * relationship projection validate. No local index or receipt is required. */
11
+ export function loadPrebuiltDeploymentIndex(root, options = {}) {
12
+ if (options.strictRoot && !resolveFrameworkCorpusRoot(root))
13
+ return null;
14
+ root = resolveFrameworkIndexRoot(root);
15
+ if (!selectPrebuiltRelations(root).reader)
16
+ return null;
17
+ const status = getFortemiCorePrebuiltStatus('framework', root);
18
+ if (!status.built || status.stale || !status.generatedAt)
19
+ return null;
20
+ let stats;
21
+ try {
22
+ const manifest = JSON.parse(fs.readFileSync(status.manifestPath, 'utf8'));
23
+ const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
24
+ if (manifest.package_version !== pkg.version || manifest.source_digest !== frameworkSourceDigest(root))
25
+ return null;
26
+ const text = fs.readFileSync(path.join(path.dirname(status.manifestPath), 'source-stats.json'), 'utf8');
27
+ if (createHash('sha256').update(text).digest('hex') !== manifest.source_stats_checksum)
28
+ return null;
29
+ stats = JSON.parse(text);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ const { entries } = loadFortemiCoreMetadataEntries(root, 'framework');
35
+ const byPath = Object.fromEntries(entries.map(entry => [entry.path, entry]));
36
+ if (!entries.length || entries.length !== status.itemCount || Object.keys(byPath).length !== entries.length)
37
+ return null;
38
+ const byType = {};
39
+ for (const entry of entries)
40
+ byType[entry.type] = (byType[entry.type] ?? 0) + 1;
41
+ if (stats.totalArtifacts !== entries.length || !stats.byType ||
42
+ Object.keys({ ...stats.byType, ...byType }).some(type => (stats.byType[type] ?? 0) !== (byType[type] ?? 0)))
43
+ return null;
44
+ return { index: { version: 'prebuilt', builtAt: status.generatedAt, buildTimeMs: 0, entries: byPath }, stats };
45
+ }
46
+ //# sourceMappingURL=prebuilt-deployment.js.map
@@ -0,0 +1,80 @@
1
+ /** Reproducible build-time binding/configuration projection. No deploy side effects. */
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createHash } from 'node:crypto';
5
+ import { buildRelations } from './relations-builder.js';
6
+ import { frameworkSourceDigest } from './framework-source-digest.js';
7
+ import { PREBUILT_RELATIONS_DIR } from './relations.js';
8
+ import { PROVIDER_IDS } from '../providers/provider-definitions.js';
9
+ import { parseRuleFrontmatter, inferRuleActivation } from '../rules/activation.mjs';
10
+ /** Sets describe the corpus projection before mode selection, tier filters or operator pins. */
11
+ export function buildResolvedBindings(root, relations) {
12
+ const table = { schema_version: 'aiwg.bindings.resolved.v1', rules: {}, targets: relations.targets, providers: {} };
13
+ for (const provider of PROVIDER_IDS)
14
+ table.providers[provider] = { kernel: [], summary: [], native_paths: [], discoverable_paths: [], bound: [], on_demand: [] };
15
+ for (const [id, rule] of Object.entries(relations.rules)) {
16
+ const parsed = parseRuleFrontmatter(fs.readFileSync(path.join(root, rule.path), 'utf8'));
17
+ const tagged = Boolean(parsed.rule?.tagged);
18
+ const activation = tagged ? parsed.rule.activation : rule.type === 'behavior' ? 'kernel' : inferRuleActivation(rule.enforcement);
19
+ const targets = { skill: [], agent: [], flow: [], command: [] };
20
+ for (const target of rule.targets)
21
+ targets[target.type].push(target.id);
22
+ table.rules[id] = { activation, tagged, summary: parsed.rule?.summary ?? rule.summary, targets };
23
+ for (const [provider, projection] of Object.entries(table.providers)) {
24
+ if (activation === 'kernel') {
25
+ const hermesDeferred = provider === 'hermes' && tagged && String(parsed.rule?.enforcement ?? '').toLowerCase() !== 'critical';
26
+ projection[hermesDeferred ? 'summary' : 'kernel'].push(id);
27
+ }
28
+ else if (activation === 'paths')
29
+ projection[['claude', 'cursor'].includes(provider) ? 'native_paths' : 'discoverable_paths'].push(id);
30
+ else if (activation === 'bound')
31
+ projection.bound.push(id);
32
+ else if (activation === 'summary')
33
+ projection.summary.push(id);
34
+ else
35
+ projection.on_demand.push(id);
36
+ }
37
+ }
38
+ return table;
39
+ }
40
+ export function buildPrebuiltRelations(root, entries) {
41
+ const relations = buildRelations(entries);
42
+ const relationText = JSON.stringify(relations, null, 2);
43
+ const bindingText = JSON.stringify(buildResolvedBindings(root, relations), null, 2) + '\n';
44
+ const hash = (text) => createHash('sha256').update(text).digest('hex');
45
+ const stamp = {
46
+ schema_version: 'aiwg.relationships.prebuilt.v1',
47
+ package_version: JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).version,
48
+ source_digest: frameworkSourceDigest(root, false), generated_at: relations.generatedAt,
49
+ checksums: { 'relations.json': hash(relationText), 'bindings.json': hash(bindingText) },
50
+ };
51
+ return { 'relations.json': relationText, 'bindings.json': bindingText, 'manifest.json': JSON.stringify(stamp, null, 2) + '\n' };
52
+ }
53
+ export function checkPrebuiltRelations(root) {
54
+ const dir = path.join(root, PREBUILT_RELATIONS_DIR);
55
+ const errors = [];
56
+ try {
57
+ const stamp = JSON.parse(fs.readFileSync(path.join(dir, 'manifest.json'), 'utf8'));
58
+ if (stamp.schema_version !== 'aiwg.relationships.prebuilt.v1')
59
+ errors.push('unsupported relationship manifest schema');
60
+ if (stamp.package_version !== JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).version)
61
+ errors.push('relationship package version differs');
62
+ if (stamp.source_digest !== frameworkSourceDigest(root, false))
63
+ errors.push('relationship source digest differs; run npm run release:fortemi-index');
64
+ for (const file of ['relations.json', 'bindings.json']) {
65
+ const text = fs.readFileSync(path.join(dir, file), 'utf8');
66
+ if (createHash('sha256').update(text).digest('hex') !== stamp.checksums[file])
67
+ errors.push(`${file} checksum differs`);
68
+ const table = JSON.parse(text);
69
+ if (file === 'bindings.json' && table.schema_version !== 'aiwg.bindings.resolved.v1')
70
+ errors.push('unsupported resolved binding table schema');
71
+ if (file === 'relations.json' && (table.version !== 1 || !table.artifacts || !table.rules || !table.targets))
72
+ errors.push('unsupported relationship table schema');
73
+ }
74
+ }
75
+ catch (error) {
76
+ errors.push(`relationship tables unavailable: ${error instanceof Error ? error.message : String(error)}`);
77
+ }
78
+ return errors;
79
+ }
80
+ //# sourceMappingURL=prebuilt-relations.js.map