gsd-pi 2.73.1-dev.6ddfa43 → 2.73.1-dev.9a4cd44

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 (126) hide show
  1. package/dist/cli-web-branch.d.ts +4 -3
  2. package/dist/cli-web-branch.js +10 -7
  3. package/dist/cli.js +99 -206
  4. package/dist/logo.d.ts +1 -1
  5. package/dist/logo.js +1 -1
  6. package/dist/onboarding.js +59 -53
  7. package/dist/resource-loader.js +2 -2
  8. package/dist/resources/extensions/gsd/auto/phases.js +15 -9
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -3
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +41 -1
  11. package/dist/resources/extensions/gsd/auto-start.js +3 -0
  12. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
  13. package/dist/resources/extensions/gsd/auto-verification.js +88 -3
  14. package/dist/resources/extensions/gsd/auto.js +29 -8
  15. package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
  16. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  17. package/dist/resources/extensions/gsd/notification-widget.js +2 -2
  18. package/dist/resources/extensions/gsd/state.js +61 -14
  19. package/dist/update-check.d.ts +1 -0
  20. package/dist/update-check.js +13 -5
  21. package/dist/update-cmd.js +4 -3
  22. package/dist/web/standalone/.next/BUILD_ID +1 -1
  23. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  24. package/dist/web/standalone/.next/build-manifest.json +2 -2
  25. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  26. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/index.html +1 -1
  43. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  50. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  52. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  53. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  54. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  55. package/package.json +1 -2
  56. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  57. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  58. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  59. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  60. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  61. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  62. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  63. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  64. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  65. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +138 -0
  66. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  67. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  68. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  69. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  70. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  71. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  72. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  73. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  74. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  75. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  76. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  80. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  81. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  82. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +21 -4
  83. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  84. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  85. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +11 -3
  86. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  87. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +157 -0
  88. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  89. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  90. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  91. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  92. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +21 -4
  93. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +11 -3
  94. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  95. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  96. package/packages/pi-tui/dist/tui.d.ts +8 -0
  97. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  98. package/packages/pi-tui/dist/tui.js +32 -3
  99. package/packages/pi-tui/dist/tui.js.map +1 -1
  100. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  101. package/packages/pi-tui/src/tui.ts +31 -3
  102. package/src/resources/extensions/gsd/auto/phases.ts +22 -9
  103. package/src/resources/extensions/gsd/auto-dispatch.ts +10 -4
  104. package/src/resources/extensions/gsd/auto-post-unit.ts +47 -1
  105. package/src/resources/extensions/gsd/auto-start.ts +3 -0
  106. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  107. package/src/resources/extensions/gsd/auto-verification.ts +98 -3
  108. package/src/resources/extensions/gsd/auto.ts +31 -14
  109. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  110. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  111. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  112. package/src/resources/extensions/gsd/state.ts +71 -15
  113. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +2 -2
  114. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  115. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  116. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  117. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  118. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  119. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  120. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  121. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  122. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  123. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  124. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  125. /package/dist/web/standalone/.next/static/{r6AvNu-aMwn4nwqjHqAfw → ASJ2RGD7E1iiUYzA0xT2i}/_buildManifest.js +0 -0
  126. /package/dist/web/standalone/.next/static/{r6AvNu-aMwn4nwqjHqAfw → ASJ2RGD7E1iiUYzA0xT2i}/_ssgManifest.js +0 -0
@@ -0,0 +1,58 @@
1
+ import { describe, test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import { isContextOverflow } from "../overflow.js";
5
+ import type { AssistantMessage } from "../../types.js";
6
+
7
+ function makeAssistantMessage(overrides: Partial<AssistantMessage> = {}): AssistantMessage {
8
+ return {
9
+ role: "assistant",
10
+ content: [],
11
+ api: "anthropic-messages",
12
+ provider: "anthropic",
13
+ model: "claude-sonnet-4-6",
14
+ usage: {
15
+ input: 0,
16
+ output: 0,
17
+ cacheRead: 0,
18
+ cacheWrite: 0,
19
+ totalTokens: 0,
20
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
21
+ },
22
+ stopReason: "error",
23
+ timestamp: Date.now(),
24
+ ...overrides,
25
+ };
26
+ }
27
+
28
+ describe("isContextOverflow", () => {
29
+ test("detects overflow from provider errorMessage", () => {
30
+ const message = makeAssistantMessage({
31
+ errorMessage: "prompt is too long: 213462 tokens > 200000 maximum",
32
+ });
33
+
34
+ assert.equal(isContextOverflow(message, 200000), true);
35
+ });
36
+
37
+ test("detects claude-code overflow when text contains the error but errorMessage is generic (#3925)", () => {
38
+ const message = makeAssistantMessage({
39
+ provider: "claude-code",
40
+ api: "anthropic-messages",
41
+ model: "claude-sonnet-4-6",
42
+ errorMessage: "success",
43
+ content: [{ type: "text", text: "Prompt is too long" }],
44
+ });
45
+
46
+ assert.equal(isContextOverflow(message, 200000), true);
47
+ });
48
+
49
+ test("does not treat normal non-error text as overflow", () => {
50
+ const message = makeAssistantMessage({
51
+ stopReason: "stop",
52
+ errorMessage: undefined,
53
+ content: [{ type: "text", text: "Prompt is too long" }],
54
+ });
55
+
56
+ assert.equal(isContextOverflow(message, 200000), false);
57
+ });
58
+ });
@@ -552,4 +552,142 @@ test("chat-controller does not duplicate text when content is [text, tool, text]
552
552
  await handleAgentEvent(host, { type: "message_end", message: makeAssistant(finalContent) });
553
553
  assert.deepEqual(secondText.range, { startIndex: 2, endIndex: 2 }, "range must not be cleared on message_end (would cause duplication)");
554
554
  });
555
+ // Regression for the claude-code sub-turn bug that followed #4144:
556
+ // an adapter can reset content[] back to 0/1 mid-lifecycle when a new provider
557
+ // sub-turn begins. The segment walker must NOT update prior-sub-turn text-run
558
+ // components in place (which would destroy earlier history) and must NOT reuse
559
+ // stale tool registrations for a new tool at the same contentIndex. Prior
560
+ // sub-turn children must stay frozen; new sub-turn segments must append after
561
+ // them, and the pinned "Latest Output" mirror must re-evaluate for the new sub-turn.
562
+ test("chat-controller freezes prior sub-turn and appends new segments when content shrinks", async () => {
563
+ globalThis[Symbol.for("@gsd/pi-coding-agent:theme")] = {
564
+ fg: (_key, text) => text,
565
+ bg: (_key, text) => text,
566
+ bold: (text) => text,
567
+ italic: (text) => text,
568
+ truncate: (text) => text,
569
+ };
570
+ const host = createHost();
571
+ host.getMarkdownThemeWithSettings = () => ({});
572
+ const t1 = { type: "toolCall", id: "t1", name: "tool_one", arguments: {} };
573
+ const t2 = { type: "toolCall", id: "t2", name: "tool_two", arguments: {} };
574
+ await handleAgentEvent(host, { type: "message_start", message: makeAssistant([]) });
575
+ // Sub-turn 1: grow to [A, T1, B]
576
+ await handleAgentEvent(host, {
577
+ type: "message_update",
578
+ message: makeAssistant([{ type: "text", text: "A" }]),
579
+ assistantMessageEvent: {
580
+ type: "text_delta", contentIndex: 0, delta: "A",
581
+ partial: makeAssistant([{ type: "text", text: "A" }]),
582
+ },
583
+ });
584
+ await handleAgentEvent(host, {
585
+ type: "message_update",
586
+ message: makeAssistant([{ type: "text", text: "A" }, t1]),
587
+ assistantMessageEvent: {
588
+ type: "toolcall_end", contentIndex: 1,
589
+ toolCall: { ...t1, externalResult: { content: [{ type: "text", text: "r1" }], details: {}, isError: false } },
590
+ partial: makeAssistant([{ type: "text", text: "A" }, t1]),
591
+ },
592
+ });
593
+ await handleAgentEvent(host, {
594
+ type: "message_update",
595
+ message: makeAssistant([{ type: "text", text: "A" }, t1, { type: "text", text: "B" }]),
596
+ assistantMessageEvent: {
597
+ type: "text_delta", contentIndex: 2, delta: "B",
598
+ partial: makeAssistant([{ type: "text", text: "A" }, t1, { type: "text", text: "B" }]),
599
+ },
600
+ });
601
+ assert.equal(host.chatContainer.children.length, 3, "sub-turn 1 renders 3 children");
602
+ const priorA = host.chatContainer.children[0];
603
+ const priorT1 = host.chatContainer.children[1];
604
+ const priorB = host.chatContainer.children[2];
605
+ // Sub-turn boundary: adapter resets content[] to [C]
606
+ await handleAgentEvent(host, {
607
+ type: "message_update",
608
+ message: makeAssistant([{ type: "text", text: "C" }]),
609
+ assistantMessageEvent: {
610
+ type: "text_delta", contentIndex: 0, delta: "C",
611
+ partial: makeAssistant([{ type: "text", text: "C" }]),
612
+ },
613
+ });
614
+ // Prior 3 children must still exist in DOM — and a NEW text-run for "C" appended after them.
615
+ assert.equal(host.chatContainer.children.length, 4, "shrink must append new segment, not replace prior history");
616
+ assert.equal(host.chatContainer.children[0], priorA, "prior A component stays at index 0");
617
+ assert.equal(host.chatContainer.children[1], priorT1, "prior T1 component stays at index 1");
618
+ assert.equal(host.chatContainer.children[2], priorB, "prior B component stays at index 2");
619
+ assert.notEqual(host.chatContainer.children[3], priorA, "new C text-run must be a different component from prior A");
620
+ assert.equal(host.chatContainer.children[3]?.constructor?.name, "AssistantMessageComponent");
621
+ // Prior A component must still render "A", not be overwritten with "C".
622
+ function getRenderedTexts(comp) {
623
+ const contentContainer = comp.children?.[0];
624
+ if (!contentContainer)
625
+ return [];
626
+ return (contentContainer.children ?? [])
627
+ .filter((c) => c.constructor?.name === "Markdown")
628
+ .map((c) => c.text);
629
+ }
630
+ assert.deepEqual(getRenderedTexts(priorA), ["A"], "prior A text-run must still contain 'A' after shrink");
631
+ assert.deepEqual(getRenderedTexts(priorB), ["B"], "prior B text-run must still contain 'B' after shrink");
632
+ assert.deepEqual(getRenderedTexts(host.chatContainer.children[3]), ["C"], "new text-run must contain only 'C'");
633
+ // Sub-turn 2 grows with a new tool T2 at contentIndex=1.
634
+ await handleAgentEvent(host, {
635
+ type: "message_update",
636
+ message: makeAssistant([{ type: "text", text: "C" }, t2]),
637
+ assistantMessageEvent: {
638
+ type: "toolcall_end", contentIndex: 1,
639
+ toolCall: { ...t2, externalResult: { content: [{ type: "text", text: "r2" }], details: {}, isError: false } },
640
+ partial: makeAssistant([{ type: "text", text: "C" }, t2]),
641
+ },
642
+ });
643
+ // T2 must be appended after the new C text-run, not conflated with the stale T1 registration.
644
+ assert.equal(host.chatContainer.children.length, 5, "new tool appends after new text-run");
645
+ assert.equal(host.chatContainer.children[4]?.constructor?.name, "ToolExecutionComponent");
646
+ assert.notEqual(host.chatContainer.children[4], priorT1, "new T2 must be a different component from prior T1");
647
+ // Finalize so the module-level pinned spinner (setInterval) is torn down and the test process can exit.
648
+ await handleAgentEvent(host, { type: "message_end", message: makeAssistant([{ type: "text", text: "C" }, t2]) });
649
+ });
650
+ // Regression: after a sub-turn shrink, lastPinnedText must be cleared so the
651
+ // pinned "Latest Output" mirror can display text from the new sub-turn instead
652
+ // of staying frozen on a stale snapshot (the "bottom green stays" symptom).
653
+ test("chat-controller updates pinned zone after sub-turn shrink", async () => {
654
+ globalThis[Symbol.for("@gsd/pi-coding-agent:theme")] = {
655
+ fg: (_key, text) => text,
656
+ bg: (_key, text) => text,
657
+ bold: (text) => text,
658
+ italic: (text) => text,
659
+ truncate: (text) => text,
660
+ };
661
+ const host = createHost();
662
+ host.getMarkdownThemeWithSettings = () => ({});
663
+ const t1 = { type: "toolCall", id: "t1", name: "tool_one", arguments: {} };
664
+ const t2 = { type: "toolCall", id: "t2", name: "tool_two", arguments: {} };
665
+ await handleAgentEvent(host, { type: "message_start", message: makeAssistant([]) });
666
+ // Sub-turn 1 with pinnable text before a tool → populates pinned zone with "first".
667
+ await handleAgentEvent(host, {
668
+ type: "message_update",
669
+ message: makeAssistant([{ type: "text", text: "first" }, t1]),
670
+ assistantMessageEvent: {
671
+ type: "toolcall_end", contentIndex: 1,
672
+ toolCall: { ...t1, externalResult: { content: [{ type: "text", text: "r1" }], details: {}, isError: false } },
673
+ partial: makeAssistant([{ type: "text", text: "first" }, t1]),
674
+ },
675
+ });
676
+ const pinnedMarkdown = host.pinnedMessageContainer.children[1];
677
+ assert.equal(pinnedMarkdown?.text, "first", "pinned zone seeded with sub-turn 1 text");
678
+ // Sub-turn boundary: content resets to [second, t2].
679
+ await handleAgentEvent(host, {
680
+ type: "message_update",
681
+ message: makeAssistant([{ type: "text", text: "second" }, t2]),
682
+ assistantMessageEvent: {
683
+ type: "toolcall_end", contentIndex: 1,
684
+ toolCall: { ...t2, externalResult: { content: [{ type: "text", text: "r2" }], details: {}, isError: false } },
685
+ partial: makeAssistant([{ type: "text", text: "second" }, t2]),
686
+ },
687
+ });
688
+ // Pinned markdown must now reflect the new sub-turn's text, not stay frozen on "first".
689
+ assert.equal(pinnedMarkdown?.text, "second", "pinned zone must update after sub-turn shrink (#4144 regression)");
690
+ // Finalize so the module-level pinned spinner (setInterval) is torn down and the test process can exit.
691
+ await handleAgentEvent(host, { type: "message_end", message: makeAssistant([{ type: "text", text: "second" }, t2]) });
692
+ });
555
693
  //# sourceMappingURL=chat-controller-ordering.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-controller-ordering.test.js","sourceRoot":"","sources":["../../src/core/chat-controller-ordering.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { test } from \"node:test\";\n\nimport { handleAgentEvent } from \"../modes/interactive/controllers/chat-controller.js\";\n\nfunction makeUsage() {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction makeAssistant(content: any[]) {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"claude-code\",\n\t\tmodel: \"claude-sonnet-4\",\n\t\tusage: makeUsage(),\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createHost() {\n\tconst chatContainer = {\n\t\tchildren: [] as any[],\n\t\taddChild(component: any) {\n\t\t\tthis.children.push(component);\n\t\t},\n\t\tremoveChild(component: any) {\n\t\t\tconst idx = this.children.indexOf(component);\n\t\t\tif (idx !== -1) this.children.splice(idx, 1);\n\t\t},\n\t\tclear() {\n\t\t\tthis.children = [];\n\t\t},\n\t};\n\n\tconst pinnedMessageContainer = {\n\t\tchildren: [] as any[],\n\t\taddChild(component: any) {\n\t\t\tthis.children.push(component);\n\t\t},\n\t\tremoveChild(component: any) {\n\t\t\tconst idx = this.children.indexOf(component);\n\t\t\tif (idx !== -1) this.children.splice(idx, 1);\n\t\t},\n\t\tclear() {\n\t\t\tthis.children = [];\n\t\t},\n\t};\n\n\tconst host: any = {\n\t\tisInitialized: true,\n\t\tinit: async () => {},\n\t\tdefaultEditor: { onEscape: undefined },\n\t\teditor: {},\n\t\tsession: { retryAttempt: 0, abortCompaction: () => {}, abortRetry: () => {} },\n\t\tui: { requestRender: () => {}, terminal: { rows: 50 } },\n\t\tfooter: { invalidate: () => {} },\n\t\tkeybindings: {},\n\t\tstatusContainer: { clear: () => {}, addChild: () => {} },\n\t\tchatContainer,\n\t\tsettingsManager: { getTimestampFormat: () => \"date-time-iso\", getShowImages: () => false },\n\t\tpendingTools: new Map(),\n\t\ttoolOutputExpanded: false,\n\t\thideThinkingBlock: false,\n\t\tisBashMode: false,\n\t\tdefaultWorkingMessage: \"Working...\",\n\t\tcompactionQueuedMessages: [],\n\t\teditorContainer: {},\n\t\tpendingMessagesContainer: { clear: () => {} },\n\t\tpinnedMessageContainer,\n\t\taddMessageToChat: () => {},\n\t\tgetMarkdownThemeWithSettings: () => ({}),\n\t\tformatWebSearchResult: () => \"\",\n\t\tgetRegisteredToolDefinition: () => undefined,\n\t\tcheckShutdownRequested: async () => {},\n\t\trebuildChatFromMessages: () => {},\n\t\tflushCompactionQueue: async () => {},\n\t\tshowStatus: () => {},\n\t\tshowError: () => {},\n\t\tupdatePendingMessagesDisplay: () => {},\n\t\tupdateTerminalTitle: () => {},\n\t\tupdateEditorBorderColor: () => {},\n\t};\n\n\treturn host;\n}\n\ntest(\"chat-controller renders content blocks in content[] index order (tool-first stream)\", async () => {\n\t// ToolExecutionComponent uses the global theme singleton.\n\t// Install a minimal no-op theme implementation for this unit test.\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"mcp-tool-1\";\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: toolId,\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.chatContainer.children.length, 0, \"nothing should render before content arrives\");\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"tool output\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0] = toolCall → ToolExecutionComponent renders first\n\tassert.equal(host.chatContainer.children.length, 1, \"tool execution block should render immediately\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([toolCall, { type: \"text\", text: \"done\" }]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"text_delta\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\tdelta: \"done\",\n\t\t\t\tpartial: makeAssistant([toolCall, { type: \"text\", text: \"done\" }]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0]=toolCall, content[1]=text → order: tool, then text\n\tassert.equal(host.chatContainer.children.length, 2, \"text run should render after tool in content[] order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"AssistantMessageComponent\");\n});\n\ntest(\"chat-controller renders serverToolUse before trailing text matching content[] index order\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"mcp-secure-1\";\n\tconst serverToolUse = {\n\t\ttype: \"serverToolUse\",\n\t\tid: toolId,\n\t\tname: \"mcp__gsd-workflow__secure_env_collect\",\n\t\tinput: { projectDir: \"/tmp/project\", keys: [{ key: \"SECURE_PASSWORD\" }], destination: \"dotenv\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([serverToolUse]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"server_tool_use\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tpartial: makeAssistant([serverToolUse]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0] = serverToolUse → ToolExecutionComponent renders first\n\tassert.equal(host.chatContainer.children.length, 1, \"server tool block should render immediately\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tconst resultMessage = makeAssistant([\n\t\t{\n\t\t\t...serverToolUse,\n\t\t\texternalResult: {\n\t\t\t\tcontent: [{ type: \"text\", text: \"secure_env_collect was cancelled by user.\" }],\n\t\t\t\tdetails: {},\n\t\t\t\tisError: true,\n\t\t\t},\n\t\t},\n\t\t{ type: \"text\", text: \"The secure password collection was cancelled.\" },\n\t]);\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: resultMessage,\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"server_tool_use\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tpartial: resultMessage,\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0]=serverToolUse, content[1]=text → order: tool, then text\n\tassert.equal(host.chatContainer.children.length, 2, \"text run should render after server tool in content[] order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"AssistantMessageComponent\");\n});\n\ntest(\"chat-controller pins latest assistant text above editor when tool calls are present\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"tool-pin-1\";\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: toolId,\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should be empty at message_start\");\n\n\t// Send a message with text followed by a tool call\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([\n\t\t\t\t{ type: \"text\", text: \"Looking at the files now.\" },\n\t\t\t\ttoolCall,\n\t\t\t]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"file contents\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Looking at the files now.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// Pinned zone should now have a DynamicBorder and a Markdown component\n\tassert.equal(host.pinnedMessageContainer.children.length, 2, \"pinned zone should have border + markdown\");\n\tassert.equal(host.pinnedMessageContainer.children[0]?.constructor?.name, \"DynamicBorder\");\n\tassert.equal(host.pinnedMessageContainer.children[1]?.constructor?.name, \"Markdown\");\n});\n\ntest(\"chat-controller clears pinned zone when a new assistant message starts\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-clear-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Populate the pinned zone\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated\");\n\n\t// Start a new assistant message — pinned zone should clear\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on new assistant message\");\n});\n\ntest(\"chat-controller clears pinned zone when the agent turn ends\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-clear-on-end-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated before agent_end\");\n\n\tawait handleAgentEvent(host, { type: \"agent_end\" } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on agent_end\");\n});\n\ntest(\"chat-controller clears pinned zone when assistant message ends\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-msg-end-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tconst msgContent = [{ type: \"text\", text: \"Summary after tools.\" }, toolCall];\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant(msgContent),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant(msgContent),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated during streaming\");\n\n\t// End the assistant message (e.g. before form elicitation) — pinned zone should clear\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(msgContent) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on message_end to prevent duplicate display\");\n});\n\ntest(\"chat-controller does not pin when there are no tool calls\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Just some text, no tools.\" }]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"text_delta\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tdelta: \"Just some text, no tools.\",\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Just some text, no tools.\" }]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should stay empty without tool calls\");\n});\n\n// Regression test for issue #4144: interleaved text/tool content must render in content[] index order.\n// Stream: [text \"A\", toolCall T1, text \"B\", toolCall T2, text \"C\"]\n// Expected chatContainer order: textRun(A), toolExec(T1), textRun(B), toolExec(T2), textRun(C)\n// Each AssistantMessageComponent must render ONLY its own text — no duplication after message_end.\ntest(\"chat-controller renders interleaved text and tool blocks in content[] index order (#4144)\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\tconst t2 = { type: \"toolCall\", id: \"t2\", name: \"tool_two\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Stream text \"A\" at index 0\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 0,\n\t\t\tdelta: \"A\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\t},\n\t} as any);\n\n\t// Stream toolCall T1 at index 1\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 1,\n\t\t\ttoolCall: {\n\t\t\t\t...t1,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result1\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\t},\n\t} as any);\n\n\t// Stream text \"B\" at index 2\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 2,\n\t\t\tdelta: \"B\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\t},\n\t} as any);\n\n\t// Stream toolCall T2 at index 3\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 3,\n\t\t\ttoolCall: {\n\t\t\t\t...t2,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result2\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2]),\n\t\t},\n\t} as any);\n\n\t// Stream text \"C\" at index 4\n\tconst finalContent = [\n\t\t{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2, { type: \"text\", text: \"C\" },\n\t];\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant(finalContent),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 4,\n\t\t\tdelta: \"C\",\n\t\t\tpartial: makeAssistant(finalContent),\n\t\t},\n\t} as any);\n\n\t// Finalize — exercises the message_end path where a buggy setRange(undefined) would cause duplication\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(finalContent) } as any);\n\n\t// Assert interleaved order: textRun(A), toolExec(T1), textRun(B), toolExec(T2), textRun(C)\n\tassert.equal(host.chatContainer.children.length, 5, \"should have 5 children in interleaved order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"AssistantMessageComponent\", \"index 0: text run A\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"ToolExecutionComponent\", \"index 1: tool T1\");\n\tassert.equal(host.chatContainer.children[2]?.constructor?.name, \"AssistantMessageComponent\", \"index 2: text run B\");\n\tassert.equal(host.chatContainer.children[3]?.constructor?.name, \"ToolExecutionComponent\", \"index 3: tool T2\");\n\tassert.equal(host.chatContainer.children[4]?.constructor?.name, \"AssistantMessageComponent\", \"index 4: text run C\");\n\n\t// Helper: collect the text of all Markdown children inside an AssistantMessageComponent.\n\t// Structure: AssistantMessageComponent (Container) -> contentContainer (children[0]) -> Markdown nodes.\n\tfunction getRenderedTexts(comp: any): string[] {\n\t\tconst contentContainer = comp.children?.[0];\n\t\tif (!contentContainer) return [];\n\t\treturn (contentContainer.children ?? [])\n\t\t\t.filter((c: any) => c.constructor?.name === \"Markdown\")\n\t\t\t.map((c: any) => (c as any).text as string);\n\t}\n\n\t// Each text-run component must contain only its own text — no cross-contamination after message_end\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[0]), [\"A\"], \"text run A must contain only 'A'\");\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[2]), [\"B\"], \"text run B must contain only 'B'\");\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[4]), [\"C\"], \"text run C must contain only 'C'\");\n});\n\ntest(\"chat-controller does not duplicate text when content is [text, tool, text] (interleaved stream)\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Step 1: text \"A\" at index 0\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 0,\n\t\t\tdelta: \"A\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\t},\n\t} as any);\n\n\t// Step 2: toolCall at index 1\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 1,\n\t\t\ttoolCall: {\n\t\t\t\t...t1,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result1\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\t},\n\t} as any);\n\n\t// Step 3: text \"B\" at index 2\n\tconst finalContent = [{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }];\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant(finalContent),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 2,\n\t\t\tdelta: \"B\",\n\t\t\tpartial: makeAssistant(finalContent),\n\t\t},\n\t} as any);\n\n\tassert.equal(host.chatContainer.children.length, 3);\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"AssistantMessageComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[2]?.constructor?.name, \"AssistantMessageComponent\");\n\n\tconst firstText = host.chatContainer.children[0];\n\tconst secondText = host.chatContainer.children[2];\n\tassert.notEqual(firstText, secondText, \"text-before-tool and text-after-tool must be separate component instances\");\n\tassert.deepEqual((firstText as any).range, { startIndex: 0, endIndex: 0 }, \"first text-run covers only content[0]\");\n\tassert.deepEqual((secondText as any).range, { startIndex: 2, endIndex: 2 }, \"second text-run covers only content[2]\");\n\n\t// Finalize — regression guard: range must NOT be cleared on message_end (would cause duplication)\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(finalContent) } as any);\n\n\tassert.deepEqual((secondText as any).range, { startIndex: 2, endIndex: 2 }, \"range must not be cleared on message_end (would cause duplication)\");\n});\n"]}
1
+ {"version":3,"file":"chat-controller-ordering.test.js","sourceRoot":"","sources":["../../src/core/chat-controller-ordering.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qDAAqD,CAAC;AAEvF,SAAS,SAAS;IACjB,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAc;IACpC,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,GAAG,EAAE,oBAAoB;QACzB,QAAQ,EAAE,aAAa;QACvB,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,SAAS,EAAE;QAClB,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IAClB,MAAM,aAAa,GAAG;QACrB,QAAQ,EAAE,EAAW;QACrB,QAAQ,CAAC,SAAc;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,WAAW,CAAC,SAAc;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK;YACJ,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpB,CAAC;KACD,CAAC;IAEF,MAAM,sBAAsB,GAAG;QAC9B,QAAQ,EAAE,EAAW;QACrB,QAAQ,CAAC,SAAc;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,WAAW,CAAC,SAAc;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK;YACJ,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpB,CAAC;KACD,CAAC;IAEF,MAAM,IAAI,GAAQ;QACjB,aAAa,EAAE,IAAI;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACpB,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;QACtC,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;QAC7E,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QACvD,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;QAChC,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;QACxD,aAAa;QACb,eAAe,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE;QAC1F,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,kBAAkB,EAAE,KAAK;QACzB,iBAAiB,EAAE,KAAK;QACxB,UAAU,EAAE,KAAK;QACjB,qBAAqB,EAAE,YAAY;QACnC,wBAAwB,EAAE,EAAE;QAC5B,eAAe,EAAE,EAAE;QACnB,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;QAC7C,sBAAsB;QACtB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC1B,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACxC,qBAAqB,EAAE,GAAG,EAAE,CAAC,EAAE;QAC/B,2BAA2B,EAAE,GAAG,EAAE,CAAC,SAAS;QAC5C,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtC,uBAAuB,EAAE,GAAG,EAAE,GAAE,CAAC;QACjC,oBAAoB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACpC,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;QACnB,4BAA4B,EAAE,GAAG,EAAE,GAAE,CAAC;QACtC,mBAAmB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC7B,uBAAuB,EAAE,GAAG,EAAE,GAAE,CAAC;KACjC,CAAC;IAEF,OAAO,IAAI,CAAC;AACb,CAAC;AAED,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACtG,0DAA0D;IAC1D,mEAAmE;IAClE,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC;IAC5B,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;KAC7B,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,8CAA8C,CAAC,CAAC;IAEpG,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClC,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;oBAChD,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;iBACd;aACD;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;SAClC;KACM,CACR,CAAC;IAEF,+DAA+D;IAC/D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,gDAAgD,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAE1F,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,aAAa,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SAClE;KACM,CACR,CAAC;IAEF,gEAAgE;IAChE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,sDAAsD,CAAC,CAAC;IAC5G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;IAC3G,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,cAAc,CAAC;IAC9B,MAAM,aAAa,GAAG;QACrB,IAAI,EAAE,eAAe;QACrB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,uCAAuC;QAC7C,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE;KAChG,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC;QACvC,qBAAqB,EAAE;YACtB,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC;SACvC;KACM,CACR,CAAC;IAEF,oEAAoE;IACpE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;IACnG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAE1F,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,aAAa,CAAC;QACnC;YACC,GAAG,aAAa;YAChB,cAAc,EAAE;gBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;gBAC9E,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,IAAI;aACb;SACD;QACD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+CAA+C,EAAE;KACvE,CAAC,CAAC;IAEH,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa;QACtB,qBAAqB,EAAE;YACtB,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,aAAa;SACtB;KACM,CACR,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,6DAA6D,CAAC,CAAC;IACnH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACrG,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC;IAC5B,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;KAC7B,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,8CAA8C,CAAC,CAAC;IAE7G,mDAAmD;IACnD,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACnD,QAAQ;SACR,CAAC;QACF,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;oBAClD,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;iBACd;aACD;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,QAAQ,CAAC,CAAC;SACvF;KACM,CACR,CAAC;IAEF,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;IAC1G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACtF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;KAC7B,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,2BAA2B;IAC3B,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5E,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACvC,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;iBACd;aACD;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;SAC5E;KACM,CACR,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAE9F,2DAA2D;IAC3D,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,mDAAmD,CAAC,CAAC;AACnH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;KAC7B,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5E,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACvC,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;iBACd;aACD;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;SAC5E;KACM,CACR,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,kDAAkD,CAAC,CAAC;IAE/G,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAS,CAAC,CAAC;IAE3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,uCAAuC,CAAC,CAAC;AACvG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG;QAChB,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;KAC7B,CAAC;IAEF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC;QAClC,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACvC,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK;iBACd;aACD;YACD,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC;SAClC;KACM,CACR,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,kDAAkD,CAAC,CAAC;IAE/G,sFAAsF;IACtF,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,EAAS,CAAC,CAAC;IAEjG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,sEAAsE,CAAC,CAAC;AACtI,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CACrB,IAAI,EACJ;QACC,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC7E,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,2BAA2B;YAClC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;SAC7E;KACM,CACR,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAC;AAClH,CAAC,CAAC,CAAC;AAEH,uGAAuG;AACvG,mEAAmE;AACnE,+FAA+F;AAC/F,mGAAmG;AACnG,IAAI,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;IAC3G,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,6BAA6B;IAC7B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACrD;KACM,CAAC,CAAC;IAEV,gCAAgC;IAChC,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,EAAE;gBACL,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;aAC7F;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;SACzD;KACM,CAAC,CAAC;IAEV,6BAA6B;IAC7B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACtF;KACM,CAAC,CAAC;IAEV,gCAAgC;IAChC,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1F,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,EAAE;gBACL,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;aAC7F;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;SAC1F;KACM,CAAC,CAAC;IAEV,6BAA6B;IAC7B,MAAM,YAAY,GAAG;QACpB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;KAC7F,CAAC;IACF,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC;QACpC,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC;SACpC;KACM,CAAC,CAAC;IAEV,sGAAsG;IACtG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,EAAS,CAAC,CAAC;IAEnG,2FAA2F;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;IACnG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,EAAE,qBAAqB,CAAC,CAAC;IACpH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;IAC9G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,EAAE,qBAAqB,CAAC,CAAC;IACpH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;IAC9G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,EAAE,qBAAqB,CAAC,CAAC;IAEpH,yFAAyF;IACzF,wGAAwG;IACxG,SAAS,gBAAgB,CAAC,IAAS;QAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,UAAU,CAAC;aACtD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAE,CAAS,CAAC,IAAc,CAAC,CAAC;IAC9C,CAAC;IAED,oGAAoG;IACpG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAC9G,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAC9G,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;IACjH,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,8BAA8B;IAC9B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACrD;KACM,CAAC,CAAC;IAEV,8BAA8B;IAC9B,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACT,GAAG,EAAE;gBACL,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;aAC7F;YACD,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;SACzD;KACM,CAAC,CAAC;IAEV,8BAA8B;IAC9B,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC;QACpC,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC;SACpC;KACM,CAAC,CAAC;IAEV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAC7F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAE7F,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,2EAA2E,CAAC,CAAC;IACpH,MAAM,CAAC,SAAS,CAAE,SAAiB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,uCAAuC,CAAC,CAAC;IACpH,MAAM,CAAC,SAAS,CAAE,UAAkB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,wCAAwC,CAAC,CAAC;IAEtH,kGAAkG;IAClG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,EAAS,CAAC,CAAC;IAEnG,MAAM,CAAC,SAAS,CAAE,UAAkB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,oEAAoE,CAAC,CAAC;AACnJ,CAAC,CAAC,CAAC;AAEH,mEAAmE;AACnE,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,0EAA0E;AAC1E,8EAA8E;AAC9E,qFAAqF;AACrF,IAAI,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;IACtG,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,iCAAiC;IACjC,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG;YAC/C,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACrD;KACM,CAAC,CAAC;IACV,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7G,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;SACzD;KACM,CAAC,CAAC;IACV,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG;YAC/C,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACtF;KACM,CAAC,CAAC;IAEV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9C,qDAAqD;IACrD,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,qBAAqB,EAAE;YACtB,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG;YAC/C,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACrD;KACM,CAAC,CAAC;IAEV,6FAA6F;IAC7F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,2DAA2D,CAAC,CAAC;IACjH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;IAC7F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAC3F,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,2DAA2D,CAAC,CAAC;IACrH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAE7F,wEAAwE;IACxE,SAAS,gBAAgB,CAAC,IAAS;QAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,UAAU,CAAC;aACtD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAE,CAAS,CAAC,IAAc,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,sDAAsD,CAAC,CAAC;IAC1G,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,sDAAsD,CAAC,CAAC;IAC1G,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,oCAAoC,CAAC,CAAC;IAEhH,yDAAyD;IACzD,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7G,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;SACzD;KACM,CAAC,CAAC;IAEV,8FAA8F;IAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,qCAAqC,CAAC,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC1F,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oDAAoD,CAAC,CAAC;IAE/G,wGAAwG;IACxG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAS,CAAC,CAAC;AACzH,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,+EAA+E;AAC/E,4EAA4E;AAC5E,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,UAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,GAAG;QAC/D,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,EAAE,EAAE,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI;QACxC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC5B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;QAC9B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;KAChC,CAAC;IAEF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE3E,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAS,CAAC,CAAC;IAE3F,oFAAoF;IACpF,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7G,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;SAC7D;KACM,CAAC,CAAC;IACV,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAE,cAAsB,EAAE,IAAI,EAAE,OAAO,EAAE,yCAAyC,CAAC,CAAC;IAEhG,qDAAqD;IACrD,MAAM,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9D,qBAAqB,EAAE;YACtB,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;YACrC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC7G,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D;KACM,CAAC,CAAC;IAEV,wFAAwF;IACxF,MAAM,CAAC,KAAK,CAAE,cAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,kEAAkE,CAAC,CAAC;IAE1H,wGAAwG;IACxG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAS,CAAC,CAAC;AAC9H,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { test } from \"node:test\";\n\nimport { handleAgentEvent } from \"../modes/interactive/controllers/chat-controller.js\";\n\nfunction makeUsage() {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction makeAssistant(content: any[]) {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"claude-code\",\n\t\tmodel: \"claude-sonnet-4\",\n\t\tusage: makeUsage(),\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createHost() {\n\tconst chatContainer = {\n\t\tchildren: [] as any[],\n\t\taddChild(component: any) {\n\t\t\tthis.children.push(component);\n\t\t},\n\t\tremoveChild(component: any) {\n\t\t\tconst idx = this.children.indexOf(component);\n\t\t\tif (idx !== -1) this.children.splice(idx, 1);\n\t\t},\n\t\tclear() {\n\t\t\tthis.children = [];\n\t\t},\n\t};\n\n\tconst pinnedMessageContainer = {\n\t\tchildren: [] as any[],\n\t\taddChild(component: any) {\n\t\t\tthis.children.push(component);\n\t\t},\n\t\tremoveChild(component: any) {\n\t\t\tconst idx = this.children.indexOf(component);\n\t\t\tif (idx !== -1) this.children.splice(idx, 1);\n\t\t},\n\t\tclear() {\n\t\t\tthis.children = [];\n\t\t},\n\t};\n\n\tconst host: any = {\n\t\tisInitialized: true,\n\t\tinit: async () => {},\n\t\tdefaultEditor: { onEscape: undefined },\n\t\teditor: {},\n\t\tsession: { retryAttempt: 0, abortCompaction: () => {}, abortRetry: () => {} },\n\t\tui: { requestRender: () => {}, terminal: { rows: 50 } },\n\t\tfooter: { invalidate: () => {} },\n\t\tkeybindings: {},\n\t\tstatusContainer: { clear: () => {}, addChild: () => {} },\n\t\tchatContainer,\n\t\tsettingsManager: { getTimestampFormat: () => \"date-time-iso\", getShowImages: () => false },\n\t\tpendingTools: new Map(),\n\t\ttoolOutputExpanded: false,\n\t\thideThinkingBlock: false,\n\t\tisBashMode: false,\n\t\tdefaultWorkingMessage: \"Working...\",\n\t\tcompactionQueuedMessages: [],\n\t\teditorContainer: {},\n\t\tpendingMessagesContainer: { clear: () => {} },\n\t\tpinnedMessageContainer,\n\t\taddMessageToChat: () => {},\n\t\tgetMarkdownThemeWithSettings: () => ({}),\n\t\tformatWebSearchResult: () => \"\",\n\t\tgetRegisteredToolDefinition: () => undefined,\n\t\tcheckShutdownRequested: async () => {},\n\t\trebuildChatFromMessages: () => {},\n\t\tflushCompactionQueue: async () => {},\n\t\tshowStatus: () => {},\n\t\tshowError: () => {},\n\t\tupdatePendingMessagesDisplay: () => {},\n\t\tupdateTerminalTitle: () => {},\n\t\tupdateEditorBorderColor: () => {},\n\t};\n\n\treturn host;\n}\n\ntest(\"chat-controller renders content blocks in content[] index order (tool-first stream)\", async () => {\n\t// ToolExecutionComponent uses the global theme singleton.\n\t// Install a minimal no-op theme implementation for this unit test.\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"mcp-tool-1\";\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: toolId,\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.chatContainer.children.length, 0, \"nothing should render before content arrives\");\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"tool output\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0] = toolCall → ToolExecutionComponent renders first\n\tassert.equal(host.chatContainer.children.length, 1, \"tool execution block should render immediately\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([toolCall, { type: \"text\", text: \"done\" }]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"text_delta\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\tdelta: \"done\",\n\t\t\t\tpartial: makeAssistant([toolCall, { type: \"text\", text: \"done\" }]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0]=toolCall, content[1]=text → order: tool, then text\n\tassert.equal(host.chatContainer.children.length, 2, \"text run should render after tool in content[] order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"AssistantMessageComponent\");\n});\n\ntest(\"chat-controller renders serverToolUse before trailing text matching content[] index order\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"mcp-secure-1\";\n\tconst serverToolUse = {\n\t\ttype: \"serverToolUse\",\n\t\tid: toolId,\n\t\tname: \"mcp__gsd-workflow__secure_env_collect\",\n\t\tinput: { projectDir: \"/tmp/project\", keys: [{ key: \"SECURE_PASSWORD\" }], destination: \"dotenv\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([serverToolUse]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"server_tool_use\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tpartial: makeAssistant([serverToolUse]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0] = serverToolUse → ToolExecutionComponent renders first\n\tassert.equal(host.chatContainer.children.length, 1, \"server tool block should render immediately\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tconst resultMessage = makeAssistant([\n\t\t{\n\t\t\t...serverToolUse,\n\t\t\texternalResult: {\n\t\t\t\tcontent: [{ type: \"text\", text: \"secure_env_collect was cancelled by user.\" }],\n\t\t\t\tdetails: {},\n\t\t\t\tisError: true,\n\t\t\t},\n\t\t},\n\t\t{ type: \"text\", text: \"The secure password collection was cancelled.\" },\n\t]);\n\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: resultMessage,\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"server_tool_use\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tpartial: resultMessage,\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// content[0]=serverToolUse, content[1]=text → order: tool, then text\n\tassert.equal(host.chatContainer.children.length, 2, \"text run should render after server tool in content[] order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"AssistantMessageComponent\");\n});\n\ntest(\"chat-controller pins latest assistant text above editor when tool calls are present\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolId = \"tool-pin-1\";\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: toolId,\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should be empty at message_start\");\n\n\t// Send a message with text followed by a tool call\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([\n\t\t\t\t{ type: \"text\", text: \"Looking at the files now.\" },\n\t\t\t\ttoolCall,\n\t\t\t]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"file contents\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Looking at the files now.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\t// Pinned zone should now have a DynamicBorder and a Markdown component\n\tassert.equal(host.pinnedMessageContainer.children.length, 2, \"pinned zone should have border + markdown\");\n\tassert.equal(host.pinnedMessageContainer.children[0]?.constructor?.name, \"DynamicBorder\");\n\tassert.equal(host.pinnedMessageContainer.children[1]?.constructor?.name, \"Markdown\");\n});\n\ntest(\"chat-controller clears pinned zone when a new assistant message starts\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-clear-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Populate the pinned zone\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated\");\n\n\t// Start a new assistant message — pinned zone should clear\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on new assistant message\");\n});\n\ntest(\"chat-controller clears pinned zone when the agent turn ends\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-clear-on-end-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Working on it.\" }, toolCall]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated before agent_end\");\n\n\tawait handleAgentEvent(host, { type: \"agent_end\" } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on agent_end\");\n});\n\ntest(\"chat-controller clears pinned zone when assistant message ends\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\tconst toolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: \"tool-msg-end-1\",\n\t\tname: \"exec_command\",\n\t\targuments: { cmd: \"echo hi\" },\n\t};\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tconst msgContent = [{ type: \"text\", text: \"Summary after tools.\" }, toolCall];\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant(msgContent),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\tcontentIndex: 1,\n\t\t\t\ttoolCall: {\n\t\t\t\t\t...toolCall,\n\t\t\t\t\texternalResult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"ok\" }],\n\t\t\t\t\t\tdetails: {},\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpartial: makeAssistant(msgContent),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.ok(host.pinnedMessageContainer.children.length > 0, \"pinned zone should be populated during streaming\");\n\n\t// End the assistant message (e.g. before form elicitation) — pinned zone should clear\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(msgContent) } as any);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should clear on message_end to prevent duplicate display\");\n});\n\ntest(\"chat-controller does not pin when there are no tool calls\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\thost.getMarkdownThemeWithSettings = () => ({});\n\tawait handleAgentEvent(\n\t\thost,\n\t\t{\n\t\t\ttype: \"message_update\",\n\t\t\tmessage: makeAssistant([{ type: \"text\", text: \"Just some text, no tools.\" }]),\n\t\t\tassistantMessageEvent: {\n\t\t\t\ttype: \"text_delta\",\n\t\t\t\tcontentIndex: 0,\n\t\t\t\tdelta: \"Just some text, no tools.\",\n\t\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"Just some text, no tools.\" }]),\n\t\t\t},\n\t\t} as any,\n\t);\n\n\tassert.equal(host.pinnedMessageContainer.children.length, 0, \"pinned zone should stay empty without tool calls\");\n});\n\n// Regression test for issue #4144: interleaved text/tool content must render in content[] index order.\n// Stream: [text \"A\", toolCall T1, text \"B\", toolCall T2, text \"C\"]\n// Expected chatContainer order: textRun(A), toolExec(T1), textRun(B), toolExec(T2), textRun(C)\n// Each AssistantMessageComponent must render ONLY its own text — no duplication after message_end.\ntest(\"chat-controller renders interleaved text and tool blocks in content[] index order (#4144)\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\tconst t2 = { type: \"toolCall\", id: \"t2\", name: \"tool_two\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Stream text \"A\" at index 0\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 0,\n\t\t\tdelta: \"A\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\t},\n\t} as any);\n\n\t// Stream toolCall T1 at index 1\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 1,\n\t\t\ttoolCall: {\n\t\t\t\t...t1,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result1\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\t},\n\t} as any);\n\n\t// Stream text \"B\" at index 2\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 2,\n\t\t\tdelta: \"B\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\t},\n\t} as any);\n\n\t// Stream toolCall T2 at index 3\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 3,\n\t\t\ttoolCall: {\n\t\t\t\t...t2,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result2\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2]),\n\t\t},\n\t} as any);\n\n\t// Stream text \"C\" at index 4\n\tconst finalContent = [\n\t\t{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }, t2, { type: \"text\", text: \"C\" },\n\t];\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant(finalContent),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 4,\n\t\t\tdelta: \"C\",\n\t\t\tpartial: makeAssistant(finalContent),\n\t\t},\n\t} as any);\n\n\t// Finalize — exercises the message_end path where a buggy setRange(undefined) would cause duplication\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(finalContent) } as any);\n\n\t// Assert interleaved order: textRun(A), toolExec(T1), textRun(B), toolExec(T2), textRun(C)\n\tassert.equal(host.chatContainer.children.length, 5, \"should have 5 children in interleaved order\");\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"AssistantMessageComponent\", \"index 0: text run A\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"ToolExecutionComponent\", \"index 1: tool T1\");\n\tassert.equal(host.chatContainer.children[2]?.constructor?.name, \"AssistantMessageComponent\", \"index 2: text run B\");\n\tassert.equal(host.chatContainer.children[3]?.constructor?.name, \"ToolExecutionComponent\", \"index 3: tool T2\");\n\tassert.equal(host.chatContainer.children[4]?.constructor?.name, \"AssistantMessageComponent\", \"index 4: text run C\");\n\n\t// Helper: collect the text of all Markdown children inside an AssistantMessageComponent.\n\t// Structure: AssistantMessageComponent (Container) -> contentContainer (children[0]) -> Markdown nodes.\n\tfunction getRenderedTexts(comp: any): string[] {\n\t\tconst contentContainer = comp.children?.[0];\n\t\tif (!contentContainer) return [];\n\t\treturn (contentContainer.children ?? [])\n\t\t\t.filter((c: any) => c.constructor?.name === \"Markdown\")\n\t\t\t.map((c: any) => (c as any).text as string);\n\t}\n\n\t// Each text-run component must contain only its own text — no cross-contamination after message_end\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[0]), [\"A\"], \"text run A must contain only 'A'\");\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[2]), [\"B\"], \"text run B must contain only 'B'\");\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[4]), [\"C\"], \"text run C must contain only 'C'\");\n});\n\ntest(\"chat-controller does not duplicate text when content is [text, tool, text] (interleaved stream)\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Step 1: text \"A\" at index 0\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 0,\n\t\t\tdelta: \"A\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\t},\n\t} as any);\n\n\t// Step 2: toolCall at index 1\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\",\n\t\t\tcontentIndex: 1,\n\t\t\ttoolCall: {\n\t\t\t\t...t1,\n\t\t\t\texternalResult: { content: [{ type: \"text\", text: \"result1\" }], details: {}, isError: false },\n\t\t\t},\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\t},\n\t} as any);\n\n\t// Step 3: text \"B\" at index 2\n\tconst finalContent = [{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }];\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant(finalContent),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\",\n\t\t\tcontentIndex: 2,\n\t\t\tdelta: \"B\",\n\t\t\tpartial: makeAssistant(finalContent),\n\t\t},\n\t} as any);\n\n\tassert.equal(host.chatContainer.children.length, 3);\n\tassert.equal(host.chatContainer.children[0]?.constructor?.name, \"AssistantMessageComponent\");\n\tassert.equal(host.chatContainer.children[1]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.equal(host.chatContainer.children[2]?.constructor?.name, \"AssistantMessageComponent\");\n\n\tconst firstText = host.chatContainer.children[0];\n\tconst secondText = host.chatContainer.children[2];\n\tassert.notEqual(firstText, secondText, \"text-before-tool and text-after-tool must be separate component instances\");\n\tassert.deepEqual((firstText as any).range, { startIndex: 0, endIndex: 0 }, \"first text-run covers only content[0]\");\n\tassert.deepEqual((secondText as any).range, { startIndex: 2, endIndex: 2 }, \"second text-run covers only content[2]\");\n\n\t// Finalize — regression guard: range must NOT be cleared on message_end (would cause duplication)\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant(finalContent) } as any);\n\n\tassert.deepEqual((secondText as any).range, { startIndex: 2, endIndex: 2 }, \"range must not be cleared on message_end (would cause duplication)\");\n});\n\n// Regression for the claude-code sub-turn bug that followed #4144:\n// an adapter can reset content[] back to 0/1 mid-lifecycle when a new provider\n// sub-turn begins. The segment walker must NOT update prior-sub-turn text-run\n// components in place (which would destroy earlier history) and must NOT reuse\n// stale tool registrations for a new tool at the same contentIndex. Prior\n// sub-turn children must stay frozen; new sub-turn segments must append after\n// them, and the pinned \"Latest Output\" mirror must re-evaluate for the new sub-turn.\ntest(\"chat-controller freezes prior sub-turn and appends new segments when content shrinks\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\tconst t2 = { type: \"toolCall\", id: \"t2\", name: \"tool_two\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Sub-turn 1: grow to [A, T1, B]\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\", contentIndex: 0, delta: \"A\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }]),\n\t\t},\n\t} as any);\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\", contentIndex: 1,\n\t\t\ttoolCall: { ...t1, externalResult: { content: [{ type: \"text\", text: \"r1\" }], details: {}, isError: false } },\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1]),\n\t\t},\n\t} as any);\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\", contentIndex: 2, delta: \"B\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"A\" }, t1, { type: \"text\", text: \"B\" }]),\n\t\t},\n\t} as any);\n\n\tassert.equal(host.chatContainer.children.length, 3, \"sub-turn 1 renders 3 children\");\n\tconst priorA = host.chatContainer.children[0];\n\tconst priorT1 = host.chatContainer.children[1];\n\tconst priorB = host.chatContainer.children[2];\n\n\t// Sub-turn boundary: adapter resets content[] to [C]\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"C\" }]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"text_delta\", contentIndex: 0, delta: \"C\",\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"C\" }]),\n\t\t},\n\t} as any);\n\n\t// Prior 3 children must still exist in DOM — and a NEW text-run for \"C\" appended after them.\n\tassert.equal(host.chatContainer.children.length, 4, \"shrink must append new segment, not replace prior history\");\n\tassert.equal(host.chatContainer.children[0], priorA, \"prior A component stays at index 0\");\n\tassert.equal(host.chatContainer.children[1], priorT1, \"prior T1 component stays at index 1\");\n\tassert.equal(host.chatContainer.children[2], priorB, \"prior B component stays at index 2\");\n\tassert.notEqual(host.chatContainer.children[3], priorA, \"new C text-run must be a different component from prior A\");\n\tassert.equal(host.chatContainer.children[3]?.constructor?.name, \"AssistantMessageComponent\");\n\n\t// Prior A component must still render \"A\", not be overwritten with \"C\".\n\tfunction getRenderedTexts(comp: any): string[] {\n\t\tconst contentContainer = comp.children?.[0];\n\t\tif (!contentContainer) return [];\n\t\treturn (contentContainer.children ?? [])\n\t\t\t.filter((c: any) => c.constructor?.name === \"Markdown\")\n\t\t\t.map((c: any) => (c as any).text as string);\n\t}\n\tassert.deepEqual(getRenderedTexts(priorA), [\"A\"], \"prior A text-run must still contain 'A' after shrink\");\n\tassert.deepEqual(getRenderedTexts(priorB), [\"B\"], \"prior B text-run must still contain 'B' after shrink\");\n\tassert.deepEqual(getRenderedTexts(host.chatContainer.children[3]), [\"C\"], \"new text-run must contain only 'C'\");\n\n\t// Sub-turn 2 grows with a new tool T2 at contentIndex=1.\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"C\" }, t2]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\", contentIndex: 1,\n\t\t\ttoolCall: { ...t2, externalResult: { content: [{ type: \"text\", text: \"r2\" }], details: {}, isError: false } },\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"C\" }, t2]),\n\t\t},\n\t} as any);\n\n\t// T2 must be appended after the new C text-run, not conflated with the stale T1 registration.\n\tassert.equal(host.chatContainer.children.length, 5, \"new tool appends after new text-run\");\n\tassert.equal(host.chatContainer.children[4]?.constructor?.name, \"ToolExecutionComponent\");\n\tassert.notEqual(host.chatContainer.children[4], priorT1, \"new T2 must be a different component from prior T1\");\n\n\t// Finalize so the module-level pinned spinner (setInterval) is torn down and the test process can exit.\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant([{ type: \"text\", text: \"C\" }, t2]) } as any);\n});\n\n// Regression: after a sub-turn shrink, lastPinnedText must be cleared so the\n// pinned \"Latest Output\" mirror can display text from the new sub-turn instead\n// of staying frozen on a stale snapshot (the \"bottom green stays\" symptom).\ntest(\"chat-controller updates pinned zone after sub-turn shrink\", async () => {\n\t(globalThis as any)[Symbol.for(\"@gsd/pi-coding-agent:theme\")] = {\n\t\tfg: (_key: string, text: string) => text,\n\t\tbg: (_key: string, text: string) => text,\n\t\tbold: (text: string) => text,\n\t\titalic: (text: string) => text,\n\t\ttruncate: (text: string) => text,\n\t};\n\n\tconst host = createHost();\n\thost.getMarkdownThemeWithSettings = () => ({});\n\n\tconst t1 = { type: \"toolCall\", id: \"t1\", name: \"tool_one\", arguments: {} };\n\tconst t2 = { type: \"toolCall\", id: \"t2\", name: \"tool_two\", arguments: {} };\n\n\tawait handleAgentEvent(host, { type: \"message_start\", message: makeAssistant([]) } as any);\n\n\t// Sub-turn 1 with pinnable text before a tool → populates pinned zone with \"first\".\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"first\" }, t1]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\", contentIndex: 1,\n\t\t\ttoolCall: { ...t1, externalResult: { content: [{ type: \"text\", text: \"r1\" }], details: {}, isError: false } },\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"first\" }, t1]),\n\t\t},\n\t} as any);\n\tconst pinnedMarkdown = host.pinnedMessageContainer.children[1];\n\tassert.equal((pinnedMarkdown as any)?.text, \"first\", \"pinned zone seeded with sub-turn 1 text\");\n\n\t// Sub-turn boundary: content resets to [second, t2].\n\tawait handleAgentEvent(host, {\n\t\ttype: \"message_update\",\n\t\tmessage: makeAssistant([{ type: \"text\", text: \"second\" }, t2]),\n\t\tassistantMessageEvent: {\n\t\t\ttype: \"toolcall_end\", contentIndex: 1,\n\t\t\ttoolCall: { ...t2, externalResult: { content: [{ type: \"text\", text: \"r2\" }], details: {}, isError: false } },\n\t\t\tpartial: makeAssistant([{ type: \"text\", text: \"second\" }, t2]),\n\t\t},\n\t} as any);\n\n\t// Pinned markdown must now reflect the new sub-turn's text, not stay frozen on \"first\".\n\tassert.equal((pinnedMarkdown as any)?.text, \"second\", \"pinned zone must update after sub-turn shrink (#4144 regression)\");\n\n\t// Finalize so the module-level pinned spinner (setInterval) is torn down and the test process can exit.\n\tawait handleAgentEvent(host, { type: \"message_end\", message: makeAssistant([{ type: \"text\", text: \"second\" }, t2]) } as any);\n});\n"]}
@@ -179,7 +179,7 @@ export function serializeConversation(messages) {
179
179
  .map((c) => c.text)
180
180
  .join("");
181
181
  if (content)
182
- parts.push(`[User]: ${content}`);
182
+ parts.push(`**User said:** ${content}`);
183
183
  }
184
184
  else if (msg.role === "assistant") {
185
185
  const textParts = [];
@@ -201,13 +201,13 @@ export function serializeConversation(messages) {
201
201
  }
202
202
  }
203
203
  if (thinkingParts.length > 0) {
204
- parts.push(`[Assistant thinking]: ${thinkingParts.join("\n")}`);
204
+ parts.push(`**Assistant thinking:** ${thinkingParts.join("\n")}`);
205
205
  }
206
206
  if (textParts.length > 0) {
207
- parts.push(`[Assistant]: ${textParts.join("\n")}`);
207
+ parts.push(`**Assistant responded:** ${textParts.join("\n")}`);
208
208
  }
209
209
  if (toolCalls.length > 0) {
210
- parts.push(`[Assistant tool calls]: ${toolCalls.join("; ")}`);
210
+ parts.push(`**Assistant tool calls:** ${toolCalls.join("; ")}`);
211
211
  }
212
212
  }
213
213
  else if (msg.role === "toolResult") {
@@ -216,7 +216,7 @@ export function serializeConversation(messages) {
216
216
  .map((c) => c.text)
217
217
  .join("");
218
218
  if (content) {
219
- parts.push(`[Tool result]: ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);
219
+ parts.push(`**Tool result:** ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);
220
220
  }
221
221
  }
222
222
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/compaction/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACN,0BAA0B,EAC1B,8BAA8B,EAC9B,mBAAmB,GACnB,MAAM,gBAAgB,CAAC;AAaxB,MAAM,UAAU,aAAa;IAC5B,OAAO;QACN,IAAI,EAAE,IAAI,GAAG,EAAE;QACf,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,MAAM,EAAE,IAAI,GAAG,EAAE;KACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAqB,EAAE,OAAuB;IACvF,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO;IACzC,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC1D,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAC9D,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;YAAE,SAAS;QAE5D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAgD,CAAC;QACpE,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,MAAM;gBACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,MAAM;YACP,KAAK,OAAO;gBACX,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM;YACP,KAAK,MAAM;gBACV,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzB,MAAM;QACR,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACvD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAmB,EAAE,aAAuB;IAChF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACvC,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,eAAe,GAAG,KAAK;IAC/E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACb,IAAI,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,SAAS,CAAC;YAC7E,OAAO,KAAK,CAAC,OAAO,CAAC;QAEtB,KAAK,gBAAgB;YACpB,OAAO,mBAAmB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAE5G,KAAK,gBAAgB;YACpB,OAAO,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEjF,KAAK,YAAY;YAChB,OAAO,8BAA8B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAE3F,KAAK,uBAAuB,CAAC;QAC7B,KAAK,cAAc,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACX,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC9B,OAAuB,EACvB,UAAkB,EAClB,QAAgB,EAChB,eAAe,GAAG,KAAK;IAEvB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAA+C,EAC/C,SAAS,GAAG,IAAI;IAEhB,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC5D,OAAO;QACN;YACC,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACtD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB;KACD,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,sDAAsD;AAEtD;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACzD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC9C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY,cAAc,6BAA6B,CAAC;AAC1F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAmB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GACZ,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBAC9B,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,GAAG,CAAC,OAAO;qBACV,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;qBACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACtC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAoC,CAAC;oBACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;yBAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;oBACb,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;gBAC7C,CAAC;YACF,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;QACF,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;iBACzB,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;YACX,IAAI,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,2BAA2B,GAAG;;2HAEgF,CAAC","sourcesContent":["/**\n * Shared utilities for compaction and branch summarization.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { Message } from \"@gsd/pi-ai\";\nimport { TOOL_RESULT_MAX_CHARS } from \"../constants.js\";\nimport {\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateCustomMessage,\n} from \"../messages.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\nexport interface FileOperations {\n\tread: Set<string>;\n\twritten: Set<string>;\n\tedited: Set<string>;\n}\n\nexport function createFileOps(): FileOperations {\n\treturn {\n\t\tread: new Set(),\n\t\twritten: new Set(),\n\t\tedited: new Set(),\n\t};\n}\n\n/**\n * Extract file operations from tool calls in an assistant message.\n */\nexport function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOperations): void {\n\tif (message.role !== \"assistant\") return;\n\tif (!(\"content\" in message) || !Array.isArray(message.content)) return;\n\n\tfor (const block of message.content) {\n\t\tif (typeof block !== \"object\" || block === null) continue;\n\t\tif (!(\"type\" in block) || block.type !== \"toolCall\") continue;\n\t\tif (!(\"arguments\" in block) || !(\"name\" in block)) continue;\n\n\t\tconst args = block.arguments as Record<string, unknown> | undefined;\n\t\tif (!args) continue;\n\n\t\tconst path = typeof args.path === \"string\" ? args.path : undefined;\n\t\tif (!path) continue;\n\n\t\tswitch (block.name) {\n\t\t\tcase \"read\":\n\t\t\t\tfileOps.read.add(path);\n\t\t\t\tbreak;\n\t\t\tcase \"write\":\n\t\t\t\tfileOps.written.add(path);\n\t\t\t\tbreak;\n\t\t\tcase \"edit\":\n\t\t\t\tfileOps.edited.add(path);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Compute final file lists from file operations.\n * Returns readFiles (files only read, not modified) and modifiedFiles.\n */\nexport function computeFileLists(fileOps: FileOperations): { readFiles: string[]; modifiedFiles: string[] } {\n\tconst modified = new Set([...fileOps.edited, ...fileOps.written]);\n\tconst readOnly = [...fileOps.read].filter((f) => !modified.has(f)).sort();\n\tconst modifiedFiles = [...modified].sort();\n\treturn { readFiles: readOnly, modifiedFiles };\n}\n\n/**\n * Format file operations as XML tags for summary.\n */\nexport function formatFileOperations(readFiles: string[], modifiedFiles: string[]): string {\n\tconst sections: string[] = [];\n\tif (readFiles.length > 0) {\n\t\tsections.push(`<read-files>\\n${readFiles.join(\"\\n\")}\\n</read-files>`);\n\t}\n\tif (modifiedFiles.length > 0) {\n\t\tsections.push(`<modified-files>\\n${modifiedFiles.join(\"\\n\")}\\n</modified-files>`);\n\t}\n\tif (sections.length === 0) return \"\";\n\treturn `\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n\n// ============================================================================\n// Message Extraction\n// ============================================================================\n\n/**\n * Extract AgentMessage from a session entry.\n *\n * Handles all entry types: message, custom_message, branch_summary, and compaction.\n * Returns undefined for entries that don't contribute to LLM context (e.g., settings changes).\n *\n * @param skipToolResults - If true, skips toolResult messages (used by branch summarization\n * where tool call context is sufficient). Default false.\n */\nexport function getMessageFromEntry(entry: SessionEntry, skipToolResults = false): AgentMessage | undefined {\n\tswitch (entry.type) {\n\t\tcase \"message\":\n\t\t\tif (skipToolResults && entry.message.role === \"toolResult\") return undefined;\n\t\t\treturn entry.message;\n\n\t\tcase \"custom_message\":\n\t\t\treturn createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);\n\n\t\tcase \"branch_summary\":\n\t\t\treturn createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);\n\n\t\tcase \"compaction\":\n\t\t\treturn createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);\n\n\t\tcase \"thinking_level_change\":\n\t\tcase \"model_change\":\n\t\tcase \"custom\":\n\t\tcase \"label\":\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Collect AgentMessages from a range of session entries.\n *\n * @param entries - Session entries array\n * @param startIndex - First index (inclusive)\n * @param endIndex - Last index (exclusive)\n * @param skipToolResults - If true, skips toolResult messages. Default false.\n */\nexport function collectMessages(\n\tentries: SessionEntry[],\n\tstartIndex: number,\n\tendIndex: number,\n\tskipToolResults = false,\n): AgentMessage[] {\n\tconst result: AgentMessage[] = [];\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst msg = getMessageFromEntry(entries[i], skipToolResults);\n\t\tif (msg) result.push(msg);\n\t}\n\treturn result;\n}\n\n// ============================================================================\n// Text Content Extraction\n// ============================================================================\n\n/**\n * Extract text from an array of content blocks, filtering to text-type blocks.\n * Replaces the recurring `.filter(c => c.type === \"text\").map(c => c.text).join(sep)` pattern.\n */\nexport function extractTextContent(\n\tcontent: Array<{ type: string; text?: string }>,\n\tseparator = \"\\n\",\n): string {\n\treturn content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(separator);\n}\n\n// ============================================================================\n// Summarization Message Construction\n// ============================================================================\n\n/**\n * Create a single-message array for summarization prompts.\n * Wraps promptText in the standard `[{ role: \"user\", content: [{ type: \"text\", text }], timestamp }]` shape.\n */\nexport function createSummarizationMessage(promptText: string): [{ role: \"user\"; content: [{ type: \"text\"; text: string }]; timestamp: number }] {\n\treturn [\n\t\t{\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: [{ type: \"text\" as const, text: promptText }],\n\t\t\ttimestamp: Date.now(),\n\t\t},\n\t];\n}\n\n// ============================================================================\n// Message Serialization\n// ============================================================================\n\n// TOOL_RESULT_MAX_CHARS imported from ../constants.js\n\n/**\n * Truncate text to a maximum character length for summarization.\n * Keeps the beginning and appends a truncation marker.\n */\nfunction truncateForSummary(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\tconst truncatedChars = text.length - maxChars;\n\treturn `${text.slice(0, maxChars)}\\n\\n[... ${truncatedChars} more characters truncated]`;\n}\n\n/**\n * Serialize LLM messages to text for summarization.\n * This prevents the model from treating it as a conversation to continue.\n * Call convertToLlm() first to handle custom message types.\n *\n * Tool results are truncated to keep the summarization request within\n * reasonable token budgets. Full content is not needed for summarization.\n */\nexport function serializeConversation(messages: Message[]): string {\n\tconst parts: string[] = [];\n\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"user\") {\n\t\t\tconst content =\n\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t? msg.content\n\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t\tif (content) parts.push(`[User]: ${content}`);\n\t\t} else if (msg.role === \"assistant\") {\n\t\t\tconst textParts: string[] = [];\n\t\t\tconst thinkingParts: string[] = [];\n\t\t\tconst toolCalls: string[] = [];\n\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\ttextParts.push(block.text);\n\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\tthinkingParts.push(block.thinking);\n\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\tconst args = block.arguments as Record<string, unknown>;\n\t\t\t\t\tconst argsStr = Object.entries(args)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\ttoolCalls.push(`${block.name}(${argsStr})`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (thinkingParts.length > 0) {\n\t\t\t\tparts.push(`[Assistant thinking]: ${thinkingParts.join(\"\\n\")}`);\n\t\t\t}\n\t\t\tif (textParts.length > 0) {\n\t\t\t\tparts.push(`[Assistant]: ${textParts.join(\"\\n\")}`);\n\t\t\t}\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\tparts.push(`[Assistant tool calls]: ${toolCalls.join(\"; \")}`);\n\t\t\t}\n\t\t} else if (msg.role === \"toolResult\") {\n\t\t\tconst content = msg.content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t\tif (content) {\n\t\t\t\tparts.push(`[Tool result]: ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn parts.join(\"\\n\\n\");\n}\n\n// ============================================================================\n// Summarization System Prompt\n// ============================================================================\n\nexport const SUMMARIZATION_SYSTEM_PROMPT = `You are a context summarization assistant. Your task is to read a conversation between a user and an AI coding assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.`;\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/core/compaction/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared utilities for compaction and branch summarization.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { Message } from \"@gsd/pi-ai\";\nimport { TOOL_RESULT_MAX_CHARS } from \"../constants.js\";\nimport {\n\tcreateBranchSummaryMessage,\n\tcreateCompactionSummaryMessage,\n\tcreateCustomMessage,\n} from \"../messages.js\";\nimport type { SessionEntry } from \"../session-manager.js\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\nexport interface FileOperations {\n\tread: Set<string>;\n\twritten: Set<string>;\n\tedited: Set<string>;\n}\n\nexport function createFileOps(): FileOperations {\n\treturn {\n\t\tread: new Set(),\n\t\twritten: new Set(),\n\t\tedited: new Set(),\n\t};\n}\n\n/**\n * Extract file operations from tool calls in an assistant message.\n */\nexport function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOperations): void {\n\tif (message.role !== \"assistant\") return;\n\tif (!(\"content\" in message) || !Array.isArray(message.content)) return;\n\n\tfor (const block of message.content) {\n\t\tif (typeof block !== \"object\" || block === null) continue;\n\t\tif (!(\"type\" in block) || block.type !== \"toolCall\") continue;\n\t\tif (!(\"arguments\" in block) || !(\"name\" in block)) continue;\n\n\t\tconst args = block.arguments as Record<string, unknown> | undefined;\n\t\tif (!args) continue;\n\n\t\tconst path = typeof args.path === \"string\" ? args.path : undefined;\n\t\tif (!path) continue;\n\n\t\tswitch (block.name) {\n\t\t\tcase \"read\":\n\t\t\t\tfileOps.read.add(path);\n\t\t\t\tbreak;\n\t\t\tcase \"write\":\n\t\t\t\tfileOps.written.add(path);\n\t\t\t\tbreak;\n\t\t\tcase \"edit\":\n\t\t\t\tfileOps.edited.add(path);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Compute final file lists from file operations.\n * Returns readFiles (files only read, not modified) and modifiedFiles.\n */\nexport function computeFileLists(fileOps: FileOperations): { readFiles: string[]; modifiedFiles: string[] } {\n\tconst modified = new Set([...fileOps.edited, ...fileOps.written]);\n\tconst readOnly = [...fileOps.read].filter((f) => !modified.has(f)).sort();\n\tconst modifiedFiles = [...modified].sort();\n\treturn { readFiles: readOnly, modifiedFiles };\n}\n\n/**\n * Format file operations as XML tags for summary.\n */\nexport function formatFileOperations(readFiles: string[], modifiedFiles: string[]): string {\n\tconst sections: string[] = [];\n\tif (readFiles.length > 0) {\n\t\tsections.push(`<read-files>\\n${readFiles.join(\"\\n\")}\\n</read-files>`);\n\t}\n\tif (modifiedFiles.length > 0) {\n\t\tsections.push(`<modified-files>\\n${modifiedFiles.join(\"\\n\")}\\n</modified-files>`);\n\t}\n\tif (sections.length === 0) return \"\";\n\treturn `\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n\n// ============================================================================\n// Message Extraction\n// ============================================================================\n\n/**\n * Extract AgentMessage from a session entry.\n *\n * Handles all entry types: message, custom_message, branch_summary, and compaction.\n * Returns undefined for entries that don't contribute to LLM context (e.g., settings changes).\n *\n * @param skipToolResults - If true, skips toolResult messages (used by branch summarization\n * where tool call context is sufficient). Default false.\n */\nexport function getMessageFromEntry(entry: SessionEntry, skipToolResults = false): AgentMessage | undefined {\n\tswitch (entry.type) {\n\t\tcase \"message\":\n\t\t\tif (skipToolResults && entry.message.role === \"toolResult\") return undefined;\n\t\t\treturn entry.message;\n\n\t\tcase \"custom_message\":\n\t\t\treturn createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);\n\n\t\tcase \"branch_summary\":\n\t\t\treturn createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);\n\n\t\tcase \"compaction\":\n\t\t\treturn createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);\n\n\t\tcase \"thinking_level_change\":\n\t\tcase \"model_change\":\n\t\tcase \"custom\":\n\t\tcase \"label\":\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Collect AgentMessages from a range of session entries.\n *\n * @param entries - Session entries array\n * @param startIndex - First index (inclusive)\n * @param endIndex - Last index (exclusive)\n * @param skipToolResults - If true, skips toolResult messages. Default false.\n */\nexport function collectMessages(\n\tentries: SessionEntry[],\n\tstartIndex: number,\n\tendIndex: number,\n\tskipToolResults = false,\n): AgentMessage[] {\n\tconst result: AgentMessage[] = [];\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst msg = getMessageFromEntry(entries[i], skipToolResults);\n\t\tif (msg) result.push(msg);\n\t}\n\treturn result;\n}\n\n// ============================================================================\n// Text Content Extraction\n// ============================================================================\n\n/**\n * Extract text from an array of content blocks, filtering to text-type blocks.\n * Replaces the recurring `.filter(c => c.type === \"text\").map(c => c.text).join(sep)` pattern.\n */\nexport function extractTextContent(\n\tcontent: Array<{ type: string; text?: string }>,\n\tseparator = \"\\n\",\n): string {\n\treturn content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(separator);\n}\n\n// ============================================================================\n// Summarization Message Construction\n// ============================================================================\n\n/**\n * Create a single-message array for summarization prompts.\n * Wraps promptText in the standard `[{ role: \"user\", content: [{ type: \"text\", text }], timestamp }]` shape.\n */\nexport function createSummarizationMessage(promptText: string): [{ role: \"user\"; content: [{ type: \"text\"; text: string }]; timestamp: number }] {\n\treturn [\n\t\t{\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: [{ type: \"text\" as const, text: promptText }],\n\t\t\ttimestamp: Date.now(),\n\t\t},\n\t];\n}\n\n// ============================================================================\n// Message Serialization\n// ============================================================================\n\n// TOOL_RESULT_MAX_CHARS imported from ../constants.js\n\n/**\n * Truncate text to a maximum character length for summarization.\n * Keeps the beginning and appends a truncation marker.\n */\nfunction truncateForSummary(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\tconst truncatedChars = text.length - maxChars;\n\treturn `${text.slice(0, maxChars)}\\n\\n[... ${truncatedChars} more characters truncated]`;\n}\n\n/**\n * Serialize LLM messages to text for summarization.\n * This prevents the model from treating it as a conversation to continue.\n * Call convertToLlm() first to handle custom message types.\n *\n * Tool results are truncated to keep the summarization request within\n * reasonable token budgets. Full content is not needed for summarization.\n */\nexport function serializeConversation(messages: Message[]): string {\n\tconst parts: string[] = [];\n\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"user\") {\n\t\t\tconst content =\n\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t? msg.content\n\t\t\t\t\t: msg.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t\tif (content) parts.push(`**User said:** ${content}`);\n\t\t} else if (msg.role === \"assistant\") {\n\t\t\tconst textParts: string[] = [];\n\t\t\tconst thinkingParts: string[] = [];\n\t\t\tconst toolCalls: string[] = [];\n\n\t\t\tfor (const block of msg.content) {\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\ttextParts.push(block.text);\n\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\tthinkingParts.push(block.thinking);\n\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\tconst args = block.arguments as Record<string, unknown>;\n\t\t\t\t\tconst argsStr = Object.entries(args)\n\t\t\t\t\t\t.map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\ttoolCalls.push(`${block.name}(${argsStr})`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (thinkingParts.length > 0) {\n\t\t\t\tparts.push(`**Assistant thinking:** ${thinkingParts.join(\"\\n\")}`);\n\t\t\t}\n\t\t\tif (textParts.length > 0) {\n\t\t\t\tparts.push(`**Assistant responded:** ${textParts.join(\"\\n\")}`);\n\t\t\t}\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\tparts.push(`**Assistant tool calls:** ${toolCalls.join(\"; \")}`);\n\t\t\t}\n\t\t} else if (msg.role === \"toolResult\") {\n\t\t\tconst content = msg.content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t\tif (content) {\n\t\t\t\tparts.push(`**Tool result:** ${truncateForSummary(content, TOOL_RESULT_MAX_CHARS)}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn parts.join(\"\\n\\n\");\n}\n\n// ============================================================================\n// Summarization System Prompt\n// ============================================================================\n\nexport const SUMMARIZATION_SYSTEM_PROMPT = `You are a context summarization assistant. Your task is to read a conversation between a user and an AI coding assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.`;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compaction-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-utils.test.d.ts","sourceRoot":"","sources":["../../src/core/compaction-utils.test.ts"],"names":[],"mappings":""}