@covro/covro 0.5.1-dev.2 → 0.5.1-dev.4

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 (127) hide show
  1. package/README.md +11 -1
  2. package/README.zh-CN.md +11 -1
  3. package/dist/codex/adapter.js +65 -5
  4. package/dist/codex/adapter.js.map +2 -2
  5. package/dist/codex/collaboration.js +28 -0
  6. package/dist/codex/collaboration.js.map +7 -0
  7. package/dist/codex/guardian-denials.js +67 -0
  8. package/dist/codex/guardian-denials.js.map +7 -0
  9. package/dist/codex/mapping.js +10 -1
  10. package/dist/codex/mapping.js.map +2 -2
  11. package/dist/codex/thread-goals.js +15 -0
  12. package/dist/codex/thread-goals.js.map +7 -0
  13. package/dist/codex/thread-titles.js +135 -60
  14. package/dist/codex/thread-titles.js.map +2 -2
  15. package/dist/server/capacity-retry.js +176 -0
  16. package/dist/server/capacity-retry.js.map +7 -0
  17. package/dist/server/db/operations.js +11 -0
  18. package/dist/server/db/operations.js.map +2 -2
  19. package/dist/server/http.js +51 -0
  20. package/dist/server/http.js.map +2 -2
  21. package/dist/server/project-init.js +28 -0
  22. package/dist/server/project-init.js.map +7 -0
  23. package/dist/server/projection.js +11 -3
  24. package/dist/server/projection.js.map +2 -2
  25. package/dist/server/service.js +315 -8
  26. package/dist/server/service.js.map +2 -2
  27. package/dist/server/thread-recap.js +34 -0
  28. package/dist/server/thread-recap.js.map +7 -0
  29. package/dist/server/workspace-diff.js +149 -0
  30. package/dist/server/workspace-diff.js.map +7 -0
  31. package/dist/shared/guardian-denials.js +1 -0
  32. package/dist/shared/guardian-denials.js.map +7 -0
  33. package/dist/shared/thread-goal.js +1 -0
  34. package/dist/shared/thread-goal.js.map +7 -0
  35. package/dist/shared/turn-errors.js +25 -0
  36. package/dist/shared/turn-errors.js.map +7 -0
  37. package/dist/shared/validation.js +53 -3
  38. package/dist/shared/validation.js.map +2 -2
  39. package/dist/shared/workspace-diff.js +1 -0
  40. package/dist/shared/workspace-diff.js.map +7 -0
  41. package/dist/web/assets/{abnfDiagram-WEYOIA3C-DK1b1m5g.js → abnfDiagram-WEYOIA3C-2_00Zp4O.js} +1 -1
  42. package/dist/web/assets/{arc-0hKPa6cH.js → arc-DAyuVDVU.js} +1 -1
  43. package/dist/web/assets/{architecture-WOLXFQ4H-DUa2ELbW.js → architecture-WOLXFQ4H-CgR1C4gR.js} +1 -1
  44. package/dist/web/assets/{architectureDiagram-ZHVYKT53-DfpAMcHI.js → architectureDiagram-ZHVYKT53-Dkb6AWjz.js} +1 -1
  45. package/dist/web/assets/{blockDiagram-RJAE7QA3-CD8LlPAk.js → blockDiagram-RJAE7QA3-NtOGZdkX.js} +1 -1
  46. package/dist/web/assets/{c4Diagram-XDPPPE54-KVKGUBPP.js → c4Diagram-XDPPPE54-C1dqWKb1.js} +1 -1
  47. package/dist/web/assets/channel-Co9_v2dk.js +1 -0
  48. package/dist/web/assets/{chunk-2E7WHVMD-CPcfaznm.js → chunk-2E7WHVMD-ClzuEiGk.js} +1 -1
  49. package/dist/web/assets/{chunk-4EMNKR2T-Ba4ZkZos.js → chunk-4EMNKR2T-DyTpkWag.js} +1 -1
  50. package/dist/web/assets/{chunk-55XCU76K-COU6aQoV.js → chunk-55XCU76K-DXBA4ib1.js} +1 -1
  51. package/dist/web/assets/{chunk-7S6XSTFO-mof6va94.js → chunk-7S6XSTFO-DA_aq0zc.js} +1 -1
  52. package/dist/web/assets/{chunk-AQDTSKZB-B9S7XD0k.js → chunk-AQDTSKZB-BWTN3SC_.js} +1 -1
  53. package/dist/web/assets/{chunk-DSNLSHJZ-DiTTjo21.js → chunk-DSNLSHJZ-DJnLTeE9.js} +1 -1
  54. package/dist/web/assets/{chunk-HAGFOTED-bBaCv2Gr.js → chunk-HAGFOTED-cDP-g1Eh.js} +1 -1
  55. package/dist/web/assets/{chunk-HNE4Q36P-COubV5SQ.js → chunk-HNE4Q36P-B3TTIYd_.js} +1 -1
  56. package/dist/web/assets/{chunk-NQOKRVIF-D7mCDLmx.js → chunk-NQOKRVIF-D8mmhZHq.js} +1 -1
  57. package/dist/web/assets/{chunk-UHW7PFBP-7E_Y7QMq.js → chunk-UHW7PFBP-DWIIg_jq.js} +1 -1
  58. package/dist/web/assets/{chunk-VQ5W62QI-DIe2sxBO.js → chunk-VQ5W62QI-Bu3R2cpS.js} +1 -1
  59. package/dist/web/assets/{chunk-WQQL4CDK-sGc70NW0.js → chunk-WQQL4CDK-BxsR1mXs.js} +1 -1
  60. package/dist/web/assets/{chunk-XXDRQBXY-CnTJfCp_.js → chunk-XXDRQBXY-Ds0JNdm-.js} +1 -1
  61. package/dist/web/assets/{chunk-YZO67HFG-D1uBxw_D.js → chunk-YZO67HFG-COpqyQaD.js} +1 -1
  62. package/dist/web/assets/{chunk-ZAUX2LTX-quytYPeh.js → chunk-ZAUX2LTX-BUrGjDuS.js} +1 -1
  63. package/dist/web/assets/{chunk-ZCHMQSOR-CebhdtBu.js → chunk-ZCHMQSOR-DYMM9mEK.js} +1 -1
  64. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-_NujQwSa.js → classDiagram-v2-4MYWR3UA-DfJvks0C.js} +1 -1
  65. package/dist/web/assets/{cose-bilkent-JH36ORCC-DltmODTL.js → cose-bilkent-JH36ORCC-CN5mpYIb.js} +1 -1
  66. package/dist/web/assets/{cynefin-EF2NZ3EQ-CyNUtvfu.js → cynefin-EF2NZ3EQ-DmlCHkY-.js} +1 -1
  67. package/dist/web/assets/{cynefinDiagram-WF24UDRP-DH1m77PD.js → cynefinDiagram-WF24UDRP-C0aUblC2.js} +1 -1
  68. package/dist/web/assets/{dagre-NK4GIZVX-DiCwjat3.js → dagre-NK4GIZVX-Ba7RcAgP.js} +1 -1
  69. package/dist/web/assets/{diagram-CBK3MWTC-DnoBkry8.js → diagram-CBK3MWTC-BYQDjB9i.js} +1 -1
  70. package/dist/web/assets/{diagram-I5XIIV2D-CIeRHNwj.js → diagram-I5XIIV2D-EV79hoob.js} +1 -1
  71. package/dist/web/assets/{diagram-ODIL2UCW-BiyJagHP.js → diagram-ODIL2UCW-BvQdwmgA.js} +1 -1
  72. package/dist/web/assets/{diagram-PFBEJUXE-B6xGLENr.js → diagram-PFBEJUXE-hxwI3F00.js} +1 -1
  73. package/dist/web/assets/{diagram-RJA3I4VV-DCbGrXsR.js → diagram-RJA3I4VV-DwaHE2iB.js} +1 -1
  74. package/dist/web/assets/{diagram-TYUNFSNR-BjYXlBMa.js → diagram-TYUNFSNR-BxiOemA0.js} +1 -1
  75. package/dist/web/assets/{dist-C9Qd1YEe.js → dist-nfRX7L9k.js} +1 -1
  76. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-CpRXdAa6.js → ebnfDiagram-V4P3TTPT-CzQv5iDM.js} +1 -1
  77. package/dist/web/assets/{elk-QONTBCTQ-BZa9Vnbc.js → elk-QONTBCTQ-DNR9HWcl.js} +1 -1
  78. package/dist/web/assets/{erDiagram-KYQIGQAA-7AaYG_a9.js → erDiagram-KYQIGQAA-aJlTdb9w.js} +1 -1
  79. package/dist/web/assets/{eventmodeling-K75KTNOO-BzIg1KNf.js → eventmodeling-K75KTNOO-D4J-ujy-.js} +1 -1
  80. package/dist/web/assets/flowDiagram-IUGLLWBU-Bq7dmPlS.js +1 -0
  81. package/dist/web/assets/{ganttDiagram-R7GPNTJY-DeNg-7K2.js → ganttDiagram-R7GPNTJY-DgytSfqO.js} +1 -1
  82. package/dist/web/assets/{gitGraph-VSP46ZUC-BR-A7hdM.js → gitGraph-VSP46ZUC-BtjueFHB.js} +1 -1
  83. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-LMyLpeqK.js → gitGraphDiagram-PDYL7XHY-WP0Hjdh9.js} +1 -1
  84. package/dist/web/assets/index-BesPYgjq.js +156 -0
  85. package/dist/web/assets/{index-CEM8pkOB.css → index-qYBdGqKM.css} +1 -1
  86. package/dist/web/assets/{info-OHQRW6UA-CRbCGNnm.js → info-OHQRW6UA-iuP0WTfn.js} +1 -1
  87. package/dist/web/assets/{infoDiagram-MVDRKAX5-DTUWae1O.js → infoDiagram-MVDRKAX5-CpAtMyKS.js} +1 -1
  88. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-CE4r0jTM.js → ishikawaDiagram-HPEHV2GE-JTnItv7N.js} +1 -1
  89. package/dist/web/assets/{journeyDiagram-BOSHW7O7-KcSuVnTV.js → journeyDiagram-BOSHW7O7-B333k1QJ.js} +1 -1
  90. package/dist/web/assets/{kanban-definition-FNSA4HC5-I0QF1Ftr.js → kanban-definition-FNSA4HC5-DpCk5ZH0.js} +1 -1
  91. package/dist/web/assets/{line-DLSy1-se.js → line-CLs-qFxt.js} +1 -1
  92. package/dist/web/assets/{linear-XWNSUdmR.js → linear-E9AWqBNs.js} +1 -1
  93. package/dist/web/assets/{mermaid-parser.core-BcMfaJSH.js → mermaid-parser.core-D1rEzlb-.js} +3 -3
  94. package/dist/web/assets/{mermaid.core-CPl3cZ55.js → mermaid.core-D6TNGGsX.js} +4 -4
  95. package/dist/web/assets/{mindmap-definition-6OY57UG3-BIB4ahHf.js → mindmap-definition-6OY57UG3-DrpuGWuc.js} +1 -1
  96. package/dist/web/assets/{packet-JDAUHWVQ-UZicf9-F.js → packet-JDAUHWVQ-BpBr3aKk.js} +1 -1
  97. package/dist/web/assets/{pegDiagram-ECIUJNBX-ckOqIfTt.js → pegDiagram-ECIUJNBX-BrZX1cdv.js} +1 -1
  98. package/dist/web/assets/{pie-XZMESJXO-DErhKWJX.js → pie-XZMESJXO-CcTpis-K.js} +1 -1
  99. package/dist/web/assets/{pieDiagram-GNMPY74T-CrnS_2qe.js → pieDiagram-GNMPY74T-CR2em875.js} +1 -1
  100. package/dist/web/assets/{quadrantDiagram-D57K4MC3-UK4DsDJz.js → quadrantDiagram-D57K4MC3-D-ET5xbH.js} +1 -1
  101. package/dist/web/assets/{radar-ABXABTNO-BYgJm4I9.js → radar-ABXABTNO-CTFFPCi_.js} +1 -1
  102. package/dist/web/assets/{railroad-I3PHUGI6-2n6yUb7T.js → railroad-I3PHUGI6-S6MHolw_.js} +1 -1
  103. package/dist/web/assets/{railroad-abnf-LNEFI6M7-CGAFqTzs.js → railroad-abnf-LNEFI6M7-NWxYLYMN.js} +1 -1
  104. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-gJx_FXYW.js → railroad-ebnf-DWYD2UWJ-CRnaPl26.js} +1 -1
  105. package/dist/web/assets/{railroad-peg-JR7BVNR7-Dm0kEaxK.js → railroad-peg-JR7BVNR7-CB85ffhO.js} +1 -1
  106. package/dist/web/assets/{railroadDiagram-Y72NRBL7-CqzySn4U.js → railroadDiagram-Y72NRBL7-Ba2xIF7q.js} +1 -1
  107. package/dist/web/assets/{requirementDiagram-EQYSW5RA-B33Hrc0L.js → requirementDiagram-EQYSW5RA-B7faqgDT.js} +1 -1
  108. package/dist/web/assets/{sankeyDiagram-SY24JHO5-BA9Smc0j.js → sankeyDiagram-SY24JHO5-IjJVI58S.js} +1 -1
  109. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-CUA-rKot.js → sequenceDiagram-BLEHNHQU-D-h5jxwQ.js} +1 -1
  110. package/dist/web/assets/{src-htchAh5W.js → src-hBdSvoFJ.js} +1 -1
  111. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-kIYMkX3_.js → stateDiagram-v2-A6IESKWZ-rlZaPFqZ.js} +1 -1
  112. package/dist/web/assets/{swimlanes-B3ENRKFQ-C8Lzsqig.js → swimlanes-B3ENRKFQ-CqgKwSbP.js} +1 -1
  113. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BGvWQ2Hp.js +8 -0
  114. package/dist/web/assets/{timeline-definition-JXYKGLGB-C3uOHb1e.js → timeline-definition-JXYKGLGB-DD76ZtY0.js} +1 -1
  115. package/dist/web/assets/{treeView-D4JQ5SDB-Dq-ug1SE.js → treeView-D4JQ5SDB-CcwWh4Bw.js} +1 -1
  116. package/dist/web/assets/{treemap-SAJKECNS-mX01fnXB.js → treemap-SAJKECNS-8lde6V5O.js} +1 -1
  117. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-DMBep2-D.js → usecaseDiagram-WPOLBNNX-CWowobZv.js} +1 -1
  118. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-CUardqBP.js → vennDiagram-Q3Y3IDCW-U11W8pHe.js} +1 -1
  119. package/dist/web/assets/{wardley-7MLQ67FV-CIOqSz29.js → wardley-7MLQ67FV-Dp2EaBmo.js} +1 -1
  120. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-DtfU2fzi.js → wardleyDiagram-IVAIDKWA-7Qnos8ak.js} +1 -1
  121. package/dist/web/assets/{xychartDiagram-4URNHDU4-Cb3se94q.js → xychartDiagram-4URNHDU4-BwfHNtsG.js} +1 -1
  122. package/dist/web/index.html +2 -2
  123. package/package.json +3 -3
  124. package/dist/web/assets/channel-CpEW0zog.js +0 -1
  125. package/dist/web/assets/flowDiagram-IUGLLWBU-FDG_7_Jf.js +0 -1
  126. package/dist/web/assets/index-D2dQZgkr.js +0 -147
  127. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-CWrPdxiH.js +0 -8
@@ -79,15 +79,21 @@ class Projection {
79
79
  if (isTerminal(updated.status)) this.finishAutoReviews(updated);
80
80
  this.touch(threadId);
81
81
  }
82
- turnError(threadId, turnId, message, willRetry) {
82
+ turnError(threadId, turnId, message, willRetry, metadata = {}) {
83
83
  const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);
84
84
  if (!turn || !isActive(turn.status)) return false;
85
85
  const detail = message.slice(0, 4096);
86
- if (willRetry) turn.reconnect = { status: "retrying", message: detail };
86
+ const info = {
87
+ ...metadata.errorCode ? { errorCode: metadata.errorCode.slice(0, 100) } : {},
88
+ ...metadata.errorDetails ? { errorDetails: metadata.errorDetails.slice(0, 4096) } : {}
89
+ };
90
+ if (willRetry) turn.reconnect = { status: "retrying", message: detail, ...info };
87
91
  else {
88
92
  turn.error = detail;
93
+ Object.assign(turn, info);
89
94
  endCompactions(turn, "failed", detail);
90
- if (turn.reconnect) turn.reconnect = { status: "failed", message: detail };
95
+ if (turn.reconnect)
96
+ turn.reconnect = { ...turn.reconnect, ...info, status: "failed", message: detail };
91
97
  }
92
98
  this.touch(threadId);
93
99
  return true;
@@ -113,6 +119,7 @@ class Projection {
113
119
  if (!turn.reconnect || !isTerminal(turn.status)) return;
114
120
  if (turn.status === "failed") {
115
121
  turn.reconnect = {
122
+ ...turn.reconnect,
116
123
  status: "failed",
117
124
  message: (turn.error ?? turn.reconnect.message).slice(0, 4096)
118
125
  };
@@ -242,6 +249,7 @@ class Projection {
242
249
  this.resolveAction(action.actionId, "expired");
243
250
  }
244
251
  runtimeReset() {
252
+ for (const thread of this.values()) delete thread.goal;
245
253
  for (const action of this.actions.values())
246
254
  if (action.status === "pending" || action.status === "responding")
247
255
  this.resolveAction(action.actionId, "expired");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/projection.ts"],
4
- "sourcesContent": ["import { endCompactions, mergeCompaction, settleCompactions } from './compaction.js';\nimport type {\n AutoReviewView,\n ItemView,\n PendingAction,\n RunStatus,\n ThreadView,\n TurnView,\n} from '../shared/types.js';\n\nexport const isActive = (status: RunStatus): boolean =>\n status === 'running' || status === 'waitingApproval' || status === 'waitingInput';\nexport const isTerminal = (status: RunStatus): boolean =>\n status === 'completed' || status === 'failed' || status === 'interrupted';\n\nexport class Projection {\n private readonly threads = new Map<string, ThreadView>();\n readonly actions = new Map<string, PendingAction>();\n private readonly revisions = new Map<string, number>();\n // Notifications may precede thread/turn history. Keep only a bounded, per-thread inbox.\n private readonly earlyAutoReviews = new Map<\n string,\n { threadId: string; turnId: string; item: ItemView; bytes: number }\n >();\n private earlyAutoReviewBytes = 0;\n constructor(private readonly maxItemBytes = 2 * 1024 * 1024) {}\n\n get(threadId: string): ThreadView | undefined {\n return this.threads.get(threadId);\n }\n values(): ThreadView[] {\n return [...this.threads.values()];\n }\n revision(threadId: string): number {\n return this.revisions.get(threadId) ?? 0;\n }\n touch(threadId: string): void {\n this.revisions.set(threadId, this.revision(threadId) + 1);\n }\n\n thread(\n incoming: ThreadView,\n preserveCurrent = false,\n preserveRuntimeSettings = preserveCurrent,\n ): ThreadView {\n const current = this.threads.get(incoming.id);\n if (!current) {\n const thread = structuredClone(incoming);\n for (const turn of thread.turns) turn.items = turn.items.map((item) => this.limit(item));\n thread.actions = [...this.actions.values()].filter((action) => action.threadId === thread.id);\n this.threads.set(thread.id, thread);\n for (const turn of thread.turns) {\n this.flushAutoReviews(thread.id, turn.id);\n this.finishReconnect(turn);\n settleCompactions(turn);\n if (isTerminal(turn.status)) this.finishAutoReviews(turn);\n }\n } else {\n const oldTurns = current.turns;\n const oldStatus = current.status;\n const oldRuntimeSettings = current.runtimeSettings;\n const oldTitle = current.title;\n Object.assign(current, incoming, { turns: oldTurns, actions: current.actions });\n if (oldRuntimeSettings && incoming.runtimeSettings)\n current.runtimeSettings = { ...oldRuntimeSettings, ...incoming.runtimeSettings };\n if (preserveCurrent) {\n current.status = oldStatus;\n current.title = oldTitle;\n }\n if (preserveRuntimeSettings) current.runtimeSettings = oldRuntimeSettings;\n for (const turn of incoming.turns) this.turn(incoming.id, turn, preserveCurrent);\n }\n this.touch(incoming.id);\n return this.threads.get(incoming.id)!;\n }\n\n turn(threadId: string, incoming: TurnView, preserveCurrent = false): void {\n const thread = this.threads.get(threadId);\n if (!thread) return;\n thread.hasMessages = true;\n const current = thread.turns.find((turn) => turn.id === incoming.id);\n if (!current)\n thread.turns.push({\n ...structuredClone(incoming),\n items: incoming.items.map((item) => this.limit(item)),\n });\n else {\n const items = current.items;\n if (!preserveCurrent) Object.assign(current, incoming, { items });\n for (const item of incoming.items) this.item(threadId, incoming.id, item, preserveCurrent);\n }\n // Tool cancellation can finish after a new turn starts. Only the latest\n // turn owns the thread status; older events still update their own history.\n if (!preserveCurrent && thread.turns.at(-1)?.id === incoming.id)\n thread.status = incoming.status;\n this.flushAutoReviews(threadId, incoming.id);\n const updated = thread.turns.find((turn) => turn.id === incoming.id)!;\n this.finishReconnect(updated);\n settleCompactions(updated);\n if (isTerminal(updated.status)) this.finishAutoReviews(updated);\n this.touch(threadId);\n }\n\n turnError(threadId: string, turnId: string, message: string, willRetry: boolean): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !isActive(turn.status)) return false;\n // Keep display-only diagnostics bounded, without changing the execution reservation.\n const detail = message.slice(0, 4096);\n if (willRetry) turn.reconnect = { status: 'retrying', message: detail };\n else {\n turn.error = detail;\n endCompactions(turn, 'failed', detail);\n if (turn.reconnect) turn.reconnect = { status: 'failed', message: detail };\n }\n this.touch(threadId);\n return true;\n }\n\n compactionCompleted(threadId: string, turnId: string): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !endCompactions(turn, 'completed')) return false;\n this.touch(threadId);\n return true;\n }\n\n endThreadCompactions(threadId: string): void {\n for (const turn of this.threads.get(threadId)?.turns ?? []) endCompactions(turn, 'unknown');\n this.touch(threadId);\n }\n\n turnProgress(threadId: string, turnId: string): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !isActive(turn.status) || turn.reconnect?.status !== 'retrying') return false;\n delete turn.reconnect;\n this.touch(threadId);\n return true;\n }\n\n private finishReconnect(turn: TurnView): void {\n if (!turn.reconnect || !isTerminal(turn.status)) return;\n if (turn.status === 'failed') {\n turn.reconnect = {\n status: 'failed',\n message: (turn.error ?? turn.reconnect.message).slice(0, 4096),\n };\n } else delete turn.reconnect;\n }\n\n autoReview(threadId: string, turnId: string, review: AutoReviewView): boolean {\n const item = this.limit({\n id: `auto-review:${review.reviewId}`,\n type: 'autoApprovalReview',\n status: review.status,\n autoReview: review,\n });\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (turn) return this.applyAutoReview(threadId, turn, item);\n const key = JSON.stringify([threadId, turnId, review.reviewId]);\n const current = this.earlyAutoReviews.get(key);\n if (current && !this.reviewCanReplace(current.item, item)) return false;\n const bytes = Buffer.byteLength(JSON.stringify({ threadId, turnId, item }));\n if (current) this.earlyAutoReviewBytes -= current.bytes;\n this.earlyAutoReviews.set(key, { threadId, turnId, item, bytes });\n this.earlyAutoReviewBytes += bytes;\n while (this.earlyAutoReviews.size > 128 || this.earlyAutoReviewBytes > 4 * 1024 * 1024) {\n const oldest = this.earlyAutoReviews.keys().next().value!;\n this.earlyAutoReviewBytes -= this.earlyAutoReviews.get(oldest)!.bytes;\n this.earlyAutoReviews.delete(oldest);\n }\n return false;\n }\n\n private reviewCanReplace(current: ItemView, incoming: ItemView): boolean {\n const previous = current.autoReview!;\n const next = incoming.autoReview!;\n if (previous.status !== 'inProgress' && next.status === 'inProgress') return false;\n if (\n previous.completedAtMs !== undefined &&\n (next.completedAtMs === undefined || previous.completedAtMs > next.completedAtMs)\n )\n return false;\n return JSON.stringify(current) !== JSON.stringify(incoming);\n }\n\n private applyAutoReview(threadId: string, turn: TurnView, item: ItemView): boolean {\n const index = turn.items.findIndex(\n (entry) =>\n entry.type === 'autoApprovalReview' &&\n entry.autoReview?.reviewId === item.autoReview!.reviewId,\n );\n // Check the original event before converting an unfinished late review to unknown.\n if (index >= 0 && !this.reviewCanReplace(turn.items[index]!, item)) return false;\n if (isTerminal(turn.status) && item.autoReview!.status === 'inProgress') {\n item.autoReview!.status = 'unknown';\n item.status = 'unknown';\n }\n if (index < 0) turn.items.push(item);\n else {\n turn.items[index] = item;\n }\n this.touch(threadId);\n return true;\n }\n\n private flushAutoReviews(threadId: string, turnId: string): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n for (const [key, entry] of this.earlyAutoReviews) {\n if (entry.threadId !== threadId || entry.turnId !== turnId) continue;\n this.earlyAutoReviews.delete(key);\n this.earlyAutoReviewBytes -= entry.bytes;\n this.applyAutoReview(threadId, turn, entry.item);\n }\n }\n\n private finishAutoReviews(turn: TurnView): void {\n for (const item of turn.items) {\n if (item.autoReview?.status !== 'inProgress') continue;\n item.autoReview.status = 'unknown';\n item.status = 'unknown';\n }\n }\n\n item(threadId: string, turnId: string, item: ItemView, preserveCurrent = false): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n const index = turn.items.findIndex((entry) => entry.id === item.id);\n if (index < 0) turn.items.push(this.limit(item));\n else if (!preserveCurrent)\n turn.items[index] = this.limit(mergeCompaction(item, turn.items[index]));\n settleCompactions(turn);\n this.touch(threadId);\n }\n\n delta(\n threadId: string,\n turnId: string,\n itemId: string,\n field: 'text' | 'output',\n delta: string,\n itemType?: string,\n ): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n let item = turn.items.find((entry) => entry.id === itemId);\n if (!item) {\n item = {\n id: itemId,\n type: itemType ?? (field === 'text' ? 'agentMessage' : 'commandExecution'),\n };\n turn.items.push(item);\n }\n if (item.truncated) return;\n item[field] = (item[field] ?? '') + delta;\n Object.assign(item, this.limit(item));\n this.touch(threadId);\n }\n\n diff(threadId: string, turnId: string, diff: string): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (turn) turn.diff = this.clip(diff).value;\n this.touch(threadId);\n }\n\n action(action: PendingAction): void {\n const owner = action.threadId\n ? this.threads.get(action.threadId)?.turns.find((turn) => turn.id === action.turnId)\n : undefined;\n if (owner && isTerminal(owner.status) && ['pending', 'responding'].includes(action.status))\n action = { ...action, status: 'expired' };\n this.actions.set(action.actionId, action);\n const thread = action.threadId ? this.threads.get(action.threadId) : undefined;\n if (thread) {\n thread.actions = [...this.actions.values()].filter((entry) => entry.threadId === thread.id);\n this.updateActionStatus(thread);\n this.touch(thread.id);\n }\n }\n\n resolveAction(actionId: string, status: PendingAction['status']): PendingAction | undefined {\n const action = this.actions.get(actionId);\n if (!action) return undefined;\n action.status = status;\n const thread = action.threadId ? this.threads.get(action.threadId) : undefined;\n if (thread) {\n this.updateActionStatus(thread);\n this.touch(thread.id);\n }\n return action;\n }\n\n expireTurn(threadId: string, turnId: string): void {\n for (const action of this.actions.values())\n if (\n action.threadId === threadId &&\n action.turnId === turnId &&\n (action.status === 'pending' || action.status === 'responding')\n )\n this.resolveAction(action.actionId, 'expired');\n }\n\n runtimeReset(): void {\n for (const action of this.actions.values())\n if (action.status === 'pending' || action.status === 'responding')\n this.resolveAction(action.actionId, 'expired');\n for (const thread of this.threads.values()) {\n thread.managed = false;\n delete thread.resumeError;\n if (thread.runtimeSettings) {\n const { model, reasoningEffort } = thread.runtimeSettings;\n thread.runtimeSettings = { model, reasoningEffort };\n }\n if (isActive(thread.status)) thread.status = 'unknown';\n for (const turn of thread.turns) {\n if (turn.reconnect?.status === 'retrying') delete turn.reconnect;\n if (isActive(turn.status)) turn.status = 'unknown';\n endCompactions(turn, 'unknown');\n this.finishAutoReviews(turn);\n }\n this.touch(thread.id);\n }\n for (const entry of this.earlyAutoReviews.values()) {\n if (entry.item.autoReview?.status === 'inProgress') {\n this.earlyAutoReviewBytes -= entry.bytes;\n entry.item.autoReview.status = 'unknown';\n entry.item.status = 'unknown';\n entry.bytes = Buffer.byteLength(\n JSON.stringify({ threadId: entry.threadId, turnId: entry.turnId, item: entry.item }),\n );\n this.earlyAutoReviewBytes += entry.bytes;\n }\n }\n }\n\n private updateActionStatus(thread: ThreadView): void {\n const active = thread.actions.filter(\n (action) =>\n action.blocking !== false &&\n (action.status === 'pending' || action.status === 'responding'),\n );\n const turn = [...thread.turns].reverse().find((entry) => isActive(entry.status));\n if (!turn) return;\n const status = active.some(\n (action) => action.kind === 'questions' || action.kind === 'elicitation',\n )\n ? 'waitingInput'\n : active.length > 0\n ? 'waitingApproval'\n : 'running';\n thread.status = status;\n turn.status = status;\n }\n\n private limit(item: ItemView): ItemView {\n const result = structuredClone(item);\n if (result.images) {\n let bytes = 0;\n result.imageCount ??= result.images.length;\n result.images = result.images.filter((image) => {\n bytes += Buffer.byteLength(image);\n return bytes <= this.maxItemBytes;\n });\n }\n for (const field of ['text', 'output', 'command'] as const) {\n const value = result[field];\n if (value) {\n const clipped = this.clip(value);\n result[field] = clipped.value;\n if (clipped.truncated) result.truncated = true;\n }\n }\n if (result.changes)\n result.changes = result.changes.map((change) => {\n const clipped = this.clip(change.diff);\n if (clipped.truncated) result.truncated = true;\n return { ...change, diff: clipped.value };\n });\n if (result.details !== undefined) {\n const clipped = this.clip(JSON.stringify(result.details));\n if (clipped.truncated) {\n result.details = clipped.value;\n result.truncated = true;\n }\n }\n if (result.autoReview) {\n for (const field of ['actionLabel', 'actionSummary', 'cwd', 'rationale'] as const) {\n const value = result.autoReview[field];\n if (value === undefined) continue;\n const clipped = this.clip(value);\n result.autoReview[field] = clipped.value;\n if (clipped.truncated) result.truncated = true;\n }\n }\n return result;\n }\n\n private clip(value: string): { value: string; truncated: boolean } {\n if (Buffer.byteLength(value) <= this.maxItemBytes) return { value, truncated: false };\n // Iterating code points avoids a half UTF-8 character at the truncation boundary.\n let kept = '';\n let bytes = 0;\n for (const point of value) {\n bytes += Buffer.byteLength(point);\n if (bytes > this.maxItemBytes) break;\n kept += point;\n }\n return { value: `${kept}\\n[\u8F93\u51FA\u5DF2\u622A\u65AD]`, truncated: true };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { endCompactions, mergeCompaction, settleCompactions } from './compaction.js';\nimport type {\n AutoReviewView,\n ItemView,\n PendingAction,\n RunStatus,\n ThreadView,\n TurnView,\n TurnErrorMetadata,\n} from '../shared/types.js';\n\nexport const isActive = (status: RunStatus): boolean =>\n status === 'running' || status === 'waitingApproval' || status === 'waitingInput';\nexport const isTerminal = (status: RunStatus): boolean =>\n status === 'completed' || status === 'failed' || status === 'interrupted';\n\nexport class Projection {\n private readonly threads = new Map<string, ThreadView>();\n readonly actions = new Map<string, PendingAction>();\n private readonly revisions = new Map<string, number>();\n // Notifications may precede thread/turn history. Keep only a bounded, per-thread inbox.\n private readonly earlyAutoReviews = new Map<\n string,\n { threadId: string; turnId: string; item: ItemView; bytes: number }\n >();\n private earlyAutoReviewBytes = 0;\n constructor(private readonly maxItemBytes = 2 * 1024 * 1024) {}\n\n get(threadId: string): ThreadView | undefined {\n return this.threads.get(threadId);\n }\n values(): ThreadView[] {\n return [...this.threads.values()];\n }\n revision(threadId: string): number {\n return this.revisions.get(threadId) ?? 0;\n }\n touch(threadId: string): void {\n this.revisions.set(threadId, this.revision(threadId) + 1);\n }\n\n thread(\n incoming: ThreadView,\n preserveCurrent = false,\n preserveRuntimeSettings = preserveCurrent,\n ): ThreadView {\n const current = this.threads.get(incoming.id);\n if (!current) {\n const thread = structuredClone(incoming);\n for (const turn of thread.turns) turn.items = turn.items.map((item) => this.limit(item));\n thread.actions = [...this.actions.values()].filter((action) => action.threadId === thread.id);\n this.threads.set(thread.id, thread);\n for (const turn of thread.turns) {\n this.flushAutoReviews(thread.id, turn.id);\n this.finishReconnect(turn);\n settleCompactions(turn);\n if (isTerminal(turn.status)) this.finishAutoReviews(turn);\n }\n } else {\n const oldTurns = current.turns;\n const oldStatus = current.status;\n const oldRuntimeSettings = current.runtimeSettings;\n const oldTitle = current.title;\n Object.assign(current, incoming, { turns: oldTurns, actions: current.actions });\n if (oldRuntimeSettings && incoming.runtimeSettings)\n current.runtimeSettings = { ...oldRuntimeSettings, ...incoming.runtimeSettings };\n if (preserveCurrent) {\n current.status = oldStatus;\n current.title = oldTitle;\n }\n if (preserveRuntimeSettings) current.runtimeSettings = oldRuntimeSettings;\n for (const turn of incoming.turns) this.turn(incoming.id, turn, preserveCurrent);\n }\n this.touch(incoming.id);\n return this.threads.get(incoming.id)!;\n }\n\n turn(threadId: string, incoming: TurnView, preserveCurrent = false): void {\n const thread = this.threads.get(threadId);\n if (!thread) return;\n thread.hasMessages = true;\n const current = thread.turns.find((turn) => turn.id === incoming.id);\n if (!current)\n thread.turns.push({\n ...structuredClone(incoming),\n items: incoming.items.map((item) => this.limit(item)),\n });\n else {\n const items = current.items;\n if (!preserveCurrent) Object.assign(current, incoming, { items });\n for (const item of incoming.items) this.item(threadId, incoming.id, item, preserveCurrent);\n }\n // Tool cancellation can finish after a new turn starts. Only the latest\n // turn owns the thread status; older events still update their own history.\n if (!preserveCurrent && thread.turns.at(-1)?.id === incoming.id)\n thread.status = incoming.status;\n this.flushAutoReviews(threadId, incoming.id);\n const updated = thread.turns.find((turn) => turn.id === incoming.id)!;\n this.finishReconnect(updated);\n settleCompactions(updated);\n if (isTerminal(updated.status)) this.finishAutoReviews(updated);\n this.touch(threadId);\n }\n\n turnError(\n threadId: string,\n turnId: string,\n message: string,\n willRetry: boolean,\n metadata: TurnErrorMetadata = {},\n ): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !isActive(turn.status)) return false;\n // Keep display-only diagnostics bounded, without changing the execution reservation.\n const detail = message.slice(0, 4096);\n const info = {\n ...(metadata.errorCode ? { errorCode: metadata.errorCode.slice(0, 100) } : {}),\n ...(metadata.errorDetails ? { errorDetails: metadata.errorDetails.slice(0, 4096) } : {}),\n };\n if (willRetry) turn.reconnect = { status: 'retrying', message: detail, ...info };\n else {\n turn.error = detail;\n Object.assign(turn, info);\n endCompactions(turn, 'failed', detail);\n if (turn.reconnect)\n turn.reconnect = { ...turn.reconnect, ...info, status: 'failed', message: detail };\n }\n this.touch(threadId);\n return true;\n }\n\n compactionCompleted(threadId: string, turnId: string): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !endCompactions(turn, 'completed')) return false;\n this.touch(threadId);\n return true;\n }\n\n endThreadCompactions(threadId: string): void {\n for (const turn of this.threads.get(threadId)?.turns ?? []) endCompactions(turn, 'unknown');\n this.touch(threadId);\n }\n\n turnProgress(threadId: string, turnId: string): boolean {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn || !isActive(turn.status) || turn.reconnect?.status !== 'retrying') return false;\n delete turn.reconnect;\n this.touch(threadId);\n return true;\n }\n\n private finishReconnect(turn: TurnView): void {\n if (!turn.reconnect || !isTerminal(turn.status)) return;\n if (turn.status === 'failed') {\n turn.reconnect = {\n ...turn.reconnect,\n status: 'failed',\n message: (turn.error ?? turn.reconnect.message).slice(0, 4096),\n };\n } else delete turn.reconnect;\n }\n\n autoReview(threadId: string, turnId: string, review: AutoReviewView): boolean {\n const item = this.limit({\n id: `auto-review:${review.reviewId}`,\n type: 'autoApprovalReview',\n status: review.status,\n autoReview: review,\n });\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (turn) return this.applyAutoReview(threadId, turn, item);\n const key = JSON.stringify([threadId, turnId, review.reviewId]);\n const current = this.earlyAutoReviews.get(key);\n if (current && !this.reviewCanReplace(current.item, item)) return false;\n const bytes = Buffer.byteLength(JSON.stringify({ threadId, turnId, item }));\n if (current) this.earlyAutoReviewBytes -= current.bytes;\n this.earlyAutoReviews.set(key, { threadId, turnId, item, bytes });\n this.earlyAutoReviewBytes += bytes;\n while (this.earlyAutoReviews.size > 128 || this.earlyAutoReviewBytes > 4 * 1024 * 1024) {\n const oldest = this.earlyAutoReviews.keys().next().value!;\n this.earlyAutoReviewBytes -= this.earlyAutoReviews.get(oldest)!.bytes;\n this.earlyAutoReviews.delete(oldest);\n }\n return false;\n }\n\n private reviewCanReplace(current: ItemView, incoming: ItemView): boolean {\n const previous = current.autoReview!;\n const next = incoming.autoReview!;\n if (previous.status !== 'inProgress' && next.status === 'inProgress') return false;\n if (\n previous.completedAtMs !== undefined &&\n (next.completedAtMs === undefined || previous.completedAtMs > next.completedAtMs)\n )\n return false;\n return JSON.stringify(current) !== JSON.stringify(incoming);\n }\n\n private applyAutoReview(threadId: string, turn: TurnView, item: ItemView): boolean {\n const index = turn.items.findIndex(\n (entry) =>\n entry.type === 'autoApprovalReview' &&\n entry.autoReview?.reviewId === item.autoReview!.reviewId,\n );\n // Check the original event before converting an unfinished late review to unknown.\n if (index >= 0 && !this.reviewCanReplace(turn.items[index]!, item)) return false;\n if (isTerminal(turn.status) && item.autoReview!.status === 'inProgress') {\n item.autoReview!.status = 'unknown';\n item.status = 'unknown';\n }\n if (index < 0) turn.items.push(item);\n else {\n turn.items[index] = item;\n }\n this.touch(threadId);\n return true;\n }\n\n private flushAutoReviews(threadId: string, turnId: string): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n for (const [key, entry] of this.earlyAutoReviews) {\n if (entry.threadId !== threadId || entry.turnId !== turnId) continue;\n this.earlyAutoReviews.delete(key);\n this.earlyAutoReviewBytes -= entry.bytes;\n this.applyAutoReview(threadId, turn, entry.item);\n }\n }\n\n private finishAutoReviews(turn: TurnView): void {\n for (const item of turn.items) {\n if (item.autoReview?.status !== 'inProgress') continue;\n item.autoReview.status = 'unknown';\n item.status = 'unknown';\n }\n }\n\n item(threadId: string, turnId: string, item: ItemView, preserveCurrent = false): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n const index = turn.items.findIndex((entry) => entry.id === item.id);\n if (index < 0) turn.items.push(this.limit(item));\n else if (!preserveCurrent)\n turn.items[index] = this.limit(mergeCompaction(item, turn.items[index]));\n settleCompactions(turn);\n this.touch(threadId);\n }\n\n delta(\n threadId: string,\n turnId: string,\n itemId: string,\n field: 'text' | 'output',\n delta: string,\n itemType?: string,\n ): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (!turn) return;\n let item = turn.items.find((entry) => entry.id === itemId);\n if (!item) {\n item = {\n id: itemId,\n type: itemType ?? (field === 'text' ? 'agentMessage' : 'commandExecution'),\n };\n turn.items.push(item);\n }\n if (item.truncated) return;\n item[field] = (item[field] ?? '') + delta;\n Object.assign(item, this.limit(item));\n this.touch(threadId);\n }\n\n diff(threadId: string, turnId: string, diff: string): void {\n const turn = this.threads.get(threadId)?.turns.find((entry) => entry.id === turnId);\n if (turn) turn.diff = this.clip(diff).value;\n this.touch(threadId);\n }\n\n action(action: PendingAction): void {\n const owner = action.threadId\n ? this.threads.get(action.threadId)?.turns.find((turn) => turn.id === action.turnId)\n : undefined;\n if (owner && isTerminal(owner.status) && ['pending', 'responding'].includes(action.status))\n action = { ...action, status: 'expired' };\n this.actions.set(action.actionId, action);\n const thread = action.threadId ? this.threads.get(action.threadId) : undefined;\n if (thread) {\n thread.actions = [...this.actions.values()].filter((entry) => entry.threadId === thread.id);\n this.updateActionStatus(thread);\n this.touch(thread.id);\n }\n }\n\n resolveAction(actionId: string, status: PendingAction['status']): PendingAction | undefined {\n const action = this.actions.get(actionId);\n if (!action) return undefined;\n action.status = status;\n const thread = action.threadId ? this.threads.get(action.threadId) : undefined;\n if (thread) {\n this.updateActionStatus(thread);\n this.touch(thread.id);\n }\n return action;\n }\n\n expireTurn(threadId: string, turnId: string): void {\n for (const action of this.actions.values())\n if (\n action.threadId === threadId &&\n action.turnId === turnId &&\n (action.status === 'pending' || action.status === 'responding')\n )\n this.resolveAction(action.actionId, 'expired');\n }\n\n runtimeReset(): void {\n for (const thread of this.values()) delete thread.goal;\n for (const action of this.actions.values())\n if (action.status === 'pending' || action.status === 'responding')\n this.resolveAction(action.actionId, 'expired');\n for (const thread of this.threads.values()) {\n thread.managed = false;\n delete thread.resumeError;\n if (thread.runtimeSettings) {\n const { model, reasoningEffort } = thread.runtimeSettings;\n thread.runtimeSettings = { model, reasoningEffort };\n }\n if (isActive(thread.status)) thread.status = 'unknown';\n for (const turn of thread.turns) {\n if (turn.reconnect?.status === 'retrying') delete turn.reconnect;\n if (isActive(turn.status)) turn.status = 'unknown';\n endCompactions(turn, 'unknown');\n this.finishAutoReviews(turn);\n }\n this.touch(thread.id);\n }\n for (const entry of this.earlyAutoReviews.values()) {\n if (entry.item.autoReview?.status === 'inProgress') {\n this.earlyAutoReviewBytes -= entry.bytes;\n entry.item.autoReview.status = 'unknown';\n entry.item.status = 'unknown';\n entry.bytes = Buffer.byteLength(\n JSON.stringify({ threadId: entry.threadId, turnId: entry.turnId, item: entry.item }),\n );\n this.earlyAutoReviewBytes += entry.bytes;\n }\n }\n }\n\n private updateActionStatus(thread: ThreadView): void {\n const active = thread.actions.filter(\n (action) =>\n action.blocking !== false &&\n (action.status === 'pending' || action.status === 'responding'),\n );\n const turn = [...thread.turns].reverse().find((entry) => isActive(entry.status));\n if (!turn) return;\n const status = active.some(\n (action) => action.kind === 'questions' || action.kind === 'elicitation',\n )\n ? 'waitingInput'\n : active.length > 0\n ? 'waitingApproval'\n : 'running';\n thread.status = status;\n turn.status = status;\n }\n\n private limit(item: ItemView): ItemView {\n const result = structuredClone(item);\n if (result.images) {\n let bytes = 0;\n result.imageCount ??= result.images.length;\n result.images = result.images.filter((image) => {\n bytes += Buffer.byteLength(image);\n return bytes <= this.maxItemBytes;\n });\n }\n for (const field of ['text', 'output', 'command'] as const) {\n const value = result[field];\n if (value) {\n const clipped = this.clip(value);\n result[field] = clipped.value;\n if (clipped.truncated) result.truncated = true;\n }\n }\n if (result.changes)\n result.changes = result.changes.map((change) => {\n const clipped = this.clip(change.diff);\n if (clipped.truncated) result.truncated = true;\n return { ...change, diff: clipped.value };\n });\n if (result.details !== undefined) {\n const clipped = this.clip(JSON.stringify(result.details));\n if (clipped.truncated) {\n result.details = clipped.value;\n result.truncated = true;\n }\n }\n if (result.autoReview) {\n for (const field of ['actionLabel', 'actionSummary', 'cwd', 'rationale'] as const) {\n const value = result.autoReview[field];\n if (value === undefined) continue;\n const clipped = this.clip(value);\n result.autoReview[field] = clipped.value;\n if (clipped.truncated) result.truncated = true;\n }\n }\n return result;\n }\n\n private clip(value: string): { value: string; truncated: boolean } {\n if (Buffer.byteLength(value) <= this.maxItemBytes) return { value, truncated: false };\n // Iterating code points avoids a half UTF-8 character at the truncation boundary.\n let kept = '';\n let bytes = 0;\n for (const point of value) {\n bytes += Buffer.byteLength(point);\n if (bytes > this.maxItemBytes) break;\n kept += point;\n }\n return { value: `${kept}\\n[\u8F93\u51FA\u5DF2\u622A\u65AD]`, truncated: true };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }