@svenroth-ai/shipwright 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/dist/assets/{EmbeddedTerminal-D3wpPNZP.js → EmbeddedTerminal-4xgNUBUu.js} +19 -19
- package/client/dist/assets/{abnfDiagram-VRR7QNED-BkLIltB3.js → abnfDiagram-VRR7QNED-BdCNbaqc.js} +1 -1
- package/client/dist/assets/{arc-Sw-Gh0nI.js → arc-DoZTTE1N.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js → architectureDiagram-ZJ3FMSHR-DFTG4KtO.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-Ch_9dj8a.js → blockDiagram-677ZJIJ3-C34UBjOB.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-CkFlO65x.js → c4Diagram-LMCZKHZV-CbqAB1Ou.js} +1 -1
- package/client/dist/assets/channel-DBcZw7Kn.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CypX83xu.js → chunk-2Q5K7J3B-4N6AnmBJ.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-DxVLYGdl.js → chunk-32BRIVSS-Cs67LiCy.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-Cxk1evhx.js → chunk-5VM5RSS4-Bwd7rtD3.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-n9q5S4yJ.js → chunk-EX3LRPZG-CQqGfptD.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-jeL4xvir.js → chunk-JWPE2WC7-ClvKd4PN.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-DDSHN0cj.js → chunk-MOJQB5TN-Cwvj8GE1.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-C0bo383g.js → chunk-RYQCIY6F-DrWMx37d.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-C0jDXXAU.js → chunk-V7JOEXUC-CYFfa4PY.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN-h-Rr4Pn2.js → chunk-VR4S4FIN-B5eWtesm.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-BexSo0-s.js → chunk-XXDRQBXY-BQAZ6Our.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-C3Q1V9DU.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-C3Q1V9DU.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-BQXzaioj.js → cose-bilkent-JH36ORCC-C76Yia6h.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-BJIofhfe.js → cynefin-VYW2F7L2-pJe7rdTi.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-DmPqTM1T.js → cynefinDiagram-TSTJHNR4-EeHQ7dYV.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-1xljvw6X.js → dagre-VKFMJZFB-VXOY6IHR.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-iyL9muCG.js → diagram-FQU43EPY-DW_-leqw.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-DREp2Th6.js → diagram-G47NLZAW-C_hsLD4u.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-h0X3Is2S.js → diagram-NH7WQ7WH-CbeQuO_f.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Bj8YZRFJ.js → diagram-OA4YK3LP-DRHY5d_c.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-BZOf805d.js → diagram-WEI45ONY-B87OYR_S.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DO5JnXda.js → ebnfDiagram-CCIWWBDH-B8Z8WHF6.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-DRgcqg1T.js → erDiagram-Q63AITRT-DaD7oa9H.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-C3J9QmrW.js → flowDiagram-23GEKE2U-GrMVpsea.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-BIEl3Tkm.js → ganttDiagram-NO4QXBWP-K3X0DYBa.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-BNF0tFWC.js → gitGraphDiagram-IHSO6WYX-B2SEx0xa.js} +1 -1
- package/client/dist/assets/index-CIpLt0ie.js +863 -0
- package/client/dist/assets/index-DGtnTeFd.css +1 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-DEyFxiyY.js → infoDiagram-FWYZ7A6U-Fi8fQ95G.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-B_ehlg3I.js → ishikawaDiagram-FXEZZL3T-CrN7QJzt.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-Dp00FyJS.js → journeyDiagram-5HDEW3XC-XHIsl7rM.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-CTAf16q8.js → kanban-definition-HUTT4EX6-A6HJqHw7.js} +1 -1
- package/client/dist/assets/{linear-9vNUgmYd.js → linear-D1vF9IQB.js} +1 -1
- package/client/dist/assets/{mermaid.core-A6tjaEVD.js → mermaid.core-D6w9zlA0.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-DRW3bmCY.js → mindmap-definition-LN4V7U3C-CxRkUj6Z.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-DJFCjHp2.js → pegDiagram-2B236MQR-Bs9dp-8a.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-KRd-sGvC.js → pieDiagram-ENE6RG2P-DBWILzB8.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js → quadrantDiagram-ABIIQ3AL-DrCVJJx6.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-y4tLtjXg.js → railroadDiagram-RFXS5EU6-BdPW2dNf.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-B9EOQDQM.js → requirementDiagram-TGXJPOKE-Bj_g3tC5.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-zfwiDzkT.js → sankeyDiagram-HTMAVEWB-BGL9NnsS.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-DW1LWepL.js → sequenceDiagram-DBY2YBRQ-DEirxTZY.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-BM81Mik0.js → sizeCapture-X5ZJPWSS-BtLrvrea.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-D0EMIw1w.js → stateDiagram-2N3HPSRC-D3GXIouX.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-D3lXe_mJ.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CKXNCX6M.js → swimlanes-5IMT3BWC-PMRQzNhU.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-DMLbRFiO.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-ByzIfvL5.js → timeline-definition-FHXFAJF6-CnBKJtD_.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-Xep38xBH.js → vennDiagram-L72KCM5P-BYmiJYoh.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-DKWDpx6g.js → wardleyDiagram-EHGQE667-DU7vW8q3.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-BGcwZTnu.js → xychartDiagram-FW5EYKEG-BEtPvBSU.js} +1 -1
- package/client/dist/index.html +2 -2
- package/lib/preflight.mjs +24 -5
- package/lib/probes.mjs +10 -4
- package/lib/server.mjs +149 -12
- package/lib/util.mjs +5 -1
- package/package.json +1 -1
- package/scripts/deploy-procs.mjs +105 -20
- package/scripts/deploy-swap.mjs +23 -2
- package/server/dist/config.d.ts +9 -0
- package/server/dist/config.d.ts.map +1 -1
- package/server/dist/config.js +1 -0
- package/server/dist/config.js.map +1 -1
- package/server/dist/core/campaign-events.d.ts.map +1 -1
- package/server/dist/core/campaign-events.js +1 -0
- package/server/dist/core/campaign-events.js.map +1 -1
- package/server/dist/core/campaign-loop-state.d.ts.map +1 -1
- package/server/dist/core/campaign-loop-state.js +54 -21
- package/server/dist/core/campaign-loop-state.js.map +1 -1
- package/server/dist/core/campaign-parse.d.ts +4 -0
- package/server/dist/core/campaign-parse.d.ts.map +1 -1
- package/server/dist/core/campaign-parse.js +9 -0
- package/server/dist/core/campaign-parse.js.map +1 -1
- package/server/dist/core/campaign-readiness-schema.d.ts +33 -0
- package/server/dist/core/campaign-readiness-schema.d.ts.map +1 -0
- package/server/dist/core/campaign-readiness-schema.js +70 -0
- package/server/dist/core/campaign-readiness-schema.js.map +1 -0
- package/server/dist/core/campaign-readiness.d.ts +59 -0
- package/server/dist/core/campaign-readiness.d.ts.map +1 -0
- package/server/dist/core/campaign-readiness.js +163 -0
- package/server/dist/core/campaign-readiness.js.map +1 -0
- package/server/dist/core/campaign-status-json.d.ts +3 -0
- package/server/dist/core/campaign-status-json.d.ts.map +1 -1
- package/server/dist/core/campaign-status-json.js +7 -0
- package/server/dist/core/campaign-status-json.js.map +1 -1
- package/server/dist/core/campaign-store.d.ts.map +1 -1
- package/server/dist/core/campaign-store.js +4 -1
- package/server/dist/core/campaign-store.js.map +1 -1
- package/server/dist/core/campaign-types.d.ts +8 -0
- package/server/dist/core/campaign-types.d.ts.map +1 -1
- package/server/dist/core/campaign-worktree-root.d.ts +19 -0
- package/server/dist/core/campaign-worktree-root.d.ts.map +1 -0
- package/server/dist/core/campaign-worktree-root.js +76 -0
- package/server/dist/core/campaign-worktree-root.js.map +1 -0
- package/server/dist/core/claim-record-lock.d.ts +30 -0
- package/server/dist/core/claim-record-lock.d.ts.map +1 -0
- package/server/dist/core/claim-record-lock.js +90 -0
- package/server/dist/core/claim-record-lock.js.map +1 -0
- package/server/dist/core/cli-child-spawn.d.ts +28 -0
- package/server/dist/core/cli-child-spawn.d.ts.map +1 -0
- package/server/dist/core/cli-child-spawn.js +146 -0
- package/server/dist/core/cli-child-spawn.js.map +1 -0
- package/server/dist/core/codex-models-probe.d.ts +46 -0
- package/server/dist/core/codex-models-probe.d.ts.map +1 -0
- package/server/dist/core/codex-models-probe.js +103 -0
- package/server/dist/core/codex-models-probe.js.map +1 -0
- package/server/dist/core/codex-oracle-runner.d.ts +68 -0
- package/server/dist/core/codex-oracle-runner.d.ts.map +1 -0
- package/server/dist/core/codex-oracle-runner.js +124 -0
- package/server/dist/core/codex-oracle-runner.js.map +1 -0
- package/server/dist/core/codex-status-report.d.ts +6 -0
- package/server/dist/core/codex-status-report.d.ts.map +1 -0
- package/server/dist/core/codex-status-report.js +40 -0
- package/server/dist/core/codex-status-report.js.map +1 -0
- package/server/dist/core/codex-task-watcher-types.d.ts +69 -0
- package/server/dist/core/codex-task-watcher-types.d.ts.map +1 -0
- package/server/dist/core/codex-task-watcher-types.js +12 -0
- package/server/dist/core/codex-task-watcher-types.js.map +1 -0
- package/server/dist/core/codex-task-watcher.d.ts +30 -0
- package/server/dist/core/codex-task-watcher.d.ts.map +1 -0
- package/server/dist/core/codex-task-watcher.js +252 -0
- package/server/dist/core/codex-task-watcher.js.map +1 -0
- package/server/dist/core/codex-terminal-signal-detect.d.ts +7 -0
- package/server/dist/core/codex-terminal-signal-detect.d.ts.map +1 -0
- package/server/dist/core/codex-terminal-signal-detect.js +113 -0
- package/server/dist/core/codex-terminal-signal-detect.js.map +1 -0
- package/server/dist/core/codex-thread-discovery.d.ts +21 -0
- package/server/dist/core/codex-thread-discovery.d.ts.map +1 -0
- package/server/dist/core/codex-thread-discovery.js +169 -0
- package/server/dist/core/codex-thread-discovery.js.map +1 -0
- package/server/dist/core/codextender-auth-file-sweep.d.ts +41 -0
- package/server/dist/core/codextender-auth-file-sweep.d.ts.map +1 -0
- package/server/dist/core/codextender-auth-file-sweep.js +97 -0
- package/server/dist/core/codextender-auth-file-sweep.js.map +1 -0
- package/server/dist/core/codextender-proxy-probe.d.ts +80 -0
- package/server/dist/core/codextender-proxy-probe.d.ts.map +1 -0
- package/server/dist/core/codextender-proxy-probe.js +179 -0
- package/server/dist/core/codextender-proxy-probe.js.map +1 -0
- package/server/dist/core/contract-version.d.ts +16 -1
- package/server/dist/core/contract-version.d.ts.map +1 -1
- package/server/dist/core/contract-version.js +16 -1
- package/server/dist/core/contract-version.js.map +1 -1
- package/server/dist/core/launcher-codex.d.ts +61 -0
- package/server/dist/core/launcher-codex.d.ts.map +1 -0
- package/server/dist/core/launcher-codex.js +187 -0
- package/server/dist/core/launcher-codex.js.map +1 -0
- package/server/dist/core/launcher-codextender-env.d.ts +44 -0
- package/server/dist/core/launcher-codextender-env.d.ts.map +1 -0
- package/server/dist/core/launcher-codextender-env.js +212 -0
- package/server/dist/core/launcher-codextender-env.js.map +1 -0
- package/server/dist/core/launcher-codextender.d.ts +72 -0
- package/server/dist/core/launcher-codextender.d.ts.map +1 -0
- package/server/dist/core/launcher-codextender.js +98 -0
- package/server/dist/core/launcher-codextender.js.map +1 -0
- package/server/dist/core/launcher-codextender.smoke-helpers.d.ts +25 -0
- package/server/dist/core/launcher-codextender.smoke-helpers.d.ts.map +1 -0
- package/server/dist/core/launcher-codextender.smoke-helpers.js +211 -0
- package/server/dist/core/launcher-codextender.smoke-helpers.js.map +1 -0
- package/server/dist/core/launcher-permission-flags.d.ts +17 -0
- package/server/dist/core/launcher-permission-flags.d.ts.map +1 -0
- package/server/dist/core/launcher-permission-flags.js +27 -0
- package/server/dist/core/launcher-permission-flags.js.map +1 -0
- package/server/dist/core/launcher.d.ts +18 -0
- package/server/dist/core/launcher.d.ts.map +1 -1
- package/server/dist/core/launcher.js +6 -0
- package/server/dist/core/launcher.js.map +1 -1
- package/server/dist/core/leadwright-preflight-transport.d.ts +27 -0
- package/server/dist/core/leadwright-preflight-transport.d.ts.map +1 -0
- package/server/dist/core/leadwright-preflight-transport.js +124 -0
- package/server/dist/core/leadwright-preflight-transport.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-tests-ac.d.ts +6 -0
- package/server/dist/core/mission-context/artifacts-tests-ac.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts-tests-ac.js +31 -0
- package/server/dist/core/mission-context/artifacts-tests-ac.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-tests.d.ts.map +1 -1
- package/server/dist/core/mission-context/artifacts-tests.js +20 -0
- package/server/dist/core/mission-context/artifacts-tests.js.map +1 -1
- package/server/dist/core/mission-context/resolver-io.d.ts +10 -0
- package/server/dist/core/mission-context/resolver-io.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver-parts.d.ts +8 -7
- package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver-parts.js +22 -14
- package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
- package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver.js +1 -1
- package/server/dist/core/mission-context/resolver.js.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.d.ts +18 -2
- package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.js +38 -18
- package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
- package/server/dist/core/mission-context/traceability.d.ts.map +1 -1
- package/server/dist/core/mission-context/traceability.js +15 -1
- package/server/dist/core/mission-context/traceability.js.map +1 -1
- package/server/dist/core/mission-context/types-slice2.d.ts +44 -0
- package/server/dist/core/mission-context/types-slice2.d.ts.map +1 -1
- package/server/dist/core/model-tier-config-reader.d.ts +14 -1
- package/server/dist/core/model-tier-config-reader.d.ts.map +1 -1
- package/server/dist/core/model-tier-config-reader.js +34 -2
- package/server/dist/core/model-tier-config-reader.js.map +1 -1
- package/server/dist/core/powershell-probe.smoke-helpers.d.ts +12 -0
- package/server/dist/core/powershell-probe.smoke-helpers.d.ts.map +1 -0
- package/server/dist/core/powershell-probe.smoke-helpers.js +80 -0
- package/server/dist/core/powershell-probe.smoke-helpers.js.map +1 -0
- package/server/dist/core/readiness-install-hints.d.ts +1 -1
- package/server/dist/core/readiness-install-hints.d.ts.map +1 -1
- package/server/dist/core/readiness-install-hints.js +5 -0
- package/server/dist/core/readiness-install-hints.js.map +1 -1
- package/server/dist/core/readiness-probe-run.d.ts +61 -0
- package/server/dist/core/readiness-probe-run.d.ts.map +1 -1
- package/server/dist/core/readiness-probe-run.js +93 -15
- package/server/dist/core/readiness-probe-run.js.map +1 -1
- package/server/dist/core/readiness-probe.d.ts +1 -1
- package/server/dist/core/readiness-probe.d.ts.map +1 -1
- package/server/dist/core/readiness-probe.js +36 -8
- package/server/dist/core/readiness-probe.js.map +1 -1
- package/server/dist/core/sdk-sessions-merge.d.ts +19 -0
- package/server/dist/core/sdk-sessions-merge.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-merge.js +19 -5
- package/server/dist/core/sdk-sessions-merge.js.map +1 -1
- package/server/dist/core/sdk-sessions-refresh.d.ts +50 -0
- package/server/dist/core/sdk-sessions-refresh.d.ts.map +1 -0
- package/server/dist/core/sdk-sessions-refresh.js +69 -0
- package/server/dist/core/sdk-sessions-refresh.js.map +1 -0
- package/server/dist/core/sdk-sessions-store.d.ts +48 -0
- package/server/dist/core/sdk-sessions-store.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-store.js +8 -9
- package/server/dist/core/sdk-sessions-store.js.map +1 -1
- package/server/dist/core/sdk-sessions-validate.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-validate.js +11 -0
- package/server/dist/core/sdk-sessions-validate.js.map +1 -1
- package/server/dist/core/settings-reader.d.ts +18 -0
- package/server/dist/core/settings-reader.d.ts.map +1 -0
- package/server/dist/core/settings-reader.js +40 -0
- package/server/dist/core/settings-reader.js.map +1 -0
- package/server/dist/core/shell-quote.d.ts +29 -0
- package/server/dist/core/shell-quote.d.ts.map +1 -1
- package/server/dist/core/shell-quote.js +34 -0
- package/server/dist/core/shell-quote.js.map +1 -1
- package/server/dist/core/shipwright-plugin-version-reader.d.ts +15 -0
- package/server/dist/core/shipwright-plugin-version-reader.d.ts.map +1 -0
- package/server/dist/core/shipwright-plugin-version-reader.js +49 -0
- package/server/dist/core/shipwright-plugin-version-reader.js.map +1 -0
- package/server/dist/core/task-editability.d.ts +1 -1
- package/server/dist/core/task-editability.d.ts.map +1 -1
- package/server/dist/core/task-editability.js +1 -0
- package/server/dist/core/task-editability.js.map +1 -1
- package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
- package/server/dist/core/triage-cli-runner.js +6 -21
- package/server/dist/core/triage-cli-runner.js.map +1 -1
- package/server/dist/core/triage-compose.d.ts.map +1 -1
- package/server/dist/core/triage-compose.js +34 -3
- package/server/dist/core/triage-compose.js.map +1 -1
- package/server/dist/core/triage-store.d.ts +2 -1
- package/server/dist/core/triage-store.d.ts.map +1 -1
- package/server/dist/core/triage-store.js +1 -1
- package/server/dist/core/triage-store.js.map +1 -1
- package/server/dist/external/create-external-routes-args.d.ts +122 -0
- package/server/dist/external/create-external-routes-args.d.ts.map +1 -0
- package/server/dist/external/create-external-routes-args.js +2 -0
- package/server/dist/external/create-external-routes-args.js.map +1 -0
- package/server/dist/external/inbox/_codex.d.ts +14 -0
- package/server/dist/external/inbox/_codex.d.ts.map +1 -0
- package/server/dist/external/inbox/_codex.js +88 -0
- package/server/dist/external/inbox/_codex.js.map +1 -0
- package/server/dist/external/inbox/_derive.d.ts +2 -25
- package/server/dist/external/inbox/_derive.d.ts.map +1 -1
- package/server/dist/external/inbox/_derive.js +11 -0
- package/server/dist/external/inbox/_derive.js.map +1 -1
- package/server/dist/external/inbox/_lead.d.ts +23 -0
- package/server/dist/external/inbox/_lead.d.ts.map +1 -0
- package/server/dist/external/inbox/_lead.js +83 -0
- package/server/dist/external/inbox/_lead.js.map +1 -0
- package/server/dist/external/inbox/_types.d.ts +55 -0
- package/server/dist/external/inbox/_types.d.ts.map +1 -0
- package/server/dist/external/inbox/_types.js +13 -0
- package/server/dist/external/inbox/_types.js.map +1 -0
- package/server/dist/external/inbox/routes.d.ts +7 -0
- package/server/dist/external/inbox/routes.d.ts.map +1 -1
- package/server/dist/external/inbox/routes.js +43 -2
- package/server/dist/external/inbox/routes.js.map +1 -1
- package/server/dist/external/launch/_helpers.d.ts +4 -0
- package/server/dist/external/launch/_helpers.d.ts.map +1 -1
- package/server/dist/external/launch/_helpers.js.map +1 -1
- package/server/dist/external/launch/action-substitution-branch.d.ts +12 -0
- package/server/dist/external/launch/action-substitution-branch.d.ts.map +1 -1
- package/server/dist/external/launch/action-substitution-branch.js +35 -1
- package/server/dist/external/launch/action-substitution-branch.js.map +1 -1
- package/server/dist/external/launch/branch-dispatch.d.ts +15 -0
- package/server/dist/external/launch/branch-dispatch.d.ts.map +1 -0
- package/server/dist/external/launch/branch-dispatch.js +73 -0
- package/server/dist/external/launch/branch-dispatch.js.map +1 -0
- package/server/dist/external/launch/campaign-step-branch.d.ts +7 -1
- package/server/dist/external/launch/campaign-step-branch.d.ts.map +1 -1
- package/server/dist/external/launch/campaign-step-branch.js +70 -2
- package/server/dist/external/launch/campaign-step-branch.js.map +1 -1
- package/server/dist/external/launch/claim-executor-permissions.d.ts +31 -0
- package/server/dist/external/launch/claim-executor-permissions.d.ts.map +1 -0
- package/server/dist/external/launch/claim-executor-permissions.js +107 -0
- package/server/dist/external/launch/claim-executor-permissions.js.map +1 -0
- package/server/dist/external/launch/claim-executor-template-arming.d.ts +42 -0
- package/server/dist/external/launch/claim-executor-template-arming.d.ts.map +1 -0
- package/server/dist/external/launch/claim-executor-template-arming.js +121 -0
- package/server/dist/external/launch/claim-executor-template-arming.js.map +1 -0
- package/server/dist/external/launch/claim-holder-gate.d.ts +51 -0
- package/server/dist/external/launch/claim-holder-gate.d.ts.map +1 -0
- package/server/dist/external/launch/claim-holder-gate.js +95 -0
- package/server/dist/external/launch/claim-holder-gate.js.map +1 -0
- package/server/dist/external/launch/claim-permission-perimeter-assert.d.ts +3 -0
- package/server/dist/external/launch/claim-permission-perimeter-assert.d.ts.map +1 -0
- package/server/dist/external/launch/claim-permission-perimeter-assert.js +24 -0
- package/server/dist/external/launch/claim-permission-perimeter-assert.js.map +1 -0
- package/server/dist/external/launch/legacy-fallback-branch.d.ts +14 -0
- package/server/dist/external/launch/legacy-fallback-branch.d.ts.map +1 -1
- package/server/dist/external/launch/legacy-fallback-branch.js +3 -1
- package/server/dist/external/launch/legacy-fallback-branch.js.map +1 -1
- package/server/dist/external/launch/master-run-branch.js +2 -2
- package/server/dist/external/launch/master-run-branch.js.map +1 -1
- package/server/dist/external/launch/mixed-intents-guard.d.ts +10 -0
- package/server/dist/external/launch/mixed-intents-guard.d.ts.map +1 -0
- package/server/dist/external/launch/mixed-intents-guard.js +49 -0
- package/server/dist/external/launch/mixed-intents-guard.js.map +1 -0
- package/server/dist/external/launch/parse-body.d.ts +29 -0
- package/server/dist/external/launch/parse-body.d.ts.map +1 -1
- package/server/dist/external/launch/parse-body.js +66 -0
- package/server/dist/external/launch/parse-body.js.map +1 -1
- package/server/dist/external/launch/routes.d.ts +3 -0
- package/server/dist/external/launch/routes.d.ts.map +1 -1
- package/server/dist/external/launch/routes.js +99 -128
- package/server/dist/external/launch/routes.js.map +1 -1
- package/server/dist/external/launch/runtime-chokepoint-codextender.d.ts +20 -0
- package/server/dist/external/launch/runtime-chokepoint-codextender.d.ts.map +1 -0
- package/server/dist/external/launch/runtime-chokepoint-codextender.js +51 -0
- package/server/dist/external/launch/runtime-chokepoint-codextender.js.map +1 -0
- package/server/dist/external/launch/runtime-chokepoint-errors.d.ts +33 -0
- package/server/dist/external/launch/runtime-chokepoint-errors.d.ts.map +1 -0
- package/server/dist/external/launch/runtime-chokepoint-errors.js +63 -0
- package/server/dist/external/launch/runtime-chokepoint-errors.js.map +1 -0
- package/server/dist/external/launch/runtime-chokepoint.d.ts +120 -0
- package/server/dist/external/launch/runtime-chokepoint.d.ts.map +1 -0
- package/server/dist/external/launch/runtime-chokepoint.js +201 -0
- package/server/dist/external/launch/runtime-chokepoint.js.map +1 -0
- package/server/dist/external/mission-context/routes.d.ts +33 -27
- package/server/dist/external/mission-context/routes.d.ts.map +1 -1
- package/server/dist/external/mission-context/routes.js +30 -27
- package/server/dist/external/mission-context/routes.js.map +1 -1
- package/server/dist/external/mission-context/test-harness.d.ts +6 -0
- package/server/dist/external/mission-context/test-harness.d.ts.map +1 -1
- package/server/dist/external/mission-context/test-harness.js +6 -1
- package/server/dist/external/mission-context/test-harness.js.map +1 -1
- package/server/dist/external/mission-context/wire.d.ts.map +1 -1
- package/server/dist/external/mission-context/wire.js +24 -2
- package/server/dist/external/mission-context/wire.js.map +1 -1
- package/server/dist/external/org/audit-log.d.ts +19 -0
- package/server/dist/external/org/audit-log.d.ts.map +1 -1
- package/server/dist/external/org/audit-log.js +33 -18
- package/server/dist/external/org/audit-log.js.map +1 -1
- package/server/dist/external/org/beat-effect-audit-read.d.ts +15 -0
- package/server/dist/external/org/beat-effect-audit-read.d.ts.map +1 -0
- package/server/dist/external/org/beat-effect-audit-read.js +73 -0
- package/server/dist/external/org/beat-effect-audit-read.js.map +1 -0
- package/server/dist/external/org/beat-register-health.d.ts +57 -0
- package/server/dist/external/org/beat-register-health.d.ts.map +1 -0
- package/server/dist/external/org/beat-register-health.js +125 -0
- package/server/dist/external/org/beat-register-health.js.map +1 -0
- package/server/dist/external/org/beat-register-release-core.d.ts.map +1 -1
- package/server/dist/external/org/beat-register-release-core.js +4 -1
- package/server/dist/external/org/beat-register-release-core.js.map +1 -1
- package/server/dist/external/org/beat-register-release-request.d.ts +20 -0
- package/server/dist/external/org/beat-register-release-request.d.ts.map +1 -0
- package/server/dist/external/org/beat-register-release-request.js +92 -0
- package/server/dist/external/org/beat-register-release-request.js.map +1 -0
- package/server/dist/external/org/beat-register-release.d.ts +3 -1
- package/server/dist/external/org/beat-register-release.d.ts.map +1 -1
- package/server/dist/external/org/beat-register-release.js +15 -57
- package/server/dist/external/org/beat-register-release.js.map +1 -1
- package/server/dist/external/org/beat-register.d.ts +18 -20
- package/server/dist/external/org/beat-register.d.ts.map +1 -1
- package/server/dist/external/org/beat-register.js +30 -56
- package/server/dist/external/org/beat-register.js.map +1 -1
- package/server/dist/external/org/beat-steps-read.d.ts +17 -0
- package/server/dist/external/org/beat-steps-read.d.ts.map +1 -0
- package/server/dist/external/org/beat-steps-read.js +89 -0
- package/server/dist/external/org/beat-steps-read.js.map +1 -0
- package/server/dist/external/org/charter-authority-read.d.ts +39 -0
- package/server/dist/external/org/charter-authority-read.d.ts.map +1 -0
- package/server/dist/external/org/charter-authority-read.js +142 -0
- package/server/dist/external/org/charter-authority-read.js.map +1 -0
- package/server/dist/external/org/commit-validate.d.ts +18 -0
- package/server/dist/external/org/commit-validate.d.ts.map +1 -0
- package/server/dist/external/org/commit-validate.js +59 -0
- package/server/dist/external/org/commit-validate.js.map +1 -0
- package/server/dist/external/org/commit-writes.d.ts +68 -0
- package/server/dist/external/org/commit-writes.d.ts.map +1 -0
- package/server/dist/external/org/commit-writes.js +110 -0
- package/server/dist/external/org/commit-writes.js.map +1 -0
- package/server/dist/external/org/commit.d.ts +73 -0
- package/server/dist/external/org/commit.d.ts.map +1 -0
- package/server/dist/external/org/commit.js +181 -0
- package/server/dist/external/org/commit.js.map +1 -0
- package/server/dist/external/org/commit.test-fixtures.d.ts +38 -0
- package/server/dist/external/org/commit.test-fixtures.d.ts.map +1 -0
- package/server/dist/external/org/commit.test-fixtures.js +67 -0
- package/server/dist/external/org/commit.test-fixtures.js.map +1 -0
- package/server/dist/external/org/countersign-core.d.ts +19 -0
- package/server/dist/external/org/countersign-core.d.ts.map +1 -0
- package/server/dist/external/org/countersign-core.js +122 -0
- package/server/dist/external/org/countersign-core.js.map +1 -0
- package/server/dist/external/org/countersign-request.d.ts +14 -0
- package/server/dist/external/org/countersign-request.d.ts.map +1 -0
- package/server/dist/external/org/countersign-request.js +78 -0
- package/server/dist/external/org/countersign-request.js.map +1 -0
- package/server/dist/external/org/countersign.d.ts +6 -5
- package/server/dist/external/org/countersign.d.ts.map +1 -1
- package/server/dist/external/org/countersign.js +12 -141
- package/server/dist/external/org/countersign.js.map +1 -1
- package/server/dist/external/org/daemon-config-read.d.ts +31 -0
- package/server/dist/external/org/daemon-config-read.d.ts.map +1 -0
- package/server/dist/external/org/daemon-config-read.js +50 -0
- package/server/dist/external/org/daemon-config-read.js.map +1 -0
- package/server/dist/external/org/decisions-lock.d.ts +6 -4
- package/server/dist/external/org/decisions-lock.d.ts.map +1 -1
- package/server/dist/external/org/decisions-lock.js +9 -8
- package/server/dist/external/org/decisions-lock.js.map +1 -1
- package/server/dist/external/org/domains.d.ts +35 -0
- package/server/dist/external/org/domains.d.ts.map +1 -0
- package/server/dist/external/org/domains.js +29 -0
- package/server/dist/external/org/domains.js.map +1 -0
- package/server/dist/external/org/existing-charters-read.d.ts +5 -0
- package/server/dist/external/org/existing-charters-read.d.ts.map +1 -0
- package/server/dist/external/org/existing-charters-read.js +31 -0
- package/server/dist/external/org/existing-charters-read.js.map +1 -0
- package/server/dist/external/org/lead-question-threads.d.ts +46 -0
- package/server/dist/external/org/lead-question-threads.d.ts.map +1 -0
- package/server/dist/external/org/lead-question-threads.js +132 -0
- package/server/dist/external/org/lead-question-threads.js.map +1 -0
- package/server/dist/external/org/leadwright-proposal-merge.d.ts +54 -0
- package/server/dist/external/org/leadwright-proposal-merge.d.ts.map +1 -0
- package/server/dist/external/org/leadwright-proposal-merge.js +47 -0
- package/server/dist/external/org/leadwright-proposal-merge.js.map +1 -0
- package/server/dist/external/org/mount.d.ts +11 -0
- package/server/dist/external/org/mount.d.ts.map +1 -1
- package/server/dist/external/org/mount.js +7 -1
- package/server/dist/external/org/mount.js.map +1 -1
- package/server/dist/external/org/org-chart-full-read.d.ts +19 -0
- package/server/dist/external/org/org-chart-full-read.d.ts.map +1 -0
- package/server/dist/external/org/org-chart-full-read.js +58 -0
- package/server/dist/external/org/org-chart-full-read.js.map +1 -0
- package/server/dist/external/org/org-file-lock.d.ts +41 -0
- package/server/dist/external/org/org-file-lock.d.ts.map +1 -0
- package/server/dist/external/org/org-file-lock.js +90 -0
- package/server/dist/external/org/org-file-lock.js.map +1 -0
- package/server/dist/external/org/routes.d.ts +10 -0
- package/server/dist/external/org/routes.d.ts.map +1 -1
- package/server/dist/external/org/routes.js +22 -1
- package/server/dist/external/org/routes.js.map +1 -1
- package/server/dist/external/org/usage.d.ts.map +1 -1
- package/server/dist/external/org/usage.js +20 -2
- package/server/dist/external/org/usage.js.map +1 -1
- package/server/dist/external/org/verdict.d.ts +57 -0
- package/server/dist/external/org/verdict.d.ts.map +1 -0
- package/server/dist/external/org/verdict.js +74 -0
- package/server/dist/external/org/verdict.js.map +1 -0
- package/server/dist/external/routes.d.ts +3 -101
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +12 -3
- package/server/dist/external/routes.js.map +1 -1
- package/server/dist/external/tasks/create.d.ts.map +1 -1
- package/server/dist/external/tasks/create.js +8 -0
- package/server/dist/external/tasks/create.js.map +1 -1
- package/server/dist/external/tasks/fork.d.ts +29 -0
- package/server/dist/external/tasks/fork.d.ts.map +1 -0
- package/server/dist/external/tasks/fork.js +166 -0
- package/server/dist/external/tasks/fork.js.map +1 -0
- package/server/dist/external/tasks/lifecycle.d.ts.map +1 -1
- package/server/dist/external/tasks/lifecycle.js +10 -57
- package/server/dist/external/tasks/lifecycle.js.map +1 -1
- package/server/dist/external/tasks/patch.d.ts.map +1 -1
- package/server/dist/external/tasks/patch.js +17 -0
- package/server/dist/external/tasks/patch.js.map +1 -1
- package/server/dist/external/tasks/routes.d.ts +2 -0
- package/server/dist/external/tasks/routes.d.ts.map +1 -1
- package/server/dist/external/tasks/routes.js +7 -0
- package/server/dist/external/tasks/routes.js.map +1 -1
- package/server/dist/external/transcript/routes.d.ts.map +1 -1
- package/server/dist/external/transcript/routes.js +25 -3
- package/server/dist/external/transcript/routes.js.map +1 -1
- package/server/dist/external-routes-wiring.d.ts +28 -0
- package/server/dist/external-routes-wiring.d.ts.map +1 -0
- package/server/dist/external-routes-wiring.js +61 -0
- package/server/dist/external-routes-wiring.js.map +1 -0
- package/server/dist/index.d.ts.map +1 -1
- package/server/dist/index.js +111 -44
- package/server/dist/index.js.map +1 -1
- package/server/dist/lib/resolveHonoHost.d.ts.map +1 -1
- package/server/dist/lib/resolveHonoHost.js +16 -1
- package/server/dist/lib/resolveHonoHost.js.map +1 -1
- package/server/dist/routes/_triage-api-harness.d.ts +1 -1
- package/server/dist/routes/_triage-api-harness.d.ts.map +1 -1
- package/server/dist/routes/_triage-api-harness.js.map +1 -1
- package/server/dist/routes/campaigns-readiness.d.ts +10 -0
- package/server/dist/routes/campaigns-readiness.d.ts.map +1 -0
- package/server/dist/routes/campaigns-readiness.js +58 -0
- package/server/dist/routes/campaigns-readiness.js.map +1 -0
- package/server/dist/routes/campaigns.d.ts.map +1 -1
- package/server/dist/routes/campaigns.js +3 -0
- package/server/dist/routes/campaigns.js.map +1 -1
- package/server/dist/routes/codex-models.d.ts +15 -0
- package/server/dist/routes/codex-models.d.ts.map +1 -0
- package/server/dist/routes/codex-models.js +77 -0
- package/server/dist/routes/codex-models.js.map +1 -0
- package/server/dist/routes/codextender-models.d.ts +16 -0
- package/server/dist/routes/codextender-models.d.ts.map +1 -0
- package/server/dist/routes/codextender-models.js +81 -0
- package/server/dist/routes/codextender-models.js.map +1 -0
- package/server/dist/routes/diagnostics.d.ts +27 -0
- package/server/dist/routes/diagnostics.d.ts.map +1 -1
- package/server/dist/routes/diagnostics.js +5 -1
- package/server/dist/routes/diagnostics.js.map +1 -1
- package/server/dist/routes/org-chart-lead-guard.d.ts +10 -0
- package/server/dist/routes/org-chart-lead-guard.d.ts.map +1 -0
- package/server/dist/routes/org-chart-lead-guard.js +49 -0
- package/server/dist/routes/org-chart-lead-guard.js.map +1 -0
- package/server/dist/routes/org-inventory-composite.d.ts +20 -0
- package/server/dist/routes/org-inventory-composite.d.ts.map +1 -0
- package/server/dist/routes/org-inventory-composite.js +100 -0
- package/server/dist/routes/org-inventory-composite.js.map +1 -0
- package/server/dist/routes/org-lead-setup-wizard.d.ts +10 -0
- package/server/dist/routes/org-lead-setup-wizard.d.ts.map +1 -0
- package/server/dist/routes/org-lead-setup-wizard.js +51 -0
- package/server/dist/routes/org-lead-setup-wizard.js.map +1 -0
- package/server/dist/routes/org-leads-composite.d.ts.map +1 -1
- package/server/dist/routes/org-leads-composite.js +35 -9
- package/server/dist/routes/org-leads-composite.js.map +1 -1
- package/server/dist/routes/org-threads-composite.d.ts +24 -0
- package/server/dist/routes/org-threads-composite.d.ts.map +1 -0
- package/server/dist/routes/org-threads-composite.js +51 -0
- package/server/dist/routes/org-threads-composite.js.map +1 -0
- package/server/dist/routes/org-writes.d.ts +14 -0
- package/server/dist/routes/org-writes.d.ts.map +1 -0
- package/server/dist/routes/org-writes.js +61 -0
- package/server/dist/routes/org-writes.js.map +1 -0
- package/server/dist/routes/org.d.ts +14 -0
- package/server/dist/routes/org.d.ts.map +1 -1
- package/server/dist/routes/org.js +63 -47
- package/server/dist/routes/org.js.map +1 -1
- package/server/dist/routes/settings.d.ts.map +1 -1
- package/server/dist/routes/settings.js +23 -2
- package/server/dist/routes/settings.js.map +1 -1
- package/server/dist/routes/triage.d.ts +17 -0
- package/server/dist/routes/triage.d.ts.map +1 -1
- package/server/dist/routes/triage.js +29 -0
- package/server/dist/routes/triage.js.map +1 -1
- package/server/dist/terminal/pty-manager.d.ts +37 -1
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +33 -3
- package/server/dist/terminal/pty-manager.js.map +1 -1
- package/server/dist/terminal/pty-write-chunker.d.ts +109 -0
- package/server/dist/terminal/pty-write-chunker.d.ts.map +1 -0
- package/server/dist/terminal/pty-write-chunker.js +234 -0
- package/server/dist/terminal/pty-write-chunker.js.map +1 -0
- package/server/dist/terminal/routes.d.ts.map +1 -1
- package/server/dist/terminal/routes.js +9 -0
- package/server/dist/terminal/routes.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.js +14 -5
- package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
- package/server/dist/test/event-test-counts-fixtures.d.ts +40 -0
- package/server/dist/test/event-test-counts-fixtures.d.ts.map +1 -0
- package/server/dist/test/event-test-counts-fixtures.js +56 -0
- package/server/dist/test/event-test-counts-fixtures.js.map +1 -0
- package/server/dist/types/leadwright-beat-step.d.ts +19 -0
- package/server/dist/types/leadwright-beat-step.d.ts.map +1 -0
- package/server/dist/types/leadwright-beat-step.js +56 -0
- package/server/dist/types/leadwright-beat-step.js.map +1 -0
- package/server/dist/types/leadwright-preflight.d.ts +90 -0
- package/server/dist/types/leadwright-preflight.d.ts.map +1 -0
- package/server/dist/types/leadwright-preflight.js +65 -0
- package/server/dist/types/leadwright-preflight.js.map +1 -0
- package/server/dist/types/leadwright-schema-drift.d.ts +28 -0
- package/server/dist/types/leadwright-schema-drift.d.ts.map +1 -0
- package/server/dist/types/leadwright-schema-drift.js +89 -0
- package/server/dist/types/leadwright-schema-drift.js.map +1 -0
- package/server/dist/types/org-inventory.d.ts +53 -0
- package/server/dist/types/org-inventory.d.ts.map +1 -0
- package/server/dist/types/org-inventory.js +11 -0
- package/server/dist/types/org-inventory.js.map +1 -0
- package/server/dist/types/org.d.ts +76 -6
- package/server/dist/types/org.d.ts.map +1 -1
- package/server/dist/types/run-config-retry.d.ts +29 -0
- package/server/dist/types/run-config-retry.d.ts.map +1 -0
- package/server/dist/types/run-config-retry.js +47 -0
- package/server/dist/types/run-config-retry.js.map +1 -0
- package/server/dist/types/run-config-v2.d.ts +29 -41
- package/server/dist/types/run-config-v2.d.ts.map +1 -1
- package/server/dist/types/run-config-v2.js +16 -50
- package/server/dist/types/run-config-v2.js.map +1 -1
- package/server/dist/types/settings.d.ts +33 -0
- package/server/dist/types/settings.d.ts.map +1 -1
- package/server/dist/vendor/leadwright/beat-step.schema.json +83 -0
- package/server/dist/vendor/leadwright/claim-record-lock-contract.json +15 -0
- package/server/dist/vendor/leadwright/org-chart.schema.json +195 -0
- package/server/dist/vendor/leadwright/preflight-input.schema.json +318 -0
- package/server/dist/vendor/leadwright/preflight-result.schema.json +56 -0
- package/server/package.json +1 -1
- package/client/dist/assets/channel-BYPbLjRl.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +0 -1
- package/client/dist/assets/index-BnTOrFHb.js +0 -829
- package/client/dist/assets/index-CYPc6qxw.css +0 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +0 -8
|
@@ -3,30 +3,20 @@
|
|
|
3
3
|
* /api/external/org/leads/:leadId/beat-register/release
|
|
4
4
|
* (iterate-2026-08-18-org-route-beat-register, V4a-2B point 4.4).
|
|
5
5
|
*
|
|
6
|
-
* Hono route shell only — request
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Hono route shell only — parses the request and hands off to
|
|
7
|
+
* `handleReleaseRequest` (`beat-register-release-request.ts`), which is
|
|
8
|
+
* ALSO used by the plain browser-facing proxy's release route
|
|
9
|
+
* (`routes/org.ts`, iterate-2026-09-06-org-lead-staleness-register) so the
|
|
10
|
+
* two route shells cannot drift on validation or status-mapping. The
|
|
11
|
+
* release action itself (locking, register mutation, audit append,
|
|
12
|
+
* mirrored leadwright contract) lives in `beat-register-release-core.ts`.
|
|
10
13
|
*/
|
|
11
|
-
import { lstatSync } from "node:fs";
|
|
12
14
|
import { LEAD_ID_RE } from "./_helpers.js";
|
|
13
|
-
import {
|
|
15
|
+
import { handleReleaseRequest } from "./beat-register-release-request.js";
|
|
14
16
|
export { performRelease, DEFAULT_LOCK_OPTIONS, OrgSymlinkEscapeError, BeatRegisterInvalidError, RESIDUAL_LOCK_WARNING, } from "./beat-register-release-core.js";
|
|
15
|
-
|
|
16
|
-
// Doubt-review fix (Stage 3, medium/correctness): no `/i` flag. Entry
|
|
17
|
-
// matching in `beat-register-release-core.ts` is an exact `===` string
|
|
18
|
-
// comparison, never normalized — leadwright's own writer always produces
|
|
19
|
-
// `crypto.randomUUID()`, which is defined to be lowercase, so the register
|
|
20
|
-
// can never legitimately hold an uppercase-cased entry. Accepting a
|
|
21
|
-
// differently-cased-but-otherwise-valid sessionId here let it pass
|
|
22
|
-
// validation and then silently miss its real (lowercase) register entry,
|
|
23
|
-
// returning 404 not-found for an entry that genuinely exists.
|
|
24
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
17
|
+
export { handleReleaseRequest } from "./beat-register-release-request.js";
|
|
25
18
|
export function registerBeatRegisterReleaseRoute(app, deps) {
|
|
26
|
-
const leadsRoot = deps
|
|
27
|
-
const lstat = deps.lstatSync ?? ((p) => lstatSync(p));
|
|
28
|
-
const lockOptions = deps.lockOptions ?? DEFAULT_LOCK_OPTIONS;
|
|
29
|
-
const now = deps.now ?? (() => new Date());
|
|
19
|
+
const { leadsRoot } = deps;
|
|
30
20
|
app.post("/api/external/org/leads/:leadId/beat-register/release", async (c) => {
|
|
31
21
|
const leadId = c.req.param("leadId");
|
|
32
22
|
if (!LEAD_ID_RE.test(leadId)) {
|
|
@@ -39,43 +29,11 @@ export function registerBeatRegisterReleaseRoute(app, deps) {
|
|
|
39
29
|
catch {
|
|
40
30
|
return c.json({ error: "invalid_json" }, 400);
|
|
41
31
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
reason.length === 0 ||
|
|
48
|
-
reason.length > RELEASE_REASON_MAX_LENGTH) {
|
|
49
|
-
return c.json({ error: "reason_invalid", detail: `must be 1-${RELEASE_REASON_MAX_LENGTH} chars` }, 400);
|
|
50
|
-
}
|
|
51
|
-
let outcome;
|
|
52
|
-
try {
|
|
53
|
-
outcome = await performRelease({ leadsRoot, lockOptions, now, lstat }, leadId, sessionId, reason);
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
56
|
-
if (err instanceof OrgSymlinkEscapeError) {
|
|
57
|
-
return c.json({ error: "symlink_forbidden", path: err.path }, 403);
|
|
58
|
-
}
|
|
59
|
-
if (err instanceof BeatRegisterInvalidError) {
|
|
60
|
-
return c.json({ error: "beat_register_invalid", leadId }, 502);
|
|
61
|
-
}
|
|
62
|
-
const code = err?.code;
|
|
63
|
-
if (code === "ELOCKED") {
|
|
64
|
-
return c.json({ error: "beat_register_locked", leadId }, 409);
|
|
65
|
-
}
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
if (!outcome.ok) {
|
|
69
|
-
// "fault" (duplicate sessionId — trap #3, never resolved by picking
|
|
70
|
-
// one) is a structural data conflict, not "nothing here": 409, not
|
|
71
|
-
// 404.
|
|
72
|
-
const status = outcome.reason === "fault" ? 409 : 404;
|
|
73
|
-
return c.json({ ok: false, reason: outcome.reason, detail: outcome.detail }, status);
|
|
74
|
-
}
|
|
75
|
-
if (!outcome.recovered) {
|
|
76
|
-
return c.json({ ok: true, recovered: false }, 200);
|
|
77
|
-
}
|
|
78
|
-
return c.json({ ok: true, recovered: true, residualLockWarning: outcome.residualLockWarning }, 200);
|
|
32
|
+
// `handleReleaseRequest` owns the `lstatSync`/`lockOptions`/`now`
|
|
33
|
+
// defaulting itself (external-review fix, GLM) — this shell just
|
|
34
|
+
// passes deps through, never resolving them a second time.
|
|
35
|
+
const result = await handleReleaseRequest({ leadsRoot, lstatSync: deps.lstatSync, lockOptions: deps.lockOptions, now: deps.now }, leadId, body);
|
|
36
|
+
return c.json(result.body, result.status);
|
|
79
37
|
});
|
|
80
38
|
}
|
|
81
39
|
//# sourceMappingURL=beat-register-release.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beat-register-release.js","sourceRoot":"","sources":["../../../src/external/org/beat-register-release.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"beat-register-release.js","sourceRoot":"","sources":["../../../src/external/org/beat-register-release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAU1E,MAAM,UAAU,gCAAgC,CAAC,GAAS,EAAE,IAAsB;IAChF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE3B,GAAG,CAAC,IAAI,CAAC,uDAAuD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5E,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,kEAAkE;QAClE,iEAAiE;QACjE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EACtF,MAAM,EACN,IAAI,CACL,CAAC;QACF,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { BeatRegisterEntryView, BeatRegisterHealthResponse } from "../../types/org.js";
|
|
1
|
+
import type { BeatRegisterEntryView } from "../../types/org.js";
|
|
3
2
|
export type { BeatRegisterEntryView, BeatRegisterHealthResponse, } from "../../types/org.js";
|
|
4
3
|
export interface BeatRegisterFile {
|
|
5
4
|
version: 1;
|
|
@@ -63,6 +62,23 @@ export declare function guardExistingTarget(leadsRoot: string, absolute: string,
|
|
|
63
62
|
detail?: string;
|
|
64
63
|
};
|
|
65
64
|
export declare function atomicWriteJson(target: string, value: unknown): void;
|
|
65
|
+
/** Empty text and any parse/structural failure both resolve the same way
|
|
66
|
+
* regardless of how the caller obtained the text (a plain `readFileSync`
|
|
67
|
+
* by path, or a held-fd read after an open-first guard chain) — split out
|
|
68
|
+
* of `readRegisterFileTolerant` so `registerEntriesGuarded` (beat-register-
|
|
69
|
+
* health.ts) can reuse the parse without re-reading the file by path,
|
|
70
|
+
* which is what the open-first pattern exists to avoid (external code
|
|
71
|
+
* review, medium/security: `registerEntriesGuarded` originally checked
|
|
72
|
+
* `lstat`+`realPathGuard` and then reopened the pathname via this
|
|
73
|
+
* function's `readFileSync(absolute)` — a TOCTOU window where a local
|
|
74
|
+
* writer could swap the checked regular file for a symlink between the
|
|
75
|
+
* check and the reopen). */
|
|
76
|
+
export declare function parseRegisterFileText(raw: string): {
|
|
77
|
+
ok: true;
|
|
78
|
+
file: BeatRegisterFile;
|
|
79
|
+
} | {
|
|
80
|
+
ok: false;
|
|
81
|
+
};
|
|
66
82
|
/** ENOENT/empty-file both read as a `{version:1, entries:[]}` clear
|
|
67
83
|
* register — mirrors leadwright's own `readRegisterUnlocked`. Any other
|
|
68
84
|
* parse/structural failure returns `ok:false` (never a guessed value). */
|
|
@@ -72,22 +88,4 @@ export declare function readRegisterFileTolerant(absolute: string): {
|
|
|
72
88
|
} | {
|
|
73
89
|
ok: false;
|
|
74
90
|
};
|
|
75
|
-
export interface BeatRegisterRouteDeps {
|
|
76
|
-
leadsRoot: string;
|
|
77
|
-
lstatSync?: LstatFn;
|
|
78
|
-
}
|
|
79
|
-
export type BeatRegisterHealthCoreResult = {
|
|
80
|
-
status: 200;
|
|
81
|
-
body: BeatRegisterHealthResponse;
|
|
82
|
-
} | {
|
|
83
|
-
status: 400 | 403 | 500 | 502;
|
|
84
|
-
body: {
|
|
85
|
-
error: string;
|
|
86
|
-
leadId?: string;
|
|
87
|
-
detail?: string;
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
/** Pure core — shared by the secret-gated route and the plain-surface proxy. */
|
|
91
|
-
export declare function beatRegisterHealthCore(deps: BeatRegisterRouteDeps, leadId: string): BeatRegisterHealthCoreResult;
|
|
92
|
-
export declare function registerBeatRegisterHealthRoute(app: Hono, deps: BeatRegisterRouteDeps): void;
|
|
93
91
|
//# sourceMappingURL=beat-register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beat-register.d.ts","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"beat-register.d.ts","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,YAAY,EACV,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAM5B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAgBD;;;0BAG0B;AAC1B,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,gBAAgB,CAIrE;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAChD;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC,CAAC;AAEN;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAiB7E;AAOD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK;IAAE,cAAc,IAAI,OAAO,CAAA;CAAE,CAAC;AAEnE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GACb;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBvF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAgBpE;AAED;;;;;;;;;;6BAU6B;AAC7B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAcvG;AAED;;2EAE2E;AAC3E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAWtD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* external/org/beat-register.ts — shared shapes +
|
|
3
|
-
*
|
|
2
|
+
* external/org/beat-register.ts — shared shapes + fs helpers for a lead's
|
|
3
|
+
* `beat-register.json` (iterate-2026-08-18-org-route-beat-register,
|
|
4
4
|
* V4a-2B point 7 — the open-register finding).
|
|
5
5
|
*
|
|
6
6
|
* Reads leadwright's `~/.claude/leads/<lead-id>/beat-register.json`
|
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
* cross-repo — matching its contract exactly, including one of its known
|
|
12
12
|
* limitations (see the `MIRRORED LIMITATION` comment below).
|
|
13
13
|
*
|
|
14
|
-
* The
|
|
15
|
-
*
|
|
14
|
+
* The two guarded READ routes (health classification + raw entries) live in
|
|
15
|
+
* `beat-register-health.ts`, and the release action (point 4.4) lives in
|
|
16
|
+
* `beat-register-release.ts` — both import the shared shapes/helpers below.
|
|
17
|
+
* Split out of this file (bloat gate, iterate-2026-09-08-lead-inventory-page)
|
|
18
|
+
* once `registerEntriesGuarded` pushed it past the 300-line ceiling.
|
|
16
19
|
*/
|
|
17
|
-
import { readFileSync,
|
|
20
|
+
import { readFileSync, writeFileSync, renameSync, existsSync, unlinkSync } from "node:fs";
|
|
18
21
|
import path, { dirname, basename } from "node:path";
|
|
19
22
|
import { randomBytes } from "node:crypto";
|
|
20
|
-
import { LEAD_ID_RE } from "./_helpers.js";
|
|
21
23
|
import { realPathGuard } from "../../core/path-guard.js";
|
|
22
24
|
function isValidEntry(v) {
|
|
23
25
|
if (typeof v !== "object" || v === null)
|
|
@@ -129,20 +131,18 @@ export function atomicWriteJson(target, value) {
|
|
|
129
131
|
throw err;
|
|
130
132
|
}
|
|
131
133
|
}
|
|
132
|
-
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return { ok: false };
|
|
145
|
-
}
|
|
134
|
+
/** Empty text and any parse/structural failure both resolve the same way
|
|
135
|
+
* regardless of how the caller obtained the text (a plain `readFileSync`
|
|
136
|
+
* by path, or a held-fd read after an open-first guard chain) — split out
|
|
137
|
+
* of `readRegisterFileTolerant` so `registerEntriesGuarded` (beat-register-
|
|
138
|
+
* health.ts) can reuse the parse without re-reading the file by path,
|
|
139
|
+
* which is what the open-first pattern exists to avoid (external code
|
|
140
|
+
* review, medium/security: `registerEntriesGuarded` originally checked
|
|
141
|
+
* `lstat`+`realPathGuard` and then reopened the pathname via this
|
|
142
|
+
* function's `readFileSync(absolute)` — a TOCTOU window where a local
|
|
143
|
+
* writer could swap the checked regular file for a symlink between the
|
|
144
|
+
* check and the reopen). */
|
|
145
|
+
export function parseRegisterFileText(raw) {
|
|
146
146
|
if (raw.trim().length === 0) {
|
|
147
147
|
return { ok: true, file: { version: 1, entries: [] } };
|
|
148
148
|
}
|
|
@@ -158,46 +158,20 @@ export function readRegisterFileTolerant(absolute) {
|
|
|
158
158
|
}
|
|
159
159
|
return { ok: true, file: parsed };
|
|
160
160
|
}
|
|
161
|
-
/**
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return { status: 400, body: { error: "invalid_lead_id", leadId } };
|
|
167
|
-
}
|
|
168
|
-
const absolute = registerPathFor(leadsRoot, leadId);
|
|
169
|
-
let lst;
|
|
161
|
+
/** ENOENT/empty-file both read as a `{version:1, entries:[]}` clear
|
|
162
|
+
* register — mirrors leadwright's own `readRegisterUnlocked`. Any other
|
|
163
|
+
* parse/structural failure returns `ok:false` (never a guessed value). */
|
|
164
|
+
export function readRegisterFileTolerant(absolute) {
|
|
165
|
+
let raw;
|
|
170
166
|
try {
|
|
171
|
-
|
|
167
|
+
raw = readFileSync(absolute, "utf8");
|
|
172
168
|
}
|
|
173
169
|
catch (err) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return { status: 200, body: { leadId, status: "clear" } };
|
|
170
|
+
if (err?.code === "ENOENT") {
|
|
171
|
+
return { ok: true, file: { version: 1, entries: [] } };
|
|
177
172
|
}
|
|
178
|
-
return {
|
|
179
|
-
status: 500,
|
|
180
|
-
body: { error: "beat_register_read_failed", detail: String(err).slice(0, 200) },
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
if (lst.isSymbolicLink()) {
|
|
184
|
-
return { status: 403, body: { error: "symlink_forbidden", leadId } };
|
|
185
|
-
}
|
|
186
|
-
const containment = realPathGuard(leadsRoot, absolute);
|
|
187
|
-
if (!containment.ok) {
|
|
188
|
-
return { status: 400, body: { error: "path_traversal", detail: containment.reason } };
|
|
189
|
-
}
|
|
190
|
-
const read = readRegisterFileTolerant(absolute);
|
|
191
|
-
if (!read.ok) {
|
|
192
|
-
return { status: 502, body: { error: "beat_register_invalid", leadId } };
|
|
173
|
+
return { ok: false };
|
|
193
174
|
}
|
|
194
|
-
|
|
195
|
-
return { status: 200, body: { leadId, ...health } };
|
|
196
|
-
}
|
|
197
|
-
export function registerBeatRegisterHealthRoute(app, deps) {
|
|
198
|
-
app.get("/api/external/org/leads/:leadId/beat-register", async (c) => {
|
|
199
|
-
const result = beatRegisterHealthCore(deps, c.req.param("leadId"));
|
|
200
|
-
return c.json(result.body, result.status);
|
|
201
|
-
});
|
|
175
|
+
return parseRegisterFileText(raw);
|
|
202
176
|
}
|
|
203
177
|
//# sourceMappingURL=beat-register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beat-register.js","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"beat-register.js","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { openSync } from "node:fs";
|
|
2
|
+
import { type BeatStep } from "../../types/leadwright-beat-step.js";
|
|
3
|
+
export declare const BEAT_ID_RE: RegExp;
|
|
4
|
+
export type ReadBeatStepsResult = {
|
|
5
|
+
status: "ok";
|
|
6
|
+
steps: BeatStep[];
|
|
7
|
+
unreadableLines: number;
|
|
8
|
+
} | {
|
|
9
|
+
status: "unreadable";
|
|
10
|
+
};
|
|
11
|
+
export interface BeatStepsReadDeps {
|
|
12
|
+
leadsRoot: string;
|
|
13
|
+
/** Test seam for the O_NOFOLLOW open — defaults to the real `openSync`. */
|
|
14
|
+
openSync?: typeof openSync;
|
|
15
|
+
}
|
|
16
|
+
export declare function readBeatStepsCore(deps: BeatStepsReadDeps, leadId: string, beatId: string): ReadBeatStepsResult;
|
|
17
|
+
//# sourceMappingURL=beat-steps-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beat-steps-read.d.ts","sourceRoot":"","sources":["../../../src/external/org/beat-steps-read.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAkD,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAKjG,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAErF,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7B,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,mBAAmB,CA2DrB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/org/beat-steps-read.ts — reads one beat's `steps.jsonl`
|
|
3
|
+
* (iterate-2026-09-08-lead-inventory-page, AC-1/AC-2b/AC-10/AC-11).
|
|
4
|
+
*
|
|
5
|
+
* Mirrors `audit-log.ts`'s exact open-first pattern: `pathGuard` →
|
|
6
|
+
* `open(O_RDONLY | O_NOFOLLOW)` → `fstat().isFile()` → `realPathGuard` →
|
|
7
|
+
* read from the held fd. Both `leadId` AND `beatId` are re-validated HERE,
|
|
8
|
+
* not just trusted from an upstream caller — `beatId` comes from
|
|
9
|
+
* `beat-register.json`, itself only `typeof === "string"`-checked at write
|
|
10
|
+
* time (Internal Plan Review finding #5). leadwright generates beat ids via
|
|
11
|
+
* `randomUUID()` (`lib/beat-round.ts` / `daemon/tick.ts`, verified) — hence
|
|
12
|
+
* `BEAT_ID_RE`.
|
|
13
|
+
*
|
|
14
|
+
* Reporting steps is OPTIONAL in the beat protocol (`skills/leadwright/
|
|
15
|
+
* SKILL.md` step 5) — ENOENT (no file at all) is `ok` with an empty array,
|
|
16
|
+
* the normal, unremarkable case. A genuine file-level failure (symlink,
|
|
17
|
+
* non-file, read error) is `unreadable` — NEVER collapsed into "empty"
|
|
18
|
+
* (Internal Plan Review finding #2). Individual malformed/semantically
|
|
19
|
+
* invalid JSONL lines are skipped and counted in `unreadableLines`; when
|
|
20
|
+
* EVERY line fails, the result is still `ok` with `steps:[]` and a nonzero
|
|
21
|
+
* `unreadableLines` — the CALLER (composite/UI) is responsible for
|
|
22
|
+
* rendering that distinctly from a genuinely empty contribution (AC-10),
|
|
23
|
+
* this reader's job is only to report the count honestly.
|
|
24
|
+
*/
|
|
25
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readFileSync } from "node:fs";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
import { pathGuard, realPathGuard } from "../../core/path-guard.js";
|
|
28
|
+
import { LEAD_ID_RE } from "./_helpers.js";
|
|
29
|
+
import { isValidBeatStep } from "../../types/leadwright-beat-step.js";
|
|
30
|
+
export const BEAT_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
31
|
+
export function readBeatStepsCore(deps, leadId, beatId) {
|
|
32
|
+
const { leadsRoot } = deps;
|
|
33
|
+
const open = deps.openSync ?? openSync;
|
|
34
|
+
if (!LEAD_ID_RE.test(leadId) || !BEAT_ID_RE.test(beatId)) {
|
|
35
|
+
return { status: "unreadable" };
|
|
36
|
+
}
|
|
37
|
+
const guard = pathGuard(leadsRoot, join(leadId, "beats", beatId, "steps.jsonl"));
|
|
38
|
+
if (!guard.ok) {
|
|
39
|
+
return { status: "unreadable" };
|
|
40
|
+
}
|
|
41
|
+
let fd;
|
|
42
|
+
try {
|
|
43
|
+
fd = open(guard.absolute, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const code = err?.code;
|
|
47
|
+
if (code === "ENOENT") {
|
|
48
|
+
return { status: "ok", steps: [], unreadableLines: 0 };
|
|
49
|
+
}
|
|
50
|
+
return { status: "unreadable" };
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
if (!fstatSync(fd).isFile()) {
|
|
54
|
+
return { status: "unreadable" };
|
|
55
|
+
}
|
|
56
|
+
const realGuard = realPathGuard(leadsRoot, guard.absolute);
|
|
57
|
+
if (!realGuard.ok) {
|
|
58
|
+
return { status: "unreadable" };
|
|
59
|
+
}
|
|
60
|
+
const text = readFileSync(fd, "utf8");
|
|
61
|
+
const lines = text.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
62
|
+
const steps = [];
|
|
63
|
+
let unreadableLines = 0;
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
let parsed;
|
|
66
|
+
try {
|
|
67
|
+
parsed = JSON.parse(line);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
unreadableLines += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (isValidBeatStep(parsed)) {
|
|
74
|
+
steps.push(parsed);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
unreadableLines += 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { status: "ok", steps, unreadableLines };
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { status: "unreadable" };
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
closeSync(fd);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=beat-steps-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beat-steps-read.js","sourceRoot":"","sources":["../../../src/external/org/beat-steps-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type OrgFileReadDeps, type OrgFileReadCoreResult } from "./file-read.js";
|
|
2
|
+
export interface CharterBand {
|
|
3
|
+
id: "bugfix" | "maintenance" | "feature" | "architecture";
|
|
4
|
+
/** The exact §4.4 name a heading must contain, case-insensitively. */
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const CHARTER_BANDS: readonly CharterBand[];
|
|
8
|
+
export interface AuthorityBandView {
|
|
9
|
+
id: CharterBand["id"];
|
|
10
|
+
name: string;
|
|
11
|
+
declared: boolean;
|
|
12
|
+
/** The heading section's own prose, or `null` if not declared / the section is empty. */
|
|
13
|
+
text: string | null;
|
|
14
|
+
}
|
|
15
|
+
export type CharterAuthorityResult = {
|
|
16
|
+
measured: true;
|
|
17
|
+
bands: AuthorityBandView[];
|
|
18
|
+
declaredCount: number;
|
|
19
|
+
} | {
|
|
20
|
+
measured: false;
|
|
21
|
+
reason: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* For each of the 4 §4.4 bands: is it declared (a heading containing the
|
|
25
|
+
* canonical name, case- and slash-spacing-insensitively — mirrors
|
|
26
|
+
* `charter-validate.ts`'s `validateCharterBands` exactly), and if so, what
|
|
27
|
+
* prose follows it up to the next heading of any level (or EOF)? Each
|
|
28
|
+
* heading can satisfy at most ONE band, matching the upstream rule.
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractBandSections(charterMd: string): AuthorityBandView[];
|
|
31
|
+
export interface CharterAuthorityDeps extends OrgFileReadDeps {
|
|
32
|
+
/** Test seam — defaults to the real `orgFileReadCore`. */
|
|
33
|
+
readFn?: (deps: OrgFileReadDeps, relpath: string | undefined) => OrgFileReadCoreResult;
|
|
34
|
+
}
|
|
35
|
+
/** Pure core. `charterPath` is `org-chart.json`'s per-lead `charter_path`
|
|
36
|
+
* value (verbatim, as read by the caller) — compared against the literal
|
|
37
|
+
* default rather than resolved, per the header note above. */
|
|
38
|
+
export declare function charterAuthorityCore(deps: CharterAuthorityDeps, leadId: string, charterPath: string | undefined): CharterAuthorityResult;
|
|
39
|
+
//# sourceMappingURL=charter-authority-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charter-authority-read.d.ts","sourceRoot":"","sources":["../../../src/external/org/charter-authority-read.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEnG,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,GAAG,aAAa,GAAG,SAAS,GAAG,cAAc,CAAC;IAC1D,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAK/C,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA2DxC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAsB1E;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,qBAAqB,CAAC;CACxF;AAED;;+DAE+D;AAC/D,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,sBAAsB,CAcxB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/org/charter-authority-read.ts — per-band authority prose for the
|
|
3
|
+
* Lead Inventory page's AuthorityPanel (iterate-2026-09-08-lead-inventory-page,
|
|
4
|
+
* AC-4).
|
|
5
|
+
*
|
|
6
|
+
* Started as a plan to hand-port leadwright's `lib/charter-validate.ts`
|
|
7
|
+
* `validateCharterBands` verbatim into its own pinned mirror file — dropped
|
|
8
|
+
* per Architecture Review (GLM, low/proportionality, accepted): the 4 band
|
|
9
|
+
* names are already hardcoded in this repo (the vendored beat-step schema's
|
|
10
|
+
* `band` enum), so the §4.4 heading-detection logic is owned LOCALLY here
|
|
11
|
+
* instead of behind a second cross-repo pin. `CHARTER_BANDS` and the
|
|
12
|
+
* slash-spacing-normalized heading match below are the SAME algorithm
|
|
13
|
+
* `charter-validate.ts` runs (leadwright @
|
|
14
|
+
* db2938b308899b8cbca017b291c18696a54844b5), just not vendored — a rename
|
|
15
|
+
* of a §4.4 heading on leadwright's side is a silent divergence here, same
|
|
16
|
+
* disclosed-limitation posture as every other cross-repo read in this
|
|
17
|
+
* directory.
|
|
18
|
+
*
|
|
19
|
+
* Read this as PROSE, not authorization: a band's heading being present in
|
|
20
|
+
* the charter means the lead's charter puts that band in scope (the same
|
|
21
|
+
* signal `checkBeatStart`'s `charter-missing-band` gate uses to allow a beat
|
|
22
|
+
* to start at all) — it is NOT a per-band "may act alone" flag, which no
|
|
23
|
+
* field in leadwright's schemas or store carries (Internal Plan Review
|
|
24
|
+
* finding #1). Because `checkBeatStart` denies a beat outright when ANY
|
|
25
|
+
* band is missing, a lead with beats to show already has all 4 declared —
|
|
26
|
+
* the declared/missing count is real, disclosed information (a charter
|
|
27
|
+
* completeness signal), never dressed up as an authorization claim.
|
|
28
|
+
*
|
|
29
|
+
* Charter-path handling (Internal/External Plan Review): only the DEFAULT
|
|
30
|
+
* `<leadId>/charter.md` location is readable through the shared allowlist
|
|
31
|
+
* (`resolveOrgAllowlistedTarget`) that `orgFileReadCore` enforces — the same
|
|
32
|
+
* limitation `org-leads-composite.ts`'s `buildRole` and
|
|
33
|
+
* `existing-charters-read.ts` already have. A non-default `charter_path`
|
|
34
|
+
* degrades with an HONEST reason instead of silently reading the wrong
|
|
35
|
+
* file. Widening the allowlist to an arbitrary path is a separate,
|
|
36
|
+
* independently-reviewable change touching all three call sites, not
|
|
37
|
+
* squeezed into this iterate.
|
|
38
|
+
*/
|
|
39
|
+
import { orgFileReadCore } from "./file-read.js";
|
|
40
|
+
export const CHARTER_BANDS = [
|
|
41
|
+
{ id: "bugfix", name: "Bugfix / bekannter Defekt" },
|
|
42
|
+
{ id: "maintenance", name: "Kleine Pflege" },
|
|
43
|
+
{ id: "feature", name: "Neues Feature" },
|
|
44
|
+
{ id: "architecture", name: "Architektur / Grundsatz" },
|
|
45
|
+
];
|
|
46
|
+
const DEFAULT_CHARTER_RELPATH = "charter.md";
|
|
47
|
+
function normalizeSlashSpacing(value) {
|
|
48
|
+
return value.replace(/\s*\/\s*/g, "/");
|
|
49
|
+
}
|
|
50
|
+
function headingLines(lines) {
|
|
51
|
+
const out = [];
|
|
52
|
+
lines.forEach((line, index) => {
|
|
53
|
+
if (/^\s*#+\s/.test(line)) {
|
|
54
|
+
out.push({ index, normalizedText: normalizeSlashSpacing(line.toLowerCase()) });
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/** Same line-shape-skip technique `role-extract.ts` uses for its single
|
|
60
|
+
* paragraph, applied to a bounded slice of lines (one heading's section)
|
|
61
|
+
* instead of the whole document — text-processing only, not a markdown
|
|
62
|
+
* AST parse. Returns `null` for an effectively empty section.
|
|
63
|
+
*
|
|
64
|
+
* An UNBALANCED fence (an opening ``` or ~~~ with no matching close before
|
|
65
|
+
* the section ends) is treated as no fence at all for this section — every
|
|
66
|
+
* line, including the stray fence marker itself, is kept as ordinary prose
|
|
67
|
+
* (external code review, low/edge-case): the naive toggle would otherwise
|
|
68
|
+
* leave `inCodeFence` stuck `true` for the rest of the section, silently
|
|
69
|
+
* swallowing everything after a hand-edited charter's forgotten closer.
|
|
70
|
+
* "Fail toward showing more, never toward hiding data" — the same rule
|
|
71
|
+
* this file applies to a missing/empty section already. */
|
|
72
|
+
function extractSectionProse(sectionLines) {
|
|
73
|
+
const fenceLineCount = sectionLines.filter((line) => {
|
|
74
|
+
const trimmed = line.trim();
|
|
75
|
+
return trimmed.startsWith("```") || trimmed.startsWith("~~~");
|
|
76
|
+
}).length;
|
|
77
|
+
const fencesBalanced = fenceLineCount % 2 === 0;
|
|
78
|
+
const paragraphLines = [];
|
|
79
|
+
let inCodeFence = false;
|
|
80
|
+
for (const line of sectionLines) {
|
|
81
|
+
const trimmed = line.trim();
|
|
82
|
+
if (fencesBalanced && (trimmed.startsWith("```") || trimmed.startsWith("~~~"))) {
|
|
83
|
+
inCodeFence = !inCodeFence;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (inCodeFence)
|
|
87
|
+
continue;
|
|
88
|
+
if (/^\s*#+\s/.test(line))
|
|
89
|
+
continue; // nested heading — not part of this section's prose
|
|
90
|
+
if (trimmed.startsWith(">"))
|
|
91
|
+
continue;
|
|
92
|
+
if (trimmed.length === 0)
|
|
93
|
+
continue;
|
|
94
|
+
paragraphLines.push(trimmed);
|
|
95
|
+
}
|
|
96
|
+
const joined = paragraphLines.join(" ").trim();
|
|
97
|
+
return joined.length > 0 ? joined : null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* For each of the 4 §4.4 bands: is it declared (a heading containing the
|
|
101
|
+
* canonical name, case- and slash-spacing-insensitively — mirrors
|
|
102
|
+
* `charter-validate.ts`'s `validateCharterBands` exactly), and if so, what
|
|
103
|
+
* prose follows it up to the next heading of any level (or EOF)? Each
|
|
104
|
+
* heading can satisfy at most ONE band, matching the upstream rule.
|
|
105
|
+
*/
|
|
106
|
+
export function extractBandSections(charterMd) {
|
|
107
|
+
const lines = charterMd.split(/\r?\n/);
|
|
108
|
+
const headings = headingLines(lines);
|
|
109
|
+
const usedHeadingIndices = new Set();
|
|
110
|
+
return CHARTER_BANDS.map((band) => {
|
|
111
|
+
const normalizedName = normalizeSlashSpacing(band.name.toLowerCase());
|
|
112
|
+
const match = headings.find((h) => !usedHeadingIndices.has(h.index) && h.normalizedText.includes(normalizedName));
|
|
113
|
+
if (!match) {
|
|
114
|
+
return { id: band.id, name: band.name, declared: false, text: null };
|
|
115
|
+
}
|
|
116
|
+
usedHeadingIndices.add(match.index);
|
|
117
|
+
const nextHeadingIndex = headings
|
|
118
|
+
.map((h) => h.index)
|
|
119
|
+
.filter((idx) => idx > match.index)
|
|
120
|
+
.sort((a, b) => a - b)[0];
|
|
121
|
+
const sectionEnd = nextHeadingIndex ?? lines.length;
|
|
122
|
+
const sectionLines = lines.slice(match.index + 1, sectionEnd);
|
|
123
|
+
return { id: band.id, name: band.name, declared: true, text: extractSectionProse(sectionLines) };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** Pure core. `charterPath` is `org-chart.json`'s per-lead `charter_path`
|
|
127
|
+
* value (verbatim, as read by the caller) — compared against the literal
|
|
128
|
+
* default rather than resolved, per the header note above. */
|
|
129
|
+
export function charterAuthorityCore(deps, leadId, charterPath) {
|
|
130
|
+
if (charterPath !== undefined && charterPath !== DEFAULT_CHARTER_RELPATH) {
|
|
131
|
+
return { measured: false, reason: "custom charter path not yet supported by this panel" };
|
|
132
|
+
}
|
|
133
|
+
const readFn = deps.readFn ?? orgFileReadCore;
|
|
134
|
+
const result = readFn(deps, `${leadId}/${DEFAULT_CHARTER_RELPATH}`);
|
|
135
|
+
if (result.status !== 200 || result.kind !== "file") {
|
|
136
|
+
return { measured: false, reason: "not readable at the default charter path" };
|
|
137
|
+
}
|
|
138
|
+
const bands = extractBandSections(result.body.toString("utf8"));
|
|
139
|
+
const declaredCount = bands.filter((b) => b.declared).length;
|
|
140
|
+
return { measured: true, bands, declaredCount };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=charter-authority-read.js.map
|