@intentius/chant 0.124.13 → 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 (907) 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.js +260 -0
  306. package/dist/gate-resume-run.js +154 -0
  307. package/dist/gated-waves.js +165 -0
  308. package/dist/governance.js +43 -0
  309. package/dist/graph-declared.js +45 -0
  310. package/dist/graph-detail.js +207 -0
  311. package/dist/graph-dot.js +54 -0
  312. package/dist/graph-effective.js +107 -0
  313. package/dist/graph-ir.js +623 -0
  314. package/dist/graph-layout.js +184 -0
  315. package/dist/graph-lens.js +105 -0
  316. package/dist/graph-mermaid.js +83 -0
  317. package/dist/graph-ops.js +39 -0
  318. package/dist/graph-refs.js +156 -0
  319. package/dist/held-elsewhere.js +87 -0
  320. package/dist/identity.js +251 -0
  321. package/dist/import/base-parser.js +34 -0
  322. package/dist/import/embedded.js +255 -0
  323. package/dist/import/generator.js +1 -0
  324. package/dist/import/ir-utils.js +85 -0
  325. package/dist/import/parser-options.js +45 -0
  326. package/dist/import/parser.js +1 -0
  327. package/dist/index.js +118 -0
  328. package/dist/intrinsic-interpolation.js +73 -0
  329. package/dist/intrinsic.js +31 -0
  330. package/dist/join-key.js +35 -0
  331. package/dist/kubectl-context.js +150 -0
  332. package/dist/lexicon-config.js +58 -0
  333. package/dist/lexicon-integrity.js +47 -0
  334. package/dist/lexicon-manifest.js +70 -0
  335. package/dist/lexicon-module.d.ts.map +1 -1
  336. package/dist/lexicon-module.js +241 -0
  337. package/dist/lexicon-output.js +218 -0
  338. package/dist/lexicon-plugin-helpers.js +104 -0
  339. package/dist/lexicon-schema.js +136 -0
  340. package/dist/lexicon.js +130 -0
  341. package/dist/lifecycle/affected.js +224 -0
  342. package/dist/lifecycle/assert-live.js +110 -0
  343. package/dist/lifecycle/build-ledger-store.js +160 -0
  344. package/dist/lifecycle/build-ledger.js +155 -0
  345. package/dist/lifecycle/change-set.js +356 -0
  346. package/dist/lifecycle/converge-ledger.js +161 -0
  347. package/dist/lifecycle/deep-diff.js +233 -0
  348. package/dist/lifecycle/deep-observe.js +147 -0
  349. package/dist/lifecycle/digest.js +143 -0
  350. package/dist/lifecycle/disruption.js +135 -0
  351. package/dist/lifecycle/gate-applied.js +113 -0
  352. package/dist/lifecycle/gate-audit.js +341 -0
  353. package/dist/lifecycle/gate-ledger-select.js +89 -0
  354. package/dist/lifecycle/gate-ledger.js +193 -0
  355. package/dist/lifecycle/gate-origin.js +117 -0
  356. package/dist/lifecycle/gate-pending.js +58 -0
  357. package/dist/lifecycle/git.js +1182 -0
  358. package/dist/lifecycle/identity.js +58 -0
  359. package/dist/lifecycle/index.js +26 -0
  360. package/dist/lifecycle/lease.js +283 -0
  361. package/dist/lifecycle/ledger-port.js +1 -0
  362. package/dist/lifecycle/legacy-digest.js +91 -0
  363. package/dist/lifecycle/live-diff.js +274 -0
  364. package/dist/lifecycle/local-note.js +15 -0
  365. package/dist/lifecycle/member-ledger.js +122 -0
  366. package/dist/lifecycle/observation-baseline.js +155 -0
  367. package/dist/lifecycle/observe.js +375 -0
  368. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  369. package/dist/lifecycle/override-ledger.js +54 -0
  370. package/dist/lifecycle/plan-digest.js +110 -0
  371. package/dist/lifecycle/plan-ledger.js +129 -0
  372. package/dist/lifecycle/receipt-plan.js +192 -0
  373. package/dist/lifecycle/release-ledger.js +155 -0
  374. package/dist/lifecycle/release-read.js +64 -0
  375. package/dist/lifecycle/replay.js +193 -0
  376. package/dist/lifecycle/rollback.js +102 -0
  377. package/dist/lifecycle/run-ledger.js +183 -0
  378. package/dist/lifecycle/scenario-eval.js +204 -0
  379. package/dist/lifecycle/scenario.js +214 -0
  380. package/dist/lifecycle/snapshot.js +239 -0
  381. package/dist/lifecycle/status.js +447 -0
  382. package/dist/lifecycle/symptoms.js +117 -0
  383. package/dist/lifecycle/teardown.js +255 -0
  384. package/dist/lifecycle/types.js +1 -0
  385. package/dist/lifecycle/unobserved-gate.js +33 -0
  386. package/dist/lifecycle/wave-plans.js +68 -0
  387. package/dist/lifecycle/work-item-id.js +36 -0
  388. package/dist/lifecycle/work-lease.js +393 -0
  389. package/dist/lint/component-checks.js +87 -0
  390. package/dist/lint/config.js +483 -0
  391. package/dist/lint/declarative.js +122 -0
  392. package/dist/lint/discover.d.ts.map +1 -1
  393. package/dist/lint/discover.js +138 -0
  394. package/dist/lint/engine.js +246 -0
  395. package/dist/lint/knowledge-checks.js +64 -0
  396. package/dist/lint/named-checks.js +22 -0
  397. package/dist/lint/output-checks.js +87 -0
  398. package/dist/lint/output-docs.js +163 -0
  399. package/dist/lint/parser.js +33 -0
  400. package/dist/lint/pipeline-change-gate.js +70 -0
  401. package/dist/lint/policy-import.d.ts +1 -1
  402. package/dist/lint/policy-import.d.ts.map +1 -1
  403. package/dist/lint/policy-import.js +62 -0
  404. package/dist/lint/policy-sandbox.js +86 -0
  405. package/dist/lint/policy.js +122 -0
  406. package/dist/lint/post-synth.js +87 -0
  407. package/dist/lint/presets/relaxed.json +26 -0
  408. package/dist/lint/presets/strict.json +24 -24
  409. package/dist/lint/receipt-checks.js +83 -0
  410. package/dist/lint/rule-loader.d.ts.map +1 -1
  411. package/dist/lint/rule-loader.js +89 -0
  412. package/dist/lint/rule-registry.js +86 -0
  413. package/dist/lint/rule.js +1 -0
  414. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  415. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  416. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  417. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  437. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  438. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  439. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  440. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  441. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  442. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  443. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  444. package/dist/lint/rules/comp/index.js +33 -0
  445. package/dist/lint/rules/comp/support.js +129 -0
  446. package/dist/lint/rules/composite-scope.js +51 -0
  447. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  448. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  449. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  450. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  451. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  452. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  453. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  454. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  455. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  456. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  457. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  458. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  459. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  460. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  461. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  462. package/dist/lint/rules/export-required.js +115 -0
  463. package/dist/lint/rules/file-declarable-limit.js +88 -0
  464. package/dist/lint/rules/flat-declarations.js +62 -0
  465. package/dist/lint/rules/index.js +90 -0
  466. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  467. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  468. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  469. package/dist/lint/rules/no-string-ref.js +59 -0
  470. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  471. package/dist/lint/rules/no-unused-declarable.js +142 -0
  472. package/dist/lint/rules/op/index.js +28 -0
  473. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  474. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  475. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  476. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  477. package/dist/lint/rules/op/support.js +11 -0
  478. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  479. package/dist/lint/rules/property-kind.js +56 -0
  480. package/dist/lint/rules/single-concern-file.js +71 -0
  481. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  482. package/dist/lint/selectors.js +168 -0
  483. package/dist/lint/suppressions.js +129 -0
  484. package/dist/lint/typescript.js +17 -0
  485. package/dist/live-endpoint.js +113 -0
  486. package/dist/live-read-session.js +76 -0
  487. package/dist/lsp/lexicon-providers.js +163 -0
  488. package/dist/lsp/types.js +5 -0
  489. package/dist/managed-fields.js +293 -0
  490. package/dist/mcp/types.js +4 -0
  491. package/dist/notify-verify.js +0 -1
  492. package/dist/notify.js +0 -1
  493. package/dist/notify.schema.json +72 -0
  494. package/dist/observation.js +266 -0
  495. package/dist/okf-read.js +134 -0
  496. package/dist/okf.js +275 -0
  497. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  498. package/dist/op/activities/activity-contracts.js +313 -0
  499. package/dist/op/activities/apply.js +582 -0
  500. package/dist/op/activities/build.js +18 -0
  501. package/dist/op/activities/change-coverage.js +40 -0
  502. package/dist/op/activities/change-set.js +64 -0
  503. package/dist/op/activities/converge.js +492 -0
  504. package/dist/op/activities/decide.js +211 -0
  505. package/dist/op/activities/env-teardown.js +110 -0
  506. package/dist/op/activities/factory.js +591 -0
  507. package/dist/op/activities/forge-pull-request.js +82 -0
  508. package/dist/op/activities/gh-host.js +78 -0
  509. package/dist/op/activities/guard-validate.js +165 -0
  510. package/dist/op/activities/http-check.js +40 -0
  511. package/dist/op/activities/index.js +59 -0
  512. package/dist/op/activities/lexicon-upgrade.js +629 -0
  513. package/dist/op/activities/lifecycle.js +109 -0
  514. package/dist/op/activities/pipeline-audit.js +147 -0
  515. package/dist/op/activities/policy.js +26 -0
  516. package/dist/op/activities/predict-behaviour.js +341 -0
  517. package/dist/op/activities/propose-upgrade.js +165 -0
  518. package/dist/op/activities/reconcile.js +997 -0
  519. package/dist/op/activities/shell.js +118 -0
  520. package/dist/op/activities/source-release.js +97 -0
  521. package/dist/op/activities/source-rollback.js +165 -0
  522. package/dist/op/activities/teardown.js +17 -0
  523. package/dist/op/activities/util.js +6 -0
  524. package/dist/op/activities/wait.js +51 -0
  525. package/dist/op/activities/work-evidence.js +35 -0
  526. package/dist/op/activities/workflow-audit.js +133 -0
  527. package/dist/op/activity-contract-registry.js +106 -0
  528. package/dist/op/activity-contract.js +232 -0
  529. package/dist/op/activity-failure.js +31 -0
  530. package/dist/op/activity-profiles.js +129 -0
  531. package/dist/op/activity-registry.js +105 -0
  532. package/dist/op/activity-runtime.js +28 -0
  533. package/dist/op/builders.js +801 -0
  534. package/dist/op/change-signal.js +118 -0
  535. package/dist/op/composites/apply-op.js +151 -0
  536. package/dist/op/composites/behaviour-op.js +65 -0
  537. package/dist/op/composites/converge-op.js +141 -0
  538. package/dist/op/composites/index.js +19 -0
  539. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  540. package/dist/op/composites/pipeline-audit-op.js +50 -0
  541. package/dist/op/composites/reconcile-op.js +84 -0
  542. package/dist/op/composites/watch-op.js +69 -0
  543. package/dist/op/composites/workflow-audit-op.js +57 -0
  544. package/dist/op/converge-rule.js +205 -0
  545. package/dist/op/cron.js +146 -0
  546. package/dist/op/decide-backend.js +181 -0
  547. package/dist/op/decide-config.js +68 -0
  548. package/dist/op/decide-read-inputs.js +141 -0
  549. package/dist/op/discover.d.ts.map +1 -1
  550. package/dist/op/discover.js +213 -0
  551. package/dist/op/duration.js +21 -0
  552. package/dist/op/emulator-freshness.js +80 -0
  553. package/dist/op/emulator-lifecycle.js +269 -0
  554. package/dist/op/factory.js +83 -0
  555. package/dist/op/gate-approval.js +172 -0
  556. package/dist/op/gate-name.js +86 -0
  557. package/dist/op/gate-plan-context.js +167 -0
  558. package/dist/op/gate-point-run.js +67 -0
  559. package/dist/op/gate-point.js +111 -0
  560. package/dist/op/gate-resume-plan.js +155 -0
  561. package/dist/op/gate-resume.js +31 -0
  562. package/dist/op/gate-review.js +290 -0
  563. package/dist/op/gate-run-locator.js +85 -0
  564. package/dist/op/gate-summary.js +100 -0
  565. package/dist/op/gate-wait.js +56 -0
  566. package/dist/op/gate.js +449 -0
  567. package/dist/op/generate-pipeline.js +124 -0
  568. package/dist/op/index.js +51 -0
  569. package/dist/op/lifecycle-receipt-store.js +45 -0
  570. package/dist/op/local-executor.js +1164 -0
  571. package/dist/op/local-output.js +140 -0
  572. package/dist/op/op-ir.js +317 -0
  573. package/dist/op/op-verb-class.js +131 -0
  574. package/dist/op/op-waves-notify.js +136 -0
  575. package/dist/op/op-waves-run.js +1657 -0
  576. package/dist/op/op-waves.js +409 -0
  577. package/dist/op/operator.js +743 -0
  578. package/dist/op/receipt-store.js +94 -0
  579. package/dist/op/resource.js +23 -0
  580. package/dist/op/run-context.js +28 -0
  581. package/dist/op/run-live.js +256 -0
  582. package/dist/op/runtime.js +21 -0
  583. package/dist/op/runtimes/local.js +195 -0
  584. package/dist/op/source-archive.js +131 -0
  585. package/dist/op/step-output-ref.js +397 -0
  586. package/dist/op/steward-beside.js +169 -0
  587. package/dist/op/steward-points.js +138 -0
  588. package/dist/op/steward-turn.js +59 -0
  589. package/dist/op/steward.js +317 -0
  590. package/dist/op/types.js +25 -0
  591. package/dist/op/work-lease-decl.js +81 -0
  592. package/dist/op/work-lease-run.js +393 -0
  593. package/dist/override-gate.js +284 -0
  594. package/dist/owner-chain.js +74 -0
  595. package/dist/ownership.js +92 -0
  596. package/dist/params.js +61 -0
  597. package/dist/plan-summary.js +711 -0
  598. package/dist/point-decision.js +211 -0
  599. package/dist/pr-forge.js +810 -0
  600. package/dist/pr-loop.js +203 -0
  601. package/dist/project-codegen.js +191 -0
  602. package/dist/project-root.js +74 -0
  603. package/dist/project-validation.js +50 -0
  604. package/dist/provenance.js +157 -0
  605. package/dist/pseudo-parameter.js +40 -0
  606. package/dist/reconcile.js +450 -0
  607. package/dist/resource-attributes.js +33 -0
  608. package/dist/runtime-adapter.js +77 -0
  609. package/dist/runtime.js +66 -0
  610. package/dist/secret-materialization.js +153 -0
  611. package/dist/secret-provenance.js +250 -0
  612. package/dist/serializer-walker.js +112 -0
  613. package/dist/serializer.js +1 -0
  614. package/dist/sort.js +45 -0
  615. package/dist/stack-output.js +115 -0
  616. package/dist/telemetry-attribution.js +149 -0
  617. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  618. package/dist/terraform/adopt-state.js +40 -0
  619. package/dist/terraform/aws-resources.js +384 -0
  620. package/dist/terraform/bridge.js +204 -0
  621. package/dist/terraform/carve-provider.js +155 -0
  622. package/dist/terraform/carve.js +138 -0
  623. package/dist/terraform/data-source-shape.js +57 -0
  624. package/dist/terraform/emit-source.js +36 -0
  625. package/dist/terraform/excise.js +123 -0
  626. package/dist/terraform/graduate.js +128 -0
  627. package/dist/terraform/graph.js +435 -0
  628. package/dist/terraform/hcl2json.js +60 -0
  629. package/dist/terraform/manifest.js +149 -0
  630. package/dist/terraform/parse.js +81 -0
  631. package/dist/terraform/providers/aws.js +146 -0
  632. package/dist/terraform/providers/gcp.js +294 -0
  633. package/dist/terraform/providers/index.js +17 -0
  634. package/dist/terraform/providers/kubernetes.js +253 -0
  635. package/dist/terraform/score.js +151 -0
  636. package/dist/terraform/state.js +67 -0
  637. package/dist/terraform/tier-map.js +74 -0
  638. package/dist/terraform/types.js +13 -0
  639. package/dist/terraform/unified-diff.js +132 -0
  640. package/dist/testing.js +295 -0
  641. package/dist/toml-emit.js +153 -0
  642. package/dist/toml-parse.js +355 -0
  643. package/dist/toml-utils.js +60 -0
  644. package/dist/toml.js +428 -0
  645. package/dist/ts-loader.d.ts +46 -0
  646. package/dist/ts-loader.d.ts.map +1 -0
  647. package/dist/ts-loader.js +103 -0
  648. package/dist/types.js +1 -0
  649. package/dist/utils.js +61 -0
  650. package/dist/validation.js +20 -0
  651. package/dist/vendor/js-yaml-load.js +1662 -0
  652. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  653. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  654. package/dist/workspace/__fixtures__/sessions.js +91 -0
  655. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  656. package/dist/workspace/agent-cli.js +99 -0
  657. package/dist/workspace/agent.schema.json +390 -0
  658. package/dist/workspace/answers-ledger.js +89 -0
  659. package/dist/workspace/box-cli.js +142 -0
  660. package/dist/workspace/box-factory-write.js +196 -0
  661. package/dist/workspace/box-factory-write.schema.json +342 -0
  662. package/dist/workspace/box-factory.js +88 -0
  663. package/dist/workspace/box-intent.js +126 -0
  664. package/dist/workspace/box-isolation.js +169 -0
  665. package/dist/workspace/box-listing-write.schema.json +204 -0
  666. package/dist/workspace/box-listing.js +298 -0
  667. package/dist/workspace/box-publish.js +352 -0
  668. package/dist/workspace/box-publish.schema.json +498 -0
  669. package/dist/workspace/box-services.js +39 -0
  670. package/dist/workspace/broker-protocol.js +359 -0
  671. package/dist/workspace/broker-protocol.schema.json +228 -0
  672. package/dist/workspace/change-set.schema.json +460 -0
  673. package/dist/workspace/changes-cli.js +56 -0
  674. package/dist/workspace/changes.js +446 -0
  675. package/dist/workspace/changes.schema.json +642 -0
  676. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  677. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  678. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  679. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  680. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  681. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  682. package/dist/workspace/chant-migrations.js +113 -0
  683. package/dist/workspace/check.schema.json +433 -0
  684. package/dist/workspace/checks/box-isolation.js +62 -0
  685. package/dist/workspace/checks/boxes.js +491 -0
  686. package/dist/workspace/checks/diagrams.js +104 -0
  687. package/dist/workspace/checks/generated.js +419 -0
  688. package/dist/workspace/checks/ledgers.js +212 -0
  689. package/dist/workspace/checks/links.js +191 -0
  690. package/dist/workspace/checks/live.js +100 -0
  691. package/dist/workspace/checks/pipelines.js +188 -0
  692. package/dist/workspace/checks/records.js +169 -0
  693. package/dist/workspace/checks.js +426 -0
  694. package/dist/workspace/ci-green-cli.js +125 -0
  695. package/dist/workspace/ci-green-forge.js +83 -0
  696. package/dist/workspace/ci-green-workflow.js +199 -0
  697. package/dist/workspace/ci-green.js +325 -0
  698. package/dist/workspace/ci-last-green.schema.json +158 -0
  699. package/dist/workspace/compose-graph.js +235 -0
  700. package/dist/workspace/compose-reports.js +146 -0
  701. package/dist/workspace/composites.js +264 -0
  702. package/dist/workspace/composites.schema.json +617 -0
  703. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  704. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  705. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  706. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  707. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  708. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  709. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  710. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  711. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  712. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  713. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  714. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  715. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  716. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  717. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  718. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  719. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  720. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  721. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  722. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  723. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  724. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  725. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  726. package/dist/workspace/conformance/broker.js +736 -0
  727. package/dist/workspace/conformance/index.js +673 -0
  728. package/dist/workspace/conformance/vitest.js +108 -0
  729. package/dist/workspace/conformance/writer.js +1080 -0
  730. package/dist/workspace/decide.js +879 -0
  731. package/dist/workspace/decision-points.schema.json +135 -135
  732. package/dist/workspace/declaration-write-cli.js +74 -0
  733. package/dist/workspace/declaration-write.js +238 -0
  734. package/dist/workspace/declaration.js +938 -0
  735. package/dist/workspace/declaration.schema.json +1413 -1413
  736. package/dist/workspace/declared-kinds.js +106 -0
  737. package/dist/workspace/environments.js +164 -0
  738. package/dist/workspace/evidence.schema.json +279 -0
  739. package/dist/workspace/export-cli.js +185 -0
  740. package/dist/workspace/export.js +499 -0
  741. package/dist/workspace/factory-rules.js +175 -0
  742. package/dist/workspace/generated-files.js +92 -0
  743. package/dist/workspace/glob.js +45 -0
  744. package/dist/workspace/graph-cache.js +352 -0
  745. package/dist/workspace/graph-cli.js +348 -0
  746. package/dist/workspace/graph.schema.json +1338 -0
  747. package/dist/workspace/identity-gate-rule.js +75 -0
  748. package/dist/workspace/identity.js +126 -0
  749. package/dist/workspace/import.js +283 -0
  750. package/dist/workspace/init.js +620 -0
  751. package/dist/workspace/intent-cli.js +263 -0
  752. package/dist/workspace/intent-joins.js +201 -0
  753. package/dist/workspace/intent-record.js +352 -0
  754. package/dist/workspace/intent-record.schema.json +864 -0
  755. package/dist/workspace/intent.js +1582 -0
  756. package/dist/workspace/intent.schema.json +2420 -0
  757. package/dist/workspace/json-edit.js +221 -0
  758. package/dist/workspace/jsonc.js +235 -0
  759. package/dist/workspace/kind-readers.js +103 -0
  760. package/dist/workspace/kinds.js +587 -0
  761. package/dist/workspace/lexicon-symbols.js +112 -0
  762. package/dist/workspace/lineage-adopt-cli.js +102 -0
  763. package/dist/workspace/lineage-adopt.js +360 -0
  764. package/dist/workspace/lineage-check.js +282 -0
  765. package/dist/workspace/lineage-cli.js +121 -0
  766. package/dist/workspace/lineage-hash-index.js +284 -0
  767. package/dist/workspace/lineage-init.js +507 -0
  768. package/dist/workspace/lineage-lock.js +387 -0
  769. package/dist/workspace/lineage-merge.js +45 -0
  770. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  771. package/dist/workspace/lineage-migrations.js +329 -0
  772. package/dist/workspace/lineage-provenance.js +36 -0
  773. package/dist/workspace/lineage-update.js +138 -0
  774. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  775. package/dist/workspace/lineage-upgrade.js +889 -0
  776. package/dist/workspace/lineage-vendor.js +171 -0
  777. package/dist/workspace/lineage-version.js +128 -0
  778. package/dist/workspace/lineage-versions.js +275 -0
  779. package/dist/workspace/links.js +330 -0
  780. package/dist/workspace/ls-generated.js +95 -0
  781. package/dist/workspace/ls.js +277 -0
  782. package/dist/workspace/ls.schema.json +333 -0
  783. package/dist/workspace/member-commands.js +508 -0
  784. package/dist/workspace/member-handles.js +216 -0
  785. package/dist/workspace/member-pipeline.js +258 -0
  786. package/dist/workspace/member-run.js +117 -0
  787. package/dist/workspace/member-write.schema.json +193 -0
  788. package/dist/workspace/nested-graph.js +156 -0
  789. package/dist/workspace/nesting.js +38 -0
  790. package/dist/workspace/patch.js +301 -0
  791. package/dist/workspace/patch.schema.json +321 -0
  792. package/dist/workspace/pin-cli.js +55 -0
  793. package/dist/workspace/pin-integrity.js +100 -0
  794. package/dist/workspace/plan-summary.schema.json +155 -0
  795. package/dist/workspace/point-answer.schema.json +129 -129
  796. package/dist/workspace/points-cli.js +291 -0
  797. package/dist/workspace/points-write.schema.json +660 -0
  798. package/dist/workspace/points.js +521 -0
  799. package/dist/workspace/points.schema.json +916 -0
  800. package/dist/workspace/pr-report.schema.json +108 -0
  801. package/dist/workspace/principal-classes.js +245 -0
  802. package/dist/workspace/reason-codes.js +326 -0
  803. package/dist/workspace/record-assets.js +151 -0
  804. package/dist/workspace/record-decided.js +105 -0
  805. package/dist/workspace/record-sessions.js +96 -0
  806. package/dist/workspace/record-source.js +114 -0
  807. package/dist/workspace/records-amend.schema.json +284 -0
  808. package/dist/workspace/records-checkout.js +76 -0
  809. package/dist/workspace/records-cli.js +707 -0
  810. package/dist/workspace/records-close.js +116 -0
  811. package/dist/workspace/records-close.schema.json +278 -0
  812. package/dist/workspace/records-new.schema.json +202 -0
  813. package/dist/workspace/records-review.schema.json +367 -0
  814. package/dist/workspace/records-since.js +317 -0
  815. package/dist/workspace/records-since.schema.json +218 -0
  816. package/dist/workspace/records-write.js +1229 -0
  817. package/dist/workspace/records.js +1345 -0
  818. package/dist/workspace/records.schema.json +604 -0
  819. package/dist/workspace/reference-kinds/app/package.json +10 -0
  820. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  821. package/dist/workspace/returns.js +303 -0
  822. package/dist/workspace/root-refusal.js +75 -0
  823. package/dist/workspace/run-statement.schema.json +622 -0
  824. package/dist/workspace/runs-cli.js +584 -0
  825. package/dist/workspace/runs-write.schema.json +994 -0
  826. package/dist/workspace/runs.js +708 -0
  827. package/dist/workspace/runs.schema.json +1257 -0
  828. package/dist/workspace/runtimes.js +76 -0
  829. package/dist/workspace/session-kinds.js +83 -0
  830. package/dist/workspace/signers.schema.json +206 -0
  831. package/dist/workspace/source-block.js +125 -0
  832. package/dist/workspace/squash.js +177 -0
  833. package/dist/workspace/status-gates.js +162 -0
  834. package/dist/workspace/status-stewards.js +330 -0
  835. package/dist/workspace/status.js +514 -0
  836. package/dist/workspace/status.schema.json +998 -0
  837. package/dist/workspace/steward-index.js +191 -0
  838. package/dist/workspace/symbols.js +188 -0
  839. package/dist/workspace/template-manifest.js +227 -0
  840. package/dist/workspace/template-pins.js +115 -0
  841. package/dist/workspace/trailer-joins.js +65 -0
  842. package/dist/workspace/trailers.js +111 -0
  843. package/dist/workspace/tree.js +136 -0
  844. package/dist/workspace/trust/attestor.js +63 -0
  845. package/dist/workspace/trust/dsse.js +108 -0
  846. package/dist/workspace/trust/evidence-cli.js +175 -0
  847. package/dist/workspace/trust/evidence.js +161 -0
  848. package/dist/workspace/trust/gate-seal.js +226 -0
  849. package/dist/workspace/trust/policy.js +190 -0
  850. package/dist/workspace/trust/provenance.js +180 -0
  851. package/dist/workspace/trust/rotation.js +298 -0
  852. package/dist/workspace/trust/run-commits.js +101 -0
  853. package/dist/workspace/trust/run-statement.js +182 -0
  854. package/dist/workspace/trust/seal.js +272 -0
  855. package/dist/workspace/trust/signers-cli.js +152 -0
  856. package/dist/workspace/trust/ssh-commit.js +178 -0
  857. package/dist/workspace/trust/test-repo.js +118 -0
  858. package/dist/workspace/trust/trust-files.js +193 -0
  859. package/dist/workspace/trust/verify-cli.js +63 -0
  860. package/dist/workspace/trust/verify.js +192 -0
  861. package/dist/workspace/which-chant.js +141 -0
  862. package/dist/workspace/wip-cli.js +95 -0
  863. package/dist/workspace/wip-write.schema.json +504 -0
  864. package/dist/workspace/wip.js +631 -0
  865. package/dist/workspace/wip.schema.json +334 -0
  866. package/dist/workspace/work-cli.js +448 -0
  867. package/dist/workspace/work-evidence.js +122 -0
  868. package/dist/workspace/work-evidence.schema.json +222 -0
  869. package/dist/workspace/work-history.schema.json +421 -0
  870. package/dist/workspace/work-lease.schema.json +246 -0
  871. package/dist/workspace/work-size.js +77 -0
  872. package/dist/workspace/work.js +283 -0
  873. package/dist/workspace/workspace-kinds.schema.json +259 -259
  874. package/dist/workspace/workspace-principals.schema.json +53 -53
  875. package/dist/workspace/write-lock-cli.js +105 -0
  876. package/dist/workspace/write-lock.js +424 -0
  877. package/dist/workspace/write-lock.schema.json +172 -0
  878. package/dist/workspace/write-scope.js +484 -0
  879. package/dist/yaml.js +459 -0
  880. package/package.json +2 -2
  881. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  882. package/src/cli/commands/lint.ts +3 -0
  883. package/src/cli/commands/migrate.ts +2 -0
  884. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  885. package/src/cli/main.ts +121 -27
  886. package/src/cli/mcp/workspace-tools.ts +1 -1
  887. package/src/codegen/pinned-upgrade.ts +2 -0
  888. package/src/components/discover.ts +2 -0
  889. package/src/components/sandbox/driver.ts +3 -1
  890. package/src/config-import.ts +3 -0
  891. package/src/discovery/fold-import.ts +23 -14
  892. package/src/discovery/import.ts +2 -0
  893. package/src/discovery/sandbox/driver.ts +3 -1
  894. package/src/lexicon-module.ts +3 -0
  895. package/src/lint/config.ts +1 -1
  896. package/src/lint/discover.ts +28 -8
  897. package/src/lint/policy-import.ts +4 -1
  898. package/src/lint/rule-loader.ts +2 -0
  899. package/src/op/discover.ts +3 -0
  900. package/src/ts-loader.test.ts +23 -0
  901. package/src/ts-loader.ts +122 -0
  902. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  903. package/src/workspace/declaration.ts +1 -1
  904. package/src/workspace/kinds.ts +1 -1
  905. package/src/workspace/lineage-migrations.ts +2 -0
  906. package/src/workspace/points.ts +1 -1
  907. package/src/workspace/principal-classes.ts +1 -1
@@ -0,0 +1,357 @@
1
+ /**
2
+ * The seam between core and whatever answers its request (#2357),
3
+ * on the contract's transport (#2373, decided in #2359).
4
+ *
5
+ * `packages/core/src/behaviour.ts` says what a prediction may mean, how an
6
+ * absent engine must refuse, and — since #2359 — how a request reaches an
7
+ * engine: a `BehaviourTransport` carries the rendered request and brings back
8
+ * the engine's text or a finished refusal. This file adds what is core's on
9
+ * top of that and nothing more: the parse of a `behaviour/v1` answer, a command
10
+ * transport for an address that is a program on `PATH`, and the chooser that
11
+ * turns an address into one transport or the other.
12
+ *
13
+ * {@link BehaviourEngine} is what `./predict-behaviour.ts` talks to. It is
14
+ * one level above the transport — request in, parsed answer or refusal out —
15
+ * so the fixture engine in `__fixtures__` can be one without pretending to be
16
+ * a wire, and so `predict-behaviour.ts` never sees a byte. {@link
17
+ * transportEngine} is the only bridge between the two levels.
18
+ *
19
+ * ## The two transports
20
+ *
21
+ * A **URL** is dialled by core's `httpBehaviourTransport`
22
+ * (`packages/core/src/behaviour-http.ts`): `POST`, a bearer token from
23
+ * `CHANT_BEHAVIOUR_TOKEN` → `BEHAVIOUR_TOKEN`,
24
+ * and the status mapping the contract fixes. Nothing about that is core's,
25
+ * which is why it does not live here.
26
+ *
27
+ * A **command on PATH** is {@link commandTransport}, below: request on stdin,
28
+ * answer on stdout, no shell — a shell would make the address a
29
+ * code-execution surface for whatever set the variable. The child gets
30
+ * `behaviourEngineChildEnvironment()` and nothing else, for the reason given
31
+ * on that function: the request-side screen cannot see an inherited
32
+ * `process.env`. An engine that answered and still refused says so on stderr,
33
+ * and the words it uses pick the cause.
34
+ *
35
+ * ## A malformed answer is unreachable, not a report with holes
36
+ *
37
+ * Taking the fields that parsed and reporting the rest unpredicted would turn
38
+ * an engine emitting garbage into an estate that looks partly free — the
39
+ * failure the refusal arm exists to prevent, one level down. So the parse
40
+ * refuses whole, with a detail naming the entity and the field.
41
+ *
42
+ * With one exception, and it is the same rule the command transport applies
43
+ * to stderr: an engine that took the request, answered `200`, and wrote
44
+ * `{"error": "out of credit"}` has refused for a reason a status never
45
+ * carried. {@link transportEngine} reads that body's words after the parse
46
+ * has failed and never before, so an answer that priced the estate and
47
+ * declined one node "rate limit reached for this region" stays the report it
48
+ * is. Both transports reach the same three causes; only the evidence differs.
49
+ */
50
+ import { execFile } from "node:child_process";
51
+ import { behaviourEngineChildEnvironment, behaviourWireRefusal, isBehaviourBasis, isResilienceVerdict, unreachableBehaviourEngineRefusal, } from "./behaviour.js";
52
+ import { httpBehaviourTransport, isHttpBehaviourAddress } from "./behaviour-http.js";
53
+ import { renderEngineRequest } from "./behaviour-request.js";
54
+ /**
55
+ * The name a refusal is built under.
56
+ *
57
+ * It was the predicting lexicon's name while a lexicon predicted. Core
58
+ * predicts for the whole project since #2382, so there is no lexicon to scope
59
+ * the variable chain by: the chain is the chant-wide one, and this is the word
60
+ * a message uses for the thing that refused.
61
+ */
62
+ export const BEHAVIOUR_SCOPE = "chant";
63
+ /**
64
+ * A {@link BehaviourEngine} over a contract transport: render the request
65
+ * canonically, send it, parse what came back. The one bridge between the
66
+ * transport level and the engine level, so the parse runs on every wire and
67
+ * no transport gets its own.
68
+ */
69
+ export function transportEngine(transport, endpoint) {
70
+ return {
71
+ async predict(request) {
72
+ const sent = await transport.send(renderEngineRequest(request));
73
+ if (!sent.ok)
74
+ return { ok: false, refusal: sent.refusal };
75
+ const parsed = parseEngineAnswer(sent.body);
76
+ if (!parsed.ok) {
77
+ // An engine that answers 200 with an error envelope is a real shape,
78
+ // and its own words are the only thing that says which refusal it is.
79
+ // Read after the parse and never before: an answer that priced the
80
+ // estate and declined one node "rate limit reached for this region"
81
+ // parses, and a vocabulary check running first would turn a report
82
+ // about the other nodes into an over-quota refusal about none.
83
+ const said = causeFromEngineWords(sent.body);
84
+ if (said) {
85
+ return {
86
+ ok: false,
87
+ refusal: behaviourWireRefusal(BEHAVIOUR_SCOPE, endpoint, said, `the engine answered ${firstLine(sent.body)}`),
88
+ };
89
+ }
90
+ return { ok: false, refusal: unreachableBehaviourEngineRefusal(BEHAVIOUR_SCOPE, endpoint, parsed.detail) };
91
+ }
92
+ return { ok: true, answer: parsed.answer };
93
+ },
94
+ };
95
+ }
96
+ /** How long a command engine is given before it is treated as unreachable. */
97
+ const COMMAND_TIMEOUT_MS = 30000;
98
+ /** How much stdout is read before the answer is treated as malformed. */
99
+ const COMMAND_MAX_BUFFER = 8 * 1024 * 1024;
100
+ /**
101
+ * A `command on PATH` address, run as a subprocess: the contract's
102
+ * `BehaviourTransport` for the third kind of address it names.
103
+ *
104
+ * The address is split on whitespace into a program and its arguments, which
105
+ * is the shape `CHANT_BEHAVIOUR_ENGINE="my-engine --model tiny"` produces.
106
+ * No shell: a shell would make the address a code-execution surface for
107
+ * whatever set the variable, and every argument the address needs can be
108
+ * written without one.
109
+ */
110
+ export function commandTransport(endpoint) {
111
+ const [program, ...args] = endpoint.value.trim().split(/\s+/);
112
+ return {
113
+ async send(body) {
114
+ const raw = await new Promise((resolve) => {
115
+ const child = execFile(program, args, {
116
+ timeout: COMMAND_TIMEOUT_MS,
117
+ maxBuffer: COMMAND_MAX_BUFFER,
118
+ // Not `process.env`. The contract's rule, and its reason, are on
119
+ // `behaviourEngineChildEnvironment`; the test below pins it.
120
+ env: behaviourEngineChildEnvironment(),
121
+ }, (error, stdout, stderr) => {
122
+ resolve({ stdout: String(stdout), stderr: String(stderr), ...(error ? { error } : {}) });
123
+ });
124
+ child.stdin?.end(body);
125
+ });
126
+ if (raw.error) {
127
+ return {
128
+ ok: false,
129
+ refusal: behaviourWireRefusal(BEHAVIOUR_SCOPE, endpoint, causeFromEngineWords(raw.stderr) ?? "engine-unreachable", firstLine(raw.stderr) || raw.error.message),
130
+ };
131
+ }
132
+ return { ok: true, body: raw.stdout };
133
+ },
134
+ };
135
+ }
136
+ /** {@link commandTransport}, bridged to the engine level. */
137
+ export function commandEngine(endpoint) {
138
+ return transportEngine(commandTransport(endpoint), endpoint);
139
+ }
140
+ /**
141
+ * An engine that answered and still refused says so in words, and the three
142
+ * causes want three different actions (`behaviour.ts`'s remedy table). Matched
143
+ * on the words an engine would use rather than on an exit code or an HTTP
144
+ * status, because the contract fixes no exit codes, inventing some would bind
145
+ * every future engine to this file, and a status is only available on one of
146
+ * the two transports anyway.
147
+ *
148
+ * Both transports read it, on the text each has: a command's stderr, and an
149
+ * HTTP body that failed to parse as an answer. `./behaviour-http.ts` has
150
+ * already classified every status that carries one, so this runs on the case
151
+ * a status does not cover — the engine that took the request, answered 200,
152
+ * and put its refusal in the envelope.
153
+ */
154
+ function causeFromEngineWords(said) {
155
+ const text = said.toLowerCase();
156
+ if (/\b(out of credit|insufficient (funds|balance)|no balance|payment required)\b/.test(text)) {
157
+ return "engine-out-of-credit";
158
+ }
159
+ if (/\b(over quota|quota exceeded|rate limit|too many requests|throttl)/.test(text)) {
160
+ return "engine-over-quota";
161
+ }
162
+ return undefined;
163
+ }
164
+ function firstLine(text) {
165
+ return text.split("\n").find((line) => line.trim().length > 0)?.trim() ?? "";
166
+ }
167
+ /**
168
+ * Everything wrong with one figure, as readable field paths. Empty means the
169
+ * figure is usable.
170
+ *
171
+ * Pure and exported so the shapes an engine can get wrong are testable without
172
+ * a subprocess. Every check here mirrors one `validateBehaviourBlock` applies
173
+ * downstream (`packages/core/src/behaviour.ts`) — the difference is *when*:
174
+ * that one throws, and a throw is the whole-lexicon failure `lexicon.ts`
175
+ * reserves for a live credential. A third party emitting one bad number is not
176
+ * that, and reporting it as that is how an operator goes looking for a leak.
177
+ */
178
+ export function figureProblems(name, figure) {
179
+ const at = (field) => `figures.${name}.${field}`;
180
+ if (typeof figure !== "object" || figure === null || Array.isArray(figure)) {
181
+ return [`${at("")} is ${Array.isArray(figure) ? "an array" : typeof figure}, not an object`];
182
+ }
183
+ const f = figure;
184
+ const out = [];
185
+ const fraction = (field, value) => {
186
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 1) {
187
+ out.push(`${at(field)} is not a number in 0..1`);
188
+ }
189
+ };
190
+ if (typeof f.perHour !== "number" || !Number.isFinite(f.perHour) || f.perHour < 0) {
191
+ out.push(`${at("perHour")} is not a non-negative finite number`);
192
+ }
193
+ if (typeof f.currency !== "string" || f.currency.trim().length === 0) {
194
+ out.push(`${at("currency")} is empty`);
195
+ }
196
+ fraction("errorRate", f.errorRate);
197
+ const headroom = f.headroom;
198
+ if (typeof headroom !== "object" || headroom === null || Array.isArray(headroom)) {
199
+ out.push(`${at("headroom")} is missing`);
200
+ }
201
+ else {
202
+ const h = headroom;
203
+ // At least one axis, and an axis the engine did not model must be absent
204
+ // rather than zero — zero headroom means saturated, the opposite claim.
205
+ if (h.cpu === undefined && h.latency === undefined) {
206
+ out.push(`${at("headroom")} carries neither cpu nor latency`);
207
+ }
208
+ for (const axis of ["cpu", "latency"]) {
209
+ if (h[axis] !== undefined)
210
+ fraction(`headroom.${axis}`, h[axis]);
211
+ }
212
+ }
213
+ const resilience = f.resilience;
214
+ if (typeof resilience !== "object" || resilience === null || Array.isArray(resilience)) {
215
+ out.push(`${at("resilience")} is missing`);
216
+ }
217
+ else {
218
+ const r = resilience;
219
+ if (typeof r.failure !== "string" || r.failure.trim().length === 0) {
220
+ out.push(`${at("resilience.failure")} names no failure`);
221
+ }
222
+ if (!isResilienceVerdict(r.verdict)) {
223
+ out.push(`${at("resilience.verdict")} is not survives/degrades/fails`);
224
+ }
225
+ if (r.note !== undefined && typeof r.note !== "string") {
226
+ out.push(`${at("resilience.note")} is not a string`);
227
+ }
228
+ }
229
+ const rightSize = f.rightSize;
230
+ if (rightSize !== undefined) {
231
+ if (typeof rightSize !== "object" || rightSize === null || Array.isArray(rightSize)) {
232
+ out.push(`${at("rightSize")} is not an object`);
233
+ }
234
+ else if (typeof rightSize.suggestion !== "string") {
235
+ out.push(`${at("rightSize.suggestion")} is missing`);
236
+ }
237
+ }
238
+ return out;
239
+ }
240
+ /** One malformed verdict, with the detail the refusal will scrub and print. */
241
+ function malformed(detail) {
242
+ return { ok: false, detail };
243
+ }
244
+ /**
245
+ * Parse an engine's text into an {@link EngineAnswer}.
246
+ *
247
+ * A malformed answer is `engine-unreachable` and not a report full of holes.
248
+ * The alternative — taking the fields that parsed and reporting the rest as
249
+ * unpredicted — would turn an engine emitting garbage into an estate that
250
+ * looks partially free, which is the failure the refusal arm exists to
251
+ * prevent, one level down.
252
+ *
253
+ * **Every figure is validated here, not only the envelope.** The first version
254
+ * of this function checked `engine`/`version`/`tolerance`/`basis` and that
255
+ * `figures` was an object, and then handed each figure's contents straight to
256
+ * `block()` in `./predict-behaviour.ts`, which dereferenced
257
+ * `figure.resilience.failure`. Seven malformed shapes were executed against
258
+ * it and all seven threw: three as bare `TypeError`s with no chant message,
259
+ * four through `validateBehaviourBlock` after the fact. A throw is the
260
+ * whole-lexicon failure `lexicon.ts` reserves for a live credential in the
261
+ * request, so a third-party engine emitting one bad number was indistinguishable
262
+ * from a leak — and the doc above claimed the opposite was happening.
263
+ *
264
+ * The detail names the entity and the field, because "the engine sent
265
+ * something wrong" is not a thing anybody can act on and "figures.web.headroom
266
+ * carries neither cpu nor latency" is. It flows into
267
+ * `unreachableBehaviourEngineRefusal`, which runs it through
268
+ * `scrubEngineDetail` and bounds it.
269
+ */
270
+ export function parseEngineAnswer(text) {
271
+ let parsed;
272
+ try {
273
+ parsed = JSON.parse(text);
274
+ }
275
+ catch {
276
+ return malformed(`the engine wrote ${text.length} byte(s) that are not JSON`);
277
+ }
278
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
279
+ return malformed("the engine's answer is not an object");
280
+ }
281
+ const answer = parsed;
282
+ const missing = ["engine", "version", "tolerance"].filter((key) => typeof answer[key] !== "string" || answer[key].trim().length === 0);
283
+ if (missing.length > 0) {
284
+ return malformed(`the engine's answer states no ${missing.join(", ")}. Every figure carries provenance, so an ` +
285
+ "answer that cannot say who produced it is not a usable answer");
286
+ }
287
+ // A closed enum downstream, so a free-form basis is caught here rather than
288
+ // by a throw from `validateBehaviourBlock` after the report is half built.
289
+ if (!isBehaviourBasis(answer.basis)) {
290
+ return malformed(`the engine's answer states a basis of ${JSON.stringify(answer.basis)}, which is not ` +
291
+ "modeled or validated");
292
+ }
293
+ if (typeof answer.figures !== "object" || answer.figures === null || Array.isArray(answer.figures)) {
294
+ // `Array.isArray` explicitly: `typeof [] === "object"`, so `figures: []`
295
+ // parsed clean and produced a report in which every node had been lost.
296
+ return malformed("the engine's answer carries no figures map");
297
+ }
298
+ if (answer.total !== undefined) {
299
+ const total = answer.total;
300
+ if (typeof total !== "object" ||
301
+ total === null ||
302
+ typeof total.perHour !== "number" ||
303
+ !Number.isFinite(total.perHour) ||
304
+ total.perHour < 0 ||
305
+ typeof total.currency !== "string" ||
306
+ total.currency.trim().length === 0) {
307
+ return malformed("the engine's answer states a total that is not a non-negative rate in a named currency");
308
+ }
309
+ }
310
+ if (answer.declined !== undefined) {
311
+ const declined = answer.declined;
312
+ if (typeof declined !== "object" || declined === null || Array.isArray(declined)) {
313
+ return malformed("the engine's answer carries a declined list that is not a map");
314
+ }
315
+ for (const [name, reason] of Object.entries(declined)) {
316
+ if (typeof reason !== "string") {
317
+ return malformed(`the engine declined ${name} with a reason that is not a string`);
318
+ }
319
+ }
320
+ }
321
+ const problems = [];
322
+ for (const [name, figure] of Object.entries(answer.figures)) {
323
+ problems.push(...figureProblems(name, figure));
324
+ if (problems.length >= 5)
325
+ break;
326
+ }
327
+ if (problems.length > 0) {
328
+ return malformed(`the engine's answer is malformed: ${problems.slice(0, 5).join("; ")}` +
329
+ (problems.length >= 5 ? " (and possibly more)" : ""));
330
+ }
331
+ return { ok: true, answer: answer };
332
+ }
333
+ /**
334
+ * The transport chooser, with what the HTTP transport needs injectable.
335
+ *
336
+ * A `http://` or `https://` address gets core's `httpBehaviourTransport`,
337
+ * with its token read from `env` — the same `env` the address was read from,
338
+ * so a test drives both chains from one object. A bare address gets
339
+ * {@link commandTransport}. Any other scheme (`grpc://`, `unix://`) gets
340
+ * `undefined`, and the caller refuses naming the address: no transport here
341
+ * speaks it, and saying so beats a guess.
342
+ */
343
+ export function connectWith(deps = {}) {
344
+ return (endpoint, env) => {
345
+ const address = endpoint.value.trim();
346
+ if (address.length === 0)
347
+ return undefined;
348
+ if (isHttpBehaviourAddress(address)) {
349
+ return transportEngine(httpBehaviourTransport(BEHAVIOUR_SCOPE, endpoint, env, deps), endpoint);
350
+ }
351
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(address))
352
+ return undefined;
353
+ return commandEngine(endpoint);
354
+ };
355
+ }
356
+ /** The chooser the shipped plugin uses: the process's own `fetch`, the default deadline. */
357
+ export const defaultConnect = connectWith();
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The seam between a graph read and a prediction (#2377, epic #2355).
3
+ *
4
+ * `./behaviour-overlay.ts` projects a {@link BehaviourResult} onto the two
5
+ * channels the IR carries it on. This module is the other half: it builds the
6
+ * request from the graph the read already holds, and puts the projection back
7
+ * onto that graph. Both halves are pure, and neither calls an engine — the
8
+ * plugin call itself lives in `./cli/handlers/graph.ts`, which is the only
9
+ * place that has plugins to call.
10
+ *
11
+ * ## The request is the graph, not a second read
12
+ *
13
+ * The epic's rule is that the engine never sees credentials, and the way this
14
+ * path keeps that true is by never reading anything: `chant graph --live`
15
+ * already observed the estate, and {@link behaviourRequestFromIr} reshapes
16
+ * exactly those nodes and edges into the contract's options. There is no
17
+ * provider call here and nothing to leak, because there is no second read to
18
+ * leak from. `screenBehaviourRequest` (`./behaviour-predict.ts`) still screens
19
+ * what this produces; a node whose observed `attrs` picked up a secret is
20
+ * caught there, on the one path every prediction goes through.
21
+ *
22
+ * ## Why `attrs` are the props verbatim
23
+ *
24
+ * An IR node's `attrs` are what the read resolved — literals, and `{ $ref }`
25
+ * for a reference. The contract's `props` is the same thing, so this passes
26
+ * them across unchanged rather than filtering to a "useful" subset. Filtering
27
+ * would be chant deciding which properties can affect a price, and chant does
28
+ * not price anything; an engine that needs a field chant thought irrelevant
29
+ * would get a silently wrong figure with nothing to say so.
30
+ */
31
+ import { BEHAVIOUR_OVERLAY_ATTR } from "./behaviour-overlay.js";
32
+ /**
33
+ * Reshape an already-read graph into `predictBehaviour`'s options.
34
+ *
35
+ * Entity identity is the node's `id` and nothing derived from it. That is the
36
+ * same key the drift overlay writes `_status` under and the same key
37
+ * {@link applyBehaviourOverlay} reads back, so in a multi-stack project where
38
+ * ids are `${stack}::${logicalId}`, the block lands on the node it was
39
+ * predicted for without this module knowing that qualification exists.
40
+ */
41
+ export function behaviourRequestFromIr(ir, ctx) {
42
+ const entities = new Map();
43
+ for (const node of ir.nodes) {
44
+ entities.set(node.id, { entityType: node.kind, props: node.attrs });
45
+ }
46
+ return {
47
+ environment: ctx.environment,
48
+ buildOutput: ctx.buildOutput,
49
+ entityNames: [...entities.keys()],
50
+ entities,
51
+ edges: ir.edges,
52
+ edgeCoverage: ctx.edgeCoverage,
53
+ from: ctx.from,
54
+ traffic: ctx.traffic,
55
+ ...(ctx.stack === undefined ? {} : { stack: ctx.stack }),
56
+ ...(ctx.region === undefined ? {} : { region: ctx.region }),
57
+ ...(ctx.owned === undefined ? {} : { owned: ctx.owned }),
58
+ };
59
+ }
60
+ /**
61
+ * Put a projection back onto the graph: each entity's block on its node's
62
+ * `attrs`, the graph-level half on `ir.meta`.
63
+ *
64
+ * A node with no entry keeps the `attrs` object it already had, untouched —
65
+ * an unpriced entity carries no `_behaviour` key rather than an empty or
66
+ * zeroed one, because zero cost and "not priced" are different claims and a
67
+ * renderer cannot tell them apart after the fact.
68
+ *
69
+ * Returns a new graph and mutates nothing: the caller's `ir` is shared with
70
+ * the lens pipeline downstream, and a prediction is not allowed to be the
71
+ * reason a later pass sees different nodes.
72
+ */
73
+ export function applyBehaviourOverlay(ir, overlay) {
74
+ const nodes = ir.nodes.map((node) => {
75
+ const block = overlay.attrs[node.id];
76
+ return block === undefined ? node : { ...node, attrs: { ...node.attrs, ...block } };
77
+ });
78
+ return {
79
+ ...ir,
80
+ nodes,
81
+ meta: { ...(ir.meta ?? {}), [BEHAVIOUR_OVERLAY_ATTR]: overlay.meta[BEHAVIOUR_OVERLAY_ATTR] },
82
+ };
83
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * The first engine adapter (#2359): a {@link BehaviourTransport} that dials a
3
+ * URL with a bearer token, and maps what the wire says onto the contract's
4
+ * refusals.
5
+ *
6
+ * Unnamed on purpose. Nothing here is a vendor's API; it is the shape any
7
+ * metered HTTP engine has — an address, an account, a request body, and four
8
+ * ways the account or the wire can say no — so a second engine behind the
9
+ * same shape is a second address and a second token, not a second adapter.
10
+ * What this file knows about the engine is that it accepts a JSON body by
11
+ * `POST`, answers with a JSON body, and uses the HTTP status the way HTTP
12
+ * says to: `402` for an account with nothing left on it, `429` for a limit
13
+ * that is spent, `401`/`403` for a token it does not accept.
14
+ *
15
+ * ## The token is on the wire and nowhere else
16
+ *
17
+ * Rule 3 of the contract — the engine is never handed a credential — is about
18
+ * the request body, and `screenBehaviourRequest` has already walked the body
19
+ * by the time a transport exists. The bearer token here is a different thing:
20
+ * it is how the engine knows whose account to bill, it travels in the
21
+ * `authorization` header, and this module is the only code that holds its
22
+ * value. Four things follow, and each has a test:
23
+ *
24
+ * - it is resolved from {@link behaviourTokenFrom}'s chain, never from the
25
+ * address chain, so no message that prints the address can print it;
26
+ * - it is never interpolated into a refusal, a `detail`, or an error — the
27
+ * variable's *name* is what a refusal carries;
28
+ * - whatever the engine writes back is passed through {@link concealing}
29
+ * before it becomes a `detail`, because an engine that echoes its request
30
+ * headers into an error page would otherwise put the token in a
31
+ * merge-request comment (#2358 posts refusals publicly);
32
+ * - the request is sent with `redirect: "error"`, so a `3xx` from the
33
+ * address named is a refusal rather than a second request carrying the
34
+ * header to whatever host the redirect names.
35
+ *
36
+ * ## No token, nothing sent
37
+ *
38
+ * This adapter is for an engine that bills an account: `engine-out-of-credit`
39
+ * and `engine-over-quota` are statements about an account, and an engine
40
+ * with no account has neither. So a token is required, and a missing one is
41
+ * refused before anything is sent — {@link noBehaviourTokenRefusal}, naming
42
+ * the chain — rather than sent bare and reported as whatever the engine's
43
+ * 401 page said. An engine that needs no token is not this adapter's, and
44
+ * the address chain still reaches it through a command on `PATH`.
45
+ *
46
+ * ## What the wire says, and what it becomes
47
+ *
48
+ * | Wire | Cause | Why |
49
+ * |---|---|---|
50
+ * | `2xx` | — | the body is the answer; the lexicon validates it |
51
+ * | `401`, `403` | `no-engine` | the token was rejected; the remedy is to set the variable |
52
+ * | `402` | `engine-out-of-credit` | the address answered; the account is empty |
53
+ * | `429` | `engine-over-quota` | the address answered; a limit is spent; `retry-after` is echoed |
54
+ * | any other status | `engine-unreachable` | the engine did not answer the question — a `5xx`, a `404`, a `3xx` |
55
+ * | `fetch` threw | `engine-unreachable` | connection refused, no such host, TLS, or the timeout |
56
+ *
57
+ * `4xx` outside the three named is deliberately `engine-unreachable` rather
58
+ * than a fifth cause. The contract's four causes are four remedies, and "the
59
+ * engine rejected this request as malformed" has no remedy an operator can
60
+ * apply — it is a bug on one side of the wire or the other, and the detail
61
+ * names the status so whoever reads it can tell which side.
62
+ */
63
+ import { behaviourTokenFrom, behaviourWireRefusal, noBehaviourTokenRefusal, rejectedBehaviourTokenRefusal, } from "./behaviour.js";
64
+ import { REDACTED } from "./identity.js";
65
+ /** The default deadline: the same one the command transport gives a child. */
66
+ export const HTTP_BEHAVIOUR_TIMEOUT_MS = 30000;
67
+ /** How much of an error body a `detail` repeats. `scrubEngineDetail` bounds it again downstream. */
68
+ const MAX_BODY_IN_DETAIL = 300;
69
+ /** True when an address is one this adapter dials. `grpc://` and friends are not. */
70
+ export function isHttpBehaviourAddress(value) {
71
+ return /^https?:\/\//i.test(value.trim());
72
+ }
73
+ /**
74
+ * Every occurrence of the token's value replaced, in text that came from the
75
+ * engine or from an error. Exported so a test can assert on the one function
76
+ * every `detail` passes through.
77
+ *
78
+ * `split`/`join` rather than a `RegExp`, so a token containing `.` or `+` is
79
+ * matched as itself. Nothing shorter than four characters is concealed: a
80
+ * one-letter "token" would blank every occurrence of that letter, which is a
81
+ * detail nobody can read and a false sense that something was protected.
82
+ */
83
+ export function concealing(token, text) {
84
+ if (token.value.length < 4 || !text.includes(token.value))
85
+ return text;
86
+ return text.split(token.value).join(REDACTED);
87
+ }
88
+ /**
89
+ * The refusal an HTTP status earns, or `undefined` for a status that carries
90
+ * an answer. Pure and exported so the whole table in the module doc is one
91
+ * function a test can walk.
92
+ *
93
+ * `detail` is the first non-empty line of the response body, already
94
+ * concealed; this adds the status in front of it so a `detail` never reads as
95
+ * the engine's prose alone.
96
+ */
97
+ export function httpStatusRefusal(lexicon, endpoint, token, status, detail, retryAfter) {
98
+ if (status >= 200 && status < 300)
99
+ return undefined;
100
+ const said = detail.trim().length > 0 ? `: ${detail.trim()}` : "";
101
+ if (status === 401 || status === 403) {
102
+ return rejectedBehaviourTokenRefusal(lexicon, endpoint, token, `HTTP ${status}${said}`);
103
+ }
104
+ if (status === 402) {
105
+ // The account is the token's, so the variable that named the token is
106
+ // the one an operator funds — put it first, ahead of whatever the
107
+ // engine said, so `scrubEngineDetail`'s bound never drops it.
108
+ return behaviourWireRefusal(lexicon, endpoint, "engine-out-of-credit", `the account ${token.source} authenticates answered HTTP 402${said}`);
109
+ }
110
+ if (status === 429) {
111
+ const window = retryAfter && retryAfter.trim().length > 0 ? `, retry after ${retryAfter.trim()}` : "";
112
+ return behaviourWireRefusal(lexicon, endpoint, "engine-over-quota", `the account ${token.source} authenticates answered HTTP 429${window}${said}`);
113
+ }
114
+ return behaviourWireRefusal(lexicon, endpoint, "engine-unreachable", `HTTP ${status}${said || " with no body"}`);
115
+ }
116
+ /** The first non-empty line of a body, bounded, for a `detail`. */
117
+ function firstLine(text) {
118
+ const line = text.split("\n").find((l) => l.trim().length > 0)?.trim() ?? "";
119
+ return line.length > MAX_BODY_IN_DETAIL ? `${line.slice(0, MAX_BODY_IN_DETAIL)}…` : line;
120
+ }
121
+ /**
122
+ * Build the transport for one lexicon against one URL.
123
+ *
124
+ * The token is resolved here, once, from `env` — never from `process.env`
125
+ * unless that is what was passed — so a test can drive the whole wire with an
126
+ * environment of its own. A missing token makes a transport whose every
127
+ * `send` refuses by name and sends nothing; see the module doc for why that is
128
+ * the honest shape for an adapter whose engine bills an account.
129
+ */
130
+ export function httpBehaviourTransport(lexicon, endpoint, env, deps = {}) {
131
+ const token = behaviourTokenFrom(lexicon, env);
132
+ const send = deps.fetch ?? globalThis.fetch;
133
+ const timeoutMs = deps.timeoutMs ?? HTTP_BEHAVIOUR_TIMEOUT_MS;
134
+ if (!token) {
135
+ const refusal = noBehaviourTokenRefusal(lexicon, endpoint);
136
+ return { async send() { return { ok: false, refusal }; } };
137
+ }
138
+ return {
139
+ async send(body) {
140
+ let response;
141
+ try {
142
+ response = await send(endpoint.value.trim(), {
143
+ method: "POST",
144
+ headers: {
145
+ "content-type": "application/json",
146
+ accept: "application/json",
147
+ authorization: `Bearer ${token.value}`,
148
+ },
149
+ body,
150
+ // A redirect would carry the header above to whatever host the
151
+ // engine named. Refused here, reported as unreachable below.
152
+ redirect: "error",
153
+ signal: AbortSignal.timeout(timeoutMs),
154
+ });
155
+ }
156
+ catch (err) {
157
+ return {
158
+ ok: false,
159
+ refusal: behaviourWireRefusal(lexicon, endpoint, "engine-unreachable", concealing(token, describeFetchError(err, timeoutMs))),
160
+ };
161
+ }
162
+ const text = await response.text().catch(() => "");
163
+ const refusal = httpStatusRefusal(lexicon, endpoint, token, response.status, concealing(token, firstLine(text)), response.headers.get("retry-after") ?? undefined);
164
+ if (refusal)
165
+ return { ok: false, refusal };
166
+ return { ok: true, body: concealing(token, text) };
167
+ },
168
+ };
169
+ }
170
+ /**
171
+ * A thrown `fetch` in words an operator can act on. Node's `fetch` wraps the
172
+ * socket error one level down (`err.cause.code`), and the timeout arrives as
173
+ * a `TimeoutError` DOMException; both are named here rather than left as
174
+ * `fetch failed`, which says nothing about which of the two it was.
175
+ */
176
+ function describeFetchError(err, timeoutMs) {
177
+ if (err instanceof Error) {
178
+ if (err.name === "TimeoutError" || err.name === "AbortError") {
179
+ return `no answer within ${timeoutMs} ms`;
180
+ }
181
+ const cause = err.cause;
182
+ const code = typeof cause?.code === "string" ? cause.code : undefined;
183
+ if (code)
184
+ return `${code}: ${err.message}`;
185
+ return err.message;
186
+ }
187
+ return String(err);
188
+ }