@intentius/chant 0.124.12 → 0.124.14

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 (928) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,333 @@
1
+ import { dirname, join } from "node:path";
2
+ import { params as currentBuildParams } from "../../params.js";
3
+ import { chantSourceDir } from "../../ts-loader.js";
4
+ /**
5
+ * chant #1045 Phase 2 — generates the source of the "driver" module that runs
6
+ * INSIDE the sandboxed child. See `./run.ts` for the orchestration this feeds
7
+ * (bundle the generated source with esbuild, then spawn a permission-limited
8
+ * child on the bundle) and `../fold-import.ts`'s long doc comment for why
9
+ * every run-fallback file for a build must execute together, in one process,
10
+ * sharing one module graph.
11
+ *
12
+ * The driver imports each run-fallback file via a LITERAL string specifier
13
+ * dynamic `import()` — not a variable — so esbuild's bundler can still trace
14
+ * and inline it (verified: esbuild lowers a literal-specifier `import()` to a
15
+ * lazily-invoked local module initializer, not a runtime resolution), while
16
+ * keeping the SAME per-file try/catch resilience `discover()`'s own run loop
17
+ * has today (one file throwing at import time doesn't take down the whole
18
+ * batch). A literal, per-build-generated import graph is exactly what lets
19
+ * the whole bundle be self-contained: esbuild resolves every project file,
20
+ * lexicon package, and node_modules dependency transitively, ONCE, so the
21
+ * sandboxed child never needs to resolve a module from disk at runtime.
22
+ *
23
+ * Chant's own trusted collection/resolution/encoding step
24
+ * (`collectEntities`/`resolveAttrRefs`/`encodeEntitySet`) runs INSIDE the
25
+ * child too, after every file has been imported — this is what lets naming
26
+ * and AttrRef resolution happen "inside the boundary" for the run-fallback
27
+ * set (mirrors `discoverEntitySetJson`'s doc in `../entity-wire.ts`), so the
28
+ * child can hand back a fully-named, ref-resolved `EntitySetWire` rather than
29
+ * raw, identity-bearing module exports that couldn't cross the process
30
+ * boundary at all.
31
+ */
32
+ // #3878: the TypeScript source, also when this module runs compiled from dist/.
33
+ const HERE = chantSourceDir(import.meta.url);
34
+ const DISCOVERY_DIR = join(HERE, "..");
35
+ /** Absolute paths to chant's OWN trusted modules the generated driver imports — always resolved relative to THIS file's own location on disk, so this works whether chant is running from the monorepo or from a consumer's `node_modules` (both route runtime resolution at `src/*.ts` — see `packages/core/package.json`'s `development`/`default` export conditions). */
36
+ const COLLECT_MODULE = join(DISCOVERY_DIR, "collect.ts");
37
+ const RESOLVE_MODULE = join(DISCOVERY_DIR, "resolve.ts");
38
+ // The pure codec, NOT `entity-wire.ts` — that file also exports
39
+ // `discoverEntitySetJson`, which pulls in `discover()` → `fold-import` →
40
+ // the `typescript` compiler package. See `../entity-wire.ts`'s module doc.
41
+ const ENTITY_WIRE_CODEC_MODULE = join(DISCOVERY_DIR, "entity-wire-codec.ts");
42
+ const CHILD_ERRORS_MODULE = join(HERE, "child-errors.ts");
43
+ const PROVENANCE_MODULE = join(dirname(DISCOVERY_DIR), "provenance.ts");
44
+ // chant #1113 — the config driver's serializability contract (see ./config-wire.ts).
45
+ const CONFIG_WIRE_MODULE = join(HERE, "config-wire.ts");
46
+ // chant #1131 — the policy driver's build-result decoding + diagnostics contract.
47
+ const POLICY_WIRE_MODULE = join(HERE, "policy-wire.ts");
48
+ const POST_SYNTH_MODULE = join(dirname(DISCOVERY_DIR), "lint", "post-synth.ts");
49
+ // chant #1108 — the shared build-time params module (../params.ts). The child
50
+ // process starts with its own, EMPTY copy of that module's `params` object;
51
+ // without re-binding, every run-fallback file imported in the child would see
52
+ // `params.* === undefined` while the fold path (which substitutes values in
53
+ // the PARENT) sees the resolved values — the exact split-brain #1064 exists
54
+ // to prevent. esbuild resolves a project file's own
55
+ // `import { params } from "@intentius/chant/params"` to this same absolute
56
+ // file, so the driver's `setBuildParams` call below mutates the one object
57
+ // every bundled import observes.
58
+ const PARAMS_MODULE = join(dirname(DISCOVERY_DIR), "params.ts");
59
+ /** Escape a value for embedding as a JS/TS source-level literal. */
60
+ function lit(value) {
61
+ return JSON.stringify(value);
62
+ }
63
+ /**
64
+ * chant#2461 — the `send` every driver uses, as generated source lines.
65
+ *
66
+ * `process.send` is asynchronous: it queues the message on the IPC channel and
67
+ * returns. Node's contract is that the optional callback runs once the message
68
+ * has been written, or with an error if it could not be. Without the callback a
69
+ * failed send is not reported to the caller at all, so the driver could return
70
+ * from `main()` believing it had answered.
71
+ *
72
+ * So `send` returns a promise that settles only when the write has completed,
73
+ * and every call site awaits it before `main()` returns. A send that fails, or
74
+ * throws synchronously (a payload that cannot be serialized), writes the reason
75
+ * to stderr with a synchronous `writeSync` and exits 1. That way a result that
76
+ * never left the child cannot end as exit 0 with empty stderr, which is the
77
+ * signature that looks like success went missing.
78
+ *
79
+ * `before` is spliced in at the top of the function body (the run driver marks
80
+ * itself `reported` there).
81
+ */
82
+ export function sendFunctionSource(before = []) {
83
+ return [
84
+ `function send(payload) {`,
85
+ ...before.map((line) => ` ${line}`),
86
+ ` if (typeof process.send !== "function") {`,
87
+ ` console.log(JSON.stringify(payload));`,
88
+ ` return Promise.resolve();`,
89
+ ` }`,
90
+ ` return new Promise((resolve) => {`,
91
+ ` const lost = (err) => {`,
92
+ ` writeSync(2, "chant: the sandboxed child could not hand its result to the parent: " +`,
93
+ ` (err && err.message ? err.message : String(err)) + " (chant#2461)\\n");`,
94
+ ` process.exit(1);`,
95
+ ` };`,
96
+ ` try {`,
97
+ ` process.send(payload, (err) => (err ? lost(err) : resolve()));`,
98
+ ` } catch (err) {`,
99
+ ` lost(err);`,
100
+ ` }`,
101
+ ` });`,
102
+ `}`,
103
+ ];
104
+ }
105
+ /**
106
+ * Generate the driver module's full TypeScript source. Written to a tmp file
107
+ * and bundled (see `./bundle.ts`) before being handed to a sandboxed child —
108
+ * never executed directly by the parent process.
109
+ */
110
+ export function generateDriverSource(options) {
111
+ const { files, buildRoot } = options;
112
+ const lines = [
113
+ `import { collectEntities } from ${lit(COLLECT_MODULE)};`,
114
+ `import { resolveAttrRefs } from ${lit(RESOLVE_MODULE)};`,
115
+ `import { encodeEntitySet } from ${lit(ENTITY_WIRE_CODEC_MODULE)};`,
116
+ `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
117
+ `import { getProvenance } from ${lit(PROVENANCE_MODULE)};`,
118
+ `import { setBuildParams } from ${lit(PARAMS_MODULE)};`,
119
+ `import { writeSync } from "node:fs";`,
120
+ ``,
121
+ `const BUILD_ROOT = ${lit(buildRoot)};`,
122
+ ``,
123
+ // chant #1108 — a snapshot of the PARENT's resolved build-time parameter
124
+ // values, embedded as a literal at generation time (the parent bound them
125
+ // via applyBuildParams/discover() before this source was generated).
126
+ // Values are declared-scalar only (BuildParamValue), so JSON round-trips
127
+ // them exactly. Bound before any project import below.
128
+ `setBuildParams(${lit({ ...currentBuildParams })});`,
129
+ ``,
130
+ // chant#2461 — which file was being imported when the loop drained.
131
+ //
132
+ // A project file whose module scope awaits something that never settles
133
+ // makes its `await import(...)` never complete. Nothing keeps the loop
134
+ // alive, so Node exits 0 having sent nothing, and `main().catch` never
135
+ // fires because an unsettled promise is not a rejection. The parent then
136
+ // knows only that the child vanished.
137
+ //
138
+ // The child DOES know, right up to the moment it exits. `process.on("exit")`
139
+ // runs synchronously, so it cannot `process.send` — that is asynchronous and
140
+ // the channel will never be serviced — but a synchronous `writeSync` to fd 2
141
+ // lands, and the parent already captures and forwards stderr.
142
+ `let importing;`,
143
+ `let reported = false;`,
144
+ `process.on("exit", () => {`,
145
+ ` if (reported || importing === undefined) return;`,
146
+ ` writeSync(2, "chant: this file's module scope never finished evaluating, so the build could not " +`,
147
+ ` "report anything: " + importing + "\\n A top-level \`await\` that never settles does this. " +`,
148
+ ` "Nothing is thrown, so nothing else can name it (chant#2461).\\n");`,
149
+ `});`,
150
+ ``,
151
+ ...sendFunctionSource([`reported = true;`]),
152
+ ``,
153
+ // collectEntities (bundled, real DiscoveryError instances) already names
154
+ // the exact offending file on a same-directory duplicate — reuse that
155
+ // instead of reporting an empty file, which is what forwarding a bare ""
156
+ // through classifyChildError would otherwise do.
157
+ `function errFile(err) {`,
158
+ ` return err && typeof err === "object" && typeof err.file === "string" ? err.file : "";`,
159
+ `}`,
160
+ ``,
161
+ `async function main() {`,
162
+ ` const modules = [];`,
163
+ ` const errors = [];`,
164
+ ];
165
+ for (const file of files) {
166
+ lines.push(` importing = ${lit(file)};`, ` try {`, ` const mod = await import(${lit(file)});`, ` modules.push({ file: ${lit(file)}, exports: mod });`, ` } catch (err) {`, ` errors.push(classifyChildError(${lit(file)}, err).toJSON());`, ` }`, ` importing = undefined;`);
167
+ }
168
+ lines.push(``, ` let entities = new Map();`, ` try {`, ` entities = collectEntities(modules, BUILD_ROOT);`, ` } catch (err) {`, ` errors.push(classifyChildError(errFile(err), err, "resolution").toJSON());`, ` await send({ entitySet: { entities: [] }, errors, provenanceByName: {} });`, ` return;`, ` }`, ``,
169
+ // Recorded BEFORE resolveAttrRefs/encode — not for the parent's own
170
+ // entities (it never sees this subset's raw exports at all), but so a
171
+ // parent-side merge collision against the fold-only set (chant#1045
172
+ // Phase 2 — a same-directory bare name genuinely exported twice, once
173
+ // folded, once run) can name the real run-fallback file instead of the
174
+ // entity name. See discover()'s merge step in ../index.ts.
175
+ ` const provenanceByName = {};`, ` for (const [name, entity] of entities) {`, ` const prov = getProvenance(entity);`, ` if (prov?.sourceFile) provenanceByName[name] = prov.sourceFile;`, ` }`, ``, ` try {`, ` resolveAttrRefs(entities);`, ` } catch (err) {`, ` errors.push(classifyChildError("", err, "resolution").toJSON());`, ` }`, ``, ` let entitySet;`, ` try {`, ` entitySet = encodeEntitySet(entities);`, ` } catch (err) {`, ` errors.push(classifyChildError("", err, "resolution").toJSON());`, ` await send({ entitySet: { entities: [] }, errors, provenanceByName });`, ` return;`, ` }`, ` await send({ entitySet, errors, provenanceByName });`, `}`, ``, `main().catch((err) =>`, ` send({ entitySet: { entities: [] }, errors: [classifyChildError("", err).toJSON()], provenanceByName: {}, fatal: true }),`, `);`);
176
+ return lines.join("\n");
177
+ }
178
+ /**
179
+ * chant #1113 — generate the driver module that evaluates a project's
180
+ * `chant.config.ts` INSIDE the sandboxed child and hands back plain JSON.
181
+ *
182
+ * Same machinery as {@link generateDriverSource} above, deliberately: one
183
+ * literal-specifier dynamic `import()` esbuild can trace and inline, one IPC
184
+ * message back, `./child-errors.ts` for classification so a permission denial
185
+ * names the config file rather than leaking `ERR_ACCESS_DENIED`. The only
186
+ * difference is what crosses — a config is data, not an entity graph, so there
187
+ * is no naming/`AttrRef` step and no `EntitySetWire`; the child instead runs
188
+ * `./config-wire.ts`'s serializability scan and refuses to hand back a config
189
+ * that `JSON.stringify` would silently mangle.
190
+ *
191
+ * The child returns the raw module namespace's chosen export as-is — the
192
+ * `default ?? config ?? namespace` selection and Zod validation
193
+ * (`normalizeConfig`) stay in the parent, where they were, so `--sandbox`
194
+ * changes where the file is *evaluated* and nothing about how its result is
195
+ * interpreted.
196
+ */
197
+ export function generateConfigDriverSource(configPath) {
198
+ return [
199
+ `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
200
+ `import { scanConfigWireSafety } from ${lit(CONFIG_WIRE_MODULE)};`,
201
+ `import { writeSync } from "node:fs";`,
202
+ ``,
203
+ ...sendFunctionSource(),
204
+ ``,
205
+ `async function main() {`,
206
+ ` let namespace;`,
207
+ ` try {`,
208
+ ` namespace = await import(${lit(configPath)});`,
209
+ ` } catch (err) {`,
210
+ ` await send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err).toJSON() });`,
211
+ ` return;`,
212
+ ` }`,
213
+ ``,
214
+ // Mirrors loadChantConfig's own selection so the scan sees exactly the
215
+ // object the parent will normalize. A namespace object is not a plain
216
+ // object; scanConfigWireSafety walks its own keys rather than rejecting it.
217
+ ` const selected = namespace.default ?? namespace.config ?? namespace;`,
218
+ ``,
219
+ ` const offenders = scanConfigWireSafety(selected);`,
220
+ ` if (offenders.length > 0) {`,
221
+ ` await send({ kind: "chant-config", ok: false, offenders });`,
222
+ ` return;`,
223
+ ` }`,
224
+ ``,
225
+ ` let config;`,
226
+ ` try {`,
227
+ // Round-trip here, not just at the IPC boundary: this is what proves the
228
+ // payload really is JSON before it leaves the child, and turns anything
229
+ // the scan somehow missed into a named error instead of a quiet drop.
230
+ ` config = JSON.parse(JSON.stringify(selected ?? {}));`,
231
+ ` } catch (err) {`,
232
+ ` await send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err, "resolution").toJSON() });`,
233
+ ` return;`,
234
+ ` }`,
235
+ ` await send({ kind: "chant-config", ok: true, config });`,
236
+ `}`,
237
+ ``,
238
+ `main().catch((err) =>`,
239
+ ` send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err).toJSON() }),`,
240
+ `);`,
241
+ ].join("\n");
242
+ }
243
+ /**
244
+ * chant #1131 — generate the driver module that imports a project's
245
+ * `lint.policies` modules INSIDE the sandboxed child, runs their checks over
246
+ * the build result the parent hands it, and sends back plain
247
+ * `PostSynthDiagnostic`s.
248
+ *
249
+ * Same machinery again: literal-specifier dynamic `import()`s esbuild can trace
250
+ * and inline, `./child-errors.ts` for classification so a permission denial
251
+ * names the policy file, one IPC message back. Two things are specific to this
252
+ * one:
253
+ *
254
+ * - **It receives before it sends.** The run and config drivers are fully
255
+ * parameterized by their generated source; a policy check needs the finished
256
+ * build result, which is neither known at bundle time nor something to bake
257
+ * into a source literal. It arrives as one IPC message (see `./fork.ts`'s
258
+ * `send`). The `process.on("message", …)` registration is top-level and
259
+ * synchronous, so it is in place before the event loop can deliver anything
260
+ * — a message the parent sent before the child finished booting is queued on
261
+ * the channel, not lost.
262
+ * - **Checks run wrapped, not raw.** `runPostSynthChecks` (chant's own, from
263
+ * `../../lint/post-synth.ts`) is invoked ONCE over every check from every
264
+ * policy module, exactly as `cli/commands/build.ts` invokes it in-process —
265
+ * so the checks share one `PostSynthContext` and run in one order, and the
266
+ * diagnostics come back in the same sequence. The wrapper around each check
267
+ * is what makes a bad return value attributable: it scans that check's own
268
+ * output and throws a `PolicyWireError` naming the module the check was
269
+ * loaded from, rather than reporting an offending index in a merged array.
270
+ */
271
+ export function generatePolicyDriverSource(policyPaths) {
272
+ const lines = [
273
+ `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
274
+ `import { decodePolicyBuildResult, scanPolicyDiagnostics, PolicyWireError } from ${lit(POLICY_WIRE_MODULE)};`,
275
+ `import { runPostSynthChecks, isPostSynthCheck } from ${lit(POST_SYNTH_MODULE)};`,
276
+ `import { writeSync } from "node:fs";`,
277
+ ``,
278
+ ...sendFunctionSource(),
279
+ ``,
280
+ `function fail(file, err, type) {`,
281
+ ` if (err instanceof PolicyWireError) {`,
282
+ ` return send({ kind: "chant-policy", ok: false, offenders: err.offenders });`,
283
+ ` }`,
284
+ ` return send({ kind: "chant-policy", ok: false, error: classifyChildError(file, err, type).toJSON() });`,
285
+ `}`,
286
+ ``,
287
+ // The wrapper described in the doc above: same id/description so any
288
+ // chant-side reporting keyed off them is unchanged, same ctx, same return
289
+ // value — plus the per-check serializability scan.
290
+ `function guard(check, policy) {`,
291
+ ` return {`,
292
+ ` id: check.id,`,
293
+ ` description: check.description,`,
294
+ ` check(ctx) {`,
295
+ ` const produced = check.check(ctx);`,
296
+ ` const offenders = scanPolicyDiagnostics(produced, policy);`,
297
+ ` if (offenders.length > 0) throw new PolicyWireError(offenders);`,
298
+ ` return produced;`,
299
+ ` },`,
300
+ ` };`,
301
+ `}`,
302
+ ``,
303
+ `async function main(request) {`,
304
+ ` let buildResult;`,
305
+ ` try {`,
306
+ ` buildResult = decodePolicyBuildResult(request.buildResult);`,
307
+ ` } catch (err) {`,
308
+ ` await fail("", err, "resolution");`,
309
+ ` return;`,
310
+ ` }`,
311
+ ``,
312
+ ` const checks = [];`,
313
+ ];
314
+ // One block per policy module, in the order `lint.policies` declares them —
315
+ // the same order `loadPolicyChecks` collects in, so the diagnostics sequence
316
+ // matches the in-process one exactly.
317
+ for (const policyPath of policyPaths) {
318
+ lines.push(` try {`, ` const mod = await import(${lit(policyPath)});`, ` for (const value of Object.values(mod)) {`, ` if (isPostSynthCheck(value)) checks.push(guard(value, ${lit(policyPath)}));`, ` }`, ` } catch (err) {`, ` await fail(${lit(policyPath)}, err, "import");`, ` return;`, ` }`);
319
+ }
320
+ lines.push(``, ` let diagnostics;`, ` try {`, ` diagnostics = runPostSynthChecks(checks, buildResult, request.env ?? undefined);`, ` } catch (err) {`, ` await fail("", err, "resolution");`, ` return;`, ` }`, ``, ` await send({ kind: "chant-policy", ok: true, diagnostics });`, `}`, ``,
321
+ // Registered synchronously at module top level — see the doc above on why
322
+ // that is what makes the parent's send-before-boot safe.
323
+ //
324
+ // Removed again as soon as the input arrives, and that is not tidiness: a
325
+ // `message` listener REFS the IPC channel, so leaving it registered would
326
+ // keep this child's event loop alive after it had already answered — and a
327
+ // live channel keeps the PARENT's alive too. `chant build` would not have
328
+ // noticed (`cli/main.ts` ends in `process.exit`); anything embedding chant
329
+ // as a library would have hung. `./fork.ts` kills the child on receipt as
330
+ // the other half of the same fix.
331
+ `let started = false;`, `function onRequest(request) {`, ` if (started) return;`, ` if (!request || request.kind !== "chant-policy-request") return;`, ` started = true;`, ` process.off("message", onRequest);`, ` main(request).catch((err) => fail("", err, "resolution"));`, `}`, `process.on("message", onRequest);`);
332
+ return lines.join("\n");
333
+ }
@@ -0,0 +1,229 @@
1
+ import { fork } from "node:child_process";
2
+ /**
3
+ * chant #1148 — buffers arbitrary chunks and calls `emit` once per complete
4
+ * line, never on a chunk boundary that happens to split a line in two (a
5
+ * pipe makes no promise that one `write()` on the child's side arrives as one
6
+ * `data` event on ours). `flush()` emits whatever partial line never got a
7
+ * trailing newline, so the last unterminated write doesn't silently vanish
8
+ * when the stream ends — the same no-dropping stance this whole feature
9
+ * exists for.
10
+ */
11
+ function lineBuffered(emit) {
12
+ let pending = "";
13
+ return {
14
+ push(chunk) {
15
+ pending += chunk.toString();
16
+ let newlineAt = pending.indexOf("\n");
17
+ while (newlineAt !== -1) {
18
+ emit(pending.slice(0, newlineAt));
19
+ pending = pending.slice(newlineAt + 1);
20
+ newlineAt = pending.indexOf("\n");
21
+ }
22
+ },
23
+ flush() {
24
+ if (pending.length > 0) {
25
+ emit(pending);
26
+ pending = "";
27
+ }
28
+ },
29
+ };
30
+ }
31
+ /**
32
+ * Fork `bundlePath` under `--permission` with a scrubbed environment, and
33
+ * resolve with the first IPC message that satisfies `isResponse` (or reject
34
+ * on crash / timeout / fork error).
35
+ */
36
+ /**
37
+ * Why a child ended without a usable result, in terms a reader can act on.
38
+ *
39
+ * chant#2461 — this used to be one sentence, `child exited before reporting
40
+ * results (code N, signal S)`, for three unrelated situations. The one that
41
+ * was observed in the wild is the hardest to read: exit code 0, empty stderr,
42
+ * no message. That reads like the child was cut off, and it was not: it ran
43
+ * to completion.
44
+ *
45
+ * The observed case turned out to be the parent's fault. A config child that
46
+ * sent its result and exited could have its `exit` dispatched here BEFORE its
47
+ * already-written `message`, and the old `exit` handler settled on the spot.
48
+ * The payload arrived a moment later and was ignored. Stress runs of the real
49
+ * `evaluateConfigSandboxed`, 24 at a time under 16 CPU hogs, lost 3 of 800 and
50
+ * 13 of 1500 that way. An earlier test that blocked the parent had seen
51
+ * `message` win 60 of 60, which is why this was ruled out for a while.
52
+ * {@link settleOnExitAfterChannelDrains} closes it by not reading the exit
53
+ * until the IPC channel has drained. Every driver also awaits its
54
+ * `process.send` callback and exits 1 with a stderr line if the send fails
55
+ * (see `./driver.ts`'s `sendFunctionSource`), so a result that never left the
56
+ * child cannot look like exit 0 either.
57
+ *
58
+ * With both of those in place, exit 0 with nothing on stderr and nothing
59
+ * received has one known cause left: an `await` that never settles.
60
+ * `main().catch(...)` catches a REJECTION, and a promise that never settles is
61
+ * not one, so if nothing keeps the loop alive Node drains it and exits 0
62
+ * having sent nothing. On the RUN path that is reproducible: the driver does
63
+ * `await import(<project file>)` per run-fallback file, module scope is
64
+ * arbitrary project source, and a file whose top level never settles makes
65
+ * that import never complete (the run driver names the file on stderr in that
66
+ * case). The CONFIG driver bundles to one microtask over synchronous code with
67
+ * no runtime imports, so on that path the cause is not known, and the message
68
+ * says so rather than guessing.
69
+ */
70
+ function describeSilentExit(label, code, signal, stderrBuf, unrecognised) {
71
+ const stderr = stderrBuf.trim();
72
+ const head = `${label}: child exited before reporting results (code ${code}, signal ${signal})`;
73
+ if (unrecognised.length > 0) {
74
+ // It DID send. The parent refused the shape, which is a bug in one of them
75
+ // and not the child dying early.
76
+ const shapes = unrecognised
77
+ .map((m) => (m && typeof m === "object" ? `{${Object.keys(m).join(", ")}}` : typeof m))
78
+ .join(", ");
79
+ return (`${head}. It sent ${unrecognised.length} message(s) the parent did not recognise (${shapes}), ` +
80
+ `so the payload shape and the parent's check disagree` +
81
+ (stderr ? `: ${stderr}` : ""));
82
+ }
83
+ if (stderr)
84
+ return `${head}: ${stderr}`;
85
+ if (code !== 0 || signal !== null)
86
+ return head;
87
+ // Exit 0, nothing on stderr, and nothing received even after the IPC
88
+ // channel drained. See this function's doc for what is and is not left.
89
+ return (`${head}. It exited cleanly with nothing on stderr, and no message arrived even after its ` +
90
+ `IPC channel closed, so it never sent one: something it awaited never settled. On the run ` +
91
+ `path the usual cause is a project file with a top-level \`await\` that does not settle. ` +
92
+ `Module scope is arbitrary project source, an import of such a file never completes, and a ` +
93
+ `promise that never settles is not a rejection, so the driver's own \`main().catch\` does ` +
94
+ `not see it either. The config driver has nothing to await that can hang, and a failed ` +
95
+ `send exits non-zero with a reason on stderr, so on the config path this has no known ` +
96
+ `cause: please report it with the command that produced it (chant#2461).`);
97
+ }
98
+ /** How long {@link settleOnExitAfterChannelDrains} waits, after exit, for the IPC channel to report closed. Normally it takes well under a millisecond; this only bounds a channel that never does. */
99
+ const EXIT_DRAIN_GRACE_MS = 2000;
100
+ /**
101
+ * chant#2461 — call `onExit` once `child` has exited AND its IPC channel has
102
+ * drained, so a message the child wrote before exiting is always dispatched
103
+ * first.
104
+ *
105
+ * Node does not order `exit` after `message`. The child's exit and the last
106
+ * bytes on the IPC socket reach the parent's event loop as separate events,
107
+ * and under load the exit can be handled first even though the child wrote
108
+ * the message before it exited. Settling on `exit` alone then drops a payload
109
+ * that is already sitting in the socket. The channel reports `disconnect`
110
+ * only after it has read EOF, which comes after every message the child
111
+ * wrote, so waiting for it is exact.
112
+ *
113
+ * This is deliberately not `close`. `close` also waits for stdout and stderr
114
+ * to end, and a grandchild holding those pipes would turn a fast failure into
115
+ * the full timeout. The wait here is on the IPC channel alone, and is bounded
116
+ * by `graceMs` in case that channel never reports closed.
117
+ */
118
+ export function settleOnExitAfterChannelDrains(child, onExit, graceMs = EXIT_DRAIN_GRACE_MS) {
119
+ child.on("exit", (code, signal) => {
120
+ let done = false;
121
+ let grace;
122
+ const finish = () => {
123
+ if (done)
124
+ return;
125
+ done = true;
126
+ if (grace !== undefined)
127
+ clearTimeout(grace);
128
+ onExit(code, signal);
129
+ };
130
+ if (!child.connected) {
131
+ finish();
132
+ return;
133
+ }
134
+ child.once("disconnect", finish);
135
+ grace = setTimeout(finish, graceMs);
136
+ });
137
+ }
138
+ export function forkSandboxed(options, isResponse) {
139
+ const { bundlePath, bundleDir, projectRealpath, externalReadPaths, env, timeoutMs, label, send, outputPrefix } = options;
140
+ return new Promise((resolvePromise, reject) => {
141
+ const readAllowances = [bundleDir, projectRealpath, ...externalReadPaths].map((p) => `--allow-fs-read=${p}`);
142
+ const child = fork(bundlePath, [], {
143
+ execArgv: ["--permission", ...readAllowances],
144
+ env,
145
+ stdio: ["ignore", "pipe", "pipe", "ipc"],
146
+ });
147
+ let settled = false;
148
+ let stderrBuf = "";
149
+ /** Messages the child sent that `isResponse` refused — see the `message` handler. */
150
+ const unrecognised = [];
151
+ const timeout = setTimeout(() => {
152
+ if (settled)
153
+ return;
154
+ settled = true;
155
+ child.kill();
156
+ reject(new Error(`${label} timed out after ${timeoutMs}ms`));
157
+ }, timeoutMs);
158
+ if (send !== undefined) {
159
+ child.send(send, (err) => {
160
+ if (settled || !err)
161
+ return;
162
+ settled = true;
163
+ clearTimeout(timeout);
164
+ child.kill();
165
+ reject(new Error(`${label}: failed to send the child its input: ${err.message}`));
166
+ });
167
+ }
168
+ // chant #1148 — forward, don't just capture. Both streams write to THIS
169
+ // process's stderr, prefixed and line-buffered, independent of
170
+ // `stderrBuf` below (which keeps accumulating raw stderr for
171
+ // `classifyChildError`'s use — forwarded and captured are not mutually
172
+ // exclusive, the same bytes feed both).
173
+ const forwardLine = (line) => {
174
+ process.stderr.write(`${outputPrefix} ${line}\n`);
175
+ };
176
+ const stdoutForwarder = lineBuffered(forwardLine);
177
+ const stderrForwarder = lineBuffered(forwardLine);
178
+ child.stdout?.on("data", (chunk) => {
179
+ stdoutForwarder.push(chunk);
180
+ });
181
+ child.stdout?.on("end", () => stdoutForwarder.flush());
182
+ child.stderr?.on("data", (chunk) => {
183
+ stderrBuf += chunk.toString();
184
+ stderrForwarder.push(chunk);
185
+ });
186
+ child.stderr?.on("end", () => stderrForwarder.flush());
187
+ child.on("message", (msg) => {
188
+ if (settled)
189
+ return;
190
+ if (!isResponse(msg)) {
191
+ // chant#2461 — remember it rather than dropping it. A child that sent
192
+ // something the parent does not recognise is a different failure from
193
+ // a child that sent nothing, and both used to arrive as "exited before
194
+ // reporting results" with no way to tell them apart.
195
+ unrecognised.push(msg);
196
+ return;
197
+ }
198
+ settled = true;
199
+ clearTimeout(timeout);
200
+ // chant #1131 — the child's entire job is to send this one message, so
201
+ // once it has arrived there is nothing left to wait for. Killing it here
202
+ // rather than hoping it exits on its own closes a real hang: an open
203
+ // handle on the child side (a `setInterval` in project source, an
204
+ // `http.Server` a policy started, or simply an IPC listener the driver
205
+ // registered to RECEIVE its input) keeps the child's event loop alive,
206
+ // and a live IPC channel then keeps the PARENT's alive too. `chant build`
207
+ // never noticed because `cli/main.ts` ends with `process.exit`; anything
208
+ // embedding chant as a library would have hung forever.
209
+ child.kill();
210
+ resolvePromise(msg);
211
+ });
212
+ child.on("error", (err) => {
213
+ if (settled)
214
+ return;
215
+ settled = true;
216
+ clearTimeout(timeout);
217
+ reject(err);
218
+ });
219
+ // chant#2461 — not `child.on("exit")`: a payload can still be in the IPC
220
+ // socket when the exit is handled. See settleOnExitAfterChannelDrains.
221
+ settleOnExitAfterChannelDrains(child, (code, signal) => {
222
+ if (settled)
223
+ return;
224
+ settled = true;
225
+ clearTimeout(timeout);
226
+ reject(new Error(describeSilentExit(label, code, signal, stderrBuf, unrecognised)));
227
+ });
228
+ });
229
+ }