@dungle-scrubs/tallow 0.9.4 → 0.9.7

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 (212) hide show
  1. package/dist/cli.js +8 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/interactive-mode-patch.d.ts +24 -12
  6. package/dist/interactive-mode-patch.d.ts.map +1 -1
  7. package/dist/interactive-mode-patch.js +229 -146
  8. package/dist/interactive-mode-patch.js.map +1 -1
  9. package/dist/interactive-reset.d.ts +49 -0
  10. package/dist/interactive-reset.d.ts.map +1 -0
  11. package/dist/interactive-reset.js +40 -0
  12. package/dist/interactive-reset.js.map +1 -0
  13. package/dist/pi-tui-editor-patch.d.ts +10 -0
  14. package/dist/pi-tui-editor-patch.d.ts.map +1 -0
  15. package/dist/pi-tui-editor-patch.js +159 -0
  16. package/dist/pi-tui-editor-patch.js.map +1 -0
  17. package/dist/pi-tui-patch.d.ts +2 -0
  18. package/dist/pi-tui-patch.d.ts.map +1 -0
  19. package/dist/pi-tui-patch.js +563 -0
  20. package/dist/pi-tui-patch.js.map +1 -0
  21. package/dist/pi-tui-settings-list-patch.d.ts +11 -0
  22. package/dist/pi-tui-settings-list-patch.d.ts.map +1 -0
  23. package/dist/pi-tui-settings-list-patch.js +38 -0
  24. package/dist/pi-tui-settings-list-patch.js.map +1 -0
  25. package/dist/process-cleanup.js +1 -1
  26. package/dist/process-cleanup.js.map +1 -1
  27. package/dist/reset-diagnostics.d.ts +69 -0
  28. package/dist/reset-diagnostics.d.ts.map +1 -0
  29. package/dist/reset-diagnostics.js +41 -0
  30. package/dist/reset-diagnostics.js.map +1 -0
  31. package/dist/sdk.d.ts +7 -23
  32. package/dist/sdk.d.ts.map +1 -1
  33. package/dist/sdk.js +211 -174
  34. package/dist/sdk.js.map +1 -1
  35. package/dist/workspace-transition-interactive.d.ts +1 -0
  36. package/dist/workspace-transition-interactive.d.ts.map +1 -1
  37. package/dist/workspace-transition-interactive.js +8 -18
  38. package/dist/workspace-transition-interactive.js.map +1 -1
  39. package/extensions/__integration__/audit-findings.test.ts +4 -5
  40. package/extensions/_icons/index.ts +2 -4
  41. package/extensions/_shared/__tests__/image-metadata.test.ts +33 -0
  42. package/extensions/_shared/__tests__/shell-policy.test.ts +19 -0
  43. package/extensions/_shared/__tests__/terminal-links.test.ts +18 -0
  44. package/extensions/_shared/image-metadata.ts +99 -0
  45. package/extensions/_shared/inline-preview.ts +1 -1
  46. package/extensions/_shared/shell-policy.ts +121 -1
  47. package/extensions/_shared/terminal-links.ts +22 -0
  48. package/extensions/ask-user-question-tool/index.ts +0 -3
  49. package/extensions/clear/__tests__/clear.test.ts +269 -2
  50. package/extensions/command-expansion/index.ts +9 -3
  51. package/extensions/context-files/index.ts +5 -1
  52. package/extensions/context-fork/__tests__/context-fork.test.ts +94 -1
  53. package/extensions/context-fork/extension.json +1 -1
  54. package/extensions/context-fork/frontmatter-index.ts +6 -1
  55. package/extensions/context-fork/index.ts +32 -0
  56. package/extensions/edit-tool-enhanced/index.ts +2 -1
  57. package/extensions/git-status/__tests__/git-status.test.ts +65 -2
  58. package/extensions/git-status/index.ts +268 -98
  59. package/extensions/hooks/index.ts +33 -11
  60. package/extensions/loop/index.ts +14 -1
  61. package/extensions/lsp/index.ts +64 -13
  62. package/extensions/lsp/package.json +2 -2
  63. package/extensions/minimal-skill-display/index.ts +7 -1
  64. package/extensions/random-spinner/index.ts +7 -642
  65. package/extensions/read-tool-enhanced/index.ts +13 -10
  66. package/extensions/render-stabilizer/__tests__/render-stabilizer.test.ts +2 -3
  67. package/extensions/render-stabilizer/index.ts +6 -6
  68. package/extensions/rewind/__tests__/session-files.test.ts +115 -0
  69. package/extensions/rewind/__tests__/snapshots.test.ts +23 -0
  70. package/extensions/rewind/index.ts +5 -0
  71. package/extensions/rewind/session-files.ts +138 -0
  72. package/extensions/rewind/snapshots.ts +104 -5
  73. package/extensions/skill-commands/index.ts +6 -1
  74. package/extensions/slash-command-bridge/__tests__/slash-command-bridge.test.ts +26 -0
  75. package/extensions/slash-command-bridge/index.ts +14 -2
  76. package/extensions/subagent-tool/model-resolver.ts +274 -7
  77. package/extensions/subagent-tool/schema.ts +1 -2
  78. package/extensions/tasks/commands/register-tasks-extension.ts +9 -9
  79. package/extensions/teams-tool/tools/register-extension.ts +1 -3
  80. package/extensions/teams-tool/tools/teammate-tools.ts +1 -2
  81. package/extensions/web-search-tool/index.ts +2 -1
  82. package/extensions/wezterm-pane-control/index.ts +1 -2
  83. package/extensions/write-tool-enhanced/index.ts +2 -1
  84. package/node_modules/@mariozechner/pi-tui/README.md +56 -34
  85. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts +18 -13
  86. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts.map +1 -1
  87. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js +182 -113
  88. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js.map +1 -1
  89. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js +3 -3
  90. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  91. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts +45 -36
  92. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts.map +1 -1
  93. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js +489 -325
  94. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js.map +1 -1
  95. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts +1 -99
  96. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts.map +1 -1
  97. package/node_modules/@mariozechner/pi-tui/dist/components/image.js +17 -192
  98. package/node_modules/@mariozechner/pi-tui/dist/components/image.js.map +1 -1
  99. package/node_modules/@mariozechner/pi-tui/dist/components/input.d.ts.map +1 -1
  100. package/node_modules/@mariozechner/pi-tui/dist/components/input.js +57 -60
  101. package/node_modules/@mariozechner/pi-tui/dist/components/input.js.map +1 -1
  102. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts +2 -69
  103. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts.map +1 -1
  104. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js +5 -102
  105. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js.map +1 -1
  106. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.d.ts.map +1 -1
  107. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js +111 -53
  108. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js.map +1 -1
  109. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts +19 -1
  110. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts.map +1 -1
  111. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js +78 -67
  112. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js.map +1 -1
  113. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts +1 -25
  114. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  115. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js +13 -50
  116. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js.map +1 -1
  117. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts +8 -10
  118. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts.map +1 -1
  119. package/node_modules/@mariozechner/pi-tui/dist/index.js +6 -9
  120. package/node_modules/@mariozechner/pi-tui/dist/index.js.map +1 -1
  121. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts +108 -238
  122. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts.map +1 -1
  123. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js +108 -365
  124. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js.map +1 -1
  125. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts +33 -48
  126. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts.map +1 -1
  127. package/node_modules/@mariozechner/pi-tui/dist/keys.js +239 -155
  128. package/node_modules/@mariozechner/pi-tui/dist/keys.js.map +1 -1
  129. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts +14 -94
  130. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts.map +1 -1
  131. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js +44 -186
  132. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js.map +1 -1
  133. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts +13 -58
  134. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts.map +1 -1
  135. package/node_modules/@mariozechner/pi-tui/dist/terminal.js +78 -111
  136. package/node_modules/@mariozechner/pi-tui/dist/terminal.js.map +1 -1
  137. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts +24 -110
  138. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts.map +1 -1
  139. package/node_modules/@mariozechner/pi-tui/dist/tui.js +188 -435
  140. package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -1
  141. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts +0 -18
  142. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts.map +1 -1
  143. package/node_modules/@mariozechner/pi-tui/dist/utils.js +251 -119
  144. package/node_modules/@mariozechner/pi-tui/dist/utils.js.map +1 -1
  145. package/node_modules/@mariozechner/pi-tui/package.json +6 -6
  146. package/node_modules/@mariozechner/pi-tui/src/__tests__/__snapshots__/render.test.ts.snap +3 -40
  147. package/node_modules/@mariozechner/pi-tui/src/__tests__/image-component.test.ts +71 -81
  148. package/node_modules/@mariozechner/pi-tui/src/__tests__/render.test.ts +0 -33
  149. package/node_modules/@mariozechner/pi-tui/src/__tests__/terminal-image.test.ts +93 -334
  150. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-render-scheduling.test.ts +1 -1
  151. package/node_modules/@mariozechner/pi-tui/src/__tests__/utils.test.ts +11 -196
  152. package/node_modules/@mariozechner/pi-tui/src/autocomplete.ts +228 -142
  153. package/node_modules/@mariozechner/pi-tui/src/components/cancellable-loader.ts +3 -3
  154. package/node_modules/@mariozechner/pi-tui/src/components/editor.ts +624 -390
  155. package/node_modules/@mariozechner/pi-tui/src/components/image.ts +17 -227
  156. package/node_modules/@mariozechner/pi-tui/src/components/input.ts +71 -63
  157. package/node_modules/@mariozechner/pi-tui/src/components/loader.ts +5 -137
  158. package/node_modules/@mariozechner/pi-tui/src/components/markdown.ts +143 -52
  159. package/node_modules/@mariozechner/pi-tui/src/components/select-list.ts +136 -70
  160. package/node_modules/@mariozechner/pi-tui/src/components/settings-list.ts +12 -51
  161. package/node_modules/@mariozechner/pi-tui/src/index.ts +17 -36
  162. package/node_modules/@mariozechner/pi-tui/src/keybindings.ts +148 -421
  163. package/node_modules/@mariozechner/pi-tui/src/keys.ts +253 -181
  164. package/node_modules/@mariozechner/pi-tui/src/terminal-image.ts +51 -252
  165. package/node_modules/@mariozechner/pi-tui/src/terminal.ts +78 -133
  166. package/node_modules/@mariozechner/pi-tui/src/tui.ts +202 -478
  167. package/node_modules/@mariozechner/pi-tui/src/utils.ts +289 -125
  168. package/node_modules/@mariozechner/pi-tui/tsconfig.build.json +1 -0
  169. package/package.json +13 -13
  170. package/packages/tallow-tui/node_modules/@types/mime-types/README.md +8 -2
  171. package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +6 -0
  172. package/packages/tallow-tui/node_modules/@types/mime-types/package.json +9 -3
  173. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup-data.js +18 -0
  174. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +116 -384
  175. package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +5 -4
  176. package/packages/tallow-tui/node_modules/get-east-asian-width/utilities.js +24 -0
  177. package/packages/tallow-tui/node_modules/marked/README.md +5 -4
  178. package/packages/tallow-tui/node_modules/marked/bin/main.js +10 -8
  179. package/packages/tallow-tui/node_modules/marked/bin/marked.js +2 -1
  180. package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +156 -125
  181. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +67 -2179
  182. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +3 -3
  183. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +67 -2201
  184. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +3 -3
  185. package/packages/tallow-tui/node_modules/marked/man/marked.1 +4 -2
  186. package/packages/tallow-tui/node_modules/marked/man/marked.1.md +2 -1
  187. package/packages/tallow-tui/node_modules/marked/package.json +26 -34
  188. package/skills/tallow-expert/SKILL.md +3 -5
  189. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts +0 -32
  190. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts.map +0 -1
  191. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js +0 -46
  192. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js.map +0 -1
  193. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts +0 -52
  194. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts.map +0 -1
  195. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js +0 -89
  196. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js.map +0 -1
  197. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts +0 -14
  198. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts.map +0 -1
  199. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js +0 -55
  200. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js.map +0 -1
  201. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-change-listener.test.ts +0 -121
  202. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-ghost-text.test.ts +0 -112
  203. package/node_modules/@mariozechner/pi-tui/src/__tests__/mouse-events.test.ts +0 -134
  204. package/node_modules/@mariozechner/pi-tui/src/__tests__/settings-list.test.ts +0 -81
  205. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-diff-regression.test.ts +0 -555
  206. package/node_modules/@mariozechner/pi-tui/src/border-styles.ts +0 -60
  207. package/node_modules/@mariozechner/pi-tui/src/components/bordered-box.ts +0 -113
  208. package/node_modules/@mariozechner/pi-tui/src/test-utils/capability-env.ts +0 -56
  209. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +0 -2211
  210. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +0 -7
  211. package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +0 -728
  212. package/packages/tallow-tui/node_modules/marked/marked.min.js +0 -69
@@ -0,0 +1,563 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { truncateToWidth as piTruncateToWidth, visibleWidth as piVisibleWidth, } from "@mariozechner/pi-tui";
5
+ import { patchEditorPrototype } from "./pi-tui-editor-patch.js";
6
+ import { patchSettingsListPrototype } from "./pi-tui-settings-list-patch.js";
7
+ const APPLY_FLAG = "__tallow_pi_tui_patch_applied__";
8
+ const STARTUP_GRACE_MS = 3000;
9
+ const KITTY_PREFIX = "\x1b_G";
10
+ const ITERM2_PREFIX = "\x1b]1337;File=";
11
+ function isImageLineLocal(line) {
12
+ return (line.startsWith(KITTY_PREFIX) ||
13
+ line.startsWith(ITERM2_PREFIX) ||
14
+ line.includes(KITTY_PREFIX) ||
15
+ line.includes(ITERM2_PREFIX));
16
+ }
17
+ const tuiStartedAtMs = new WeakMap();
18
+ const tuiPendingScrollbackClear = new WeakMap();
19
+ const tuiRenderBatchDepth = new WeakMap();
20
+ const tuiRenderDeferredDuringBatch = new WeakMap();
21
+ const tuiRenderForceDeferredDuringBatch = new WeakMap();
22
+ const tuiRollingShrinkPeak = new WeakMap();
23
+ function getTuiRenderBatchDepth(tui) {
24
+ return tuiRenderBatchDepth.get(tui) ?? 0;
25
+ }
26
+ function getTuiPendingScrollbackClear(tui) {
27
+ return tuiPendingScrollbackClear.get(tui) ?? false;
28
+ }
29
+ function setTuiPendingScrollbackClear(tui, value) {
30
+ tuiPendingScrollbackClear.set(tui, value);
31
+ }
32
+ function getTuiRollingShrinkPeak(tui) {
33
+ return tuiRollingShrinkPeak.get(tui) ?? 0;
34
+ }
35
+ function setTuiRollingShrinkPeak(tui, value) {
36
+ tuiRollingShrinkPeak.set(tui, value);
37
+ }
38
+ /**
39
+ * Build the current render snapshot from the patched TUI.
40
+ *
41
+ * @param tui - Patched TUI instance
42
+ * @returns Snapshot used by render helpers
43
+ */
44
+ function createRenderSnapshot(tui) {
45
+ const width = tui.terminal.columns;
46
+ const height = tui.terminal.rows;
47
+ let newLines = tui.render(width);
48
+ if (tui.overlayStack.length > 0) {
49
+ newLines = tui.compositeOverlays(newLines, width, height);
50
+ }
51
+ const cursorPos = tui.extractCursorPosition(newLines, height);
52
+ newLines = tui.applyLineResets(newLines);
53
+ const startedAt = tuiStartedAtMs.get(tui) ?? 0;
54
+ return {
55
+ cursorPos,
56
+ height,
57
+ inStartupGrace: startedAt > 0 && Date.now() - startedAt < STARTUP_GRACE_MS,
58
+ newLines,
59
+ width,
60
+ widthChanged: tui.previousWidth !== 0 && tui.previousWidth !== width,
61
+ };
62
+ }
63
+ /**
64
+ * Create a redraw logger when debug logging is enabled.
65
+ *
66
+ * @param tui - Patched TUI instance
67
+ * @param snapshot - Current render snapshot
68
+ * @returns Logger callback
69
+ */
70
+ function createRedrawLogger(tui, snapshot) {
71
+ const debugRedraw = process.env.PI_DEBUG_REDRAW === "1";
72
+ return (reason) => {
73
+ if (!debugRedraw)
74
+ return;
75
+ const logPath = path.join(os.homedir(), ".pi", "agent", "pi-debug.log");
76
+ const msg = `[${new Date().toISOString()}] fullRender: ${reason} (prev=${tui.previousLines.length}, new=${snapshot.newLines.length}, height=${snapshot.height})\n`;
77
+ fs.appendFileSync(logPath, msg);
78
+ };
79
+ }
80
+ /**
81
+ * Persist render bookkeeping shared by all render strategies.
82
+ *
83
+ * @param tui - Patched TUI instance
84
+ * @param snapshot - Current render snapshot
85
+ * @param viewportTopForRender - Top line rendered into the viewport
86
+ * @param preserveMaxLines - Whether maxLinesRendered should grow instead of reset
87
+ * @returns Nothing
88
+ */
89
+ function finalizeRenderedState(tui, snapshot, viewportTopForRender, preserveMaxLines) {
90
+ tui.cursorRow = Math.max(0, snapshot.newLines.length - 1);
91
+ tui.hardwareCursorRow = tui.cursorRow;
92
+ tui.maxLinesRendered = preserveMaxLines
93
+ ? Math.max(tui.maxLinesRendered, snapshot.newLines.length)
94
+ : snapshot.newLines.length;
95
+ tui.previousViewportTop = viewportTopForRender;
96
+ setTuiRollingShrinkPeak(tui, snapshot.newLines.length);
97
+ tui.positionHardwareCursor(snapshot.cursorPos, snapshot.newLines.length);
98
+ tui.previousLines = snapshot.newLines;
99
+ tui.previousWidth = snapshot.width;
100
+ }
101
+ /**
102
+ * Write a full redraw of the visible tail.
103
+ *
104
+ * @param tui - Patched TUI instance
105
+ * @param snapshot - Current render snapshot
106
+ * @param clear - Whether to clear the screen before rendering
107
+ * @returns Nothing
108
+ */
109
+ function writeFullRender(tui, snapshot, clear) {
110
+ tui.fullRedrawCount += 1;
111
+ const viewportTopForRender = Math.max(0, snapshot.newLines.length - snapshot.height);
112
+ const visibleLines = snapshot.newLines.slice(viewportTopForRender);
113
+ let buffer = "\x1b[?2026h";
114
+ if (clear && getTuiPendingScrollbackClear(tui)) {
115
+ buffer += "\x1b[3J\x1b[2J\x1b[H";
116
+ setTuiPendingScrollbackClear(tui, false);
117
+ }
118
+ else if (clear) {
119
+ buffer += "\x1b[2J\x1b[H";
120
+ }
121
+ for (let index = 0; index < visibleLines.length; index += 1) {
122
+ if (index > 0)
123
+ buffer += "\r\n";
124
+ buffer += visibleLines[index];
125
+ }
126
+ buffer += "\x1b[?2026l";
127
+ tui.terminal.write(buffer);
128
+ finalizeRenderedState(tui, snapshot, viewportTopForRender, !clear);
129
+ }
130
+ /**
131
+ * Write a startup-safe redraw that clears only stale visible rows.
132
+ *
133
+ * @param tui - Patched TUI instance
134
+ * @param snapshot - Current render snapshot
135
+ * @returns Nothing
136
+ */
137
+ function writeGentleFullRender(tui, snapshot) {
138
+ tui.fullRedrawCount += 1;
139
+ const viewportTopForRender = Math.max(0, snapshot.newLines.length - snapshot.height);
140
+ const visibleLines = snapshot.newLines.slice(viewportTopForRender);
141
+ let buffer = "\x1b[?2026h\x1b[H";
142
+ for (let index = 0; index < visibleLines.length; index += 1) {
143
+ buffer += "\x1b[2K";
144
+ buffer += visibleLines[index];
145
+ if (index < visibleLines.length - 1)
146
+ buffer += "\r\n";
147
+ }
148
+ const staleLines = Math.max(0, Math.min(tui.maxLinesRendered, snapshot.height) - visibleLines.length);
149
+ for (let index = 0; index < staleLines; index += 1) {
150
+ buffer += "\r\n\x1b[2K";
151
+ }
152
+ buffer += "\x1b[?2026l";
153
+ tui.terminal.write(buffer);
154
+ finalizeRenderedState(tui, snapshot, viewportTopForRender, false);
155
+ }
156
+ /**
157
+ * Apply render rules that require a full redraw and report whether rendering is done.
158
+ *
159
+ * @param tui - Patched TUI instance
160
+ * @param snapshot - Current render snapshot
161
+ * @param logRedraw - Debug logger
162
+ * @returns True when rendering was handled
163
+ */
164
+ function handleEarlyFullRender(tui, snapshot, logRedraw) {
165
+ if (tui.previousLines.length === 0 && !snapshot.widthChanged) {
166
+ logRedraw("first render");
167
+ writeFullRender(tui, snapshot, false);
168
+ return true;
169
+ }
170
+ if (snapshot.widthChanged) {
171
+ logRedraw(`width changed (${tui.previousWidth} -> ${snapshot.width})`);
172
+ writeFullRender(tui, snapshot, true);
173
+ return true;
174
+ }
175
+ if (tui.clearOnShrink &&
176
+ snapshot.newLines.length < tui.maxLinesRendered &&
177
+ tui.overlayStack.length === 0) {
178
+ logRedraw(`clearOnShrink (maxLinesRendered=${tui.maxLinesRendered})`);
179
+ if (snapshot.inStartupGrace) {
180
+ writeGentleFullRender(tui, snapshot);
181
+ }
182
+ else {
183
+ writeFullRender(tui, snapshot, true);
184
+ }
185
+ return true;
186
+ }
187
+ const shrinkDelta = tui.previousLines.length - snapshot.newLines.length;
188
+ if (shrinkDelta > 5 && tui.overlayStack.length === 0) {
189
+ logRedraw(`large shrink (${shrinkDelta} lines)`);
190
+ if (snapshot.inStartupGrace) {
191
+ writeGentleFullRender(tui, snapshot);
192
+ }
193
+ else {
194
+ writeFullRender(tui, snapshot, true);
195
+ }
196
+ return true;
197
+ }
198
+ const rollingPeak = getTuiRollingShrinkPeak(tui);
199
+ if (snapshot.newLines.length >= rollingPeak) {
200
+ setTuiRollingShrinkPeak(tui, snapshot.newLines.length);
201
+ return false;
202
+ }
203
+ if (tui.overlayStack.length > 0 || rollingPeak - snapshot.newLines.length <= 5) {
204
+ return false;
205
+ }
206
+ logRedraw(`rolling shrink (peak=${rollingPeak}, now=${snapshot.newLines.length}, delta=${rollingPeak - snapshot.newLines.length})`);
207
+ if (snapshot.inStartupGrace) {
208
+ writeGentleFullRender(tui, snapshot);
209
+ }
210
+ else {
211
+ writeFullRender(tui, snapshot, true);
212
+ }
213
+ return true;
214
+ }
215
+ /**
216
+ * Normalize viewport state when previous viewport math drifted after a shrink.
217
+ *
218
+ * @param tui - Patched TUI instance
219
+ * @param snapshot - Current render snapshot
220
+ * @param viewportState - Mutable viewport state
221
+ * @returns Nothing
222
+ */
223
+ function normalizeViewportBasisDrift(tui, snapshot, viewportState) {
224
+ const previousContentViewportTop = Math.max(0, tui.previousLines.length - snapshot.height);
225
+ const hasViewportBasisDrift = tui.overlayStack.length === 0 &&
226
+ tui.previousLines.length > 0 &&
227
+ tui.maxLinesRendered > snapshot.newLines.length &&
228
+ viewportState.prevViewportTop !== previousContentViewportTop;
229
+ if (!hasViewportBasisDrift)
230
+ return;
231
+ tui.maxLinesRendered = snapshot.newLines.length;
232
+ viewportState.viewportTop = Math.max(0, tui.maxLinesRendered - snapshot.height);
233
+ viewportState.prevViewportTop = viewportState.viewportTop;
234
+ tui.previousViewportTop = viewportState.viewportTop;
235
+ }
236
+ /**
237
+ * Find the changed window between the previous and current frames.
238
+ *
239
+ * @param previousLines - Previously rendered lines
240
+ * @param newLines - Newly rendered lines
241
+ * @returns Changed window metadata
242
+ */
243
+ function findChangedWindow(previousLines, newLines) {
244
+ let firstChanged = -1;
245
+ let lastChanged = -1;
246
+ const maxLines = Math.max(newLines.length, previousLines.length);
247
+ for (let index = 0; index < maxLines; index += 1) {
248
+ const oldLine = index < previousLines.length ? previousLines[index] : "";
249
+ const newLine = index < newLines.length ? newLines[index] : "";
250
+ if (oldLine !== newLine) {
251
+ if (firstChanged === -1)
252
+ firstChanged = index;
253
+ lastChanged = index;
254
+ }
255
+ }
256
+ const appendedLines = newLines.length > previousLines.length;
257
+ if (appendedLines) {
258
+ if (firstChanged === -1)
259
+ firstChanged = previousLines.length;
260
+ lastChanged = newLines.length - 1;
261
+ }
262
+ return {
263
+ appendStart: appendedLines && firstChanged === previousLines.length && firstChanged > 0,
264
+ firstChanged,
265
+ lastChanged,
266
+ };
267
+ }
268
+ /**
269
+ * Move the diff renderer to the target row, scrolling if needed.
270
+ *
271
+ * @param buffer - Escape-sequence buffer
272
+ * @param viewportState - Mutable viewport state
273
+ * @param moveTargetRow - Target row in the content
274
+ * @param height - Terminal height
275
+ * @returns Updated buffer
276
+ */
277
+ function moveBufferToTargetRow(buffer, viewportState, moveTargetRow, height) {
278
+ const prevViewportBottom = viewportState.prevViewportTop + height - 1;
279
+ if (moveTargetRow <= prevViewportBottom)
280
+ return buffer;
281
+ const currentScreenRow = Math.max(0, Math.min(height - 1, viewportState.hardwareCursorRow - viewportState.prevViewportTop));
282
+ const moveToBottom = height - 1 - currentScreenRow;
283
+ if (moveToBottom > 0)
284
+ buffer += `\x1b[${moveToBottom}B`;
285
+ const scroll = moveTargetRow - prevViewportBottom;
286
+ buffer += "\r\n".repeat(scroll);
287
+ viewportState.prevViewportTop += scroll;
288
+ viewportState.viewportTop += scroll;
289
+ viewportState.hardwareCursorRow = moveTargetRow;
290
+ return buffer;
291
+ }
292
+ /**
293
+ * Compute the relative line movement needed for cursor positioning.
294
+ *
295
+ * @param viewportState - Mutable viewport state
296
+ * @param targetRow - Target content row
297
+ * @returns Relative line movement
298
+ */
299
+ function computeLineDiff(viewportState, targetRow) {
300
+ const currentScreenRow = viewportState.hardwareCursorRow - viewportState.prevViewportTop;
301
+ const targetScreenRow = targetRow - viewportState.viewportTop;
302
+ return targetScreenRow - currentScreenRow;
303
+ }
304
+ /**
305
+ * Ensure a rendered line never exceeds terminal width.
306
+ *
307
+ * @param tui - Patched TUI instance
308
+ * @param snapshot - Current render snapshot
309
+ * @param line - Rendered line
310
+ * @param lineIndex - Line index in the frame
311
+ * @returns Safe line content
312
+ */
313
+ function normalizeRenderedLine(tui, snapshot, line, lineIndex) {
314
+ if (isImageLineLocal(line) || piVisibleWidth(line) <= snapshot.width) {
315
+ return line;
316
+ }
317
+ const crashLogPath = path.join(os.homedir(), ".pi", "agent", "pi-crash.log");
318
+ const crashData = [
319
+ `Crash at ${new Date().toISOString()}`,
320
+ `Terminal width: ${snapshot.width}`,
321
+ `Line ${lineIndex} visible width: ${piVisibleWidth(line)}`,
322
+ "",
323
+ "=== All rendered lines ===",
324
+ ...snapshot.newLines.map((renderedLine, index) => `[${index}] (w=${piVisibleWidth(renderedLine)}) ${renderedLine}`),
325
+ "",
326
+ ].join("\n");
327
+ fs.mkdirSync(path.dirname(crashLogPath), { recursive: true });
328
+ fs.writeFileSync(crashLogPath, crashData);
329
+ if (process.env.TALLOW_DEBUG || process.env.PI_DEBUG) {
330
+ tui.stop?.();
331
+ throw new Error(`Rendered line ${lineIndex} exceeds terminal width (${piVisibleWidth(line)} > ${snapshot.width}).`);
332
+ }
333
+ return piTruncateToWidth(line, snapshot.width, "");
334
+ }
335
+ /**
336
+ * Handle frames where only trailing lines were removed.
337
+ *
338
+ * @param tui - Patched TUI instance
339
+ * @param snapshot - Current render snapshot
340
+ * @param viewportState - Mutable viewport state
341
+ * @param changedWindow - Changed window metadata
342
+ * @param logRedraw - Debug logger
343
+ * @returns True when rendering was handled
344
+ */
345
+ function handleTailRemovalOnly(tui, snapshot, viewportState, changedWindow, logRedraw) {
346
+ if (changedWindow.firstChanged < snapshot.newLines.length)
347
+ return false;
348
+ if (tui.previousLines.length <= snapshot.newLines.length) {
349
+ tui.positionHardwareCursor(snapshot.cursorPos, snapshot.newLines.length);
350
+ tui.previousLines = snapshot.newLines;
351
+ tui.previousWidth = snapshot.width;
352
+ tui.previousViewportTop = Math.max(0, tui.maxLinesRendered - snapshot.height);
353
+ return true;
354
+ }
355
+ let buffer = "\x1b[?2026h";
356
+ const targetRow = Math.max(0, snapshot.newLines.length - 1);
357
+ const lineDiff = computeLineDiff(viewportState, targetRow);
358
+ if (lineDiff > 0)
359
+ buffer += `\x1b[${lineDiff}B`;
360
+ else if (lineDiff < 0)
361
+ buffer += `\x1b[${-lineDiff}A`;
362
+ buffer += "\r";
363
+ const extraLines = tui.previousLines.length - snapshot.newLines.length;
364
+ if (extraLines > snapshot.height) {
365
+ logRedraw(`extraLines > height (${extraLines} > ${snapshot.height})`);
366
+ if (snapshot.inStartupGrace) {
367
+ writeGentleFullRender(tui, snapshot);
368
+ }
369
+ else {
370
+ writeFullRender(tui, snapshot, true);
371
+ }
372
+ return true;
373
+ }
374
+ if (extraLines > 0)
375
+ buffer += "\x1b[1B";
376
+ for (let index = 0; index < extraLines; index += 1) {
377
+ buffer += "\r\x1b[2K";
378
+ if (index < extraLines - 1)
379
+ buffer += "\x1b[1B";
380
+ }
381
+ if (extraLines > 0)
382
+ buffer += `\x1b[${extraLines}A`;
383
+ buffer += "\x1b[?2026l";
384
+ tui.terminal.write(buffer);
385
+ tui.cursorRow = targetRow;
386
+ tui.hardwareCursorRow = targetRow;
387
+ tui.positionHardwareCursor(snapshot.cursorPos, snapshot.newLines.length);
388
+ tui.previousLines = snapshot.newLines;
389
+ tui.previousWidth = snapshot.width;
390
+ tui.previousViewportTop = Math.max(0, tui.maxLinesRendered - snapshot.height);
391
+ return true;
392
+ }
393
+ /**
394
+ * Render the changed diff window into the current viewport.
395
+ *
396
+ * @param tui - Patched TUI instance
397
+ * @param snapshot - Current render snapshot
398
+ * @param viewportState - Mutable viewport state
399
+ * @param changedWindow - Changed window metadata
400
+ * @param logRedraw - Debug logger
401
+ * @returns Nothing
402
+ */
403
+ function renderDiffWindow(tui, snapshot, viewportState, changedWindow, logRedraw) {
404
+ if (changedWindow.firstChanged < viewportState.prevViewportTop) {
405
+ logRedraw(`firstChanged < viewportTop (${changedWindow.firstChanged} < ${viewportState.prevViewportTop})`);
406
+ if (snapshot.inStartupGrace) {
407
+ writeGentleFullRender(tui, snapshot);
408
+ }
409
+ else {
410
+ writeFullRender(tui, snapshot, true);
411
+ }
412
+ return;
413
+ }
414
+ let buffer = "\x1b[?2026h";
415
+ const moveTargetRow = changedWindow.appendStart
416
+ ? changedWindow.firstChanged - 1
417
+ : changedWindow.firstChanged;
418
+ buffer = moveBufferToTargetRow(buffer, viewportState, moveTargetRow, snapshot.height);
419
+ const lineDiff = computeLineDiff(viewportState, moveTargetRow);
420
+ if (lineDiff > 0)
421
+ buffer += `\x1b[${lineDiff}B`;
422
+ else if (lineDiff < 0)
423
+ buffer += `\x1b[${-lineDiff}A`;
424
+ buffer += changedWindow.appendStart ? "\r\n" : "\r";
425
+ const renderEnd = Math.min(changedWindow.lastChanged, snapshot.newLines.length - 1);
426
+ for (let index = changedWindow.firstChanged; index <= renderEnd; index += 1) {
427
+ if (index > changedWindow.firstChanged)
428
+ buffer += "\r\n";
429
+ buffer += "\x1b[2K";
430
+ const normalizedLine = normalizeRenderedLine(tui, snapshot, snapshot.newLines[index], index);
431
+ snapshot.newLines[index] = normalizedLine;
432
+ buffer += normalizedLine;
433
+ }
434
+ let finalCursorRow = renderEnd;
435
+ if (tui.previousLines.length > snapshot.newLines.length) {
436
+ const extraLines = tui.previousLines.length - snapshot.newLines.length;
437
+ if (extraLines > snapshot.height) {
438
+ logRedraw(`extraLines > height in diff path (${extraLines} > ${snapshot.height})`);
439
+ writeFullRender(tui, snapshot, true);
440
+ return;
441
+ }
442
+ if (renderEnd < snapshot.newLines.length - 1) {
443
+ const moveDown = snapshot.newLines.length - 1 - renderEnd;
444
+ buffer += `\x1b[${moveDown}B`;
445
+ finalCursorRow = snapshot.newLines.length - 1;
446
+ }
447
+ for (let index = snapshot.newLines.length; index < tui.previousLines.length; index += 1) {
448
+ buffer += "\r\n\x1b[2K";
449
+ }
450
+ buffer += `\x1b[${extraLines}A`;
451
+ }
452
+ buffer += "\x1b[?2026l";
453
+ tui.terminal.write(buffer);
454
+ tui.cursorRow = Math.max(0, snapshot.newLines.length - 1);
455
+ tui.hardwareCursorRow = finalCursorRow;
456
+ tui.maxLinesRendered =
457
+ tui.overlayStack.length === 0
458
+ ? snapshot.newLines.length
459
+ : Math.max(tui.maxLinesRendered, snapshot.newLines.length);
460
+ tui.previousViewportTop = Math.max(0, tui.maxLinesRendered - snapshot.height);
461
+ setTuiRollingShrinkPeak(tui, Math.max(getTuiRollingShrinkPeak(tui), snapshot.newLines.length));
462
+ tui.positionHardwareCursor(snapshot.cursorPos, snapshot.newLines.length);
463
+ tui.previousLines = snapshot.newLines;
464
+ tui.previousWidth = snapshot.width;
465
+ }
466
+ function patchTuiPrototype(prototype) {
467
+ if (prototype[APPLY_FLAG])
468
+ return;
469
+ prototype[APPLY_FLAG] = true;
470
+ prototype.resetRenderGrace = function () {
471
+ tuiStartedAtMs.set(this, Date.now());
472
+ };
473
+ prototype.requestScrollbackClear = function () {
474
+ setTuiPendingScrollbackClear(this, true);
475
+ };
476
+ prototype.beginRenderBatch = function () {
477
+ tuiRenderBatchDepth.set(this, getTuiRenderBatchDepth(this) + 1);
478
+ };
479
+ prototype.endRenderBatch = function () {
480
+ const depth = getTuiRenderBatchDepth(this);
481
+ if (depth <= 0)
482
+ return;
483
+ tuiRenderBatchDepth.set(this, depth - 1);
484
+ if (depth === 1 && (tuiRenderDeferredDuringBatch.get(this) ?? false)) {
485
+ const wasForce = tuiRenderForceDeferredDuringBatch.get(this) ?? false;
486
+ tuiRenderDeferredDuringBatch.set(this, false);
487
+ tuiRenderForceDeferredDuringBatch.set(this, false);
488
+ this.requestRender(wasForce);
489
+ }
490
+ };
491
+ const originalStart = prototype.start;
492
+ if (typeof originalStart === "function") {
493
+ prototype.start = function () {
494
+ tuiStartedAtMs.set(this, Date.now());
495
+ originalStart.call(this);
496
+ };
497
+ }
498
+ const originalQueryCellSize = prototype.queryCellSize;
499
+ if (typeof originalQueryCellSize === "function") {
500
+ prototype.queryCellSize = function () {
501
+ if (process.env.TMUX) {
502
+ return;
503
+ }
504
+ originalQueryCellSize.call(this);
505
+ };
506
+ }
507
+ const originalRequestRender = prototype.requestRender;
508
+ if (typeof originalRequestRender === "function") {
509
+ prototype.requestRender = function (force = false) {
510
+ if (force) {
511
+ setTuiRollingShrinkPeak(this, 0);
512
+ }
513
+ if (getTuiRenderBatchDepth(this) > 0) {
514
+ tuiRenderDeferredDuringBatch.set(this, true);
515
+ if (force)
516
+ tuiRenderForceDeferredDuringBatch.set(this, true);
517
+ return;
518
+ }
519
+ originalRequestRender.call(this, force);
520
+ };
521
+ }
522
+ prototype.doRender = function () {
523
+ if (this.stopped)
524
+ return;
525
+ const snapshot = createRenderSnapshot(this);
526
+ const logRedraw = createRedrawLogger(this, snapshot);
527
+ if (handleEarlyFullRender(this, snapshot, logRedraw)) {
528
+ return;
529
+ }
530
+ const viewportState = {
531
+ hardwareCursorRow: this.hardwareCursorRow,
532
+ prevViewportTop: this.previousViewportTop,
533
+ viewportTop: Math.max(0, this.maxLinesRendered - snapshot.height),
534
+ };
535
+ normalizeViewportBasisDrift(this, snapshot, viewportState);
536
+ const changedWindow = findChangedWindow(this.previousLines, snapshot.newLines);
537
+ if (changedWindow.firstChanged === -1) {
538
+ this.positionHardwareCursor(snapshot.cursorPos, snapshot.newLines.length);
539
+ this.previousViewportTop = Math.max(0, this.maxLinesRendered - snapshot.height);
540
+ return;
541
+ }
542
+ if (handleTailRemovalOnly(this, snapshot, viewportState, changedWindow, logRedraw)) {
543
+ return;
544
+ }
545
+ renderDiffWindow(this, snapshot, viewportState, changedWindow, logRedraw);
546
+ };
547
+ }
548
+ export async function applyPiTuiPatches() {
549
+ const mod = (await import("@mariozechner/pi-tui"));
550
+ const editorPrototype = mod.Editor?.prototype;
551
+ if (editorPrototype) {
552
+ patchEditorPrototype(editorPrototype);
553
+ }
554
+ const settingsListPrototype = mod.SettingsList?.prototype;
555
+ if (settingsListPrototype) {
556
+ patchSettingsListPrototype(settingsListPrototype);
557
+ }
558
+ const tuiPrototype = mod.TUI?.prototype;
559
+ if (tuiPrototype) {
560
+ patchTuiPrototype(tuiPrototype);
561
+ }
562
+ }
563
+ //# sourceMappingURL=pi-tui-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tui-patch.js","sourceRoot":"","sources":["../src/pi-tui-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACN,eAAe,IAAI,iBAAiB,EACpC,YAAY,IAAI,cAAc,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,UAAU,GAAG,iCAAiC,CAAC;AACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC,SAAS,gBAAgB,CAAC,IAAY;IACrC,OAAO,CACN,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC5B,CAAC;AACH,CAAC;AA2CD,MAAM,cAAc,GAAG,IAAI,OAAO,EAAkB,CAAC;AACrD,MAAM,yBAAyB,GAAG,IAAI,OAAO,EAAmB,CAAC;AACjE,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAC1D,MAAM,4BAA4B,GAAG,IAAI,OAAO,EAAmB,CAAC;AACpE,MAAM,iCAAiC,GAAG,IAAI,OAAO,EAAmB,CAAC;AACzE,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAE3D,SAAS,sBAAsB,CAAC,GAAW;IAC1C,OAAO,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAW;IAChD,OAAO,yBAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAW,EAAE,KAAc;IAChE,yBAAyB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW;IAC3C,OAAO,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW,EAAE,KAAa;IAC1D,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAyBD;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,GAA4B;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;IACjC,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,QAAQ,GAAG,GAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO;QACN,SAAS;QACT,MAAM;QACN,cAAc,EAAE,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,gBAAgB;QAC1E,QAAQ;QACR,KAAK;QACL,YAAY,EAAE,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,KAAK,KAAK;KACpE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAC1B,GAAmB,EACnB,QAAwB;IAExB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;IACxD,OAAO,CAAC,MAAc,EAAQ,EAAE;QAC/B,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,iBAAiB,MAAM,UAAU,GAAG,CAAC,aAAa,CAAC,MAAM,SAAS,QAAQ,CAAC,QAAQ,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnK,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC7B,GAAmB,EACnB,QAAwB,EACxB,oBAA4B,EAC5B,gBAAyB;IAEzB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;IACtC,GAAG,CAAC,gBAAgB,GAAG,gBAAgB;QACtC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1D,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC5B,GAAG,CAAC,mBAAmB,GAAG,oBAAoB,CAAC;IAC/C,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACtC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CACvB,GAA4B,EAC5B,QAAwB,EACxB,KAAc;IAEd,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC;IACzB,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnE,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,IAAI,KAAK,IAAI,4BAA4B,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,sBAAsB,CAAC;QACjC,4BAA4B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,eAAe,CAAC;IAC3B,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,MAAM,CAAC;QAChC,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,aAAa,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,GAAmB,EAAE,QAAwB;IAC3E,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC;IACzB,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnE,IAAI,MAAM,GAAG,mBAAmB,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC;QACpB,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,MAAM,CAAC;IACvD,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CACrE,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,aAAa,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,aAAa,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC7B,GAA4B,EAC5B,QAAwB,EACxB,SAAmC;IAEnC,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC9D,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1B,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3B,SAAS,CAAC,kBAAkB,GAAG,CAAC,aAAa,OAAO,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACvE,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IACC,GAAG,CAAC,aAAa;QACjB,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,gBAAgB;QAC/C,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAC5B,CAAC;QACF,SAAS,CAAC,mCAAmC,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxE,IAAI,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,SAAS,CAAC,iBAAiB,WAAW,SAAS,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QAC7C,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACd,CAAC;IACD,SAAS,CACR,wBAAwB,WAAW,SAAS,QAAQ,CAAC,QAAQ,CAAC,MAAM,WAAW,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CACxH,CAAC;IACF,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC7B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACP,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,2BAA2B,CACnC,GAAmB,EACnB,QAAwB,EACxB,aAA4B;IAE5B,MAAM,0BAA0B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3F,MAAM,qBAAqB,GAC1B,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAC7B,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAC5B,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;QAC/C,aAAa,CAAC,eAAe,KAAK,0BAA0B,CAAC;IAC9D,IAAI,CAAC,qBAAqB;QAAE,OAAO;IACnC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChD,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChF,aAAa,CAAC,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;IAC1D,GAAG,CAAC,mBAAmB,GAAG,aAAa,CAAC,WAAW,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,aAAuB,EAAE,QAAkB;IACrE,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,YAAY,KAAK,CAAC,CAAC;gBAAE,YAAY,GAAG,KAAK,CAAC;YAC9C,WAAW,GAAG,KAAK,CAAC;QACrB,CAAC;IACF,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QACnB,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;QAC7D,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO;QACN,WAAW,EAAE,aAAa,IAAI,YAAY,KAAK,aAAa,CAAC,MAAM,IAAI,YAAY,GAAG,CAAC;QACvF,YAAY;QACZ,WAAW;KACX,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC7B,MAAc,EACd,aAA4B,EAC5B,aAAqB,EACrB,MAAc;IAEd,MAAM,kBAAkB,GAAG,aAAa,CAAC,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC;IACtE,IAAI,aAAa,IAAI,kBAAkB;QAAE,OAAO,MAAM,CAAC;IACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAChC,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,CAAC,iBAAiB,GAAG,aAAa,CAAC,eAAe,CAAC,CACrF,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC;IACnD,IAAI,YAAY,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,YAAY,GAAG,CAAC;IACxD,MAAM,MAAM,GAAG,aAAa,GAAG,kBAAkB,CAAC;IAClD,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,aAAa,CAAC,eAAe,IAAI,MAAM,CAAC;IACxC,aAAa,CAAC,WAAW,IAAI,MAAM,CAAC;IACpC,aAAa,CAAC,iBAAiB,GAAG,aAAa,CAAC;IAChD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,aAA4B,EAAE,SAAiB;IACvE,MAAM,gBAAgB,GAAG,aAAa,CAAC,iBAAiB,GAAG,aAAa,CAAC,eAAe,CAAC;IACzF,MAAM,eAAe,GAAG,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC;IAC9D,OAAO,eAAe,GAAG,gBAAgB,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC7B,GAAmB,EACnB,QAAwB,EACxB,IAAY,EACZ,SAAiB;IAEjB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG;QACjB,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACtC,mBAAmB,QAAQ,CAAC,KAAK,EAAE;QACnC,QAAQ,SAAS,mBAAmB,cAAc,CAAC,IAAI,CAAC,EAAE;QAC1D,EAAE;QACF,4BAA4B;QAC5B,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,cAAc,CAAC,YAAY,CAAC,KAAK,YAAY,EAAE,CACzF;QACD,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,iBAAiB,SAAS,4BAA4B,cAAc,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,IAAI,CAClG,CAAC;IACH,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,qBAAqB,CAC7B,GAAmB,EACnB,QAAwB,EACxB,aAA4B,EAC5B,aAA4B,EAC5B,SAAmC;IAEnC,IAAI,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1D,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzE,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACtC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;QACnC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,QAAQ,GAAG,CAAC;SAC3C,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC;IACtD,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvE,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClC,SAAS,CAAC,wBAAwB,UAAU,MAAM,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,UAAU,GAAG,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC;IACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,WAAW,CAAC;QACtB,IAAI,KAAK,GAAG,UAAU,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC;IACjD,CAAC;IACD,IAAI,UAAU,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,UAAU,GAAG,CAAC;IACpD,MAAM,IAAI,aAAa,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAClC,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACtC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CACxB,GAA4B,EAC5B,QAAwB,EACxB,aAA4B,EAC5B,aAA4B,EAC5B,SAAmC;IAEnC,IAAI,aAAa,CAAC,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;QAChE,SAAS,CACR,+BAA+B,aAAa,CAAC,YAAY,MAAM,aAAa,CAAC,eAAe,GAAG,CAC/F,CAAC;QACF,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7B,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;IACR,CAAC;IACD,IAAI,MAAM,GAAG,aAAa,CAAC;IAC3B,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW;QAC9C,CAAC,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC;QAChC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC;IAC9B,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC/D,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,QAAQ,GAAG,CAAC;SAC3C,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC;IACtD,MAAM,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,KAAK,GAAG,aAAa,CAAC,YAAY,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7E,IAAI,KAAK,GAAG,aAAa,CAAC,YAAY;YAAE,MAAM,IAAI,MAAM,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC;QACpB,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7F,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC;QAC1C,MAAM,IAAI,cAAc,CAAC;IAC1B,CAAC;IACD,IAAI,cAAc,GAAG,SAAS,CAAC;IAC/B,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvE,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClC,SAAS,CAAC,qCAAqC,UAAU,MAAM,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACnF,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;QACR,CAAC;QACD,IAAI,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;YAC1D,MAAM,IAAI,QAAQ,QAAQ,GAAG,CAAC;YAC9B,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACzF,MAAM,IAAI,aAAa,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,QAAQ,UAAU,GAAG,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,aAAa,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,iBAAiB,GAAG,cAAc,CAAC;IACvC,GAAG,CAAC,gBAAgB;QACnB,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9E,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/F,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACtC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA2B;IACrD,IAAI,SAAS,CAAC,UAAU,CAAC;QAAE,OAAO;IAClC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAE7B,SAAS,CAAC,gBAAgB,GAAG;QAC5B,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,SAAS,CAAC,sBAAsB,GAAG;QAClC,4BAA4B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,GAAG;QAC5B,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,SAAS,CAAC,cAAc,GAAG;QAC1B,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QACvB,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,iCAAiC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;YACtE,4BAA4B,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9C,iCAAiC,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC;IACtC,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;QACzC,SAAS,CAAC,KAAK,GAAG;YACjB,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACrC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,SAAS,CAAC,aAAa,CAAC;IACtD,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,CAAC;QACjD,SAAS,CAAC,aAAa,GAAG;YACzB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACtB,OAAO;YACR,CAAC;YACD,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,SAAS,CAAC,aAAa,CAAC;IACtD,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,CAAC;QACjD,SAAS,CAAC,aAAa,GAAG,UAAyC,KAAK,GAAG,KAAK;YAC/E,IAAI,KAAK,EAAE,CAAC;gBACX,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,4BAA4B,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,KAAK;oBAAE,iCAAiC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7D,OAAO;YACR,CAAC;YACD,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAQ,GAAG;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACtD,OAAO;QACR,CAAC;QACD,MAAM,aAAa,GAAkB;YACpC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,eAAe,EAAE,IAAI,CAAC,mBAAmB;YACzC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;SACjE,CAAC;QACF,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,aAAa,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChF,OAAO;QACR,CAAC;QACD,IAAI,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;YACpF,OAAO;QACR,CAAC;QACD,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAIhD,CAAC;IACF,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAC9C,IAAI,eAAe,EAAE,CAAC;QACrB,oBAAoB,CAAC,eAA6D,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,qBAAqB,GAAG,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC;IAC1D,IAAI,qBAAqB,EAAE,CAAC;QAC3B,0BAA0B,CACzB,qBAAyE,CACzE,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;IACxC,IAAI,YAAY,EAAE,CAAC;QAClB,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ declare const SETTINGS_LIST_PATCH_FLAG = "__tallow_pi_tui_settings_list_patch_applied__";
2
+ type SettingsListPrototypeLike = {
3
+ activateItem?: () => void;
4
+ closeSubmenu?: () => void;
5
+ [SETTINGS_LIST_PATCH_FLAG]?: boolean;
6
+ render?: (width: number) => string[];
7
+ setLayoutTransitionCallback?: (callback?: () => void) => void;
8
+ };
9
+ export declare function patchSettingsListPrototype(prototype: SettingsListPrototypeLike): void;
10
+ export {};
11
+ //# sourceMappingURL=pi-tui-settings-list-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tui-settings-list-patch.d.ts","sourceRoot":"","sources":["../src/pi-tui-settings-list-patch.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,wBAAwB,kDAAkD,CAAC;AAQjF,KAAK,yBAAyB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,CAAC,wBAAwB,CAAC,CAAC,EAAE,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,2BAA2B,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC9D,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,yBAAyB,GAAG,IAAI,CA0CrF"}
@@ -0,0 +1,38 @@
1
+ const SETTINGS_LIST_PATCH_FLAG = "__tallow_pi_tui_settings_list_patch_applied__";
2
+ export function patchSettingsListPrototype(prototype) {
3
+ if (prototype[SETTINGS_LIST_PATCH_FLAG])
4
+ return;
5
+ prototype[SETTINGS_LIST_PATCH_FLAG] = true;
6
+ prototype.setLayoutTransitionCallback = function (callback) {
7
+ this.__tallow_layoutTransitionCallback = callback;
8
+ };
9
+ const originalRender = prototype.render;
10
+ if (typeof originalRender === "function") {
11
+ prototype.render = function (width) {
12
+ const lines = originalRender.call(this, width);
13
+ const minLineCount = this.__tallow_nextMinLineCount ?? 0;
14
+ const paddedLines = minLineCount > lines.length
15
+ ? [...lines, ...Array.from({ length: minLineCount - lines.length }, () => "")]
16
+ : lines;
17
+ this.__tallow_nextMinLineCount = 0;
18
+ this.__tallow_lastRenderLineCount = paddedLines.length;
19
+ return paddedLines;
20
+ };
21
+ }
22
+ const originalActivateItem = prototype.activateItem;
23
+ if (typeof originalActivateItem === "function") {
24
+ prototype.activateItem = function () {
25
+ this.__tallow_layoutTransitionCallback?.();
26
+ originalActivateItem.call(this);
27
+ };
28
+ }
29
+ const originalCloseSubmenu = prototype.closeSubmenu;
30
+ if (typeof originalCloseSubmenu === "function") {
31
+ prototype.closeSubmenu = function () {
32
+ this.__tallow_layoutTransitionCallback?.();
33
+ this.__tallow_nextMinLineCount = this.__tallow_lastRenderLineCount ?? 0;
34
+ originalCloseSubmenu.call(this);
35
+ };
36
+ }
37
+ }
38
+ //# sourceMappingURL=pi-tui-settings-list-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tui-settings-list-patch.js","sourceRoot":"","sources":["../src/pi-tui-settings-list-patch.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,+CAA+C,CAAC;AAgBjF,MAAM,UAAU,0BAA0B,CAAC,SAAoC;IAC9E,IAAI,SAAS,CAAC,wBAAwB,CAAC;QAAE,OAAO;IAChD,SAAS,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;IAE3C,SAAS,CAAC,2BAA2B,GAAG,UAEvC,QAAqB;QAErB,IAAI,CAAC,iCAAiC,GAAG,QAAQ,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;IACxC,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QAC1C,SAAS,CAAC,MAAM,GAAG,UAAyC,KAAa;YACxE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,IAAI,CAAC,CAAC;YACzD,MAAM,WAAW,GAChB,YAAY,GAAG,KAAK,CAAC,MAAM;gBAC1B,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9E,CAAC,CAAC,KAAK,CAAC;YACV,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,4BAA4B,GAAG,WAAW,CAAC,MAAM,CAAC;YACvD,OAAO,WAAW,CAAC;QACpB,CAAC,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,SAAS,CAAC,YAAY,CAAC;IACpD,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAChD,SAAS,CAAC,YAAY,GAAG;YACxB,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC;YAC3C,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,SAAS,CAAC,YAAY,CAAC;IACpD,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAChD,SAAS,CAAC,YAAY,GAAG;YACxB,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,4BAA4B,IAAI,CAAC,CAAC;YACxE,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -35,7 +35,7 @@ async function cleanup(session, exitCode) {
35
35
  try {
36
36
  const runner = session?.extensionRunner;
37
37
  if (runner?.hasHandlers("session_shutdown")) {
38
- await runner.emit({ type: "session_shutdown" });
38
+ await runner.emit({ type: "session_shutdown", reason: "quit" });
39
39
  }
40
40
  }
41
41
  catch {