@svenroth-ai/shipwright 0.25.0 → 0.27.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-5QvKe3_a.js → EmbeddedTerminal-CqCQUDtp.js} +1 -1
- package/client/dist/assets/{abnfDiagram-VRR7QNED-CXi9HegQ.js → abnfDiagram-VRR7QNED-DX2objTP.js} +1 -1
- package/client/dist/assets/{arc-DLh4GiqR.js → arc-DQmjbsFU.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DUypQ8dQ.js → architectureDiagram-ZJ3FMSHR-DAvCsPCW.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-D2cVMKJG.js → blockDiagram-677ZJIJ3-DC-dlyYI.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-DtruBGJw.js → c4Diagram-LMCZKHZV-DSlmXfhE.js} +1 -1
- package/client/dist/assets/channel-BfmIcrp7.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CAfQkFw2.js → chunk-2Q5K7J3B-C111EHL6.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-CPWXoLnQ.js → chunk-32BRIVSS-DrCYs2XG.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-xVc3oppQ.js → chunk-5VM5RSS4-DIejoaXS.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-CUpl6fRR.js → chunk-EX3LRPZG-CGWNeH2g.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-NejUp56x.js → chunk-JWPE2WC7-CCH0SRFY.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-C9-2lLg0.js → chunk-MOJQB5TN-B3OpZGRv.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-BAPtwABy.js → chunk-RYQCIY6F-BKhdp_8v.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-Dwzihw26.js → chunk-V7JOEXUC-B6Bu8x1y.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN-9-iArFJM.js → chunk-VR4S4FIN-OgFi2_iB.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-DiWHOrqe.js → chunk-XXDRQBXY-xyjuuhxl.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-HfUQZ6Uc.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-HfUQZ6Uc.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-Cp04EOcH.js → cose-bilkent-JH36ORCC-BQIH3SCK.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-D--GN1v8.js → cynefin-VYW2F7L2-oyLAz8te.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-BGH0o_qp.js → cynefinDiagram-TSTJHNR4-DoLCsH0l.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-DSKkIKlj.js → dagre-VKFMJZFB-D7djx1_Y.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-Cs_C4lb-.js → diagram-FQU43EPY-DFuYE0Vf.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-oDtAA8O_.js → diagram-G47NLZAW-CffCZVXk.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-BiFMjqSH.js → diagram-NH7WQ7WH-BhrHtUlt.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Ccs3thCj.js → diagram-OA4YK3LP-CwQPbOn0.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-CdZNqgO3.js → diagram-WEI45ONY-abtYnYqH.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-CapTA0VL.js → ebnfDiagram-CCIWWBDH-DfV7gT4m.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-BcRNEP8s.js → erDiagram-Q63AITRT-vtbCprgH.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CJ_zF7e_.js → flowDiagram-23GEKE2U-CVCgcyDF.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-CnJdcg9A.js → ganttDiagram-NO4QXBWP-BclyOgMb.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-YTUQ_ELk.js → gitGraphDiagram-IHSO6WYX-BXT4rIKj.js} +1 -1
- package/client/dist/assets/index-CKU9dY18.css +1 -0
- package/client/dist/assets/index-DOMl6atu.js +847 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-CLOP_ZWD.js → infoDiagram-FWYZ7A6U-Dr4mN24J.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-aFTIzr7o.js → ishikawaDiagram-FXEZZL3T-BBUFWq5C.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-CbPJB4xd.js → journeyDiagram-5HDEW3XC-CmclipcQ.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-BoyhytIS.js → kanban-definition-HUTT4EX6-eIzUeZ03.js} +1 -1
- package/client/dist/assets/{linear-1VXA-uBg.js → linear-DGiT7uKK.js} +1 -1
- package/client/dist/assets/{mermaid.core-D_lO2yK9.js → mermaid.core-BcLNGbxW.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-iFK7LXMx.js → mindmap-definition-LN4V7U3C-C4ANnNiP.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-DNmcmfA-.js → pegDiagram-2B236MQR-DnMeh3Yh.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-ekx83O5b.js → pieDiagram-ENE6RG2P-CKV_rkhF.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-DayyD1l8.js → quadrantDiagram-ABIIQ3AL-BuUsGwHh.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-Bdgz7S6G.js → railroadDiagram-RFXS5EU6-BwwdKnFL.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-szP3Muld.js → requirementDiagram-TGXJPOKE-CpQZouJV.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-Ct3rzgUj.js → sankeyDiagram-HTMAVEWB-4fnDUNVa.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-_69EfmOU.js → sequenceDiagram-DBY2YBRQ-BOcaWlM0.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-BSOU06J2.js → sizeCapture-X5ZJPWSS-_pv-9R0c.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-HmOmFwQm.js → stateDiagram-2N3HPSRC-CFwCOonY.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-srkiu3Ib.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CVg_4oT7.js → swimlanes-5IMT3BWC-DFa2tzxu.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-Dq-0K9Zm.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-CBBaDKXm.js → timeline-definition-FHXFAJF6-rhGYElgn.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-CBXiWPMc.js → vennDiagram-L72KCM5P-BoGjRxyA.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-uhBCZoW0.js → wardleyDiagram-EHGQE667-D-IGv5bH.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-xxE_wY5O.js → xychartDiagram-FW5EYKEG-D9PFTCfm.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/probes.mjs +10 -4
- package/lib/server.mjs +506 -369
- package/lib/util.mjs +157 -157
- package/lib/win32-spawn.mjs +253 -253
- package/package.json +68 -68
- 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/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/sdk-sessions-merge.d.ts +19 -0
- package/server/dist/core/sdk-sessions-merge.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-merge.js +19 -5
- package/server/dist/core/sdk-sessions-merge.js.map +1 -1
- package/server/dist/core/sdk-sessions-refresh.d.ts +50 -0
- package/server/dist/core/sdk-sessions-refresh.d.ts.map +1 -0
- package/server/dist/core/sdk-sessions-refresh.js +69 -0
- package/server/dist/core/sdk-sessions-refresh.js.map +1 -0
- package/server/dist/core/sdk-sessions-store.d.ts +2 -0
- package/server/dist/core/sdk-sessions-store.d.ts.map +1 -1
- package/server/dist/core/sdk-sessions-store.js +7 -9
- package/server/dist/core/sdk-sessions-store.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/shipwright-plugin-version-reader.d.ts +15 -0
- package/server/dist/core/shipwright-plugin-version-reader.d.ts.map +1 -0
- package/server/dist/core/shipwright-plugin-version-reader.js +49 -0
- package/server/dist/core/shipwright-plugin-version-reader.js.map +1 -0
- package/server/dist/external/design-review/serve.js +27 -27
- package/server/dist/external/inbox/_derive.d.ts +2 -25
- package/server/dist/external/inbox/_derive.d.ts.map +1 -1
- package/server/dist/external/inbox/_derive.js.map +1 -1
- package/server/dist/external/inbox/_lead.d.ts +23 -0
- package/server/dist/external/inbox/_lead.d.ts.map +1 -0
- package/server/dist/external/inbox/_lead.js +83 -0
- package/server/dist/external/inbox/_lead.js.map +1 -0
- package/server/dist/external/inbox/_types.d.ts +32 -0
- package/server/dist/external/inbox/_types.d.ts.map +1 -0
- package/server/dist/external/inbox/_types.js +10 -0
- package/server/dist/external/inbox/_types.js.map +1 -0
- package/server/dist/external/inbox/routes.d.ts.map +1 -1
- package/server/dist/external/inbox/routes.js +29 -1
- package/server/dist/external/inbox/routes.js.map +1 -1
- package/server/dist/external/launch/claim-holder-gate.d.ts +42 -0
- package/server/dist/external/launch/claim-holder-gate.d.ts.map +1 -0
- package/server/dist/external/launch/claim-holder-gate.js +87 -0
- package/server/dist/external/launch/claim-holder-gate.js.map +1 -0
- package/server/dist/external/launch/routes.d.ts.map +1 -1
- package/server/dist/external/launch/routes.js +23 -19
- package/server/dist/external/launch/routes.js.map +1 -1
- 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/lead-question-threads.d.ts +46 -0
- package/server/dist/external/org/lead-question-threads.d.ts.map +1 -0
- package/server/dist/external/org/lead-question-threads.js +132 -0
- package/server/dist/external/org/lead-question-threads.js.map +1 -0
- package/server/dist/external/org/mount.d.ts +3 -0
- package/server/dist/external/org/mount.d.ts.map +1 -1
- package/server/dist/external/org/mount.js +2 -1
- package/server/dist/external/org/mount.js.map +1 -1
- package/server/dist/external/org/usage.d.ts.map +1 -1
- package/server/dist/external/org/usage.js +20 -2
- package/server/dist/external/org/usage.js.map +1 -1
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +10 -13
- 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/diagnostics.d.ts +12 -0
- package/server/dist/routes/diagnostics.d.ts.map +1 -1
- package/server/dist/routes/diagnostics.js +4 -1
- package/server/dist/routes/diagnostics.js.map +1 -1
- package/server/dist/routes/org-threads-composite.d.ts +24 -0
- package/server/dist/routes/org-threads-composite.d.ts.map +1 -0
- package/server/dist/routes/org-threads-composite.js +51 -0
- package/server/dist/routes/org-threads-composite.js.map +1 -0
- package/server/dist/routes/org.d.ts +5 -0
- package/server/dist/routes/org.d.ts.map +1 -1
- package/server/dist/routes/org.js +13 -0
- package/server/dist/routes/org.js.map +1 -1
- package/server/dist/terminal/pty-manager.d.ts +23 -1
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +22 -3
- package/server/dist/terminal/pty-manager.js.map +1 -1
- package/server/dist/terminal/pty-write-chunker.d.ts +109 -0
- package/server/dist/terminal/pty-write-chunker.d.ts.map +1 -0
- package/server/dist/terminal/pty-write-chunker.js +234 -0
- package/server/dist/terminal/pty-write-chunker.js.map +1 -0
- package/server/dist/types/org.d.ts +19 -0
- package/server/dist/types/org.d.ts.map +1 -1
- 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/channel-C_k-9jsa.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsEPq9Ac.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsEPq9Ac.js +0 -1
- package/client/dist/assets/index-6nZ1bt0a.css +0 -1
- package/client/dist/assets/index-irQhGNpn.js +0 -828
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-BW8H33dv.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BaRlxcPD.js +0 -8
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* shipslog-docs-reader.ts — pure, fs-backed reader for the Ship's-Log
|
|
3
|
+
* Documents panel (iterate-2026-08-31-shipslog-documents-panel). Curates
|
|
4
|
+
* four groups from a project's own tree — no client input beyond
|
|
5
|
+
* `projectRoot` (already resolved server-side from a trusted project
|
|
6
|
+
* record), so every path here is either a fixed constant or discovered by
|
|
7
|
+
* readdir-ing a fixed directory, never client-supplied.
|
|
8
|
+
*
|
|
9
|
+
* "Requirements" = the ur-spec per PLANNING SECTION (a direct subdirectory
|
|
10
|
+
* of .shipwright/planning/ that is not iterate/adr/campaigns and carries
|
|
11
|
+
* its own spec.md) — distinct from "Iterate" (the flat *.md mini-specs
|
|
12
|
+
* under .shipwright/planning/iterate/), which is a SEPARATE tab in the UI
|
|
13
|
+
* (see ShipsLogSpecsTabs.tsx) precisely because they answer different
|
|
14
|
+
* questions ("what did we commit to" vs. "what changed, run by run").
|
|
15
|
+
*
|
|
16
|
+
* Agent Docs / Compliance are a fixed, curated 5-row list each — a file
|
|
17
|
+
* that doesn't exist on disk is skipped silently (no "unavailable" row);
|
|
18
|
+
* these docs are not guaranteed to exist in every clone/fork.
|
|
19
|
+
*
|
|
20
|
+
* Dates are filesystem mtime, not `git log` — cheap even at 200+ iterate
|
|
21
|
+
* specs, and it's already what mtime reflects for these files.
|
|
22
|
+
*
|
|
23
|
+
* CLAUDE.md rule 10 / ADR-044: every path (even a dynamically-readdir'd
|
|
24
|
+
* one) is re-verified with pathGuard + realPathGuard before it is stat'd
|
|
25
|
+
* or returned — the same discipline external/tree/routes.ts applies to a
|
|
26
|
+
* client-supplied path, as defense in depth even though nothing here is
|
|
27
|
+
* client-controlled. `realpathSync(projectRoot)` is hoisted ONCE per read
|
|
28
|
+
* (path-guard.ts's own documented optimization for a batch caller) rather
|
|
29
|
+
* than re-paid on every one of the ~230 iterate-spec entries.
|
|
30
|
+
*/
|
|
31
|
+
import { readdir, stat } from "node:fs/promises";
|
|
32
|
+
import { realpathSync } from "node:fs";
|
|
33
|
+
import path from "node:path";
|
|
34
|
+
import { pathGuard, realPathGuard } from "./path-guard.js";
|
|
35
|
+
const AGENT_DOCS = [
|
|
36
|
+
{ file: "build_dashboard.md", label: "Dashboard" },
|
|
37
|
+
{ file: "architecture.md", label: "Architecture" },
|
|
38
|
+
{ file: "decision_log.md", label: "Decision Log" },
|
|
39
|
+
{ file: "conventions.md", label: "Conventions" },
|
|
40
|
+
{ file: "design_tokens.md", label: "Design Tokens" },
|
|
41
|
+
];
|
|
42
|
+
const COMPLIANCE_DOCS = [
|
|
43
|
+
{ file: "dashboard.md", label: "Dashboard" },
|
|
44
|
+
{ file: "traceability-matrix.md", label: "Traceability Matrix" },
|
|
45
|
+
{ file: "test-evidence.md", label: "Test Evidence" },
|
|
46
|
+
{ file: "change-history.md", label: "Change History" },
|
|
47
|
+
{ file: "sbom.md", label: "SBOM" },
|
|
48
|
+
];
|
|
49
|
+
const PLANNING_SECTION_EXCLUDES = new Set(["iterate", "adr", "campaigns"]);
|
|
50
|
+
/** "01-adopted" → "01 — Adopted"; no dash → the raw name unchanged. */
|
|
51
|
+
function sectionLabel(dirName) {
|
|
52
|
+
const dash = dirName.indexOf("-");
|
|
53
|
+
if (dash === -1)
|
|
54
|
+
return dirName;
|
|
55
|
+
const num = dirName.slice(0, dash);
|
|
56
|
+
const rest = dirName
|
|
57
|
+
.slice(dash + 1)
|
|
58
|
+
.split("-")
|
|
59
|
+
.filter(Boolean)
|
|
60
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
61
|
+
.join(" ");
|
|
62
|
+
return rest ? `${num} — ${rest}` : dirName;
|
|
63
|
+
}
|
|
64
|
+
/** Guard + realpath-verify `relPath`; null if it fails the guard, doesn't
|
|
65
|
+
* exist, or escapes the project root via a symlink (skip-silently caller
|
|
66
|
+
* contract — see module doc). */
|
|
67
|
+
function verifiedAbsolute(projectRoot, realRoot, relPath) {
|
|
68
|
+
const guard = pathGuard(projectRoot, relPath);
|
|
69
|
+
if (!guard.ok)
|
|
70
|
+
return null;
|
|
71
|
+
const real = realPathGuard(projectRoot, guard.absolute, realRoot);
|
|
72
|
+
return real.ok ? real.absolute : null;
|
|
73
|
+
}
|
|
74
|
+
async function mtimeIso(absPath) {
|
|
75
|
+
try {
|
|
76
|
+
const s = await stat(absPath);
|
|
77
|
+
return s.mtime.toISOString();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function curatedRows(projectRoot, realRoot, relDir, files) {
|
|
84
|
+
const rows = [];
|
|
85
|
+
for (const { file, label } of files) {
|
|
86
|
+
const relPath = `${relDir}/${file}`;
|
|
87
|
+
const abs = verifiedAbsolute(projectRoot, realRoot, relPath);
|
|
88
|
+
if (!abs)
|
|
89
|
+
continue; // missing on disk — skip silently, no error row
|
|
90
|
+
const when = await mtimeIso(abs);
|
|
91
|
+
if (when === null)
|
|
92
|
+
continue; // vanished between realpath and stat — skip
|
|
93
|
+
rows.push({ path: relPath, label, when });
|
|
94
|
+
}
|
|
95
|
+
return rows;
|
|
96
|
+
}
|
|
97
|
+
async function readRequirements(projectRoot, realRoot) {
|
|
98
|
+
const planningRel = ".shipwright/planning";
|
|
99
|
+
const guard = pathGuard(projectRoot, planningRel);
|
|
100
|
+
if (!guard.ok)
|
|
101
|
+
return [];
|
|
102
|
+
let entries;
|
|
103
|
+
try {
|
|
104
|
+
entries = await readdir(guard.absolute, { withFileTypes: true });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
const rows = [];
|
|
110
|
+
for (const d of entries) {
|
|
111
|
+
if (!d.isDirectory() || PLANNING_SECTION_EXCLUDES.has(d.name))
|
|
112
|
+
continue;
|
|
113
|
+
const relPath = `${planningRel}/${d.name}/spec.md`;
|
|
114
|
+
const abs = verifiedAbsolute(projectRoot, realRoot, relPath);
|
|
115
|
+
if (!abs)
|
|
116
|
+
continue; // section without its own spec.md — skip
|
|
117
|
+
const when = await mtimeIso(abs);
|
|
118
|
+
if (when === null)
|
|
119
|
+
continue;
|
|
120
|
+
rows.push({ path: relPath, label: sectionLabel(d.name), when });
|
|
121
|
+
}
|
|
122
|
+
rows.sort((a, b) => a.label.localeCompare(b.label));
|
|
123
|
+
return rows;
|
|
124
|
+
}
|
|
125
|
+
async function readIterateSpecs(projectRoot, realRoot) {
|
|
126
|
+
const relDir = ".shipwright/planning/iterate";
|
|
127
|
+
const guard = pathGuard(projectRoot, relDir);
|
|
128
|
+
if (!guard.ok)
|
|
129
|
+
return [];
|
|
130
|
+
let entries;
|
|
131
|
+
try {
|
|
132
|
+
entries = await readdir(guard.absolute, { withFileTypes: true });
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
const rows = [];
|
|
138
|
+
for (const d of entries) {
|
|
139
|
+
// Flat files only (per the panel's Iterate tab spec) — a subdirectory
|
|
140
|
+
// like campaigns/ or a per-run folder is out of scope here.
|
|
141
|
+
if (!d.isFile() || !d.name.endsWith(".md"))
|
|
142
|
+
continue;
|
|
143
|
+
const relPath = `${relDir}/${d.name}`;
|
|
144
|
+
const abs = verifiedAbsolute(projectRoot, realRoot, relPath);
|
|
145
|
+
if (!abs)
|
|
146
|
+
continue;
|
|
147
|
+
const when = await mtimeIso(abs);
|
|
148
|
+
rows.push({ path: relPath, label: d.name, when });
|
|
149
|
+
}
|
|
150
|
+
// Newest first; a row with no readable mtime sorts last rather than
|
|
151
|
+
// fabricating a position it didn't earn.
|
|
152
|
+
rows.sort((a, b) => {
|
|
153
|
+
if (a.when === b.when)
|
|
154
|
+
return a.label.localeCompare(b.label);
|
|
155
|
+
if (a.when === null)
|
|
156
|
+
return 1;
|
|
157
|
+
if (b.when === null)
|
|
158
|
+
return -1;
|
|
159
|
+
return a.when < b.when ? 1 : -1;
|
|
160
|
+
});
|
|
161
|
+
return rows;
|
|
162
|
+
}
|
|
163
|
+
export async function readShipsLogDocs(projectRoot) {
|
|
164
|
+
let realRoot;
|
|
165
|
+
try {
|
|
166
|
+
realRoot = realpathSync(path.resolve(projectRoot));
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Project root itself unreadable — every group degrades to empty
|
|
170
|
+
// rather than throwing (this is a read-only observer, spec AC-honesty).
|
|
171
|
+
return { requirements: [], iterateSpecs: [], agentDocs: [], compliance: [] };
|
|
172
|
+
}
|
|
173
|
+
const [requirements, iterateSpecs, agentDocs, compliance] = await Promise.all([
|
|
174
|
+
readRequirements(projectRoot, realRoot),
|
|
175
|
+
readIterateSpecs(projectRoot, realRoot),
|
|
176
|
+
curatedRows(projectRoot, realRoot, ".shipwright/agent_docs", AGENT_DOCS),
|
|
177
|
+
curatedRows(projectRoot, realRoot, ".shipwright/compliance", COMPLIANCE_DOCS),
|
|
178
|
+
]);
|
|
179
|
+
return { requirements, iterateSpecs, agentDocs, compliance };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=shipslog-docs-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipslog-docs-reader.js","sourceRoot":"","sources":["../../src/core/shipslog-docs-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ShipsLogDocRow {
|
|
2
|
+
/** Project-root-relative POSIX path, passed straight to SmartViewerModal. */
|
|
3
|
+
path: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** ISO mtime, or null when the stat failed after the existence check
|
|
6
|
+
* (a TOCTOU race — treated as "date unknown", never fabricated). */
|
|
7
|
+
when: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface ShipsLogDocsBundle {
|
|
10
|
+
requirements: ShipsLogDocRow[];
|
|
11
|
+
iterateSpecs: ShipsLogDocRow[];
|
|
12
|
+
agentDocs: ShipsLogDocRow[];
|
|
13
|
+
compliance: ShipsLogDocRow[];
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=shipslog-docs-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipslog-docs-types.d.ts","sourceRoot":"","sources":["../../src/core/shipslog-docs-types.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;yEACqE;IACrE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* shipslog-docs-types.ts — shape contract for the Ship's-Log Documents
|
|
3
|
+
* panel read surface (iterate-2026-08-31-shipslog-documents-panel):
|
|
4
|
+
* curated links to a project's Requirements spec(s) (per planning-section
|
|
5
|
+
* ur-spec, .shipwright/planning/<section>/spec.md), Iterate mini-specs
|
|
6
|
+
* (.shipwright/planning/iterate/*.md), Agent Docs and Compliance docs.
|
|
7
|
+
*
|
|
8
|
+
* Split out (not folded into the reader) to match the run-data-types.ts
|
|
9
|
+
* precedent; verbatim-mirrored client-side in
|
|
10
|
+
* client/src/lib/shipsLogDocsApi.ts (ADR-080 — no cross-package import).
|
|
11
|
+
* Drift guard: server/src/test/shipslog-docs-mirror-sync.test.ts.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=shipslog-docs-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipslog-docs-types.js","sourceRoot":"","sources":["../../src/core/shipslog-docs-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ShipwrightPluginVersionReaderDeps {
|
|
2
|
+
/** Injected for tests; defaults to fs/promises.readFile + utf-8. */
|
|
3
|
+
readFile?: (path: string) => Promise<string>;
|
|
4
|
+
/** Injected for tests; defaults to os.homedir(). */
|
|
5
|
+
homedir?: () => string;
|
|
6
|
+
}
|
|
7
|
+
/** Absolute path to the shipwright marketplace manifest. */
|
|
8
|
+
export declare function shipwrightMarketplaceManifestPath(home: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Read the shipwright plugin suite's version, or `null` when it can't be
|
|
11
|
+
* determined (not installed, unreadable, malformed). Swallows every error —
|
|
12
|
+
* the caller treats `null` as "unknown", never as a 500.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readShipwrightPluginVersion(deps?: ShipwrightPluginVersionReaderDeps): Promise<string | null>;
|
|
15
|
+
//# sourceMappingURL=shipwright-plugin-version-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipwright-plugin-version-reader.d.ts","sourceRoot":"","sources":["../../src/core/shipwright-plugin-version-reader.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iCAAiC;IAChD,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAED,4DAA4D;AAC5D,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,GAAE,iCAAsC,GAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Shipwright plugin-suite version reader (iterate-2026-09-05-nav-collapse-
|
|
3
|
+
* and-version-badges).
|
|
4
|
+
*
|
|
5
|
+
* Reads the single suite-wide `version` stamp from the "shipwright"
|
|
6
|
+
* marketplace manifest at `~/.claude/plugins/marketplaces/shipwright/
|
|
7
|
+
* .claude-plugin/marketplace.json`. All 14 shipwright plugins release in
|
|
8
|
+
* lockstep and share this one version (see CLAUDE.md memory: "Monorepo
|
|
9
|
+
* release MUST bump all 14 plugin.json + marketplace.json stamps"), so the
|
|
10
|
+
* marketplace manifest's top-level `version` is the single unambiguous
|
|
11
|
+
* source for "the current plugin version" the Diagnostics page shows —
|
|
12
|
+
* reading any one of the 14 per-plugin manifests would be an arbitrary pick.
|
|
13
|
+
*
|
|
14
|
+
* Read-only, best-effort, same shape as claude-theme-reader.ts: a missing
|
|
15
|
+
* marketplace (plugin not installed), unreadable file, non-JSON body, or
|
|
16
|
+
* absent/non-string `version` all resolve to `null` (never throw).
|
|
17
|
+
*/
|
|
18
|
+
import { readFile } from "node:fs/promises";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
/** Absolute path to the shipwright marketplace manifest. */
|
|
22
|
+
export function shipwrightMarketplaceManifestPath(home) {
|
|
23
|
+
return join(home, ".claude", "plugins", "marketplaces", "shipwright", ".claude-plugin", "marketplace.json");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read the shipwright plugin suite's version, or `null` when it can't be
|
|
27
|
+
* determined (not installed, unreadable, malformed). Swallows every error —
|
|
28
|
+
* the caller treats `null` as "unknown", never as a 500.
|
|
29
|
+
*/
|
|
30
|
+
export async function readShipwrightPluginVersion(deps = {}) {
|
|
31
|
+
const home = (deps.homedir ?? homedir)();
|
|
32
|
+
const fsRead = deps.readFile ?? ((p) => readFile(p, "utf-8"));
|
|
33
|
+
try {
|
|
34
|
+
const raw = await fsRead(shipwrightMarketplaceManifestPath(home));
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
if (parsed &&
|
|
37
|
+
typeof parsed === "object" &&
|
|
38
|
+
"version" in parsed &&
|
|
39
|
+
typeof parsed.version === "string") {
|
|
40
|
+
const version = parsed.version.trim();
|
|
41
|
+
return version.length > 0 ? version : null;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=shipwright-plugin-version-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shipwright-plugin-version-reader.js","sourceRoot":"","sources":["../../src/core/shipwright-plugin-version-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,4DAA4D;AAC5D,MAAM,UAAU,iCAAiC,CAAC,IAAY;IAC5D,OAAO,IAAI,CACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAA0C,EAAE;IAE5C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,SAAS,IAAI,MAAM;YACnB,OAAQ,MAA+B,CAAC,OAAO,KAAK,QAAQ,EAC5D,CAAC;YACD,MAAM,OAAO,GAAI,MAA8B,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -61,33 +61,33 @@ const SERVE_MIME = Object.freeze({
|
|
|
61
61
|
* markdown to the WebUI host. `write()` captures the blob text and posts it;
|
|
62
62
|
* it must NEVER reject (a throw would drop the viewer into its download
|
|
63
63
|
* fallback). Posts with `targetOrigin === location.origin` (same-origin host). */
|
|
64
|
-
const FEEDBACK_BRIDGE = `<script>
|
|
65
|
-
(function () {
|
|
66
|
-
var HOST_ORIGIN = window.location.origin;
|
|
67
|
-
function post(text) {
|
|
68
|
-
try {
|
|
69
|
-
window.parent.postMessage(
|
|
70
|
-
{ type: "shipwright:design-feedback", markdown: String(text) },
|
|
71
|
-
HOST_ORIGIN
|
|
72
|
-
);
|
|
73
|
-
} catch (e) { /* never let a post error trip the viewer's download fallback */ }
|
|
74
|
-
}
|
|
75
|
-
window.showSaveFilePicker = function () {
|
|
76
|
-
return Promise.resolve({
|
|
77
|
-
createWritable: function () {
|
|
78
|
-
return Promise.resolve({
|
|
79
|
-
write: function (blob) {
|
|
80
|
-
return Promise.resolve(
|
|
81
|
-
blob && typeof blob.text === "function" ? blob.text() : blob
|
|
82
|
-
).then(post, function () { /* swallow */ });
|
|
83
|
-
},
|
|
84
|
-
close: function () { return Promise.resolve(); },
|
|
85
|
-
});
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
};
|
|
89
|
-
})();
|
|
90
|
-
</script>
|
|
64
|
+
const FEEDBACK_BRIDGE = `<script>
|
|
65
|
+
(function () {
|
|
66
|
+
var HOST_ORIGIN = window.location.origin;
|
|
67
|
+
function post(text) {
|
|
68
|
+
try {
|
|
69
|
+
window.parent.postMessage(
|
|
70
|
+
{ type: "shipwright:design-feedback", markdown: String(text) },
|
|
71
|
+
HOST_ORIGIN
|
|
72
|
+
);
|
|
73
|
+
} catch (e) { /* never let a post error trip the viewer's download fallback */ }
|
|
74
|
+
}
|
|
75
|
+
window.showSaveFilePicker = function () {
|
|
76
|
+
return Promise.resolve({
|
|
77
|
+
createWritable: function () {
|
|
78
|
+
return Promise.resolve({
|
|
79
|
+
write: function (blob) {
|
|
80
|
+
return Promise.resolve(
|
|
81
|
+
blob && typeof blob.text === "function" ? blob.text() : blob
|
|
82
|
+
).then(post, function () { /* swallow */ });
|
|
83
|
+
},
|
|
84
|
+
close: function () { return Promise.resolve(); },
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
})();
|
|
90
|
+
</script>
|
|
91
91
|
`;
|
|
92
92
|
/** Insert the bridge before the first <script> (so the override is defined
|
|
93
93
|
* before the viewer script runs), else before </body>, else append. */
|
|
@@ -1,30 +1,7 @@
|
|
|
1
1
|
import { SessionWatcher } from "../../core/session-watcher.js";
|
|
2
2
|
import { SdkSessionsStore } from "../../core/sdk-sessions-store.js";
|
|
3
|
-
export type AggregatedEntry
|
|
4
|
-
|
|
5
|
-
taskId: string;
|
|
6
|
-
sessionUuid: string;
|
|
7
|
-
taskTitle: string;
|
|
8
|
-
toolUseId: string;
|
|
9
|
-
toolName: string;
|
|
10
|
-
input: unknown;
|
|
11
|
-
bestEffort: true;
|
|
12
|
-
} | {
|
|
13
|
-
kind: "text_question";
|
|
14
|
-
taskId: string;
|
|
15
|
-
sessionUuid: string;
|
|
16
|
-
taskTitle: string;
|
|
17
|
-
questionId: string;
|
|
18
|
-
questionText: string;
|
|
19
|
-
bestEffort: true;
|
|
20
|
-
} | {
|
|
21
|
-
kind: "terminal_prompt";
|
|
22
|
-
taskId: string;
|
|
23
|
-
sessionUuid: string;
|
|
24
|
-
taskTitle: string;
|
|
25
|
-
promptText: string;
|
|
26
|
-
bestEffort: true;
|
|
27
|
-
};
|
|
3
|
+
export type { AggregatedEntry } from "./_types.js";
|
|
4
|
+
import type { AggregatedEntry } from "./_types.js";
|
|
28
5
|
/**
|
|
29
6
|
* Walk every task in the store, return cached entries on a warm hit
|
|
30
7
|
* (mtime + dismissed unchanged), otherwise re-read the JSONL +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_derive.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/_derive.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,OAAO,EACL,gBAAgB,EAEjB,MAAM,kCAAkC,CAAC;AAS1C,
|
|
1
|
+
{"version":3,"file":"_derive.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/_derive.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAO/D,OAAO,EACL,gBAAgB,EAEjB,MAAM,kCAAkC,CAAC;AAS1C,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAyH/D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EAAE,EACtB,IAAI,EAAE;IACJ,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE;QACV,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7B,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;KAClD,CAAC;CACH,GACA,IAAI,CA2CN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_derive.js","sourceRoot":"","sources":["../../../src/external/inbox/_derive.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAM7E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,GAEvB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"_derive.js","sourceRoot":"","sources":["../../../src/external/inbox/_derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SdkSessionsStore } from "../../core/sdk-sessions-store.js";
|
|
2
|
+
import type { AggregatedEntry } from "./_types.js";
|
|
3
|
+
/** Dismiss-id prefix for a `lead_question` — disambiguates from a JSONL `toolUseId` (which never starts with this). */
|
|
4
|
+
export declare const LEAD_QUESTION_DISMISS_PREFIX = "lq-";
|
|
5
|
+
export declare function leadQuestionDismissId(taskId: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* FR-04.37 outbound: the marker line is an internal sentinel and must
|
|
8
|
+
* never reach the rendered "notification" (the inbox card) — strip it
|
|
9
|
+
* and return the human-authored body only. `null` when no marker is
|
|
10
|
+
* present (an ordinary task description, not a waiting follow-up).
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractLeadQuestionBody(description: string | undefined): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Post-pass over the store (mirrors `appendTerminalPrompts`'s shape):
|
|
15
|
+
* append one `lead_question` entry per waiting, non-dismissed, unanswered
|
|
16
|
+
* task. Runs after the JSONL-derived pass; a task already surfaced under
|
|
17
|
+
* another kind (e.g. a live `ask_tool`) still gets its own lead_question
|
|
18
|
+
* entry too — the two are independent waiting states on the same task.
|
|
19
|
+
*/
|
|
20
|
+
export declare function appendLeadQuestions(entries: AggregatedEntry[], args: {
|
|
21
|
+
store: SdkSessionsStore;
|
|
22
|
+
}): void;
|
|
23
|
+
//# sourceMappingURL=_lead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_lead.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/_lead.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AASnD,uHAAuH;AACvH,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAQf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,eAAe,EAAE,EAC1B,IAAI,EAAE;IAAE,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAChC,IAAI,CAkBN"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/inbox/_lead.ts — the `lead_question` inbox kind (FR-04.17/18/19).
|
|
3
|
+
*
|
|
4
|
+
* Unlike `ask_tool`/`text_question`/`terminal_prompt` (derived from a JSONL
|
|
5
|
+
* or live-terminal read — see `./_derive.ts`), a `lead_question` is WRITTEN:
|
|
6
|
+
* leadwright's `renderLeadQuestion` (separate repo, `lib/lead-question.ts`)
|
|
7
|
+
* puts a `<!-- lead-question:TYPE -->` marker line at the top of a task's
|
|
8
|
+
* `description` when it proposes a follow-up. This module only needs to
|
|
9
|
+
* detect that marker's PRESENCE and strip it — the six named question
|
|
10
|
+
* types are leadwright's own vocabulary (FR-04.18), not webui's. Per
|
|
11
|
+
* CLAUDE.md DO-NOT #7 this is a verbatim, independent mirror of the
|
|
12
|
+
* detection regex, not a cross-package import.
|
|
13
|
+
*
|
|
14
|
+
* A task is "waiting" iff its description carries the marker AND it has
|
|
15
|
+
* not yet been answered (`poFeedback` unset) and not yet dismissed.
|
|
16
|
+
*
|
|
17
|
+
* CONTRACT (by design, not a bug): both suppressions are per-TASK, not
|
|
18
|
+
* per-question. Once `poFeedback` is set (answered) or `lq-<taskId>` is
|
|
19
|
+
* dismissed, this task can surface no FURTHER lead_question until
|
|
20
|
+
* leadwright clears `poFeedback` and rewrites `description` for the next
|
|
21
|
+
* follow-up — there is no per-question id to key a narrower suppression on,
|
|
22
|
+
* and inventing one is explicitly out of scope here (that's leadwright's
|
|
23
|
+
* FR-04.18 concern, not webui's). If leadwright ever needs to re-ask on the
|
|
24
|
+
* SAME task while an old answer is still present, it must clear
|
|
25
|
+
* `poFeedback` first.
|
|
26
|
+
*/
|
|
27
|
+
const LEAD_QUESTION_MARKER_RE = /^<!--\s*lead-question:[a-zäöüß-]+\s*-->/;
|
|
28
|
+
// Same marker, but matched anywhere on its own line — used to strip a
|
|
29
|
+
// re-ask's marker appended BELOW the leading one, so the sentinel can never
|
|
30
|
+
// survive into the body even from a second occurrence (FR-04.37).
|
|
31
|
+
const LEAD_QUESTION_MARKER_LINE_RE = /^[ \t]*<!--\s*lead-question:[a-zäöüß-]+\s*-->[ \t]*$/gim;
|
|
32
|
+
/** Dismiss-id prefix for a `lead_question` — disambiguates from a JSONL `toolUseId` (which never starts with this). */
|
|
33
|
+
export const LEAD_QUESTION_DISMISS_PREFIX = "lq-";
|
|
34
|
+
export function leadQuestionDismissId(taskId) {
|
|
35
|
+
return `${LEAD_QUESTION_DISMISS_PREFIX}${taskId}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* FR-04.37 outbound: the marker line is an internal sentinel and must
|
|
39
|
+
* never reach the rendered "notification" (the inbox card) — strip it
|
|
40
|
+
* and return the human-authored body only. `null` when no marker is
|
|
41
|
+
* present (an ordinary task description, not a waiting follow-up).
|
|
42
|
+
*/
|
|
43
|
+
export function extractLeadQuestionBody(description) {
|
|
44
|
+
if (typeof description !== "string")
|
|
45
|
+
return null;
|
|
46
|
+
const match = LEAD_QUESTION_MARKER_RE.exec(description);
|
|
47
|
+
if (!match)
|
|
48
|
+
return null;
|
|
49
|
+
return description
|
|
50
|
+
.slice(match[0].length)
|
|
51
|
+
.replace(/^[\r\n]+/, "")
|
|
52
|
+
.replace(LEAD_QUESTION_MARKER_LINE_RE, "");
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Post-pass over the store (mirrors `appendTerminalPrompts`'s shape):
|
|
56
|
+
* append one `lead_question` entry per waiting, non-dismissed, unanswered
|
|
57
|
+
* task. Runs after the JSONL-derived pass; a task already surfaced under
|
|
58
|
+
* another kind (e.g. a live `ask_tool`) still gets its own lead_question
|
|
59
|
+
* entry too — the two are independent waiting states on the same task.
|
|
60
|
+
*/
|
|
61
|
+
export function appendLeadQuestions(entries, args) {
|
|
62
|
+
const { store } = args;
|
|
63
|
+
for (const task of store.list()) {
|
|
64
|
+
if (task.state === "done" || task.state === "launch_failed")
|
|
65
|
+
continue;
|
|
66
|
+
if (task.poFeedback)
|
|
67
|
+
continue;
|
|
68
|
+
const body = extractLeadQuestionBody(task.description);
|
|
69
|
+
if (body === null)
|
|
70
|
+
continue;
|
|
71
|
+
if (task.inbox.dismissedToolUseIds.includes(leadQuestionDismissId(task.taskId))) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
entries.push({
|
|
75
|
+
kind: "lead_question",
|
|
76
|
+
taskId: task.taskId,
|
|
77
|
+
sessionUuid: task.sessionUuid,
|
|
78
|
+
taskTitle: task.title,
|
|
79
|
+
questionText: body,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=_lead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_lead.js","sourceRoot":"","sources":["../../../src/external/inbox/_lead.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,MAAM,uBAAuB,GAAG,yCAAyC,CAAC;AAC1E,sEAAsE;AACtE,4EAA4E;AAC5E,kEAAkE;AAClE,MAAM,4BAA4B,GAChC,yDAAyD,CAAC;AAE5D,uHAAuH;AACvH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,GAAG,4BAA4B,GAAG,MAAM,EAAE,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAA+B;IAE/B,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,WAAW;SACf,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SACtB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA0B,EAC1B,IAAiC;IAEjC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe;YAAE,SAAS;QACtE,IAAI,IAAI,CAAC,UAAU;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAChF,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type AggregatedEntry = {
|
|
2
|
+
kind: "ask_tool";
|
|
3
|
+
taskId: string;
|
|
4
|
+
sessionUuid: string;
|
|
5
|
+
taskTitle: string;
|
|
6
|
+
toolUseId: string;
|
|
7
|
+
toolName: string;
|
|
8
|
+
input: unknown;
|
|
9
|
+
bestEffort: true;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "text_question";
|
|
12
|
+
taskId: string;
|
|
13
|
+
sessionUuid: string;
|
|
14
|
+
taskTitle: string;
|
|
15
|
+
questionId: string;
|
|
16
|
+
questionText: string;
|
|
17
|
+
bestEffort: true;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "terminal_prompt";
|
|
20
|
+
taskId: string;
|
|
21
|
+
sessionUuid: string;
|
|
22
|
+
taskTitle: string;
|
|
23
|
+
promptText: string;
|
|
24
|
+
bestEffort: true;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "lead_question";
|
|
27
|
+
taskId: string;
|
|
28
|
+
sessionUuid: string;
|
|
29
|
+
taskTitle: string;
|
|
30
|
+
questionText: string;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=_types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/_types.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,CAAC;CAClB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;CAClB,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* external/inbox/_types.ts — the aggregator's output shape, shared by
|
|
3
|
+
* `_derive.ts` (JSONL/terminal-derived kinds) and `_lead.ts` (the written
|
|
4
|
+
* `lead_question` kind). Split out to keep `_derive.ts` under the 300-LOC
|
|
5
|
+
* guideline. Discriminated union precedence: ask_tool > terminal_prompt >
|
|
6
|
+
* text_question; `lead_question` is independent of that precedence — it
|
|
7
|
+
* reflects a different waiting state on the same task, not a JSONL read.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=_types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_types.js","sourceRoot":"","sources":["../../../src/external/inbox/_types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/external/inbox/routes.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAUpE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE;QACV,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7B,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;KAClD,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAoE7D"}
|