lsd-pi 1.1.4 → 1.1.6

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 (175) hide show
  1. package/README.md +2 -1
  2. package/dist/headless-ui.js +2 -0
  3. package/dist/onboarding.js +11 -8
  4. package/dist/resources/extensions/async-jobs/async-bash-tool.js +14 -0
  5. package/dist/resources/extensions/async-jobs/await-tool.js +14 -0
  6. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +7 -0
  7. package/dist/resources/extensions/cache-timer/index.js +5 -0
  8. package/dist/resources/extensions/codex-rotate/IMPLEMENTATION.md +18 -13
  9. package/dist/resources/extensions/codex-rotate/README.md +9 -3
  10. package/dist/resources/extensions/codex-rotate/commands.js +15 -8
  11. package/dist/resources/extensions/codex-rotate/index.js +17 -8
  12. package/dist/resources/extensions/memory/auto-extract.js +196 -80
  13. package/dist/resources/extensions/memory/dream.js +86 -19
  14. package/dist/resources/extensions/shared/rtk.js +89 -87
  15. package/dist/resources/extensions/subagent/index.js +33 -7
  16. package/dist/startup-model-validation.js +12 -2
  17. package/dist/update-check.js +2 -2
  18. package/dist/update-cmd.js +3 -3
  19. package/dist/welcome-screen.js +43 -14
  20. package/package.json +3 -2
  21. package/packages/pi-coding-agent/dist/core/agent-session.clear-queue.test.d.ts +2 -0
  22. package/packages/pi-coding-agent/dist/core/agent-session.clear-queue.test.d.ts.map +1 -0
  23. package/packages/pi-coding-agent/dist/core/agent-session.clear-queue.test.js +46 -0
  24. package/packages/pi-coding-agent/dist/core/agent-session.clear-queue.test.js.map +1 -0
  25. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +8 -0
  26. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  27. package/packages/pi-coding-agent/dist/core/agent-session.js +43 -4
  28. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  29. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +3 -1
  30. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  31. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  32. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +1 -1
  33. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  34. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -0
  35. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  36. package/packages/pi-coding-agent/dist/core/pty-executor.d.ts +48 -0
  37. package/packages/pi-coding-agent/dist/core/pty-executor.d.ts.map +1 -0
  38. package/packages/pi-coding-agent/dist/core/pty-executor.js +173 -0
  39. package/packages/pi-coding-agent/dist/core/pty-executor.js.map +1 -0
  40. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  41. package/packages/pi-coding-agent/dist/core/sdk.js +16 -3
  42. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  43. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +9 -0
  44. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  45. package/packages/pi-coding-agent/dist/core/settings-manager.js +18 -0
  46. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  47. package/packages/pi-coding-agent/dist/core/tool-approval.d.ts.map +1 -1
  48. package/packages/pi-coding-agent/dist/core/tool-approval.js +2 -2
  49. package/packages/pi-coding-agent/dist/core/tool-approval.js.map +1 -1
  50. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +7 -0
  51. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  52. package/packages/pi-coding-agent/dist/core/tools/index.js +23 -2
  53. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  54. package/packages/pi-coding-agent/dist/core/tools/pty.d.ts +50 -0
  55. package/packages/pi-coding-agent/dist/core/tools/pty.d.ts.map +1 -0
  56. package/packages/pi-coding-agent/dist/core/tools/pty.js +289 -0
  57. package/packages/pi-coding-agent/dist/core/tools/pty.js.map +1 -0
  58. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  59. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  60. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +36 -22
  61. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  62. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +3 -5
  63. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  64. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +23 -62
  65. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  66. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  67. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -4
  68. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  69. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  70. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -4
  71. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  72. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.d.ts +39 -0
  73. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.d.ts.map +1 -0
  74. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.js +182 -0
  75. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.js.map +1 -0
  76. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +6 -0
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +36 -0
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  80. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -4
  82. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  83. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -2
  84. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  85. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +106 -77
  86. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  87. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +2 -5
  88. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  89. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +4 -13
  90. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  91. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +11 -0
  92. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  93. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +49 -13
  94. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  95. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  96. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -0
  97. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  98. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  99. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +2 -0
  100. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  101. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +3 -0
  102. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  103. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  104. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +27 -0
  105. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  106. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +251 -39
  107. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  108. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -2
  109. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  110. package/packages/pi-coding-agent/dist/utils/terminal-screen.d.ts +10 -0
  111. package/packages/pi-coding-agent/dist/utils/terminal-screen.d.ts.map +1 -0
  112. package/packages/pi-coding-agent/dist/utils/terminal-screen.js +67 -0
  113. package/packages/pi-coding-agent/dist/utils/terminal-screen.js.map +1 -0
  114. package/packages/pi-coding-agent/dist/utils/terminal-serializer.d.ts +7 -0
  115. package/packages/pi-coding-agent/dist/utils/terminal-serializer.d.ts.map +1 -0
  116. package/packages/pi-coding-agent/dist/utils/terminal-serializer.js +67 -0
  117. package/packages/pi-coding-agent/dist/utils/terminal-serializer.js.map +1 -0
  118. package/packages/pi-coding-agent/package.json +9 -4
  119. package/packages/pi-coding-agent/src/core/agent-session.clear-queue.test.ts +50 -0
  120. package/packages/pi-coding-agent/src/core/agent-session.ts +50 -4
  121. package/packages/pi-coding-agent/src/core/extensions/types.ts +1 -1
  122. package/packages/pi-coding-agent/src/core/keybindings.ts +4 -1
  123. package/packages/pi-coding-agent/src/core/pty-executor.ts +229 -0
  124. package/packages/pi-coding-agent/src/core/sdk.ts +16 -3
  125. package/packages/pi-coding-agent/src/core/settings-manager.ts +27 -0
  126. package/packages/pi-coding-agent/src/core/tool-approval.ts +2 -2
  127. package/packages/pi-coding-agent/src/core/tools/index.ts +35 -2
  128. package/packages/pi-coding-agent/src/core/tools/pty.ts +354 -0
  129. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +37 -24
  130. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +22 -70
  131. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -3
  132. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -3
  133. package/packages/pi-coding-agent/src/modes/interactive/components/embedded-terminal.ts +224 -0
  134. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +45 -0
  135. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -3
  136. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +104 -81
  137. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +5 -19
  138. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +55 -13
  139. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -0
  140. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +2 -0
  141. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +3 -0
  142. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +296 -48
  143. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -2
  144. package/packages/pi-coding-agent/src/utils/terminal-screen.ts +77 -0
  145. package/packages/pi-coding-agent/src/utils/terminal-serializer.ts +72 -0
  146. package/packages/pi-tui/dist/components/__tests__/editor-dropped-image.test.d.ts +2 -0
  147. package/packages/pi-tui/dist/components/__tests__/editor-dropped-image.test.d.ts.map +1 -0
  148. package/packages/pi-tui/dist/components/__tests__/editor-dropped-image.test.js +105 -0
  149. package/packages/pi-tui/dist/components/__tests__/editor-dropped-image.test.js.map +1 -0
  150. package/packages/pi-tui/dist/components/editor.d.ts +4 -0
  151. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  152. package/packages/pi-tui/dist/components/editor.js +57 -3
  153. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  154. package/packages/pi-tui/dist/components/loader.d.ts +26 -6
  155. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  156. package/packages/pi-tui/dist/components/loader.js +178 -18
  157. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  158. package/packages/pi-tui/src/components/editor.ts +65 -3
  159. package/packages/pi-tui/src/components/loader.ts +196 -19
  160. package/pkg/dist/modes/interactive/theme/themes.js +2 -2
  161. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  162. package/pkg/package.json +1 -1
  163. package/src/resources/extensions/async-jobs/async-bash-tool.ts +13 -0
  164. package/src/resources/extensions/async-jobs/await-tool.ts +13 -0
  165. package/src/resources/extensions/async-jobs/cancel-job-tool.ts +8 -0
  166. package/src/resources/extensions/cache-timer/index.ts +102 -96
  167. package/src/resources/extensions/codex-rotate/IMPLEMENTATION.md +18 -13
  168. package/src/resources/extensions/codex-rotate/README.md +9 -3
  169. package/src/resources/extensions/codex-rotate/commands.ts +335 -329
  170. package/src/resources/extensions/codex-rotate/index.ts +85 -75
  171. package/src/resources/extensions/memory/auto-extract.ts +330 -204
  172. package/src/resources/extensions/memory/dream.ts +88 -21
  173. package/src/resources/extensions/memory/tests/auto-extract.test.ts +200 -144
  174. package/src/resources/extensions/shared/rtk.js +112 -0
  175. package/src/resources/extensions/subagent/index.ts +35 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tbashTool,\n\tcreateBashTool,\n\trewriteBackgroundCommand,\n} from \"./bash.js\";\nexport {\n\ttype BashInterceptorRule,\n\tcheckBashInterception,\n\ttype CompiledInterceptor,\n\tcompileInterceptor,\n\tDEFAULT_BASH_INTERCEPTOR_RULES,\n\ttype InterceptionResult,\n} from \"./bash-interceptor.js\";\nexport {\n\tcreateEditTool,\n\ttype EditOperations,\n\ttype EditToolDetails,\n\ttype EditToolInput,\n\ttype EditToolOptions,\n\teditTool,\n} from \"./edit.js\";\nexport {\n\tcreateFindTool,\n\ttype FindOperations,\n\ttype FindToolDetails,\n\ttype FindToolInput,\n\ttype FindToolOptions,\n\tfindTool,\n} from \"./find.js\";\nexport {\n\tcreateGrepTool,\n\ttype GrepOperations,\n\ttype GrepToolDetails,\n\ttype GrepToolInput,\n\ttype GrepToolOptions,\n\tgrepTool,\n} from \"./grep.js\";\nexport {\n\tcreateLsTool,\n\ttype LsOperations,\n\ttype LsToolDetails,\n\ttype LsToolInput,\n\ttype LsToolOptions,\n\tlsTool,\n} from \"./ls.js\";\nexport {\n\tcreateReadTool,\n\ttype ReadOperations,\n\ttype ReadToolDetails,\n\ttype ReadToolInput,\n\ttype ReadToolOptions,\n\treadTool,\n} from \"./read.js\";\nexport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationOptions,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateLine,\n\ttruncateTail,\n} from \"./truncate.js\";\nexport {\n\tcreateWriteTool,\n\ttype WriteOperations,\n\ttype WriteToolInput,\n\ttype WriteToolOptions,\n\twriteTool,\n} from \"./write.js\";\nexport {\n\tcreateHashlineEditTool,\n\ttype HashlineEditInput,\n\ttype HashlineEditItem,\n\ttype HashlineEditOperations,\n\ttype HashlineEditToolDetails,\n\ttype HashlineEditToolOptions,\n\thashlineEditTool,\n} from \"./hashline-edit.js\";\nexport {\n\tcreateHashlineReadTool,\n\ttype HashlineReadOperations,\n\ttype HashlineReadToolDetails,\n\ttype HashlineReadToolInput,\n\ttype HashlineReadToolOptions,\n\thashlineReadTool,\n} from \"./hashline-read.js\";\nexport {\n\ttype Anchor,\n\tapplyHashlineEdits,\n\tcomputeLineHash,\n\tformatHashLines,\n\tformatLineTag,\n\ttype HashlineEdit,\n\tHashlineMismatchError,\n\tparseHashlineText,\n\ttype HashMismatch,\n\tparseTag,\n\tstripNewLinePrefixes,\n\tvalidateLineRef,\n} from \"./hashline.js\";\nexport {\n\tcreateLspTool,\n\ttype LspToolDetails,\n\tlspSchema,\n\tlspTool,\n} from \"../lsp/index.js\";\nexport type { LspServerStatus } from \"../lsp/client.js\";\n\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type BashToolOptions, bashTool, createBashTool } from \"./bash.js\";\nimport { createEditTool, editTool } from \"./edit.js\";\nimport { createFindTool, findTool } from \"./find.js\";\nimport { createGrepTool, grepTool } from \"./grep.js\";\nimport { createHashlineEditTool, hashlineEditTool } from \"./hashline-edit.js\";\nimport { createHashlineReadTool, hashlineReadTool } from \"./hashline-read.js\";\nimport { createLsTool, lsTool } from \"./ls.js\";\nimport { createReadTool, type ReadToolOptions, readTool } from \"./read.js\";\nimport { createWriteTool, writeTool } from \"./write.js\";\nimport { createLspTool, lspTool } from \"../lsp/index.js\";\n\n/** Tool type (AgentTool from pi-ai) */\nexport type Tool = AgentTool<any>;\n\n// Default tools for full access mode (using process.cwd())\nexport const codingTools: Tool[] = [readTool, bashTool, editTool, writeTool];\n\n// Read-only tools for exploration without modification (using process.cwd())\nexport const readOnlyTools: Tool[] = [readTool, grepTool, findTool, lsTool];\n\n// All available tools (using process.cwd())\nexport const allTools = {\n\tread: readTool,\n\tbash: bashTool,\n\tedit: editTool,\n\twrite: writeTool,\n\tgrep: grepTool,\n\tfind: findTool,\n\tls: lsTool,\n\tlsp: lspTool,\n\thashline_edit: hashlineEditTool,\n\thashline_read: hashlineReadTool,\n};\n\n// Hashline-mode coding tools — read with hash anchors, edit with hash references\nexport const hashlineCodingTools: Tool[] = [hashlineReadTool, bashTool, hashlineEditTool, writeTool];\n\nexport type ToolName = keyof typeof allTools;\n\nexport interface ToolsOptions {\n\t/** Options for the read tool */\n\tread?: ReadToolOptions;\n\t/** Options for the bash tool */\n\tbash?: BashToolOptions;\n}\n\n/**\n * Create coding tools configured for a specific working directory.\n */\nexport function createCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n\n/**\n * Create read-only tools configured for a specific working directory.\n */\nexport function createReadOnlyTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [createReadTool(cwd, options?.read), createGrepTool(cwd), createFindTool(cwd), createLsTool(cwd)];\n}\n\n/**\n * Create all tools configured for a specific working directory.\n */\nexport function createAllTools(cwd: string, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn {\n\t\tread: createReadTool(cwd, options?.read),\n\t\tbash: createBashTool(cwd, options?.bash),\n\t\tedit: createEditTool(cwd),\n\t\twrite: createWriteTool(cwd),\n\t\tgrep: createGrepTool(cwd),\n\t\tfind: createFindTool(cwd),\n\t\tls: createLsTool(cwd),\n\t\tlsp: createLspTool(cwd),\n\t\thashline_edit: createHashlineEditTool(cwd),\n\t\thashline_read: createHashlineReadTool(cwd, options?.read),\n\t};\n}\n\n/**\n * Create hashline-mode coding tools configured for a specific working directory.\n * Uses hashline read (LINE#ID prefixed output) and hashline edit (hash-anchor based edits).\n */\nexport function createHashlineCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateHashlineReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateHashlineEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tbashTool,\n\tcreateBashTool,\n\trewriteBackgroundCommand,\n} from \"./bash.js\";\nexport {\n\ttype BashInterceptorRule,\n\tcheckBashInterception,\n\ttype CompiledInterceptor,\n\tcompileInterceptor,\n\tDEFAULT_BASH_INTERCEPTOR_RULES,\n\ttype InterceptionResult,\n} from \"./bash-interceptor.js\";\nexport {\n\tcreateEditTool,\n\ttype EditOperations,\n\ttype EditToolDetails,\n\ttype EditToolInput,\n\ttype EditToolOptions,\n\teditTool,\n} from \"./edit.js\";\nexport {\n\tcreateFindTool,\n\ttype FindOperations,\n\ttype FindToolDetails,\n\ttype FindToolInput,\n\ttype FindToolOptions,\n\tfindTool,\n} from \"./find.js\";\nexport {\n\tcreateGrepTool,\n\ttype GrepOperations,\n\ttype GrepToolDetails,\n\ttype GrepToolInput,\n\ttype GrepToolOptions,\n\tgrepTool,\n} from \"./grep.js\";\nexport {\n\tcreateLsTool,\n\ttype LsOperations,\n\ttype LsToolDetails,\n\ttype LsToolInput,\n\ttype LsToolOptions,\n\tlsTool,\n} from \"./ls.js\";\nexport {\n\tcreateReadTool,\n\ttype ReadOperations,\n\ttype ReadToolDetails,\n\ttype ReadToolInput,\n\ttype ReadToolOptions,\n\treadTool,\n} from \"./read.js\";\nexport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationOptions,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateLine,\n\ttruncateTail,\n} from \"./truncate.js\";\nexport {\n\tcreateWriteTool,\n\ttype WriteOperations,\n\ttype WriteToolInput,\n\ttype WriteToolOptions,\n\twriteTool,\n} from \"./write.js\";\nexport {\n\tcreateHashlineEditTool,\n\ttype HashlineEditInput,\n\ttype HashlineEditItem,\n\ttype HashlineEditOperations,\n\ttype HashlineEditToolDetails,\n\ttype HashlineEditToolOptions,\n\thashlineEditTool,\n} from \"./hashline-edit.js\";\nexport {\n\tcreateHashlineReadTool,\n\ttype HashlineReadOperations,\n\ttype HashlineReadToolDetails,\n\ttype HashlineReadToolInput,\n\ttype HashlineReadToolOptions,\n\thashlineReadTool,\n} from \"./hashline-read.js\";\nexport {\n\tcreatePtyTools,\n\ttype PtyKillInput,\n\ttype PtyReadInput,\n\ttype PtyResizeInput,\n\ttype PtySendInput,\n\ttype PtyStartInput,\n\ttype PtyToolDetails,\n\ttype PtyWaitInput,\n\tptyToolNames,\n} from \"./pty.js\";\nexport {\n\ttype Anchor,\n\tapplyHashlineEdits,\n\tcomputeLineHash,\n\tformatHashLines,\n\tformatLineTag,\n\ttype HashlineEdit,\n\tHashlineMismatchError,\n\tparseHashlineText,\n\ttype HashMismatch,\n\tparseTag,\n\tstripNewLinePrefixes,\n\tvalidateLineRef,\n} from \"./hashline.js\";\nexport {\n\tcreateLspTool,\n\ttype LspToolDetails,\n\tlspSchema,\n\tlspTool,\n} from \"../lsp/index.js\";\nexport type { LspServerStatus } from \"../lsp/client.js\";\n\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type BashToolOptions, bashTool, createBashTool } from \"./bash.js\";\nimport { createEditTool, editTool } from \"./edit.js\";\nimport { createFindTool, findTool } from \"./find.js\";\nimport { createGrepTool, grepTool } from \"./grep.js\";\nimport { createHashlineEditTool, hashlineEditTool } from \"./hashline-edit.js\";\nimport { createHashlineReadTool, hashlineReadTool } from \"./hashline-read.js\";\nimport { createLsTool, lsTool } from \"./ls.js\";\nimport { createPtyTools } from \"./pty.js\";\nimport { createReadTool, type ReadToolOptions, readTool } from \"./read.js\";\nimport { createWriteTool, writeTool } from \"./write.js\";\nimport { createLspTool, lspTool } from \"../lsp/index.js\";\n\n/** Tool type (AgentTool from pi-ai) */\nexport type Tool = AgentTool<any>;\n\n// Default tools for full access mode (using process.cwd())\nexport const codingTools: Tool[] = [readTool, bashTool, editTool, writeTool];\n\n// Read-only tools for exploration without modification (using process.cwd())\nexport const readOnlyTools: Tool[] = [readTool, grepTool, findTool, lsTool];\n\nconst ptyBuiltinTools = createPtyTools(process.cwd());\n\n// All available tools (using process.cwd())\nexport const allTools = {\n\tread: readTool,\n\tbash: bashTool,\n\tedit: editTool,\n\twrite: writeTool,\n\tgrep: grepTool,\n\tfind: findTool,\n\tls: lsTool,\n\tlsp: lspTool,\n\thashline_edit: hashlineEditTool,\n\thashline_read: hashlineReadTool,\n\tpty_start: ptyBuiltinTools.pty_start,\n\tpty_send: ptyBuiltinTools.pty_send,\n\tpty_read: ptyBuiltinTools.pty_read,\n\tpty_wait: ptyBuiltinTools.pty_wait,\n\tpty_resize: ptyBuiltinTools.pty_resize,\n\tpty_kill: ptyBuiltinTools.pty_kill,\n};\n\n// Hashline-mode coding tools — read with hash anchors, edit with hash references\nexport const hashlineCodingTools: Tool[] = [hashlineReadTool, bashTool, hashlineEditTool, writeTool];\n\nexport type ToolName = keyof typeof allTools;\n\nexport interface ToolsOptions {\n\t/** Options for the read tool */\n\tread?: ReadToolOptions;\n\t/** Options for the bash tool */\n\tbash?: BashToolOptions;\n}\n\nfunction addPtyTools<T extends Record<string, Tool>>(target: T, cwd: string): T & Record<string, Tool> {\n\tconst ptyTools = createPtyTools(cwd);\n\treturn {\n\t\t...target,\n\t\tpty_start: ptyTools.pty_start,\n\t\tpty_send: ptyTools.pty_send,\n\t\tpty_read: ptyTools.pty_read,\n\t\tpty_wait: ptyTools.pty_wait,\n\t\tpty_resize: ptyTools.pty_resize,\n\t\tpty_kill: ptyTools.pty_kill,\n\t};\n}\n\n/**\n * Create coding tools configured for a specific working directory.\n */\nexport function createCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n\n/**\n * Create read-only tools configured for a specific working directory.\n */\nexport function createReadOnlyTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [createReadTool(cwd, options?.read), createGrepTool(cwd), createFindTool(cwd), createLsTool(cwd)];\n}\n\n/**\n * Create all tools configured for a specific working directory.\n */\nexport function createAllTools(cwd: string, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn addPtyTools({\n\t\tread: createReadTool(cwd, options?.read),\n\t\tbash: createBashTool(cwd, options?.bash),\n\t\tedit: createEditTool(cwd),\n\t\twrite: createWriteTool(cwd),\n\t\tgrep: createGrepTool(cwd),\n\t\tfind: createFindTool(cwd),\n\t\tls: createLsTool(cwd),\n\t\tlsp: createLspTool(cwd),\n\t\thashline_edit: createHashlineEditTool(cwd),\n\t\thashline_read: createHashlineReadTool(cwd, options?.read),\n\t}, cwd) as Record<ToolName, Tool>;\n}\n\n/**\n * Create hashline-mode coding tools configured for a specific working directory.\n * Uses hashline read (LINE#ID prefixed output) and hashline edit (hash-anchor based edits).\n */\nexport function createHashlineCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateHashlineReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateHashlineEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n"]}
@@ -0,0 +1,50 @@
1
+ import type { AgentTool } from "@gsd/pi-agent-core";
2
+ import { type Static } from "@sinclair/typebox";
3
+ declare const ptyStartSchema: import("@sinclair/typebox").TObject<{
4
+ command: import("@sinclair/typebox").TString;
5
+ cols: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
6
+ rows: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
7
+ loginShell: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
8
+ }>;
9
+ declare const ptySendSchema: import("@sinclair/typebox").TObject<{
10
+ sessionId: import("@sinclair/typebox").TString;
11
+ input: import("@sinclair/typebox").TString;
12
+ }>;
13
+ declare const ptyReadSchema: import("@sinclair/typebox").TObject<{
14
+ sessionId: import("@sinclair/typebox").TString;
15
+ view: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"viewport">, import("@sinclair/typebox").TLiteral<"buffer">]>>;
16
+ }>;
17
+ declare const ptyWaitSchema: import("@sinclair/typebox").TObject<{
18
+ sessionId: import("@sinclair/typebox").TString;
19
+ text: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ view: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"viewport">, import("@sinclair/typebox").TLiteral<"buffer">]>>;
21
+ timeoutMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
22
+ stableMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
23
+ }>;
24
+ declare const ptyResizeSchema: import("@sinclair/typebox").TObject<{
25
+ sessionId: import("@sinclair/typebox").TString;
26
+ cols: import("@sinclair/typebox").TNumber;
27
+ rows: import("@sinclair/typebox").TNumber;
28
+ }>;
29
+ declare const ptyKillSchema: import("@sinclair/typebox").TObject<{
30
+ sessionId: import("@sinclair/typebox").TString;
31
+ }>;
32
+ export type PtyStartInput = Static<typeof ptyStartSchema>;
33
+ export type PtySendInput = Static<typeof ptySendSchema>;
34
+ export type PtyReadInput = Static<typeof ptyReadSchema>;
35
+ export type PtyWaitInput = Static<typeof ptyWaitSchema>;
36
+ export type PtyResizeInput = Static<typeof ptyResizeSchema>;
37
+ export type PtyKillInput = Static<typeof ptyKillSchema>;
38
+ export interface PtyToolDetails {
39
+ sessionId: string;
40
+ pid?: number;
41
+ completed?: boolean;
42
+ cancelled?: boolean;
43
+ exitCode?: number;
44
+ view?: "viewport" | "buffer";
45
+ screenText?: string;
46
+ }
47
+ export declare function createPtyTools(cwd: string): Record<string, AgentTool<any, PtyToolDetails>>;
48
+ export declare const ptyToolNames: readonly ["pty_start", "pty_send", "pty_read", "pty_wait", "pty_resize", "pty_kill"];
49
+ export {};
50
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAStD,QAAA,MAAM,cAAc;;;;;EAKlB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAGjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAMjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;EASjB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;EAInB,CAAC;AAEH,QAAA,MAAM,aAAa;;EAEjB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAexD,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AA2KD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAoG1F;AAED,eAAO,MAAM,YAAY,sFAAuF,CAAC"}
@@ -0,0 +1,289 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { executeBashInPty } from "../pty-executor.js";
4
+ import { createHeadlessTerminal, snapshotTerminalBufferText, snapshotTerminalViewportText, } from "../../utils/terminal-screen.js";
5
+ const ptyStartSchema = Type.Object({
6
+ command: Type.String({ description: "Shell command to start inside the PTY" }),
7
+ cols: Type.Optional(Type.Number({ description: "Terminal width in columns (default 80)" })),
8
+ rows: Type.Optional(Type.Number({ description: "Terminal height in rows (default 24)" })),
9
+ loginShell: Type.Optional(Type.Boolean({ description: "Whether to run the command in a login shell" })),
10
+ });
11
+ const ptySendSchema = Type.Object({
12
+ sessionId: Type.String({ description: "PTY session id from pty_start" }),
13
+ input: Type.String({ description: "Text or control sequence to send, e.g. \"y\\r\" or \"\\u001b[A\"" }),
14
+ });
15
+ const ptyReadSchema = Type.Object({
16
+ sessionId: Type.String({ description: "PTY session id from pty_start" }),
17
+ view: Type.Optional(Type.Union([
18
+ Type.Literal("viewport"),
19
+ Type.Literal("buffer"),
20
+ ], { description: "Read the visible screen (viewport) or the full logical buffer" })),
21
+ });
22
+ const ptyWaitSchema = Type.Object({
23
+ sessionId: Type.String({ description: "PTY session id from pty_start" }),
24
+ text: Type.Optional(Type.String({ description: "Wait until the viewport or buffer contains this text" })),
25
+ view: Type.Optional(Type.Union([
26
+ Type.Literal("viewport"),
27
+ Type.Literal("buffer"),
28
+ ], { description: "Where to search for the text (default viewport)" })),
29
+ timeoutMs: Type.Optional(Type.Number({ description: "How long to wait before timing out (default 30000)" })),
30
+ stableMs: Type.Optional(Type.Number({ description: "If text is omitted, wait until the screen stops changing for this long (default 800)" })),
31
+ });
32
+ const ptyResizeSchema = Type.Object({
33
+ sessionId: Type.String({ description: "PTY session id from pty_start" }),
34
+ cols: Type.Number({ description: "Terminal width in columns" }),
35
+ rows: Type.Number({ description: "Terminal height in rows" }),
36
+ });
37
+ const ptyKillSchema = Type.Object({
38
+ sessionId: Type.String({ description: "PTY session id from pty_start" }),
39
+ });
40
+ class PtySessionManager {
41
+ constructor(cwd) {
42
+ this.cwd = cwd;
43
+ this.sessions = new Map();
44
+ }
45
+ async start(command, options) {
46
+ const id = `pty_${randomUUID().slice(0, 8)}`;
47
+ const terminal = createHeadlessTerminal(options?.cols ?? 80, options?.rows ?? 24, 10000);
48
+ const session = {
49
+ id,
50
+ command,
51
+ pty: undefined,
52
+ terminal,
53
+ writeChain: Promise.resolve(),
54
+ completed: false,
55
+ cancelled: false,
56
+ createdAt: Date.now(),
57
+ lastUpdateAt: Date.now(),
58
+ };
59
+ this.sessions.set(id, session);
60
+ let pty;
61
+ try {
62
+ pty = await executeBashInPty(command, {
63
+ cols: options?.cols,
64
+ rows: options?.rows,
65
+ cwd: this.cwd,
66
+ loginShell: options?.loginShell,
67
+ onChunk: (chunk) => {
68
+ const current = this.sessions.get(id);
69
+ if (!current)
70
+ return;
71
+ current.lastUpdateAt = Date.now();
72
+ current.writeChain = current.writeChain.then(() => new Promise((resolve) => {
73
+ current.terminal.write(chunk, () => resolve());
74
+ }));
75
+ },
76
+ });
77
+ }
78
+ catch (error) {
79
+ this.sessions.delete(id);
80
+ throw error;
81
+ }
82
+ session.pty = pty;
83
+ pty.result
84
+ .then((result) => {
85
+ const current = this.sessions.get(id);
86
+ if (!current)
87
+ return;
88
+ current.completed = true;
89
+ current.cancelled = result.cancelled;
90
+ current.exitCode = result.exitCode;
91
+ current.lastUpdateAt = Date.now();
92
+ })
93
+ .catch(() => {
94
+ const current = this.sessions.get(id);
95
+ if (!current)
96
+ return;
97
+ current.completed = true;
98
+ current.lastUpdateAt = Date.now();
99
+ });
100
+ return session;
101
+ }
102
+ get(sessionId) {
103
+ const session = this.sessions.get(sessionId);
104
+ if (!session) {
105
+ throw new Error(`PTY session not found: ${sessionId}`);
106
+ }
107
+ return session;
108
+ }
109
+ async send(sessionId, input) {
110
+ const session = this.get(sessionId);
111
+ if (session.completed || !session.pty.handle.isActive()) {
112
+ throw new Error(`PTY session is no longer active: ${sessionId}`);
113
+ }
114
+ session.pty.handle.write(input);
115
+ session.lastUpdateAt = Date.now();
116
+ await new Promise((resolve) => setTimeout(resolve, 50));
117
+ return session;
118
+ }
119
+ async resize(sessionId, cols, rows) {
120
+ const session = this.get(sessionId);
121
+ const safeCols = Math.max(20, cols);
122
+ const safeRows = Math.max(5, rows);
123
+ session.pty.handle.resize(safeCols, safeRows);
124
+ session.terminal.resize(safeCols, safeRows);
125
+ session.lastUpdateAt = Date.now();
126
+ return session;
127
+ }
128
+ async kill(sessionId) {
129
+ const session = this.get(sessionId);
130
+ if (session.pty.handle.isActive()) {
131
+ session.pty.handle.kill();
132
+ }
133
+ session.cancelled = true;
134
+ session.completed = true;
135
+ session.lastUpdateAt = Date.now();
136
+ return session;
137
+ }
138
+ async read(sessionId, view = "viewport") {
139
+ const session = this.get(sessionId);
140
+ await session.writeChain;
141
+ const text = view === "buffer"
142
+ ? snapshotTerminalBufferText(session.terminal)
143
+ : snapshotTerminalViewportText(session.terminal);
144
+ return { session, text };
145
+ }
146
+ async wait(sessionId, options) {
147
+ const timeoutMs = Math.max(50, options?.timeoutMs ?? 30000);
148
+ const stableMs = Math.max(50, options?.stableMs ?? 800);
149
+ const view = options?.view ?? "viewport";
150
+ const start = Date.now();
151
+ let lastSnapshot = "";
152
+ let stableSince = Date.now();
153
+ while (Date.now() - start < timeoutMs) {
154
+ const { text } = await this.read(sessionId, view);
155
+ if (options?.text) {
156
+ if (text.includes(options.text)) {
157
+ return { session: this.get(sessionId), text };
158
+ }
159
+ if (this.get(sessionId).completed) {
160
+ return { session: this.get(sessionId), text };
161
+ }
162
+ }
163
+ else {
164
+ if (text !== lastSnapshot) {
165
+ lastSnapshot = text;
166
+ stableSince = Date.now();
167
+ }
168
+ else if (Date.now() - stableSince >= stableMs || this.get(sessionId).completed) {
169
+ return { session: this.get(sessionId), text };
170
+ }
171
+ }
172
+ await new Promise((resolve) => setTimeout(resolve, 100));
173
+ }
174
+ await this.read(sessionId, view);
175
+ throw new Error(options?.text
176
+ ? `Timed out waiting for text in PTY session ${sessionId}: ${options.text}`
177
+ : `Timed out waiting for PTY session ${sessionId} to stabilize`);
178
+ }
179
+ }
180
+ function formatSessionSummary(session) {
181
+ const bits = [`session ${session.id}`, `pid ${session.pty.handle.pid}`];
182
+ if (session.completed) {
183
+ bits.push(session.cancelled ? "cancelled" : `completed${session.exitCode !== undefined ? ` exit ${session.exitCode}` : ""}`);
184
+ }
185
+ else {
186
+ bits.push("running");
187
+ }
188
+ return bits.join(" · ");
189
+ }
190
+ function buildReadText(session, view, text) {
191
+ const header = `[${formatSessionSummary(session)} · ${view}]`;
192
+ return text ? `${header}\n${text}` : `${header}\n(no visible text)`;
193
+ }
194
+ export function createPtyTools(cwd) {
195
+ const manager = new PtySessionManager(cwd);
196
+ const ptyStartTool = {
197
+ name: "pty_start",
198
+ label: "pty_start",
199
+ description: "Start an agent-controlled interactive PTY session. Use this when a command requires terminal interaction, prompts, or a full-screen TUI. Returns a sessionId for follow-up pty_send/pty_read/pty_wait/pty_kill calls.",
200
+ parameters: ptyStartSchema,
201
+ execute: async (_toolCallId, { command, cols, rows, loginShell }) => {
202
+ const session = await manager.start(command, { cols, rows, loginShell });
203
+ const { text } = await manager.read(session.id, "viewport");
204
+ return {
205
+ content: [{ type: "text", text: `Started PTY session ${session.id} for: ${command}\n${buildReadText(session, "viewport", text)}` }],
206
+ details: { sessionId: session.id, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: "viewport", screenText: text },
207
+ };
208
+ },
209
+ };
210
+ const ptySendTool = {
211
+ name: "pty_send",
212
+ label: "pty_send",
213
+ description: "Send text or control sequences to an existing PTY session, e.g. \"y\\r\" or \"\\u001b[A\".",
214
+ parameters: ptySendSchema,
215
+ execute: async (_toolCallId, { sessionId, input }) => {
216
+ const session = await manager.send(sessionId, input);
217
+ const { text } = await manager.read(sessionId, "viewport");
218
+ return {
219
+ content: [{ type: "text", text: `Sent input to ${sessionId}: ${JSON.stringify(input)}\n${buildReadText(session, "viewport", text)}` }],
220
+ details: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: "viewport", screenText: text },
221
+ };
222
+ },
223
+ };
224
+ const ptyReadTool = {
225
+ name: "pty_read",
226
+ label: "pty_read",
227
+ description: "Read the current PTY screen state. Use view='viewport' for the visible screen or view='buffer' for the full logical buffer.",
228
+ parameters: ptyReadSchema,
229
+ execute: async (_toolCallId, { sessionId, view }) => {
230
+ const effectiveView = view ?? "viewport";
231
+ const { session, text } = await manager.read(sessionId, effectiveView);
232
+ return {
233
+ content: [{ type: "text", text: buildReadText(session, effectiveView, text) }],
234
+ details: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: effectiveView, screenText: text },
235
+ };
236
+ },
237
+ };
238
+ const ptyWaitTool = {
239
+ name: "pty_wait",
240
+ label: "pty_wait",
241
+ description: "Wait until text appears in a PTY session or until the PTY screen stops changing. Useful between pty_send calls.",
242
+ parameters: ptyWaitSchema,
243
+ execute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }) => {
244
+ const effectiveView = view ?? "viewport";
245
+ const result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs });
246
+ return {
247
+ content: [{ type: "text", text: buildReadText(result.session, effectiveView, result.text) }],
248
+ details: { sessionId, pid: result.session.pty.handle.pid, completed: result.session.completed, cancelled: result.session.cancelled, exitCode: result.session.exitCode, view: effectiveView, screenText: result.text },
249
+ };
250
+ },
251
+ };
252
+ const ptyResizeTool = {
253
+ name: "pty_resize",
254
+ label: "pty_resize",
255
+ description: "Resize an active PTY session to the given terminal dimensions.",
256
+ parameters: ptyResizeSchema,
257
+ execute: async (_toolCallId, { sessionId, cols, rows }) => {
258
+ const session = await manager.resize(sessionId, cols, rows);
259
+ const { text } = await manager.read(sessionId, "viewport");
260
+ return {
261
+ content: [{ type: "text", text: `Resized ${sessionId} to ${cols}x${rows}\n${buildReadText(session, "viewport", text)}` }],
262
+ details: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: "viewport", screenText: text },
263
+ };
264
+ },
265
+ };
266
+ const ptyKillTool = {
267
+ name: "pty_kill",
268
+ label: "pty_kill",
269
+ description: "Terminate an agent-controlled PTY session.",
270
+ parameters: ptyKillSchema,
271
+ execute: async (_toolCallId, { sessionId }) => {
272
+ const session = await manager.kill(sessionId);
273
+ return {
274
+ content: [{ type: "text", text: `Terminated PTY session ${sessionId}. ${formatSessionSummary(session)}` }],
275
+ details: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode },
276
+ };
277
+ },
278
+ };
279
+ return {
280
+ pty_start: ptyStartTool,
281
+ pty_send: ptySendTool,
282
+ pty_read: ptyReadTool,
283
+ pty_wait: ptyWaitTool,
284
+ pty_resize: ptyResizeTool,
285
+ pty_kill: ptyKillTool,
286
+ };
287
+ }
288
+ export const ptyToolNames = ["pty_start", "pty_send", "pty_read", "pty_wait", "pty_resize", "pty_kill"];
289
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { executeBashInPty, type PtyExecutionSession } from \"../pty-executor.js\";\nimport {\n\tcreateHeadlessTerminal,\n\tsnapshotTerminalBufferText,\n\tsnapshotTerminalViewportText,\n\ttype HeadlessTerminal,\n} from \"../../utils/terminal-screen.js\";\n\nconst ptyStartSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to start inside the PTY\" }),\n\tcols: Type.Optional(Type.Number({ description: \"Terminal width in columns (default 80)\" })),\n\trows: Type.Optional(Type.Number({ description: \"Terminal height in rows (default 24)\" })),\n\tloginShell: Type.Optional(Type.Boolean({ description: \"Whether to run the command in a login shell\" })),\n});\n\nconst ptySendSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tinput: Type.String({ description: \"Text or control sequence to send, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\"\" }),\n});\n\nconst ptyReadSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Read the visible screen (viewport) or the full logical buffer\" })),\n});\n\nconst ptyWaitSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\ttext: Type.Optional(Type.String({ description: \"Wait until the viewport or buffer contains this text\" })),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Where to search for the text (default viewport)\" })),\n\ttimeoutMs: Type.Optional(Type.Number({ description: \"How long to wait before timing out (default 30000)\" })),\n\tstableMs: Type.Optional(Type.Number({ description: \"If text is omitted, wait until the screen stops changing for this long (default 800)\" })),\n});\n\nconst ptyResizeSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tcols: Type.Number({ description: \"Terminal width in columns\" }),\n\trows: Type.Number({ description: \"Terminal height in rows\" }),\n});\n\nconst ptyKillSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n});\n\nexport type PtyStartInput = Static<typeof ptyStartSchema>;\nexport type PtySendInput = Static<typeof ptySendSchema>;\nexport type PtyReadInput = Static<typeof ptyReadSchema>;\nexport type PtyWaitInput = Static<typeof ptyWaitSchema>;\nexport type PtyResizeInput = Static<typeof ptyResizeSchema>;\nexport type PtyKillInput = Static<typeof ptyKillSchema>;\n\ninterface ManagedPtySession {\n\tid: string;\n\tcommand: string;\n\tpty: PtyExecutionSession;\n\tterminal: HeadlessTerminal;\n\twriteChain: Promise<void>;\n\tcompleted: boolean;\n\tcancelled: boolean;\n\texitCode?: number;\n\tcreatedAt: number;\n\tlastUpdateAt: number;\n}\n\nexport interface PtyToolDetails {\n\tsessionId: string;\n\tpid?: number;\n\tcompleted?: boolean;\n\tcancelled?: boolean;\n\texitCode?: number;\n\tview?: \"viewport\" | \"buffer\";\n\tscreenText?: string;\n}\n\nclass PtySessionManager {\n\tprivate sessions = new Map<string, ManagedPtySession>();\n\n\tconstructor(private cwd: string) {}\n\n\tasync start(command: string, options?: { cols?: number; rows?: number; loginShell?: boolean }): Promise<ManagedPtySession> {\n\t\tconst id = `pty_${randomUUID().slice(0, 8)}`;\n\t\tconst terminal = createHeadlessTerminal(options?.cols ?? 80, options?.rows ?? 24, 10000);\n\t\tconst session: ManagedPtySession = {\n\t\t\tid,\n\t\t\tcommand,\n\t\t\tpty: undefined as unknown as PtyExecutionSession,\n\t\t\tterminal,\n\t\t\twriteChain: Promise.resolve(),\n\t\t\tcompleted: false,\n\t\t\tcancelled: false,\n\t\t\tcreatedAt: Date.now(),\n\t\t\tlastUpdateAt: Date.now(),\n\t\t};\n\t\tthis.sessions.set(id, session);\n\n\t\tlet pty: PtyExecutionSession;\n\t\ttry {\n\t\t\tpty = await executeBashInPty(command, {\n\t\t\t\tcols: options?.cols,\n\t\t\t\trows: options?.rows,\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tloginShell: options?.loginShell,\n\t\t\t\tonChunk: (chunk) => {\n\t\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\t\tif (!current) return;\n\t\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t\t\tcurrent.writeChain = current.writeChain.then(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\tcurrent.terminal.write(chunk, () => resolve());\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.sessions.delete(id);\n\t\t\tthrow error;\n\t\t}\n\t\tsession.pty = pty;\n\n\t\tpty.result\n\t\t\t.then((result) => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.cancelled = result.cancelled;\n\t\t\t\tcurrent.exitCode = result.exitCode;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t});\n\n\t\treturn session;\n\t}\n\n\tget(sessionId: string): ManagedPtySession {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\tthrow new Error(`PTY session not found: ${sessionId}`);\n\t\t}\n\t\treturn session;\n\t}\n\n\tasync send(sessionId: string, input: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.completed || !session.pty.handle.isActive()) {\n\t\t\tthrow new Error(`PTY session is no longer active: ${sessionId}`);\n\t\t}\n\t\tsession.pty.handle.write(input);\n\t\tsession.lastUpdateAt = Date.now();\n\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\treturn session;\n\t}\n\n\tasync resize(sessionId: string, cols: number, rows: number): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tconst safeCols = Math.max(20, cols);\n\t\tconst safeRows = Math.max(5, rows);\n\t\tsession.pty.handle.resize(safeCols, safeRows);\n\t\tsession.terminal.resize(safeCols, safeRows);\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync kill(sessionId: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.pty.handle.isActive()) {\n\t\t\tsession.pty.handle.kill();\n\t\t}\n\t\tsession.cancelled = true;\n\t\tsession.completed = true;\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync read(sessionId: string, view: \"viewport\" | \"buffer\" = \"viewport\"): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst session = this.get(sessionId);\n\t\tawait session.writeChain;\n\t\tconst text = view === \"buffer\"\n\t\t\t? snapshotTerminalBufferText(session.terminal)\n\t\t\t: snapshotTerminalViewportText(session.terminal);\n\t\treturn { session, text };\n\t}\n\n\tasync wait(\n\t\tsessionId: string,\n\t\toptions?: { text?: string; view?: \"viewport\" | \"buffer\"; timeoutMs?: number; stableMs?: number },\n\t): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst timeoutMs = Math.max(50, options?.timeoutMs ?? 30000);\n\t\tconst stableMs = Math.max(50, options?.stableMs ?? 800);\n\t\tconst view = options?.view ?? \"viewport\";\n\t\tconst start = Date.now();\n\t\tlet lastSnapshot = \"\";\n\t\tlet stableSince = Date.now();\n\n\t\twhile (Date.now() - start < timeoutMs) {\n\t\t\tconst { text } = await this.read(sessionId, view);\n\t\t\tif (options?.text) {\n\t\t\t\tif (text.includes(options.text)) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t\tif (this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (text !== lastSnapshot) {\n\t\t\t\t\tlastSnapshot = text;\n\t\t\t\t\tstableSince = Date.now();\n\t\t\t\t} else if (Date.now() - stableSince >= stableMs || this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\t\t}\n\n\t\tawait this.read(sessionId, view);\n\t\tthrow new Error(\n\t\t\toptions?.text\n\t\t\t\t? `Timed out waiting for text in PTY session ${sessionId}: ${options.text}`\n\t\t\t\t: `Timed out waiting for PTY session ${sessionId} to stabilize`,\n\t\t);\n\t}\n}\n\nfunction formatSessionSummary(session: ManagedPtySession): string {\n\tconst bits = [`session ${session.id}`, `pid ${session.pty.handle.pid}`];\n\tif (session.completed) {\n\t\tbits.push(session.cancelled ? \"cancelled\" : `completed${session.exitCode !== undefined ? ` exit ${session.exitCode}` : \"\"}`);\n\t} else {\n\t\tbits.push(\"running\");\n\t}\n\treturn bits.join(\" · \");\n}\n\nfunction buildReadText(session: ManagedPtySession, view: \"viewport\" | \"buffer\", text: string): string {\n\tconst header = `[${formatSessionSummary(session)} · ${view}]`;\n\treturn text ? `${header}\\n${text}` : `${header}\\n(no visible text)`;\n}\n\nexport function createPtyTools(cwd: string): Record<string, AgentTool<any, PtyToolDetails>> {\n\tconst manager = new PtySessionManager(cwd);\n\n\tconst ptyStartTool: AgentTool<typeof ptyStartSchema, PtyToolDetails> = {\n\t\tname: \"pty_start\",\n\t\tlabel: \"pty_start\",\n\t\tdescription: \"Start an agent-controlled interactive PTY session. Use this when a command requires terminal interaction, prompts, or a full-screen TUI. Returns a sessionId for follow-up pty_send/pty_read/pty_wait/pty_kill calls.\",\n\t\tparameters: ptyStartSchema,\n\t\texecute: async (_toolCallId, { command, cols, rows, loginShell }) => {\n\t\t\tconst session = await manager.start(command, { cols, rows, loginShell });\n\t\t\tconst { text } = await manager.read(session.id, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Started PTY session ${session.id} for: ${command}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId: session.id, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptySendTool: AgentTool<typeof ptySendSchema, PtyToolDetails> = {\n\t\tname: \"pty_send\",\n\t\tlabel: \"pty_send\",\n\t\tdescription: \"Send text or control sequences to an existing PTY session, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\".\",\n\t\tparameters: ptySendSchema,\n\t\texecute: async (_toolCallId, { sessionId, input }) => {\n\t\t\tconst session = await manager.send(sessionId, input);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Sent input to ${sessionId}: ${JSON.stringify(input)}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyReadTool: AgentTool<typeof ptyReadSchema, PtyToolDetails> = {\n\t\tname: \"pty_read\",\n\t\tlabel: \"pty_read\",\n\t\tdescription: \"Read the current PTY screen state. Use view='viewport' for the visible screen or view='buffer' for the full logical buffer.\",\n\t\tparameters: ptyReadSchema,\n\t\texecute: async (_toolCallId, { sessionId, view }) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst { session, text } = await manager.read(sessionId, effectiveView);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(session, effectiveView, text) }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: effectiveView, screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyWaitTool: AgentTool<typeof ptyWaitSchema, PtyToolDetails> = {\n\t\tname: \"pty_wait\",\n\t\tlabel: \"pty_wait\",\n\t\tdescription: \"Wait until text appears in a PTY session or until the PTY screen stops changing. Useful between pty_send calls.\",\n\t\tparameters: ptyWaitSchema,\n\t\texecute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs });\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(result.session, effectiveView, result.text) }],\n\t\t\t\tdetails: { sessionId, pid: result.session.pty.handle.pid, completed: result.session.completed, cancelled: result.session.cancelled, exitCode: result.session.exitCode, view: effectiveView, screenText: result.text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyResizeTool: AgentTool<typeof ptyResizeSchema, PtyToolDetails> = {\n\t\tname: \"pty_resize\",\n\t\tlabel: \"pty_resize\",\n\t\tdescription: \"Resize an active PTY session to the given terminal dimensions.\",\n\t\tparameters: ptyResizeSchema,\n\t\texecute: async (_toolCallId, { sessionId, cols, rows }) => {\n\t\t\tconst session = await manager.resize(sessionId, cols, rows);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Resized ${sessionId} to ${cols}x${rows}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyKillTool: AgentTool<typeof ptyKillSchema, PtyToolDetails> = {\n\t\tname: \"pty_kill\",\n\t\tlabel: \"pty_kill\",\n\t\tdescription: \"Terminate an agent-controlled PTY session.\",\n\t\tparameters: ptyKillSchema,\n\t\texecute: async (_toolCallId, { sessionId }) => {\n\t\t\tconst session = await manager.kill(sessionId);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Terminated PTY session ${sessionId}. ${formatSessionSummary(session)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode },\n\t\t\t};\n\t\t},\n\t};\n\n\treturn {\n\t\tpty_start: ptyStartTool,\n\t\tpty_send: ptySendTool,\n\t\tpty_read: ptyReadTool,\n\t\tpty_wait: ptyWaitTool,\n\t\tpty_resize: ptyResizeTool,\n\t\tpty_kill: ptyKillTool,\n\t};\n}\n\nexport const ptyToolNames = [\"pty_start\", \"pty_send\", \"pty_read\", \"pty_wait\", \"pty_resize\", \"pty_kill\"] as const;\n"]}
@@ -7,12 +7,14 @@ import { type TimestampFormat } from "./timestamp.js";
7
7
  export declare class AssistantMessageComponent extends Container {
8
8
  private contentContainer;
9
9
  private hideThinkingBlock;
10
+ private thinkingLevel;
10
11
  private markdownTheme;
11
12
  private lastMessage?;
12
13
  private timestampFormat;
13
- constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, timestampFormat?: TimestampFormat);
14
+ constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, timestampFormat?: TimestampFormat, thinkingLevel?: string);
14
15
  invalidate(): void;
15
16
  setHideThinkingBlock(hide: boolean): void;
17
+ setThinkingLevel(level: string): void;
16
18
  updateContent(message: AssistantMessage): void;
17
19
  }
18
20
  //# sourceMappingURL=assistant-message.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAgB,MAAM,aAAa,CAAC;AAEpF,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,eAAe,CAAkB;gBAGxC,OAAO,CAAC,EAAE,gBAAgB,EAC1B,iBAAiB,UAAQ,EACzB,aAAa,GAAE,aAAkC,EACjD,eAAe,GAAE,eAAiC;IAiB1C,UAAU,IAAI,IAAI;IAO3B,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;CA8E9C"}
1
+ {"version":3,"file":"assistant-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAgB,MAAM,aAAa,CAAC;AAEpF,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACvD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,eAAe,CAAkB;gBAGxC,OAAO,CAAC,EAAE,gBAAgB,EAC1B,iBAAiB,UAAQ,EACzB,aAAa,GAAE,aAAkC,EACjD,eAAe,GAAE,eAAiC,EAClD,aAAa,SAAQ;IAkBb,UAAU,IAAI,IAAI;IAO3B,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;CAoF9C"}
@@ -4,9 +4,10 @@ import { getMarkdownTheme, theme } from "../theme/theme.js";
4
4
  * Component that renders a complete assistant message
5
5
  */
6
6
  export class AssistantMessageComponent extends Container {
7
- constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme(), timestampFormat = "date-time-iso") {
7
+ constructor(message, hideThinkingBlock = false, markdownTheme = getMarkdownTheme(), timestampFormat = "date-time-iso", thinkingLevel = "off") {
8
8
  super();
9
9
  this.hideThinkingBlock = hideThinkingBlock;
10
+ this.thinkingLevel = thinkingLevel;
10
11
  this.markdownTheme = markdownTheme;
11
12
  this.timestampFormat = timestampFormat;
12
13
  // Container for text/thinking content
@@ -25,44 +26,57 @@ export class AssistantMessageComponent extends Container {
25
26
  setHideThinkingBlock(hide) {
26
27
  this.hideThinkingBlock = hide;
27
28
  }
29
+ setThinkingLevel(level) {
30
+ this.thinkingLevel = level;
31
+ }
28
32
  updateContent(message) {
29
33
  this.lastMessage = message;
30
34
  // Clear content container
31
35
  this.contentContainer.clear();
32
- const hasVisibleContent = message.content.some((c) => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()));
36
+ const hasVisibleContent = message.content.some((c) => {
37
+ if (c.type === "text")
38
+ return Boolean(c.text.trim());
39
+ if (c.type === "thinking")
40
+ return !this.hideThinkingBlock && Boolean(c.thinking.trim());
41
+ return false;
42
+ });
33
43
  if (hasVisibleContent) {
34
44
  this.contentContainer.addChild(new Spacer(1));
35
45
  }
36
46
  // Render content in order
47
+ let markerAdded = false;
48
+ const responseMarker = `${theme.fg("accent", "●")} `;
37
49
  for (let i = 0; i < message.content.length; i++) {
38
50
  const content = message.content[i];
39
51
  if (content.type === "text" && content.text.trim()) {
40
52
  // Assistant text messages with no background - trim the text
41
53
  // Set paddingY=0 to avoid extra spacing before tool executions
42
- this.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, this.markdownTheme));
54
+ const text = content.text.trim();
55
+ const withMarker = markerAdded ? text : `${responseMarker}${text}`;
56
+ this.contentContainer.addChild(new Markdown(withMarker, 1, 0, this.markdownTheme));
57
+ markerAdded = true;
43
58
  }
44
59
  else if (content.type === "thinking" && content.thinking.trim()) {
45
- // Add spacing only when another visible assistant content block follows.
46
- // This avoids a superfluous blank line before separately-rendered tool execution blocks.
47
- const hasVisibleContentAfter = message.content
48
- .slice(i + 1)
49
- .some((c) => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()));
50
60
  if (this.hideThinkingBlock) {
51
- // Show static "Thinking..." label when hidden
52
- this.contentContainer.addChild(new Text(theme.italic(theme.fg("thinkingText", "Thinking...")), 1, 0));
53
- if (hasVisibleContentAfter) {
54
- this.contentContainer.addChild(new Spacer(1));
55
- }
61
+ // Hide thinking content entirely when hide-thinking is enabled.
62
+ continue;
56
63
  }
57
- else {
58
- // Thinking traces in thinkingText color, italic
59
- this.contentContainer.addChild(new Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {
60
- color: (text) => theme.fg("thinkingText", text),
61
- italic: true,
62
- }));
63
- if (hasVisibleContentAfter) {
64
- this.contentContainer.addChild(new Spacer(1));
65
- }
64
+ // Add spacing only when another visible assistant content block follows.
65
+ // This avoids a superfluous blank line before separately-rendered tool execution blocks.
66
+ const hasVisibleContentAfter = message.content.slice(i + 1).some((c) => {
67
+ if (c.type === "text")
68
+ return Boolean(c.text.trim());
69
+ if (c.type === "thinking")
70
+ return !this.hideThinkingBlock && Boolean(c.thinking.trim());
71
+ return false;
72
+ });
73
+ // Thinking traces in thinkingText color, italic
74
+ this.contentContainer.addChild(new Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {
75
+ color: (text) => theme.fg("thinkingText", text),
76
+ italic: true,
77
+ }));
78
+ if (hasVisibleContentAfter) {
79
+ this.contentContainer.addChild(new Spacer(1));
66
80
  }
67
81
  }
68
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@gsd/pi-ai\";\nimport { Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@gsd/pi-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\n/**\n * Component that renders a complete assistant message\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate timestampFormat: TimestampFormat;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\ttimestampFormat: TimestampFormat = \"date-time-iso\",\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.timestampFormat = timestampFormat;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\n\t\tconst hasVisibleContent = message.content.some(\n\t\t\t(c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()),\n\t\t);\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tthis.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, this.markdownTheme));\n\t\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content\n\t\t\t\t\t.slice(i + 1)\n\t\t\t\t\t.some((c) => (c.type === \"text\" && c.text.trim()) || (c.type === \"thinking\" && c.thinking.trim()));\n\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Show static \"Thinking...\" label when hidden\n\t\t\t\t\tthis.contentContainer.addChild(new Text(theme.italic(theme.fg(\"thinkingText\", \"Thinking...\")), 1, 0));\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Thinking traces in thinkingText color, italic\n\t\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\t\tnew Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {\n\t\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\t\titalic: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if aborted - show after partial content\n\t\t// But only if there are no tool calls (tool execution components will show the error)\n\t\tconst hasToolCalls = message.content.some((c) => c.type === \"toolCall\");\n\t\tif (!hasToolCalls) {\n\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\tconst abortMessage =\n\t\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t} else {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t}\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", abortMessage), 1, 0));\n\t\t\t} else if (message.stopReason === \"error\") {\n\t\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", `Error: ${errorMsg}`), 1, 0));\n\t\t\t}\n\t\t}\n\n\t\t// Timestamp display removed\n\t\t// Show timestamp when the message is complete (has a stop reason)\n\t\t// if (message.stopReason && message.timestamp) {\n\t\t// \tconst timeStr = formatTimestamp(message.timestamp, this.timestampFormat);\n\t\t// \tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", timeStr), 1, 0));\n\t\t// }\n\t}\n}\n"]}
1
+ {"version":3,"file":"assistant-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/assistant-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@gsd/pi-ai\";\nimport { Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@gsd/pi-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\n/**\n * Component that renders a complete assistant message\n */\nexport class AssistantMessageComponent extends Container {\n\tprivate contentContainer: Container;\n\tprivate hideThinkingBlock: boolean;\n\tprivate thinkingLevel: string;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate lastMessage?: AssistantMessage;\n\tprivate timestampFormat: TimestampFormat;\n\n\tconstructor(\n\t\tmessage?: AssistantMessage,\n\t\thideThinkingBlock = false,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\ttimestampFormat: TimestampFormat = \"date-time-iso\",\n\t\tthinkingLevel = \"off\",\n\t) {\n\t\tsuper();\n\n\t\tthis.hideThinkingBlock = hideThinkingBlock;\n\t\tthis.thinkingLevel = thinkingLevel;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.timestampFormat = timestampFormat;\n\n\t\t// Container for text/thinking content\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\tif (message) {\n\t\t\tthis.updateContent(message);\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tif (this.lastMessage) {\n\t\t\tthis.updateContent(this.lastMessage);\n\t\t}\n\t}\n\n\tsetHideThinkingBlock(hide: boolean): void {\n\t\tthis.hideThinkingBlock = hide;\n\t}\n\n\tsetThinkingLevel(level: string): void {\n\t\tthis.thinkingLevel = level;\n\t}\n\n\tupdateContent(message: AssistantMessage): void {\n\t\tthis.lastMessage = message;\n\n\t\t// Clear content container\n\t\tthis.contentContainer.clear();\n\n\t\tconst hasVisibleContent = message.content.some((c) => {\n\t\t\tif (c.type === \"text\") return Boolean(c.text.trim());\n\t\t\tif (c.type === \"thinking\") return !this.hideThinkingBlock && Boolean(c.thinking.trim());\n\t\t\treturn false;\n\t\t});\n\n\t\tif (hasVisibleContent) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t}\n\n\t\t// Render content in order\n\t\tlet markerAdded = false;\n\t\tconst responseMarker = `${theme.fg(\"accent\", \"●\")} `;\n\t\tfor (let i = 0; i < message.content.length; i++) {\n\t\t\tconst content = message.content[i];\n\t\t\tif (content.type === \"text\" && content.text.trim()) {\n\t\t\t\t// Assistant text messages with no background - trim the text\n\t\t\t\t// Set paddingY=0 to avoid extra spacing before tool executions\n\t\t\t\tconst text = content.text.trim();\n\t\t\t\tconst withMarker = markerAdded ? text : `${responseMarker}${text}`;\n\t\t\t\tthis.contentContainer.addChild(new Markdown(withMarker, 1, 0, this.markdownTheme));\n\t\t\t\tmarkerAdded = true;\n\t\t\t} else if (content.type === \"thinking\" && content.thinking.trim()) {\n\t\t\t\tif (this.hideThinkingBlock) {\n\t\t\t\t\t// Hide thinking content entirely when hide-thinking is enabled.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Add spacing only when another visible assistant content block follows.\n\t\t\t\t// This avoids a superfluous blank line before separately-rendered tool execution blocks.\n\t\t\t\tconst hasVisibleContentAfter = message.content.slice(i + 1).some((c) => {\n\t\t\t\t\tif (c.type === \"text\") return Boolean(c.text.trim());\n\t\t\t\t\tif (c.type === \"thinking\") return !this.hideThinkingBlock && Boolean(c.thinking.trim());\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\n\t\t\t\t// Thinking traces in thinkingText color, italic\n\t\t\t\tthis.contentContainer.addChild(\n\t\t\t\t\tnew Markdown(content.thinking.trim(), 1, 0, this.markdownTheme, {\n\t\t\t\t\t\tcolor: (text: string) => theme.fg(\"thinkingText\", text),\n\t\t\t\t\t\titalic: true,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tif (hasVisibleContentAfter) {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check if aborted - show after partial content\n\t\t// But only if there are no tool calls (tool execution components will show the error)\n\t\tconst hasToolCalls = message.content.some((c) => c.type === \"toolCall\");\n\t\tif (!hasToolCalls) {\n\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\tconst abortMessage =\n\t\t\t\t\tmessage.errorMessage && message.errorMessage !== \"Request was aborted\"\n\t\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t} else {\n\t\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\t}\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", abortMessage), 1, 0));\n\t\t\t} else if (message.stopReason === \"error\") {\n\t\t\t\tconst errorMsg = message.errorMessage || \"Unknown error\";\n\t\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"error\", `Error: ${errorMsg}`), 1, 0));\n\t\t\t}\n\t\t}\n\n\t\t// Timestamp display removed\n\t\t// Show timestamp when the message is complete (has a stop reason)\n\t\t// if (message.stopReason && message.timestamp) {\n\t\t// \tconst timeStr = formatTimestamp(message.timestamp, this.timestampFormat);\n\t\t// \tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", timeStr), 1, 0));\n\t\t// }\n\t}\n}\n"]}