@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,708 @@
1
+ /**
2
+ * The agent run record (#3033, ws-076): what each agent run cost and which
3
+ * changes it made.
4
+ *
5
+ * chant records runs and never starts one (ws-052). Whatever ran the agent,
6
+ * a steward step, a factory, hud's chat or a lobby that proxies model calls,
7
+ * reports the run through `chant workspace runs start|end|record`, and
8
+ * chant appends it to the run ledger on `chant/lifecycle`, beside the work
9
+ * lease histories (ws-068: a ledger entry is a fact about a run, never
10
+ * revised). Nothing is written to the working tree, and no transcript is
11
+ * copied: the record pins one by sha256.
12
+ *
13
+ * ## Storage
14
+ *
15
+ * `_agent-runs/<run id>.jsonl` in the ledger of the workspace root (flat at
16
+ * the root, under `_members/<member>/` for a nested workspace). One file per
17
+ * run, so concurrent runs never contend for one file, with two kinds of line:
18
+ *
19
+ * - `start`: who the run worked for (`by`), the agent session, the harness,
20
+ * model and provider, the work item and lease it worked under, the records
21
+ * it worked on, and the instruction pinned by hash.
22
+ * - `end`: the outcome, the turns and tokens, the cost with its currency and
23
+ * the source of its prices, the transcript pinned by hash, and the commits
24
+ * the run made, each with its `git patch-id --stable` (#3036) and, when
25
+ * the writer knows them, the hunks of it the run wrote (#3034).
26
+ * - `statement`: after the end, a DSSE envelope a runner or steward key
27
+ * signed over the run (#3192, ./trust/run-statement.ts). A run may have
28
+ * several, such as one per signer; none changes the record they sign.
29
+ *
30
+ * The file name is `_agent-runs`, not `runs`, because an Op run already has
31
+ * `<env>/runs__<op>.jsonl` (`../lifecycle/run-ledger.ts`).
32
+ *
33
+ * ## The join
34
+ *
35
+ * A commit names its run with the `Chant-Run` trailer (#3149, ws-075). The
36
+ * run's end can also list commits, which joins a commit that carries no
37
+ * trailer. `workspace runs` reports both, and `graph --intent` links each
38
+ * commit to its run.
39
+ *
40
+ * When neither holds, as after a rebase or a cherry-pick that dropped the
41
+ * trailer, a commit whose `git patch-id --stable` equals one the run's end
42
+ * recorded joins the run by content (#3036), marked `patch-id`. A content join
43
+ * never overrides a trailer or a record join: it is tried only for a commit
44
+ * that has neither. A squash of several commits has a patch-id of its own, so
45
+ * it never joins this way.
46
+ *
47
+ * A squash merge's commit carries none of its pull request's trailers or
48
+ * SHAs. When a read is asked to follow squashes (#3035, `squash.ts`), the
49
+ * squash commit joins every run its pull request's original commits join,
50
+ * marked `squash` with the originals in `via`.
51
+ */
52
+ import { execFileSync } from "node:child_process";
53
+ import { createHash, randomBytes } from "node:crypto";
54
+ import { readFileSync, statSync } from "node:fs";
55
+ import { resolve } from "node:path";
56
+ import { z } from "zod";
57
+ import { describeLifecyclePush, fetchLifecycleStatus, pushLifecycleStatus, readBlobBySha, RefCASConflictError, writeLedgerFiles } from "../lifecycle/git.js";
58
+ import { resolveMemberLedger } from "../lifecycle/member-ledger.js";
59
+ import { sortedJsonReplacer } from "../utils.js";
60
+ import { followSquashes } from "./squash.js";
61
+ import { RUN_TRAILER, parseRecordRef } from "./trailers.js";
62
+ import { runRecordDigest } from "./trust/run-statement.js";
63
+ /** The directory on `chant/lifecycle` that holds the agent runs, under the workspace root's ledger prefix. */
64
+ export const AGENT_RUNS_DIR = "_agent-runs";
65
+ /** The branch the ledger is on. */
66
+ export const LEDGER_BRANCH = "chant/lifecycle";
67
+ /** A run id: one file name and one trailer value. */
68
+ export const RUN_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
69
+ const SHA256 = /^[0-9a-f]{64}$/;
70
+ const COMMIT = /^[0-9a-f]{4,64}$/;
71
+ const CURRENCY = /^[A-Z]{3}$/;
72
+ // ── The caller's fields ──────────────────────────────────────────────────────
73
+ const count = z.number().int().nonnegative();
74
+ const nonEmpty = z.string().trim().min(1).refine((s) => !/[\r\n]/.test(s), "one line of text");
75
+ const iso = z.string().refine((s) => !Number.isNaN(Date.parse(s)) && /^\d{4}-\d{2}-\d{2}T/.test(s), "an ISO 8601 date and time");
76
+ const costSchema = z.object({ amount: z.number().nonnegative().finite(), currency: z.string().regex(CURRENCY, "an ISO 4217 code such as USD"), source: nonEmpty }).strict();
77
+ const usageSchema = z.object({ turns: count.optional(), inputTokens: count.optional(), outputTokens: count.optional(), cacheReadTokens: count.optional(), cacheWriteTokens: count.optional() }).strict();
78
+ const pinSchema = z
79
+ .object({ sha256: z.string().regex(SHA256, "64 lower-case hex digits").optional(), path: nonEmpty.optional(), ref: nonEmpty.optional() })
80
+ .strict()
81
+ .refine((p) => (p.sha256 === undefined) !== (p.path === undefined), "give sha256, or a path for chant to hash, not both");
82
+ /** The longest instruction excerpt kept, in characters. */
83
+ export const INSTRUCTION_EXCERPT_MAX = 500;
84
+ const instructionSchema = z
85
+ .object({
86
+ sha256: z.string().regex(SHA256, "64 lower-case hex digits").optional(),
87
+ path: nonEmpty.optional(),
88
+ ref: nonEmpty.optional(),
89
+ excerpt: z.string().trim().min(1).max(INSTRUCTION_EXCERPT_MAX).optional(),
90
+ })
91
+ .strict()
92
+ .refine((p) => (p.sha256 === undefined) !== (p.path === undefined), "give sha256, or a path for chant to hash, not both");
93
+ const lineNumber = z.number().int().positive();
94
+ const hunkSchema = z
95
+ .object({ path: nonEmpty, start: lineNumber, end: lineNumber })
96
+ .strict()
97
+ .refine((h) => h.end >= h.start, "end is not before start")
98
+ .refine((h) => !h.path.startsWith("/") && !h.path.split("/").includes(".."), "a path from the repository root");
99
+ const commitSchema = z.union([z.string().regex(COMMIT, "a commit id"), z.object({ sha: z.string().regex(COMMIT, "a commit id"), hunks: z.array(hunkSchema).min(1) }).strict()]);
100
+ const startFields = {
101
+ id: z.string().regex(RUN_ID_PATTERN, "letters, digits, '.', '_' and '-', starting with a letter or digit").optional(),
102
+ startedAt: iso.optional(),
103
+ by: nonEmpty.optional(),
104
+ agent: nonEmpty.optional(),
105
+ harness: z.union([nonEmpty, z.object({ name: nonEmpty, version: nonEmpty.optional() }).strict()]),
106
+ model: nonEmpty.optional(),
107
+ provider: nonEmpty.optional(),
108
+ unit: z.union([nonEmpty, z.object({ id: nonEmpty, kind: nonEmpty.optional() }).strict()]).optional(),
109
+ lease: nonEmpty.optional(),
110
+ records: z.array(z.string().refine((s) => parseRecordRef(s) !== undefined, "<kind>:<id>")).optional(),
111
+ instruction: instructionSchema.optional(),
112
+ };
113
+ const endFields = {
114
+ endedAt: iso.optional(),
115
+ outcome: nonEmpty.optional(),
116
+ usage: usageSchema.optional(),
117
+ models: z.array(z.object({ model: nonEmpty, provider: nonEmpty.optional(), inputTokens: count.optional(), outputTokens: count.optional(), cacheReadTokens: count.optional(), cacheWriteTokens: count.optional(), cost: costSchema.optional() }).strict()).optional(),
118
+ cost: costSchema.optional(),
119
+ transcript: pinSchema.optional(),
120
+ commits: z.array(commitSchema).optional(),
121
+ };
122
+ /** The fields `runs start --from` takes. */
123
+ export const runStartInputSchema = z.object(startFields).strict();
124
+ /** The fields `runs end <id> --from` takes. */
125
+ export const runEndInputSchema = z.object(endFields).strict();
126
+ /** The fields `runs record --from` takes: a start and an end in one. */
127
+ export const runRecordInputSchema = z.object({ ...startFields, ...endFields }).strict();
128
+ export class RunWriteError extends Error {
129
+ constructor(code, message) {
130
+ super(message);
131
+ this.code = code;
132
+ this.name = "RunWriteError";
133
+ }
134
+ }
135
+ // ── Git ──────────────────────────────────────────────────────────────────────
136
+ function git(top, args, input) {
137
+ try {
138
+ return execFileSync("git", args, { cwd: top, encoding: "utf-8", input, stdio: [input === undefined ? "ignore" : "pipe", "pipe", "pipe"], maxBuffer: 512 * 1024 * 1024 });
139
+ }
140
+ catch {
141
+ return undefined;
142
+ }
143
+ }
144
+ /** The full id of `rev` as a commit, or undefined. */
145
+ function commitId(top, rev) {
146
+ return git(top, ["rev-parse", "--verify", "--quiet", `${rev}^{commit}`])?.trim() || undefined;
147
+ }
148
+ /** `git patch-id --stable` of one commit, or null when it has no patch, such as a merge. */
149
+ export function patchIdOf(top, sha) {
150
+ const patch = git(top, ["show", "--format=", "--patch", "--no-color", "--no-ext-diff", sha]);
151
+ if (!patch || patch.trim() === "")
152
+ return null;
153
+ const out = git(top, ["patch-id", "--stable"], patch);
154
+ return out?.trim().split(/\s+/)[0] || null;
155
+ }
156
+ /** Parse `git patch-id` output, `<patch-id> <commit>` per line, into commit to patch-id. */
157
+ function parsePatchIds(out) {
158
+ const ids = new Map();
159
+ for (const line of (out ?? "").split("\n")) {
160
+ const [patchId, sha] = line.trim().split(/\s+/);
161
+ if (patchId && sha && !ids.has(sha))
162
+ ids.set(sha, patchId);
163
+ }
164
+ return ids;
165
+ }
166
+ /**
167
+ * `git patch-id --stable` of each commit, in two git calls however many there
168
+ * are (#3036). A commit with no patch, such as a merge, is left out.
169
+ */
170
+ export function patchIdsOf(top, shas) {
171
+ if (shas.length === 0)
172
+ return new Map();
173
+ const patches = git(top, ["log", "--no-walk=unsorted", "--stdin", "--no-merges", "--format=commit %H", "--patch", "--no-color", "--no-ext-diff"], `${shas.join("\n")}\n`);
174
+ if (!patches?.trim())
175
+ return new Map();
176
+ return parsePatchIds(git(top, ["patch-id", "--stable"], patches));
177
+ }
178
+ /**
179
+ * `git patch-id --stable` of each commit reachable from `rev` and committed
180
+ * after `since` (ISO 8601), merges left out (#3036). A rebase or a
181
+ * cherry-pick commits anew, so a rewritten commit is never older than the
182
+ * one it was rewritten from.
183
+ */
184
+ export function patchIdsSince(top, rev, since) {
185
+ if (!commitId(top, rev))
186
+ return new Map();
187
+ const patches = git(top, ["log", rev, `--since=${since}`, "--no-merges", "--format=commit %H", "--patch", "--no-color", "--no-ext-diff"]);
188
+ if (!patches?.trim())
189
+ return new Map();
190
+ return parsePatchIds(git(top, ["patch-id", "--stable"], patches));
191
+ }
192
+ function hashFile(path) {
193
+ const bytes = readFileSync(path);
194
+ return { sha256: createHash("sha256").update(bytes).digest("hex"), bytes: statSync(path).size, ref: null };
195
+ }
196
+ function pinOf(p, cwd, what) {
197
+ if (!p)
198
+ return null;
199
+ const excerpt = p.excerpt === undefined ? {} : { excerpt: p.excerpt };
200
+ if (p.sha256)
201
+ return { sha256: p.sha256, bytes: null, ref: p.ref ?? null, ...excerpt };
202
+ const path = resolve(cwd, p.path);
203
+ let pin;
204
+ try {
205
+ pin = hashFile(path);
206
+ }
207
+ catch (err) {
208
+ throw new RunWriteError("write-input-invalid", `${what}.path ${p.path} can't be read to hash it: ${err instanceof Error ? err.message : String(err)}`);
209
+ }
210
+ return { ...pin, ref: p.ref ?? p.path, ...excerpt };
211
+ }
212
+ // ── Building the lines ───────────────────────────────────────────────────────
213
+ /** A new run id: the start time to the second, and eight random hex digits. */
214
+ export function newRunId(now) {
215
+ return `${now.toISOString().replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}-${randomBytes(4).toString("hex")}`;
216
+ }
217
+ function parseInput(schema, value, verb) {
218
+ const parsed = schema.safeParse(value);
219
+ if (!parsed.success) {
220
+ throw new RunWriteError("write-input-invalid", `runs ${verb}: ${parsed.error.issues.map((i) => `${i.path.length ? i.path.join(".") : "the fields"}: ${i.message}`).join("; ")}`);
221
+ }
222
+ return parsed.data;
223
+ }
224
+ function startLine(input, id, at, cwd) {
225
+ const harness = typeof input.harness === "string" ? { name: input.harness, version: null } : { name: input.harness.name, version: input.harness.version ?? null };
226
+ const unit = input.unit === undefined ? null : typeof input.unit === "string" ? { id: input.unit, kind: null } : { id: input.unit.id, kind: input.unit.kind ?? null };
227
+ return {
228
+ version: 1,
229
+ event: "start",
230
+ run: id,
231
+ at,
232
+ by: input.by ?? null,
233
+ agent: input.agent ?? null,
234
+ harness,
235
+ model: input.model ?? null,
236
+ provider: input.provider ?? null,
237
+ unit,
238
+ lease: input.lease ?? null,
239
+ records: (input.records ?? []).map((r) => parseRecordRef(r)),
240
+ instruction: pinOf(input.instruction, cwd, "instruction"),
241
+ };
242
+ }
243
+ function endLine(input, id, at, top, cwd) {
244
+ const commits = [];
245
+ for (const entry of input.commits ?? []) {
246
+ const c = typeof entry === "string" ? entry : entry.sha;
247
+ const sha = commitId(top, c);
248
+ if (!sha)
249
+ throw new RunWriteError("write-input-invalid", `commits: ${c} names no commit in this repository`);
250
+ const hunks = typeof entry === "string" ? undefined : entry.hunks.map((h) => ({ path: h.path, start: h.start, end: h.end }));
251
+ const listed = commits.find((x) => x.sha === sha);
252
+ if (listed) {
253
+ if (hunks)
254
+ listed.hunks = [...(listed.hunks ?? []), ...hunks];
255
+ }
256
+ else
257
+ commits.push({ sha, patchId: patchIdOf(top, sha), ...(hunks ? { hunks } : {}) });
258
+ }
259
+ const usage = input.usage
260
+ ? { turns: input.usage.turns ?? null, inputTokens: input.usage.inputTokens ?? null, outputTokens: input.usage.outputTokens ?? null, cacheReadTokens: input.usage.cacheReadTokens ?? null, cacheWriteTokens: input.usage.cacheWriteTokens ?? null }
261
+ : null;
262
+ return {
263
+ version: 1,
264
+ event: "end",
265
+ run: id,
266
+ at,
267
+ outcome: input.outcome ?? null,
268
+ usage,
269
+ models: (input.models ?? []).map((m) => ({
270
+ model: m.model,
271
+ provider: m.provider ?? null,
272
+ inputTokens: m.inputTokens ?? null,
273
+ outputTokens: m.outputTokens ?? null,
274
+ cacheReadTokens: m.cacheReadTokens ?? null,
275
+ cacheWriteTokens: m.cacheWriteTokens ?? null,
276
+ cost: m.cost ?? null,
277
+ })),
278
+ cost: input.cost ?? null,
279
+ transcript: pinOf(input.transcript, cwd, "transcript"),
280
+ commits,
281
+ };
282
+ }
283
+ // ── Reading the ledger ───────────────────────────────────────────────────────
284
+ /** Parse one run file, oldest line first. Lines that aren't run events are counted and skipped. */
285
+ export function parseRunFile(content, id) {
286
+ const lines = [];
287
+ let malformed = 0;
288
+ for (const raw of content.split("\n").map((l) => l.trim()).filter(Boolean)) {
289
+ try {
290
+ const v = JSON.parse(raw);
291
+ const statement = v.event === "statement" && typeof v.envelope === "object" && v.envelope !== null;
292
+ const ok = v.version === 1 && (v.event === "start" || v.event === "end" || statement) && v.run === id && typeof v.at === "string";
293
+ if (ok)
294
+ lines.push(v);
295
+ else
296
+ malformed++;
297
+ }
298
+ catch {
299
+ malformed++;
300
+ }
301
+ }
302
+ return { lines, malformed };
303
+ }
304
+ /** The ledger directory of the workspace whose root is `rootOnDisk`, on the branch. */
305
+ export async function runsDir(rootOnDisk) {
306
+ const { prefix } = await resolveMemberLedger(rootOnDisk);
307
+ return `${prefix}${AGENT_RUNS_DIR}`;
308
+ }
309
+ /** Every run file in `dir` on the local branch, or on `ref` when given, by run id, and the branch tip read. Never fetches. */
310
+ export function readRunFiles(top, dir, ref = `refs/heads/${LEDGER_BRANCH}`) {
311
+ const files = new Map();
312
+ const tip = commitId(top, ref) ?? null;
313
+ if (!tip)
314
+ return { tip, files };
315
+ const listing = git(top, ["ls-tree", "-z", `${tip}:${dir}`]);
316
+ if (!listing)
317
+ return { tip, files };
318
+ const entries = [];
319
+ for (const entry of listing.split("\0").filter(Boolean)) {
320
+ const tab = entry.indexOf("\t");
321
+ const [, type, sha] = entry.slice(0, tab).split(" ");
322
+ const name = entry.slice(tab + 1);
323
+ const m = name.match(/^(.+)\.jsonl$/);
324
+ if (type === "blob" && m && RUN_ID_PATTERN.test(m[1]))
325
+ entries.push({ id: m[1], sha });
326
+ }
327
+ if (entries.length === 0)
328
+ return { tip, files };
329
+ const batch = git(top, ["cat-file", "--batch"], `${entries.map((e) => e.sha).join("\n")}\n`) ?? "";
330
+ // Each object: "<sha> blob <size>\n<content>\n".
331
+ let pos = 0;
332
+ for (const e of entries) {
333
+ const nl = batch.indexOf("\n", pos);
334
+ if (nl < 0)
335
+ break;
336
+ const size = Number(batch.slice(pos, nl).split(" ")[2]);
337
+ const start = nl + 1;
338
+ const content = Buffer.from(batch.slice(start)).subarray(0, size).toString("utf-8");
339
+ files.set(e.id, { path: `${dir}/${e.id}.jsonl`, content });
340
+ pos = start + content.length + 1;
341
+ }
342
+ return { tip, files };
343
+ }
344
+ const APPEND_RETRY_ATTEMPTS = 5;
345
+ /**
346
+ * Append `make(existing)`'s lines to run `id`'s file, with the read-then-CAS
347
+ * retry the lease history uses, then push `chant/lifecycle` best-effort.
348
+ */
349
+ async function appendRun(top, rootOnDisk, id, make, message) {
350
+ await fetchLifecycleStatus({ cwd: top }).catch(() => undefined);
351
+ const dir = await runsDir(rootOnDisk);
352
+ const path = `${dir}/${id}.jsonl`;
353
+ let commit;
354
+ let written = [];
355
+ let lastErr;
356
+ for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS && commit === undefined; attempt++) {
357
+ const prior = git(top, ["rev-parse", "--verify", "--quiet", `refs/heads/${LEDGER_BRANCH}:${path}`])?.trim() || null;
358
+ const text = prior ? ((await readBlobBySha(prior, { cwd: top })) ?? "") : "";
359
+ const existing = parseRunFile(text, id).lines;
360
+ const lines = make(existing);
361
+ const content = [text.replace(/\n$/, ""), ...lines.map((l) => JSON.stringify(l, sortedJsonReplacer))].filter(Boolean).join("\n");
362
+ try {
363
+ commit = await writeLedgerFiles([{ path, content, expectPriorSha: prior }], message, { cwd: top });
364
+ written = [...existing, ...lines];
365
+ }
366
+ catch (err) {
367
+ if (!(err instanceof RefCASConflictError))
368
+ throw err;
369
+ lastErr = err;
370
+ }
371
+ }
372
+ if (commit === undefined)
373
+ throw lastErr;
374
+ const push = await pushLifecycleStatus({ cwd: top }).catch((err) => ({ status: "failed", remote: "(unknown)", stderr: err instanceof Error ? err.message : String(err) }));
375
+ const notPushed = describeLifecyclePush(push);
376
+ return { id, lines: written, ledger: { branch: LEDGER_BRANCH, path, commit, pushed: push.status === "pushed", ...(notPushed ? { notPushed } : {}) } };
377
+ }
378
+ /** `runs start`: a run's start, with a new id unless the fields give one. Refused with `run-exists` for an id in use. */
379
+ export async function startRun(fields, ctx) {
380
+ const input = parseInput(runStartInputSchema, fields, "start");
381
+ const startedAt = input.startedAt ?? (ctx.now?.() ?? new Date()).toISOString();
382
+ const id = input.id ?? newRunId(new Date(startedAt));
383
+ const line = startLine(input, id, startedAt, ctx.cwd);
384
+ return appendRun(ctx.top, ctx.rootOnDisk, id, (existing) => {
385
+ if (existing.length > 0)
386
+ throw new RunWriteError("run-exists", `the ledger already has an agent run ${id}`);
387
+ return [line];
388
+ }, `Agent run start: ${id}`);
389
+ }
390
+ /** `runs end <id>`: a started run's end. Refused with `run-unknown` when it never started and `run-ended` when it already ended. */
391
+ export async function endRun(id, fields, ctx) {
392
+ if (!RUN_ID_PATTERN.test(id))
393
+ throw new RunWriteError("run-unknown", `${JSON.stringify(id)} is not a run id`);
394
+ const input = parseInput(runEndInputSchema, fields, "end");
395
+ const now = ctx.now?.() ?? new Date();
396
+ const line = endLine(input, id, input.endedAt ?? now.toISOString(), ctx.top, ctx.cwd);
397
+ return appendRun(ctx.top, ctx.rootOnDisk, id, (existing) => {
398
+ const start = existing.find((l) => l.event === "start");
399
+ if (!start)
400
+ throw new RunWriteError("run-unknown", `the ledger has no agent run ${id}; start it with runs start, or report a finished run with runs record`);
401
+ if (existing.some((l) => l.event === "end"))
402
+ throw new RunWriteError("run-ended", `agent run ${id} has already ended`);
403
+ if (Date.parse(line.at) < Date.parse(start.at))
404
+ throw new RunWriteError("write-input-invalid", `endedAt ${line.at} is before the run started at ${start.at}`);
405
+ return [line];
406
+ }, `Agent run end: ${id}`);
407
+ }
408
+ /** `runs record`: a run that has finished, its start and end in one write. */
409
+ export async function recordRun(fields, ctx) {
410
+ const input = parseInput(runRecordInputSchema, fields, "record");
411
+ const now = ctx.now?.() ?? new Date();
412
+ const endedAt = input.endedAt ?? now.toISOString();
413
+ const startedAt = input.startedAt ?? endedAt;
414
+ if (Date.parse(endedAt) < Date.parse(startedAt))
415
+ throw new RunWriteError("write-input-invalid", `endedAt ${endedAt} is before startedAt ${startedAt}`);
416
+ const id = input.id ?? newRunId(new Date(startedAt));
417
+ const start = startLine(input, id, startedAt, ctx.cwd);
418
+ const end = endLine(input, id, endedAt, ctx.top, ctx.cwd);
419
+ return appendRun(ctx.top, ctx.rootOnDisk, id, (existing) => {
420
+ if (existing.length > 0)
421
+ throw new RunWriteError("run-exists", `the ledger already has an agent run ${id}`);
422
+ return [start, end];
423
+ }, `Agent run: ${id}`);
424
+ }
425
+ /**
426
+ * `runs sign <id>`: append a statement over an ended run (#3192). The caller
427
+ * has built or checked the envelope against the record whose hash is
428
+ * `recordSha256`; the append refuses if the ledger's record is not that one.
429
+ */
430
+ export async function appendRunStatement(id, envelope, recordSha256, ctx) {
431
+ if (!RUN_ID_PATTERN.test(id))
432
+ throw new RunWriteError("run-unknown", `${JSON.stringify(id)} is not a run id`);
433
+ const at = (ctx.now?.() ?? new Date()).toISOString();
434
+ return appendRun(ctx.top, ctx.rootOnDisk, id, (existing) => {
435
+ const start = existing.find((l) => l.event === "start");
436
+ const end = existing.find((l) => l.event === "end");
437
+ if (!start)
438
+ throw new RunWriteError("run-unknown", `the ledger has no agent run ${id}`);
439
+ if (!end)
440
+ throw new RunWriteError("run-not-ended", `agent run ${id} has not ended; a statement is signed over a run's whole record, so record its end first`);
441
+ if (runRecordDigest(start, end) !== recordSha256)
442
+ throw new RunWriteError("run-statement-mismatch", `agent run ${id}'s record changed while it was being signed; sign it again`);
443
+ return [{ version: 1, event: "statement", run: id, at, envelope }];
444
+ }, `Agent run statement: ${id}`);
445
+ }
446
+ /** The order a reader lists joins in: the commit's own trailer first, a squash's originals last. */
447
+ export const RUN_JOIN_ORDER = ["trailer", "record", "patch-id", "squash"];
448
+ /** Fold a run's lines into one view, or undefined when it has no start. */
449
+ export function foldRun(id, path, lines) {
450
+ const start = lines.find((l) => l.event === "start");
451
+ if (!start)
452
+ return undefined;
453
+ const end = lines.find((l) => l.event === "end");
454
+ return {
455
+ id,
456
+ state: end ? "ended" : "running",
457
+ startedAt: start.at,
458
+ endedAt: end?.at ?? null,
459
+ outcome: end?.outcome ?? null,
460
+ by: start.by,
461
+ agent: start.agent,
462
+ harness: start.harness,
463
+ model: start.model,
464
+ provider: start.provider,
465
+ unit: start.unit,
466
+ lease: start.lease,
467
+ records: start.records ?? [],
468
+ instruction: start.instruction ?? null,
469
+ usage: end?.usage ?? null,
470
+ models: end?.models ?? [],
471
+ cost: end?.cost ?? null,
472
+ transcript: end?.transcript ?? null,
473
+ commits: (end?.commits ?? []).map((c) => ({ sha: c.sha, patchId: c.patchId, joinedBy: ["record"], hunks: Array.isArray(c.hunks) && c.hunks.length > 0 ? c.hunks : null })),
474
+ decisions: [],
475
+ ledger: path,
476
+ record: end ? { sha256: runRecordDigest(start, end) } : null,
477
+ statements: lines.filter((l) => l.event === "statement").map((l) => ({ at: l.at, envelope: l.envelope })),
478
+ };
479
+ }
480
+ /** Every run in the ledger of the workspace at `rootOnDisk`, by id, with the malformed line count. Never fetches. */
481
+ export async function readRuns(top, rootOnDisk) {
482
+ const dir = await runsDir(rootOnDisk);
483
+ const { tip, files } = readRunFiles(top, dir);
484
+ const runs = new Map();
485
+ let malformed = 0;
486
+ for (const [id, f] of files) {
487
+ const parsed = parseRunFile(f.content, id);
488
+ malformed += parsed.malformed;
489
+ const view = foldRun(id, f.path, parsed.lines);
490
+ if (view)
491
+ runs.set(id, view);
492
+ else
493
+ malformed += parsed.lines.length;
494
+ }
495
+ return { tip, dir, runs, malformed };
496
+ }
497
+ /**
498
+ * The commits reachable from `rev` that carry a `Chant-Run` trailer, by run
499
+ * id, newest first. One `git log` over the history; nothing is fetched.
500
+ */
501
+ export function commitsByRunTrailer(top, rev = "HEAD") {
502
+ const out = new Map();
503
+ if (!commitId(top, rev))
504
+ return out;
505
+ const text = git(top, ["log", rev, `--format=%x00%H%x1f%(trailers:key=${RUN_TRAILER},valueonly,separator=%x1e)`]) ?? "";
506
+ for (const record of text.split("\0")) {
507
+ if (!record.trim())
508
+ continue;
509
+ const [sha, values] = record.split("\x1f");
510
+ for (const v of (values ?? "").split("\x1e").map((x) => x.trim()).filter(Boolean))
511
+ (out.get(v) ?? out.set(v, []).get(v)).push(sha.trim());
512
+ }
513
+ return out;
514
+ }
515
+ /** Add the commits that name each run by trailer to its `commits`, after the ones its end lists. */
516
+ export function joinTrailerCommits(runs, byTrailer, top) {
517
+ for (const [id, shas] of byTrailer) {
518
+ const run = runs.get(id);
519
+ if (!run)
520
+ continue;
521
+ for (const sha of shas) {
522
+ const listed = run.commits.find((c) => c.sha === sha);
523
+ if (listed) {
524
+ if (!listed.joinedBy.includes("trailer"))
525
+ listed.joinedBy.push("trailer");
526
+ }
527
+ else
528
+ run.commits.push({ sha, patchId: patchIdOf(top, sha), joinedBy: ["trailer"], hunks: null });
529
+ }
530
+ }
531
+ }
532
+ /** A day, the slack {@link joinPatchIdCommits} gives a run's start against clocks that disagree. */
533
+ const CLOCK_SLACK_MS = 24 * 60 * 60 * 1000;
534
+ /** Each recorded patch-id, to the runs whose end listed a commit with it and that commit. */
535
+ export function recordedPatchIds(runs) {
536
+ const out = new Map();
537
+ for (const r of runs) {
538
+ for (const c of r.commits) {
539
+ if (!c.patchId || !c.joinedBy.includes("record"))
540
+ continue;
541
+ const list = out.get(c.patchId) ?? out.set(c.patchId, []).get(c.patchId);
542
+ if (!list.some((x) => x.run === r.id && x.sha === c.sha))
543
+ list.push({ run: r.id, sha: c.sha });
544
+ }
545
+ }
546
+ return out;
547
+ }
548
+ /**
549
+ * Add to each run the commits on `rev`'s history that join it by content
550
+ * (#3036): a commit that no run lists, that carries no `Chant-Run`, and whose
551
+ * patch-id equals one the run's end recorded. Only commits made since the
552
+ * earliest such run started are read, less a day for clocks.
553
+ */
554
+ export function joinPatchIdCommits(runs, byTrailer, top, rev = "HEAD") {
555
+ const recorded = recordedPatchIds(runs.values());
556
+ if (recorded.size === 0)
557
+ return;
558
+ const starts = [...new Set([...recorded.values()].flat().map((x) => x.run))].map((id) => Date.parse(runs.get(id).startedAt)).filter((t) => !Number.isNaN(t));
559
+ if (starts.length === 0)
560
+ return;
561
+ const since = new Date(Math.min(...starts) - CLOCK_SLACK_MS).toISOString();
562
+ const joined = new Set([...byTrailer.values()].flat());
563
+ for (const r of runs.values())
564
+ for (const c of r.commits)
565
+ joined.add(c.sha);
566
+ for (const [sha, patchId] of patchIdsSince(top, rev, since)) {
567
+ if (joined.has(sha))
568
+ continue;
569
+ for (const hit of recorded.get(patchId) ?? []) {
570
+ const run = runs.get(hit.run);
571
+ if (!run.commits.some((c) => c.sha === sha))
572
+ run.commits.push({ sha, patchId, joinedBy: ["patch-id"], hunks: null, recordedAs: hit.sha });
573
+ }
574
+ }
575
+ }
576
+ /**
577
+ * For each commit, the runs that made it: the run its `Chant-Run` trailer
578
+ * names, and every run whose end lists it. A commit with neither joins every
579
+ * run whose end recorded its patch-id (#3036). Reads the run ledger once from
580
+ * the local branch; never fetches.
581
+ */
582
+ export async function runsForCommits(top, rootOnDisk, commits) {
583
+ let runs = new Map();
584
+ try {
585
+ runs = (await readRuns(top, rootOnDisk)).runs;
586
+ }
587
+ catch {
588
+ // A ledger that can't be located leaves every run unrecorded; the trailers still say which.
589
+ }
590
+ const listing = new Map();
591
+ for (const r of runs.values())
592
+ for (const c of r.commits)
593
+ (listing.get(c.sha) ?? listing.set(c.sha, []).get(c.sha)).push(r.id);
594
+ // The content join (#3036): only when some run recorded a patch-id, and only for the commits read.
595
+ const recorded = recordedPatchIds(runs.values());
596
+ const patchIds = recorded.size > 0 ? patchIdsOf(top, commits.map((c) => c.sha)) : new Map();
597
+ const refs = new Map();
598
+ const conflicts = [];
599
+ const refOf = (id, joinedBy, recordedAs) => {
600
+ const r = runs.get(id);
601
+ return {
602
+ id,
603
+ recorded: r !== undefined,
604
+ state: r?.state ?? null,
605
+ harness: r?.harness.name ?? null,
606
+ model: r?.model ?? null,
607
+ provider: r?.provider ?? null,
608
+ by: r?.by ?? null,
609
+ agent: r?.agent ?? null,
610
+ unit: r?.unit?.id ?? null,
611
+ joinedBy,
612
+ ...(recordedAs ? { recordedAs } : {}),
613
+ };
614
+ };
615
+ for (const c of commits) {
616
+ const listed = listing.get(c.sha) ?? [];
617
+ const ids = [...new Set([...(c.run ? [c.run] : []), ...listed])];
618
+ const matches = (recorded.get(patchIds.get(c.sha) ?? "") ?? []).filter((m) => m.sha !== c.sha);
619
+ if (ids.length > 0) {
620
+ const others = matches.filter((m) => !ids.includes(m.run));
621
+ if (others.length > 0)
622
+ conflicts.push({ sha: c.sha, joined: ids, content: others });
623
+ refs.set(c.sha, ids.map((id) => refOf(id, [...(c.run === id ? ["trailer"] : []), ...(listed.includes(id) ? ["record"] : [])])));
624
+ continue;
625
+ }
626
+ const byRun = new Map();
627
+ for (const m of matches)
628
+ if (!byRun.has(m.run))
629
+ byRun.set(m.run, m.sha);
630
+ refs.set(c.sha, [...byRun].map(([id, recordedAs]) => refOf(id, ["patch-id"], recordedAs)));
631
+ }
632
+ return { refs, runs, conflicts };
633
+ }
634
+ /**
635
+ * Give each followed squash commit the runs its original commits join
636
+ * (#3035): `refs` must hold the originals' runs. A run the squash already
637
+ * joins gets `squash` added; another is added with `joinedBy: ["squash"]`.
638
+ * `via` lists the originals that join it.
639
+ */
640
+ export function addSquashRuns(refs, follows) {
641
+ for (const f of follows.values()) {
642
+ if (!f.followed)
643
+ continue;
644
+ const list = refs.get(f.sha) ?? refs.set(f.sha, []).get(f.sha);
645
+ for (const o of f.commits) {
646
+ for (const r of refs.get(o) ?? []) {
647
+ const have = list.find((x) => x.id === r.id);
648
+ if (have) {
649
+ if (!have.joinedBy.includes("squash"))
650
+ have.joinedBy.push("squash");
651
+ have.via = [...new Set([...(have.via ?? []), o])];
652
+ continue;
653
+ }
654
+ const { recordedAs: _r, via: _v, ...rest } = r;
655
+ list.push({ ...rest, joinedBy: ["squash"], via: [o] });
656
+ }
657
+ }
658
+ }
659
+ }
660
+ /**
661
+ * Follow the squash merges on `rev`'s history made since the earliest run
662
+ * started (#3035), and add each to the runs its pull request's original
663
+ * commits join: a commit a run's end lists, or one whose `Chant-Run` names
664
+ * the run. Missing pull request refs are fetched from `origin`. Returns what
665
+ * each squash's follow found, for the read's reasons.
666
+ */
667
+ export function joinSquashCommits(runs, top, rev = "HEAD") {
668
+ const starts = [...runs.values()].map((r) => Date.parse(r.startedAt)).filter((t) => !Number.isNaN(t));
669
+ if (starts.length === 0 || !commitId(top, rev))
670
+ return [];
671
+ const since = new Date(Math.min(...starts) - CLOCK_SLACK_MS).toISOString();
672
+ const candidates = [];
673
+ for (const line of (git(top, ["log", rev, `--since=${since}`, "--no-merges", "--format=%H%x1f%s"]) ?? "").split("\n")) {
674
+ const [sha, subject] = line.split("\x1f");
675
+ if (sha && subject !== undefined)
676
+ candidates.push({ sha: sha.trim(), subject });
677
+ }
678
+ const follows = followSquashes(top, candidates, { fetchMissing: true });
679
+ const originals = [...new Set([...follows.values()].flatMap((f) => f.commits))];
680
+ const trailerRun = new Map();
681
+ if (originals.length > 0) {
682
+ const text = git(top, ["log", "--no-walk=unsorted", "--stdin", `--format=%x00%H%x1f%(trailers:key=${RUN_TRAILER},valueonly,separator=%x1e)`], `${originals.join("\n")}\n`) ?? "";
683
+ for (const record of text.split("\0")) {
684
+ if (!record.trim())
685
+ continue;
686
+ const [sha, values] = record.split("\x1f");
687
+ trailerRun.set(sha.trim(), (values ?? "").split("\x1e").map((x) => x.trim()).filter(Boolean));
688
+ }
689
+ }
690
+ for (const f of follows.values()) {
691
+ if (!f.followed)
692
+ continue;
693
+ for (const r of runs.values()) {
694
+ const via = f.commits.filter((o) => r.commits.some((c) => c.sha === o && c.joinedBy.some((j) => j !== "squash")) || (trailerRun.get(o) ?? []).includes(r.id));
695
+ if (via.length === 0)
696
+ continue;
697
+ const listed = r.commits.find((c) => c.sha === f.sha);
698
+ if (listed) {
699
+ if (!listed.joinedBy.includes("squash"))
700
+ listed.joinedBy.push("squash");
701
+ listed.via = [...new Set([...(listed.via ?? []), ...via])];
702
+ }
703
+ else
704
+ r.commits.push({ sha: f.sha, patchId: patchIdOf(top, f.sha), joinedBy: ["squash"], hunks: null, via });
705
+ }
706
+ }
707
+ return [...follows.values()];
708
+ }