@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,302 +0,0 @@
1
- import { Text } from "@earendil-works/pi-tui";
2
- import { Type } from "typebox";
3
- import { DEPTH_ENV_VAR, MAX_SUBAGENT_DEPTH, TASK_ENTRY_TYPE } from "./types.js";
4
- function buildTaskMetadata(args) {
5
- const overview = [
6
- args.agentType,
7
- args.model,
8
- args.activeToolNames && args.activeToolNames.length > 0 ? `tools: ${args.activeToolNames.join(", ")}` : undefined,
9
- ].filter((value) => typeof value === "string" && value.length > 0);
10
- return {
11
- headline: `${args.description}${args.runInBackground ? " [async]" : " [sync]"}`,
12
- ...(overview.length > 0 ? { overview: overview.join(" · ") } : {}),
13
- };
14
- }
15
- function buildTaskOverviewItems(details) {
16
- if (!details) {
17
- return [];
18
- }
19
- return [
20
- details.agentType,
21
- details.model,
22
- details.activeToolNames && details.activeToolNames.length > 0
23
- ? `tools: ${details.activeToolNames.join(", ")}`
24
- : undefined,
25
- ].filter((value) => typeof value === "string" && value.length > 0);
26
- }
27
- const TaskToolParams = Type.Object({
28
- description: Type.String({
29
- description: "A short (3-5 words) description of the task",
30
- }),
31
- prompt: Type.String({
32
- description: "The task for the agent to perform",
33
- }),
34
- run_in_background: Type.Boolean({
35
- description: "REQUIRED. true=async (returns task_id, system notifies on completion), false=sync (waits for result).",
36
- }),
37
- session_id: Type.Optional(Type.String({ description: "Existing Task session to continue" })),
38
- model: Type.Optional(Type.String({ description: "Model to use for this task" })),
39
- agent_type: Type.Optional(Type.String({
40
- description: "Agent type to use for this task (e.g. 'explore', 'general'). Determines available tools and permissions.",
41
- })),
42
- });
43
- function createErrorResult(text) {
44
- return {
45
- content: [{ type: "text", text }],
46
- details: {},
47
- isError: true,
48
- };
49
- }
50
- function resolveModel(params, ctx) {
51
- if (params.model) {
52
- return params.model;
53
- }
54
- if (!ctx.model) {
55
- return undefined;
56
- }
57
- return `${ctx.model.provider}/${ctx.model.id}`;
58
- }
59
- function isCancelledTask(manager, taskId) {
60
- return manager.getTask(taskId)?.status === "cancelled";
61
- }
62
- export function createTaskTool(manager, spawner, pi, agentDescriptions) {
63
- const baseDescription = `Run a sub-agent in sync or async mode.
64
-
65
- Sync mode (run_in_background=false): waits for the sub-agent to finish and returns its text output directly.
66
- Async mode (run_in_background=true): starts the sub-agent, returns a task_id immediately. System sends a notification when done.
67
-
68
- session_id is optional and continues an existing session when provided.
69
- model is optional and defaults to the current model.`;
70
- const fullDescription = agentDescriptions
71
- ? `${baseDescription}\n\nAvailable agent types:\n${agentDescriptions}`
72
- : baseDescription;
73
- const taskTool = {
74
- name: "task",
75
- label: "Task",
76
- description: fullDescription,
77
- promptSnippet: "Run a sub-agent either synchronously for direct output or asynchronously for a background task_id.",
78
- promptGuidelines: [
79
- "Use run_in_background=false when you need the sub-agent result in the same turn.",
80
- "Use run_in_background=true for parallel work. System notifies on completion via <system-reminder>.",
81
- "After launching a background task, do NOT call background_output - wait for the <system-reminder> notification first.",
82
- "Pass session_id to continue an existing sub-agent session.",
83
- ],
84
- parameters: TaskToolParams,
85
- async execute(_toolCallId, params, signal, onUpdate, ctx) {
86
- if (!params.description.trim()) {
87
- return createErrorResult("Error: description is required");
88
- }
89
- const currentDepth = Number.parseInt(process.env[DEPTH_ENV_VAR] ?? "0", 10);
90
- if (currentDepth >= MAX_SUBAGENT_DEPTH) {
91
- return createErrorResult(`Error: max subagent depth (${MAX_SUBAGENT_DEPTH}) exceeded`);
92
- }
93
- const model = resolveModel(params, ctx);
94
- const taskDetails = {
95
- agentType: params.agent_type,
96
- model,
97
- activeToolNames: [],
98
- };
99
- const permissionFlag = typeof pi.getFlag === "function"
100
- ? (pi.getFlag("permission") ?? undefined)
101
- : undefined;
102
- if (!params.run_in_background) {
103
- const spawned = spawner({
104
- prompt: params.prompt,
105
- cwd: ctx.cwd,
106
- model,
107
- agentType: params.agent_type,
108
- sessionPath: params.session_id,
109
- permissionFlag: permissionFlag ?? undefined,
110
- signal,
111
- });
112
- const result = await spawned.result;
113
- return {
114
- content: [{ type: "text", text: result.text || "(no output)" }],
115
- details: taskDetails,
116
- };
117
- }
118
- let executeReturned = false;
119
- try {
120
- const task = manager.launch({
121
- description: params.description,
122
- prompt: params.prompt,
123
- model,
124
- agentType: params.agent_type,
125
- pid: undefined,
126
- sessionPath: params.session_id,
127
- activeToolNames: [],
128
- completedAt: undefined,
129
- result: undefined,
130
- error: undefined,
131
- parentSessionId: "unknown",
132
- });
133
- pi.appendEntry(TASK_ENTRY_TYPE, task);
134
- const spawned = spawner({
135
- prompt: params.prompt,
136
- cwd: ctx.cwd,
137
- model,
138
- agentType: params.agent_type,
139
- sessionPath: params.session_id,
140
- permissionFlag: permissionFlag ?? undefined,
141
- signal,
142
- onEvent: (() => {
143
- const activeToolCalls = new Map();
144
- return (event) => {
145
- if (event.type === "tool_execution_start") {
146
- activeToolCalls.set(event.toolCallId, event.toolName);
147
- }
148
- else if (event.type === "tool_execution_end") {
149
- activeToolCalls.delete(event.toolCallId);
150
- }
151
- const currentTask = manager.getTask(task.id);
152
- if (!currentTask) {
153
- return;
154
- }
155
- const activeToolNames = Array.from(activeToolCalls.values());
156
- manager.updateTask(task.id, {
157
- activeToolNames,
158
- ...(activeToolCalls.size > 0 && currentTask.status === "pending" ? { status: "running" } : {}),
159
- });
160
- if (!executeReturned) {
161
- onUpdate?.({
162
- content: [],
163
- details: {
164
- ...taskDetails,
165
- activeToolNames,
166
- },
167
- });
168
- }
169
- const activeTask = manager.getTask(task.id);
170
- if (activeTask) {
171
- pi.appendEntry(TASK_ENTRY_TYPE, activeTask);
172
- }
173
- };
174
- })(),
175
- });
176
- if (spawned.process.pid !== undefined) {
177
- manager.updateTask(task.id, { pid: spawned.process.pid, status: "running" });
178
- onUpdate?.({ content: [], details: taskDetails });
179
- const runningTask = manager.getTask(task.id);
180
- if (runningTask) {
181
- pi.appendEntry(TASK_ENTRY_TYPE, runningTask);
182
- }
183
- }
184
- spawned.result
185
- .then((result) => {
186
- if (isCancelledTask(manager, task.id)) {
187
- return;
188
- }
189
- manager.updateTask(task.id, {
190
- status: result.exitCode === 0 ? "completed" : "error",
191
- completedAt: new Date(),
192
- activeToolNames: [],
193
- result: result.text,
194
- error: result.exitCode === 0 ? undefined : `Sub-agent exited with code ${result.exitCode}`,
195
- });
196
- const completedTask = manager.getTask(task.id);
197
- if (completedTask) {
198
- pi.appendEntry(TASK_ENTRY_TYPE, completedTask);
199
- }
200
- pi.sendMessage({
201
- customType: "background-task.complete",
202
- display: true,
203
- content: [
204
- {
205
- type: "text",
206
- text: [
207
- `Task ${task.id} completed: ${params.description}`,
208
- "",
209
- "Result:",
210
- result.text || "(no output)",
211
- ].join("\n"),
212
- },
213
- ],
214
- }, { triggerTurn: true, deliverAs: "followUp" });
215
- })
216
- .catch((error) => {
217
- if (isCancelledTask(manager, task.id)) {
218
- return;
219
- }
220
- manager.updateTask(task.id, {
221
- status: "error",
222
- completedAt: new Date(),
223
- activeToolNames: [],
224
- error: error instanceof Error ? error.message : String(error),
225
- });
226
- const erroredTask = manager.getTask(task.id);
227
- if (erroredTask) {
228
- pi.appendEntry(TASK_ENTRY_TYPE, erroredTask);
229
- }
230
- const errorMsg = error instanceof Error ? error.message : String(error);
231
- pi.sendMessage({
232
- customType: "background-task.complete",
233
- display: true,
234
- content: [
235
- {
236
- type: "text",
237
- text: [`Task ${task.id} failed: ${params.description}`, "", "Error:", errorMsg].join("\n"),
238
- },
239
- ],
240
- }, { triggerTurn: true, deliverAs: "followUp" });
241
- });
242
- executeReturned = true;
243
- const sessionIdBlock = params.session_id
244
- ? `\n\n<task_metadata>\nsession_id: ${params.session_id}\ntask_id: ${task.id}\nbackground_task_id: ${task.id}\n</task_metadata>\n\nto continue: task(session_id="${params.session_id}", run_in_background=false, prompt="...")`
245
- : `\n\n<task_metadata>\ntask_id: ${task.id}\nbackground_task_id: ${task.id}\n</task_metadata>`;
246
- return {
247
- content: [
248
- {
249
- type: "text",
250
- text: `Background task launched.
251
-
252
- Background Task ID: ${task.id}
253
- Description: ${params.description}
254
- Agent: ${params.agent_type ?? "default"}
255
- Status: ${task.status}
256
-
257
- System notifies on completion. Use \`background_output\` with task_id="${task.id}" to check.
258
-
259
- Do NOT call background_output now. Wait for <system-reminder> notification first.${sessionIdBlock}`,
260
- },
261
- ],
262
- details: taskDetails,
263
- };
264
- }
265
- catch (error) {
266
- return createErrorResult(error instanceof Error ? error.message : String(error));
267
- }
268
- },
269
- renderCall(args, theme) {
270
- const metadata = buildTaskMetadata({
271
- description: args.description,
272
- runInBackground: args.run_in_background,
273
- agentType: args.agent_type,
274
- model: args.model,
275
- });
276
- return new Text([
277
- theme.fg("toolTitle", theme.bold("Task ")) + theme.fg("accent", metadata.headline),
278
- ...(metadata.overview ? [theme.fg("muted", ` ${metadata.overview}`)] : []),
279
- ].join("\n"), 0, 0);
280
- },
281
- renderResult(result, options, theme, context) {
282
- const firstContent = result.content[0];
283
- const text = firstContent?.type === "text" ? firstContent.text : undefined;
284
- const argDetails = {
285
- agentType: context.args.agent_type,
286
- model: context.args.model,
287
- };
288
- const callOverviewItems = new Set(buildTaskOverviewItems(argDetails));
289
- const extraOverviewItems = buildTaskOverviewItems(result.details).filter((item) => !callOverviewItems.has(item));
290
- const overview = extraOverviewItems.length > 0 ? extraOverviewItems.join(" · ") : undefined;
291
- if (!text && !overview) {
292
- return new Text("", 0, 0);
293
- }
294
- if (options.isPartial && !text) {
295
- return new Text(overview ? theme.fg("muted", overview) : "", 0, 0);
296
- }
297
- return new Text([...(overview ? [theme.fg("muted", overview)] : []), ...(text ? [theme.fg("muted", text)] : [])].join("\n\n"), 0, 0);
298
- },
299
- };
300
- return taskTool;
301
- }
302
- //# sourceMappingURL=task-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/background-task/task-tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext, ToolDefinition } from \"../../types.js\";\nimport type { BackgroundManager } from \"./manager.js\";\nimport type { spawnSubagent } from \"./spawner.js\";\nimport { DEPTH_ENV_VAR, MAX_SUBAGENT_DEPTH, TASK_ENTRY_TYPE } from \"./types.js\";\n\ntype TaskToolDetails = {\n\tagentType?: string;\n\tmodel?: string;\n\tactiveToolNames?: string[];\n};\n\nfunction buildTaskMetadata(args: {\n\tdescription: string;\n\trunInBackground: boolean;\n\tagentType?: string;\n\tmodel?: string;\n\tactiveToolNames?: string[];\n}): { headline: string; overview?: string } {\n\tconst overview = [\n\t\targs.agentType,\n\t\targs.model,\n\t\targs.activeToolNames && args.activeToolNames.length > 0 ? `tools: ${args.activeToolNames.join(\", \")}` : undefined,\n\t].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n\n\treturn {\n\t\theadline: `${args.description}${args.runInBackground ? \" [async]\" : \" [sync]\"}`,\n\t\t...(overview.length > 0 ? { overview: overview.join(\" · \") } : {}),\n\t};\n}\n\nfunction buildTaskOverviewItems(details: TaskToolDetails | undefined): string[] {\n\tif (!details) {\n\t\treturn [];\n\t}\n\n\treturn [\n\t\tdetails.agentType,\n\t\tdetails.model,\n\t\tdetails.activeToolNames && details.activeToolNames.length > 0\n\t\t\t? `tools: ${details.activeToolNames.join(\", \")}`\n\t\t\t: undefined,\n\t].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n}\n\nconst TaskToolParams = Type.Object({\n\tdescription: Type.String({\n\t\tdescription: \"A short (3-5 words) description of the task\",\n\t}),\n\tprompt: Type.String({\n\t\tdescription: \"The task for the agent to perform\",\n\t}),\n\trun_in_background: Type.Boolean({\n\t\tdescription:\n\t\t\t\"REQUIRED. true=async (returns task_id, system notifies on completion), false=sync (waits for result).\",\n\t}),\n\tsession_id: Type.Optional(Type.String({ description: \"Existing Task session to continue\" })),\n\tmodel: Type.Optional(Type.String({ description: \"Model to use for this task\" })),\n\tagent_type: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Agent type to use for this task (e.g. 'explore', 'general'). Determines available tools and permissions.\",\n\t\t}),\n\t),\n});\n\nfunction createErrorResult(text: string): {\n\tcontent: [{ type: \"text\"; text: string }];\n\tdetails: TaskToolDetails;\n\tisError: true;\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails: {},\n\t\tisError: true,\n\t};\n}\n\nfunction resolveModel(params: { model?: string }, ctx: ExtensionContext): string | undefined {\n\tif (params.model) {\n\t\treturn params.model;\n\t}\n\n\tif (!ctx.model) {\n\t\treturn undefined;\n\t}\n\n\treturn `${ctx.model.provider}/${ctx.model.id}`;\n}\n\nfunction isCancelledTask(manager: BackgroundManager, taskId: string): boolean {\n\treturn manager.getTask(taskId)?.status === \"cancelled\";\n}\n\nexport function createTaskTool(\n\tmanager: BackgroundManager,\n\tspawner: typeof spawnSubagent,\n\tpi: ExtensionAPI,\n\tagentDescriptions?: string,\n): ToolDefinition<typeof TaskToolParams, TaskToolDetails> {\n\tconst baseDescription = `Run a sub-agent in sync or async mode.\n\nSync mode (run_in_background=false): waits for the sub-agent to finish and returns its text output directly.\nAsync mode (run_in_background=true): starts the sub-agent, returns a task_id immediately. System sends a notification when done.\n\nsession_id is optional and continues an existing session when provided.\nmodel is optional and defaults to the current model.`;\n\n\tconst fullDescription = agentDescriptions\n\t\t? `${baseDescription}\\n\\nAvailable agent types:\\n${agentDescriptions}`\n\t\t: baseDescription;\n\n\tconst taskTool: ToolDefinition<typeof TaskToolParams, TaskToolDetails> = {\n\t\tname: \"task\",\n\t\tlabel: \"Task\",\n\t\tdescription: fullDescription,\n\t\tpromptSnippet:\n\t\t\t\"Run a sub-agent either synchronously for direct output or asynchronously for a background task_id.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use run_in_background=false when you need the sub-agent result in the same turn.\",\n\t\t\t\"Use run_in_background=true for parallel work. System notifies on completion via <system-reminder>.\",\n\t\t\t\"After launching a background task, do NOT call background_output - wait for the <system-reminder> notification first.\",\n\t\t\t\"Pass session_id to continue an existing sub-agent session.\",\n\t\t],\n\t\tparameters: TaskToolParams,\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tif (!params.description.trim()) {\n\t\t\t\treturn createErrorResult(\"Error: description is required\");\n\t\t\t}\n\n\t\t\tconst currentDepth = Number.parseInt(process.env[DEPTH_ENV_VAR] ?? \"0\", 10);\n\t\t\tif (currentDepth >= MAX_SUBAGENT_DEPTH) {\n\t\t\t\treturn createErrorResult(`Error: max subagent depth (${MAX_SUBAGENT_DEPTH}) exceeded`);\n\t\t\t}\n\n\t\t\tconst model = resolveModel(params, ctx);\n\t\t\tconst taskDetails: TaskToolDetails = {\n\t\t\t\tagentType: params.agent_type,\n\t\t\t\tmodel,\n\t\t\t\tactiveToolNames: [],\n\t\t\t};\n\n\t\t\tconst permissionFlag =\n\t\t\t\ttypeof pi.getFlag === \"function\"\n\t\t\t\t\t? ((pi.getFlag(\"permission\") as string | undefined) ?? undefined)\n\t\t\t\t\t: undefined;\n\n\t\t\tif (!params.run_in_background) {\n\t\t\t\tconst spawned = spawner({\n\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tmodel,\n\t\t\t\t\tagentType: params.agent_type,\n\t\t\t\t\tsessionPath: params.session_id,\n\t\t\t\t\tpermissionFlag: permissionFlag ?? undefined,\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t\tconst result = await spawned.result;\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: result.text || \"(no output)\" }],\n\t\t\t\t\tdetails: taskDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet executeReturned = false;\n\t\t\ttry {\n\t\t\t\tconst task = manager.launch({\n\t\t\t\t\tdescription: params.description,\n\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\tmodel,\n\t\t\t\t\tagentType: params.agent_type,\n\t\t\t\t\tpid: undefined,\n\t\t\t\t\tsessionPath: params.session_id,\n\t\t\t\t\tactiveToolNames: [],\n\t\t\t\t\tcompletedAt: undefined,\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\terror: undefined,\n\t\t\t\t\tparentSessionId: \"unknown\",\n\t\t\t\t});\n\n\t\t\t\tpi.appendEntry(TASK_ENTRY_TYPE, task);\n\n\t\t\t\tconst spawned = spawner({\n\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tmodel,\n\t\t\t\t\tagentType: params.agent_type,\n\t\t\t\t\tsessionPath: params.session_id,\n\t\t\t\t\tpermissionFlag: permissionFlag ?? undefined,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonEvent: (() => {\n\t\t\t\t\t\tconst activeToolCalls = new Map<string, string>();\n\t\t\t\t\t\treturn (event) => {\n\t\t\t\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\t\t\t\tactiveToolCalls.set(event.toolCallId, event.toolName);\n\t\t\t\t\t\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\t\t\t\t\t\tactiveToolCalls.delete(event.toolCallId);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst currentTask = manager.getTask(task.id);\n\t\t\t\t\t\t\tif (!currentTask) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst activeToolNames = Array.from(activeToolCalls.values());\n\n\t\t\t\t\t\t\tmanager.updateTask(task.id, {\n\t\t\t\t\t\t\t\tactiveToolNames,\n\t\t\t\t\t\t\t\t...(activeToolCalls.size > 0 && currentTask.status === \"pending\" ? { status: \"running\" } : {}),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (!executeReturned) {\n\t\t\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\t\t\t...taskDetails,\n\t\t\t\t\t\t\t\t\t\tactiveToolNames,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst activeTask = manager.getTask(task.id);\n\t\t\t\t\t\t\tif (activeTask) {\n\t\t\t\t\t\t\t\tpi.appendEntry(TASK_ENTRY_TYPE, activeTask);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t})(),\n\t\t\t\t});\n\n\t\t\t\tif (spawned.process.pid !== undefined) {\n\t\t\t\t\tmanager.updateTask(task.id, { pid: spawned.process.pid, status: \"running\" });\n\t\t\t\t\tonUpdate?.({ content: [], details: taskDetails });\n\t\t\t\t\tconst runningTask = manager.getTask(task.id);\n\t\t\t\t\tif (runningTask) {\n\t\t\t\t\t\tpi.appendEntry(TASK_ENTRY_TYPE, runningTask);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tspawned.result\n\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\tif (isCancelledTask(manager, task.id)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmanager.updateTask(task.id, {\n\t\t\t\t\t\t\tstatus: result.exitCode === 0 ? \"completed\" : \"error\",\n\t\t\t\t\t\t\tcompletedAt: new Date(),\n\t\t\t\t\t\t\tactiveToolNames: [],\n\t\t\t\t\t\t\tresult: result.text,\n\t\t\t\t\t\t\terror: result.exitCode === 0 ? undefined : `Sub-agent exited with code ${result.exitCode}`,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst completedTask = manager.getTask(task.id);\n\t\t\t\t\t\tif (completedTask) {\n\t\t\t\t\t\t\tpi.appendEntry(TASK_ENTRY_TYPE, completedTask);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcustomType: \"background-task.complete\",\n\t\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: [\n\t\t\t\t\t\t\t\t\t\t\t`Task ${task.id} completed: ${params.description}`,\n\t\t\t\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\t\t\t\"Result:\",\n\t\t\t\t\t\t\t\t\t\t\tresult.text || \"(no output)\",\n\t\t\t\t\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ triggerTurn: true, deliverAs: \"followUp\" },\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\t\tif (isCancelledTask(manager, task.id)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmanager.updateTask(task.id, {\n\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t\tcompletedAt: new Date(),\n\t\t\t\t\t\t\tactiveToolNames: [],\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst erroredTask = manager.getTask(task.id);\n\t\t\t\t\t\tif (erroredTask) {\n\t\t\t\t\t\t\tpi.appendEntry(TASK_ENTRY_TYPE, erroredTask);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcustomType: \"background-task.complete\",\n\t\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\ttext: [`Task ${task.id} failed: ${params.description}`, \"\", \"Error:\", errorMsg].join(\n\t\t\t\t\t\t\t\t\t\t\t\"\\n\",\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ triggerTurn: true, deliverAs: \"followUp\" },\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\texecuteReturned = true;\n\n\t\t\t\tconst sessionIdBlock = params.session_id\n\t\t\t\t\t? `\\n\\n<task_metadata>\\nsession_id: ${params.session_id}\\ntask_id: ${task.id}\\nbackground_task_id: ${task.id}\\n</task_metadata>\\n\\nto continue: task(session_id=\"${params.session_id}\", run_in_background=false, prompt=\"...\")`\n\t\t\t\t\t: `\\n\\n<task_metadata>\\ntask_id: ${task.id}\\nbackground_task_id: ${task.id}\\n</task_metadata>`;\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Background task launched.\n\nBackground Task ID: ${task.id}\nDescription: ${params.description}\nAgent: ${params.agent_type ?? \"default\"}\nStatus: ${task.status}\n\nSystem notifies on completion. Use \\`background_output\\` with task_id=\"${task.id}\" to check.\n\nDo NOT call background_output now. Wait for <system-reminder> notification first.${sessionIdBlock}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: taskDetails,\n\t\t\t\t};\n\t\t\t} catch (error: unknown) {\n\t\t\t\treturn createErrorResult(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\tconst metadata = buildTaskMetadata({\n\t\t\t\tdescription: args.description,\n\t\t\t\trunInBackground: args.run_in_background,\n\t\t\t\tagentType: args.agent_type,\n\t\t\t\tmodel: args.model,\n\t\t\t});\n\t\t\treturn new Text(\n\t\t\t\t[\n\t\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"Task \")) + theme.fg(\"accent\", metadata.headline),\n\t\t\t\t\t...(metadata.overview ? [theme.fg(\"muted\", ` ${metadata.overview}`)] : []),\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst firstContent = result.content[0];\n\t\t\tconst text = firstContent?.type === \"text\" ? firstContent.text : undefined;\n\t\t\tconst argDetails: TaskToolDetails = {\n\t\t\t\tagentType: context.args.agent_type,\n\t\t\t\tmodel: context.args.model,\n\t\t\t};\n\t\t\tconst callOverviewItems = new Set(buildTaskOverviewItems(argDetails));\n\t\t\tconst extraOverviewItems = buildTaskOverviewItems(result.details).filter(\n\t\t\t\t(item) => !callOverviewItems.has(item),\n\t\t\t);\n\t\t\tconst overview = extraOverviewItems.length > 0 ? extraOverviewItems.join(\" · \") : undefined;\n\n\t\t\tif (!text && !overview) {\n\t\t\t\treturn new Text(\"\", 0, 0);\n\t\t\t}\n\n\t\t\tif (options.isPartial && !text) {\n\t\t\t\treturn new Text(overview ? theme.fg(\"muted\", overview) : \"\", 0, 0);\n\t\t\t}\n\n\t\t\treturn new Text(\n\t\t\t\t[...(overview ? [theme.fg(\"muted\", overview)] : []), ...(text ? [theme.fg(\"muted\", text)] : [])].join(\n\t\t\t\t\t\"\\n\\n\",\n\t\t\t\t),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t};\n\n\treturn taskTool;\n}\n"]}
@@ -1,72 +0,0 @@
1
- import { type Static, Type } from "typebox";
2
- export type SpawnOptions = {
3
- prompt: string;
4
- cwd: string;
5
- model?: string;
6
- agentType?: string;
7
- sessionPath?: string;
8
- permissionFlag?: string;
9
- signal?: AbortSignal;
10
- env?: Record<string, string>;
11
- onEvent?: (event: SpawnEvent) => void;
12
- };
13
- export type SpawnEvent = {
14
- type: "tool_execution_start";
15
- toolCallId: string;
16
- toolName: string;
17
- } | {
18
- type: "tool_execution_end";
19
- toolCallId: string;
20
- toolName: string;
21
- };
22
- export type SpawnedAgent = {
23
- process: import("node:child_process").ChildProcess;
24
- result: Promise<{
25
- text: string;
26
- exitCode: number;
27
- }>;
28
- };
29
- export type BackgroundTask = {
30
- id: string;
31
- description: string;
32
- prompt: string;
33
- model: string | undefined;
34
- agentType: string | undefined;
35
- status: "pending" | "running" | "completed" | "error" | "cancelled";
36
- pid: number | undefined;
37
- sessionPath: string | undefined;
38
- activeToolNames: string[];
39
- startedAt: Date;
40
- completedAt: Date | undefined;
41
- result: string | undefined;
42
- error: string | undefined;
43
- parentSessionId: string;
44
- };
45
- export declare const TaskToolParams: Type.TObject<{
46
- description: Type.TString;
47
- prompt: Type.TString;
48
- run_in_background: Type.TBoolean;
49
- session_id: Type.TOptional<Type.TString>;
50
- model: Type.TOptional<Type.TString>;
51
- agent_type: Type.TOptional<Type.TString>;
52
- }>;
53
- export type TaskToolParamsType = Static<typeof TaskToolParams>;
54
- export declare const BackgroundOutputParams: Type.TObject<{
55
- task_id: Type.TString;
56
- block: Type.TOptional<Type.TBoolean>;
57
- timeout: Type.TOptional<Type.TNumber>;
58
- }>;
59
- export type BackgroundOutputParamsType = Static<typeof BackgroundOutputParams>;
60
- export declare const BackgroundCancelParams: Type.TObject<{
61
- taskId: Type.TOptional<Type.TString>;
62
- all: Type.TOptional<Type.TBoolean>;
63
- }>;
64
- export type BackgroundCancelParamsType = Static<typeof BackgroundCancelParams>;
65
- export declare const MAX_CONCURRENT_TASKS: number;
66
- export declare const MAX_SUBAGENT_DEPTH = 1;
67
- export declare const DEPTH_ENV_VAR = "SANEPI_SUBAGENT_DEPTH";
68
- export declare const AGENT_TYPE_ENV_VAR = "SANEPI_AGENT_TYPE";
69
- export declare const TASK_ENTRY_TYPE = "background-task.state";
70
- export declare const DEFAULT_BLOCK_TIMEOUT = 60000;
71
- export declare const MAX_BLOCK_TIMEOUT = 300000;
72
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/background-task/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,UAAU,GACnB;IACA,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAChB,GACD;IACA,IAAI,EAAE,oBAAoB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,OAAO,oBAAoB,EAAE,YAAY,CAAC;IACnD,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC;IACpE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;EAezB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE/D,eAAO,MAAM,sBAAsB;;;;EAQjC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/E,eAAO,MAAM,sBAAsB;;;EAGjC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/E,eAAO,MAAM,oBAAoB,QAAW,CAAC;AAC7C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,aAAa,0BAA0B,CAAC;AACrD,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,eAAe,0BAA0B,CAAC;AACvD,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,iBAAiB,SAAS,CAAC","sourcesContent":["import { type Static, Type } from \"typebox\";\n\nexport type SpawnOptions = {\n\tprompt: string;\n\tcwd: string;\n\tmodel?: string;\n\tagentType?: string;\n\tsessionPath?: string;\n\tpermissionFlag?: string;\n\tsignal?: AbortSignal;\n\tenv?: Record<string, string>;\n\tonEvent?: (event: SpawnEvent) => void;\n};\n\nexport type SpawnEvent =\n\t| {\n\t\t\ttype: \"tool_execution_start\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_end\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t };\n\nexport type SpawnedAgent = {\n\tprocess: import(\"node:child_process\").ChildProcess;\n\tresult: Promise<{ text: string; exitCode: number }>;\n};\n\nexport type BackgroundTask = {\n\tid: string;\n\tdescription: string;\n\tprompt: string;\n\tmodel: string | undefined;\n\tagentType: string | undefined;\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"error\" | \"cancelled\";\n\tpid: number | undefined;\n\tsessionPath: string | undefined;\n\tactiveToolNames: string[];\n\tstartedAt: Date;\n\tcompletedAt: Date | undefined;\n\tresult: string | undefined;\n\terror: string | undefined;\n\tparentSessionId: string;\n};\n\nexport const TaskToolParams = Type.Object({\n\tdescription: Type.String({ description: \"A short (3-5 words) description of the task\" }),\n\tprompt: Type.String({ description: \"The task for the agent to perform\" }),\n\trun_in_background: Type.Boolean({\n\t\tdescription:\n\t\t\t\"REQUIRED. true=async (returns task_id, system notifies on completion), false=sync (waits for result).\",\n\t}),\n\tsession_id: Type.Optional(Type.String({ description: \"Existing Task session to continue\" })),\n\tmodel: Type.Optional(Type.String({ description: \"Model to use for this task\" })),\n\tagent_type: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Agent type to use for this task (e.g. 'explore', 'general'). Determines available tools and permissions.\",\n\t\t}),\n\t),\n});\n\nexport type TaskToolParamsType = Static<typeof TaskToolParams>;\n\nexport const BackgroundOutputParams = Type.Object({\n\ttask_id: Type.String({ description: \"Task ID to get output from\" }),\n\tblock: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Wait for completion (default: false). System notifies when done, so blocking is rarely needed.\",\n\t\t}),\n\t),\n\ttimeout: Type.Optional(Type.Number({ description: \"Max wait time in ms (default: 60000, max: 300000)\" })),\n});\n\nexport type BackgroundOutputParamsType = Static<typeof BackgroundOutputParams>;\n\nexport const BackgroundCancelParams = Type.Object({\n\ttaskId: Type.Optional(Type.String({ description: \"Task ID to cancel (required if all=false)\" })),\n\tall: Type.Optional(Type.Boolean({ description: \"Cancel all running background tasks (default: false)\" })),\n});\n\nexport type BackgroundCancelParamsType = Static<typeof BackgroundCancelParams>;\n\nexport const MAX_CONCURRENT_TASKS = Infinity;\nexport const MAX_SUBAGENT_DEPTH = 1;\nexport const DEPTH_ENV_VAR = \"SANEPI_SUBAGENT_DEPTH\";\nexport const AGENT_TYPE_ENV_VAR = \"SANEPI_AGENT_TYPE\";\nexport const TASK_ENTRY_TYPE = \"background-task.state\";\nexport const DEFAULT_BLOCK_TIMEOUT = 60000;\nexport const MAX_BLOCK_TIMEOUT = 300000;\n"]}
@@ -1,32 +0,0 @@
1
- import { Type } from "typebox";
2
- export const TaskToolParams = Type.Object({
3
- description: Type.String({ description: "A short (3-5 words) description of the task" }),
4
- prompt: Type.String({ description: "The task for the agent to perform" }),
5
- run_in_background: Type.Boolean({
6
- description: "REQUIRED. true=async (returns task_id, system notifies on completion), false=sync (waits for result).",
7
- }),
8
- session_id: Type.Optional(Type.String({ description: "Existing Task session to continue" })),
9
- model: Type.Optional(Type.String({ description: "Model to use for this task" })),
10
- agent_type: Type.Optional(Type.String({
11
- description: "Agent type to use for this task (e.g. 'explore', 'general'). Determines available tools and permissions.",
12
- })),
13
- });
14
- export const BackgroundOutputParams = Type.Object({
15
- task_id: Type.String({ description: "Task ID to get output from" }),
16
- block: Type.Optional(Type.Boolean({
17
- description: "Wait for completion (default: false). System notifies when done, so blocking is rarely needed.",
18
- })),
19
- timeout: Type.Optional(Type.Number({ description: "Max wait time in ms (default: 60000, max: 300000)" })),
20
- });
21
- export const BackgroundCancelParams = Type.Object({
22
- taskId: Type.Optional(Type.String({ description: "Task ID to cancel (required if all=false)" })),
23
- all: Type.Optional(Type.Boolean({ description: "Cancel all running background tasks (default: false)" })),
24
- });
25
- export const MAX_CONCURRENT_TASKS = Infinity;
26
- export const MAX_SUBAGENT_DEPTH = 1;
27
- export const DEPTH_ENV_VAR = "SANEPI_SUBAGENT_DEPTH";
28
- export const AGENT_TYPE_ENV_VAR = "SANEPI_AGENT_TYPE";
29
- export const TASK_ENTRY_TYPE = "background-task.state";
30
- export const DEFAULT_BLOCK_TIMEOUT = 60000;
31
- export const MAX_BLOCK_TIMEOUT = 300000;
32
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/background-task/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAgD5C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;IACxF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;IACzE,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/B,WAAW,EACV,uGAAuG;KACxG,CAAC;IACF,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,CAAC;IAC5F,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAChF,UAAU,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,0GAA0G;KAC3G,CAAC,CACF;CACD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,OAAO,CAAC;QACZ,WAAW,EAAE,gGAAgG;KAC7G,CAAC,CACF;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC,CAAC;CACzG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC,CAAC;IAChG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CAAC;CACzG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC","sourcesContent":["import { type Static, Type } from \"typebox\";\n\nexport type SpawnOptions = {\n\tprompt: string;\n\tcwd: string;\n\tmodel?: string;\n\tagentType?: string;\n\tsessionPath?: string;\n\tpermissionFlag?: string;\n\tsignal?: AbortSignal;\n\tenv?: Record<string, string>;\n\tonEvent?: (event: SpawnEvent) => void;\n};\n\nexport type SpawnEvent =\n\t| {\n\t\t\ttype: \"tool_execution_start\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t }\n\t| {\n\t\t\ttype: \"tool_execution_end\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t };\n\nexport type SpawnedAgent = {\n\tprocess: import(\"node:child_process\").ChildProcess;\n\tresult: Promise<{ text: string; exitCode: number }>;\n};\n\nexport type BackgroundTask = {\n\tid: string;\n\tdescription: string;\n\tprompt: string;\n\tmodel: string | undefined;\n\tagentType: string | undefined;\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"error\" | \"cancelled\";\n\tpid: number | undefined;\n\tsessionPath: string | undefined;\n\tactiveToolNames: string[];\n\tstartedAt: Date;\n\tcompletedAt: Date | undefined;\n\tresult: string | undefined;\n\terror: string | undefined;\n\tparentSessionId: string;\n};\n\nexport const TaskToolParams = Type.Object({\n\tdescription: Type.String({ description: \"A short (3-5 words) description of the task\" }),\n\tprompt: Type.String({ description: \"The task for the agent to perform\" }),\n\trun_in_background: Type.Boolean({\n\t\tdescription:\n\t\t\t\"REQUIRED. true=async (returns task_id, system notifies on completion), false=sync (waits for result).\",\n\t}),\n\tsession_id: Type.Optional(Type.String({ description: \"Existing Task session to continue\" })),\n\tmodel: Type.Optional(Type.String({ description: \"Model to use for this task\" })),\n\tagent_type: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Agent type to use for this task (e.g. 'explore', 'general'). Determines available tools and permissions.\",\n\t\t}),\n\t),\n});\n\nexport type TaskToolParamsType = Static<typeof TaskToolParams>;\n\nexport const BackgroundOutputParams = Type.Object({\n\ttask_id: Type.String({ description: \"Task ID to get output from\" }),\n\tblock: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Wait for completion (default: false). System notifies when done, so blocking is rarely needed.\",\n\t\t}),\n\t),\n\ttimeout: Type.Optional(Type.Number({ description: \"Max wait time in ms (default: 60000, max: 300000)\" })),\n});\n\nexport type BackgroundOutputParamsType = Static<typeof BackgroundOutputParams>;\n\nexport const BackgroundCancelParams = Type.Object({\n\ttaskId: Type.Optional(Type.String({ description: \"Task ID to cancel (required if all=false)\" })),\n\tall: Type.Optional(Type.Boolean({ description: \"Cancel all running background tasks (default: false)\" })),\n});\n\nexport type BackgroundCancelParamsType = Static<typeof BackgroundCancelParams>;\n\nexport const MAX_CONCURRENT_TASKS = Infinity;\nexport const MAX_SUBAGENT_DEPTH = 1;\nexport const DEPTH_ENV_VAR = \"SANEPI_SUBAGENT_DEPTH\";\nexport const AGENT_TYPE_ENV_VAR = \"SANEPI_AGENT_TYPE\";\nexport const TASK_ENTRY_TYPE = \"background-task.state\";\nexport const DEFAULT_BLOCK_TIMEOUT = 60000;\nexport const MAX_BLOCK_TIMEOUT = 300000;\n"]}
@@ -1,7 +0,0 @@
1
- import type { Api } from "@earendil-works/pi-ai";
2
- import type { ExtensionAPI } from "../../types.js";
3
- export declare function isGoogleCodeExecutionEnabled(): boolean;
4
- export declare function addGoogleCodeExecutionToPayload(api: Api | undefined, payload: unknown): unknown;
5
- export declare const GOOGLE_CODE_EXECUTION_SECTION = "\n## Code Execution\n\nThe native code_execution tool is available in this session. The model\nruns Python in a Google-managed sandbox. Prefer code_execution for\nnumerical work, file analysis, and one-off computations when explicit\nresults are needed.\n";
6
- export default function googleCodeExecutionExtension(pi: ExtensionAPI): void;
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/google-code-execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0BnD,wBAAgB,4BAA4B,IAAI,OAAO,CAQtD;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA2B/F;AAED,eAAO,MAAM,6BAA6B,oQAOzC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkB3E","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst ENABLE_ENV = \"PI_GOOGLE_CODE_EXECUTION\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isGoogleApi(api: Api | undefined): api is \"google-generative-ai\" | \"google-vertex\" {\n\treturn api === \"google-generative-ai\" || api === \"google-vertex\";\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\tsanitizedTools.push(tool);\n\t}\n\treturn sanitizedTools;\n}\n\nexport function isGoogleCodeExecutionEnabled(): boolean {\n\tconst value = process.env[ENABLE_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 addGoogleCodeExecutionToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (!isGoogleApi(api)) {\n\t\treturn payload;\n\t}\n\n\tif (!isGoogleCodeExecutionEnabled()) {\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\n\t// Google function tools use `functionDeclarations`, not a `codeExecution` key,\n\t// so there is no function-tool name conflict to deduplicate here.\n\tconst hasCodeExecution = sanitizedTools.some((tool) => \"codeExecution\" in tool);\n\tif (!hasCodeExecution) {\n\t\tsanitizedTools.push({ codeExecution: {} });\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const GOOGLE_CODE_EXECUTION_SECTION = `\n## Code Execution\n\nThe native code_execution tool is available in this session. The model\nruns Python in a Google-managed sandbox. Prefer code_execution for\nnumerical work, file analysis, and one-off computations when explicit\nresults are needed.\n`;\n\nexport default function googleCodeExecutionExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addGoogleCodeExecutionToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (!isGoogleApi(ctx.model?.api)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isGoogleCodeExecutionEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${GOOGLE_CODE_EXECUTION_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,73 +0,0 @@
1
- const ENABLE_ENV = "PI_GOOGLE_CODE_EXECUTION";
2
- function isRecord(value) {
3
- return typeof value === "object" && value !== null;
4
- }
5
- function isGoogleApi(api) {
6
- return api === "google-generative-ai" || api === "google-vertex";
7
- }
8
- function sanitizeTools(tools) {
9
- const sanitizedTools = [];
10
- for (const tool of tools) {
11
- if (!isRecord(tool)) {
12
- continue;
13
- }
14
- sanitizedTools.push(tool);
15
- }
16
- return sanitizedTools;
17
- }
18
- export function isGoogleCodeExecutionEnabled() {
19
- const value = process.env[ENABLE_ENV];
20
- if (!value) {
21
- return false;
22
- }
23
- const normalized = value.trim().toLowerCase();
24
- return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
25
- }
26
- export function addGoogleCodeExecutionToPayload(api, payload) {
27
- if (!isGoogleApi(api)) {
28
- return payload;
29
- }
30
- if (!isGoogleCodeExecutionEnabled()) {
31
- return payload;
32
- }
33
- if (!isRecord(payload)) {
34
- return payload;
35
- }
36
- const tools = Array.isArray(payload.tools) ? payload.tools : [];
37
- const sanitizedTools = sanitizeTools(tools);
38
- // Google function tools use `functionDeclarations`, not a `codeExecution` key,
39
- // so there is no function-tool name conflict to deduplicate here.
40
- const hasCodeExecution = sanitizedTools.some((tool) => "codeExecution" in tool);
41
- if (!hasCodeExecution) {
42
- sanitizedTools.push({ codeExecution: {} });
43
- }
44
- return {
45
- ...payload,
46
- tools: sanitizedTools,
47
- };
48
- }
49
- export const GOOGLE_CODE_EXECUTION_SECTION = `
50
- ## Code Execution
51
-
52
- The native code_execution tool is available in this session. The model
53
- runs Python in a Google-managed sandbox. Prefer code_execution for
54
- numerical work, file analysis, and one-off computations when explicit
55
- results are needed.
56
- `;
57
- export default function googleCodeExecutionExtension(pi) {
58
- pi.on("before_provider_request", (event, ctx) => {
59
- return addGoogleCodeExecutionToPayload(ctx.model?.api, event.payload);
60
- });
61
- pi.on("before_agent_start", async (event, ctx) => {
62
- if (!isGoogleApi(ctx.model?.api)) {
63
- return undefined;
64
- }
65
- if (!isGoogleCodeExecutionEnabled()) {
66
- return undefined;
67
- }
68
- return {
69
- systemPrompt: `${event.systemPrompt}\n${GOOGLE_CODE_EXECUTION_SECTION}`,
70
- };
71
- });
72
- }
73
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/google-code-execution/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>;\n\nconst ENABLE_ENV = \"PI_GOOGLE_CODE_EXECUTION\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isGoogleApi(api: Api | undefined): api is \"google-generative-ai\" | \"google-vertex\" {\n\treturn api === \"google-generative-ai\" || api === \"google-vertex\";\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\tsanitizedTools.push(tool);\n\t}\n\treturn sanitizedTools;\n}\n\nexport function isGoogleCodeExecutionEnabled(): boolean {\n\tconst value = process.env[ENABLE_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 addGoogleCodeExecutionToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (!isGoogleApi(api)) {\n\t\treturn payload;\n\t}\n\n\tif (!isGoogleCodeExecutionEnabled()) {\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\n\t// Google function tools use `functionDeclarations`, not a `codeExecution` key,\n\t// so there is no function-tool name conflict to deduplicate here.\n\tconst hasCodeExecution = sanitizedTools.some((tool) => \"codeExecution\" in tool);\n\tif (!hasCodeExecution) {\n\t\tsanitizedTools.push({ codeExecution: {} });\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport const GOOGLE_CODE_EXECUTION_SECTION = `\n## Code Execution\n\nThe native code_execution tool is available in this session. The model\nruns Python in a Google-managed sandbox. Prefer code_execution for\nnumerical work, file analysis, and one-off computations when explicit\nresults are needed.\n`;\n\nexport default function googleCodeExecutionExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addGoogleCodeExecutionToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (!isGoogleApi(ctx.model?.api)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isGoogleCodeExecutionEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${GOOGLE_CODE_EXECUTION_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,7 +0,0 @@
1
- import type { Api } from "@earendil-works/pi-ai";
2
- import type { ExtensionAPI } from "../../types.js";
3
- export declare function addGoogleGoogleSearchToPayload(api: Api | undefined, payload: unknown): unknown;
4
- export declare function isGoogleGoogleSearchEnabled(): boolean;
5
- export declare const GOOGLE_GOOGLE_SEARCH_SECTION = "\n## Google Search\n\nThe native google_search tool is available in this session. The model\nqueries Google for current information and grounds responses in real\nsearch results. Prefer google_search when the user asks for current\nor online information.\n";
6
- export default function googleGoogleSearchExtension(pi: ExtensionAPI): void;
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/google-google-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA6CnD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA2B9F;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,eAAO,MAAM,4BAA4B,qQAOxC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkB1E","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst ENABLE_ENV = \"PI_GOOGLE_GOOGLE_SEARCH\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\n\t// Unknown values fall back to default-on behavior.\n\treturn true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isGoogleApi(api: Api | undefined): api is \"google-generative-ai\" | \"google-vertex\" {\n\treturn api === \"google-generative-ai\" || api === \"google-vertex\";\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\tsanitizedTools.push(tool);\n\t}\n\treturn sanitizedTools;\n}\n\nexport function addGoogleGoogleSearchToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (!isGoogleApi(api)) {\n\t\treturn payload;\n\t}\n\n\tif (!isGoogleGoogleSearchEnabled()) {\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\n\t// Google function tools use `functionDeclarations`, not a `googleSearch` key,\n\t// so there is no function-tool name conflict to deduplicate here.\n\tconst hasGoogleSearch = sanitizedTools.some((tool) => \"googleSearch\" in tool);\n\tif (!hasGoogleSearch) {\n\t\tsanitizedTools.push({ googleSearch: {} });\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport function isGoogleGoogleSearchEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nexport const GOOGLE_GOOGLE_SEARCH_SECTION = `\n## Google Search\n\nThe native google_search tool is available in this session. The model\nqueries Google for current information and grounds responses in real\nsearch results. Prefer google_search when the user asks for current\nor online information.\n`;\n\nexport default function googleGoogleSearchExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addGoogleGoogleSearchToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (!isGoogleApi(ctx.model?.api)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isGoogleGoogleSearchEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${GOOGLE_GOOGLE_SEARCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}