@code-yeongyu/senpi 2026.5.13 → 2026.5.15-2

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 (274) hide show
  1. package/CHANGELOG.md +1109 -1150
  2. package/README.md +1 -2
  3. package/dist/core/agent-session.d.ts +9 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +121 -12
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/bash-executor.d.ts.map +1 -1
  8. package/dist/core/bash-executor.js +1 -1
  9. package/dist/core/bash-executor.js.map +1 -1
  10. package/dist/core/compaction/compaction.d.ts.map +1 -1
  11. package/dist/core/compaction/compaction.js +2 -2
  12. package/dist/core/compaction/compaction.js.map +1 -1
  13. package/dist/core/dynamic-prompt/verification.d.ts +31 -0
  14. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  15. package/dist/core/dynamic-prompt/verification.js +41 -0
  16. package/dist/core/dynamic-prompt/verification.js.map +1 -1
  17. package/dist/core/export-html/index.d.ts.map +1 -1
  18. package/dist/core/export-html/index.js +8 -1
  19. package/dist/core/export-html/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/anthropic-web-search/index.js +20 -0
  22. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  23. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/compaction/index.js +157 -29
  25. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  26. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +197 -0
  27. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -0
  28. package/dist/core/extensions/builtin/compaction/openai-remote.js +690 -0
  29. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -0
  30. package/dist/core/extensions/builtin/compaction/prompts.d.ts +3 -3
  31. package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/compaction/prompts.js +0 -22
  33. package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
  34. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts +4 -0
  35. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -0
  36. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js +48 -0
  37. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -0
  38. package/dist/core/extensions/builtin/compaction/speculative.d.ts +3 -1
  39. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/speculative.js +82 -33
  41. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  42. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +8 -0
  43. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/compaction/todo-bridge.js +12 -6
  45. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  46. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/index.js +0 -20
  48. package/dist/core/extensions/builtin/index.js.map +1 -1
  49. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/openai-web-search/index.js +28 -0
  51. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/permission-system/prompt.js +0 -5
  54. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  55. package/dist/core/extensions/builtin/system-messages.d.ts +7 -7
  56. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/system-messages.js +10 -10
  58. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  59. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +1 -1
  60. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/todotools/continuation/prompt.js +1 -1
  62. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  63. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  64. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/todotools/state.js +2 -2
  66. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  67. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +3 -3
  68. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/todotools/system-messages.js +6 -6
  70. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  71. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts +1 -1
  72. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/tool-pair-guard/index.js +8 -4
  74. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  75. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts +3 -0
  76. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js +89 -0
  78. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -0
  79. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts +3 -0
  80. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -0
  81. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js +122 -0
  82. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -0
  83. package/dist/core/extensions/loader.d.ts.map +1 -1
  84. package/dist/core/extensions/loader.js +2 -0
  85. package/dist/core/extensions/loader.js.map +1 -1
  86. package/dist/core/extensions/runner.d.ts +3 -0
  87. package/dist/core/extensions/runner.d.ts.map +1 -1
  88. package/dist/core/extensions/runner.js +18 -0
  89. package/dist/core/extensions/runner.js.map +1 -1
  90. package/dist/core/extensions/types.d.ts +22 -0
  91. package/dist/core/extensions/types.d.ts.map +1 -1
  92. package/dist/core/extensions/types.js.map +1 -1
  93. package/dist/core/messages.d.ts +3 -3
  94. package/dist/core/messages.d.ts.map +1 -1
  95. package/dist/core/messages.js +5 -10
  96. package/dist/core/messages.js.map +1 -1
  97. package/dist/core/resource-loader.d.ts.map +1 -1
  98. package/dist/core/resource-loader.js +0 -9
  99. package/dist/core/resource-loader.js.map +1 -1
  100. package/dist/core/sdk.d.ts +2 -2
  101. package/dist/core/sdk.d.ts.map +1 -1
  102. package/dist/core/sdk.js +8 -23
  103. package/dist/core/sdk.js.map +1 -1
  104. package/dist/core/session-manager.d.ts.map +1 -1
  105. package/dist/core/session-manager.js +1 -1
  106. package/dist/core/session-manager.js.map +1 -1
  107. package/dist/core/settings-manager.d.ts +0 -5
  108. package/dist/core/settings-manager.d.ts.map +1 -1
  109. package/dist/core/settings-manager.js.map +1 -1
  110. package/dist/core/thinking-levels.d.ts +6 -0
  111. package/dist/core/thinking-levels.d.ts.map +1 -0
  112. package/dist/core/thinking-levels.js +36 -0
  113. package/dist/core/thinking-levels.js.map +1 -0
  114. package/dist/core/tools/bash.d.ts.map +1 -1
  115. package/dist/core/tools/bash.js +15 -1
  116. package/dist/core/tools/bash.js.map +1 -1
  117. package/dist/core/tools/render-utils.d.ts.map +1 -1
  118. package/dist/core/tools/render-utils.js +1 -1
  119. package/dist/core/tools/render-utils.js.map +1 -1
  120. package/dist/main.d.ts.map +1 -1
  121. package/dist/main.js +3 -2
  122. package/dist/main.js.map +1 -1
  123. package/dist/modes/interactive/components/assistant-message.d.ts +0 -3
  124. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/assistant-message.js +3 -22
  126. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  127. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/bash-execution.js +1 -1
  129. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  130. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/compaction-summary-message.js +20 -2
  132. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  133. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  134. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  135. package/dist/modes/interactive/components/extension-selector.js +6 -1
  136. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  137. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  138. package/dist/modes/interactive/components/keybinding-hints.js +3 -1
  139. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  140. package/dist/modes/interactive/interactive-mode.d.ts +23 -0
  141. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  142. package/dist/modes/interactive/interactive-mode.js +139 -54
  143. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  144. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  145. package/dist/modes/interactive/theme/theme.js +2 -2
  146. package/dist/modes/interactive/theme/theme.js.map +1 -1
  147. package/dist/modes/print-mode.d.ts.map +1 -1
  148. package/dist/modes/print-mode.js +3 -11
  149. package/dist/modes/print-mode.js.map +1 -1
  150. package/dist/modes/provider-native-rendering.d.ts +5 -0
  151. package/dist/modes/provider-native-rendering.d.ts.map +1 -0
  152. package/dist/modes/provider-native-rendering.js +247 -0
  153. package/dist/modes/provider-native-rendering.js.map +1 -0
  154. package/dist/utils/ansi.d.ts +2 -0
  155. package/dist/utils/ansi.d.ts.map +1 -0
  156. package/dist/utils/ansi.js +52 -0
  157. package/dist/utils/ansi.js.map +1 -0
  158. package/dist/utils/html.d.ts +7 -0
  159. package/dist/utils/html.d.ts.map +1 -0
  160. package/dist/utils/html.js +40 -0
  161. package/dist/utils/html.js.map +1 -0
  162. package/dist/utils/mime.d.ts +1 -0
  163. package/dist/utils/mime.d.ts.map +1 -1
  164. package/dist/utils/mime.js +59 -16
  165. package/dist/utils/mime.js.map +1 -1
  166. package/dist/utils/syntax-highlight.d.ts +12 -0
  167. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  168. package/dist/utils/syntax-highlight.js +118 -0
  169. package/dist/utils/syntax-highlight.js.map +1 -0
  170. package/dist/utils/tools-manager.d.ts.map +1 -1
  171. package/dist/utils/tools-manager.js +76 -7
  172. package/dist/utils/tools-manager.js.map +1 -1
  173. package/docs/extensions.md +0 -1
  174. package/docs/index.md +0 -1
  175. package/docs/sdk.md +25 -44
  176. package/docs/settings.md +1 -29
  177. package/docs/termux.md +2 -2
  178. package/docs/usage.md +1 -1
  179. package/examples/README.md +1 -1
  180. package/examples/extensions/README.md +0 -1
  181. package/examples/extensions/overlay-qa-tests.ts +1 -1
  182. package/examples/sdk/01-minimal.ts +14 -10
  183. package/examples/sdk/02-custom-model.ts +12 -8
  184. package/examples/sdk/03-custom-prompt.ts +24 -16
  185. package/examples/sdk/04-skills.ts +2 -2
  186. package/examples/sdk/05-tools.ts +8 -4
  187. package/examples/sdk/06-extensions.ts +11 -7
  188. package/examples/sdk/07-context-files.ts +2 -2
  189. package/examples/sdk/08-prompt-templates.ts +2 -2
  190. package/examples/sdk/09-api-keys-and-oauth.ts +8 -4
  191. package/examples/sdk/10-settings.ts +4 -4
  192. package/examples/sdk/11-sessions.ts +4 -0
  193. package/examples/sdk/12-full-control.ts +11 -7
  194. package/examples/sdk/README.md +6 -9
  195. package/package.json +7 -12
  196. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts +0 -7
  197. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts.map +0 -1
  198. package/dist/core/extensions/builtin/anthropic-code-execution/index.js +0 -79
  199. package/dist/core/extensions/builtin/anthropic-code-execution/index.js.map +0 -1
  200. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts +0 -53
  201. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts.map +0 -1
  202. package/dist/core/extensions/builtin/anthropic-computer-use/index.js +0 -676
  203. package/dist/core/extensions/builtin/anthropic-computer-use/index.js.map +0 -1
  204. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts +0 -25
  205. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts.map +0 -1
  206. package/dist/core/extensions/builtin/anthropic-text-editor/index.js +0 -244
  207. package/dist/core/extensions/builtin/anthropic-text-editor/index.js.map +0 -1
  208. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts +0 -6
  209. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts.map +0 -1
  210. package/dist/core/extensions/builtin/anthropic-tool-search/index.js +0 -112
  211. package/dist/core/extensions/builtin/anthropic-tool-search/index.js.map +0 -1
  212. package/dist/core/extensions/builtin/background-task/cancel-tool.d.ts +0 -10
  213. package/dist/core/extensions/builtin/background-task/cancel-tool.d.ts.map +0 -1
  214. package/dist/core/extensions/builtin/background-task/cancel-tool.js +0 -109
  215. package/dist/core/extensions/builtin/background-task/cancel-tool.js.map +0 -1
  216. package/dist/core/extensions/builtin/background-task/index.d.ts +0 -3
  217. package/dist/core/extensions/builtin/background-task/index.d.ts.map +0 -1
  218. package/dist/core/extensions/builtin/background-task/index.js +0 -207
  219. package/dist/core/extensions/builtin/background-task/index.js.map +0 -1
  220. package/dist/core/extensions/builtin/background-task/manager.d.ts +0 -17
  221. package/dist/core/extensions/builtin/background-task/manager.d.ts.map +0 -1
  222. package/dist/core/extensions/builtin/background-task/manager.js +0 -114
  223. package/dist/core/extensions/builtin/background-task/manager.js.map +0 -1
  224. package/dist/core/extensions/builtin/background-task/notification.d.ts +0 -22
  225. package/dist/core/extensions/builtin/background-task/notification.d.ts.map +0 -1
  226. package/dist/core/extensions/builtin/background-task/notification.js +0 -105
  227. package/dist/core/extensions/builtin/background-task/notification.js.map +0 -1
  228. package/dist/core/extensions/builtin/background-task/output-tool.d.ts +0 -11
  229. package/dist/core/extensions/builtin/background-task/output-tool.d.ts.map +0 -1
  230. package/dist/core/extensions/builtin/background-task/output-tool.js +0 -127
  231. package/dist/core/extensions/builtin/background-task/output-tool.js.map +0 -1
  232. package/dist/core/extensions/builtin/background-task/spawner.d.ts +0 -8
  233. package/dist/core/extensions/builtin/background-task/spawner.d.ts.map +0 -1
  234. package/dist/core/extensions/builtin/background-task/spawner.js +0 -207
  235. package/dist/core/extensions/builtin/background-task/spawner.js.map +0 -1
  236. package/dist/core/extensions/builtin/background-task/task-tool.d.ts +0 -20
  237. package/dist/core/extensions/builtin/background-task/task-tool.d.ts.map +0 -1
  238. package/dist/core/extensions/builtin/background-task/task-tool.js +0 -302
  239. package/dist/core/extensions/builtin/background-task/task-tool.js.map +0 -1
  240. package/dist/core/extensions/builtin/background-task/types.d.ts +0 -72
  241. package/dist/core/extensions/builtin/background-task/types.d.ts.map +0 -1
  242. package/dist/core/extensions/builtin/background-task/types.js +0 -32
  243. package/dist/core/extensions/builtin/background-task/types.js.map +0 -1
  244. package/dist/core/extensions/builtin/google-code-execution/index.d.ts +0 -7
  245. package/dist/core/extensions/builtin/google-code-execution/index.d.ts.map +0 -1
  246. package/dist/core/extensions/builtin/google-code-execution/index.js +0 -73
  247. package/dist/core/extensions/builtin/google-code-execution/index.js.map +0 -1
  248. package/dist/core/extensions/builtin/google-google-search/index.d.ts +0 -7
  249. package/dist/core/extensions/builtin/google-google-search/index.d.ts.map +0 -1
  250. package/dist/core/extensions/builtin/google-google-search/index.js +0 -83
  251. package/dist/core/extensions/builtin/google-google-search/index.js.map +0 -1
  252. package/dist/core/extensions/builtin/google-url-context/index.d.ts +0 -7
  253. package/dist/core/extensions/builtin/google-url-context/index.d.ts.map +0 -1
  254. package/dist/core/extensions/builtin/google-url-context/index.js +0 -82
  255. package/dist/core/extensions/builtin/google-url-context/index.js.map +0 -1
  256. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts +0 -6
  257. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts.map +0 -1
  258. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js +0 -57
  259. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js.map +0 -1
  260. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts +0 -10
  261. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts.map +0 -1
  262. package/dist/core/extensions/builtin/openai-code-interpreter/index.js +0 -95
  263. package/dist/core/extensions/builtin/openai-code-interpreter/index.js.map +0 -1
  264. package/docs/agents.md +0 -348
  265. package/examples/extensions/subagent/README.md +0 -172
  266. package/examples/extensions/subagent/agents/planner.md +0 -37
  267. package/examples/extensions/subagent/agents/reviewer.md +0 -35
  268. package/examples/extensions/subagent/agents/scout.md +0 -50
  269. package/examples/extensions/subagent/agents/worker.md +0 -24
  270. package/examples/extensions/subagent/agents.ts +0 -126
  271. package/examples/extensions/subagent/index.ts +0 -987
  272. package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
  273. package/examples/extensions/subagent/prompts/implement.md +0 -10
  274. package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-computer-use/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Api, TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { AgentToolResult, ExtensionAPI } from \"../../types.js\";\n\nconst execFileAsync = promisify(execFile);\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst ANTHROPIC_COMPUTER_USE_ENV = \"PI_ANTHROPIC_COMPUTER_USE\";\nconst ANTHROPIC_COMPUTER_USE_WIDTH_ENV = \"PI_ANTHROPIC_COMPUTER_USE_WIDTH\";\nconst ANTHROPIC_COMPUTER_USE_HEIGHT_ENV = \"PI_ANTHROPIC_COMPUTER_USE_HEIGHT\";\nconst ANTHROPIC_COMPUTER_USE_DISPLAY_NUMBER_ENV = \"PI_ANTHROPIC_COMPUTER_USE_DISPLAY_NUMBER\";\nconst ANTHROPIC_COMPUTER_USE_BETA = \"computer-use-2025-01-24\";\n\nconst ANTHROPIC_NATIVE_COMPUTER_TOOL_TYPE = \"computer_20250124\";\nconst ANTHROPIC_NATIVE_COMPUTER_TOOL_NAME = \"computer\";\n\nexport const computerSchema = Type.Object({\n\taction: Type.Union([\n\t\tType.Literal(\"screenshot\"),\n\t\tType.Literal(\"key\"),\n\t\tType.Literal(\"type\"),\n\t\tType.Literal(\"mouse_move\"),\n\t\tType.Literal(\"left_click\"),\n\t\tType.Literal(\"right_click\"),\n\t\tType.Literal(\"middle_click\"),\n\t\tType.Literal(\"double_click\"),\n\t\tType.Literal(\"triple_click\"),\n\t\tType.Literal(\"left_click_drag\"),\n\t\tType.Literal(\"cursor_position\"),\n\t\tType.Literal(\"left_mouse_down\"),\n\t\tType.Literal(\"left_mouse_up\"),\n\t\tType.Literal(\"scroll\"),\n\t\tType.Literal(\"hold_key\"),\n\t\tType.Literal(\"wait\"),\n\t]),\n\tcoordinate: Type.Optional(Type.Array(Type.Number(), { minItems: 2, maxItems: 2 })),\n\tstart_coordinate: Type.Optional(Type.Array(Type.Number(), { minItems: 2, maxItems: 2 })),\n\ttext: Type.Optional(Type.String()),\n\tkey: Type.Optional(Type.String()),\n\tscroll_direction: Type.Optional(\n\t\tType.Union([Type.Literal(\"up\"), Type.Literal(\"down\"), Type.Literal(\"left\"), Type.Literal(\"right\")]),\n\t),\n\tscroll_amount: Type.Optional(Type.Number()),\n\tduration: Type.Optional(Type.Number()),\n});\n\nexport type ComputerToolInput = Static<typeof computerSchema>;\n\nexport type ComputerResult = {\n\tcontent: Array<\n\t\t| TextContent\n\t\t| {\n\t\t\t\ttype: \"image\";\n\t\t\t\tdata: string;\n\t\t\t\tmimeType: \"image/png\";\n\t\t }\n\t>;\n\tisError?: boolean;\n};\n\nexport interface ComputerOperations {\n\tscreenshot(): Promise<{ base64: string }>;\n\tcursorPosition(): Promise<{ x: number; y: number }>;\n\tmouseMove(x: number, y: number): Promise<void>;\n\tclick(button: \"left\" | \"right\" | \"middle\", x?: number, y?: number, modifier?: string): Promise<void>;\n\tdoubleClick(x?: number, y?: number): Promise<void>;\n\ttripleClick(x?: number, y?: number): Promise<void>;\n\tdrag(startX: number, startY: number, endX: number, endY: number): Promise<void>;\n\tmouseDown(button: \"left\", x?: number, y?: number): Promise<void>;\n\tmouseUp(button: \"left\", x?: number, y?: number): Promise<void>;\n\tscroll(\n\t\tdirection: \"up\" | \"down\" | \"left\" | \"right\",\n\t\tamount: number,\n\t\tx?: number,\n\t\ty?: number,\n\t\tmodifier?: string,\n\t): Promise<void>;\n\tkeyPress(combo: string): Promise<void>;\n\ttype(text: string): Promise<void>;\n\tholdKey(combo: string, durationSec: number): Promise<void>;\n\twait(durationSec: number): Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction enabledByEnv(env: string | undefined): boolean {\n\tif (!env) {\n\t\treturn false;\n\t}\n\tconst normalized = env.trim().toLowerCase();\n\treturn normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nfunction parsePositiveInt(value: string | undefined): number | undefined {\n\tif (!value) {\n\t\treturn undefined;\n\t}\n\tconst trimmed = value.trim();\n\tif (!/^\\d+$/.test(trimmed)) {\n\t\treturn undefined;\n\t}\n\tconst parsed = Number.parseInt(trimmed, 10);\n\treturn parsed > 0 ? parsed : undefined;\n}\n\nfunction getComputerDisplayConfig(): { width: number; height: number; displayNumber?: number } | undefined {\n\tconst width = parsePositiveInt(process.env[ANTHROPIC_COMPUTER_USE_WIDTH_ENV]);\n\tconst height = parsePositiveInt(process.env[ANTHROPIC_COMPUTER_USE_HEIGHT_ENV]);\n\tconst displayNumber = parsePositiveInt(process.env[ANTHROPIC_COMPUTER_USE_DISPLAY_NUMBER_ENV]);\n\tif (width === undefined || height === undefined) {\n\t\treturn undefined;\n\t}\n\tif (displayNumber === undefined) {\n\t\treturn { width, height };\n\t}\n\treturn { width, height, displayNumber };\n}\n\nfunction getComputerEnableState(): {\n\tenabled: boolean;\n\tconfig?: { width: number; height: number; displayNumber?: number };\n} {\n\tif (!enabledByEnv(process.env[ANTHROPIC_COMPUTER_USE_ENV])) {\n\t\treturn { enabled: false };\n\t}\n\tconst config = getComputerDisplayConfig();\n\tif (!config) {\n\t\treturn { enabled: false };\n\t}\n\treturn { enabled: true, config };\n}\n\nexport function isAnthropicComputerUseEnabled(): boolean {\n\treturn getComputerEnableState().enabled;\n}\n\nfunction isComputerToolType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"computer_\");\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitizedTools: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst shouldStripFunctionVariant =\n\t\t\ttool.name === ANTHROPIC_NATIVE_COMPUTER_TOOL_NAME && !isComputerToolType(tool.type);\n\t\tif (!shouldStripFunctionVariant) {\n\t\t\tsanitizedTools.push(tool);\n\t\t}\n\t}\n\treturn sanitizedTools;\n}\n\nfunction mergeBetaHeader(existing: unknown): string {\n\tconst existingParts =\n\t\ttypeof existing === \"string\"\n\t\t\t? existing\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((part) => part.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: [];\n\tif (existingParts.includes(ANTHROPIC_COMPUTER_USE_BETA)) {\n\t\treturn existingParts.join(\",\");\n\t}\n\treturn [...existingParts, ANTHROPIC_COMPUTER_USE_BETA].join(\",\");\n}\n\nexport function addAnthropicComputerUseToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\tconst state = getComputerEnableState();\n\tif (!state.enabled || !state.config) {\n\t\treturn payload;\n\t}\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst hasNativeComputer = sanitizedTools.some((tool) => isComputerToolType(tool.type));\n\tif (!hasNativeComputer) {\n\t\tsanitizedTools.push({\n\t\t\ttype: ANTHROPIC_NATIVE_COMPUTER_TOOL_TYPE,\n\t\t\tname: ANTHROPIC_NATIVE_COMPUTER_TOOL_NAME,\n\t\t\tdisplay_width_px: state.config.width,\n\t\t\tdisplay_height_px: state.config.height,\n\t\t\t...(state.config.displayNumber !== undefined ? { display_number: state.config.displayNumber } : {}),\n\t\t});\n\t}\n\n\tconst existingBetas = isRecord(payload.extra_body) ? payload.extra_body.betas : undefined;\n\tconst mergedBetas = Array.isArray(existingBetas)\n\t\t? existingBetas.includes(ANTHROPIC_COMPUTER_USE_BETA)\n\t\t\t? existingBetas\n\t\t\t: [...existingBetas, ANTHROPIC_COMPUTER_USE_BETA]\n\t\t: [ANTHROPIC_COMPUTER_USE_BETA];\n\n\tconst headers = isRecord(payload.headers) ? payload.headers : {};\n\tconst nextHeaders = {\n\t\t...headers,\n\t\t\"anthropic-beta\": mergeBetaHeader(headers[\"anthropic-beta\"]),\n\t};\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t\theaders: nextHeaders,\n\t\textra_body: {\n\t\t\t...(isRecord(payload.extra_body) ? payload.extra_body : {}),\n\t\t\tbetas: mergedBetas,\n\t\t},\n\t};\n}\n\nfunction imageResult(base64: string): ComputerResult {\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: base64,\n\t\t\t\tmimeType: \"image/png\",\n\t\t\t},\n\t\t],\n\t};\n}\n\nfunction errorResult(message: string): ComputerResult {\n\treturn {\n\t\tisError: true,\n\t\tcontent: [{ type: \"text\", text: message }],\n\t};\n}\n\nfunction parseCoordinate(coordinate: number[] | undefined, action: string): [number, number] {\n\tif (!coordinate || coordinate.length !== 2) {\n\t\tthrow new Error(`${action} requires coordinate [x, y]`);\n\t}\n\treturn [coordinate[0] ?? 0, coordinate[1] ?? 0];\n}\n\nfunction parseDuration(duration: number | undefined, action: string): number {\n\tif (duration === undefined || Number.isNaN(duration) || duration < 0) {\n\t\tthrow new Error(`${action} requires duration >= 0`);\n\t}\n\treturn duration;\n}\n\nfunction parseText(text: string | undefined, action: string): string {\n\tif (!text) {\n\t\tthrow new Error(`${action} requires text`);\n\t}\n\treturn text;\n}\n\nexport async function executeComputerAction(\n\tinput: ComputerToolInput,\n\tops: ComputerOperations,\n): Promise<ComputerResult> {\n\ttry {\n\t\tswitch (input.action) {\n\t\t\tcase \"screenshot\": {\n\t\t\t\tconst screenshot = await ops.screenshot();\n\t\t\t\treturn imageResult(screenshot.base64);\n\t\t\t}\n\t\t\tcase \"key\": {\n\t\t\t\tconst combo = parseText(input.text ?? input.key, \"key\");\n\t\t\t\tawait ops.keyPress(combo);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"type\": {\n\t\t\t\tawait ops.type(parseText(input.text, \"type\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"mouse_move\": {\n\t\t\t\tconst [x, y] = parseCoordinate(input.coordinate, \"mouse_move\");\n\t\t\t\tawait ops.mouseMove(x, y);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"left_click\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"left_click\");\n\t\t\t\t\tawait ops.click(\"left\", x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.click(\"left\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"right_click\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"right_click\");\n\t\t\t\t\tawait ops.click(\"right\", x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.click(\"right\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"middle_click\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"middle_click\");\n\t\t\t\t\tawait ops.click(\"middle\", x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.click(\"middle\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"double_click\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"double_click\");\n\t\t\t\t\tawait ops.doubleClick(x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.doubleClick();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"triple_click\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"triple_click\");\n\t\t\t\t\tawait ops.tripleClick(x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.tripleClick();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"left_click_drag\": {\n\t\t\t\tconst [startX, startY] = parseCoordinate(input.start_coordinate, \"left_click_drag.start_coordinate\");\n\t\t\t\tconst [endX, endY] = parseCoordinate(input.coordinate, \"left_click_drag.coordinate\");\n\t\t\t\tawait ops.drag(startX, startY, endX, endY);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"cursor_position\": {\n\t\t\t\tconst position = await ops.cursorPosition();\n\t\t\t\treturn { content: [{ type: \"text\", text: `X=${position.x},Y=${position.y}` }] };\n\t\t\t}\n\t\t\tcase \"left_mouse_down\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"left_mouse_down\");\n\t\t\t\t\tawait ops.mouseDown(\"left\", x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.mouseDown(\"left\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"left_mouse_up\": {\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"left_mouse_up\");\n\t\t\t\t\tawait ops.mouseUp(\"left\", x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.mouseUp(\"left\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"scroll\": {\n\t\t\t\tif (!input.scroll_direction) {\n\t\t\t\t\tthrow new Error(\"scroll requires scroll_direction\");\n\t\t\t\t}\n\t\t\t\tif (input.scroll_amount === undefined || input.scroll_amount <= 0) {\n\t\t\t\t\tthrow new Error(\"scroll requires positive scroll_amount\");\n\t\t\t\t}\n\t\t\t\tconst coordinate = input.coordinate;\n\t\t\t\tif (coordinate) {\n\t\t\t\t\tconst [x, y] = parseCoordinate(coordinate, \"scroll\");\n\t\t\t\t\tawait ops.scroll(input.scroll_direction, input.scroll_amount, x, y);\n\t\t\t\t} else {\n\t\t\t\t\tawait ops.scroll(input.scroll_direction, input.scroll_amount);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"hold_key\": {\n\t\t\t\tawait ops.holdKey(\n\t\t\t\t\tparseText(input.text ?? input.key, \"hold_key\"),\n\t\t\t\t\tparseDuration(input.duration, \"hold_key\"),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"wait\": {\n\t\t\t\tawait ops.wait(parseDuration(input.duration, \"wait\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst screenshot = await ops.screenshot();\n\t\treturn imageResult(screenshot.base64);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn errorResult(message);\n\t}\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n\ttry {\n\t\tawait execFileAsync(\"which\", [command]);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function run(command: string, args: string[]): Promise<string> {\n\tconst result = await execFileAsync(command, args);\n\treturn result.stdout;\n}\n\nfunction parseKeyComboToAppleScript(combo: string): string {\n\tconst parts = combo\n\t\t.split(\"+\")\n\t\t.map((part) => part.trim().toLowerCase())\n\t\t.filter(Boolean);\n\tif (parts.length === 0) {\n\t\tthrow new Error(\"Empty key combo\");\n\t}\n\tconst main = parts[parts.length - 1] ?? \"\";\n\tconst modifiers = new Set(parts.slice(0, -1));\n\tconst usingParts: string[] = [];\n\tif (modifiers.has(\"ctrl\") || modifiers.has(\"control\")) usingParts.push(\"control down\");\n\tif (modifiers.has(\"cmd\") || modifiers.has(\"command\")) usingParts.push(\"command down\");\n\tif (modifiers.has(\"alt\") || modifiers.has(\"option\")) usingParts.push(\"option down\");\n\tif (modifiers.has(\"shift\")) usingParts.push(\"shift down\");\n\tconst targetKey = main.length === 1 ? `keystroke ${JSON.stringify(main)}` : `key code ${mapKeyCode(main)}`;\n\tif (usingParts.length === 0) {\n\t\treturn `tell application \"System Events\" to ${targetKey}`;\n\t}\n\treturn `tell application \"System Events\" to ${targetKey} using {${usingParts.join(\", \")}}`;\n}\n\nfunction mapKeyCode(key: string): number {\n\tconst map: Record<string, number> = { enter: 36, return: 36, tab: 48, space: 49, esc: 53, escape: 53 };\n\tconst code = map[key];\n\tif (code === undefined) {\n\t\tthrow new Error(`Unsupported macOS special key: ${key}`);\n\t}\n\treturn code;\n}\n\nexport function createUnsupportedOps(): ComputerOperations {\n\tconst fail = async (): Promise<never> => {\n\t\tthrow new Error(\"Computer use not supported on Windows\");\n\t};\n\treturn {\n\t\tscreenshot: fail,\n\t\tcursorPosition: fail,\n\t\tmouseMove: fail,\n\t\tclick: fail,\n\t\tdoubleClick: fail,\n\t\ttripleClick: fail,\n\t\tdrag: fail,\n\t\tmouseDown: fail,\n\t\tmouseUp: fail,\n\t\tscroll: fail,\n\t\tkeyPress: fail,\n\t\ttype: fail,\n\t\tholdKey: fail,\n\t\twait: fail,\n\t};\n}\n\nexport function createMacOSComputerOps(): ComputerOperations {\n\treturn {\n\t\tasync screenshot() {\n\t\t\tconst filePath = path.join(tmpdir(), `senpi-computer-${randomUUID()}.png`);\n\t\t\ttry {\n\t\t\t\tawait run(\"screencapture\", [\"-x\", \"-t\", \"png\", filePath]);\n\t\t\t\tconst buffer = await readFile(filePath);\n\t\t\t\treturn { base64: buffer.toString(\"base64\") };\n\t\t\t} finally {\n\t\t\t\tawait rm(filePath, { force: true });\n\t\t\t}\n\t\t},\n\t\tasync cursorPosition() {\n\t\t\tconst output = await run(\"osascript\", [\n\t\t\t\t\"-e\",\n\t\t\t\t'tell app \"System Events\" to return position of pointer as text',\n\t\t\t]);\n\t\t\tconst parts = output.trim().split(\",\");\n\t\t\tconst xRaw = Number.parseInt((parts[0] ?? \"0\").trim(), 10);\n\t\t\tconst yRaw = Number.parseInt((parts[1] ?? \"0\").trim(), 10);\n\t\t\treturn { x: Number.isFinite(xRaw) ? xRaw : 0, y: Number.isFinite(yRaw) ? yRaw : 0 };\n\t\t},\n\t\tasync mouseMove(x, y) {\n\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t},\n\t\tasync click(button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tconst command = button === \"left\" ? \"c:.\" : button === \"right\" ? \"rc:.\" : \"mc:.\";\n\t\t\tawait run(\"cliclick\", [command]);\n\t\t},\n\t\tasync doubleClick(x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tawait run(\"cliclick\", [\"dc:.\"]);\n\t\t},\n\t\tasync tripleClick(x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tawait run(\"cliclick\", [\"tc:.\"]);\n\t\t},\n\t\tasync drag(startX, startY, endX, endY) {\n\t\t\tawait run(\"cliclick\", [`dd:${startX},${startY}`, `du:${endX},${endY}`]);\n\t\t},\n\t\tasync mouseDown(_button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tawait run(\"cliclick\", [\"dd:.\"]);\n\t\t},\n\t\tasync mouseUp(_button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tawait run(\"cliclick\", [\"du:.\"]);\n\t\t},\n\t\tasync scroll(direction, amount, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"cliclick\", [`m:${x},${y}`]);\n\t\t\t}\n\t\t\tconst clicks = Math.max(1, Math.round(amount));\n\t\t\tconst wheel = direction === \"up\" ? \"wd\" : direction === \"down\" ? \"wu\" : direction === \"left\" ? \"wl\" : \"wr\";\n\t\t\tawait run(\"cliclick\", [`${wheel}:${clicks}`]);\n\t\t},\n\t\tasync keyPress(combo) {\n\t\t\tawait run(\"osascript\", [\"-e\", parseKeyComboToAppleScript(combo)]);\n\t\t},\n\t\tasync type(text) {\n\t\t\tawait run(\"osascript\", [\"-e\", `tell application \"System Events\" to keystroke ${JSON.stringify(text)}`]);\n\t\t},\n\t\tasync holdKey(combo, durationSec) {\n\t\t\tawait run(\"osascript\", [\"-e\", parseKeyComboToAppleScript(combo)]);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, durationSec * 1000));\n\t\t},\n\t\tasync wait(durationSec) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, durationSec * 1000));\n\t\t},\n\t};\n}\n\nexport function createLinuxComputerOps(): ComputerOperations {\n\treturn {\n\t\tasync screenshot() {\n\t\t\tconst filePath = path.join(tmpdir(), `senpi-computer-${randomUUID()}.png`);\n\t\t\ttry {\n\t\t\t\tawait run(\"scrot\", [filePath]);\n\t\t\t\tconst buffer = await readFile(filePath);\n\t\t\t\treturn { base64: buffer.toString(\"base64\") };\n\t\t\t} finally {\n\t\t\t\tawait rm(filePath, { force: true });\n\t\t\t}\n\t\t},\n\t\tasync cursorPosition() {\n\t\t\tconst output = await run(\"xdotool\", [\"getmouselocation\", \"--shell\"]);\n\t\t\tconst xMatch = output.match(/^X=(\\d+)$/m);\n\t\t\tconst yMatch = output.match(/^Y=(\\d+)$/m);\n\t\t\treturn {\n\t\t\t\tx: xMatch ? Number.parseInt(xMatch[1] ?? \"0\", 10) : 0,\n\t\t\t\ty: yMatch ? Number.parseInt(yMatch[1] ?? \"0\", 10) : 0,\n\t\t\t};\n\t\t},\n\t\tasync mouseMove(x, y) {\n\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t},\n\t\tasync click(button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tconst buttonNumber = button === \"left\" ? \"1\" : button === \"middle\" ? \"2\" : \"3\";\n\t\t\tawait run(\"xdotool\", [\"click\", buttonNumber]);\n\t\t},\n\t\tasync doubleClick(x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tawait run(\"xdotool\", [\"click\", \"--repeat\", \"2\", \"1\"]);\n\t\t},\n\t\tasync tripleClick(x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tawait run(\"xdotool\", [\"click\", \"--repeat\", \"3\", \"1\"]);\n\t\t},\n\t\tasync drag(startX, startY, endX, endY) {\n\t\t\tawait run(\"xdotool\", [\n\t\t\t\t\"mousemove\",\n\t\t\t\t`${startX}`,\n\t\t\t\t`${startY}`,\n\t\t\t\t\"mousedown\",\n\t\t\t\t\"1\",\n\t\t\t\t\"mousemove\",\n\t\t\t\t`${endX}`,\n\t\t\t\t`${endY}`,\n\t\t\t\t\"mouseup\",\n\t\t\t\t\"1\",\n\t\t\t]);\n\t\t},\n\t\tasync mouseDown(_button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tawait run(\"xdotool\", [\"mousedown\", \"1\"]);\n\t\t},\n\t\tasync mouseUp(_button, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tawait run(\"xdotool\", [\"mouseup\", \"1\"]);\n\t\t},\n\t\tasync scroll(direction, amount, x, y) {\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tawait run(\"xdotool\", [\"mousemove\", `${x}`, `${y}`]);\n\t\t\t}\n\t\t\tconst button = direction === \"up\" ? \"4\" : direction === \"down\" ? \"5\" : direction === \"left\" ? \"6\" : \"7\";\n\t\t\tconst repeat = `${Math.max(1, Math.round(amount))}`;\n\t\t\tawait run(\"xdotool\", [\"click\", \"--repeat\", repeat, button]);\n\t\t},\n\t\tasync keyPress(combo) {\n\t\t\tawait run(\"xdotool\", [\"key\", combo]);\n\t\t},\n\t\tasync type(text) {\n\t\t\tawait run(\"xdotool\", [\"type\", \"--delay\", \"12\", \"--\", text]);\n\t\t},\n\t\tasync holdKey(combo, durationSec) {\n\t\t\tawait run(\"xdotool\", [\"keydown\", combo]);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, durationSec * 1000));\n\t\t\tawait run(\"xdotool\", [\"keyup\", combo]);\n\t\t},\n\t\tasync wait(durationSec) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, durationSec * 1000));\n\t\t},\n\t};\n}\n\nexport function createComputerOps(platform: NodeJS.Platform = process.platform): ComputerOperations {\n\tif (platform === \"darwin\") {\n\t\treturn createMacOSComputerOps();\n\t}\n\tif (platform === \"linux\") {\n\t\treturn createLinuxComputerOps();\n\t}\n\treturn createUnsupportedOps();\n}\n\nasync function validateCliDependencies(platform: NodeJS.Platform): Promise<string[]> {\n\tconst missing: string[] = [];\n\tif (platform === \"darwin\") {\n\t\tif (!(await commandExists(\"cliclick\"))) {\n\t\t\tmissing.push(\"cliclick\");\n\t\t}\n\t} else if (platform === \"linux\") {\n\t\tif (!(await commandExists(\"xdotool\"))) {\n\t\t\tmissing.push(\"xdotool\");\n\t\t}\n\t\tif (!(await commandExists(\"scrot\"))) {\n\t\t\tmissing.push(\"scrot\");\n\t\t}\n\t}\n\treturn missing;\n}\n\nexport const ANTHROPIC_COMPUTER_USE_SECTION = `\n## Computer Use\n\nThe native computer tool is available in this session. The model can\ncontrol the screen via screenshot, key, type, mouse actions, scroll,\nand wait commands.\n`;\n\nfunction buildComputerUseSection(width: number, height: number): string {\n\treturn `${ANTHROPIC_COMPUTER_USE_SECTION.trimEnd()} Display dimensions: ${width}x${height}. Use computer when the user asks to interact with GUI applications.\\n`;\n}\n\nexport default function anthropicComputerUseExtension(pi: ExtensionAPI): void {\n\tlet extensionDisabledForSession = false;\n\n\tpi.on(\"session_start\", async (_event) => {\n\t\tif (!enabledByEnv(process.env[ANTHROPIC_COMPUTER_USE_ENV])) {\n\t\t\textensionDisabledForSession = true;\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!getComputerDisplayConfig()) {\n\t\t\textensionDisabledForSession = true;\n\t\t\tconsole.error(\n\t\t\t\t`[anthropic-computer-use] ${ANTHROPIC_COMPUTER_USE_WIDTH_ENV} and ${ANTHROPIC_COMPUTER_USE_HEIGHT_ENV} must be positive integers; extension disabled for this session.`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\textensionDisabledForSession = false;\n\t\tconst missingTools = await validateCliDependencies(process.platform);\n\t\tif (missingTools.length > 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`[anthropic-computer-use] Missing OS automation dependencies: ${missingTools.join(\", \")}. Install them for full functionality.`,\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t});\n\n\tif (enabledByEnv(process.env[ANTHROPIC_COMPUTER_USE_ENV]) && getComputerDisplayConfig()) {\n\t\tconst ops = createComputerOps();\n\t\tpi.registerTool({\n\t\t\tname: ANTHROPIC_NATIVE_COMPUTER_TOOL_NAME,\n\t\t\tlabel: \"Computer Use\",\n\t\t\tdescription:\n\t\t\t\t\"Actions: screenshot, key, type, mouse_move, left/right/middle click, double/triple click, drag, cursor_position, mouse down/up, scroll, hold_key, wait.\",\n\t\t\tparameters: computerSchema,\n\t\t\tasync execute(_toolCallId, params): Promise<AgentToolResult<undefined>> {\n\t\t\t\tconst result = await executeComputerAction(params, ops);\n\t\t\t\tif (result.isError) {\n\t\t\t\t\tconst firstContent = result.content[0];\n\t\t\t\t\tthrow new Error(firstContent?.type === \"text\" ? firstContent.text : \"Computer action failed\");\n\t\t\t\t}\n\t\t\t\treturn { content: result.content, details: undefined };\n\t\t\t},\n\t\t});\n\t}\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tif (extensionDisabledForSession) {\n\t\t\treturn event.payload;\n\t\t}\n\t\treturn addAnthropicComputerUseToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (extensionDisabledForSession) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst config = getComputerDisplayConfig();\n\t\tif (!enabledByEnv(process.env[ANTHROPIC_COMPUTER_USE_ENV]) || !config) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${buildComputerUseSection(config.width, config.height)}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,25 +0,0 @@
1
- import type { Api, TextContent } from "@earendil-works/pi-ai";
2
- import { type Static, Type } from "typebox";
3
- import type { ExtensionAPI } from "../../types.js";
4
- declare const textEditorSchema: Type.TObject<{
5
- command: Type.TUnion<[Type.TLiteral<"view">, Type.TLiteral<"create">, Type.TLiteral<"str_replace">, Type.TLiteral<"insert">]>;
6
- path: Type.TString;
7
- view_range: Type.TOptional<Type.TArray<Type.TNumber>>;
8
- file_text: Type.TOptional<Type.TString>;
9
- old_str: Type.TOptional<Type.TString>;
10
- new_str: Type.TOptional<Type.TString>;
11
- insert_line: Type.TOptional<Type.TNumber>;
12
- }>;
13
- export type TextEditorInput = Static<typeof textEditorSchema>;
14
- export type TextEditorCommandResult = {
15
- content: TextContent[];
16
- details?: undefined;
17
- isError?: boolean;
18
- };
19
- export declare function executeTextEditorCommand(input: TextEditorInput): Promise<TextEditorCommandResult>;
20
- export declare function isAnthropicTextEditorEnabled(): boolean;
21
- export declare function addAnthropicTextEditorToPayload(api: Api | undefined, payload: unknown): unknown;
22
- export declare const ANTHROPIC_TEXT_EDITOR_SECTION = "\n## Text Editor\n\nThe native text_editor tool is available in this session. Use the\nstr_replace_based_edit_tool with commands view, create, str_replace,\nand insert to read and modify files. The local read/write/edit tools\nare not exposed when this extension is active \u2014 use the native tool\nexclusively for file operations.\n";
23
- export default function anthropicTextEditorExtension(pi: ExtensionAPI): void;
24
- export {};
25
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-text-editor/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAUpE,QAAA,MAAM,gBAAgB;;;;;;;;EAmBpB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC9D,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AA8IF,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAavG;AAqBD,wBAAgB,4BAA4B,IAAI,OAAO,CAQtD;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAwB/F;AAED,eAAO,MAAM,6BAA6B,oVAQzC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwC3E","sourcesContent":["import { access, lstat, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport type { Api, TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { AgentToolResult, ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst ANTHROPIC_TEXT_EDITOR_ENV = \"PI_ANTHROPIC_TEXT_EDITOR\";\nconst ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL = {\n\ttype: \"text_editor_20250728\",\n\tname: \"str_replace_based_edit_tool\",\n} as const;\n\nconst textEditorSchema = Type.Object({\n\tcommand: Type.Union(\n\t\t[Type.Literal(\"view\"), Type.Literal(\"create\"), Type.Literal(\"str_replace\"), Type.Literal(\"insert\")],\n\t\t{ description: \"The text editor command to execute\" },\n\t),\n\tpath: Type.String({ description: \"Absolute path to the target file\" }),\n\tview_range: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tminItems: 2,\n\t\t\tmaxItems: 2,\n\t\t\tdescription: \"[start_line, end_line] inclusive 1-indexed; -1 for end of file\",\n\t\t}),\n\t),\n\tfile_text: Type.Optional(Type.String({ description: \"File content for create\" })),\n\told_str: Type.Optional(Type.String({ description: \"Exact string to replace\" })),\n\tnew_str: Type.Optional(Type.String({ description: \"Replacement string\" })),\n\tinsert_line: Type.Optional(\n\t\tType.Number({ description: \"Line number AFTER which to insert (0 = beginning of file)\" }),\n\t),\n});\n\nexport type TextEditorInput = Static<typeof textEditorSchema>;\nexport type TextEditorCommandResult = {\n\tcontent: TextContent[];\n\tdetails?: undefined;\n\tisError?: boolean;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isTextEditorType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"text_editor_\");\n}\n\nfunction success(text: string): TextEditorCommandResult {\n\treturn { content: [{ type: \"text\", text }] };\n}\n\nfunction failure(text: string): TextEditorCommandResult {\n\treturn { content: [{ type: \"text\", text }], isError: true };\n}\n\nfunction formatWithLineNumbers(content: string): string {\n\tconst lines = content.split(\"\\n\");\n\treturn lines.map((line, index) => `${index + 1}\\t${line}`).join(\"\\n\");\n}\n\nfunction formatRangeWithLineNumbers(content: string, viewRange: [number, number] | undefined): string {\n\tif (!viewRange) {\n\t\treturn formatWithLineNumbers(content);\n\t}\n\n\tconst [startLine, endLineRaw] = viewRange;\n\tconst allLines = content.split(\"\\n\");\n\tconst endLine = endLineRaw === -1 ? allLines.length : endLineRaw;\n\tconst safeStart = Math.max(1, startLine);\n\tconst safeEnd = Math.min(allLines.length, endLine);\n\tif (safeStart > safeEnd) {\n\t\treturn \"\";\n\t}\n\n\tconst selectedLines = allLines.slice(safeStart - 1, safeEnd);\n\treturn selectedLines.map((line, index) => `${safeStart + index}\\t${line}`).join(\"\\n\");\n}\n\nfunction sanitizeError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\treturn \"Unknown file system error\";\n}\n\nasync function executeView(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tconst targetPath = input.path;\n\ttry {\n\t\tconst stats = await lstat(targetPath);\n\t\tif (stats.isDirectory()) {\n\t\t\tconst entries = await readdir(targetPath, { withFileTypes: true });\n\t\t\tconst listing = entries\n\t\t\t\t.map((entry) => `${entry.isDirectory() ? \"d\" : \"-\"} ${entry.name}${entry.isDirectory() ? \"/\" : \"\"}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn success(listing);\n\t\t}\n\n\t\tconst contents = await readFile(targetPath, \"utf-8\");\n\t\tconst viewRange = input.view_range ? ([input.view_range[0], input.view_range[1]] as [number, number]) : undefined;\n\t\treturn success(formatRangeWithLineNumbers(contents, viewRange));\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeCreate(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.file_text !== \"string\") {\n\t\treturn failure(\"Missing required field: file_text\");\n\t}\n\n\ttry {\n\t\tawait access(input.path);\n\t\treturn failure(`File already exists: ${input.path}`);\n\t} catch {\n\t\t// Path does not exist: expected case.\n\t}\n\n\ttry {\n\t\tawait writeFile(input.path, input.file_text, \"utf-8\");\n\t\treturn success(`File created successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeStrReplace(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.old_str !== \"string\") {\n\t\treturn failure(\"Missing required field: old_str\");\n\t}\n\n\tif (typeof input.new_str !== \"string\") {\n\t\treturn failure(\"Missing required field: new_str\");\n\t}\n\n\ttry {\n\t\tconst contents = await readFile(input.path, \"utf-8\");\n\t\tconst occurrences = contents.split(input.old_str).length - 1;\n\t\tif (occurrences === 0) {\n\t\t\treturn failure(\"No match found for replacement\");\n\t\t}\n\n\t\tif (occurrences > 1) {\n\t\t\treturn failure(\"Multiple matches found; provide more context\");\n\t\t}\n\n\t\tconst replaced = contents.replace(input.old_str, input.new_str);\n\t\tawait writeFile(input.path, replaced, \"utf-8\");\n\t\treturn success(`File updated successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeInsert(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.insert_line !== \"number\") {\n\t\treturn failure(\"Missing required field: insert_line\");\n\t}\n\n\tif (typeof input.new_str !== \"string\") {\n\t\treturn failure(\"Missing required field: new_str\");\n\t}\n\n\ttry {\n\t\tconst contents = await readFile(input.path, \"utf-8\");\n\t\tconst lines = contents.split(\"\\n\");\n\t\tconst lineNumber = input.insert_line;\n\n\t\tif (lineNumber < 0 || lineNumber > lines.length) {\n\t\t\treturn failure(`insert_line out of range: ${lineNumber}`);\n\t\t}\n\n\t\tlines.splice(lineNumber, 0, input.new_str);\n\t\tawait writeFile(input.path, lines.join(\"\\n\"), \"utf-8\");\n\t\treturn success(`File updated successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nexport async function executeTextEditorCommand(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tswitch (input.command) {\n\t\tcase \"view\":\n\t\t\treturn executeView(input);\n\t\tcase \"create\":\n\t\t\treturn executeCreate(input);\n\t\tcase \"str_replace\":\n\t\t\treturn executeStrReplace(input);\n\t\tcase \"insert\":\n\t\t\treturn executeInsert(input);\n\t\tdefault:\n\t\t\treturn failure(`Unsupported command: ${String(input.command)}`);\n\t}\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitizedTools: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst toolName = typeof tool.name === \"string\" ? tool.name : undefined;\n\t\tconst shouldStripTextEditorFunctionShape =\n\t\t\ttoolName === \"str_replace_based_edit_tool\" && !isTextEditorType(tool.type);\n\t\tconst shouldStripReadWriteEditFunctionShape =\n\t\t\t(toolName === \"read\" || toolName === \"write\" || toolName === \"edit\") && !isTextEditorType(tool.type);\n\t\tif (!shouldStripTextEditorFunctionShape && !shouldStripReadWriteEditFunctionShape) {\n\t\t\tsanitizedTools.push(tool);\n\t\t}\n\t}\n\treturn sanitizedTools;\n}\n\nexport function isAnthropicTextEditorEnabled(): boolean {\n\tconst value = process.env[ANTHROPIC_TEXT_EDITOR_ENV];\n\tif (!value) {\n\t\treturn false;\n\t}\n\n\tconst normalized = value.trim().toLowerCase();\n\treturn normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nexport function addAnthropicTextEditorToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isAnthropicTextEditorEnabled()) {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst hasNativeTextEditor = sanitizedTools.some((tool) => isTextEditorType(tool.type));\n\tif (!hasNativeTextEditor) {\n\t\tsanitizedTools.push(ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL);\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const ANTHROPIC_TEXT_EDITOR_SECTION = `\n## Text Editor\n\nThe native text_editor tool is available in this session. Use the\nstr_replace_based_edit_tool with commands view, create, str_replace,\nand insert to read and modify files. The local read/write/edit tools\nare not exposed when this extension is active — use the native tool\nexclusively for file operations.\n`;\n\nexport default function anthropicTextEditorExtension(pi: ExtensionAPI): void {\n\tif (isAnthropicTextEditorEnabled()) {\n\t\tpi.registerTool({\n\t\t\tname: \"str_replace_based_edit_tool\",\n\t\t\tlabel: \"Text Editor\",\n\t\t\tdescription:\n\t\t\t\t\"Use command=view/create/str_replace/insert to inspect and edit files. view supports optional view_range.\",\n\t\t\tparameters: textEditorSchema,\n\t\t\tasync execute(_toolCallId, params): Promise<AgentToolResult<undefined>> {\n\t\t\t\tconst result = await executeTextEditorCommand(params);\n\t\t\t\tif (result.isError) {\n\t\t\t\t\tconst firstContent = result.content[0];\n\t\t\t\t\tthrow new Error(firstContent?.type === \"text\" ? firstContent.text : \"Text editor command failed\");\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: result.content,\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addAnthropicTextEditorToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isAnthropicTextEditorEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_TEXT_EDITOR_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,244 +0,0 @@
1
- import { access, lstat, readdir, readFile, writeFile } from "node:fs/promises";
2
- import { Type } from "typebox";
3
- const ANTHROPIC_TEXT_EDITOR_ENV = "PI_ANTHROPIC_TEXT_EDITOR";
4
- const ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL = {
5
- type: "text_editor_20250728",
6
- name: "str_replace_based_edit_tool",
7
- };
8
- const textEditorSchema = Type.Object({
9
- command: Type.Union([Type.Literal("view"), Type.Literal("create"), Type.Literal("str_replace"), Type.Literal("insert")], { description: "The text editor command to execute" }),
10
- path: Type.String({ description: "Absolute path to the target file" }),
11
- view_range: Type.Optional(Type.Array(Type.Number(), {
12
- minItems: 2,
13
- maxItems: 2,
14
- description: "[start_line, end_line] inclusive 1-indexed; -1 for end of file",
15
- })),
16
- file_text: Type.Optional(Type.String({ description: "File content for create" })),
17
- old_str: Type.Optional(Type.String({ description: "Exact string to replace" })),
18
- new_str: Type.Optional(Type.String({ description: "Replacement string" })),
19
- insert_line: Type.Optional(Type.Number({ description: "Line number AFTER which to insert (0 = beginning of file)" })),
20
- });
21
- function isRecord(value) {
22
- return typeof value === "object" && value !== null;
23
- }
24
- function isTextEditorType(value) {
25
- return typeof value === "string" && value.startsWith("text_editor_");
26
- }
27
- function success(text) {
28
- return { content: [{ type: "text", text }] };
29
- }
30
- function failure(text) {
31
- return { content: [{ type: "text", text }], isError: true };
32
- }
33
- function formatWithLineNumbers(content) {
34
- const lines = content.split("\n");
35
- return lines.map((line, index) => `${index + 1}\t${line}`).join("\n");
36
- }
37
- function formatRangeWithLineNumbers(content, viewRange) {
38
- if (!viewRange) {
39
- return formatWithLineNumbers(content);
40
- }
41
- const [startLine, endLineRaw] = viewRange;
42
- const allLines = content.split("\n");
43
- const endLine = endLineRaw === -1 ? allLines.length : endLineRaw;
44
- const safeStart = Math.max(1, startLine);
45
- const safeEnd = Math.min(allLines.length, endLine);
46
- if (safeStart > safeEnd) {
47
- return "";
48
- }
49
- const selectedLines = allLines.slice(safeStart - 1, safeEnd);
50
- return selectedLines.map((line, index) => `${safeStart + index}\t${line}`).join("\n");
51
- }
52
- function sanitizeError(error) {
53
- if (error instanceof Error) {
54
- return error.message;
55
- }
56
- return "Unknown file system error";
57
- }
58
- async function executeView(input) {
59
- const targetPath = input.path;
60
- try {
61
- const stats = await lstat(targetPath);
62
- if (stats.isDirectory()) {
63
- const entries = await readdir(targetPath, { withFileTypes: true });
64
- const listing = entries
65
- .map((entry) => `${entry.isDirectory() ? "d" : "-"} ${entry.name}${entry.isDirectory() ? "/" : ""}`)
66
- .join("\n");
67
- return success(listing);
68
- }
69
- const contents = await readFile(targetPath, "utf-8");
70
- const viewRange = input.view_range ? [input.view_range[0], input.view_range[1]] : undefined;
71
- return success(formatRangeWithLineNumbers(contents, viewRange));
72
- }
73
- catch (error) {
74
- return failure(sanitizeError(error));
75
- }
76
- }
77
- async function executeCreate(input) {
78
- if (typeof input.file_text !== "string") {
79
- return failure("Missing required field: file_text");
80
- }
81
- try {
82
- await access(input.path);
83
- return failure(`File already exists: ${input.path}`);
84
- }
85
- catch {
86
- // Path does not exist: expected case.
87
- }
88
- try {
89
- await writeFile(input.path, input.file_text, "utf-8");
90
- return success(`File created successfully at: ${input.path}`);
91
- }
92
- catch (error) {
93
- return failure(sanitizeError(error));
94
- }
95
- }
96
- async function executeStrReplace(input) {
97
- if (typeof input.old_str !== "string") {
98
- return failure("Missing required field: old_str");
99
- }
100
- if (typeof input.new_str !== "string") {
101
- return failure("Missing required field: new_str");
102
- }
103
- try {
104
- const contents = await readFile(input.path, "utf-8");
105
- const occurrences = contents.split(input.old_str).length - 1;
106
- if (occurrences === 0) {
107
- return failure("No match found for replacement");
108
- }
109
- if (occurrences > 1) {
110
- return failure("Multiple matches found; provide more context");
111
- }
112
- const replaced = contents.replace(input.old_str, input.new_str);
113
- await writeFile(input.path, replaced, "utf-8");
114
- return success(`File updated successfully at: ${input.path}`);
115
- }
116
- catch (error) {
117
- return failure(sanitizeError(error));
118
- }
119
- }
120
- async function executeInsert(input) {
121
- if (typeof input.insert_line !== "number") {
122
- return failure("Missing required field: insert_line");
123
- }
124
- if (typeof input.new_str !== "string") {
125
- return failure("Missing required field: new_str");
126
- }
127
- try {
128
- const contents = await readFile(input.path, "utf-8");
129
- const lines = contents.split("\n");
130
- const lineNumber = input.insert_line;
131
- if (lineNumber < 0 || lineNumber > lines.length) {
132
- return failure(`insert_line out of range: ${lineNumber}`);
133
- }
134
- lines.splice(lineNumber, 0, input.new_str);
135
- await writeFile(input.path, lines.join("\n"), "utf-8");
136
- return success(`File updated successfully at: ${input.path}`);
137
- }
138
- catch (error) {
139
- return failure(sanitizeError(error));
140
- }
141
- }
142
- export async function executeTextEditorCommand(input) {
143
- switch (input.command) {
144
- case "view":
145
- return executeView(input);
146
- case "create":
147
- return executeCreate(input);
148
- case "str_replace":
149
- return executeStrReplace(input);
150
- case "insert":
151
- return executeInsert(input);
152
- default:
153
- return failure(`Unsupported command: ${String(input.command)}`);
154
- }
155
- }
156
- function sanitizeTools(tools) {
157
- const sanitizedTools = [];
158
- for (const tool of tools) {
159
- if (!isRecord(tool)) {
160
- continue;
161
- }
162
- const toolName = typeof tool.name === "string" ? tool.name : undefined;
163
- const shouldStripTextEditorFunctionShape = toolName === "str_replace_based_edit_tool" && !isTextEditorType(tool.type);
164
- const shouldStripReadWriteEditFunctionShape = (toolName === "read" || toolName === "write" || toolName === "edit") && !isTextEditorType(tool.type);
165
- if (!shouldStripTextEditorFunctionShape && !shouldStripReadWriteEditFunctionShape) {
166
- sanitizedTools.push(tool);
167
- }
168
- }
169
- return sanitizedTools;
170
- }
171
- export function isAnthropicTextEditorEnabled() {
172
- const value = process.env[ANTHROPIC_TEXT_EDITOR_ENV];
173
- if (!value) {
174
- return false;
175
- }
176
- const normalized = value.trim().toLowerCase();
177
- return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
178
- }
179
- export function addAnthropicTextEditorToPayload(api, payload) {
180
- if (api !== "anthropic-messages") {
181
- return payload;
182
- }
183
- if (!isAnthropicTextEditorEnabled()) {
184
- return payload;
185
- }
186
- if (!isRecord(payload)) {
187
- return payload;
188
- }
189
- const tools = Array.isArray(payload.tools) ? payload.tools : [];
190
- const sanitizedTools = sanitizeTools(tools);
191
- const hasNativeTextEditor = sanitizedTools.some((tool) => isTextEditorType(tool.type));
192
- if (!hasNativeTextEditor) {
193
- sanitizedTools.push(ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL);
194
- }
195
- return {
196
- ...payload,
197
- tools: sanitizedTools,
198
- };
199
- }
200
- export const ANTHROPIC_TEXT_EDITOR_SECTION = `
201
- ## Text Editor
202
-
203
- The native text_editor tool is available in this session. Use the
204
- str_replace_based_edit_tool with commands view, create, str_replace,
205
- and insert to read and modify files. The local read/write/edit tools
206
- are not exposed when this extension is active — use the native tool
207
- exclusively for file operations.
208
- `;
209
- export default function anthropicTextEditorExtension(pi) {
210
- if (isAnthropicTextEditorEnabled()) {
211
- pi.registerTool({
212
- name: "str_replace_based_edit_tool",
213
- label: "Text Editor",
214
- description: "Use command=view/create/str_replace/insert to inspect and edit files. view supports optional view_range.",
215
- parameters: textEditorSchema,
216
- async execute(_toolCallId, params) {
217
- const result = await executeTextEditorCommand(params);
218
- if (result.isError) {
219
- const firstContent = result.content[0];
220
- throw new Error(firstContent?.type === "text" ? firstContent.text : "Text editor command failed");
221
- }
222
- return {
223
- content: result.content,
224
- details: undefined,
225
- };
226
- },
227
- });
228
- }
229
- pi.on("before_provider_request", (event, ctx) => {
230
- return addAnthropicTextEditorToPayload(ctx.model?.api, event.payload);
231
- });
232
- pi.on("before_agent_start", async (event, ctx) => {
233
- if (ctx.model?.api !== "anthropic-messages") {
234
- return undefined;
235
- }
236
- if (!isAnthropicTextEditorEnabled()) {
237
- return undefined;
238
- }
239
- return {
240
- systemPrompt: `${event.systemPrompt}\n${ANTHROPIC_TEXT_EDITOR_SECTION}`,
241
- };
242
- });
243
- }
244
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-text-editor/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, lstat, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport type { Api, TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { AgentToolResult, ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst ANTHROPIC_TEXT_EDITOR_ENV = \"PI_ANTHROPIC_TEXT_EDITOR\";\nconst ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL = {\n\ttype: \"text_editor_20250728\",\n\tname: \"str_replace_based_edit_tool\",\n} as const;\n\nconst textEditorSchema = Type.Object({\n\tcommand: Type.Union(\n\t\t[Type.Literal(\"view\"), Type.Literal(\"create\"), Type.Literal(\"str_replace\"), Type.Literal(\"insert\")],\n\t\t{ description: \"The text editor command to execute\" },\n\t),\n\tpath: Type.String({ description: \"Absolute path to the target file\" }),\n\tview_range: Type.Optional(\n\t\tType.Array(Type.Number(), {\n\t\t\tminItems: 2,\n\t\t\tmaxItems: 2,\n\t\t\tdescription: \"[start_line, end_line] inclusive 1-indexed; -1 for end of file\",\n\t\t}),\n\t),\n\tfile_text: Type.Optional(Type.String({ description: \"File content for create\" })),\n\told_str: Type.Optional(Type.String({ description: \"Exact string to replace\" })),\n\tnew_str: Type.Optional(Type.String({ description: \"Replacement string\" })),\n\tinsert_line: Type.Optional(\n\t\tType.Number({ description: \"Line number AFTER which to insert (0 = beginning of file)\" }),\n\t),\n});\n\nexport type TextEditorInput = Static<typeof textEditorSchema>;\nexport type TextEditorCommandResult = {\n\tcontent: TextContent[];\n\tdetails?: undefined;\n\tisError?: boolean;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isTextEditorType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"text_editor_\");\n}\n\nfunction success(text: string): TextEditorCommandResult {\n\treturn { content: [{ type: \"text\", text }] };\n}\n\nfunction failure(text: string): TextEditorCommandResult {\n\treturn { content: [{ type: \"text\", text }], isError: true };\n}\n\nfunction formatWithLineNumbers(content: string): string {\n\tconst lines = content.split(\"\\n\");\n\treturn lines.map((line, index) => `${index + 1}\\t${line}`).join(\"\\n\");\n}\n\nfunction formatRangeWithLineNumbers(content: string, viewRange: [number, number] | undefined): string {\n\tif (!viewRange) {\n\t\treturn formatWithLineNumbers(content);\n\t}\n\n\tconst [startLine, endLineRaw] = viewRange;\n\tconst allLines = content.split(\"\\n\");\n\tconst endLine = endLineRaw === -1 ? allLines.length : endLineRaw;\n\tconst safeStart = Math.max(1, startLine);\n\tconst safeEnd = Math.min(allLines.length, endLine);\n\tif (safeStart > safeEnd) {\n\t\treturn \"\";\n\t}\n\n\tconst selectedLines = allLines.slice(safeStart - 1, safeEnd);\n\treturn selectedLines.map((line, index) => `${safeStart + index}\\t${line}`).join(\"\\n\");\n}\n\nfunction sanitizeError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\treturn \"Unknown file system error\";\n}\n\nasync function executeView(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tconst targetPath = input.path;\n\ttry {\n\t\tconst stats = await lstat(targetPath);\n\t\tif (stats.isDirectory()) {\n\t\t\tconst entries = await readdir(targetPath, { withFileTypes: true });\n\t\t\tconst listing = entries\n\t\t\t\t.map((entry) => `${entry.isDirectory() ? \"d\" : \"-\"} ${entry.name}${entry.isDirectory() ? \"/\" : \"\"}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn success(listing);\n\t\t}\n\n\t\tconst contents = await readFile(targetPath, \"utf-8\");\n\t\tconst viewRange = input.view_range ? ([input.view_range[0], input.view_range[1]] as [number, number]) : undefined;\n\t\treturn success(formatRangeWithLineNumbers(contents, viewRange));\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeCreate(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.file_text !== \"string\") {\n\t\treturn failure(\"Missing required field: file_text\");\n\t}\n\n\ttry {\n\t\tawait access(input.path);\n\t\treturn failure(`File already exists: ${input.path}`);\n\t} catch {\n\t\t// Path does not exist: expected case.\n\t}\n\n\ttry {\n\t\tawait writeFile(input.path, input.file_text, \"utf-8\");\n\t\treturn success(`File created successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeStrReplace(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.old_str !== \"string\") {\n\t\treturn failure(\"Missing required field: old_str\");\n\t}\n\n\tif (typeof input.new_str !== \"string\") {\n\t\treturn failure(\"Missing required field: new_str\");\n\t}\n\n\ttry {\n\t\tconst contents = await readFile(input.path, \"utf-8\");\n\t\tconst occurrences = contents.split(input.old_str).length - 1;\n\t\tif (occurrences === 0) {\n\t\t\treturn failure(\"No match found for replacement\");\n\t\t}\n\n\t\tif (occurrences > 1) {\n\t\t\treturn failure(\"Multiple matches found; provide more context\");\n\t\t}\n\n\t\tconst replaced = contents.replace(input.old_str, input.new_str);\n\t\tawait writeFile(input.path, replaced, \"utf-8\");\n\t\treturn success(`File updated successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nasync function executeInsert(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tif (typeof input.insert_line !== \"number\") {\n\t\treturn failure(\"Missing required field: insert_line\");\n\t}\n\n\tif (typeof input.new_str !== \"string\") {\n\t\treturn failure(\"Missing required field: new_str\");\n\t}\n\n\ttry {\n\t\tconst contents = await readFile(input.path, \"utf-8\");\n\t\tconst lines = contents.split(\"\\n\");\n\t\tconst lineNumber = input.insert_line;\n\n\t\tif (lineNumber < 0 || lineNumber > lines.length) {\n\t\t\treturn failure(`insert_line out of range: ${lineNumber}`);\n\t\t}\n\n\t\tlines.splice(lineNumber, 0, input.new_str);\n\t\tawait writeFile(input.path, lines.join(\"\\n\"), \"utf-8\");\n\t\treturn success(`File updated successfully at: ${input.path}`);\n\t} catch (error: unknown) {\n\t\treturn failure(sanitizeError(error));\n\t}\n}\n\nexport async function executeTextEditorCommand(input: TextEditorInput): Promise<TextEditorCommandResult> {\n\tswitch (input.command) {\n\t\tcase \"view\":\n\t\t\treturn executeView(input);\n\t\tcase \"create\":\n\t\t\treturn executeCreate(input);\n\t\tcase \"str_replace\":\n\t\t\treturn executeStrReplace(input);\n\t\tcase \"insert\":\n\t\t\treturn executeInsert(input);\n\t\tdefault:\n\t\t\treturn failure(`Unsupported command: ${String(input.command)}`);\n\t}\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitizedTools: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst toolName = typeof tool.name === \"string\" ? tool.name : undefined;\n\t\tconst shouldStripTextEditorFunctionShape =\n\t\t\ttoolName === \"str_replace_based_edit_tool\" && !isTextEditorType(tool.type);\n\t\tconst shouldStripReadWriteEditFunctionShape =\n\t\t\t(toolName === \"read\" || toolName === \"write\" || toolName === \"edit\") && !isTextEditorType(tool.type);\n\t\tif (!shouldStripTextEditorFunctionShape && !shouldStripReadWriteEditFunctionShape) {\n\t\t\tsanitizedTools.push(tool);\n\t\t}\n\t}\n\treturn sanitizedTools;\n}\n\nexport function isAnthropicTextEditorEnabled(): boolean {\n\tconst value = process.env[ANTHROPIC_TEXT_EDITOR_ENV];\n\tif (!value) {\n\t\treturn false;\n\t}\n\n\tconst normalized = value.trim().toLowerCase();\n\treturn normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nexport function addAnthropicTextEditorToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isAnthropicTextEditorEnabled()) {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst hasNativeTextEditor = sanitizedTools.some((tool) => isTextEditorType(tool.type));\n\tif (!hasNativeTextEditor) {\n\t\tsanitizedTools.push(ANTHROPIC_NATIVE_TEXT_EDITOR_TOOL);\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const ANTHROPIC_TEXT_EDITOR_SECTION = `\n## Text Editor\n\nThe native text_editor tool is available in this session. Use the\nstr_replace_based_edit_tool with commands view, create, str_replace,\nand insert to read and modify files. The local read/write/edit tools\nare not exposed when this extension is active — use the native tool\nexclusively for file operations.\n`;\n\nexport default function anthropicTextEditorExtension(pi: ExtensionAPI): void {\n\tif (isAnthropicTextEditorEnabled()) {\n\t\tpi.registerTool({\n\t\t\tname: \"str_replace_based_edit_tool\",\n\t\t\tlabel: \"Text Editor\",\n\t\t\tdescription:\n\t\t\t\t\"Use command=view/create/str_replace/insert to inspect and edit files. view supports optional view_range.\",\n\t\t\tparameters: textEditorSchema,\n\t\t\tasync execute(_toolCallId, params): Promise<AgentToolResult<undefined>> {\n\t\t\t\tconst result = await executeTextEditorCommand(params);\n\t\t\t\tif (result.isError) {\n\t\t\t\t\tconst firstContent = result.content[0];\n\t\t\t\t\tthrow new Error(firstContent?.type === \"text\" ? firstContent.text : \"Text editor command failed\");\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: result.content,\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addAnthropicTextEditorToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isAnthropicTextEditorEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_TEXT_EDITOR_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { Api } from "@earendil-works/pi-ai";
2
- import type { ExtensionAPI } from "../../types.js";
3
- export declare function addAnthropicToolSearchToPayload(api: Api | undefined, payload: unknown): unknown;
4
- export declare const ANTHROPIC_TOOL_SEARCH_SECTION = "\n## Tool Search\n\nAnthropic native tool search is enabled. Use tool_search_tool_regex or tool_search_tool_bm25 to discover relevant tools from large catalogs before calling them.\n";
5
- export default function anthropicToolSearchExtension(pi: ExtensionAPI): void;
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-tool-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA2EnD,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA4B/F;AAED,eAAO,MAAM,6BAA6B,2LAIzC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAiC3E","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\ntype ToolSearchMode = \"off\" | \"regex\" | \"bm25\" | \"both\";\n\nconst TOOL_SEARCH_ENV = \"PI_ANTHROPIC_TOOL_SEARCH\";\nconst REGEX_TOOL_TYPE = \"tool_search_tool_regex_20251119\";\nconst BM25_TOOL_TYPE = \"tool_search_tool_bm25_20251119\";\nconst REGEX_TOOL_NAME = \"tool_search_tool_regex\";\nconst BM25_TOOL_NAME = \"tool_search_tool_bm25\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseToolSearchMode(rawValue: string | undefined): ToolSearchMode {\n\tif (!rawValue) {\n\t\treturn \"off\";\n\t}\n\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized || normalized === \"off\") {\n\t\treturn \"off\";\n\t}\n\n\tif (normalized === \"regex\" || normalized === \"bm25\" || normalized === \"both\") {\n\t\treturn normalized;\n\t}\n\n\treturn \"off\";\n}\n\nfunction isToolSearchType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"tool_search_tool_\");\n}\n\nfunction isNativeToolSearchTool(tool: ToolDefinition): boolean {\n\tconst name = tool.name;\n\treturn name === REGEX_TOOL_NAME || name === BM25_TOOL_NAME;\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitized: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isFunctionVariant = isNativeToolSearchTool(tool) && !isToolSearchType(tool.type);\n\t\tif (!isFunctionVariant) {\n\t\t\tsanitized.push(tool);\n\t\t}\n\t}\n\treturn sanitized;\n}\n\nfunction selectTools(mode: ToolSearchMode): ToolDefinition[] {\n\tif (mode === \"regex\") {\n\t\treturn [{ type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME }];\n\t}\n\n\tif (mode === \"bm25\") {\n\t\treturn [{ type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME }];\n\t}\n\n\tif (mode === \"both\") {\n\t\treturn [\n\t\t\t{ type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME },\n\t\t\t{ type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME },\n\t\t];\n\t}\n\n\treturn [];\n}\n\nexport function addAnthropicToolSearchToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);\n\tif (mode === \"off\") {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst selectedTools = selectTools(mode);\n\tfor (const selectedTool of selectedTools) {\n\t\tconst exists = sanitizedTools.some((tool) => tool.name === selectedTool.name);\n\t\tif (!exists) {\n\t\t\tsanitizedTools.push(selectedTool);\n\t\t}\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const ANTHROPIC_TOOL_SEARCH_SECTION = `\n## Tool Search\n\nAnthropic native tool search is enabled. Use tool_search_tool_regex or tool_search_tool_bm25 to discover relevant tools from large catalogs before calling them.\n`;\n\nexport default function anthropicToolSearchExtension(pi: ExtensionAPI): void {\n\tlet hasWarnedInvalidEnvValue = false;\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst envValue = process.env[TOOL_SEARCH_ENV];\n\t\tconst mode = parseToolSearchMode(envValue);\n\t\tconst hasInvalidEnvValue = !!envValue && mode === \"off\" && envValue.trim().toLowerCase() !== \"off\";\n\n\t\tif (hasInvalidEnvValue && !hasWarnedInvalidEnvValue) {\n\t\t\thasWarnedInvalidEnvValue = true;\n\t\t\tctx.ui.notify(\n\t\t\t\t`Ignoring invalid ${TOOL_SEARCH_ENV} value \"${envValue}\". Use off, regex, bm25, or both.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\n\t\treturn addAnthropicToolSearchToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);\n\t\tif (mode === \"off\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_TOOL_SEARCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,112 +0,0 @@
1
- const TOOL_SEARCH_ENV = "PI_ANTHROPIC_TOOL_SEARCH";
2
- const REGEX_TOOL_TYPE = "tool_search_tool_regex_20251119";
3
- const BM25_TOOL_TYPE = "tool_search_tool_bm25_20251119";
4
- const REGEX_TOOL_NAME = "tool_search_tool_regex";
5
- const BM25_TOOL_NAME = "tool_search_tool_bm25";
6
- function isRecord(value) {
7
- return typeof value === "object" && value !== null;
8
- }
9
- function parseToolSearchMode(rawValue) {
10
- if (!rawValue) {
11
- return "off";
12
- }
13
- const normalized = rawValue.trim().toLowerCase();
14
- if (!normalized || normalized === "off") {
15
- return "off";
16
- }
17
- if (normalized === "regex" || normalized === "bm25" || normalized === "both") {
18
- return normalized;
19
- }
20
- return "off";
21
- }
22
- function isToolSearchType(value) {
23
- return typeof value === "string" && value.startsWith("tool_search_tool_");
24
- }
25
- function isNativeToolSearchTool(tool) {
26
- const name = tool.name;
27
- return name === REGEX_TOOL_NAME || name === BM25_TOOL_NAME;
28
- }
29
- function sanitizeTools(tools) {
30
- const sanitized = [];
31
- for (const tool of tools) {
32
- if (!isRecord(tool)) {
33
- continue;
34
- }
35
- const isFunctionVariant = isNativeToolSearchTool(tool) && !isToolSearchType(tool.type);
36
- if (!isFunctionVariant) {
37
- sanitized.push(tool);
38
- }
39
- }
40
- return sanitized;
41
- }
42
- function selectTools(mode) {
43
- if (mode === "regex") {
44
- return [{ type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME }];
45
- }
46
- if (mode === "bm25") {
47
- return [{ type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME }];
48
- }
49
- if (mode === "both") {
50
- return [
51
- { type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME },
52
- { type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME },
53
- ];
54
- }
55
- return [];
56
- }
57
- export function addAnthropicToolSearchToPayload(api, payload) {
58
- if (api !== "anthropic-messages") {
59
- return payload;
60
- }
61
- if (!isRecord(payload)) {
62
- return payload;
63
- }
64
- const mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);
65
- if (mode === "off") {
66
- return payload;
67
- }
68
- const tools = Array.isArray(payload.tools) ? payload.tools : [];
69
- const sanitizedTools = sanitizeTools(tools);
70
- const selectedTools = selectTools(mode);
71
- for (const selectedTool of selectedTools) {
72
- const exists = sanitizedTools.some((tool) => tool.name === selectedTool.name);
73
- if (!exists) {
74
- sanitizedTools.push(selectedTool);
75
- }
76
- }
77
- return {
78
- ...payload,
79
- tools: sanitizedTools,
80
- };
81
- }
82
- export const ANTHROPIC_TOOL_SEARCH_SECTION = `
83
- ## Tool Search
84
-
85
- Anthropic native tool search is enabled. Use tool_search_tool_regex or tool_search_tool_bm25 to discover relevant tools from large catalogs before calling them.
86
- `;
87
- export default function anthropicToolSearchExtension(pi) {
88
- let hasWarnedInvalidEnvValue = false;
89
- pi.on("before_provider_request", (event, ctx) => {
90
- const envValue = process.env[TOOL_SEARCH_ENV];
91
- const mode = parseToolSearchMode(envValue);
92
- const hasInvalidEnvValue = !!envValue && mode === "off" && envValue.trim().toLowerCase() !== "off";
93
- if (hasInvalidEnvValue && !hasWarnedInvalidEnvValue) {
94
- hasWarnedInvalidEnvValue = true;
95
- ctx.ui.notify(`Ignoring invalid ${TOOL_SEARCH_ENV} value "${envValue}". Use off, regex, bm25, or both.`, "warning");
96
- }
97
- return addAnthropicToolSearchToPayload(ctx.model?.api, event.payload);
98
- });
99
- pi.on("before_agent_start", async (event, ctx) => {
100
- if (ctx.model?.api !== "anthropic-messages") {
101
- return undefined;
102
- }
103
- const mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);
104
- if (mode === "off") {
105
- return undefined;
106
- }
107
- return {
108
- systemPrompt: `${event.systemPrompt}\n${ANTHROPIC_TOOL_SEARCH_SECTION}`,
109
- };
110
- });
111
- }
112
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-tool-search/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\ntype ToolSearchMode = \"off\" | \"regex\" | \"bm25\" | \"both\";\n\nconst TOOL_SEARCH_ENV = \"PI_ANTHROPIC_TOOL_SEARCH\";\nconst REGEX_TOOL_TYPE = \"tool_search_tool_regex_20251119\";\nconst BM25_TOOL_TYPE = \"tool_search_tool_bm25_20251119\";\nconst REGEX_TOOL_NAME = \"tool_search_tool_regex\";\nconst BM25_TOOL_NAME = \"tool_search_tool_bm25\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseToolSearchMode(rawValue: string | undefined): ToolSearchMode {\n\tif (!rawValue) {\n\t\treturn \"off\";\n\t}\n\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized || normalized === \"off\") {\n\t\treturn \"off\";\n\t}\n\n\tif (normalized === \"regex\" || normalized === \"bm25\" || normalized === \"both\") {\n\t\treturn normalized;\n\t}\n\n\treturn \"off\";\n}\n\nfunction isToolSearchType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"tool_search_tool_\");\n}\n\nfunction isNativeToolSearchTool(tool: ToolDefinition): boolean {\n\tconst name = tool.name;\n\treturn name === REGEX_TOOL_NAME || name === BM25_TOOL_NAME;\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitized: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst isFunctionVariant = isNativeToolSearchTool(tool) && !isToolSearchType(tool.type);\n\t\tif (!isFunctionVariant) {\n\t\t\tsanitized.push(tool);\n\t\t}\n\t}\n\treturn sanitized;\n}\n\nfunction selectTools(mode: ToolSearchMode): ToolDefinition[] {\n\tif (mode === \"regex\") {\n\t\treturn [{ type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME }];\n\t}\n\n\tif (mode === \"bm25\") {\n\t\treturn [{ type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME }];\n\t}\n\n\tif (mode === \"both\") {\n\t\treturn [\n\t\t\t{ type: REGEX_TOOL_TYPE, name: REGEX_TOOL_NAME },\n\t\t\t{ type: BM25_TOOL_TYPE, name: BM25_TOOL_NAME },\n\t\t];\n\t}\n\n\treturn [];\n}\n\nexport function addAnthropicToolSearchToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);\n\tif (mode === \"off\") {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst selectedTools = selectTools(mode);\n\tfor (const selectedTool of selectedTools) {\n\t\tconst exists = sanitizedTools.some((tool) => tool.name === selectedTool.name);\n\t\tif (!exists) {\n\t\t\tsanitizedTools.push(selectedTool);\n\t\t}\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const ANTHROPIC_TOOL_SEARCH_SECTION = `\n## Tool Search\n\nAnthropic native tool search is enabled. Use tool_search_tool_regex or tool_search_tool_bm25 to discover relevant tools from large catalogs before calling them.\n`;\n\nexport default function anthropicToolSearchExtension(pi: ExtensionAPI): void {\n\tlet hasWarnedInvalidEnvValue = false;\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst envValue = process.env[TOOL_SEARCH_ENV];\n\t\tconst mode = parseToolSearchMode(envValue);\n\t\tconst hasInvalidEnvValue = !!envValue && mode === \"off\" && envValue.trim().toLowerCase() !== \"off\";\n\n\t\tif (hasInvalidEnvValue && !hasWarnedInvalidEnvValue) {\n\t\t\thasWarnedInvalidEnvValue = true;\n\t\t\tctx.ui.notify(\n\t\t\t\t`Ignoring invalid ${TOOL_SEARCH_ENV} value \"${envValue}\". Use off, regex, bm25, or both.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\n\t\treturn addAnthropicToolSearchToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mode = parseToolSearchMode(process.env[TOOL_SEARCH_ENV]);\n\t\tif (mode === \"off\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_TOOL_SEARCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}