@svenroth-ai/shipwright 0.27.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-CqCQUDtp.js → EmbeddedTerminal-4xgNUBUu.js} +19 -19
- package/client/dist/assets/{abnfDiagram-VRR7QNED-DX2objTP.js → abnfDiagram-VRR7QNED-BdCNbaqc.js} +1 -1
- package/client/dist/assets/{arc-DQmjbsFU.js → arc-DoZTTE1N.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DAvCsPCW.js → architectureDiagram-ZJ3FMSHR-DFTG4KtO.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-DC-dlyYI.js → blockDiagram-677ZJIJ3-C34UBjOB.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-DSlmXfhE.js → c4Diagram-LMCZKHZV-CbqAB1Ou.js} +1 -1
- package/client/dist/assets/channel-DBcZw7Kn.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-C111EHL6.js → chunk-2Q5K7J3B-4N6AnmBJ.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-DrCYs2XG.js → chunk-32BRIVSS-Cs67LiCy.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-DIejoaXS.js → chunk-5VM5RSS4-Bwd7rtD3.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-CGWNeH2g.js → chunk-EX3LRPZG-CQqGfptD.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-CCH0SRFY.js → chunk-JWPE2WC7-ClvKd4PN.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-B3OpZGRv.js → chunk-MOJQB5TN-Cwvj8GE1.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-BKhdp_8v.js → chunk-RYQCIY6F-DrWMx37d.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-B6Bu8x1y.js → chunk-V7JOEXUC-CYFfa4PY.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN-OgFi2_iB.js → chunk-VR4S4FIN-B5eWtesm.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-xyjuuhxl.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-BQIH3SCK.js → cose-bilkent-JH36ORCC-C76Yia6h.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-oyLAz8te.js → cynefin-VYW2F7L2-pJe7rdTi.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-DoLCsH0l.js → cynefinDiagram-TSTJHNR4-EeHQ7dYV.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-D7djx1_Y.js → dagre-VKFMJZFB-VXOY6IHR.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-DFuYE0Vf.js → diagram-FQU43EPY-DW_-leqw.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-CffCZVXk.js → diagram-G47NLZAW-C_hsLD4u.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-BhrHtUlt.js → diagram-NH7WQ7WH-CbeQuO_f.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-CwQPbOn0.js → diagram-OA4YK3LP-DRHY5d_c.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-abtYnYqH.js → diagram-WEI45ONY-B87OYR_S.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DfV7gT4m.js → ebnfDiagram-CCIWWBDH-B8Z8WHF6.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-vtbCprgH.js → erDiagram-Q63AITRT-DaD7oa9H.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CVCgcyDF.js → flowDiagram-23GEKE2U-GrMVpsea.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-BclyOgMb.js → ganttDiagram-NO4QXBWP-K3X0DYBa.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-BXT4rIKj.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-Dr4mN24J.js → infoDiagram-FWYZ7A6U-Fi8fQ95G.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-BBUFWq5C.js → ishikawaDiagram-FXEZZL3T-CrN7QJzt.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-CmclipcQ.js → journeyDiagram-5HDEW3XC-XHIsl7rM.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-eIzUeZ03.js → kanban-definition-HUTT4EX6-A6HJqHw7.js} +1 -1
- package/client/dist/assets/{linear-DGiT7uKK.js → linear-D1vF9IQB.js} +1 -1
- package/client/dist/assets/{mermaid.core-BcLNGbxW.js → mermaid.core-D6w9zlA0.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-C4ANnNiP.js → mindmap-definition-LN4V7U3C-CxRkUj6Z.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-DnMeh3Yh.js → pegDiagram-2B236MQR-Bs9dp-8a.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-CKV_rkhF.js → pieDiagram-ENE6RG2P-DBWILzB8.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-BuUsGwHh.js → quadrantDiagram-ABIIQ3AL-DrCVJJx6.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-BwwdKnFL.js → railroadDiagram-RFXS5EU6-BdPW2dNf.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-CpQZouJV.js → requirementDiagram-TGXJPOKE-Bj_g3tC5.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-4fnDUNVa.js → sankeyDiagram-HTMAVEWB-BGL9NnsS.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-BOcaWlM0.js → sequenceDiagram-DBY2YBRQ-DEirxTZY.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-_pv-9R0c.js → sizeCapture-X5ZJPWSS-BtLrvrea.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-CFwCOonY.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-DFa2tzxu.js → swimlanes-5IMT3BWC-PMRQzNhU.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-DMLbRFiO.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-rhGYElgn.js → timeline-definition-FHXFAJF6-CnBKJtD_.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-BoGjRxyA.js → vennDiagram-L72KCM5P-BYmiJYoh.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-D-IGv5bH.js → wardleyDiagram-EHGQE667-DU7vW8q3.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-D9PFTCfm.js → xychartDiagram-FW5EYKEG-BEtPvBSU.js} +1 -1
- package/client/dist/index.html +2 -2
- package/lib/preflight.mjs +24 -5
- 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-store.d.ts +46 -0
- package/server/dist/core/sdk-sessions-store.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-store.js +1 -0
- 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/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.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/_types.d.ts +23 -0
- package/server/dist/external/inbox/_types.d.ts.map +1 -1
- package/server/dist/external/inbox/_types.js +8 -5
- package/server/dist/external/inbox/_types.js.map +1 -1
- 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 +15 -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 +9 -0
- package/server/dist/external/launch/claim-holder-gate.d.ts.map +1 -1
- package/server/dist/external/launch/claim-holder-gate.js +10 -2
- package/server/dist/external/launch/claim-holder-gate.js.map +1 -1
- 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 +76 -109
- 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/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 +10 -2
- package/server/dist/external/org/mount.d.ts.map +1 -1
- package/server/dist/external/org/mount.js +6 -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/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 +19 -4
- 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 +15 -0
- package/server/dist/routes/diagnostics.d.ts.map +1 -1
- package/server/dist/routes/diagnostics.js +1 -0
- 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-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 +11 -2
- package/server/dist/routes/org.d.ts.map +1 -1
- package/server/dist/routes/org.js +50 -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 +14 -0
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +11 -0
- package/server/dist/terminal/pty-manager.js.map +1 -1
- 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 +57 -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-BfmIcrp7.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-HfUQZ6Uc.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-HfUQZ6Uc.js +0 -1
- package/client/dist/assets/index-CKU9dY18.css +0 -1
- package/client/dist/assets/index-DOMl6atu.js +0 -847
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-srkiu3Ib.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-Dq-0K9Zm.js +0 -8
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* core/codex-thread-discovery.ts — Codex Light §4's missing piece: how a
|
|
3
|
+
* fresh Codex launch's `threadId` actually gets captured. v1 launches Codex
|
|
4
|
+
* as a plain interactive TUI in a pty (§2.2) — there is no app-server call
|
|
5
|
+
* (deferred to Stage 2) and no `--session-id`-equivalent flag Codex accepts
|
|
6
|
+
* at the top level (`codex --help`, verified live against an installed
|
|
7
|
+
* Codex CLI: no such flag exists), so the id must be DISCOVERED after the
|
|
8
|
+
* fact, filename-first — the exact pattern CLAUDE.md rule 3 already uses
|
|
9
|
+
* for Claude's own JSONL discovery.
|
|
10
|
+
*
|
|
11
|
+
* Verified live (2026-09-16, codex-cli 0.147.0) against a real installed
|
|
12
|
+
* Codex CLI: every session — interactive or subagent — writes a rollout
|
|
13
|
+
* file to `~/.codex/sessions/<local-YYYY>/<local-MM>/<local-DD>/rollout-
|
|
14
|
+
* <local-ISO-with-dashes-for-colons>-<thread-id>.jsonl`, whose FIRST line
|
|
15
|
+
* is always `{"type":"session_meta","payload":{"id":"<thread-id>","cwd":
|
|
16
|
+
* "<abs-path>",...}}` — the thread id is in the filename AND the first
|
|
17
|
+
* line's payload, mirroring the filename-first + first-line-sanity-check
|
|
18
|
+
* shape Claude's own discovery already uses. `cwd` is the launch working
|
|
19
|
+
* directory verbatim (OS-native separators), letting us match a rollout
|
|
20
|
+
* file to the task that spawned it without Codex ever needing to accept a
|
|
21
|
+
* caller-supplied id.
|
|
22
|
+
*
|
|
23
|
+
* Consumed by `CodexTaskWatcher` (`codex-task-watcher.ts`): on every tick,
|
|
24
|
+
* a live Codex task with no `threadId` yet gets one discovery attempt;
|
|
25
|
+
* `null` is not an error (the rollout file may not have flushed to disk
|
|
26
|
+
* yet, or Codex may still be starting up) — the caller just retries next
|
|
27
|
+
* tick. Once found, `threadId` is patched onto the task record and the
|
|
28
|
+
* §4 resume branch (`runtime-chokepoint.ts`'s `resume = Boolean(task.
|
|
29
|
+
* threadId)`) starts working on the task's next launch.
|
|
30
|
+
*
|
|
31
|
+
* Known, accepted limitation (doubt-review, disposition: documented, not
|
|
32
|
+
* fixed): matching is purely (cwd, launch-time window) — there is no
|
|
33
|
+
* possession/identity proof tying a candidate rollout file to THIS
|
|
34
|
+
* webui-spawned pty specifically. An operator manually running `codex` in
|
|
35
|
+
* the same project directory, in another terminal, within the same
|
|
36
|
+
* discovery window would produce an indistinguishable rollout file; if it
|
|
37
|
+
* happens to be the earliest unclaimed match, it gets bound to the wrong
|
|
38
|
+
* task (and, once `threadId` is set, discovery never re-runs for that
|
|
39
|
+
* task, so the mistake is not self-correcting). Accepted because it needs
|
|
40
|
+
* an external actor deliberately racing the exact window, has no
|
|
41
|
+
* destructive blast radius (a wrong `threadId` just makes `codex resume`
|
|
42
|
+
* on the Resume button open the wrong-but-still-real thread, not corrupt
|
|
43
|
+
* anything), and there is no stronger signal Codex's CLI exposes to
|
|
44
|
+
* disambiguate against in v1.
|
|
45
|
+
*/
|
|
46
|
+
import fsPromises from "node:fs/promises";
|
|
47
|
+
import os from "node:os";
|
|
48
|
+
import path from "node:path";
|
|
49
|
+
const ROLLOUT_RE = /^rollout-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})-([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\.jsonl$/;
|
|
50
|
+
/**
|
|
51
|
+
* Disposition (doubt-review, low-severity, accepted not fixed): if a
|
|
52
|
+
* rollout file's first `session_meta` JSON line ever exceeds this many
|
|
53
|
+
* bytes, `JSON.parse` on the truncated head throws, the candidate is
|
|
54
|
+
* skipped, and — with no larger-buffer retry — that task's discovery
|
|
55
|
+
* fails identically on every later tick (permanent, not degrading: the
|
|
56
|
+
* `resume` branch never fires and every "Resume" click silently
|
|
57
|
+
* relaunches fresh). Accepted because the verified real `session_meta`
|
|
58
|
+
* line (module header) is compact, and 4KB is a generous margin over it;
|
|
59
|
+
* revisit with a retry-on-parse-failure if a future Codex CLI version
|
|
60
|
+
* ever grows this payload.
|
|
61
|
+
*/
|
|
62
|
+
const HEAD_BYTES = 4096;
|
|
63
|
+
export function codexSessionsRoot(deps) {
|
|
64
|
+
return path.join(deps.homeDir(), ".codex", "sessions");
|
|
65
|
+
}
|
|
66
|
+
function normalizeCwd(p) {
|
|
67
|
+
return p.replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase();
|
|
68
|
+
}
|
|
69
|
+
/** The launch day plus a one-day hedge either side, against a local-midnight folder-boundary race. */
|
|
70
|
+
function dayFolders(since) {
|
|
71
|
+
const days = [-1, 0, 1].map((offset) => {
|
|
72
|
+
const d = new Date(since.getTime());
|
|
73
|
+
d.setDate(d.getDate() + offset);
|
|
74
|
+
const y = String(d.getFullYear());
|
|
75
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
76
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
77
|
+
return path.join(y, m, day);
|
|
78
|
+
});
|
|
79
|
+
return [...new Set(days)];
|
|
80
|
+
}
|
|
81
|
+
function parseFilenameTimestamp(stamp) {
|
|
82
|
+
// "2026-09-16T07-32-17" -> "2026-09-16T07:32:17" (local — no zone suffix,
|
|
83
|
+
// matching how `new Date()` already parses a zone-less ISO string: local).
|
|
84
|
+
const iso = stamp.replace(/T(\d{2})-(\d{2})-(\d{2})$/, "T$1:$2:$3");
|
|
85
|
+
const t = new Date(iso).getTime();
|
|
86
|
+
return Number.isNaN(t) ? 0 : t;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Best-effort, filename-first discovery of the thread id a fresh Codex
|
|
90
|
+
* launch produced. Returns `null` (not an error) when nothing matches yet.
|
|
91
|
+
*/
|
|
92
|
+
export async function discoverCodexThreadId(args, deps) {
|
|
93
|
+
const since = new Date(args.sinceIso);
|
|
94
|
+
if (Number.isNaN(since.getTime()))
|
|
95
|
+
return null;
|
|
96
|
+
const sinceMs = since.getTime() - 5_000; // small clock-skew grace
|
|
97
|
+
const wantCwd = normalizeCwd(args.cwd);
|
|
98
|
+
const root = codexSessionsRoot(deps);
|
|
99
|
+
const candidates = [];
|
|
100
|
+
for (const folder of dayFolders(since)) {
|
|
101
|
+
const dir = path.join(root, folder);
|
|
102
|
+
let names;
|
|
103
|
+
try {
|
|
104
|
+
names = await deps.readdir(dir);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
for (const name of names) {
|
|
110
|
+
const m = ROLLOUT_RE.exec(name);
|
|
111
|
+
if (!m)
|
|
112
|
+
continue;
|
|
113
|
+
const threadId = m[2];
|
|
114
|
+
if (args.excludeThreadIds?.has(threadId))
|
|
115
|
+
continue;
|
|
116
|
+
const ts = parseFilenameTimestamp(m[1]);
|
|
117
|
+
if (ts < sinceMs)
|
|
118
|
+
continue;
|
|
119
|
+
candidates.push({ ts, threadId, file: path.join(dir, name) });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
candidates.sort((a, b) => a.ts - b.ts);
|
|
123
|
+
for (const candidate of candidates) {
|
|
124
|
+
let head;
|
|
125
|
+
try {
|
|
126
|
+
head = await deps.readHead(candidate.file, HEAD_BYTES);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const firstLine = head.split("\n", 1)[0];
|
|
132
|
+
let parsed;
|
|
133
|
+
try {
|
|
134
|
+
parsed = JSON.parse(firstLine);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!parsed || typeof parsed !== "object")
|
|
140
|
+
continue;
|
|
141
|
+
if (parsed.type !== "session_meta")
|
|
142
|
+
continue;
|
|
143
|
+
const payload = parsed.payload;
|
|
144
|
+
if (!payload || typeof payload !== "object")
|
|
145
|
+
continue;
|
|
146
|
+
const id = payload.id;
|
|
147
|
+
const cwd = payload.cwd;
|
|
148
|
+
if (typeof id === "string" && typeof cwd === "string" && normalizeCwd(cwd) === wantCwd) {
|
|
149
|
+
return id;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
export const defaultCodexThreadDiscoveryDeps = {
|
|
155
|
+
readdir: (dir) => fsPromises.readdir(dir),
|
|
156
|
+
readHead: async (filePath, maxBytes) => {
|
|
157
|
+
const fh = await fsPromises.open(filePath, "r");
|
|
158
|
+
try {
|
|
159
|
+
const buf = Buffer.alloc(maxBytes);
|
|
160
|
+
const { bytesRead } = await fh.read(buf, 0, maxBytes, 0);
|
|
161
|
+
return buf.toString("utf-8", 0, bytesRead);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await fh.close();
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
homeDir: () => os.homedir(),
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=codex-thread-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-thread-discovery.js","sourceRoot":"","sources":["../../src/core/codex-thread-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default reclamation age (10 min) — deliberately much shorter than
|
|
3
|
+
* `snapshot-tmp-sweep.ts`'s 1h default: this file holds a LIVE credential,
|
|
4
|
+
* not just terminal cell-state, and a normal launch's own cleanup deletes it
|
|
5
|
+
* within seconds of the `claude` invocation exiting.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_CODEXTENDER_AUTH_TMP_MAX_AGE_MS: number;
|
|
8
|
+
export interface CodextenderAuthFileSweepDeps {
|
|
9
|
+
readdir: (dir: string) => Promise<string[]>;
|
|
10
|
+
stat: (p: string) => Promise<{
|
|
11
|
+
mtimeMs: number;
|
|
12
|
+
}>;
|
|
13
|
+
unlink: (p: string) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export interface CodextenderAuthFileSweepOpts {
|
|
16
|
+
dir: string;
|
|
17
|
+
/** Reclaim tmp files whose mtime is older than this. Default 10 min. */
|
|
18
|
+
maxAgeMs?: number;
|
|
19
|
+
deps?: Partial<CodextenderAuthFileSweepDeps>;
|
|
20
|
+
/** Injected for tests. Defaults to Date.now. */
|
|
21
|
+
now?: () => number;
|
|
22
|
+
logWarn?: (msg: string) => void;
|
|
23
|
+
logInfo?: (msg: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface CodextenderAuthFileSweepResult {
|
|
26
|
+
/** stale credential files unlinked. */
|
|
27
|
+
deleted: number;
|
|
28
|
+
/** stat/unlink failures (kept going). */
|
|
29
|
+
errors: number;
|
|
30
|
+
/** files younger than the cutoff, left in place (still in use). */
|
|
31
|
+
preserved: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Age-gated sweep of orphaned `codextender-auth-*.tmp` credential files.
|
|
35
|
+
* Best-effort: dir-read failure and per-file failures are non-fatal (they
|
|
36
|
+
* log a warn and never throw) — the same posture `sweepOrphanSnapshotTmp`
|
|
37
|
+
* takes, for the same reason (a sweep failure must never crash boot or the
|
|
38
|
+
* periodic timer).
|
|
39
|
+
*/
|
|
40
|
+
export declare function sweepOrphanCodextenderAuthFiles(opts: CodextenderAuthFileSweepOpts): Promise<CodextenderAuthFileSweepResult>;
|
|
41
|
+
//# sourceMappingURL=codextender-auth-file-sweep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codextender-auth-file-sweep.d.ts","sourceRoot":"","sources":["../../src/core/codextender-auth-file-sweep.ts"],"names":[],"mappings":"AA8BA;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,QAAiB,CAAC;AAEtE,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC7C,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,8BAA8B;IAC7C,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,8BAA8B,CAAC,CAoDzC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* codextender-auth-file-sweep.ts — bounded reclamation of orphaned
|
|
3
|
+
* `codextender-auth-*.tmp` credential files (PR-review round 10, iterate-
|
|
4
|
+
* 2026-09-23; Sven's own decision on the CI-BLOCKed design question).
|
|
5
|
+
*
|
|
6
|
+
* `writeCodextenderAuthTokenFile` (launcher-codextender.ts) writes the
|
|
7
|
+
* Codextender proxy's bearer token to a private `0o600` temp file once per
|
|
8
|
+
* launch; the generated command's cleanup suffix deletes it right after the
|
|
9
|
+
* `claude` invocation exits. If the command is never executed (copied out
|
|
10
|
+
* instead of auto-run), the pty is killed before the suffix runs, or launch
|
|
11
|
+
* fails before a command is ever returned to run, that delete step never
|
|
12
|
+
* fires and the file is stranded — the exact gap the required `PR Review`
|
|
13
|
+
* CI gate BLOCKed twice on. Mirrors `snapshot-tmp-sweep.ts`'s shape (same
|
|
14
|
+
* age-gated, best-effort, injectable-deps design) for the same reason: a
|
|
15
|
+
* live write's own cleanup runs within seconds, so anything older than the
|
|
16
|
+
* cutoff is provably orphaned — no active-task veto needed.
|
|
17
|
+
*
|
|
18
|
+
* Wired into the boot + periodic sweep in index.ts alongside the scrollback
|
|
19
|
+
* and snapshot-tmp sweeps. Unlike those two (scoped to the terminal
|
|
20
|
+
* scrollback dir), this one scans `os.tmpdir()` — where
|
|
21
|
+
* `writeCodextenderAuthTokenFile` actually writes — so `dir` is threaded
|
|
22
|
+
* through for testability rather than hardcoded.
|
|
23
|
+
*/
|
|
24
|
+
import * as fsAsync from "node:fs/promises";
|
|
25
|
+
import * as path from "node:path";
|
|
26
|
+
/** Matches `codextender-auth-<uuid>.tmp`. Bounded — ReDoS-safe. */
|
|
27
|
+
const CODEXTENDER_AUTH_TMP_RE = /^codextender-auth-[0-9a-fA-F-]{36}\.tmp$/;
|
|
28
|
+
/**
|
|
29
|
+
* Default reclamation age (10 min) — deliberately much shorter than
|
|
30
|
+
* `snapshot-tmp-sweep.ts`'s 1h default: this file holds a LIVE credential,
|
|
31
|
+
* not just terminal cell-state, and a normal launch's own cleanup deletes it
|
|
32
|
+
* within seconds of the `claude` invocation exiting.
|
|
33
|
+
*/
|
|
34
|
+
export const DEFAULT_CODEXTENDER_AUTH_TMP_MAX_AGE_MS = 10 * 60 * 1000;
|
|
35
|
+
const defaultDeps = {
|
|
36
|
+
readdir: (dir) => fsAsync.readdir(dir),
|
|
37
|
+
stat: (p) => fsAsync.stat(p),
|
|
38
|
+
unlink: (p) => fsAsync.unlink(p),
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Age-gated sweep of orphaned `codextender-auth-*.tmp` credential files.
|
|
42
|
+
* Best-effort: dir-read failure and per-file failures are non-fatal (they
|
|
43
|
+
* log a warn and never throw) — the same posture `sweepOrphanSnapshotTmp`
|
|
44
|
+
* takes, for the same reason (a sweep failure must never crash boot or the
|
|
45
|
+
* periodic timer).
|
|
46
|
+
*/
|
|
47
|
+
export async function sweepOrphanCodextenderAuthFiles(opts) {
|
|
48
|
+
const deps = { ...defaultDeps, ...opts.deps };
|
|
49
|
+
const now = opts.now ?? Date.now;
|
|
50
|
+
const logWarn = opts.logWarn ?? ((m) => console.warn(m));
|
|
51
|
+
const logInfo = opts.logInfo ?? ((m) => console.log(m));
|
|
52
|
+
const cutoff = now() - (opts.maxAgeMs ?? DEFAULT_CODEXTENDER_AUTH_TMP_MAX_AGE_MS);
|
|
53
|
+
const result = { deleted: 0, errors: 0, preserved: 0 };
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = await deps.readdir(opts.dir);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
// ENOENT = dir not created yet (benign). Any other error (EACCES/EPERM/
|
|
60
|
+
// EIO) is a real operational failure that leaves credential files on
|
|
61
|
+
// disk — surface it so the gap stays visible; this function never throws.
|
|
62
|
+
if (err.code !== "ENOENT") {
|
|
63
|
+
logWarn(`[codextender-auth-sweep] readdir failed (${err.message}); orphan credential files may persist`);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
for (const name of entries) {
|
|
68
|
+
if (!CODEXTENDER_AUTH_TMP_RE.test(name))
|
|
69
|
+
continue;
|
|
70
|
+
const full = path.join(opts.dir, name);
|
|
71
|
+
let mtimeMs;
|
|
72
|
+
try {
|
|
73
|
+
mtimeMs = (await deps.stat(full)).mtimeMs;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
result.errors++;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (mtimeMs >= cutoff) {
|
|
80
|
+
result.preserved++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
await deps.unlink(full);
|
|
85
|
+
result.deleted++;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
result.errors++;
|
|
89
|
+
logWarn(`[codextender-auth-sweep] unlink failed for ${name}: ${err.message}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (result.deleted > 0 || result.errors > 0) {
|
|
93
|
+
logInfo(`[codextender-auth-sweep] orphan sweep: deleted=${result.deleted} errors=${result.errors} preserved=${result.preserved}`);
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=codextender-auth-file-sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codextender-auth-file-sweep.js","sourceRoot":"","sources":["../../src/core/codextender-auth-file-sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codextenderPort` is persisted/read as arbitrary JSON (PUT /api/settings
|
|
3
|
+
* accepts an unvalidated body; a hand-edited settings.json is untyped on
|
|
4
|
+
* disk too) before ever reaching here, so `port: number`'s compile-time
|
|
5
|
+
* type is not a runtime guarantee. Both probes below MUST reject anything
|
|
6
|
+
* outside a real TCP port before interpolating it into a URL — a value
|
|
7
|
+
* like `"4000@attacker.example"` would otherwise redirect the request via
|
|
8
|
+
* URL userinfo-authority confusion (PR-review BLOCK, iterate-2026-09-23
|
|
9
|
+
* fifth round). This is the enforcement point regardless of how an invalid
|
|
10
|
+
* value got in; `routes/settings.ts`'s PUT-time rejection (same finding)
|
|
11
|
+
* is defense-in-depth on top of it, not a substitute for it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidCodextenderPort(value: unknown): value is number;
|
|
14
|
+
export interface CodextenderModelEntry {
|
|
15
|
+
slug: string;
|
|
16
|
+
display_name: string;
|
|
17
|
+
/** LiteLLM's declared context window for this alias (its `model_info.
|
|
18
|
+
* max_input_tokens`), when the proxy's `/v1/models` response carries one.
|
|
19
|
+
* Absent on an older/unpatched proxy — callers must treat that the same
|
|
20
|
+
* as "unknown", never assume a number. */
|
|
21
|
+
max_input_tokens?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CodextenderProbeResult {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
models: CodextenderModelEntry[];
|
|
26
|
+
}
|
|
27
|
+
export interface CodextenderProbeDeps {
|
|
28
|
+
/** Test seam — defaults to the real global `fetch`. */
|
|
29
|
+
fetchFn?: typeof fetch;
|
|
30
|
+
/** Probe timeout in ms. Default 1500 — short enough that a launch or a
|
|
31
|
+
* datalist render never feels stuck on an unreachable proxy. */
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
/** Test seam — defaults to `resolveCodextenderAuthToken()` (reads
|
|
34
|
+
* `process.env.CODEXTENDER_AUTH_TOKEN`, no built-in fallback). */
|
|
35
|
+
authToken?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* `GET http://127.0.0.1:<port>/v1/models` with the configured Codextender
|
|
39
|
+
* master-key bearer token (`deps.authToken` or `resolveCodextenderAuthToken()`).
|
|
40
|
+
* Never throws — an unconfigured token, any network error, non-2xx status,
|
|
41
|
+
* timeout, or malformed body all resolve `{ok: false, models: []}` rather
|
|
42
|
+
* than rejecting, so callers never need a try/catch.
|
|
43
|
+
*
|
|
44
|
+
* LiteLLM's `/v1/models` response is OpenAI-shaped (`{"data": [{"id":
|
|
45
|
+
* "sol"}, ...]}`) — it carries no separate display name, so `display_name`
|
|
46
|
+
* is set to the same slug (matches `codex-models-probe.ts`'s
|
|
47
|
+
* `CodexModelCatalogEntry` shape for the client's shared consumer).
|
|
48
|
+
*/
|
|
49
|
+
export declare function probeCodextenderModels(port: number, deps?: CodextenderProbeDeps): Promise<CodextenderProbeResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Resolves the REAL context window for the Codextender alias a task is
|
|
52
|
+
* about to launch with, straight from the proxy's own `/v1/models` response
|
|
53
|
+
* (operator finding, 2026-09-26, live Codextender iterate test) — never a
|
|
54
|
+
* number hardcoded here a second time. Claude Code assumes a 200K context
|
|
55
|
+
* window for any model id it doesn't recognize (the Codex alias is one) and
|
|
56
|
+
* proactively over-compacts against that wrong, much-too-small ceiling; the
|
|
57
|
+
* fix is `launcher-codextender.ts` setting `CLAUDE_CODE_MAX_CONTEXT_TOKENS`
|
|
58
|
+
* from THIS value, so a change to codextender's own declared window (its
|
|
59
|
+
* `config.py` `model_info.max_input_tokens`) can never drift out of sync
|
|
60
|
+
* with what webui tells Claude Code — both repos read the same live number.
|
|
61
|
+
*
|
|
62
|
+
* Never throws, same contract as `probeCodextenderModels` — resolves
|
|
63
|
+
* `undefined` (not a guessed fallback) when the probe fails, the alias
|
|
64
|
+
* isn't in the response, or the response carries no usable
|
|
65
|
+
* `max_input_tokens` for it (an older/unpatched proxy). The caller's
|
|
66
|
+
* contract for `undefined` is "leave `CLAUDE_CODE_MAX_CONTEXT_TOKENS`
|
|
67
|
+
* unset", which is the conservative, safe default — Claude Code's own 200K
|
|
68
|
+
* fallback — rather than risking an inflated ceiling that starves
|
|
69
|
+
* compaction entirely.
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolveCodextenderMaxContextTokens(port: number, model: string | undefined, deps?: CodextenderProbeDeps): Promise<number | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* `GET http://127.0.0.1:<port>/health/liveliness` — no auth header
|
|
74
|
+
* required (confirmed live against a real local LiteLLM proxy). This is
|
|
75
|
+
* the AC8 pre-flight probe: it only needs to know the proxy process is up
|
|
76
|
+
* and answering, not what it serves. Never throws — same
|
|
77
|
+
* never-reject contract as `probeCodextenderModels`.
|
|
78
|
+
*/
|
|
79
|
+
export declare function probeCodextenderLiveness(port: number, deps?: CodextenderProbeDeps): Promise<boolean>;
|
|
80
|
+
//# sourceMappingURL=codextender-proxy-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codextender-proxy-probe.d.ts","sourceRoot":"","sources":["../../src/core/codextender-proxy-probe.ts"],"names":[],"mappings":"AAmCA;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAOtE;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB;;;+CAG2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB;qEACiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;uEACmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAmCjC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM7B;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* codextender-proxy-probe — HTTP probes of the local Codextender (LiteLLM)
|
|
3
|
+
* proxy (Codextender integration spec Part B.3/B.5, re-verified live
|
|
4
|
+
* 2026-09-23).
|
|
5
|
+
*
|
|
6
|
+
* Two distinct endpoints, deliberately not collapsed into one probe:
|
|
7
|
+
* - `probeCodextenderLiveness` -> `GET /health/liveliness`, no auth
|
|
8
|
+
* header. This is the AC8 pre-flight check (`runtime-chokepoint.ts`'s
|
|
9
|
+
* `checkCodextenderProxyAvailable` default, and its fork-route
|
|
10
|
+
* equivalent in `external/tasks/fork.ts`) — a launch/fork only needs to
|
|
11
|
+
* know the proxy is UP, not what it serves.
|
|
12
|
+
* - `probeCodextenderModels` -> `GET /v1/models`, WITH
|
|
13
|
+
* `Authorization: Bearer <token>` where `<token>` comes from
|
|
14
|
+
* `process.env.CODEXTENDER_AUTH_TOKEN` (`resolveCodextenderAuthToken()`
|
|
15
|
+
* in `launcher-codextender.ts` — no built-in default, PR-review BLOCK,
|
|
16
|
+
* iterate-2026-09-23) — an unconfigured token degrades this probe to
|
|
17
|
+
* `{ok: false}` the same as an unreachable proxy, rather than sending a
|
|
18
|
+
* baked-in value. Confirmed live against a real local LiteLLM proxy: an
|
|
19
|
+
* unauthenticated `/v1/models` request returns `500` (a LiteLLM quirk,
|
|
20
|
+
* not a clean 401), so omitting the header makes every probe look like
|
|
21
|
+
* a hard failure regardless. Backs the cached `/api/codextender-models`
|
|
22
|
+
* route (`routes/codextender-models.ts`), which wraps this probe in a
|
|
23
|
+
* TTL cache mirroring `codex-models.ts`'s shape.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately no CLI shell-out (unlike `codex-models-probe.ts`) — the
|
|
26
|
+
* proxy already speaks these two endpoints natively (LiteLLM's own
|
|
27
|
+
* built-in routes), so plain HTTP GETs are both the cheapest check and the
|
|
28
|
+
* datalist's real source.
|
|
29
|
+
*/
|
|
30
|
+
import { DEFAULT_CODEXTENDER_MODEL_ALIAS, resolveCodextenderAuthToken, } from "./launcher-codextender.js";
|
|
31
|
+
/**
|
|
32
|
+
* `codextenderPort` is persisted/read as arbitrary JSON (PUT /api/settings
|
|
33
|
+
* accepts an unvalidated body; a hand-edited settings.json is untyped on
|
|
34
|
+
* disk too) before ever reaching here, so `port: number`'s compile-time
|
|
35
|
+
* type is not a runtime guarantee. Both probes below MUST reject anything
|
|
36
|
+
* outside a real TCP port before interpolating it into a URL — a value
|
|
37
|
+
* like `"4000@attacker.example"` would otherwise redirect the request via
|
|
38
|
+
* URL userinfo-authority confusion (PR-review BLOCK, iterate-2026-09-23
|
|
39
|
+
* fifth round). This is the enforcement point regardless of how an invalid
|
|
40
|
+
* value got in; `routes/settings.ts`'s PUT-time rejection (same finding)
|
|
41
|
+
* is defense-in-depth on top of it, not a substitute for it.
|
|
42
|
+
*/
|
|
43
|
+
export function isValidCodextenderPort(value) {
|
|
44
|
+
return (typeof value === "number" &&
|
|
45
|
+
Number.isInteger(value) &&
|
|
46
|
+
value >= 1 &&
|
|
47
|
+
value <= 65535);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* PR-review preflight BLOCK (round 14, 2026-09-26) — `max_input_tokens`
|
|
51
|
+
* lives under each entry's `model_info` object (LiteLLM's own extension to
|
|
52
|
+
* the OpenAI-shaped `/v1/models` list; codextender's operator finding
|
|
53
|
+
* describes its config as declaring the value "in its LiteLLM
|
|
54
|
+
* `model_info`"), NOT as a flat, top-level field on the entry. A flat
|
|
55
|
+
* `entry.max_input_tokens` is checked too, purely as a forward-compatible
|
|
56
|
+
* fallback in case a future LiteLLM/codextender version flattens it — the
|
|
57
|
+
* nested form is the one actually confirmed, so it takes precedence.
|
|
58
|
+
*/
|
|
59
|
+
function extractMaxInputTokens(entry) {
|
|
60
|
+
const modelInfo = entry.model_info;
|
|
61
|
+
const nested = modelInfo && typeof modelInfo === "object"
|
|
62
|
+
? modelInfo.max_input_tokens
|
|
63
|
+
: undefined;
|
|
64
|
+
const raw = nested ?? entry.max_input_tokens;
|
|
65
|
+
return typeof raw === "number" && Number.isInteger(raw) && raw > 0 ? raw : undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* `GET http://127.0.0.1:<port>/v1/models` with the configured Codextender
|
|
69
|
+
* master-key bearer token (`deps.authToken` or `resolveCodextenderAuthToken()`).
|
|
70
|
+
* Never throws — an unconfigured token, any network error, non-2xx status,
|
|
71
|
+
* timeout, or malformed body all resolve `{ok: false, models: []}` rather
|
|
72
|
+
* than rejecting, so callers never need a try/catch.
|
|
73
|
+
*
|
|
74
|
+
* LiteLLM's `/v1/models` response is OpenAI-shaped (`{"data": [{"id":
|
|
75
|
+
* "sol"}, ...]}`) — it carries no separate display name, so `display_name`
|
|
76
|
+
* is set to the same slug (matches `codex-models-probe.ts`'s
|
|
77
|
+
* `CodexModelCatalogEntry` shape for the client's shared consumer).
|
|
78
|
+
*/
|
|
79
|
+
export async function probeCodextenderModels(port, deps = {}) {
|
|
80
|
+
if (!isValidCodextenderPort(port))
|
|
81
|
+
return { ok: false, models: [] };
|
|
82
|
+
const authToken = deps.authToken ?? resolveCodextenderAuthToken();
|
|
83
|
+
if (!authToken)
|
|
84
|
+
return { ok: false, models: [] };
|
|
85
|
+
const fetchFn = deps.fetchFn ?? fetch;
|
|
86
|
+
const timeoutMs = deps.timeoutMs ?? 1500;
|
|
87
|
+
const controller = new AbortController();
|
|
88
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetchFn(`http://127.0.0.1:${port}/v1/models`, {
|
|
91
|
+
signal: controller.signal,
|
|
92
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok)
|
|
95
|
+
return { ok: false, models: [] };
|
|
96
|
+
const body = await res.json();
|
|
97
|
+
const rawModels = body?.data;
|
|
98
|
+
if (!Array.isArray(rawModels))
|
|
99
|
+
return { ok: false, models: [] };
|
|
100
|
+
const models = [];
|
|
101
|
+
for (const entry of rawModels) {
|
|
102
|
+
if (!entry || typeof entry !== "object")
|
|
103
|
+
continue;
|
|
104
|
+
const id = entry.id;
|
|
105
|
+
if (typeof id !== "string" || id.trim() === "")
|
|
106
|
+
continue;
|
|
107
|
+
const maxInputTokens = extractMaxInputTokens(entry);
|
|
108
|
+
models.push({
|
|
109
|
+
slug: id,
|
|
110
|
+
display_name: id,
|
|
111
|
+
...(maxInputTokens !== undefined ? { max_input_tokens: maxInputTokens } : {}),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return { ok: true, models };
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return { ok: false, models: [] };
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
clearTimeout(timer);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Resolves the REAL context window for the Codextender alias a task is
|
|
125
|
+
* about to launch with, straight from the proxy's own `/v1/models` response
|
|
126
|
+
* (operator finding, 2026-09-26, live Codextender iterate test) — never a
|
|
127
|
+
* number hardcoded here a second time. Claude Code assumes a 200K context
|
|
128
|
+
* window for any model id it doesn't recognize (the Codex alias is one) and
|
|
129
|
+
* proactively over-compacts against that wrong, much-too-small ceiling; the
|
|
130
|
+
* fix is `launcher-codextender.ts` setting `CLAUDE_CODE_MAX_CONTEXT_TOKENS`
|
|
131
|
+
* from THIS value, so a change to codextender's own declared window (its
|
|
132
|
+
* `config.py` `model_info.max_input_tokens`) can never drift out of sync
|
|
133
|
+
* with what webui tells Claude Code — both repos read the same live number.
|
|
134
|
+
*
|
|
135
|
+
* Never throws, same contract as `probeCodextenderModels` — resolves
|
|
136
|
+
* `undefined` (not a guessed fallback) when the probe fails, the alias
|
|
137
|
+
* isn't in the response, or the response carries no usable
|
|
138
|
+
* `max_input_tokens` for it (an older/unpatched proxy). The caller's
|
|
139
|
+
* contract for `undefined` is "leave `CLAUDE_CODE_MAX_CONTEXT_TOKENS`
|
|
140
|
+
* unset", which is the conservative, safe default — Claude Code's own 200K
|
|
141
|
+
* fallback — rather than risking an inflated ceiling that starves
|
|
142
|
+
* compaction entirely.
|
|
143
|
+
*/
|
|
144
|
+
export async function resolveCodextenderMaxContextTokens(port, model, deps = {}) {
|
|
145
|
+
const alias = model?.trim() || DEFAULT_CODEXTENDER_MODEL_ALIAS;
|
|
146
|
+
const result = await probeCodextenderModels(port, deps);
|
|
147
|
+
if (!result.ok)
|
|
148
|
+
return undefined;
|
|
149
|
+
const entry = result.models.find((m) => m.slug === alias);
|
|
150
|
+
return entry?.max_input_tokens;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* `GET http://127.0.0.1:<port>/health/liveliness` — no auth header
|
|
154
|
+
* required (confirmed live against a real local LiteLLM proxy). This is
|
|
155
|
+
* the AC8 pre-flight probe: it only needs to know the proxy process is up
|
|
156
|
+
* and answering, not what it serves. Never throws — same
|
|
157
|
+
* never-reject contract as `probeCodextenderModels`.
|
|
158
|
+
*/
|
|
159
|
+
export async function probeCodextenderLiveness(port, deps = {}) {
|
|
160
|
+
if (!isValidCodextenderPort(port))
|
|
161
|
+
return false;
|
|
162
|
+
const fetchFn = deps.fetchFn ?? fetch;
|
|
163
|
+
const timeoutMs = deps.timeoutMs ?? 1500;
|
|
164
|
+
const controller = new AbortController();
|
|
165
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
166
|
+
try {
|
|
167
|
+
const res = await fetchFn(`http://127.0.0.1:${port}/health/liveliness`, {
|
|
168
|
+
signal: controller.signal,
|
|
169
|
+
});
|
|
170
|
+
return res.ok;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
clearTimeout(timer);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=codextender-proxy-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codextender-proxy-probe.js","sourceRoot":"","sources":["../../src/core/codextender-proxy-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,12 +44,27 @@ export declare const PROFILE_SCHEMA_VERSION = 1;
|
|
|
44
44
|
* (it consumes `Object.values(requirements)` then inner `.id`/`.tests`), so v3
|
|
45
45
|
* is a pure data-shape acknowledgement — no reader-logic change.
|
|
46
46
|
*
|
|
47
|
+
* **v4** (shipwright monorepo campaign req3-04c-ac-identity-wave2, P3.2:
|
|
48
|
+
* "AC-scoped `@covers` tag grammar + test-traceability manifest v4") —
|
|
49
|
+
* additive AC-scoped test binding. A test link may carry an optional
|
|
50
|
+
* `ac_id` (e.g. `covers("FR-01.11/AC07")` → `"AC07"`), and a requirement
|
|
51
|
+
* node may carry an optional `acs` breakdown mirroring its own
|
|
52
|
+
* `tests`/`coverage` shape, scoped per AC. Both are OMITTED ENTIRELY when
|
|
53
|
+
* the requirement has no AC-scoped tag anywhere, so a repo with none of
|
|
54
|
+
* these tags yet emits a byte-identical v3-shaped body (only the
|
|
55
|
+
* `schema_version` const moves). This reader does not consume `ac_id` or
|
|
56
|
+
* `acs` — it still only reads `.id`/`.tests[<layer>][*].id/.layer/.resolved_from`,
|
|
57
|
+
* every one of which is unchanged and required in both v3 and v4 — so a
|
|
58
|
+
* v4 manifest with NO AC tags at all (a "v3-shaped bare FR tag" body) and
|
|
59
|
+
* one WITH AC tags both invert identically; frozen fixture in
|
|
60
|
+
* `traceability.v4-fixture.test.ts` pins both shapes.
|
|
61
|
+
*
|
|
47
62
|
* A manifest declaring a HIGHER version is warned once (via
|
|
48
63
|
* `checkContractVersion`) and still read best-effort — the inner shape the
|
|
49
64
|
* reader consumes has been stable across the bumps seen so far, so an
|
|
50
65
|
* ahead-of-us manifest still yields a useful index.
|
|
51
66
|
*/
|
|
52
|
-
export declare const TRACEABILITY_SCHEMA_VERSION =
|
|
67
|
+
export declare const TRACEABILITY_SCHEMA_VERSION = 4;
|
|
53
68
|
/**
|
|
54
69
|
* Check a parsed artefact's declared version against the library's
|
|
55
70
|
* known max. Logs one JSON warning per (artefact, path, version)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-version.d.ts","sourceRoot":"","sources":["../../src/core/contract-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"contract-version.d.ts","sourceRoot":"","sources":["../../src/core/contract-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAc7C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAmDV;AAED,gEAAgE;AAChE,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|