@code-yeongyu/senpi 2026.7.10-2 → 2026.7.11

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 (230) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +3 -1
  3. package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
  4. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  5. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  6. package/dist/core/extensions/builtin/compaction/index.js +10 -1
  7. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  8. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  9. package/dist/core/extensions/builtin/goal/store.js +88 -3
  10. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  11. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +3 -0
  12. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -0
  13. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +83 -0
  14. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -0
  15. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/prompt-preset/presets.js +6 -0
  17. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  18. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  19. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  21. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  22. package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -3
  23. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/terminal/notify.js +7 -4
  25. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  26. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +5 -3
  27. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/terminal/runtime-session.js +32 -16
  29. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  30. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +1 -1
  31. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +10 -4
  33. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  34. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/todotools/tools/todowrite.js +5 -8
  36. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  37. package/dist/core/extensions/runner.d.ts +1 -0
  38. package/dist/core/extensions/runner.d.ts.map +1 -1
  39. package/dist/core/extensions/runner.js +5 -0
  40. package/dist/core/extensions/runner.js.map +1 -1
  41. package/dist/core/extensions/types.d.ts +3 -1
  42. package/dist/core/extensions/types.d.ts.map +1 -1
  43. package/dist/core/extensions/types.js.map +1 -1
  44. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  45. package/dist/core/extensions/wrapper.js +22 -3
  46. package/dist/core/extensions/wrapper.js.map +1 -1
  47. package/dist/core/keybindings.d.ts +8 -3
  48. package/dist/core/keybindings.d.ts.map +1 -1
  49. package/dist/core/keybindings.js +7 -3
  50. package/dist/core/keybindings.js.map +1 -1
  51. package/dist/core/model-registry.d.ts.map +1 -1
  52. package/dist/core/model-registry.js +2 -0
  53. package/dist/core/model-registry.js.map +1 -1
  54. package/dist/index.d.ts +1 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/modes/interactive/components/custom-editor.js +1 -1
  59. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  60. package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  61. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  62. package/dist/modes/interactive/components/login-dialog.js +9 -2
  63. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  64. package/dist/modes/interactive/components/tool-execution-fallback.d.ts +6 -0
  65. package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -0
  66. package/dist/modes/interactive/components/tool-execution-fallback.js +40 -0
  67. package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -0
  68. package/dist/modes/interactive/components/tool-execution-images.d.ts +23 -0
  69. package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -0
  70. package/dist/modes/interactive/components/tool-execution-images.js +104 -0
  71. package/dist/modes/interactive/components/tool-execution-images.js.map +1 -0
  72. package/dist/modes/interactive/components/tool-execution-renderer.d.ts +28 -0
  73. package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -0
  74. package/dist/modes/interactive/components/tool-execution-renderer.js +135 -0
  75. package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -0
  76. package/dist/modes/interactive/components/tool-execution-types.d.ts +23 -0
  77. package/dist/modes/interactive/components/tool-execution-types.d.ts.map +1 -0
  78. package/dist/modes/interactive/components/tool-execution-types.js +2 -0
  79. package/dist/modes/interactive/components/tool-execution-types.js.map +1 -0
  80. package/dist/modes/interactive/components/tool-execution.d.ts +13 -39
  81. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  82. package/dist/modes/interactive/components/tool-execution.js +51 -294
  83. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  84. package/dist/modes/interactive/components/tool-renderer-boundary.d.ts +17 -0
  85. package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -0
  86. package/dist/modes/interactive/components/tool-renderer-boundary.js +75 -0
  87. package/dist/modes/interactive/components/tool-renderer-boundary.js.map +1 -0
  88. package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
  89. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/tree-selector.js +50 -17
  91. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.d.ts +1 -2
  93. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.js +44 -40
  95. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  96. package/dist/utils/clipboard-native.d.ts +1 -0
  97. package/dist/utils/clipboard-native.d.ts.map +1 -1
  98. package/dist/utils/clipboard-native.js.map +1 -1
  99. package/dist/utils/clipboard.d.ts +2 -0
  100. package/dist/utils/clipboard.d.ts.map +1 -1
  101. package/dist/utils/clipboard.js +13 -0
  102. package/dist/utils/clipboard.js.map +1 -1
  103. package/docs/extensions.md +139 -0
  104. package/docs/keybindings.md +1 -0
  105. package/docs/providers.md +3 -0
  106. package/docs/quickstart.md +1 -1
  107. package/docs/settings.md +1 -1
  108. package/docs/usage.md +1 -0
  109. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +3 -0
  110. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  111. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +7 -7
  112. package/node_modules/@code-yeongyu/senpi-codemode/src/completion/tool-bridge.ts +3 -0
  113. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +69 -8
  114. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +39 -13
  115. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +191 -148
  116. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker-entry.js +23 -0
  117. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +4 -175
  118. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +38 -0
  119. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +82 -0
  120. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +7 -3
  121. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-host.ts +117 -0
  122. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +32 -0
  123. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +231 -199
  124. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/process.ts +119 -0
  125. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +237 -0
  126. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +22 -0
  127. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +214 -189
  128. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-process.ts +174 -0
  129. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +100 -0
  130. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-run.ts +98 -0
  131. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +205 -0
  132. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +208 -203
  133. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +215 -25
  134. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +1 -0
  135. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -0
  136. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +2 -0
  138. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  140. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  141. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  142. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +82 -32
  143. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  144. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  145. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +4 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +5 -2
  149. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +3 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +29 -0
  153. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +7 -3
  156. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +8 -3
  159. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/compat.js +2 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +270 -21
  164. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +5 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +17 -0
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +17 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +9 -6
  174. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +92 -0
  176. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  177. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +59 -1
  178. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  179. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +18 -0
  180. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +6 -0
  182. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +38 -0
  184. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +24 -0
  186. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  187. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +66 -0
  188. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  189. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +55 -1
  190. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +5 -21
  192. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +48 -65
  194. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  195. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +34 -0
  196. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  197. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +37 -3
  198. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  199. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +15 -1
  200. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  201. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  202. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts +9 -0
  203. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts.map +1 -0
  204. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js +36 -0
  205. package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -1
  207. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +18 -5
  208. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -1
  209. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  210. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  211. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  212. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +2 -1
  213. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  214. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +2 -1
  215. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  216. package/node_modules/@earendil-works/pi-tui/dist/index.js +2 -1
  217. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  218. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  219. package/node_modules/@earendil-works/pi-tui/dist/keys.js +6 -5
  220. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  221. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -1
  222. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  223. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -9
  224. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  225. package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts +4 -0
  226. package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts.map +1 -0
  227. package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js +18 -0
  228. package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js.map +1 -0
  229. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  230. package/package.json +6 -6
@@ -0,0 +1,75 @@
1
+ export function isComponent(value) {
2
+ return ((typeof value === "object" || typeof value === "function") &&
3
+ value !== null &&
4
+ typeof Reflect.get(value, "render") === "function" &&
5
+ typeof Reflect.get(value, "invalidate") === "function");
6
+ }
7
+ export class ToolRendererBoundary {
8
+ constructor(component, fallback, onFailure) {
9
+ this.componentDisposed = false;
10
+ this.failed = false;
11
+ this.component = component;
12
+ this.fallback = fallback;
13
+ this.onFailure = onFailure;
14
+ }
15
+ render(width) {
16
+ if (!this.failed) {
17
+ try {
18
+ const lines = this.component.render(width);
19
+ if (Array.isArray(lines)) {
20
+ const safeLines = [];
21
+ for (const line of lines) {
22
+ if (typeof line !== "string") {
23
+ throw new TypeError("Tool renderer returned a non-string line");
24
+ }
25
+ safeLines.push(line);
26
+ }
27
+ return safeLines;
28
+ }
29
+ }
30
+ catch {
31
+ this.fail();
32
+ return this.renderFallback(width);
33
+ }
34
+ this.fail();
35
+ }
36
+ return this.renderFallback(width);
37
+ }
38
+ invalidate() {
39
+ if (!this.failed) {
40
+ try {
41
+ this.component.invalidate();
42
+ }
43
+ catch {
44
+ this.fail();
45
+ }
46
+ }
47
+ this.fallback?.invalidate();
48
+ }
49
+ dispose() {
50
+ this.disposeComponent();
51
+ this.fallback?.dispose?.();
52
+ }
53
+ fail() {
54
+ if (this.failed)
55
+ return;
56
+ this.failed = true;
57
+ this.onFailure();
58
+ this.disposeComponent();
59
+ }
60
+ disposeComponent() {
61
+ if (this.componentDisposed)
62
+ return;
63
+ this.componentDisposed = true;
64
+ try {
65
+ this.component.dispose?.();
66
+ }
67
+ catch {
68
+ return;
69
+ }
70
+ }
71
+ renderFallback(width) {
72
+ return this.fallback?.render(width) ?? [];
73
+ }
74
+ }
75
+ //# sourceMappingURL=tool-renderer-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-renderer-boundary.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-renderer-boundary.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,OAAO,CACN,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;QAC1D,KAAK,KAAK,IAAI;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,UAAU;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,UAAU,CACtD,CAAC;AACH,CAAC;AAED,MAAM,OAAO,oBAAoB;IAOhC,YAAY,SAAoB,EAAE,QAA+B,EAAE,SAAqB;QALhF,sBAAiB,GAAG,KAAK,CAAC;QAE1B,WAAM,GAAG,KAAK,CAAC;QAItB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;oBAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC9B,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;wBACjE,CAAC;wBACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;oBACD,OAAO,SAAS,CAAC;gBAClB,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,UAAU;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC;gBACJ,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACR,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;QACF,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;IAC5B,CAAC;IAEO,IAAI;QACX,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzB,CAAC;IAEO,gBAAgB;QACvB,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO;QACR,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,KAAa;QACnC,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;CACD","sourcesContent":["import type { Component } from \"@earendil-works/pi-tui\";\n\nexport function isComponent(value: unknown): value is Component {\n\treturn (\n\t\t(typeof value === \"object\" || typeof value === \"function\") &&\n\t\tvalue !== null &&\n\t\ttypeof Reflect.get(value, \"render\") === \"function\" &&\n\t\ttypeof Reflect.get(value, \"invalidate\") === \"function\"\n\t);\n}\n\nexport class ToolRendererBoundary implements Component {\n\tprivate component: Component;\n\tprivate componentDisposed = false;\n\tprivate fallback?: Component;\n\tprivate failed = false;\n\tprivate onFailure: () => void;\n\n\tconstructor(component: Component, fallback: Component | undefined, onFailure: () => void) {\n\t\tthis.component = component;\n\t\tthis.fallback = fallback;\n\t\tthis.onFailure = onFailure;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (!this.failed) {\n\t\t\ttry {\n\t\t\t\tconst lines = this.component.render(width);\n\t\t\t\tif (Array.isArray(lines)) {\n\t\t\t\t\tconst safeLines: string[] = [];\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (typeof line !== \"string\") {\n\t\t\t\t\t\t\tthrow new TypeError(\"Tool renderer returned a non-string line\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsafeLines.push(line);\n\t\t\t\t\t}\n\t\t\t\t\treturn safeLines;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tthis.fail();\n\t\t\t\treturn this.renderFallback(width);\n\t\t\t}\n\t\t\tthis.fail();\n\t\t}\n\t\treturn this.renderFallback(width);\n\t}\n\n\tinvalidate(): void {\n\t\tif (!this.failed) {\n\t\t\ttry {\n\t\t\t\tthis.component.invalidate();\n\t\t\t} catch {\n\t\t\t\tthis.fail();\n\t\t\t}\n\t\t}\n\t\tthis.fallback?.invalidate();\n\t}\n\n\tdispose(): void {\n\t\tthis.disposeComponent();\n\t\tthis.fallback?.dispose?.();\n\t}\n\n\tprivate fail(): void {\n\t\tif (this.failed) return;\n\t\tthis.failed = true;\n\t\tthis.onFailure();\n\t\tthis.disposeComponent();\n\t}\n\n\tprivate disposeComponent(): void {\n\t\tif (this.componentDisposed) return;\n\t\tthis.componentDisposed = true;\n\t\ttry {\n\t\t\tthis.component.dispose?.();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate renderFallback(width: number): string[] {\n\t\treturn this.fallback?.render(width) ?? [];\n\t}\n}\n"]}
@@ -20,6 +20,7 @@ declare class TreeList implements Component {
20
20
  private foldedNodes;
21
21
  onSelect?: (entryId: string) => void;
22
22
  onCancel?: () => void;
23
+ onCopy?: (text: string | undefined) => void;
23
24
  onLabelEdit?: (entryId: string, currentLabel: string | undefined) => void;
24
25
  constructor(tree: SessionTreeNode[], currentLeafId: string | null, maxVisibleLines: number, initialSelectedId?: string, initialFilterMode?: FilterMode);
25
26
  /**
@@ -43,12 +44,15 @@ declare class TreeList implements Component {
43
44
  invalidate(): void;
44
45
  getSearchQuery(): string;
45
46
  getSelectedNode(): SessionTreeNode | undefined;
47
+ copySelected(): void;
46
48
  updateNodeLabel(entryId: string, label: string | undefined, labelTimestamp?: string): void;
47
49
  private getStatusLabels;
48
50
  render(width: number): string[];
49
51
  private getEntryDisplayText;
50
52
  private formatLabelTimestamp;
51
53
  private extractContent;
54
+ private extractFullContent;
55
+ private getEntryCopyText;
52
56
  private hasTextContent;
53
57
  private formatToolCall;
54
58
  handleInput(keyData: string): void;
@@ -76,6 +80,7 @@ export declare class TreeSelectorComponent extends Container implements Focusabl
76
80
  private labelInputContainer;
77
81
  private treeContainer;
78
82
  private onLabelChangeCallback?;
83
+ onCopy?: (text: string | undefined) => void;
79
84
  private _focused;
80
85
  get focused(): boolean;
81
86
  set focused(value: boolean);
@@ -1 +1 @@
1
- {"version":3,"file":"tree-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tree-selector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tree-selector.ts"],"names":[],"mappings":"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"}
@@ -487,6 +487,10 @@ class TreeList {
487
487
  getSelectedNode() {
488
488
  return this.filteredNodes[this.selectedIndex]?.node;
489
489
  }
490
+ copySelected() {
491
+ const node = this.getSelectedNode();
492
+ this.onCopy?.(node ? this.getEntryCopyText(node) : undefined);
493
+ }
490
494
  updateNodeLabel(entryId, label, labelTimestamp) {
491
495
  for (const flatNode of this.flatNodes) {
492
496
  if (flatNode.node.entry.id === entryId) {
@@ -708,27 +712,51 @@ class TreeList {
708
712
  return `${year}/${month}/${day} ${time}`;
709
713
  }
710
714
  extractContent(content) {
711
- const maxLen = 200;
715
+ return this.extractFullContent(content).slice(0, 200);
716
+ }
717
+ extractFullContent(content) {
712
718
  if (typeof content === "string")
713
- return content.slice(0, maxLen);
714
- if (Array.isArray(content)) {
715
- let result = "";
716
- for (const c of content) {
717
- if (typeof c === "object" && c !== null && "type" in c && c.type === "text") {
718
- result += c.text;
719
- if (result.length >= maxLen)
720
- return result.slice(0, maxLen);
719
+ return content;
720
+ if (!Array.isArray(content))
721
+ return "";
722
+ let result = "";
723
+ for (const block of content) {
724
+ if (typeof block === "object" && block !== null && "type" in block && block.type === "text") {
725
+ result += block.text;
726
+ }
727
+ if (typeof block === "object" && block !== null && "type" in block && block.type === "providerNative") {
728
+ const subtype = block.subtype ?? "unknown";
729
+ result += `[providerNative:${subtype}]`;
730
+ }
731
+ }
732
+ return result;
733
+ }
734
+ getEntryCopyText(node) {
735
+ const entry = node.entry;
736
+ let text;
737
+ switch (entry.type) {
738
+ case "message":
739
+ if (entry.message.role === "bashExecution") {
740
+ text = entry.message.command;
721
741
  }
722
- if (typeof c === "object" && c !== null && "type" in c && c.type === "providerNative") {
723
- const subtype = c.subtype ?? "unknown";
724
- result += `[providerNative:${subtype}]`;
725
- if (result.length >= maxLen)
726
- return result.slice(0, maxLen);
742
+ else if ("content" in entry.message) {
743
+ text = this.extractFullContent(entry.message.content);
744
+ if (!text && entry.message.role === "assistant") {
745
+ text = entry.message.errorMessage;
746
+ }
727
747
  }
728
- }
729
- return result;
748
+ break;
749
+ case "custom_message":
750
+ text = this.extractFullContent(entry.content);
751
+ break;
752
+ case "compaction":
753
+ text = entry.summary;
754
+ break;
755
+ case "branch_summary":
756
+ text = entry.summary;
757
+ break;
730
758
  }
731
- return "";
759
+ return text?.trim() ? text : undefined;
732
760
  }
733
761
  hasTextContent(content) {
734
762
  if (typeof content === "string")
@@ -846,6 +874,9 @@ class TreeList {
846
874
  this.onSelect(selected.node.entry.id);
847
875
  }
848
876
  }
877
+ else if (kb.matches(keyData, "app.message.copy")) {
878
+ this.copySelected();
879
+ }
849
880
  else if (kb.matches(keyData, "tui.select.cancel")) {
850
881
  if (this.searchQuery) {
851
882
  this.searchQuery = "";
@@ -1037,6 +1068,7 @@ const TREE_HELP_ITEMS = [
1037
1068
  { keys: ["tui.select.up", "tui.select.down"], label: "move" },
1038
1069
  { keys: ["tui.editor.cursorLeft", "tui.editor.cursorRight"], label: "page" },
1039
1070
  { keys: ["app.tree.foldOrUp", "app.tree.unfoldOrDown"], label: "branch" },
1071
+ { keys: ["app.message.copy"], label: "copy" },
1040
1072
  { keys: ["app.tree.editLabel"], label: "label" },
1041
1073
  { keys: ["app.tree.toggleLabelTimestamp"], label: "label time" },
1042
1074
  {
@@ -1149,6 +1181,7 @@ export class TreeSelectorComponent extends Container {
1149
1181
  this.treeList = new TreeList(tree, currentLeafId, maxVisibleLines, initialSelectedId, initialFilterMode);
1150
1182
  this.treeList.onSelect = onSelect;
1151
1183
  this.treeList.onCancel = onCancel;
1184
+ this.treeList.onCopy = (text) => this.onCopy?.(text);
1152
1185
  this.treeList.onLabelEdit = (entryId, currentLabel) => this.showLabelInput(entryId, currentLabel);
1153
1186
  this.treeContainer = new Container();
1154
1187
  this.treeContainer.addChild(this.treeList);