@svenroth-ai/shipwright 0.24.7-next.0 → 0.26.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-D2BLGWdW.js → EmbeddedTerminal-D3wpPNZP.js} +20 -20
- package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-BkLIltB3.js} +1 -1
- package/client/dist/assets/{arc-CpqwESP5.js → arc-Sw-Gh0nI.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-Ch_9dj8a.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-CkFlO65x.js} +1 -1
- package/client/dist/assets/channel-BYPbLjRl.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CypX83xu.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-DxVLYGdl.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-Cxk1evhx.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-n9q5S4yJ.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-jeL4xvir.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-DDSHN0cj.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-C0bo383g.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-C0jDXXAU.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-h-Rr4Pn2.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-BexSo0-s.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-BQXzaioj.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-BJIofhfe.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-DmPqTM1T.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-1xljvw6X.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-iyL9muCG.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-DREp2Th6.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-h0X3Is2S.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Bj8YZRFJ.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-BZOf805d.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-DO5JnXda.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-DRgcqg1T.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-C3J9QmrW.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-BIEl3Tkm.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-BNF0tFWC.js} +1 -1
- package/client/dist/assets/index-BnTOrFHb.js +829 -0
- package/client/dist/assets/index-CYPc6qxw.css +1 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-DEyFxiyY.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-B_ehlg3I.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-Dp00FyJS.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-CTAf16q8.js} +1 -1
- package/client/dist/assets/{linear-B4foxDlh.js → linear-9vNUgmYd.js} +1 -1
- package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-A6tjaEVD.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-DRW3bmCY.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DJFCjHp2.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-KRd-sGvC.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-y4tLtjXg.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-B9EOQDQM.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-zfwiDzkT.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-DW1LWepL.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BM81Mik0.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-D0EMIw1w.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CKXNCX6M.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-ByzIfvL5.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-Xep38xBH.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-DKWDpx6g.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-BGcwZTnu.js} +1 -1
- package/client/dist/index.html +27 -27
- package/lib/claude-cli.mjs +173 -173
- package/lib/preflight.mjs +252 -252
- package/lib/probe-path.mjs +84 -84
- package/lib/server.mjs +369 -369
- package/lib/util.mjs +157 -157
- package/lib/win32-spawn.mjs +253 -253
- package/package.json +1 -1
- package/scripts/deploy-procs.mjs +208 -208
- package/scripts/deploy-swap.mjs +276 -276
- package/scripts/kill-targets.js +140 -140
- package/scripts/repair-claude-json.mjs +295 -295
- package/server/dist/config/default-actions.json +90 -90
- package/server/dist/core/grade-runner.d.ts +4 -4
- package/server/dist/core/grade-runner.d.ts.map +1 -1
- package/server/dist/core/grade-runner.js +51 -26
- package/server/dist/core/grade-runner.js.map +1 -1
- package/server/dist/core/grade-target.d.ts +8 -0
- package/server/dist/core/grade-target.d.ts.map +1 -1
- package/server/dist/core/grade-target.js +10 -0
- package/server/dist/core/grade-target.js.map +1 -1
- package/server/dist/core/mission-context/association.d.ts +46 -0
- package/server/dist/core/mission-context/association.d.ts.map +1 -1
- package/server/dist/core/mission-context/association.js +69 -0
- package/server/dist/core/mission-context/association.js.map +1 -1
- package/server/dist/core/mission-context/resolver-iterate.d.ts +6 -0
- package/server/dist/core/mission-context/resolver-iterate.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver-iterate.js +202 -0
- package/server/dist/core/mission-context/resolver-iterate.js.map +1 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts +20 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver-parts.js +92 -0
- package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
- package/server/dist/core/mission-context/resolver.d.ts +1 -1
- package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver.js +17 -199
- package/server/dist/core/mission-context/resolver.js.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.d.ts +21 -5
- package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.js +32 -5
- package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
- package/server/dist/core/mission-context/scenario.d.ts +18 -11
- package/server/dist/core/mission-context/scenario.d.ts.map +1 -1
- package/server/dist/core/mission-context/scenario.js +40 -3
- package/server/dist/core/mission-context/scenario.js.map +1 -1
- package/server/dist/core/path-guard.d.ts +1 -1
- package/server/dist/core/path-guard.d.ts.map +1 -1
- package/server/dist/core/path-guard.js +9 -2
- package/server/dist/core/path-guard.js.map +1 -1
- package/server/dist/core/shipslog-docs-reader.d.ts +4 -0
- package/server/dist/core/shipslog-docs-reader.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-reader.js +181 -0
- package/server/dist/core/shipslog-docs-reader.js.map +1 -0
- package/server/dist/core/shipslog-docs-types.d.ts +15 -0
- package/server/dist/core/shipslog-docs-types.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-types.js +14 -0
- package/server/dist/core/shipslog-docs-types.js.map +1 -0
- package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
- package/server/dist/core/triage-cli-runner.js +29 -10
- package/server/dist/core/triage-cli-runner.js.map +1 -1
- package/server/dist/core/uv-runner.d.ts +23 -0
- package/server/dist/core/uv-runner.d.ts.map +1 -0
- package/server/dist/core/uv-runner.js +39 -0
- package/server/dist/core/uv-runner.js.map +1 -0
- package/server/dist/external/design-review/serve.js +27 -27
- package/server/dist/external/file/exists-routes.d.ts +7 -0
- package/server/dist/external/file/exists-routes.d.ts.map +1 -0
- package/server/dist/external/file/exists-routes.js +91 -0
- package/server/dist/external/file/exists-routes.js.map +1 -0
- package/server/dist/external/mission-context/association-write.d.ts +22 -0
- package/server/dist/external/mission-context/association-write.d.ts.map +1 -0
- package/server/dist/external/mission-context/association-write.js +90 -0
- package/server/dist/external/mission-context/association-write.js.map +1 -0
- package/server/dist/external/mission-context/routes.d.ts.map +1 -1
- package/server/dist/external/mission-context/routes.js +18 -31
- package/server/dist/external/mission-context/routes.js.map +1 -1
- package/server/dist/external/org/audit-log.d.ts +27 -0
- package/server/dist/external/org/audit-log.d.ts.map +1 -0
- package/server/dist/external/org/audit-log.js +92 -0
- package/server/dist/external/org/audit-log.js.map +1 -0
- package/server/dist/external/org/beat-register.d.ts +15 -22
- package/server/dist/external/org/beat-register.d.ts.map +1 -1
- package/server/dist/external/org/beat-register.js +37 -32
- package/server/dist/external/org/beat-register.js.map +1 -1
- package/server/dist/external/org/file-read.d.ts +16 -0
- package/server/dist/external/org/file-read.d.ts.map +1 -1
- package/server/dist/external/org/file-read.js +86 -46
- package/server/dist/external/org/file-read.js.map +1 -1
- package/server/dist/external/org/file-write-core.d.ts +18 -0
- package/server/dist/external/org/file-write-core.d.ts.map +1 -0
- package/server/dist/external/org/file-write-core.js +97 -0
- package/server/dist/external/org/file-write-core.js.map +1 -0
- package/server/dist/external/org/file-write.d.ts +25 -0
- package/server/dist/external/org/file-write.d.ts.map +1 -1
- package/server/dist/external/org/file-write.js +82 -132
- package/server/dist/external/org/file-write.js.map +1 -1
- package/server/dist/external/org/last-run.d.ts +25 -16
- package/server/dist/external/org/last-run.d.ts.map +1 -1
- package/server/dist/external/org/last-run.js +78 -64
- package/server/dist/external/org/last-run.js.map +1 -1
- package/server/dist/external/org/lead-doc-read.d.ts +21 -0
- package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
- package/server/dist/external/org/lead-doc-read.js +84 -0
- package/server/dist/external/org/lead-doc-read.js.map +1 -0
- package/server/dist/external/org/mount.d.ts +12 -0
- package/server/dist/external/org/mount.d.ts.map +1 -0
- package/server/dist/external/org/mount.js +34 -0
- package/server/dist/external/org/mount.js.map +1 -0
- package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
- package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
- package/server/dist/external/org/org-chart-lookup.js +40 -5
- package/server/dist/external/org/org-chart-lookup.js.map +1 -1
- package/server/dist/external/org/org-chart.d.ts +21 -12
- package/server/dist/external/org/org-chart.d.ts.map +1 -1
- package/server/dist/external/org/org-chart.js +50 -32
- package/server/dist/external/org/org-chart.js.map +1 -1
- package/server/dist/external/org/role-extract.d.ts +8 -0
- package/server/dist/external/org/role-extract.d.ts.map +1 -0
- package/server/dist/external/org/role-extract.js +72 -0
- package/server/dist/external/org/role-extract.js.map +1 -0
- package/server/dist/external/org/usage.d.ts +15 -11
- package/server/dist/external/org/usage.d.ts.map +1 -1
- package/server/dist/external/org/usage.js +64 -54
- package/server/dist/external/org/usage.js.map +1 -1
- package/server/dist/external/routes.d.ts +1 -1
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +19 -17
- package/server/dist/external/routes.js.map +1 -1
- package/server/dist/external/shipslog-docs/routes.d.ts +10 -0
- package/server/dist/external/shipslog-docs/routes.d.ts.map +1 -0
- package/server/dist/external/shipslog-docs/routes.js +41 -0
- package/server/dist/external/shipslog-docs/routes.js.map +1 -0
- package/server/dist/routes/grade.d.ts.map +1 -1
- package/server/dist/routes/grade.js +3 -2
- package/server/dist/routes/grade.js.map +1 -1
- package/server/dist/routes/org-leads-composite.d.ts +21 -0
- package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
- package/server/dist/routes/org-leads-composite.js +95 -0
- package/server/dist/routes/org-leads-composite.js.map +1 -0
- package/server/dist/routes/org.d.ts +15 -0
- package/server/dist/routes/org.d.ts.map +1 -0
- package/server/dist/routes/org.js +198 -0
- package/server/dist/routes/org.js.map +1 -0
- package/server/dist/terminal/pty-manager.d.ts +9 -0
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +15 -0
- package/server/dist/terminal/pty-manager.js.map +1 -1
- package/server/dist/terminal/replay-snapshot.d.ts +10 -1
- package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
- package/server/dist/terminal/replay-snapshot.js +36 -1
- package/server/dist/terminal/replay-snapshot.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.js +45 -4
- package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
- package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
- package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
- package/server/dist/test/python-spawn-guard-util.js +124 -0
- package/server/dist/test/python-spawn-guard-util.js.map +1 -0
- package/server/dist/types/org.d.ts +115 -0
- package/server/dist/types/org.d.ts.map +1 -0
- package/server/dist/types/org.js +16 -0
- package/server/dist/types/org.js.map +1 -0
- package/server/package.json +1 -1
- package/server/profiles/PROFILE_SCHEMA_VERSION +1 -1
- package/server/profiles/README.md +27 -27
- package/server/profiles/python-plugin-monorepo.json +35 -35
- package/server/profiles/supabase-nextjs.json +253 -253
- package/server/profiles/vite-hono.json +92 -92
- package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
- package/client/dist/assets/channel-BNXbCvDS.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
- package/client/dist/assets/index-CU2QJgvx.js +0 -609
- package/client/dist/assets/index-ftvVcUT8.css +0 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-JTQZTlZ3.js +0 -8
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/mission-context/association-write.ts — the ONE guarded
|
|
3
|
+
* association write (CONTRACT §5), split out of routes.ts (2026-08-31,
|
|
4
|
+
* iterate-2026-08-31-mission-feed-gaps) to stay under the 300-line file-size
|
|
5
|
+
* limit. Pure continuation of the GET handler's persistence step: routes.ts
|
|
6
|
+
* resolves the context and hands the decision here.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent for a first association: the store no-ops when one already
|
|
9
|
+
* exists, so repeated polls perform exactly zero writes after the first.
|
|
10
|
+
* Never a per-GET side-effect.
|
|
11
|
+
*/
|
|
12
|
+
import { revertMissionContext, revertSupersession, setMissionContextOnce, supersedeMissionContext, } from "../../core/mission-context/association.js";
|
|
13
|
+
/**
|
|
14
|
+
* Persist a resolved association — either the FIRST one for a task, or a
|
|
15
|
+
* confirmed supersession of a stale one. Caller must have already checked
|
|
16
|
+
* `associateRunId` is non-null.
|
|
17
|
+
*
|
|
18
|
+
* `associationAtResolve` is the snapshot `resolveMissionContext` actually
|
|
19
|
+
* decided against (captured by the caller BEFORE its slow async work, e.g.
|
|
20
|
+
* `routes.ts`) — not re-read here. Both write paths compare against it, not
|
|
21
|
+
* a fresh `task.missionContext`: by the time this async function runs, a
|
|
22
|
+
* concurrent poll may already have written a NEWER association, and a fresh
|
|
23
|
+
* read here would silently adopt that as the "expected" value, letting THIS
|
|
24
|
+
* poll's now-stale decision overwrite it with no failure involved (a plain
|
|
25
|
+
* lost-update race, doubt-reviewer HIGH, iterate-2026-08-31-mission-feed-gaps
|
|
26
|
+
* — ELOCKED rollback cannot catch it because nothing fails).
|
|
27
|
+
*/
|
|
28
|
+
export async function persistMissionAssociation(store, task, associationAtResolve, associateRunId, associateSource, now, wideWindows) {
|
|
29
|
+
if (!associationAtResolve) {
|
|
30
|
+
const association = {
|
|
31
|
+
kind: "iterate",
|
|
32
|
+
runId: associateRunId,
|
|
33
|
+
observedAt: now().toISOString(),
|
|
34
|
+
source: associateSource,
|
|
35
|
+
};
|
|
36
|
+
if (setMissionContextOnce(store, task.taskId, association)) {
|
|
37
|
+
try {
|
|
38
|
+
await store.persist();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// A lock contention (ELOCKED) or I/O fault must not fail the READ —
|
|
42
|
+
// but the in-memory field MUST be rolled back, or every later poll
|
|
43
|
+
// would see it set, skip the write, and the association would never
|
|
44
|
+
// reach disk (external code review, openai HIGH).
|
|
45
|
+
revertMissionContext(store, task.taskId, association);
|
|
46
|
+
// …and the reach-back must be rolled back WITH it. The marker was
|
|
47
|
+
// recorded before the resolve; leaving it would make every later poll
|
|
48
|
+
// read only the ordinary tail while the task is unidentified again —
|
|
49
|
+
// permanently unreachable for a footer beyond it, which is the very
|
|
50
|
+
// data loss the rollback above exists to prevent, re-entered through
|
|
51
|
+
// the read side (internal code review, MEDIUM).
|
|
52
|
+
wideWindows.delete(task.taskId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (associateSource === "transcript_run_id" && associateRunId !== associationAtResolve.runId) {
|
|
58
|
+
// THE evidence-gated supersession write (association.ts,
|
|
59
|
+
// iterate-2026-08-31-mission-feed-gaps, external code review, openai
|
|
60
|
+
// HIGH). scenario.ts rule 2b has already required a corroborated
|
|
61
|
+
// footer naming a PROVABLY newer run before offering `associateRunId`
|
|
62
|
+
// here — this is the write that makes that correction durable instead
|
|
63
|
+
// of re-proving itself from the transcript on every poll forever.
|
|
64
|
+
const previous = associationAtResolve;
|
|
65
|
+
const association = {
|
|
66
|
+
kind: "iterate",
|
|
67
|
+
runId: associateRunId,
|
|
68
|
+
observedAt: now().toISOString(),
|
|
69
|
+
source: associateSource,
|
|
70
|
+
};
|
|
71
|
+
// Compare-and-set against `previous` (association.ts, external code
|
|
72
|
+
// review openai MEDIUM + doubt-reviewer HIGH): the store's CURRENT value
|
|
73
|
+
// must still equal what this decision was based on, or the write is
|
|
74
|
+
// skipped and the next poll resolves fresh against whatever is now
|
|
75
|
+
// current — never a blind overwrite of a value a faster concurrent poll
|
|
76
|
+
// already corrected further.
|
|
77
|
+
if (supersedeMissionContext(store, task.taskId, association, previous)) {
|
|
78
|
+
try {
|
|
79
|
+
await store.persist();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Same ELOCKED/I-O-fault posture as the first-association rollback
|
|
83
|
+
// above — but there is a PREVIOUS association to restore here, not
|
|
84
|
+
// an empty field to revert to.
|
|
85
|
+
revertSupersession(store, task.taskId, association, previous);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=association-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"association-write.js","sourceRoot":"","sources":["../../../src/external/mission-context/association-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,2CAA2C,CAAC;AAInD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAuB,EACvB,IAAkB,EAClB,oBAAsD,EACtD,cAAsB,EACtB,eAAoD,EACpD,GAAe,EACf,WAA2D;IAE3D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,WAAW,GAA8B;YAC7C,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,cAAc;YACrB,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;YAC/B,MAAM,EAAE,eAAe;SACxB,CAAC;QACF,IAAI,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;gBACpE,mEAAmE;gBACnE,oEAAoE;gBACpE,kDAAkD;gBAClD,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBACtD,kEAAkE;gBAClE,sEAAsE;gBACtE,qEAAqE;gBACrE,oEAAoE;gBACpE,qEAAqE;gBACrE,gDAAgD;gBAChD,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,eAAe,KAAK,mBAAmB,IAAI,cAAc,KAAK,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC7F,yDAAyD;QACzD,qEAAqE;QACrE,iEAAiE;QACjE,sEAAsE;QACtE,sEAAsE;QACtE,kEAAkE;QAClE,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACtC,MAAM,WAAW,GAA8B;YAC7C,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,cAAc;YACrB,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;YAC/B,MAAM,EAAE,eAAe;SACxB,CAAC;QACF,oEAAoE;QACpE,yEAAyE;QACzE,oEAAoE;QACpE,mEAAmE;QACnE,wEAAwE;QACxE,6BAA6B;QAC7B,IAAI,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,mEAAmE;gBACnE,mEAAmE;gBACnE,+BAA+B;gBAC/B,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/external/mission-context/routes.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/external/mission-context/routes.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAS/C,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,gBAAgB,CAAC;IACxB,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,CAAC;IACrE;;;;;;;;;;;;OAYG;IACH,kBAAkB,EAAE,CAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,yDAAyD;IACzD,gBAAgB,EAAE,CAChB,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,YAAY,KACf,OAAO,CAAC;QACX,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,eAAe,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACnD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,iBAAiB,EAAE,OAAO,CAAC;QAC3B,0EAA0E;QAC1E,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAuK/E"}
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { Hono } from "hono";
|
|
22
22
|
import { parseDocId } from "../../core/mission-context/doc-ids.js";
|
|
23
|
-
import { revertMissionContext, setMissionContextOnce, } from "../../core/mission-context/association.js";
|
|
24
23
|
import { resolveMissionContext, readDocumentBody, } from "../../core/mission-context/resolver.js";
|
|
25
24
|
import { readAllowedRoots } from "../../core/mission-context/worktree-roots.js";
|
|
26
25
|
import { samePath } from "../../core/mission-context/pointer.js";
|
|
26
|
+
import { persistMissionAssociation } from "./association-write.js";
|
|
27
27
|
/** Bounded tail of the transcript — enough for a `pr-link`, never the whole file. */
|
|
28
28
|
export const TRANSCRIPT_TAIL_BYTES = 512 * 1024;
|
|
29
29
|
/**
|
|
@@ -129,6 +129,17 @@ export function createMissionContextRouter(deps) {
|
|
|
129
129
|
scanned: wide ? read.revision : (window?.scanned ?? ""),
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
|
+
// Snapshotted ONCE, here — the exact value `resolveMissionContext` bases
|
|
133
|
+
// `associateRunId`/`associateSource` on. The write below must compare
|
|
134
|
+
// against THIS reference, not a fresh re-read of `task.missionContext` at
|
|
135
|
+
// write time: the resolve that follows does slow async work (git calls in
|
|
136
|
+
// resolver-iterate.ts), during which a concurrent poll (multi-tab, or the
|
|
137
|
+
// next ~1s tick landing first) can legitimately write a NEWER association
|
|
138
|
+
// — re-reading late would then "expect" that newer value and let this
|
|
139
|
+
// poll's now-stale decision overwrite it (doubt-reviewer HIGH,
|
|
140
|
+
// iterate-2026-08-31-mission-feed-gaps: a lost-update/TOCTOU race with no
|
|
141
|
+
// failure involved, so ELOCKED rollback never catches it).
|
|
142
|
+
const associationAtResolve = task.missionContext ?? null;
|
|
132
143
|
const { context, associateRunId, associateSource } = await resolveMissionContext({
|
|
133
144
|
taskId: task.taskId,
|
|
134
145
|
sessionUuid: task.sessionUuid,
|
|
@@ -140,38 +151,14 @@ export function createMissionContextRouter(deps) {
|
|
|
140
151
|
taskTerminal: task.state === "done" || task.state === "launch_failed",
|
|
141
152
|
// Server-held, server-written — this is what keeps a FINALIZED iterate
|
|
142
153
|
// resolvable after its `iterate_active` pointer was pruned.
|
|
143
|
-
association:
|
|
154
|
+
association: associationAtResolve,
|
|
144
155
|
...facts,
|
|
145
156
|
}, deps.resolveDeps);
|
|
146
|
-
// THE one guarded association write (CONTRACT §5)
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
if (associateRunId
|
|
150
|
-
|
|
151
|
-
kind: "iterate",
|
|
152
|
-
runId: associateRunId,
|
|
153
|
-
observedAt: now().toISOString(),
|
|
154
|
-
source: associateSource,
|
|
155
|
-
};
|
|
156
|
-
if (setMissionContextOnce(store, task.taskId, association)) {
|
|
157
|
-
try {
|
|
158
|
-
await store.persist();
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
// A lock contention (ELOCKED) or I/O fault must not fail the READ —
|
|
162
|
-
// but the in-memory field MUST be rolled back, or every later poll
|
|
163
|
-
// would see it set, skip the write, and the association would never
|
|
164
|
-
// reach disk (external code review, openai HIGH).
|
|
165
|
-
revertMissionContext(store, task.taskId, association);
|
|
166
|
-
// …and the reach-back must be rolled back WITH it. The marker was
|
|
167
|
-
// recorded before the resolve; leaving it would make every later poll
|
|
168
|
-
// read only the ordinary tail while the task is unidentified again —
|
|
169
|
-
// permanently unreachable for a footer beyond it, which is the very
|
|
170
|
-
// data loss the rollback above exists to prevent, re-entered through
|
|
171
|
-
// the read side (internal code review, MEDIUM).
|
|
172
|
-
wideWindows.delete(task.taskId);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
157
|
+
// THE one guarded association write (CONTRACT §5) — first association or
|
|
158
|
+
// a confirmed supersession, both idempotent. Split out to
|
|
159
|
+
// association-write.ts to stay under the file-size limit.
|
|
160
|
+
if (associateRunId) {
|
|
161
|
+
await persistMissionAssociation(store, task, associationAtResolve, associateRunId, associateSource, now, wideWindows);
|
|
175
162
|
}
|
|
176
163
|
return c.json({ status: "ok", context });
|
|
177
164
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/external/mission-context/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/external/mission-context/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { openSync } from "node:fs";
|
|
2
|
+
import type { AuditLogPage } from "../../types/org.js";
|
|
3
|
+
export type { AuditLogEntry, AuditLogPage } from "../../types/org.js";
|
|
4
|
+
export type AuditLogCoreResult = {
|
|
5
|
+
status: 200;
|
|
6
|
+
body: AuditLogPage;
|
|
7
|
+
} | {
|
|
8
|
+
status: 400 | 403 | 404 | 500;
|
|
9
|
+
body: {
|
|
10
|
+
error: string;
|
|
11
|
+
detail?: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export interface AuditLogDeps {
|
|
15
|
+
leadsRoot: string;
|
|
16
|
+
openSync?: typeof openSync;
|
|
17
|
+
}
|
|
18
|
+
export interface AuditLogParams {
|
|
19
|
+
leadId: string | undefined;
|
|
20
|
+
/** Number of already-consumed newest-first entries to skip. Default 0. */
|
|
21
|
+
before?: number;
|
|
22
|
+
/** Page size, clamped to `[1, MAX_LIMIT]`. Default `DEFAULT_LIMIT`. */
|
|
23
|
+
limit?: number;
|
|
24
|
+
}
|
|
25
|
+
/** Pure core — reads and paginates `<leadsRoot>/<leadId>/audit.jsonl`. */
|
|
26
|
+
export declare function auditLogCore(deps: AuditLogDeps, params: AuditLogParams): AuditLogCoreResult;
|
|
27
|
+
//# sourceMappingURL=audit-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../../src/external/org/audit-log.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAkD,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAKjG,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMtE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,kBAAkB,CA2D3F"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/org/audit-log.ts — bounded, paginated read of a lead's
|
|
3
|
+
* `audit.jsonl` for the Docs block's "Open log" tile (AC-2, Design Notes
|
|
4
|
+
* "Docs block — view-only contract"). Never serves the whole growing file
|
|
5
|
+
* to the browser at once: the RESPONSE is always capped at `limit` entries,
|
|
6
|
+
* newest first, with a `nextCursor` to page into older entries.
|
|
7
|
+
*
|
|
8
|
+
* Known limitation, stated rather than hidden: the current read still loads
|
|
9
|
+
* the whole file into memory server-side before slicing a page off it (no
|
|
10
|
+
* disk-level tail/backward-chunk read, unlike the transcript JSONL tail
|
|
11
|
+
* reader in `core/session-jsonl-io.ts`, which exists for a much larger,
|
|
12
|
+
* continuously-streamed file). Acceptable for a per-lead audit log at this
|
|
13
|
+
* iterate's scale; a real backward-chunked reader is a follow-up if a log
|
|
14
|
+
* grows large enough to make this measurably slow.
|
|
15
|
+
*
|
|
16
|
+
* Same allowlist posture as `lead-doc-read.ts`: `leadId` is validated
|
|
17
|
+
* against the shared `LEAD_ID_RE`, the filename suffix is a hardcoded
|
|
18
|
+
* constant, and this stays OUT of `_helpers.ts`'s six-target allowlist —
|
|
19
|
+
* it's a new read only the plain `/api/org/*` surface serves.
|
|
20
|
+
*/
|
|
21
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readFileSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { pathGuard, realPathGuard } from "../../core/path-guard.js";
|
|
24
|
+
import { LEAD_ID_RE } from "./_helpers.js";
|
|
25
|
+
const AUDIT_FILENAME = "audit.jsonl";
|
|
26
|
+
const DEFAULT_LIMIT = 50;
|
|
27
|
+
const MAX_LIMIT = 200;
|
|
28
|
+
function clampLimit(raw) {
|
|
29
|
+
if (raw === undefined || !Number.isFinite(raw))
|
|
30
|
+
return DEFAULT_LIMIT;
|
|
31
|
+
return Math.min(MAX_LIMIT, Math.max(1, Math.trunc(raw)));
|
|
32
|
+
}
|
|
33
|
+
/** Pure core — reads and paginates `<leadsRoot>/<leadId>/audit.jsonl`. */
|
|
34
|
+
export function auditLogCore(deps, params) {
|
|
35
|
+
const { leadsRoot } = deps;
|
|
36
|
+
const open = deps.openSync ?? openSync;
|
|
37
|
+
const { leadId } = params;
|
|
38
|
+
const limit = clampLimit(params.limit);
|
|
39
|
+
const before = params.before !== undefined && Number.isFinite(params.before) && params.before > 0
|
|
40
|
+
? Math.trunc(params.before)
|
|
41
|
+
: 0;
|
|
42
|
+
if (!leadId || !LEAD_ID_RE.test(leadId)) {
|
|
43
|
+
return { status: 400, body: { error: "invalid_lead_id" } };
|
|
44
|
+
}
|
|
45
|
+
const guard = pathGuard(leadsRoot, join(leadId, AUDIT_FILENAME));
|
|
46
|
+
if (!guard.ok) {
|
|
47
|
+
return { status: 400, body: { error: "path_traversal", detail: guard.reason } };
|
|
48
|
+
}
|
|
49
|
+
let fd;
|
|
50
|
+
try {
|
|
51
|
+
fd = open(guard.absolute, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const code = err?.code;
|
|
55
|
+
if (code === "ENOENT") {
|
|
56
|
+
return { status: 404, body: { error: "not_found" } };
|
|
57
|
+
}
|
|
58
|
+
if (code === "ELOOP") {
|
|
59
|
+
return { status: 403, body: { error: "symlink_forbidden" } };
|
|
60
|
+
}
|
|
61
|
+
return { status: 500, body: { error: "file_stat_failed", detail: String(err).slice(0, 200) } };
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
if (!fstatSync(fd).isFile()) {
|
|
65
|
+
return { status: 400, body: { error: "not_a_file" } };
|
|
66
|
+
}
|
|
67
|
+
const realGuard = realPathGuard(leadsRoot, guard.absolute);
|
|
68
|
+
if (!realGuard.ok) {
|
|
69
|
+
return { status: 403, body: { error: "symlink_forbidden", detail: realGuard.reason } };
|
|
70
|
+
}
|
|
71
|
+
const text = readFileSync(fd, "utf8");
|
|
72
|
+
const lines = text.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
73
|
+
const newestFirst = lines.slice().reverse();
|
|
74
|
+
const page = newestFirst.slice(before, before + limit).map((raw) => {
|
|
75
|
+
try {
|
|
76
|
+
return { raw, parsed: JSON.parse(raw) };
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return { raw, parsed: null };
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
const nextCursor = before + limit < newestFirst.length ? before + limit : null;
|
|
83
|
+
return { status: 200, body: { entries: page, total: newestFirst.length, nextCursor } };
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return { status: 500, body: { error: "file_read_failed", detail: String(err).slice(0, 200) } };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
closeSync(fd);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=audit-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../../src/external/org/audit-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAmBtB,SAAS,UAAU,CAAC,GAAuB;IACzC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,MAAsB;IACrE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAC/F,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC,CAAC;IAEN,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,EAAE,IAAI,CAAC;QAClD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAiB,EAAE;YAChF,IAAI,CAAC;gBACH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,EAAE,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;IACzF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IACjG,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { Hono } from "hono";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
beatId: string;
|
|
5
|
-
leadId: string;
|
|
6
|
-
pid: number;
|
|
7
|
-
startedAt: string;
|
|
8
|
-
closedAt: string | null;
|
|
9
|
-
}
|
|
2
|
+
import type { BeatRegisterEntryView, BeatRegisterHealthResponse } from "../../types/org.js";
|
|
3
|
+
export type { BeatRegisterEntryView, BeatRegisterHealthResponse, } from "../../types/org.js";
|
|
10
4
|
export interface BeatRegisterFile {
|
|
11
5
|
version: 1;
|
|
12
6
|
entries: BeatRegisterEntryView[];
|
|
@@ -78,23 +72,22 @@ export declare function readRegisterFileTolerant(absolute: string): {
|
|
|
78
72
|
} | {
|
|
79
73
|
ok: false;
|
|
80
74
|
};
|
|
81
|
-
export type BeatRegisterHealthResponse = {
|
|
82
|
-
leadId: string;
|
|
83
|
-
status: "clear";
|
|
84
|
-
} | {
|
|
85
|
-
leadId: string;
|
|
86
|
-
status: "open";
|
|
87
|
-
entry: BeatRegisterEntryView;
|
|
88
|
-
} | {
|
|
89
|
-
leadId: string;
|
|
90
|
-
status: "fault";
|
|
91
|
-
reason: "duplicate-session-id";
|
|
92
|
-
sessionId: string;
|
|
93
|
-
entries: BeatRegisterEntryView[];
|
|
94
|
-
};
|
|
95
75
|
export interface BeatRegisterRouteDeps {
|
|
96
76
|
leadsRoot: string;
|
|
97
77
|
lstatSync?: LstatFn;
|
|
98
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;
|
|
99
92
|
export declare function registerBeatRegisterHealthRoute(app: Hono, deps: BeatRegisterRouteDeps): void;
|
|
100
93
|
//# 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":"AAiBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"beat-register.d.ts","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAOjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE5F,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;;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,CAuBtD;AAMD,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,0BAA0B,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEjG,gFAAgF;AAChF,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GACb,4BAA4B,CAsC9B;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAK5F"}
|
|
@@ -158,41 +158,46 @@ export function readRegisterFileTolerant(absolute) {
|
|
|
158
158
|
}
|
|
159
159
|
return { ok: true, file: parsed };
|
|
160
160
|
}
|
|
161
|
-
|
|
161
|
+
/** Pure core — shared by the secret-gated route and the plain-surface proxy. */
|
|
162
|
+
export function beatRegisterHealthCore(deps, leadId) {
|
|
162
163
|
const { leadsRoot } = deps;
|
|
163
164
|
const lstat = deps.lstatSync ?? ((p) => lstatSync(p));
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (code === "ENOENT") {
|
|
177
|
-
const body = { leadId, status: "clear" };
|
|
178
|
-
return c.json(body, 200);
|
|
179
|
-
}
|
|
180
|
-
return c.json({ error: "beat_register_read_failed", detail: String(err).slice(0, 200) }, 500);
|
|
181
|
-
}
|
|
182
|
-
if (lst.isSymbolicLink()) {
|
|
183
|
-
return c.json({ error: "symlink_forbidden", leadId }, 403);
|
|
184
|
-
}
|
|
185
|
-
const containment = realPathGuard(leadsRoot, absolute);
|
|
186
|
-
if (!containment.ok) {
|
|
187
|
-
return c.json({ error: "path_traversal", detail: containment.reason }, 400);
|
|
188
|
-
}
|
|
189
|
-
const read = readRegisterFileTolerant(absolute);
|
|
190
|
-
if (!read.ok) {
|
|
191
|
-
return c.json({ error: "beat_register_invalid", leadId }, 502);
|
|
165
|
+
if (!LEAD_ID_RE.test(leadId)) {
|
|
166
|
+
return { status: 400, body: { error: "invalid_lead_id", leadId } };
|
|
167
|
+
}
|
|
168
|
+
const absolute = registerPathFor(leadsRoot, leadId);
|
|
169
|
+
let lst;
|
|
170
|
+
try {
|
|
171
|
+
lst = lstat(absolute);
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
const code = err?.code;
|
|
175
|
+
if (code === "ENOENT") {
|
|
176
|
+
return { status: 200, body: { leadId, status: "clear" } };
|
|
192
177
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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 } };
|
|
193
|
+
}
|
|
194
|
+
const health = evaluateRegisterHealth(read.file);
|
|
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);
|
|
196
201
|
});
|
|
197
202
|
}
|
|
198
203
|
//# 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;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"beat-register.js","sourceRoot":"","sources":["../../../src/external/org/beat-register.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,5 +10,21 @@ export interface OrgFileReadDeps {
|
|
|
10
10
|
*/
|
|
11
11
|
openSync?: typeof openSync;
|
|
12
12
|
}
|
|
13
|
+
export type OrgFileReadCoreResult = {
|
|
14
|
+
status: 200;
|
|
15
|
+
kind: "file";
|
|
16
|
+
body: Buffer;
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
} | {
|
|
19
|
+
status: 400 | 403 | 404 | 500;
|
|
20
|
+
kind: "json";
|
|
21
|
+
body: {
|
|
22
|
+
error: string;
|
|
23
|
+
path?: string;
|
|
24
|
+
detail?: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
/** Pure core — shared by the secret-gated route and the plain-surface proxy. */
|
|
28
|
+
export declare function orgFileReadCore(deps: OrgFileReadDeps, relpath: string | undefined): OrgFileReadCoreResult;
|
|
13
29
|
export declare function registerOrgFileRead(app: Hono, deps: OrgFileReadDeps): void;
|
|
14
30
|
//# sourceMappingURL=file-read.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../../src/external/org/file-read.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAkD,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAMjG,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../../src/external/org/file-read.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAkD,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAMjG,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;CAC5B;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5E;IACE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD,CAAC;AAEN,gFAAgF;AAChF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,qBAAqB,CAoFvB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAW1E"}
|