@covro/covro 0.6.0 → 0.6.1-dev.2

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.
Files changed (101) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/server/events.js +20 -3
  4. package/dist/server/events.js.map +2 -2
  5. package/dist/server/http.js +4 -0
  6. package/dist/server/http.js.map +2 -2
  7. package/dist/server/service.js +21 -11
  8. package/dist/server/service.js.map +2 -2
  9. package/dist/server/thread-patch.js +58 -0
  10. package/dist/server/thread-patch.js.map +7 -0
  11. package/dist/server/websocket.js +14 -1
  12. package/dist/server/websocket.js.map +2 -2
  13. package/dist/shared/thread-patch.js +38 -0
  14. package/dist/shared/thread-patch.js.map +7 -0
  15. package/dist/shared/validation.js +1 -0
  16. package/dist/shared/validation.js.map +2 -2
  17. package/dist/web/assets/{abnfDiagram-WEYOIA3C-B8iWoJvj.js → abnfDiagram-WEYOIA3C-B0iAbIJD.js} +1 -1
  18. package/dist/web/assets/{arc-s6IGfawh.js → arc-_f1LafPd.js} +1 -1
  19. package/dist/web/assets/{architecture-WOLXFQ4H-S-QydWet.js → architecture-WOLXFQ4H-BV5w3tVT.js} +1 -1
  20. package/dist/web/assets/{architectureDiagram-ZHVYKT53-FO3JJuix.js → architectureDiagram-ZHVYKT53-DQYsHq3i.js} +1 -1
  21. package/dist/web/assets/{blockDiagram-RJAE7QA3-C0oJ1K0g.js → blockDiagram-RJAE7QA3-D9T-XyZU.js} +1 -1
  22. package/dist/web/assets/{c4Diagram-XDPPPE54-uiiQpnoA.js → c4Diagram-XDPPPE54-DkRcrPuT.js} +1 -1
  23. package/dist/web/assets/channel-BUUh2AC8.js +1 -0
  24. package/dist/web/assets/{chunk-2E7WHVMD-qJC0b3nn.js → chunk-2E7WHVMD-js9pPyj7.js} +1 -1
  25. package/dist/web/assets/{chunk-4EMNKR2T-BuzDh97x.js → chunk-4EMNKR2T-BPnIvGHL.js} +1 -1
  26. package/dist/web/assets/{chunk-55XCU76K-DYLhbZXu.js → chunk-55XCU76K-DpLWtH9r.js} +1 -1
  27. package/dist/web/assets/{chunk-7S6XSTFO-6iGnyDIJ.js → chunk-7S6XSTFO-jncPoxbX.js} +1 -1
  28. package/dist/web/assets/{chunk-AQDTSKZB-BnUdt5HV.js → chunk-AQDTSKZB-B_gC3lpG.js} +1 -1
  29. package/dist/web/assets/{chunk-DSNLSHJZ-B_pgN4x_.js → chunk-DSNLSHJZ-CPeooTRp.js} +1 -1
  30. package/dist/web/assets/{chunk-HAGFOTED-DPBYIW4Y.js → chunk-HAGFOTED-BdUSIss4.js} +1 -1
  31. package/dist/web/assets/{chunk-HNE4Q36P-kGOcYU4Q.js → chunk-HNE4Q36P-C2eo7jyz.js} +1 -1
  32. package/dist/web/assets/{chunk-NQOKRVIF-CY7_BGsv.js → chunk-NQOKRVIF-Q6aWCxNr.js} +1 -1
  33. package/dist/web/assets/{chunk-UHW7PFBP-ET24t5Pk.js → chunk-UHW7PFBP-BxE-7sbq.js} +1 -1
  34. package/dist/web/assets/{chunk-VQ5W62QI-BGiTZo1S.js → chunk-VQ5W62QI-DRBDdftN.js} +1 -1
  35. package/dist/web/assets/{chunk-WQQL4CDK-9fAgjGa8.js → chunk-WQQL4CDK-clrsIIlY.js} +1 -1
  36. package/dist/web/assets/{chunk-XXDRQBXY-BsQf7A42.js → chunk-XXDRQBXY-5PCgXvkc.js} +1 -1
  37. package/dist/web/assets/{chunk-YZO67HFG-C9xLjq4_.js → chunk-YZO67HFG-6j9ve5_L.js} +1 -1
  38. package/dist/web/assets/{chunk-ZAUX2LTX-8DyRdOVL.js → chunk-ZAUX2LTX-CvFQwbwM.js} +1 -1
  39. package/dist/web/assets/{chunk-ZCHMQSOR-B7KOB_5o.js → chunk-ZCHMQSOR-CZOEs70I.js} +1 -1
  40. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-8HROK5dd.js → classDiagram-v2-4MYWR3UA-BTkqkHXl.js} +1 -1
  41. package/dist/web/assets/{cose-bilkent-JH36ORCC-iFUjshjs.js → cose-bilkent-JH36ORCC-BqWP1nzQ.js} +1 -1
  42. package/dist/web/assets/{cynefin-EF2NZ3EQ-C0iaN9bu.js → cynefin-EF2NZ3EQ-DsU4q5qS.js} +1 -1
  43. package/dist/web/assets/{cynefinDiagram-WF24UDRP-BavVoA0h.js → cynefinDiagram-WF24UDRP-COjozWKq.js} +1 -1
  44. package/dist/web/assets/{dagre-NK4GIZVX-BGhmORBA.js → dagre-NK4GIZVX-BDHt1Ueh.js} +1 -1
  45. package/dist/web/assets/{diagram-CBK3MWTC-DT8IgWTQ.js → diagram-CBK3MWTC-D7aiLN-_.js} +1 -1
  46. package/dist/web/assets/{diagram-I5XIIV2D-BhtMEKPT.js → diagram-I5XIIV2D-0-EaMqOJ.js} +1 -1
  47. package/dist/web/assets/{diagram-ODIL2UCW-DnW9Qw6F.js → diagram-ODIL2UCW-GSzs8w0Z.js} +1 -1
  48. package/dist/web/assets/{diagram-PFBEJUXE-XvP1LPdX.js → diagram-PFBEJUXE-D35fg8hx.js} +1 -1
  49. package/dist/web/assets/{diagram-RJA3I4VV-Gis4rszR.js → diagram-RJA3I4VV-DwwCuIEC.js} +1 -1
  50. package/dist/web/assets/{diagram-TYUNFSNR-CRu7EBfP.js → diagram-TYUNFSNR-DG6l9ew-.js} +1 -1
  51. package/dist/web/assets/{dist-B3u0mNS-.js → dist-zdlJtNPK.js} +1 -1
  52. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-0guPkta2.js → ebnfDiagram-V4P3TTPT-Bgfi_isK.js} +1 -1
  53. package/dist/web/assets/{elk-QONTBCTQ-Cy98XW2d.js → elk-QONTBCTQ-BAxMCFNL.js} +1 -1
  54. package/dist/web/assets/{erDiagram-KYQIGQAA-BYDBerS2.js → erDiagram-KYQIGQAA-D9YhFA2m.js} +1 -1
  55. package/dist/web/assets/{eventmodeling-K75KTNOO-D3vKIHFx.js → eventmodeling-K75KTNOO-8ocfEUPa.js} +1 -1
  56. package/dist/web/assets/flowDiagram-IUGLLWBU-BKDteYBU.js +1 -0
  57. package/dist/web/assets/{ganttDiagram-R7GPNTJY-B85Nh4R1.js → ganttDiagram-R7GPNTJY-BejsR9f5.js} +1 -1
  58. package/dist/web/assets/{gitGraph-VSP46ZUC-bcPmasSj.js → gitGraph-VSP46ZUC-DlgbLMC2.js} +1 -1
  59. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-DP1cFgGY.js → gitGraphDiagram-PDYL7XHY-DpSqjPgo.js} +1 -1
  60. package/dist/web/assets/{index-DVnNhLw3.js → index-KWYkfh4F.js} +41 -41
  61. package/dist/web/assets/{info-OHQRW6UA-u9KJAfjw.js → info-OHQRW6UA-BUmj5tQa.js} +1 -1
  62. package/dist/web/assets/{infoDiagram-MVDRKAX5-3TaDpa_Y.js → infoDiagram-MVDRKAX5-BEA3aavs.js} +1 -1
  63. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-C0NSJ21D.js → ishikawaDiagram-HPEHV2GE-Dir67X2M.js} +1 -1
  64. package/dist/web/assets/{journeyDiagram-BOSHW7O7-CSDLAxpg.js → journeyDiagram-BOSHW7O7-BneoTNdl.js} +1 -1
  65. package/dist/web/assets/{kanban-definition-FNSA4HC5-ItmaymEL.js → kanban-definition-FNSA4HC5-44JYQUer.js} +1 -1
  66. package/dist/web/assets/{line-BeTWz6ZL.js → line-ByilfiTa.js} +1 -1
  67. package/dist/web/assets/{linear-DnbeANi2.js → linear-Db3eyjwk.js} +1 -1
  68. package/dist/web/assets/{mermaid-parser.core-BBFImAfo.js → mermaid-parser.core-DQDrZAv8.js} +3 -3
  69. package/dist/web/assets/{mermaid.core-nSXv6gaR.js → mermaid.core-DZ0it3bR.js} +4 -4
  70. package/dist/web/assets/{mindmap-definition-6OY57UG3-DjX-h-zC.js → mindmap-definition-6OY57UG3-D1W6AEN6.js} +1 -1
  71. package/dist/web/assets/{packet-JDAUHWVQ-CtQPihmD.js → packet-JDAUHWVQ-UM3c__bC.js} +1 -1
  72. package/dist/web/assets/{pegDiagram-ECIUJNBX-CxeNS8yj.js → pegDiagram-ECIUJNBX-CcCixVHf.js} +1 -1
  73. package/dist/web/assets/{pie-XZMESJXO-BipDeHw1.js → pie-XZMESJXO-CeA8Ssa1.js} +1 -1
  74. package/dist/web/assets/{pieDiagram-GNMPY74T-Dliz5juG.js → pieDiagram-GNMPY74T-Bs2mtNl_.js} +1 -1
  75. package/dist/web/assets/{quadrantDiagram-D57K4MC3-ChWOBxAf.js → quadrantDiagram-D57K4MC3-Ct6TbdVq.js} +1 -1
  76. package/dist/web/assets/{radar-ABXABTNO-CF1eAEU2.js → radar-ABXABTNO-C9-VPFXC.js} +1 -1
  77. package/dist/web/assets/{railroad-I3PHUGI6-B-3GPeAF.js → railroad-I3PHUGI6-D73j4-mk.js} +1 -1
  78. package/dist/web/assets/{railroad-abnf-LNEFI6M7-wOTqUH3W.js → railroad-abnf-LNEFI6M7-JUd56ILo.js} +1 -1
  79. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-CSlLScda.js → railroad-ebnf-DWYD2UWJ-BIHqXOMj.js} +1 -1
  80. package/dist/web/assets/{railroad-peg-JR7BVNR7-DV8QtlWt.js → railroad-peg-JR7BVNR7-BOucWj1Z.js} +1 -1
  81. package/dist/web/assets/{railroadDiagram-Y72NRBL7-BAL9OU-F.js → railroadDiagram-Y72NRBL7-CFhvojW0.js} +1 -1
  82. package/dist/web/assets/{requirementDiagram-EQYSW5RA-BCXYaXkR.js → requirementDiagram-EQYSW5RA-B2CK3ZoL.js} +1 -1
  83. package/dist/web/assets/{sankeyDiagram-SY24JHO5-rdn7Noky.js → sankeyDiagram-SY24JHO5-eZRWWklW.js} +1 -1
  84. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-C-laP_AP.js → sequenceDiagram-BLEHNHQU-Bhav5Cco.js} +1 -1
  85. package/dist/web/assets/{src-BEY3S6Wd.js → src-CLPfA06b.js} +1 -1
  86. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-BpHHLW9B.js → stateDiagram-v2-A6IESKWZ-BKBs6biU.js} +1 -1
  87. package/dist/web/assets/{swimlanes-B3ENRKFQ-BDv8fm8m.js → swimlanes-B3ENRKFQ-D8lPXnY-.js} +1 -1
  88. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BrP6D4C7.js +8 -0
  89. package/dist/web/assets/{timeline-definition-JXYKGLGB-CB2yZ6Oi.js → timeline-definition-JXYKGLGB-PN8NzCdD.js} +1 -1
  90. package/dist/web/assets/{treeView-D4JQ5SDB-B-P6Nsin.js → treeView-D4JQ5SDB-CI7xCj5C.js} +1 -1
  91. package/dist/web/assets/{treemap-SAJKECNS-CpPgasP1.js → treemap-SAJKECNS-CeE_hFs2.js} +1 -1
  92. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-CUotTL96.js → usecaseDiagram-WPOLBNNX-VqjzJa5e.js} +1 -1
  93. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-GyYhjb_J.js → vennDiagram-Q3Y3IDCW-BkjF5KAf.js} +1 -1
  94. package/dist/web/assets/{wardley-7MLQ67FV-XH2LJdKb.js → wardley-7MLQ67FV-C4QrbQ3q.js} +1 -1
  95. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-Bmdu4Waa.js → wardleyDiagram-IVAIDKWA-DkVR8h8U.js} +1 -1
  96. package/dist/web/assets/{xychartDiagram-4URNHDU4-DaOPQdfG.js → xychartDiagram-4URNHDU4-B481vVlR.js} +1 -1
  97. package/dist/web/index.html +1 -1
  98. package/package.json +4 -4
  99. package/dist/web/assets/channel-D61LzpA-.js +0 -1
  100. package/dist/web/assets/flowDiagram-IUGLLWBU-DqPPZzXx.js +0 -1
  101. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-7FxE7gx2.js +0 -8
@@ -0,0 +1,58 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ function itemPatch(previous, item) {
3
+ if (previous) {
4
+ for (const field of ["text", "output"]) {
5
+ const before = previous[field] ?? "";
6
+ const after = item[field];
7
+ if (after !== void 0 && after.startsWith(before) && isDeepStrictEqual({ ...previous, [field]: void 0 }, { ...item, [field]: void 0 }))
8
+ return {
9
+ id: item.id,
10
+ append: { field, offset: before.length, text: after.slice(before.length) }
11
+ };
12
+ }
13
+ }
14
+ return { id: item.id, value: structuredClone(item) };
15
+ }
16
+ class ThreadPatchBuilder {
17
+ turns = /* @__PURE__ */ new Map();
18
+ build(view, streamed) {
19
+ const { turns, ...thread } = view;
20
+ const patch = { thread, turns: [] };
21
+ const turnIds = turns.map((turn) => turn.id);
22
+ if (!streamed && JSON.stringify(turnIds) !== JSON.stringify([...this.turns.keys()]))
23
+ patch.turnIds = turnIds;
24
+ for (const turn of turns) {
25
+ if (streamed && turn.id !== streamed.turnId) continue;
26
+ const { items, ...metadata } = turn;
27
+ const encoded = JSON.stringify(metadata);
28
+ const previous = this.turns.get(turn.id);
29
+ const state = previous ?? { encoded: "", items: /* @__PURE__ */ new Map() };
30
+ const update = { turn: metadata, items: [] };
31
+ for (const item of items) {
32
+ if (streamed && item.id !== streamed.itemId) continue;
33
+ const old = state.items.get(item.id);
34
+ if (old && isDeepStrictEqual(old.value, item)) continue;
35
+ update.items.push(itemPatch(old?.value, item));
36
+ state.items.set(item.id, { value: structuredClone(item) });
37
+ }
38
+ const itemIds = items.map((item) => item.id);
39
+ if (!streamed && JSON.stringify(itemIds) !== JSON.stringify([...state.items.keys()]))
40
+ update.itemIds = itemIds;
41
+ if (!previous || update.items.length || encoded !== state.encoded || update.itemIds)
42
+ patch.turns.push(update);
43
+ state.encoded = encoded;
44
+ if (!streamed) state.items = new Map(itemIds.map((id) => [id, state.items.get(id)]));
45
+ this.turns.set(turn.id, state);
46
+ }
47
+ if (!streamed) {
48
+ const ordered = turnIds.map((id) => [id, this.turns.get(id)]);
49
+ this.turns.clear();
50
+ for (const [id, state] of ordered) this.turns.set(id, state);
51
+ }
52
+ return patch;
53
+ }
54
+ }
55
+ export {
56
+ ThreadPatchBuilder
57
+ };
58
+ //# sourceMappingURL=thread-patch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/server/thread-patch.ts"],
4
+ "sourcesContent": ["import type { ItemView, ThreadView } from '../shared/types.js';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { ItemPatch, ThreadPatch } from '../shared/thread-patch.js';\n\nexport interface StreamedItem {\n turnId: string;\n itemId: string;\n}\n\ninterface ItemState {\n value: ItemView;\n}\ninterface TurnState {\n encoded: string;\n items: Map<string, ItemState>;\n}\n\nfunction itemPatch(previous: ItemView | undefined, item: ItemView): ItemPatch {\n if (previous) {\n for (const field of ['text', 'output'] as const) {\n const before = previous[field] ?? '';\n const after = item[field];\n if (\n after !== undefined &&\n after.startsWith(before) &&\n isDeepStrictEqual({ ...previous, [field]: undefined }, { ...item, [field]: undefined })\n )\n return {\n id: item.id,\n append: { field, offset: before.length, text: after.slice(before.length) },\n };\n }\n }\n return { id: item.id, value: structuredClone(item) };\n}\n\n/** Remember only one baseline. Streamed updates never traverse or serialize old item bodies. */\nexport class ThreadPatchBuilder {\n private readonly turns = new Map<string, TurnState>();\n build(view: ThreadView, streamed?: StreamedItem): ThreadPatch {\n const { turns, ...thread } = view;\n const patch: ThreadPatch = { thread, turns: [] };\n const turnIds = turns.map((turn) => turn.id);\n if (!streamed && JSON.stringify(turnIds) !== JSON.stringify([...this.turns.keys()]))\n patch.turnIds = turnIds;\n for (const turn of turns) {\n if (streamed && turn.id !== streamed.turnId) continue;\n const { items, ...metadata } = turn;\n const encoded = JSON.stringify(metadata);\n const previous = this.turns.get(turn.id);\n const state = previous ?? { encoded: '', items: new Map<string, ItemState>() };\n const update: ThreadPatch['turns'][number] = { turn: metadata, items: [] };\n for (const item of items) {\n if (streamed && item.id !== streamed.itemId) continue;\n const old = state.items.get(item.id);\n if (old && isDeepStrictEqual(old.value, item)) continue;\n update.items.push(itemPatch(old?.value, item));\n state.items.set(item.id, { value: structuredClone(item) });\n }\n const itemIds = items.map((item) => item.id);\n if (!streamed && JSON.stringify(itemIds) !== JSON.stringify([...state.items.keys()]))\n update.itemIds = itemIds;\n if (!previous || update.items.length || encoded !== state.encoded || update.itemIds)\n patch.turns.push(update);\n state.encoded = encoded;\n if (!streamed) state.items = new Map(itemIds.map((id) => [id, state.items.get(id)!]));\n this.turns.set(turn.id, state);\n }\n if (!streamed) {\n const ordered = turnIds.map((id) => [id, this.turns.get(id)!] as const);\n this.turns.clear();\n for (const [id, state] of ordered) this.turns.set(id, state);\n }\n return patch;\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,yBAAyB;AAgBlC,SAAS,UAAU,UAAgC,MAA2B;AAC5E,MAAI,UAAU;AACZ,eAAW,SAAS,CAAC,QAAQ,QAAQ,GAAY;AAC/C,YAAM,SAAS,SAAS,KAAK,KAAK;AAClC,YAAM,QAAQ,KAAK,KAAK;AACxB,UACE,UAAU,UACV,MAAM,WAAW,MAAM,KACvB,kBAAkB,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,OAAU,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,OAAU,CAAC;AAEtF,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,QAAQ,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,QAC3E;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK,IAAI,OAAO,gBAAgB,IAAI,EAAE;AACrD;AAGO,MAAM,mBAAmB;AAAA,EACb,QAAQ,oBAAI,IAAuB;AAAA,EACpD,MAAM,MAAkB,UAAsC;AAC5D,UAAM,EAAE,OAAO,GAAG,OAAO,IAAI;AAC7B,UAAM,QAAqB,EAAE,QAAQ,OAAO,CAAC,EAAE;AAC/C,UAAM,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAC3C,QAAI,CAAC,YAAY,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAChF,YAAM,UAAU;AAClB,eAAW,QAAQ,OAAO;AACxB,UAAI,YAAY,KAAK,OAAO,SAAS,OAAQ;AAC7C,YAAM,EAAE,OAAO,GAAG,SAAS,IAAI;AAC/B,YAAM,UAAU,KAAK,UAAU,QAAQ;AACvC,YAAM,WAAW,KAAK,MAAM,IAAI,KAAK,EAAE;AACvC,YAAM,QAAQ,YAAY,EAAE,SAAS,IAAI,OAAO,oBAAI,IAAuB,EAAE;AAC7E,YAAM,SAAuC,EAAE,MAAM,UAAU,OAAO,CAAC,EAAE;AACzE,iBAAW,QAAQ,OAAO;AACxB,YAAI,YAAY,KAAK,OAAO,SAAS,OAAQ;AAC7C,cAAM,MAAM,MAAM,MAAM,IAAI,KAAK,EAAE;AACnC,YAAI,OAAO,kBAAkB,IAAI,OAAO,IAAI,EAAG;AAC/C,eAAO,MAAM,KAAK,UAAU,KAAK,OAAO,IAAI,CAAC;AAC7C,cAAM,MAAM,IAAI,KAAK,IAAI,EAAE,OAAO,gBAAgB,IAAI,EAAE,CAAC;AAAA,MAC3D;AACA,YAAM,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAC3C,UAAI,CAAC,YAAY,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC;AACjF,eAAO,UAAU;AACnB,UAAI,CAAC,YAAY,OAAO,MAAM,UAAU,YAAY,MAAM,WAAW,OAAO;AAC1E,cAAM,MAAM,KAAK,MAAM;AACzB,YAAM,UAAU;AAChB,UAAI,CAAC,SAAU,OAAM,QAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,MAAM,IAAI,EAAE,CAAE,CAAC,CAAC;AACpF,WAAK,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,IAC/B;AACA,QAAI,CAAC,UAAU;AACb,YAAM,UAAU,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAE,CAAU;AACtE,WAAK,MAAM,MAAM;AACjB,iBAAW,CAAC,IAAI,KAAK,KAAK,QAAS,MAAK,MAAM,IAAI,IAAI,KAAK;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -23,6 +23,14 @@ function sendBounded(socket, message, limit) {
23
23
  };
24
24
  }
25
25
  const encoded = JSON.stringify(outgoing);
26
+ if (message.type === "event" && message.kind === "threadPatch" && Buffer.byteLength(encoded) > budget) {
27
+ sendBounded(
28
+ socket,
29
+ { type: "resync", threadId: message.threadId, cursor: message.cursor },
30
+ limit
31
+ );
32
+ return;
33
+ }
26
34
  if (socket.bufferedAmount + Buffer.byteLength(encoded) > limit) {
27
35
  socket.close(4008, "Slow connection; reconnect for snapshot");
28
36
  socket.terminate?.();
@@ -72,7 +80,12 @@ function socketHandlers(service, config, identity, overview = false) {
72
80
  throw new AppError("VALIDATION_FAILED", "Invalid subscription");
73
81
  const input = socketMessageSchema.parse(JSON.parse(event.data));
74
82
  if (input.type === "unsubscribe") return;
75
- const stop = await service.subscribe(input.threadId, input.after, deliver);
83
+ const stop = await service.subscribe(
84
+ input.threadId,
85
+ input.after,
86
+ deliver,
87
+ input.incremental
88
+ );
76
89
  if (current !== generation || ws.readyState !== 1) stop();
77
90
  else unsubscribe = stop;
78
91
  } catch (error) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/websocket.ts"],
4
- "sourcesContent": ["import type { WSEvents, WSContext } from 'hono/ws';\nimport type { WebSocketLike } from '@hono/node-server';\nimport type { WebSocketServer, WebSocket } from 'ws';\nimport { socketMessageSchema } from '../shared/validation.js';\nimport type { ServerMessage, ThreadView } from '../shared/types.js';\nimport { AppError } from '../shared/errors.js';\nimport type { GatewayService } from './service.js';\nimport type { AppConfig } from './config.js';\nimport type { Identity } from './auth.js';\nimport { compactThreadForTransport } from './snapshot.js';\n\nexport interface SocketSink {\n readyState: number;\n bufferedAmount: number;\n send(data: string): void;\n close(code: number, reason: string): void;\n terminate?(): void;\n}\n/** Bounds both individual snapshots and queued bytes, including runtime broadcasts. */\nexport function sendBounded(socket: SocketSink, message: ServerMessage, limit: number): void {\n if (socket.readyState !== 1) return;\n let outgoing = message;\n const budget = Math.max(512, Math.floor(limit / 2));\n try {\n if (message.type === 'snapshot')\n outgoing = { ...message, data: compactThreadForTransport(message.data, budget) };\n else if (message.type === 'event' && message.kind === 'thread')\n outgoing = {\n ...message,\n payload: compactThreadForTransport(message.payload as ThreadView, budget),\n };\n } catch (error) {\n outgoing = {\n type: 'error',\n error:\n error instanceof AppError\n ? error.toJSON()\n : {\n code: 'SNAPSHOT_TOO_LARGE',\n message: 'Current control state exceeds the configured limit',\n },\n };\n }\n const encoded = JSON.stringify(outgoing);\n if (socket.bufferedAmount + Buffer.byteLength(encoded) > limit) {\n socket.close(4008, 'Slow connection; reconnect for snapshot');\n socket.terminate?.();\n return;\n }\n socket.send(encoded);\n}\nexport function socketHandlers(\n service: GatewayService,\n config: AppConfig,\n identity: Identity,\n overview = false,\n): WSEvents<WebSocketLike> {\n let unsubscribe: (() => void) | undefined;\n let stopRuntime: (() => void) | undefined;\n let stopOverview: (() => void) | undefined;\n let generation = 0;\n let expiry: ReturnType<typeof setTimeout> | undefined;\n const send = (ws: WSContext<WebSocketLike>, message: ServerMessage) => {\n const raw = ws.raw as WebSocket | undefined;\n sendBounded(\n raw ?? {\n readyState: ws.readyState,\n bufferedAmount: 0,\n send: (data) => ws.send(data),\n close: (code, reason) => ws.close(code, reason),\n },\n message,\n config.limits.wsBytes,\n );\n };\n return {\n onOpen(_event, ws) {\n stopRuntime = service.subscribeRuntime((message) => send(ws, message));\n if (overview) stopOverview = service.subscribeOverview((message) => send(ws, message));\n if (identity.expiresAt)\n expiry = setTimeout(\n () => ws.close(4001, 'Authentication expired'),\n Math.min(2_147_483_647, Math.max(1, identity.expiresAt - Date.now())),\n );\n },\n async onMessage(event, ws) {\n const current = ++generation;\n unsubscribe?.();\n unsubscribe = undefined;\n const deliver = (message: ServerMessage) => {\n if (current === generation && !(message.type === 'event' && message.kind === 'runtime'))\n send(ws, message);\n };\n try {\n if (typeof event.data !== 'string' || Buffer.byteLength(event.data) > 8192)\n throw new AppError('VALIDATION_FAILED', 'Invalid subscription');\n const input = socketMessageSchema.parse(JSON.parse(event.data));\n if (input.type === 'unsubscribe') return;\n const stop = await service.subscribe(input.threadId, input.after, deliver);\n if (current !== generation || ws.readyState !== 1) stop();\n else unsubscribe = stop;\n } catch (error) {\n deliver({\n type: 'error',\n error:\n error instanceof AppError\n ? error.toJSON()\n : { code: 'VALIDATION_FAILED', message: 'Invalid subscription' },\n });\n }\n },\n onClose() {\n generation++;\n unsubscribe?.();\n stopRuntime?.();\n stopOverview?.();\n clearTimeout(expiry);\n },\n onError() {\n generation++;\n unsubscribe?.();\n stopRuntime?.();\n stopOverview?.();\n clearTimeout(expiry);\n },\n };\n}\nexport function startHeartbeat(server: WebSocketServer): () => void {\n const alive = new WeakSet<WebSocket>();\n server.on('connection', (ws) => {\n alive.add(ws);\n ws.on('pong', () => alive.add(ws));\n ws.on('error', () => ws.terminate());\n });\n const timer = setInterval(() => {\n for (const ws of server.clients) {\n if (!alive.has(ws)) {\n ws.terminate();\n continue;\n }\n alive.delete(ws);\n ws.ping();\n }\n }, 25_000);\n timer.unref();\n return () => clearInterval(timer);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { WSEvents, WSContext } from 'hono/ws';\nimport type { WebSocketLike } from '@hono/node-server';\nimport type { WebSocketServer, WebSocket } from 'ws';\nimport { socketMessageSchema } from '../shared/validation.js';\nimport type { ServerMessage, ThreadView } from '../shared/types.js';\nimport { AppError } from '../shared/errors.js';\nimport type { GatewayService } from './service.js';\nimport type { AppConfig } from './config.js';\nimport type { Identity } from './auth.js';\nimport { compactThreadForTransport } from './snapshot.js';\n\nexport interface SocketSink {\n readyState: number;\n bufferedAmount: number;\n send(data: string): void;\n close(code: number, reason: string): void;\n terminate?(): void;\n}\n/** Bounds both individual snapshots and queued bytes, including runtime broadcasts. */\nexport function sendBounded(socket: SocketSink, message: ServerMessage, limit: number): void {\n if (socket.readyState !== 1) return;\n let outgoing = message;\n const budget = Math.max(512, Math.floor(limit / 2));\n try {\n if (message.type === 'snapshot')\n outgoing = { ...message, data: compactThreadForTransport(message.data, budget) };\n else if (message.type === 'event' && message.kind === 'thread')\n outgoing = {\n ...message,\n payload: compactThreadForTransport(message.payload as ThreadView, budget),\n };\n } catch (error) {\n outgoing = {\n type: 'error',\n error:\n error instanceof AppError\n ? error.toJSON()\n : {\n code: 'SNAPSHOT_TOO_LARGE',\n message: 'Current control state exceeds the configured limit',\n },\n };\n }\n const encoded = JSON.stringify(outgoing);\n // Large item replacements use the lossless HTTP path; never clip their body.\n if (\n message.type === 'event' &&\n message.kind === 'threadPatch' &&\n Buffer.byteLength(encoded) > budget\n ) {\n sendBounded(\n socket,\n { type: 'resync', threadId: message.threadId!, cursor: message.cursor },\n limit,\n );\n return;\n }\n if (socket.bufferedAmount + Buffer.byteLength(encoded) > limit) {\n socket.close(4008, 'Slow connection; reconnect for snapshot');\n socket.terminate?.();\n return;\n }\n socket.send(encoded);\n}\nexport function socketHandlers(\n service: GatewayService,\n config: AppConfig,\n identity: Identity,\n overview = false,\n): WSEvents<WebSocketLike> {\n let unsubscribe: (() => void) | undefined;\n let stopRuntime: (() => void) | undefined;\n let stopOverview: (() => void) | undefined;\n let generation = 0;\n let expiry: ReturnType<typeof setTimeout> | undefined;\n const send = (ws: WSContext<WebSocketLike>, message: ServerMessage) => {\n const raw = ws.raw as WebSocket | undefined;\n sendBounded(\n raw ?? {\n readyState: ws.readyState,\n bufferedAmount: 0,\n send: (data) => ws.send(data),\n close: (code, reason) => ws.close(code, reason),\n },\n message,\n config.limits.wsBytes,\n );\n };\n return {\n onOpen(_event, ws) {\n stopRuntime = service.subscribeRuntime((message) => send(ws, message));\n if (overview) stopOverview = service.subscribeOverview((message) => send(ws, message));\n if (identity.expiresAt)\n expiry = setTimeout(\n () => ws.close(4001, 'Authentication expired'),\n Math.min(2_147_483_647, Math.max(1, identity.expiresAt - Date.now())),\n );\n },\n async onMessage(event, ws) {\n const current = ++generation;\n unsubscribe?.();\n unsubscribe = undefined;\n const deliver = (message: ServerMessage) => {\n if (current === generation && !(message.type === 'event' && message.kind === 'runtime'))\n send(ws, message);\n };\n try {\n if (typeof event.data !== 'string' || Buffer.byteLength(event.data) > 8192)\n throw new AppError('VALIDATION_FAILED', 'Invalid subscription');\n const input = socketMessageSchema.parse(JSON.parse(event.data));\n if (input.type === 'unsubscribe') return;\n const stop = await service.subscribe(\n input.threadId,\n input.after,\n deliver,\n input.incremental,\n );\n if (current !== generation || ws.readyState !== 1) stop();\n else unsubscribe = stop;\n } catch (error) {\n deliver({\n type: 'error',\n error:\n error instanceof AppError\n ? error.toJSON()\n : { code: 'VALIDATION_FAILED', message: 'Invalid subscription' },\n });\n }\n },\n onClose() {\n generation++;\n unsubscribe?.();\n stopRuntime?.();\n stopOverview?.();\n clearTimeout(expiry);\n },\n onError() {\n generation++;\n unsubscribe?.();\n stopRuntime?.();\n stopOverview?.();\n clearTimeout(expiry);\n },\n };\n}\nexport function startHeartbeat(server: WebSocketServer): () => void {\n const alive = new WeakSet<WebSocket>();\n server.on('connection', (ws) => {\n alive.add(ws);\n ws.on('pong', () => alive.add(ws));\n ws.on('error', () => ws.terminate());\n });\n const timer = setInterval(() => {\n for (const ws of server.clients) {\n if (!alive.has(ws)) {\n ws.terminate();\n continue;\n }\n alive.delete(ws);\n ws.ping();\n }\n }, 25_000);\n timer.unref();\n return () => clearInterval(timer);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,38 @@
1
+ function applyThreadPatch(current, patch) {
2
+ const turns = new Map(current.turns.map((turn) => [turn.id, turn]));
3
+ for (const update of patch.turns) {
4
+ const previous = turns.get(update.turn.id);
5
+ const items = new Map(previous?.items.map((item) => [item.id, item]));
6
+ for (const change of update.items) {
7
+ if (change.value) items.set(change.id, change.value);
8
+ else if (change.append) {
9
+ const item = items.get(change.id);
10
+ const { field, offset, text } = change.append;
11
+ if (!item || !Number.isSafeInteger(offset) || offset < 0 || (item[field]?.length ?? 0) < offset)
12
+ throw new Error("Missing streamed content; reload the thread snapshot");
13
+ items.set(change.id, { ...item, [field]: (item[field] ?? "").slice(0, offset) + text });
14
+ }
15
+ }
16
+ const ids = update.itemIds ?? [...items.keys()];
17
+ turns.set(update.turn.id, {
18
+ ...update.turn,
19
+ items: ids.map((id) => {
20
+ const item = items.get(id);
21
+ if (!item) throw new Error("Missing item; reload the thread snapshot");
22
+ return item;
23
+ })
24
+ });
25
+ }
26
+ return {
27
+ ...patch.thread,
28
+ turns: (patch.turnIds ?? [...turns.keys()]).map((id) => {
29
+ const turn = turns.get(id);
30
+ if (!turn) throw new Error("Missing turn; reload the thread snapshot");
31
+ return turn;
32
+ })
33
+ };
34
+ }
35
+ export {
36
+ applyThreadPatch
37
+ };
38
+ //# sourceMappingURL=thread-patch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shared/thread-patch.ts"],
4
+ "sourcesContent": ["import type { ItemView, ThreadView, TurnView } from './types.js';\n\nexport interface ItemPatch {\n id: string;\n value?: ItemView;\n append?: { field: 'text' | 'output'; offset: number; text: string };\n}\n\nexport interface ThreadPatch {\n thread: Omit<ThreadView, 'turns'>;\n turns: { turn: Omit<TurnView, 'items'>; items: ItemPatch[]; itemIds?: string[] }[];\n turnIds?: string[];\n}\n\n/** Absolute offsets make a streamed replacement safe after an HTTP snapshot or replay. */\nexport function applyThreadPatch(current: ThreadView, patch: ThreadPatch): ThreadView {\n const turns = new Map(current.turns.map((turn) => [turn.id, turn]));\n for (const update of patch.turns) {\n const previous = turns.get(update.turn.id);\n const items = new Map(previous?.items.map((item) => [item.id, item]));\n for (const change of update.items) {\n if (change.value) items.set(change.id, change.value);\n else if (change.append) {\n const item = items.get(change.id);\n const { field, offset, text } = change.append;\n if (\n !item ||\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n (item[field]?.length ?? 0) < offset\n )\n throw new Error('Missing streamed content; reload the thread snapshot');\n items.set(change.id, { ...item, [field]: (item[field] ?? '').slice(0, offset) + text });\n }\n }\n const ids = update.itemIds ?? [...items.keys()];\n turns.set(update.turn.id, {\n ...update.turn,\n items: ids.map((id) => {\n const item = items.get(id);\n if (!item) throw new Error('Missing item; reload the thread snapshot');\n return item;\n }),\n });\n }\n return {\n ...patch.thread,\n turns: (patch.turnIds ?? [...turns.keys()]).map((id) => {\n const turn = turns.get(id);\n if (!turn) throw new Error('Missing turn; reload the thread snapshot');\n return turn;\n }),\n };\n}\n"],
5
+ "mappings": "AAeO,SAAS,iBAAiB,SAAqB,OAAgC;AACpF,QAAM,QAAQ,IAAI,IAAI,QAAQ,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAClE,aAAW,UAAU,MAAM,OAAO;AAChC,UAAM,WAAW,MAAM,IAAI,OAAO,KAAK,EAAE;AACzC,UAAM,QAAQ,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACpE,eAAW,UAAU,OAAO,OAAO;AACjC,UAAI,OAAO,MAAO,OAAM,IAAI,OAAO,IAAI,OAAO,KAAK;AAAA,eAC1C,OAAO,QAAQ;AACtB,cAAM,OAAO,MAAM,IAAI,OAAO,EAAE;AAChC,cAAM,EAAE,OAAO,QAAQ,KAAK,IAAI,OAAO;AACvC,YACE,CAAC,QACD,CAAC,OAAO,cAAc,MAAM,KAC5B,SAAS,MACR,KAAK,KAAK,GAAG,UAAU,KAAK;AAE7B,gBAAM,IAAI,MAAM,sDAAsD;AACxE,cAAM,IAAI,OAAO,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;AAAA,MACxF;AAAA,IACF;AACA,UAAM,MAAM,OAAO,WAAW,CAAC,GAAG,MAAM,KAAK,CAAC;AAC9C,UAAM,IAAI,OAAO,KAAK,IAAI;AAAA,MACxB,GAAG,OAAO;AAAA,MACV,OAAO,IAAI,IAAI,CAAC,OAAO;AACrB,cAAM,OAAO,MAAM,IAAI,EAAE;AACzB,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0CAA0C;AACrE,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,QAAQ,MAAM,WAAW,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO;AACtD,YAAM,OAAO,MAAM,IAAI,EAAE;AACzB,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0CAA0C;AACrE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -130,6 +130,7 @@ const reconcileSchema = operationSchema.extend({ confirmEnded: z.literal(true) }
130
130
  const subscribeSchema = z.object({
131
131
  type: z.literal("subscribe"),
132
132
  threadId: idSchema,
133
+ incremental: z.boolean().optional(),
133
134
  after: z.object({ serverEpoch: idSchema, seq: z.number().int().nonnegative() }).strict().optional()
134
135
  }).strict();
135
136
  const socketMessageSchema = z.discriminatedUnion("type", [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/shared/validation.ts"],
4
- "sourcesContent": ["import { z } from 'zod';\nimport { imageDataBytes, MAX_IMAGE_BYTES, MAX_IMAGES } from './images.js';\nimport type { TaskMessage } from './types.js';\nimport { threadNameError } from './thread-name.js';\nexport const cursorSchema = z.string().min(1).max(4096);\nexport const idSchema = z.string().min(1).max(256);\nconst projectNameSchema = z.string().trim().min(1).max(100);\nexport const createProjectSchema = z\n .object({ path: z.string().trim().min(1).max(4096), name: projectNameSchema.optional() })\n .strict();\nexport const renameProjectSchema = z.object({ name: projectNameSchema }).strict();\nexport const cloneProjectSchema = createProjectSchema.extend({\n clientOperationId: z.string().uuid(),\n repository: z.string().trim().min(1).max(4096),\n});\nexport const removeProjectSchema = z.object({}).strict();\nexport const reorderProjectsSchema = z\n .object({ projectIds: z.array(idSchema).refine((ids) => new Set(ids).size === ids.length) })\n .strict();\nexport const settingsSchema = z\n .object({\n model: z.string().min(1).max(200).optional(),\n collaborationMode: z.enum(['plan', 'default']).optional(),\n reasoningEffort: z.string().min(1).max(40).optional(),\n serviceTier: z.literal('fast').nullable().optional(),\n permissionMode: z.enum(['ask', 'auto-review', 'full-access', 'read-only']).optional(),\n approvalPolicy: z.enum(['untrusted', 'on-request', 'never']).optional(),\n approvalReviewer: z.enum(['user', 'auto_review']).optional(),\n sandbox: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional(),\n })\n .strict()\n .refine(\n (settings) =>\n settings.permissionMode === undefined ||\n (settings.sandbox === undefined &&\n settings.approvalPolicy === undefined &&\n settings.approvalReviewer === undefined),\n '\u6743\u9650\u6A21\u5F0F\u4E0D\u80FD\u4E0E\u72EC\u7ACB\u7684\u6743\u9650\u3001\u5BA1\u6279\u7B56\u7565\u6216\u5BA1\u6838\u65B9\u540C\u65F6\u8BBE\u7F6E',\n );\nexport const operationSchema = z.object({ clientOperationId: z.string().uuid() }).strict();\nexport const saveModelDefaultsSchema = operationSchema.extend({\n settings: z\n .object({\n model: z.string().min(1).max(200),\n reasoningEffort: z.string().min(1).max(40).nullable(),\n })\n .strict(),\n});\nexport const reviewTargetSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('uncommittedChanges') }).strict(),\n z\n .object({\n type: z.literal('baseBranch'),\n branch: z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (branch) =>\n !branch.startsWith('-') &&\n !/\\s/.test(branch) &&\n [...branch].every((char) => char.codePointAt(0)! >= 32 && char.codePointAt(0) !== 127),\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal('commit'),\n sha: z\n .string()\n .trim()\n .regex(/^[a-fA-F0-9]{7,64}$/),\n })\n .strict(),\n z\n .object({ type: z.literal('custom'), instructions: z.string().trim().min(1).max(100_000) })\n .strict(),\n]);\nexport const startReviewSchema = operationSchema.extend({ target: reviewTargetSchema.optional() });\nexport const confirmCompatibilitySchema = operationSchema.extend({\n codexEpoch: idSchema,\n codexVersion: z.string().min(1).max(200),\n verifiedVersion: z.string().min(1).max(200),\n confirm: z.literal(true),\n});\nexport const createThreadSchema = operationSchema.extend({ settings: settingsSchema.optional() });\nexport const forkThreadSchema = createThreadSchema;\nexport const renameThreadSchema = operationSchema.extend({\n name: z\n .string()\n .superRefine((name, context) => {\n const message = threadNameError(name);\n if (message) context.addIssue({ code: 'custom', message });\n })\n .transform((name) => name.trim()),\n});\nexport const resumeThreadSchema = createThreadSchema.extend({\n confirmExternalStopped: z.boolean().optional(),\n});\nconst taskFields = {\n text: z.string().max(100_000),\n images: z\n .array(z.string().refine((value) => imageDataBytes(value) !== undefined, 'Invalid image'))\n .max(MAX_IMAGES)\n .refine(\n (images) =>\n images.reduce((sum, image) => sum + (imageDataBytes(image) ?? Infinity), 0) <=\n MAX_IMAGE_BYTES,\n 'Images exceed size limit',\n )\n .optional(),\n};\nconst hasContent = (input: TaskMessage) => Boolean(input.text.trim() || input.images?.length);\nexport const startTurnSchema = createThreadSchema\n .extend({\n ...taskFields,\n taskKind: z.literal('init').optional(),\n })\n .refine(hasContent, 'Text or an image is required')\n .refine(\n (input) => input.taskKind !== 'init' || !input.images?.length,\n 'Project initialization cannot include images',\n );\nexport const steerSchema = operationSchema\n .extend({\n expectedTurnId: idSchema,\n ...taskFields,\n })\n .refine(hasContent, 'Text or an image is required');\nexport const goalMutationSchema = z.discriminatedUnion('action', [\n operationSchema.extend({\n action: z.literal('clear'),\n confirm: z.literal(true),\n expectedVersion: z.string().regex(/^[a-f0-9]{64}$/),\n }),\n operationSchema\n .extend({\n action: z.literal('set'),\n confirm: z.literal(true),\n expectedVersion: z.string().regex(/^[a-f0-9]{64}$/),\n objective: z.string().trim().min(1).max(10000).optional(),\n status: z.enum(['active', 'paused', 'complete']).optional(),\n tokenBudget: z.number().int().positive().max(1000000000).optional(),\n })\n .refine(\n (value) =>\n value.objective !== undefined ||\n value.status !== undefined ||\n value.tokenBudget !== undefined,\n 'Goal update is empty',\n ),\n]);\nexport const recapSchema = operationSchema.extend({\n language: z.enum(['en', 'zh-Hans', 'ja', 'ko']),\n});\nexport const approveDenialSchema = operationSchema.extend({\n denialId: idSchema,\n confirm: z.literal(true),\n});\nexport const interruptSchema = operationSchema.extend({ expectedTurnId: idSchema });\nexport const retryTurnSchema = createThreadSchema.extend({ expectedTurnId: idSchema });\nconst elicitationValueSchema = z.union([\n z.string().max(10_000),\n z.number().finite(),\n z.boolean(),\n z.array(z.string().max(10_000)).max(500),\n]);\nexport const resolveActionSchema = operationSchema.extend({\n resolution: z.union([\n z\n .object({\n decision: z.string().min(1).max(200),\n content: z.record(z.string().max(1000), elicitationValueSchema).optional(),\n persist: z.literal('session').optional(),\n })\n .strict(),\n z.object({ answers: z.record(z.string(), z.array(z.string().max(10_000)).max(50)) }).strict(),\n ]),\n});\nexport const reconcileSchema = operationSchema.extend({ confirmEnded: z.literal(true) });\nexport const subscribeSchema = z\n .object({\n type: z.literal('subscribe'),\n threadId: idSchema,\n after: z\n .object({ serverEpoch: idSchema, seq: z.number().int().nonnegative() })\n .strict()\n .optional(),\n })\n .strict();\nexport const socketMessageSchema = z.discriminatedUnion('type', [\n subscribeSchema,\n z.object({ type: z.literal('unsubscribe') }).strict(),\n]);\n\nexport const archiveThreadSchema = operationSchema.extend({ archived: z.boolean() });\nexport const archivedQuerySchema = z\n .enum(['true', 'false'])\n .optional()\n .transform((value) => value === 'true');\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod';\nimport { imageDataBytes, MAX_IMAGE_BYTES, MAX_IMAGES } from './images.js';\nimport type { TaskMessage } from './types.js';\nimport { threadNameError } from './thread-name.js';\nexport const cursorSchema = z.string().min(1).max(4096);\nexport const idSchema = z.string().min(1).max(256);\nconst projectNameSchema = z.string().trim().min(1).max(100);\nexport const createProjectSchema = z\n .object({ path: z.string().trim().min(1).max(4096), name: projectNameSchema.optional() })\n .strict();\nexport const renameProjectSchema = z.object({ name: projectNameSchema }).strict();\nexport const cloneProjectSchema = createProjectSchema.extend({\n clientOperationId: z.string().uuid(),\n repository: z.string().trim().min(1).max(4096),\n});\nexport const removeProjectSchema = z.object({}).strict();\nexport const reorderProjectsSchema = z\n .object({ projectIds: z.array(idSchema).refine((ids) => new Set(ids).size === ids.length) })\n .strict();\nexport const settingsSchema = z\n .object({\n model: z.string().min(1).max(200).optional(),\n collaborationMode: z.enum(['plan', 'default']).optional(),\n reasoningEffort: z.string().min(1).max(40).optional(),\n serviceTier: z.literal('fast').nullable().optional(),\n permissionMode: z.enum(['ask', 'auto-review', 'full-access', 'read-only']).optional(),\n approvalPolicy: z.enum(['untrusted', 'on-request', 'never']).optional(),\n approvalReviewer: z.enum(['user', 'auto_review']).optional(),\n sandbox: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional(),\n })\n .strict()\n .refine(\n (settings) =>\n settings.permissionMode === undefined ||\n (settings.sandbox === undefined &&\n settings.approvalPolicy === undefined &&\n settings.approvalReviewer === undefined),\n '\u6743\u9650\u6A21\u5F0F\u4E0D\u80FD\u4E0E\u72EC\u7ACB\u7684\u6743\u9650\u3001\u5BA1\u6279\u7B56\u7565\u6216\u5BA1\u6838\u65B9\u540C\u65F6\u8BBE\u7F6E',\n );\nexport const operationSchema = z.object({ clientOperationId: z.string().uuid() }).strict();\nexport const saveModelDefaultsSchema = operationSchema.extend({\n settings: z\n .object({\n model: z.string().min(1).max(200),\n reasoningEffort: z.string().min(1).max(40).nullable(),\n })\n .strict(),\n});\nexport const reviewTargetSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('uncommittedChanges') }).strict(),\n z\n .object({\n type: z.literal('baseBranch'),\n branch: z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (branch) =>\n !branch.startsWith('-') &&\n !/\\s/.test(branch) &&\n [...branch].every((char) => char.codePointAt(0)! >= 32 && char.codePointAt(0) !== 127),\n ),\n })\n .strict(),\n z\n .object({\n type: z.literal('commit'),\n sha: z\n .string()\n .trim()\n .regex(/^[a-fA-F0-9]{7,64}$/),\n })\n .strict(),\n z\n .object({ type: z.literal('custom'), instructions: z.string().trim().min(1).max(100_000) })\n .strict(),\n]);\nexport const startReviewSchema = operationSchema.extend({ target: reviewTargetSchema.optional() });\nexport const confirmCompatibilitySchema = operationSchema.extend({\n codexEpoch: idSchema,\n codexVersion: z.string().min(1).max(200),\n verifiedVersion: z.string().min(1).max(200),\n confirm: z.literal(true),\n});\nexport const createThreadSchema = operationSchema.extend({ settings: settingsSchema.optional() });\nexport const forkThreadSchema = createThreadSchema;\nexport const renameThreadSchema = operationSchema.extend({\n name: z\n .string()\n .superRefine((name, context) => {\n const message = threadNameError(name);\n if (message) context.addIssue({ code: 'custom', message });\n })\n .transform((name) => name.trim()),\n});\nexport const resumeThreadSchema = createThreadSchema.extend({\n confirmExternalStopped: z.boolean().optional(),\n});\nconst taskFields = {\n text: z.string().max(100_000),\n images: z\n .array(z.string().refine((value) => imageDataBytes(value) !== undefined, 'Invalid image'))\n .max(MAX_IMAGES)\n .refine(\n (images) =>\n images.reduce((sum, image) => sum + (imageDataBytes(image) ?? Infinity), 0) <=\n MAX_IMAGE_BYTES,\n 'Images exceed size limit',\n )\n .optional(),\n};\nconst hasContent = (input: TaskMessage) => Boolean(input.text.trim() || input.images?.length);\nexport const startTurnSchema = createThreadSchema\n .extend({\n ...taskFields,\n taskKind: z.literal('init').optional(),\n })\n .refine(hasContent, 'Text or an image is required')\n .refine(\n (input) => input.taskKind !== 'init' || !input.images?.length,\n 'Project initialization cannot include images',\n );\nexport const steerSchema = operationSchema\n .extend({\n expectedTurnId: idSchema,\n ...taskFields,\n })\n .refine(hasContent, 'Text or an image is required');\nexport const goalMutationSchema = z.discriminatedUnion('action', [\n operationSchema.extend({\n action: z.literal('clear'),\n confirm: z.literal(true),\n expectedVersion: z.string().regex(/^[a-f0-9]{64}$/),\n }),\n operationSchema\n .extend({\n action: z.literal('set'),\n confirm: z.literal(true),\n expectedVersion: z.string().regex(/^[a-f0-9]{64}$/),\n objective: z.string().trim().min(1).max(10000).optional(),\n status: z.enum(['active', 'paused', 'complete']).optional(),\n tokenBudget: z.number().int().positive().max(1000000000).optional(),\n })\n .refine(\n (value) =>\n value.objective !== undefined ||\n value.status !== undefined ||\n value.tokenBudget !== undefined,\n 'Goal update is empty',\n ),\n]);\nexport const recapSchema = operationSchema.extend({\n language: z.enum(['en', 'zh-Hans', 'ja', 'ko']),\n});\nexport const approveDenialSchema = operationSchema.extend({\n denialId: idSchema,\n confirm: z.literal(true),\n});\nexport const interruptSchema = operationSchema.extend({ expectedTurnId: idSchema });\nexport const retryTurnSchema = createThreadSchema.extend({ expectedTurnId: idSchema });\nconst elicitationValueSchema = z.union([\n z.string().max(10_000),\n z.number().finite(),\n z.boolean(),\n z.array(z.string().max(10_000)).max(500),\n]);\nexport const resolveActionSchema = operationSchema.extend({\n resolution: z.union([\n z\n .object({\n decision: z.string().min(1).max(200),\n content: z.record(z.string().max(1000), elicitationValueSchema).optional(),\n persist: z.literal('session').optional(),\n })\n .strict(),\n z.object({ answers: z.record(z.string(), z.array(z.string().max(10_000)).max(50)) }).strict(),\n ]),\n});\nexport const reconcileSchema = operationSchema.extend({ confirmEnded: z.literal(true) });\nexport const subscribeSchema = z\n .object({\n type: z.literal('subscribe'),\n threadId: idSchema,\n incremental: z.boolean().optional(),\n after: z\n .object({ serverEpoch: idSchema, seq: z.number().int().nonnegative() })\n .strict()\n .optional(),\n })\n .strict();\nexport const socketMessageSchema = z.discriminatedUnion('type', [\n subscribeSchema,\n z.object({ type: z.literal('unsubscribe') }).strict(),\n]);\n\nexport const archiveThreadSchema = operationSchema.extend({ archived: z.boolean() });\nexport const archivedQuerySchema = z\n .enum(['true', 'false'])\n .optional()\n .transform((value) => value === 'true');\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-BBFImAfo.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-BEY3S6Wd.js";import"./chunk-DSNLSHJZ-B_pgN4x_.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-qJC0b3nn.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-nSXv6gaR.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-DQDrZAv8.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CLPfA06b.js";import"./chunk-DSNLSHJZ-CPeooTRp.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-js9pPyj7.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-DZ0it3bR.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -1 +1 @@
1
- import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-B3u0mNS-.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-zdlJtNPK.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -1 +1 @@
1
- import"./chunk-NGNAAXSQ-C2Wy9Xmz.js";export{M as createArchitectureServices}from"./mermaid-parser.core-BBFImAfo.js";
1
+ import"./chunk-NGNAAXSQ-C2Wy9Xmz.js";export{M as createArchitectureServices}from"./mermaid-parser.core-DQDrZAv8.js";