@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,234 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* pty-write-chunker.ts — UTF-8-safe chunking + same-task write serialization
|
|
3
|
+
* for a single pty.write() chokepoint (iterate-2026-09-05-terminal-large-
|
|
4
|
+
* command-chunked-pty-write, FR-01.28).
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS MODULE EXISTS. A task's first launch bakes the full task prompt
|
|
7
|
+
* into the launch command as a `--session-id ... "<prompt>"` argument; a
|
|
8
|
+
* long prompt produces a multi-KB command, auto-typed into the embedded
|
|
9
|
+
* terminal in one shot. `PtyManager.write()` used to forward the whole
|
|
10
|
+
* burst to `entry.pty.write()` in a single call. On macOS, canonical-mode
|
|
11
|
+
* tty input queues (~1 KiB) hold an unterminated line unread until its
|
|
12
|
+
* trailing newline arrives, so one write() bigger than the queue blocks
|
|
13
|
+
* the Node main thread forever waiting for room a blocked event loop can
|
|
14
|
+
* never free — freezing every other session on the same process.
|
|
15
|
+
*
|
|
16
|
+
* This module owns two things that belong together:
|
|
17
|
+
*
|
|
18
|
+
* 1. CHUNKING — `chunkUtf8ForPtyWrite` splits a burst into sub-cap,
|
|
19
|
+
* UTF-8-safe pieces (never splitting a multi-byte sequence across a
|
|
20
|
+
* chunk boundary).
|
|
21
|
+
* 2. SERIALIZATION — `ChunkedPtyWriter` spaces those pieces out over
|
|
22
|
+
* real scheduler ticks so the shell can drain its queue between
|
|
23
|
+
* writes, and queues (never interleaves) a second same-task write
|
|
24
|
+
* that arrives while a chunked burst is still draining — a keystroke,
|
|
25
|
+
* the paste-image path, or a mouse report would otherwise splice
|
|
26
|
+
* bytes into the middle of the still-draining first burst.
|
|
27
|
+
*
|
|
28
|
+
* Extracted from `pty-manager.ts` (which already carries an ADR-101 bloat
|
|
29
|
+
* exception) as a cohesive split, mirroring `backpressure-telemetry.ts`'s
|
|
30
|
+
* precedent: the concern only ever touches an entry's `pty.write()` call
|
|
31
|
+
* and its own busy/queue bookkeeping, never anything else `PtyManager`
|
|
32
|
+
* owns, so `ChunkedPtyWriteEntry` below is a narrow structural interface
|
|
33
|
+
* rather than a dependency on `PtyEntry` itself.
|
|
34
|
+
*
|
|
35
|
+
* Six review passes hardened this (unclamped chunk size, mid-drain
|
|
36
|
+
* interleaving, an unguarded mouse-report path, an uncapped pending queue,
|
|
37
|
+
* a mutually-recursive drain, a recursive scheduler callback — each fixed
|
|
38
|
+
* where found). Full history: the run-id's ADR.
|
|
39
|
+
*/
|
|
40
|
+
export const DEFAULT_PTY_WRITE_CHUNK_BYTES = 512;
|
|
41
|
+
export const DEFAULT_PTY_WRITE_CHUNK_DELAY_MS = 5;
|
|
42
|
+
/**
|
|
43
|
+
* Split `data` into chunks whose UTF-8 byte length is <= maxBytes, never
|
|
44
|
+
* splitting a multi-byte UTF-8 sequence across a chunk boundary. Exported
|
|
45
|
+
* for direct unit coverage.
|
|
46
|
+
*/
|
|
47
|
+
export function chunkUtf8ForPtyWrite(data, maxBytes) {
|
|
48
|
+
const buf = Buffer.from(data, "utf8");
|
|
49
|
+
if (buf.length === 0)
|
|
50
|
+
return [data];
|
|
51
|
+
// Code-review finding (2026-09-05): an unclamped maxBytes <= 0 never lets
|
|
52
|
+
// `start` advance below, spinning the while-loop forever — exactly the
|
|
53
|
+
// "whole main thread blocked" failure this chunking exists to eliminate,
|
|
54
|
+
// just triggered by a bad config value instead of an oversized burst. A
|
|
55
|
+
// UTF-8 code point is at most 4 bytes, so clamping the floor to 4
|
|
56
|
+
// guarantees both termination and that a chunk boundary always has room
|
|
57
|
+
// to land clear of a multi-byte sequence.
|
|
58
|
+
// External-review finding (2026-09-05, Tier-3): Math.max(4, NaN) is NaN,
|
|
59
|
+
// so a non-finite maxBytes (misconfiguration, not just <= 0) must also
|
|
60
|
+
// fall back rather than silently propagate NaN into subarray() below,
|
|
61
|
+
// which would clamp to an empty first chunk and drop the whole write.
|
|
62
|
+
const safeMaxBytes = Math.max(4, Number.isFinite(maxBytes) ? Math.floor(maxBytes) : DEFAULT_PTY_WRITE_CHUNK_BYTES);
|
|
63
|
+
const chunks = [];
|
|
64
|
+
let start = 0;
|
|
65
|
+
while (start < buf.length) {
|
|
66
|
+
let end = Math.min(start + safeMaxBytes, buf.length);
|
|
67
|
+
// Back off past continuation bytes (0b10xxxxxx) so a multi-byte UTF-8
|
|
68
|
+
// sequence is never split across a chunk boundary.
|
|
69
|
+
while (end > start && end < buf.length && (buf[end] & 0xc0) === 0x80) {
|
|
70
|
+
end--;
|
|
71
|
+
}
|
|
72
|
+
if (end === start) {
|
|
73
|
+
// No valid split point within safeMaxBytes — unreachable for
|
|
74
|
+
// well-formed UTF-8 given the >=4 floor above, but fail safe by
|
|
75
|
+
// forcing progress rather than looping forever on malformed input.
|
|
76
|
+
end = Math.min(start + safeMaxBytes, buf.length);
|
|
77
|
+
}
|
|
78
|
+
chunks.push(buf.subarray(start, end).toString("utf8"));
|
|
79
|
+
start = end;
|
|
80
|
+
}
|
|
81
|
+
return chunks;
|
|
82
|
+
}
|
|
83
|
+
/** Falls back to `fallback` for any non-finite or negative input. */
|
|
84
|
+
function normalizeNonNegative(value, fallback) {
|
|
85
|
+
return value !== undefined && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
86
|
+
}
|
|
87
|
+
/** Falls back to `fallback` for any non-finite or non-positive input. */
|
|
88
|
+
function normalizePositive(value, fallback) {
|
|
89
|
+
return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
90
|
+
}
|
|
91
|
+
/** Serializes and, when oversized, chunks writes to a single pty entry. */
|
|
92
|
+
export class ChunkedPtyWriter {
|
|
93
|
+
ptyWriteChunkBytes;
|
|
94
|
+
ptyWriteChunkDelayMs;
|
|
95
|
+
scheduleChunkWrite;
|
|
96
|
+
pendingWriteBytesCap;
|
|
97
|
+
constructor(opts = {}) {
|
|
98
|
+
// External-review finding (2026-09-05, Tier-3, non-blocking, 2nd pass): a
|
|
99
|
+
// 0/negative/non-finite ptyWriteChunkBytes made the "at/under cap"
|
|
100
|
+
// fast-path check disagree with chunkUtf8ForPtyWrite's own 4-byte floor.
|
|
101
|
+
this.ptyWriteChunkBytes = normalizePositive(opts.ptyWriteChunkBytes, DEFAULT_PTY_WRITE_CHUNK_BYTES);
|
|
102
|
+
// External-review finding (2026-09-05, Tier-3, non-blocking): a
|
|
103
|
+
// non-finite/negative delay or cap produced "surprising" behavior
|
|
104
|
+
// (setTimeout clamping a bad delay; a NaN cap making every `>` comparison
|
|
105
|
+
// false, so the cap check would never fire and the queue could grow
|
|
106
|
+
// unboundedly). Normalized at construction so a misconfigured option
|
|
107
|
+
// degrades to the documented default instead of silently misbehaving.
|
|
108
|
+
this.ptyWriteChunkDelayMs = normalizeNonNegative(opts.ptyWriteChunkDelayMs, DEFAULT_PTY_WRITE_CHUNK_DELAY_MS);
|
|
109
|
+
// Code-review finding 3: unref so a lone pending chunk-write timer can't
|
|
110
|
+
// hold the process open a beat past graceful shutdown.
|
|
111
|
+
this.scheduleChunkWrite = opts.scheduleChunkWrite ?? ((cb, ms) => { setTimeout(cb, ms).unref?.(); });
|
|
112
|
+
this.pendingWriteBytesCap = normalizeNonNegative(opts.pendingWriteBytesCap, 1_048_576);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Write `data` to `entry`, chunking it if oversized and queuing it
|
|
116
|
+
* (rather than executing immediately) if a chunked write for this same
|
|
117
|
+
* entry is already draining.
|
|
118
|
+
*/
|
|
119
|
+
write(entry, data) {
|
|
120
|
+
if (entry.chunkWriteBusy) {
|
|
121
|
+
const queue = (entry.pendingWrites ??= []);
|
|
122
|
+
const queuedBytes = entry.pendingWritesBytes ?? 0;
|
|
123
|
+
const dataBytes = Buffer.byteLength(data, "utf8");
|
|
124
|
+
// Doubt-review finding (2026-09-05): the queue itself must not become
|
|
125
|
+
// an unbounded-memory vector. Failing safe means dropping the NEW
|
|
126
|
+
// write whole (never truncating/corrupting an already-queued item).
|
|
127
|
+
if (queuedBytes + dataBytes > this.pendingWriteBytesCap) {
|
|
128
|
+
// eslint-disable-next-line no-console
|
|
129
|
+
console.warn(`[pty-write-chunker] pendingWrites cap exceeded for a chunked write in flight — dropping a queued write (${dataBytes} bytes)`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
queue.push(data);
|
|
133
|
+
entry.pendingWritesBytes = queuedBytes + dataBytes;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.deliverOrChunk(entry, data);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* External-review finding (2026-09-05, Tier-3, BLOCKING, 2nd pass): a
|
|
140
|
+
* synchronous `scheduleChunkWrite` (a public, injectable option) used to
|
|
141
|
+
* make `writeNext` recurse into itself once per chunk — same stack-depth
|
|
142
|
+
* bug as `drainPendingWrites` above, different call site. Trampoline fix:
|
|
143
|
+
* `step`'s own `for(;;)` loop advances through chunks; a synchronous
|
|
144
|
+
* reentrant call is caught by `running` and just flags "keep going" for
|
|
145
|
+
* that loop, while a genuinely async call finds `running` already false
|
|
146
|
+
* and re-enters fresh, preserving the real event-loop yield.
|
|
147
|
+
*/
|
|
148
|
+
deliverOrChunk(entry, data) {
|
|
149
|
+
if (Buffer.byteLength(data, "utf8") <= this.ptyWriteChunkBytes) {
|
|
150
|
+
entry.pty.write(data);
|
|
151
|
+
this.drainPendingWrites(entry);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
entry.chunkWriteBusy = true;
|
|
155
|
+
const chunks = chunkUtf8ForPtyWrite(data, this.ptyWriteChunkBytes);
|
|
156
|
+
let i = 0;
|
|
157
|
+
let running = false;
|
|
158
|
+
let scheduledSynchronously = false;
|
|
159
|
+
const step = () => {
|
|
160
|
+
if (running) {
|
|
161
|
+
// Reentrant synchronous call from inside scheduleChunkWrite below —
|
|
162
|
+
// do not recurse; tell the in-progress loop to keep going instead.
|
|
163
|
+
scheduledSynchronously = true;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
running = true;
|
|
167
|
+
try {
|
|
168
|
+
for (;;) {
|
|
169
|
+
// The task may have been closed/killed mid-flight.
|
|
170
|
+
if (entry.tornDown) {
|
|
171
|
+
entry.chunkWriteBusy = false;
|
|
172
|
+
// Doubt-review finding (2026-09-05): any writes still queued
|
|
173
|
+
// behind a torn-down burst are intentionally DROPPED here (not
|
|
174
|
+
// delivered, not logged) — there is nothing left to deliver
|
|
175
|
+
// them to.
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
entry.pty.write(chunks[i]);
|
|
179
|
+
i++;
|
|
180
|
+
if (i >= chunks.length) {
|
|
181
|
+
entry.chunkWriteBusy = false;
|
|
182
|
+
this.drainPendingWrites(entry);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
scheduledSynchronously = false;
|
|
186
|
+
this.scheduleChunkWrite(step, this.ptyWriteChunkDelayMs);
|
|
187
|
+
if (!scheduledSynchronously)
|
|
188
|
+
return; // async scheduler — its own later call continues this
|
|
189
|
+
// else: scheduler invoked step() synchronously (caught by the
|
|
190
|
+
// `running` guard above) — loop again ourselves instead.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
running = false;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
step();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Delivers (or re-chunks) queued writes once the entry is free.
|
|
201
|
+
*
|
|
202
|
+
* External-review finding (2026-09-05, Tier-3, BLOCKING): this used to
|
|
203
|
+
* call `deliverOrChunk`, which for a small write calls straight back into
|
|
204
|
+
* `drainPendingWrites` — mutual recursion with one stack frame per queued
|
|
205
|
+
* write. `pendingWriteBytesCap` bounds bytes, not COUNT, so a client
|
|
206
|
+
* flooding thousands of tiny writes during a burst's drain window could
|
|
207
|
+
* exceed the call stack and crash the whole process with an uncaught
|
|
208
|
+
* `RangeError` — the exact "frozen/dead server" failure this fix exists
|
|
209
|
+
* to eliminate, now reachable via the very flooding scenario the cap was
|
|
210
|
+
* added to guard against. Small queued writes are now delivered directly
|
|
211
|
+
* in an iterative loop (no re-entry into `deliverOrChunk`), so stack depth
|
|
212
|
+
* stays O(1) regardless of queue length. An oversized queued write still
|
|
213
|
+
* hands off to `deliverOrChunk`'s async chunked path (which sets
|
|
214
|
+
* `chunkWriteBusy` and returns after scheduling — not a recursive call),
|
|
215
|
+
* and the loop stops there; that path's own completion calls
|
|
216
|
+
* `drainPendingWrites` again to continue the queue.
|
|
217
|
+
*/
|
|
218
|
+
drainPendingWrites(entry) {
|
|
219
|
+
while (!entry.chunkWriteBusy) {
|
|
220
|
+
const next = entry.pendingWrites?.shift();
|
|
221
|
+
if (next === undefined)
|
|
222
|
+
return;
|
|
223
|
+
const nextBytes = Buffer.byteLength(next, "utf8");
|
|
224
|
+
entry.pendingWritesBytes = Math.max(0, (entry.pendingWritesBytes ?? 0) - nextBytes);
|
|
225
|
+
if (nextBytes <= this.ptyWriteChunkBytes) {
|
|
226
|
+
entry.pty.write(next);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
this.deliverOrChunk(entry, next);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=pty-write-chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-write-chunker.js","sourceRoot":"","sources":["../../src/terminal/pty-write-chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,12 @@ export type UsageResponse = {
|
|
|
22
22
|
runCount: number;
|
|
23
23
|
windowDays: number;
|
|
24
24
|
asOf: string;
|
|
25
|
+
/** Optional — an older producer (pre leadwright#38) omits both.
|
|
26
|
+
* A missing value must render as if it were absent, never as 0/false. */
|
|
27
|
+
unpricedCallsTotal?: number;
|
|
28
|
+
/** true = SOME sessions in this window measured, some didn't (a
|
|
29
|
+
* partial total). Absent/false = every session in the window measured. */
|
|
30
|
+
anyNotMeasured?: boolean;
|
|
25
31
|
};
|
|
26
32
|
export type CadenceUnresolvedReason = LeadOrgInfoReason | "invalid_cron";
|
|
27
33
|
export type LastRunResponse = {
|
|
@@ -103,6 +109,19 @@ export interface LeadRosterEntry {
|
|
|
103
109
|
export interface LeadsRosterResponse {
|
|
104
110
|
leads: LeadRosterEntry[];
|
|
105
111
|
}
|
|
112
|
+
export interface OrgThreadRoundView {
|
|
113
|
+
id: string;
|
|
114
|
+
question: string;
|
|
115
|
+
askedAt: string;
|
|
116
|
+
answer?: string;
|
|
117
|
+
answeredAt?: string;
|
|
118
|
+
}
|
|
119
|
+
export interface OrgThreadCardView {
|
|
120
|
+
cardId: string;
|
|
121
|
+
cardTitle: string;
|
|
122
|
+
rounds: OrgThreadRoundView[];
|
|
123
|
+
}
|
|
124
|
+
export type OrgThreadsResponse = Record<string, OrgThreadCardView[]>;
|
|
106
125
|
export interface AuditLogEntry {
|
|
107
126
|
raw: string;
|
|
108
127
|
parsed: Record<string, unknown> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/types/org.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAS7E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACzC;AAMD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,GACnC;IACE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/types/org.ts"],"names":[],"mappings":"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"}
|
package/server/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1
|
|
1
|
+
1
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
# Bundled stack profiles
|
|
2
|
-
|
|
3
|
-
This directory holds a **snapshot** of `shared/profiles/*.json` from the
|
|
4
|
-
Shipwright monorepo. The WebUI ships this snapshot so it can run
|
|
5
|
-
standalone — no Shipwright repo required at runtime.
|
|
6
|
-
|
|
7
|
-
## Lookup order (see `server/src/core/profile-loader.ts::getProfilesDir`)
|
|
8
|
-
|
|
9
|
-
1. `SHIPWRIGHT_PROFILES_DIR` — explicit user override (absolute path).
|
|
10
|
-
2. `SHIPWRIGHT_MONOREPO_PATH` → `<path>/shared/profiles/` — dev-loop
|
|
11
|
-
helper: when you're iterating on the Shipwright monorepo itself and
|
|
12
|
-
want profile edits to take effect without re-syncing the snapshot.
|
|
13
|
-
3. This directory (bundled snapshot) — the default when neither env
|
|
14
|
-
var is set.
|
|
15
|
-
|
|
16
|
-
## Keeping the snapshot fresh
|
|
17
|
-
|
|
18
|
-
The source of truth is `shipwright/shared/profiles/`. When profiles
|
|
19
|
-
change upstream, re-run:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
npm run sync-profiles # (from webui/server/)
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
…or just copy the changed files manually. There is no automatic sync —
|
|
26
|
-
the snapshot-vs-live drift is intentional so Shipwright and the WebUI
|
|
27
|
-
can release independently.
|
|
1
|
+
# Bundled stack profiles
|
|
2
|
+
|
|
3
|
+
This directory holds a **snapshot** of `shared/profiles/*.json` from the
|
|
4
|
+
Shipwright monorepo. The WebUI ships this snapshot so it can run
|
|
5
|
+
standalone — no Shipwright repo required at runtime.
|
|
6
|
+
|
|
7
|
+
## Lookup order (see `server/src/core/profile-loader.ts::getProfilesDir`)
|
|
8
|
+
|
|
9
|
+
1. `SHIPWRIGHT_PROFILES_DIR` — explicit user override (absolute path).
|
|
10
|
+
2. `SHIPWRIGHT_MONOREPO_PATH` → `<path>/shared/profiles/` — dev-loop
|
|
11
|
+
helper: when you're iterating on the Shipwright monorepo itself and
|
|
12
|
+
want profile edits to take effect without re-syncing the snapshot.
|
|
13
|
+
3. This directory (bundled snapshot) — the default when neither env
|
|
14
|
+
var is set.
|
|
15
|
+
|
|
16
|
+
## Keeping the snapshot fresh
|
|
17
|
+
|
|
18
|
+
The source of truth is `shipwright/shared/profiles/`. When profiles
|
|
19
|
+
change upstream, re-run:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run sync-profiles # (from webui/server/)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
…or just copy the changed files manually. There is no automatic sync —
|
|
26
|
+
the snapshot-vs-live drift is intentional so Shipwright and the WebUI
|
|
27
|
+
can release independently.
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "python-plugin-monorepo",
|
|
3
|
-
"description": "Python plugin monorepo (uv workspace). Library/framework with no deployable web server. Each subdirectory under plugins/ is its own pyproject.toml-managed package; shared/ holds cross-plugin scripts and profiles. No root dev server, no frontend.",
|
|
4
|
-
"version": "0.1.0",
|
|
5
|
-
"stack": {
|
|
6
|
-
"runtime": {
|
|
7
|
-
"python": "3.11+"
|
|
8
|
-
},
|
|
9
|
-
"frontend": {},
|
|
10
|
-
"backend": {}
|
|
11
|
-
},
|
|
12
|
-
"dev_server": null,
|
|
13
|
-
"services": [],
|
|
14
|
-
"testing": {
|
|
15
|
-
"unit": "pytest",
|
|
16
|
-
"command": "uv run pytest"
|
|
17
|
-
},
|
|
18
|
-
"linting": {
|
|
19
|
-
"tool": "ruff",
|
|
20
|
-
"command": "uv run ruff check"
|
|
21
|
-
},
|
|
22
|
-
"deploy": null,
|
|
23
|
-
"folder_structure": {
|
|
24
|
-
"plugins/": "Per-SDLC-phase Claude Code plugins (each with .claude-plugin/, hooks/, skills/, scripts/, tests/, pyproject.toml)",
|
|
25
|
-
"shared/": "Cross-plugin scripts, profiles, templates, prompts",
|
|
26
|
-
"docs/": "User-facing documentation (guide.md is canonical)",
|
|
27
|
-
"integration-tests/": "Cross-plugin integration tests",
|
|
28
|
-
"scripts/": "Top-level developer scripts (install.sh, update-marketplace.sh)"
|
|
29
|
-
},
|
|
30
|
-
"required_env_vars": {
|
|
31
|
-
"build": [],
|
|
32
|
-
"deploy": [],
|
|
33
|
-
"plugin": []
|
|
34
|
-
}
|
|
35
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "python-plugin-monorepo",
|
|
3
|
+
"description": "Python plugin monorepo (uv workspace). Library/framework with no deployable web server. Each subdirectory under plugins/ is its own pyproject.toml-managed package; shared/ holds cross-plugin scripts and profiles. No root dev server, no frontend.",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"stack": {
|
|
6
|
+
"runtime": {
|
|
7
|
+
"python": "3.11+"
|
|
8
|
+
},
|
|
9
|
+
"frontend": {},
|
|
10
|
+
"backend": {}
|
|
11
|
+
},
|
|
12
|
+
"dev_server": null,
|
|
13
|
+
"services": [],
|
|
14
|
+
"testing": {
|
|
15
|
+
"unit": "pytest",
|
|
16
|
+
"command": "uv run pytest"
|
|
17
|
+
},
|
|
18
|
+
"linting": {
|
|
19
|
+
"tool": "ruff",
|
|
20
|
+
"command": "uv run ruff check"
|
|
21
|
+
},
|
|
22
|
+
"deploy": null,
|
|
23
|
+
"folder_structure": {
|
|
24
|
+
"plugins/": "Per-SDLC-phase Claude Code plugins (each with .claude-plugin/, hooks/, skills/, scripts/, tests/, pyproject.toml)",
|
|
25
|
+
"shared/": "Cross-plugin scripts, profiles, templates, prompts",
|
|
26
|
+
"docs/": "User-facing documentation (guide.md is canonical)",
|
|
27
|
+
"integration-tests/": "Cross-plugin integration tests",
|
|
28
|
+
"scripts/": "Top-level developer scripts (install.sh, update-marketplace.sh)"
|
|
29
|
+
},
|
|
30
|
+
"required_env_vars": {
|
|
31
|
+
"build": [],
|
|
32
|
+
"deploy": [],
|
|
33
|
+
"plugin": []
|
|
34
|
+
}
|
|
35
|
+
}
|