@astralyn/pi 1.4.5 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bundle/chunks/chunk-FODCTZXW.js +230 -0
  3. package/dist/bundle/chunks/{chunk-I5S7H7GA.js → chunk-FYKNSJG6.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
  7. package/dist/bundle/chunks/chunk-YJTSOLP2.js +1499 -0
  8. package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
  9. package/dist/bundle/chunks/{execute-GMFGC27P.js → execute-4CWRNHPO.js} +1 -1
  10. package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
  11. package/dist/bundle/chunks/{virtual-modules-6FUV7ZDV.js → virtual-modules-PKEOKGYI.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/index.js +1 -1
  14. package/dist/bundle/rpc-entry.js +1 -1
  15. package/dist/core/agent-session.d.ts +0 -3
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +0 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/index.d.ts +1 -1
  20. package/dist/core/extensions/index.d.ts.map +1 -1
  21. package/dist/core/extensions/index.js.map +1 -1
  22. package/dist/core/isolated-session.d.ts +23 -0
  23. package/dist/core/isolated-session.d.ts.map +1 -0
  24. package/dist/core/isolated-session.js +55 -0
  25. package/dist/core/isolated-session.js.map +1 -0
  26. package/dist/core/package-manager.d.ts +7 -1
  27. package/dist/core/package-manager.d.ts.map +1 -1
  28. package/dist/core/package-manager.js +72 -1
  29. package/dist/core/package-manager.js.map +1 -1
  30. package/dist/core/resource-loader.d.ts +1 -0
  31. package/dist/core/resource-loader.d.ts.map +1 -1
  32. package/dist/core/resource-loader.js +23 -7
  33. package/dist/core/resource-loader.js.map +1 -1
  34. package/dist/core/settings-manager.d.ts +4 -2
  35. package/dist/core/settings-manager.d.ts.map +1 -1
  36. package/dist/core/settings-manager.js +11 -0
  37. package/dist/core/settings-manager.js.map +1 -1
  38. package/dist/core/settings-schema.d.ts +7 -0
  39. package/dist/core/settings-schema.d.ts.map +1 -1
  40. package/dist/core/settings-schema.js +6 -0
  41. package/dist/core/settings-schema.js.map +1 -1
  42. package/dist/core/skills.d.ts +10 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +23 -0
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/tasks/codec.d.ts +12 -0
  47. package/dist/core/tasks/codec.d.ts.map +1 -0
  48. package/dist/core/tasks/codec.js +139 -0
  49. package/dist/core/tasks/codec.js.map +1 -0
  50. package/dist/core/tasks/delivery.d.ts +11 -4
  51. package/dist/core/tasks/delivery.d.ts.map +1 -1
  52. package/dist/core/tasks/delivery.js +9 -9
  53. package/dist/core/tasks/delivery.js.map +1 -1
  54. package/dist/core/tasks/execution.d.ts +71 -0
  55. package/dist/core/tasks/execution.d.ts.map +1 -0
  56. package/dist/core/tasks/execution.js +292 -0
  57. package/dist/core/tasks/execution.js.map +1 -0
  58. package/dist/core/tasks/format.d.ts +0 -2
  59. package/dist/core/tasks/format.d.ts.map +1 -1
  60. package/dist/core/tasks/format.js +1 -16
  61. package/dist/core/tasks/format.js.map +1 -1
  62. package/dist/core/tasks/limits.d.ts +12 -1
  63. package/dist/core/tasks/limits.d.ts.map +1 -1
  64. package/dist/core/tasks/limits.js +20 -1
  65. package/dist/core/tasks/limits.js.map +1 -1
  66. package/dist/core/tasks/output.d.ts +17 -17
  67. package/dist/core/tasks/output.d.ts.map +1 -1
  68. package/dist/core/tasks/output.js +72 -69
  69. package/dist/core/tasks/output.js.map +1 -1
  70. package/dist/core/tasks/presentation.d.ts +14 -5
  71. package/dist/core/tasks/presentation.d.ts.map +1 -1
  72. package/dist/core/tasks/presentation.js +56 -185
  73. package/dist/core/tasks/presentation.js.map +1 -1
  74. package/dist/core/tasks/record.d.ts +45 -0
  75. package/dist/core/tasks/record.d.ts.map +1 -0
  76. package/dist/core/tasks/record.js +80 -0
  77. package/dist/core/tasks/record.js.map +1 -0
  78. package/dist/core/tasks/runtime.d.ts +22 -22
  79. package/dist/core/tasks/runtime.d.ts.map +1 -1
  80. package/dist/core/tasks/runtime.js +170 -343
  81. package/dist/core/tasks/runtime.js.map +1 -1
  82. package/dist/core/tasks/scheduler.d.ts +16 -0
  83. package/dist/core/tasks/scheduler.d.ts.map +1 -0
  84. package/dist/core/tasks/scheduler.js +42 -0
  85. package/dist/core/tasks/scheduler.js.map +1 -0
  86. package/dist/core/tasks/session.d.ts +1 -1
  87. package/dist/core/tasks/session.d.ts.map +1 -1
  88. package/dist/core/tasks/session.js +22 -35
  89. package/dist/core/tasks/session.js.map +1 -1
  90. package/dist/core/tasks/store.d.ts +18 -25
  91. package/dist/core/tasks/store.d.ts.map +1 -1
  92. package/dist/core/tasks/store.js +45 -43
  93. package/dist/core/tasks/store.js.map +1 -1
  94. package/dist/core/tasks/types.d.ts +159 -70
  95. package/dist/core/tasks/types.d.ts.map +1 -1
  96. package/dist/core/tasks/types.js +3 -9
  97. package/dist/core/tasks/types.js.map +1 -1
  98. package/dist/core/tools/shell-execution.d.ts +8 -7
  99. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  100. package/dist/core/tools/shell-execution.js +19 -27
  101. package/dist/core/tools/shell-execution.js.map +1 -1
  102. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  103. package/dist/core/tools/shell-tool.js +42 -47
  104. package/dist/core/tools/shell-tool.js.map +1 -1
  105. package/dist/core/usage-totals.d.ts +4 -3
  106. package/dist/core/usage-totals.d.ts.map +1 -1
  107. package/dist/core/usage-totals.js +32 -8
  108. package/dist/core/usage-totals.js.map +1 -1
  109. package/dist/extensions/agent/activity.d.ts +4 -4
  110. package/dist/extensions/agent/activity.d.ts.map +1 -1
  111. package/dist/extensions/agent/activity.js +15 -24
  112. package/dist/extensions/agent/activity.js.map +1 -1
  113. package/dist/extensions/agent/index.d.ts +2 -11
  114. package/dist/extensions/agent/index.d.ts.map +1 -1
  115. package/dist/extensions/agent/index.js +3 -88
  116. package/dist/extensions/agent/index.js.map +1 -1
  117. package/dist/extensions/agent/progress.d.ts +31 -0
  118. package/dist/extensions/agent/progress.d.ts.map +1 -0
  119. package/dist/extensions/agent/progress.js +135 -0
  120. package/dist/extensions/agent/progress.js.map +1 -0
  121. package/dist/extensions/agent/render.d.ts.map +1 -1
  122. package/dist/extensions/agent/render.js +8 -17
  123. package/dist/extensions/agent/render.js.map +1 -1
  124. package/dist/extensions/agent/report.d.ts +9 -0
  125. package/dist/extensions/agent/report.d.ts.map +1 -0
  126. package/dist/extensions/agent/report.js +40 -0
  127. package/dist/extensions/agent/report.js.map +1 -0
  128. package/dist/extensions/agent/settings-panel.d.ts +43 -0
  129. package/dist/extensions/agent/settings-panel.d.ts.map +1 -0
  130. package/dist/extensions/agent/settings-panel.js +125 -0
  131. package/dist/extensions/agent/settings-panel.js.map +1 -0
  132. package/dist/extensions/agent/settings.d.ts +1 -1
  133. package/dist/extensions/agent/settings.d.ts.map +1 -1
  134. package/dist/extensions/agent/settings.js +101 -83
  135. package/dist/extensions/agent/settings.js.map +1 -1
  136. package/dist/extensions/agent/tool.d.ts +13 -0
  137. package/dist/extensions/agent/tool.d.ts.map +1 -0
  138. package/dist/extensions/agent/tool.js +88 -0
  139. package/dist/extensions/agent/tool.js.map +1 -0
  140. package/dist/extensions/agent/types.d.ts +19 -21
  141. package/dist/extensions/agent/types.d.ts.map +1 -1
  142. package/dist/extensions/agent/types.js +2 -10
  143. package/dist/extensions/agent/types.js.map +1 -1
  144. package/dist/extensions/agent/worker.d.ts +16 -0
  145. package/dist/extensions/agent/worker.d.ts.map +1 -0
  146. package/dist/extensions/agent/worker.js +66 -0
  147. package/dist/extensions/agent/worker.js.map +1 -0
  148. package/dist/extensions/btw/agent.d.ts +1 -1
  149. package/dist/extensions/btw/agent.d.ts.map +1 -1
  150. package/dist/extensions/btw/agent.js +3 -20
  151. package/dist/extensions/btw/agent.js.map +1 -1
  152. package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
  153. package/dist/extensions/cached-compaction/index.js +3 -22
  154. package/dist/extensions/cached-compaction/index.js.map +1 -1
  155. package/dist/extensions/cached-compaction/render.d.ts +1 -0
  156. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  157. package/dist/extensions/cached-compaction/render.js +42 -14
  158. package/dist/extensions/cached-compaction/render.js.map +1 -1
  159. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  160. package/dist/extensions/deepwiki/client.js +6 -78
  161. package/dist/extensions/deepwiki/client.js.map +1 -1
  162. package/dist/extensions/deepwiki/transport.d.ts +3 -0
  163. package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
  164. package/dist/extensions/deepwiki/transport.js +96 -0
  165. package/dist/extensions/deepwiki/transport.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  168. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  169. package/dist/extensions/provider/ui/compat.d.ts +3 -3
  170. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  171. package/dist/extensions/provider/ui/compat.js.map +1 -1
  172. package/dist/extensions/provider/ui/controls.d.ts +2 -2
  173. package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
  174. package/dist/extensions/provider/ui/controls.js.map +1 -1
  175. package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
  176. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -1
  178. package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  180. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  181. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  182. package/dist/extensions/provider/ui/editor.js +1 -3
  183. package/dist/extensions/provider/ui/editor.js.map +1 -1
  184. package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
  185. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  186. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  187. package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
  188. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  189. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  190. package/dist/extensions/provider/ui/model-options.d.ts +6 -6
  191. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  192. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  193. package/dist/extensions/provider/ui/pane.d.ts +21 -12
  194. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  195. package/dist/extensions/provider/ui/pane.js.map +1 -1
  196. package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
  197. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  198. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  199. package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
  200. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  201. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  202. package/dist/extensions/run-summary/format.js +1 -1
  203. package/dist/extensions/run-summary/format.js.map +1 -1
  204. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  205. package/dist/extensions/statusline/usage.js +2 -6
  206. package/dist/extensions/statusline/usage.js.map +1 -1
  207. package/dist/extensions/tasks/tool/actions.d.ts +1 -1
  208. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  209. package/dist/extensions/tasks/tool/actions.js +50 -115
  210. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  211. package/dist/extensions/tasks/tool/constants.d.ts +1 -6
  212. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  213. package/dist/extensions/tasks/tool/constants.js +1 -6
  214. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  215. package/dist/extensions/tasks/tool/schema.d.ts +0 -3
  216. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  217. package/dist/extensions/tasks/tool/schema.js +5 -14
  218. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  219. package/dist/extensions/tasks/tool/types.d.ts +2 -8
  220. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  221. package/dist/extensions/tasks/tool/types.js +0 -2
  222. package/dist/extensions/tasks/tool/types.js.map +1 -1
  223. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  224. package/dist/extensions/tasks/tool.js +2 -2
  225. package/dist/extensions/tasks/tool.js.map +1 -1
  226. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  227. package/dist/extensions/tasks/ui/completion-render.js +46 -47
  228. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  229. package/dist/extensions/tasks/ui/inspector.d.ts +5 -3
  230. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  231. package/dist/extensions/tasks/ui/inspector.js +18 -6
  232. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  233. package/dist/extensions/tasks/ui/layout.d.ts +7 -7
  234. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  235. package/dist/extensions/tasks/ui/layout.js +118 -84
  236. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  237. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  238. package/dist/extensions/tasks/ui/list.js +45 -31
  239. package/dist/extensions/tasks/ui/list.js.map +1 -1
  240. package/dist/extensions/tasks/ui/manager.d.ts +16 -7
  241. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  242. package/dist/extensions/tasks/ui/manager.js +167 -129
  243. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  244. package/dist/extensions/tasks/ui/model.d.ts +29 -0
  245. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  246. package/dist/extensions/tasks/ui/model.js +16 -1
  247. package/dist/extensions/tasks/ui/model.js.map +1 -1
  248. package/dist/extensions/tasks/ui/render.d.ts +1 -1
  249. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  250. package/dist/extensions/tasks/ui/render.js +12 -9
  251. package/dist/extensions/tasks/ui/render.js.map +1 -1
  252. package/dist/extensions/tasks/ui/status.d.ts +15 -0
  253. package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
  254. package/dist/extensions/tasks/ui/status.js +16 -0
  255. package/dist/extensions/tasks/ui/status.js.map +1 -0
  256. package/dist/extensions/tasks/ui/tree.js +1 -1
  257. package/dist/extensions/tasks/ui/tree.js.map +1 -1
  258. package/dist/extensions/tasks/ui/views.d.ts +10 -5
  259. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  260. package/dist/extensions/tasks/ui/views.js +61 -36
  261. package/dist/extensions/tasks/ui/views.js.map +1 -1
  262. package/dist/index.d.ts +2 -1
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js.map +1 -1
  265. package/dist/modes/interactive/components/config-selector.d.ts +14 -1
  266. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  267. package/dist/modes/interactive/components/config-selector.js +258 -7
  268. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  269. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/keybinding-hints.js +2 -1
  271. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  272. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/model-selector.js +7 -4
  274. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  275. package/dist/modes/interactive/components/status-marker.d.ts +2 -1
  276. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/status-marker.js +0 -1
  278. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  279. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/thinking-selector.js +10 -3
  281. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  282. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.js +7 -1
  284. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  285. package/dist/utils/duration.d.ts +3 -0
  286. package/dist/utils/duration.d.ts.map +1 -0
  287. package/dist/utils/duration.js +17 -0
  288. package/dist/utils/duration.js.map +1 -0
  289. package/dist/utils/number.d.ts +3 -0
  290. package/dist/utils/number.d.ts.map +1 -0
  291. package/dist/utils/number.js +5 -0
  292. package/dist/utils/number.js.map +1 -0
  293. package/docs/bundled/extensions/agent.md +14 -12
  294. package/docs/bundled/extensions/cached-compaction.md +13 -4
  295. package/docs/bundled/extensions/deepwiki.md +3 -1
  296. package/docs/bundled/extensions/statusline.md +1 -1
  297. package/docs/bundled/tasks.md +15 -14
  298. package/docs/extensions.md +26 -10
  299. package/docs/packages.md +5 -3
  300. package/docs/sdk.md +3 -3
  301. package/docs/session-format.md +28 -24
  302. package/docs/settings.md +11 -0
  303. package/docs/skills.md +23 -0
  304. package/npm-shrinkwrap.json +2 -2
  305. package/package.json +1 -1
  306. package/schemas/settings.schema.json +36 -0
  307. package/dist/bundle/chunks/chunk-FSJ45CRP.js +0 -229
  308. package/dist/bundle/chunks/chunk-W3FIUMGM.js +0 -1501
  309. package/dist/core/tasks/history.d.ts +0 -4
  310. package/dist/core/tasks/history.d.ts.map +0 -1
  311. package/dist/core/tasks/history.js +0 -131
  312. package/dist/core/tasks/history.js.map +0 -1
  313. package/dist/extensions/agent/runner.d.ts +0 -24
  314. package/dist/extensions/agent/runner.d.ts.map +0 -1
  315. package/dist/extensions/agent/runner.js +0 -274
  316. package/dist/extensions/agent/runner.js.map +0 -1
  317. package/dist/extensions/deepwiki/http.d.ts +0 -13
  318. package/dist/extensions/deepwiki/http.d.ts.map +0 -1
  319. package/dist/extensions/deepwiki/http.js +0 -88
  320. package/dist/extensions/deepwiki/http.js.map +0 -1
  321. package/dist/extensions/tasks/ui/task-view.d.ts +0 -13
  322. package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
  323. package/dist/extensions/tasks/ui/task-view.js +0 -20
  324. package/dist/extensions/tasks/ui/task-view.js.map +0 -1
@@ -2,6 +2,8 @@ import { clampThinkingLevel, getSupportedThinkingLevels } from "@earendil-works/
2
2
  import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "../../core/defaults.js";
3
3
  import { truncateHead } from "../../core/tools/truncate.js";
4
4
  import { ModelSelectorComponent } from "../../modes/interactive/components/model-selector.js";
5
+ import { ThinkingSelectorComponent } from "../../modes/interactive/components/thinking-selector.js";
6
+ import { AgentSettingsPanel, } from "./settings-panel.js";
5
7
  import { AGENT_SETTINGS_NAMESPACE } from "./types.js";
6
8
  function inspectAgentSettings(ctx) {
7
9
  const raw = ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE);
@@ -32,24 +34,43 @@ export function readAgentSettings(ctx) {
32
34
  if (inspection.invalidModel !== undefined)
33
35
  throw new Error("Invalid Agent model setting. Choose a model with /agent.");
34
36
  if (inspection.invalidThinking !== undefined)
35
- throw new Error("Invalid Agent thinking setting. Choose a thinking level with /agent.");
37
+ throw new Error("Invalid Agent effort setting. Choose an effort level with /agent.");
36
38
  return { model: inspection.model, thinking: inspection.thinking };
37
39
  }
40
+ function resolveAgentModel(ctx, reference) {
41
+ if (!reference)
42
+ return ctx.model ? { model: ctx.model, available: true } : undefined;
43
+ const slash = reference.indexOf("/");
44
+ if (slash <= 0)
45
+ return undefined;
46
+ const model = ctx.modelRuntime.getModel(reference.slice(0, slash), reference.slice(slash + 1));
47
+ if (!model)
48
+ return undefined;
49
+ const available = ctx.modelRuntime
50
+ .getAvailableSnapshot()
51
+ .some((item) => item.provider === model.provider && item.id === model.id);
52
+ return { model, available };
53
+ }
54
+ function requestedEffort(ctx, settings) {
55
+ return settings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL;
56
+ }
57
+ /** Clamp a requested level to what the model supports. */
58
+ function supportedEffort(model, requested) {
59
+ return clampThinkingLevel(model, requested);
60
+ }
38
61
  export function resolveAgentConfiguration(ctx) {
39
62
  const settings = readAgentSettings(ctx);
40
- let model;
41
- if (settings.model) {
42
- const slash = settings.model.indexOf("/");
43
- model = ctx.modelRuntime.getModel(settings.model.slice(0, slash), settings.model.slice(slash + 1));
44
- if (!model)
63
+ const resolution = resolveAgentModel(ctx, settings.model);
64
+ if (!resolution) {
65
+ if (settings.model)
45
66
  throw new Error(`Agent model is unavailable: ${settings.model}`);
46
- }
47
- else
48
- model = ctx.model;
49
- if (!model)
50
67
  throw new Error("Agent has no model to follow. Choose one with /agent.");
51
- const thinking = clampThinkingLevel(model, settings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL);
52
- return { model, thinking, settings };
68
+ }
69
+ return {
70
+ model: resolution.model,
71
+ thinking: supportedEffort(resolution.model, requestedEffort(ctx, settings)),
72
+ settings,
73
+ };
53
74
  }
54
75
  async function saveAgentSettings(ctx, patch) {
55
76
  const next = { ...ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE) };
@@ -64,31 +85,77 @@ async function saveAgentSettings(ctx, patch) {
64
85
  await ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);
65
86
  }
66
87
  async function selectAgentModel(ctx, current) {
67
- const saved = ctx.modelRuntime.getAvailableSnapshot().find((model) => `${model.provider}/${model.id}` === current);
68
- const selected = await ctx.ui.custom((tui, _theme, _keys, done) => new ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, (model) => done(model), () => done(undefined)));
88
+ // Preselect the saved reference even when it is unavailable, so the picker can repair it.
89
+ const saved = resolveAgentModel(ctx, current)?.model;
90
+ const selected = await ctx.ui.custom((tui, _theme, _keys, done) => new ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () => done(undefined)));
69
91
  return selected ? `${selected.provider}/${selected.id}` : undefined;
70
92
  }
71
- function formatInvalid(value) {
93
+ async function selectAgentThinking(ctx, settings, model) {
94
+ const requested = requestedEffort(ctx, settings);
95
+ const current = model ? supportedEffort(model, requested) : requested;
96
+ const available = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVEL_OPTIONS];
97
+ return ctx.ui.custom((_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)));
98
+ }
99
+ function formatInvalidValue(value) {
72
100
  let text = "";
73
101
  try {
74
102
  text = typeof value === "string" ? value : (JSON.stringify(value) ?? "");
75
103
  }
76
104
  catch { }
77
- const label = truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;
78
- return label ? `${label} [invalid]` : "[invalid]";
105
+ return truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;
106
+ }
107
+ function invalidField(raw) {
108
+ return { value: formatInvalidValue(raw), status: "[invalid]", tone: "error" };
109
+ }
110
+ function describeModel(inspection, resolution) {
111
+ if (inspection.invalidModel !== undefined)
112
+ return invalidField(inspection.invalidModel);
113
+ if (!resolution)
114
+ return { value: inspection.model ?? "", status: "[unavailable]", tone: "warning" };
115
+ return {
116
+ value: `${resolution.model.provider}/${resolution.model.id}`,
117
+ following: inspection.model === undefined,
118
+ ...(resolution.available ? {} : { status: "[unavailable]", tone: "warning" }),
119
+ };
120
+ }
121
+ function describeEffort(ctx, inspection, model) {
122
+ if (inspection.invalidThinking !== undefined)
123
+ return invalidField(inspection.invalidThinking);
124
+ const requested = requestedEffort(ctx, inspection);
125
+ const following = inspection.thinking === undefined;
126
+ if (!model)
127
+ return { value: requested, following, status: "[unresolved]", tone: "warning" };
128
+ const effective = supportedEffort(model, requested);
129
+ if (effective === requested)
130
+ return { value: requested, following };
131
+ return { value: `${requested} → ${effective}`, following, tone: "warning" };
132
+ }
133
+ function hasOverrides(inspection) {
134
+ return (inspection.model !== undefined ||
135
+ inspection.thinking !== undefined ||
136
+ inspection.invalidModel !== undefined ||
137
+ inspection.invalidThinking !== undefined);
79
138
  }
80
- /** Two small native selectors; every confirmed choice affects future Agents only. */
139
+ function settingsRows(ctx, inspection, resolution) {
140
+ return [
141
+ { action: "model", label: "Model", field: describeModel(inspection, resolution) },
142
+ { action: "thinking", label: "Effort", field: describeEffort(ctx, inspection, resolution?.model) },
143
+ { action: "reset", label: "Reset to follow current session" },
144
+ ];
145
+ }
146
+ /** The native pickers save only Agent overrides; reset clears both in one write. */
81
147
  export async function openAgentSettings(ctx) {
82
148
  if (ctx.mode !== "tui") {
83
149
  try {
84
150
  const settings = readAgentSettings(ctx);
85
- ctx.ui.notify(`Agent model: ${settings.model ?? "Follow current session"} · Thinking: ${settings.thinking ?? "Follow current session"}`, "info");
151
+ ctx.ui.notify(`Agent model: ${settings.model ?? "Follow current session"} · Effort: ${settings.thinking ?? "Follow current session"}`, "info");
86
152
  }
87
153
  catch (error) {
88
154
  ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
89
155
  }
90
156
  return;
91
157
  }
158
+ let selectedAction = "model";
92
159
  while (true) {
93
160
  let inspection;
94
161
  try {
@@ -98,81 +165,32 @@ export async function openAgentSettings(ctx) {
98
165
  ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
99
166
  return;
100
167
  }
101
- let modelLabel;
102
- if (inspection.invalidModel !== undefined) {
103
- modelLabel = formatInvalid(inspection.invalidModel);
104
- }
105
- else if (inspection.model) {
106
- const modelAvailable = ctx.modelRuntime
107
- .getAvailableSnapshot()
108
- .some((model) => `${model.provider}/${model.id}` === inspection.model);
109
- modelLabel = `${inspection.model}${modelAvailable ? "" : " [unavailable]"}`;
110
- }
111
- else {
112
- modelLabel = `Follow current session${ctx.model ? ` (${ctx.model.provider}/${ctx.model.id})` : ""}`;
113
- }
114
- let thinkingLabel;
115
- if (inspection.invalidThinking !== undefined) {
116
- thinkingLabel = formatInvalid(inspection.invalidThinking);
117
- }
118
- else if (inspection.thinking) {
119
- thinkingLabel = inspection.thinking;
120
- }
121
- else {
122
- thinkingLabel = `Follow current session (${ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL})`;
123
- }
124
- const modelAction = `Model · ${modelLabel}`;
125
- const thinkingAction = `Thinking · ${thinkingLabel}`;
126
- const followModelAction = "Reset model to follow current session";
127
- const followThinkingAction = "Reset thinking to follow current session";
128
- const hasModelOverride = inspection.model !== undefined || inspection.invalidModel !== undefined;
129
- const hasThinkingOverride = inspection.thinking !== undefined || inspection.invalidThinking !== undefined;
130
- const action = await ctx.ui.select("Agent settings", [
131
- modelAction,
132
- thinkingAction,
133
- ...(hasModelOverride ? [followModelAction] : []),
134
- ...(hasThinkingOverride ? [followThinkingAction] : []),
135
- ]);
168
+ const resolution = inspection.invalidModel !== undefined ? undefined : resolveAgentModel(ctx, inspection.model);
169
+ const action = await ctx.ui.custom((tui, theme, keys, done) => new AgentSettingsPanel(tui, theme, keys, settingsRows(ctx, inspection, resolution), selectedAction, done, () => done(undefined)));
136
170
  if (!action)
137
171
  return;
172
+ selectedAction = action;
138
173
  try {
139
- if (action === followModelAction) {
140
- await saveAgentSettings(ctx, { model: null });
141
- ctx.ui.notify("Agent model: Follow current session", "info");
142
- }
143
- else if (action === followThinkingAction) {
144
- await saveAgentSettings(ctx, { thinking: null });
145
- ctx.ui.notify("Agent thinking: Follow current session", "info");
174
+ if (action === "reset") {
175
+ if (!hasOverrides(inspection))
176
+ continue;
177
+ await saveAgentSettings(ctx, { model: null, thinking: null });
178
+ ctx.ui.notify("Agent settings: Follow current session", "info");
146
179
  }
147
- else if (action === modelAction) {
180
+ else if (action === "model") {
148
181
  const selected = await selectAgentModel(ctx, inspection.model ?? "");
149
182
  if (selected === undefined || selected === inspection.model)
150
183
  continue;
151
184
  await saveAgentSettings(ctx, { model: selected });
152
185
  ctx.ui.notify(`Agent model: ${selected}`, "info");
153
186
  }
154
- else if (action === thinkingAction) {
155
- let supported;
156
- if (inspection.model) {
157
- const slash = inspection.model.indexOf("/");
158
- const model = ctx.modelRuntime.getModel(inspection.model.slice(0, slash), inspection.model.slice(slash + 1));
159
- if (model)
160
- supported = new Set(getSupportedThinkingLevels(model));
161
- }
162
- if (!supported && ctx.model) {
163
- supported = new Set(getSupportedThinkingLevels(ctx.model));
164
- }
165
- const selected = await ctx.ui.select("Agent thinking", [
166
- "Follow current session",
167
- ...THINKING_LEVEL_OPTIONS.filter((level) => !supported || supported.has(level)),
168
- ]);
169
- if (selected === undefined)
170
- continue;
171
- const thinking = selected === "Follow current session" ? null : selected;
172
- if ((thinking ?? undefined) === inspection.thinking && inspection.invalidThinking === undefined)
187
+ else if (action === "thinking") {
188
+ const selected = await selectAgentThinking(ctx, inspection, resolution?.model);
189
+ if (selected === undefined ||
190
+ (selected === inspection.thinking && inspection.invalidThinking === undefined))
173
191
  continue;
174
- await saveAgentSettings(ctx, { thinking });
175
- ctx.ui.notify(`Agent thinking: ${thinking ?? "Follow current session"}`, "info");
192
+ await saveAgentSettings(ctx, { thinking: selected });
193
+ ctx.ui.notify(`Agent effort: ${selected}`, "info");
176
194
  }
177
195
  }
178
196
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from \"../../core/defaults.ts\";\nimport type { ExtensionCommandContext, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { truncateHead } from \"../../core/tools/truncate.ts\";\nimport { ModelSelectorComponent } from \"../../modes/interactive/components/model-selector.ts\";\nimport { AGENT_SETTINGS_NAMESPACE, type AgentSettings } from \"./types.ts\";\n\ntype SettingsContext = Pick<ExtensionContext, \"getExtensionSettings\" | \"setExtensionSettings\">;\ntype ModelContext = Pick<ExtensionContext, \"model\" | \"modelRuntime\" | \"thinkingLevel\">;\n\ninterface InspectedAgentSettings extends AgentSettings {\n\tinvalidModel?: unknown;\n\tinvalidThinking?: unknown;\n}\n\nfunction inspectAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): InspectedAgentSettings {\n\tconst raw = ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE);\n\tlet model: string | undefined;\n\tlet invalidModel: unknown;\n\tif (raw.model !== undefined) {\n\t\tif (typeof raw.model === \"string\" && raw.model.includes(\"/\")) {\n\t\t\tmodel = raw.model;\n\t\t} else {\n\t\t\tinvalidModel = raw.model;\n\t\t}\n\t}\n\tlet thinking: ThinkingLevel | undefined;\n\tlet invalidThinking: unknown;\n\tif (raw.thinking !== undefined) {\n\t\tif (typeof raw.thinking === \"string\" && THINKING_LEVEL_OPTIONS.includes(raw.thinking as ThinkingLevel)) {\n\t\t\tthinking = raw.thinking as ThinkingLevel;\n\t\t} else {\n\t\t\tinvalidThinking = raw.thinking;\n\t\t}\n\t}\n\treturn { model, thinking, invalidModel, invalidThinking };\n}\n\nexport function readAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): AgentSettings {\n\tconst inspection = inspectAgentSettings(ctx);\n\tif (inspection.invalidModel !== undefined)\n\t\tthrow new Error(\"Invalid Agent model setting. Choose a model with /agent.\");\n\tif (inspection.invalidThinking !== undefined)\n\t\tthrow new Error(\"Invalid Agent thinking setting. Choose a thinking level with /agent.\");\n\treturn { model: inspection.model, thinking: inspection.thinking };\n}\n\nexport function resolveAgentConfiguration(ctx: ModelContext & Pick<ExtensionContext, \"getExtensionSettings\">): {\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\tsettings: AgentSettings;\n} {\n\tconst settings = readAgentSettings(ctx);\n\tlet model: Model<any> | undefined;\n\tif (settings.model) {\n\t\tconst slash = settings.model.indexOf(\"/\");\n\t\tmodel = ctx.modelRuntime.getModel(settings.model.slice(0, slash), settings.model.slice(slash + 1));\n\t\tif (!model) throw new Error(`Agent model is unavailable: ${settings.model}`);\n\t} else model = ctx.model;\n\tif (!model) throw new Error(\"Agent has no model to follow. Choose one with /agent.\");\n\tconst thinking = clampThinkingLevel(\n\t\tmodel,\n\t\tsettings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t) as ThinkingLevel;\n\treturn { model, thinking, settings };\n}\n\nasync function saveAgentSettings(\n\tctx: SettingsContext,\n\tpatch: { model?: string | null; thinking?: ThinkingLevel | null },\n): Promise<void> {\n\tconst next = { ...ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE) };\n\tif (patch.model === null || patch.model === \"\") delete next.model;\n\telse if (patch.model !== undefined) next.model = patch.model;\n\tif (patch.thinking === null) delete next.thinking;\n\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\tawait ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);\n}\n\nasync function selectAgentModel(ctx: ExtensionCommandContext, current: string): Promise<string | undefined> {\n\tconst saved = ctx.modelRuntime.getAvailableSnapshot().find((model) => `${model.provider}/${model.id}` === current);\n\tconst selected = await ctx.ui.custom<Model<any> | undefined>(\n\t\t(tui, _theme, _keys, done) =>\n\t\t\tnew ModelSelectorComponent(\n\t\t\t\ttui,\n\t\t\t\tsaved ?? ctx.model,\n\t\t\t\tctx.modelRuntime,\n\t\t\t\tctx.scopedModels,\n\t\t\t\t(model) => done(model),\n\t\t\t\t() => done(undefined),\n\t\t\t),\n\t);\n\treturn selected ? `${selected.provider}/${selected.id}` : undefined;\n}\n\nfunction formatInvalid(value: unknown): string {\n\tlet text = \"\";\n\ttry {\n\t\ttext = typeof value === \"string\" ? value : (JSON.stringify(value) ?? \"\");\n\t} catch {}\n\tconst label = truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;\n\treturn label ? `${label} [invalid]` : \"[invalid]\";\n}\n\n/** Two small native selectors; every confirmed choice affects future Agents only. */\nexport async function openAgentSettings(ctx: ExtensionCommandContext): Promise<void> {\n\tif (ctx.mode !== \"tui\") {\n\t\ttry {\n\t\t\tconst settings = readAgentSettings(ctx);\n\t\t\tctx.ui.notify(\n\t\t\t\t`Agent model: ${settings.model ?? \"Follow current session\"} · Thinking: ${settings.thinking ?? \"Follow current session\"}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t\treturn;\n\t}\n\twhile (true) {\n\t\tlet inspection: InspectedAgentSettings;\n\t\ttry {\n\t\t\tinspection = inspectAgentSettings(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tlet modelLabel: string;\n\t\tif (inspection.invalidModel !== undefined) {\n\t\t\tmodelLabel = formatInvalid(inspection.invalidModel);\n\t\t} else if (inspection.model) {\n\t\t\tconst modelAvailable = ctx.modelRuntime\n\t\t\t\t.getAvailableSnapshot()\n\t\t\t\t.some((model) => `${model.provider}/${model.id}` === inspection.model);\n\t\t\tmodelLabel = `${inspection.model}${modelAvailable ? \"\" : \" [unavailable]\"}`;\n\t\t} else {\n\t\t\tmodelLabel = `Follow current session${ctx.model ? ` (${ctx.model.provider}/${ctx.model.id})` : \"\"}`;\n\t\t}\n\t\tlet thinkingLabel: string;\n\t\tif (inspection.invalidThinking !== undefined) {\n\t\t\tthinkingLabel = formatInvalid(inspection.invalidThinking);\n\t\t} else if (inspection.thinking) {\n\t\t\tthinkingLabel = inspection.thinking;\n\t\t} else {\n\t\t\tthinkingLabel = `Follow current session (${ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL})`;\n\t\t}\n\t\tconst modelAction = `Model · ${modelLabel}`;\n\t\tconst thinkingAction = `Thinking · ${thinkingLabel}`;\n\t\tconst followModelAction = \"Reset model to follow current session\";\n\t\tconst followThinkingAction = \"Reset thinking to follow current session\";\n\t\tconst hasModelOverride = inspection.model !== undefined || inspection.invalidModel !== undefined;\n\t\tconst hasThinkingOverride = inspection.thinking !== undefined || inspection.invalidThinking !== undefined;\n\t\tconst action = await ctx.ui.select(\"Agent settings\", [\n\t\t\tmodelAction,\n\t\t\tthinkingAction,\n\t\t\t...(hasModelOverride ? [followModelAction] : []),\n\t\t\t...(hasThinkingOverride ? [followThinkingAction] : []),\n\t\t]);\n\t\tif (!action) return;\n\t\ttry {\n\t\t\tif (action === followModelAction) {\n\t\t\t\tawait saveAgentSettings(ctx, { model: null });\n\t\t\t\tctx.ui.notify(\"Agent model: Follow current session\", \"info\");\n\t\t\t} else if (action === followThinkingAction) {\n\t\t\t\tawait saveAgentSettings(ctx, { thinking: null });\n\t\t\t\tctx.ui.notify(\"Agent thinking: Follow current session\", \"info\");\n\t\t\t} else if (action === modelAction) {\n\t\t\t\tconst selected = await selectAgentModel(ctx, inspection.model ?? \"\");\n\t\t\t\tif (selected === undefined || selected === inspection.model) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: selected });\n\t\t\t\tctx.ui.notify(`Agent model: ${selected}`, \"info\");\n\t\t\t} else if (action === thinkingAction) {\n\t\t\t\tlet supported: Set<ThinkingLevel> | undefined;\n\t\t\t\tif (inspection.model) {\n\t\t\t\t\tconst slash = inspection.model.indexOf(\"/\");\n\t\t\t\t\tconst model = ctx.modelRuntime.getModel(\n\t\t\t\t\t\tinspection.model.slice(0, slash),\n\t\t\t\t\t\tinspection.model.slice(slash + 1),\n\t\t\t\t\t);\n\t\t\t\t\tif (model) supported = new Set(getSupportedThinkingLevels(model));\n\t\t\t\t}\n\t\t\t\tif (!supported && ctx.model) {\n\t\t\t\t\tsupported = new Set(getSupportedThinkingLevels(ctx.model));\n\t\t\t\t}\n\t\t\t\tconst selected = await ctx.ui.select(\"Agent thinking\", [\n\t\t\t\t\t\"Follow current session\",\n\t\t\t\t\t...THINKING_LEVEL_OPTIONS.filter((level) => !supported || supported.has(level)),\n\t\t\t\t]);\n\t\t\t\tif (selected === undefined) continue;\n\t\t\t\tconst thinking = selected === \"Follow current session\" ? null : (selected as ThinkingLevel);\n\t\t\t\tif ((thinking ?? undefined) === inspection.thinking && inspection.invalidThinking === undefined) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { thinking });\n\t\t\t\tctx.ui.notify(`Agent thinking: ${thinking ?? \"Follow current session\"}`, \"info\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Could not save Agent settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from \"../../core/defaults.ts\";\nimport type { ExtensionCommandContext, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { truncateHead } from \"../../core/tools/truncate.ts\";\nimport { ModelSelectorComponent } from \"../../modes/interactive/components/model-selector.ts\";\nimport { ThinkingSelectorComponent } from \"../../modes/interactive/components/thinking-selector.ts\";\nimport {\n\ttype AgentSettingsAction,\n\ttype AgentSettingsField,\n\tAgentSettingsPanel,\n\ttype AgentSettingsRow,\n} from \"./settings-panel.ts\";\nimport { AGENT_SETTINGS_NAMESPACE, type AgentSettings } from \"./types.ts\";\n\ntype SettingsContext = Pick<ExtensionContext, \"getExtensionSettings\" | \"setExtensionSettings\">;\ntype ModelContext = Pick<ExtensionContext, \"model\" | \"modelRuntime\" | \"thinkingLevel\">;\n\ninterface InspectedAgentSettings extends AgentSettings {\n\tinvalidModel?: unknown;\n\tinvalidThinking?: unknown;\n}\n\nfunction inspectAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): InspectedAgentSettings {\n\tconst raw = ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE);\n\tlet model: string | undefined;\n\tlet invalidModel: unknown;\n\tif (raw.model !== undefined) {\n\t\tif (typeof raw.model === \"string\" && raw.model.includes(\"/\")) {\n\t\t\tmodel = raw.model;\n\t\t} else {\n\t\t\tinvalidModel = raw.model;\n\t\t}\n\t}\n\tlet thinking: ThinkingLevel | undefined;\n\tlet invalidThinking: unknown;\n\tif (raw.thinking !== undefined) {\n\t\tif (typeof raw.thinking === \"string\" && THINKING_LEVEL_OPTIONS.includes(raw.thinking as ThinkingLevel)) {\n\t\t\tthinking = raw.thinking as ThinkingLevel;\n\t\t} else {\n\t\t\tinvalidThinking = raw.thinking;\n\t\t}\n\t}\n\treturn { model, thinking, invalidModel, invalidThinking };\n}\n\nexport function readAgentSettings(ctx: Pick<ExtensionContext, \"getExtensionSettings\">): AgentSettings {\n\tconst inspection = inspectAgentSettings(ctx);\n\tif (inspection.invalidModel !== undefined)\n\t\tthrow new Error(\"Invalid Agent model setting. Choose a model with /agent.\");\n\tif (inspection.invalidThinking !== undefined)\n\t\tthrow new Error(\"Invalid Agent effort setting. Choose an effort level with /agent.\");\n\treturn { model: inspection.model, thinking: inspection.thinking };\n}\n\ninterface AgentModelResolution {\n\tmodel: Model<any>;\n\t/** Listed by `/model` right now. The availability snapshot can lag auth changes, so this is display-only. */\n\tavailable: boolean;\n}\n\nfunction resolveAgentModel(\n\tctx: Pick<ModelContext, \"model\" | \"modelRuntime\">,\n\treference?: string,\n): AgentModelResolution | undefined {\n\tif (!reference) return ctx.model ? { model: ctx.model, available: true } : undefined;\n\tconst slash = reference.indexOf(\"/\");\n\tif (slash <= 0) return undefined;\n\tconst model = ctx.modelRuntime.getModel(reference.slice(0, slash), reference.slice(slash + 1));\n\tif (!model) return undefined;\n\tconst available = ctx.modelRuntime\n\t\t.getAvailableSnapshot()\n\t\t.some((item) => item.provider === model.provider && item.id === model.id);\n\treturn { model, available };\n}\n\nfunction requestedEffort(ctx: Pick<ModelContext, \"thinkingLevel\">, settings: AgentSettings): ThinkingLevel {\n\treturn settings.thinking ?? ctx.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n\n/** Clamp a requested level to what the model supports. */\nfunction supportedEffort(model: Model<any>, requested: ThinkingLevel): ThinkingLevel {\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\nexport function resolveAgentConfiguration(ctx: ModelContext & Pick<ExtensionContext, \"getExtensionSettings\">): {\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\tsettings: AgentSettings;\n} {\n\tconst settings = readAgentSettings(ctx);\n\tconst resolution = resolveAgentModel(ctx, settings.model);\n\tif (!resolution) {\n\t\tif (settings.model) throw new Error(`Agent model is unavailable: ${settings.model}`);\n\t\tthrow new Error(\"Agent has no model to follow. Choose one with /agent.\");\n\t}\n\treturn {\n\t\tmodel: resolution.model,\n\t\tthinking: supportedEffort(resolution.model, requestedEffort(ctx, settings)),\n\t\tsettings,\n\t};\n}\n\nasync function saveAgentSettings(\n\tctx: SettingsContext,\n\tpatch: { model?: string | null; thinking?: ThinkingLevel | null },\n): Promise<void> {\n\tconst next = { ...ctx.getExtensionSettings(AGENT_SETTINGS_NAMESPACE) };\n\tif (patch.model === null || patch.model === \"\") delete next.model;\n\telse if (patch.model !== undefined) next.model = patch.model;\n\tif (patch.thinking === null) delete next.thinking;\n\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\tawait ctx.setExtensionSettings(AGENT_SETTINGS_NAMESPACE, next);\n}\n\nasync function selectAgentModel(ctx: ExtensionCommandContext, current: string): Promise<string | undefined> {\n\t// Preselect the saved reference even when it is unavailable, so the picker can repair it.\n\tconst saved = resolveAgentModel(ctx, current)?.model;\n\tconst selected = await ctx.ui.custom<Model<any> | undefined>(\n\t\t(tui, _theme, _keys, done) =>\n\t\t\tnew ModelSelectorComponent(tui, saved ?? ctx.model, ctx.modelRuntime, ctx.scopedModels, done, () =>\n\t\t\t\tdone(undefined),\n\t\t\t),\n\t);\n\treturn selected ? `${selected.provider}/${selected.id}` : undefined;\n}\n\nasync function selectAgentThinking(\n\tctx: ExtensionCommandContext,\n\tsettings: AgentSettings,\n\tmodel: Model<any> | undefined,\n): Promise<ThinkingLevel | undefined> {\n\tconst requested = requestedEffort(ctx, settings);\n\tconst current = model ? supportedEffort(model, requested) : requested;\n\tconst available = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVEL_OPTIONS];\n\treturn ctx.ui.custom<ThinkingLevel | undefined>(\n\t\t(_tui, _theme, _keys, done) => new ThinkingSelectorComponent(current, available, done, () => done(undefined)),\n\t);\n}\n\nfunction formatInvalidValue(value: unknown): string {\n\tlet text = \"\";\n\ttry {\n\t\ttext = typeof value === \"string\" ? value : (JSON.stringify(value) ?? \"\");\n\t} catch {}\n\treturn truncateHead(text, { maxLines: 1, maxBytes: 80 }).content;\n}\n\nfunction invalidField(raw: unknown): AgentSettingsField {\n\treturn { value: formatInvalidValue(raw), status: \"[invalid]\", tone: \"error\" };\n}\n\nfunction describeModel(\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidModel !== undefined) return invalidField(inspection.invalidModel);\n\tif (!resolution) return { value: inspection.model ?? \"\", status: \"[unavailable]\", tone: \"warning\" };\n\treturn {\n\t\tvalue: `${resolution.model.provider}/${resolution.model.id}`,\n\t\tfollowing: inspection.model === undefined,\n\t\t...(resolution.available ? {} : { status: \"[unavailable]\", tone: \"warning\" as const }),\n\t};\n}\n\nfunction describeEffort(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tmodel: Model<any> | undefined,\n): AgentSettingsField {\n\tif (inspection.invalidThinking !== undefined) return invalidField(inspection.invalidThinking);\n\tconst requested = requestedEffort(ctx, inspection);\n\tconst following = inspection.thinking === undefined;\n\tif (!model) return { value: requested, following, status: \"[unresolved]\", tone: \"warning\" };\n\tconst effective = supportedEffort(model, requested);\n\tif (effective === requested) return { value: requested, following };\n\treturn { value: `${requested} → ${effective}`, following, tone: \"warning\" };\n}\n\nfunction hasOverrides(inspection: InspectedAgentSettings): boolean {\n\treturn (\n\t\tinspection.model !== undefined ||\n\t\tinspection.thinking !== undefined ||\n\t\tinspection.invalidModel !== undefined ||\n\t\tinspection.invalidThinking !== undefined\n\t);\n}\n\nfunction settingsRows(\n\tctx: ModelContext,\n\tinspection: InspectedAgentSettings,\n\tresolution: AgentModelResolution | undefined,\n): AgentSettingsRow[] {\n\treturn [\n\t\t{ action: \"model\", label: \"Model\", field: describeModel(inspection, resolution) },\n\t\t{ action: \"thinking\", label: \"Effort\", field: describeEffort(ctx, inspection, resolution?.model) },\n\t\t{ action: \"reset\", label: \"Reset to follow current session\" },\n\t];\n}\n\n/** The native pickers save only Agent overrides; reset clears both in one write. */\nexport async function openAgentSettings(ctx: ExtensionCommandContext): Promise<void> {\n\tif (ctx.mode !== \"tui\") {\n\t\ttry {\n\t\t\tconst settings = readAgentSettings(ctx);\n\t\t\tctx.ui.notify(\n\t\t\t\t`Agent model: ${settings.model ?? \"Follow current session\"} · Effort: ${settings.thinking ?? \"Follow current session\"}`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t}\n\t\treturn;\n\t}\n\tlet selectedAction: AgentSettingsAction = \"model\";\n\twhile (true) {\n\t\tlet inspection: InspectedAgentSettings;\n\t\ttry {\n\t\t\tinspection = inspectAgentSettings(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst resolution = inspection.invalidModel !== undefined ? undefined : resolveAgentModel(ctx, inspection.model);\n\t\tconst action = await ctx.ui.custom<AgentSettingsAction | undefined>(\n\t\t\t(tui, theme, keys, done) =>\n\t\t\t\tnew AgentSettingsPanel(\n\t\t\t\t\ttui,\n\t\t\t\t\ttheme,\n\t\t\t\t\tkeys,\n\t\t\t\t\tsettingsRows(ctx, inspection, resolution),\n\t\t\t\t\tselectedAction,\n\t\t\t\t\tdone,\n\t\t\t\t\t() => done(undefined),\n\t\t\t\t),\n\t\t);\n\t\tif (!action) return;\n\t\tselectedAction = action;\n\t\ttry {\n\t\t\tif (action === \"reset\") {\n\t\t\t\tif (!hasOverrides(inspection)) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: null, thinking: null });\n\t\t\t\tctx.ui.notify(\"Agent settings: Follow current session\", \"info\");\n\t\t\t} else if (action === \"model\") {\n\t\t\t\tconst selected = await selectAgentModel(ctx, inspection.model ?? \"\");\n\t\t\t\tif (selected === undefined || selected === inspection.model) continue;\n\t\t\t\tawait saveAgentSettings(ctx, { model: selected });\n\t\t\t\tctx.ui.notify(`Agent model: ${selected}`, \"info\");\n\t\t\t} else if (action === \"thinking\") {\n\t\t\t\tconst selected = await selectAgentThinking(ctx, inspection, resolution?.model);\n\t\t\t\tif (\n\t\t\t\t\tselected === undefined ||\n\t\t\t\t\t(selected === inspection.thinking && inspection.invalidThinking === undefined)\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tawait saveAgentSettings(ctx, { thinking: selected });\n\t\t\t\tctx.ui.notify(`Agent effort: ${selected}`, \"info\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Could not save Agent settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { Type } from "typebox";
2
+ import type { ToolDefinition } from "../../core/extensions/types.ts";
3
+ import { type AgentToolDetails } from "./types.ts";
4
+ declare const agentSchema: Type.TObject<{
5
+ prompt: Type.TString;
6
+ description: Type.TOptional<Type.TString>;
7
+ background: Type.TOptional<Type.TBoolean>;
8
+ }>;
9
+ export declare function createAgentTool(options?: {
10
+ concurrency?: number;
11
+ }): ToolDefinition<typeof agentSchema, AgentToolDetails>;
12
+ export {};
13
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMtF,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG1F,QAAA,MAAM,WAAW;;;;EAehB,CAAC;AAmBF,wBAAgB,eAAe,CAC9B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,cAAc,CAAC,OAAO,WAAW,EAAE,gBAAgB,CAAC,CAuDtD"}
@@ -0,0 +1,88 @@
1
+ import { Type } from "typebox";
2
+ import { defineTool } from "../../core/extensions/types.js";
3
+ import { clipText } from "./activity.js";
4
+ import { agentRenderers } from "./render.js";
5
+ import { resolveAgentConfiguration } from "./settings.js";
6
+ import { AGENT_CONCURRENCY, AGENT_PROMPT_BYTES } from "./types.js";
7
+ import { runWorker } from "./worker.js";
8
+ const agentSchema = Type.Object({
9
+ prompt: Type.String({
10
+ minLength: 1,
11
+ description: "Complete, self-contained task briefing: goal, relevant context and paths, constraints, whether to edit or only investigate, and expected verification and report. The Agent cannot see this conversation.",
12
+ }),
13
+ description: Type.Optional(Type.String({ description: "Short (3–5 word) task label for the transcript and Tasks panel" })),
14
+ background: Type.Optional(Type.Boolean({ description: "Return a task ID and deliver the final report asynchronously" })),
15
+ }, { additionalProperties: false });
16
+ /** The model-facing handoff: who moved the Agent, whether it waits for a slot, and how to follow it. */
17
+ function handoffResult(task, byUser) {
18
+ const moved = byUser
19
+ ? `The user moved this Agent to the background while it was running: ${task.id}. It continues unchanged.`
20
+ : `Agent running in background: ${task.id}.`;
21
+ const queued = task.status === "queued" ? " It is queued until an Agent slot frees." : "";
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: `${moved}${queued} The report will be delivered automatically. Use tasks read/wait/kill to inspect, wait or stop.`,
27
+ },
28
+ ],
29
+ details: { version: 2, state: "background", taskId: task.id, byUser },
30
+ };
31
+ }
32
+ export function createAgentTool(options = {}) {
33
+ const limit = options.concurrency ?? AGENT_CONCURRENCY;
34
+ return defineTool({
35
+ name: "Agent",
36
+ label: "Agent",
37
+ description: "Run one self-contained task in a fresh Agent session and get back only its final report. Use Agent when separate context or parallel execution clearly helps; handle known-path reads and small edits directly. The Agent cannot see this conversation, but shares your working directory and applicable project instructions, with read, bash, edit, and write. Foreground returns the report; background returns a task ID and delivers the report automatically.",
38
+ promptSnippet: "Delegate a self-contained task and receive only its final report",
39
+ promptGuidelines: [
40
+ "Use Agent primarily for independent research, verification, or well-specified, self-contained implementation when separate context or parallel execution clearly helps. Keep design and substantial coding in the main session; handle known-path reads and small edits directly. “Multiple angles” or “be thorough” alone does not justify an Agent.",
41
+ "Give Agent a self-contained briefing: the goal and why it matters, prior findings or ruled-out options, relevant paths and constraints, whether to investigate or edit, and expected verification. For open investigations, hand over the question rather than a fragile step-by-step procedure; state any report-length limit.",
42
+ "Keep ownership of synthesis when using Agent—never delegate understanding. For edits, supply your conclusions, target behavior, relevant files, and acceptance checks rather than “based on your findings, fix it.” Verify actual edits and test evidence before calling the work done.",
43
+ "Run parallel Agents only on independent work; concurrent writers must not touch the same files or shared state. Do not duplicate delegated work or repeatedly poll a background Agent. Continue independent work, or wait when its result is needed.",
44
+ "An Agent report is not automatically presented to the user. Relay the important outcome, verification result, and remaining risks concisely.",
45
+ ],
46
+ parameters: agentSchema,
47
+ constrainedSampling: { type: "json_schema", strict: "prefer" },
48
+ executionMode: "parallel",
49
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
50
+ if (!params.prompt.trim() || Buffer.byteLength(params.prompt) > AGENT_PROMPT_BYTES)
51
+ throw new Error("Agent prompt must contain text and fit within 16 KiB.");
52
+ const { model, thinking } = resolveAgentConfiguration(ctx);
53
+ const auth = await ctx.modelRuntime.getAuth(model, { signal });
54
+ if (!auth)
55
+ throw new Error(`No authentication for Agent model ${model.provider}/${model.id}`);
56
+ const outcome = await ctx.tasks.execute({
57
+ kind: "agent",
58
+ label: "Agent",
59
+ title: clipText((params.description?.trim() || params.prompt).replace(/\s+/gu, " ").trim(), 160),
60
+ output: "report",
61
+ input: { label: "Prompt", text: params.prompt, truncated: false },
62
+ facts: [
63
+ ["Model", `${model.provider}/${model.id}`],
64
+ ["Thinking", thinking],
65
+ ["Directory", ctx.cwd],
66
+ ],
67
+ concurrency: { key: "agent", limit },
68
+ toolCallId,
69
+ background: params.background,
70
+ signal,
71
+ onUpdate,
72
+ run: (control) => runWorker(control, {
73
+ prompt: params.prompt,
74
+ cwd: ctx.cwd,
75
+ model,
76
+ thinking,
77
+ modelRuntime: ctx.modelRuntime,
78
+ projectTrusted: ctx.isProjectTrusted(),
79
+ }),
80
+ });
81
+ if (outcome.kind === "result")
82
+ return outcome.result;
83
+ return handoffResult(outcome.task, params.background !== true);
84
+ },
85
+ ...agentRenderers,
86
+ });
87
+ }
88
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/agent/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport type { AgentToolResult, ToolDefinition } from \"../../core/extensions/types.ts\";\nimport { defineTool } from \"../../core/extensions/types.ts\";\nimport type { TaskSnapshot } from \"../../core/tasks/types.ts\";\nimport { clipText } from \"./activity.ts\";\nimport { agentRenderers } from \"./render.ts\";\nimport { resolveAgentConfiguration } from \"./settings.ts\";\nimport { AGENT_CONCURRENCY, AGENT_PROMPT_BYTES, type AgentToolDetails } from \"./types.ts\";\nimport { runWorker } from \"./worker.ts\";\n\nconst agentSchema = Type.Object(\n\t{\n\t\tprompt: Type.String({\n\t\t\tminLength: 1,\n\t\t\tdescription:\n\t\t\t\t\"Complete, self-contained task briefing: goal, relevant context and paths, constraints, whether to edit or only investigate, and expected verification and report. The Agent cannot see this conversation.\",\n\t\t}),\n\t\tdescription: Type.Optional(\n\t\t\tType.String({ description: \"Short (3–5 word) task label for the transcript and Tasks panel\" }),\n\t\t),\n\t\tbackground: Type.Optional(\n\t\t\tType.Boolean({ description: \"Return a task ID and deliver the final report asynchronously\" }),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** The model-facing handoff: who moved the Agent, whether it waits for a slot, and how to follow it. */\nfunction handoffResult(task: TaskSnapshot, byUser: boolean): AgentToolResult<AgentToolDetails> {\n\tconst moved = byUser\n\t\t? `The user moved this Agent to the background while it was running: ${task.id}. It continues unchanged.`\n\t\t: `Agent running in background: ${task.id}.`;\n\tconst queued = task.status === \"queued\" ? \" It is queued until an Agent slot frees.\" : \"\";\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `${moved}${queued} The report will be delivered automatically. Use tasks read/wait/kill to inspect, wait or stop.`,\n\t\t\t},\n\t\t],\n\t\tdetails: { version: 2, state: \"background\", taskId: task.id, byUser },\n\t};\n}\n\nexport function createAgentTool(\n\toptions: { concurrency?: number } = {},\n): ToolDefinition<typeof agentSchema, AgentToolDetails> {\n\tconst limit = options.concurrency ?? AGENT_CONCURRENCY;\n\treturn defineTool({\n\t\tname: \"Agent\",\n\t\tlabel: \"Agent\",\n\t\tdescription:\n\t\t\t\"Run one self-contained task in a fresh Agent session and get back only its final report. Use Agent when separate context or parallel execution clearly helps; handle known-path reads and small edits directly. The Agent cannot see this conversation, but shares your working directory and applicable project instructions, with read, bash, edit, and write. Foreground returns the report; background returns a task ID and delivers the report automatically.\",\n\t\tpromptSnippet: \"Delegate a self-contained task and receive only its final report\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use Agent primarily for independent research, verification, or well-specified, self-contained implementation when separate context or parallel execution clearly helps. Keep design and substantial coding in the main session; handle known-path reads and small edits directly. “Multiple angles” or “be thorough” alone does not justify an Agent.\",\n\t\t\t\"Give Agent a self-contained briefing: the goal and why it matters, prior findings or ruled-out options, relevant paths and constraints, whether to investigate or edit, and expected verification. For open investigations, hand over the question rather than a fragile step-by-step procedure; state any report-length limit.\",\n\t\t\t\"Keep ownership of synthesis when using Agent—never delegate understanding. For edits, supply your conclusions, target behavior, relevant files, and acceptance checks rather than “based on your findings, fix it.” Verify actual edits and test evidence before calling the work done.\",\n\t\t\t\"Run parallel Agents only on independent work; concurrent writers must not touch the same files or shared state. Do not duplicate delegated work or repeatedly poll a background Agent. Continue independent work, or wait when its result is needed.\",\n\t\t\t\"An Agent report is not automatically presented to the user. Relay the important outcome, verification result, and remaining risks concisely.\",\n\t\t],\n\t\tparameters: agentSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tif (!params.prompt.trim() || Buffer.byteLength(params.prompt) > AGENT_PROMPT_BYTES)\n\t\t\t\tthrow new Error(\"Agent prompt must contain text and fit within 16 KiB.\");\n\t\t\tconst { model, thinking } = resolveAgentConfiguration(ctx);\n\t\t\tconst auth = await ctx.modelRuntime.getAuth(model, { signal });\n\t\t\tif (!auth) throw new Error(`No authentication for Agent model ${model.provider}/${model.id}`);\n\t\t\tconst outcome = await ctx.tasks.execute<AgentToolDetails>({\n\t\t\t\tkind: \"agent\",\n\t\t\t\tlabel: \"Agent\",\n\t\t\t\ttitle: clipText((params.description?.trim() || params.prompt).replace(/\\s+/gu, \" \").trim(), 160),\n\t\t\t\toutput: \"report\",\n\t\t\t\tinput: { label: \"Prompt\", text: params.prompt, truncated: false },\n\t\t\t\tfacts: [\n\t\t\t\t\t[\"Model\", `${model.provider}/${model.id}`],\n\t\t\t\t\t[\"Thinking\", thinking],\n\t\t\t\t\t[\"Directory\", ctx.cwd],\n\t\t\t\t],\n\t\t\t\tconcurrency: { key: \"agent\", limit },\n\t\t\t\ttoolCallId,\n\t\t\t\tbackground: params.background,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\trun: (control) =>\n\t\t\t\t\trunWorker(control, {\n\t\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinking,\n\t\t\t\t\t\tmodelRuntime: ctx.modelRuntime,\n\t\t\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\tif (outcome.kind === \"result\") return outcome.result;\n\t\t\treturn handoffResult(outcome.task, params.background !== true);\n\t\t},\n\t\t...agentRenderers,\n\t});\n}\n"]}
@@ -1,8 +1,10 @@
1
1
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
2
  import type { TaskTerminalStatus } from "../../core/tasks/types.ts";
3
3
  export declare const AGENT_SETTINGS_NAMESPACE = "agent";
4
+ export declare const AGENT_PROMPT_BYTES: number;
4
5
  export declare const AGENT_REPORT_BYTES: number;
5
6
  export declare const AGENT_MAX_ACTIVITIES = 50;
7
+ export declare const AGENT_CONCURRENCY = 4;
6
8
  export interface AgentSettings {
7
9
  model?: string;
8
10
  thinking?: ThinkingLevel;
@@ -18,28 +20,24 @@ export interface AgentActivity {
18
20
  durationMs?: number;
19
21
  error?: string;
20
22
  }
21
- export interface AgentToolDetails {
22
- version: 1;
23
+ /**
24
+ * Agent tool-result details. Only progress updates carry activities; the persisted result
25
+ * keeps the transcript row's facts, and the full history lives in the task's Output.
26
+ */
27
+ export type AgentToolDetails = {
28
+ version: 2;
29
+ state: "running";
23
30
  taskId: string;
24
- status: "running" | "background" | TaskTerminalStatus;
25
- model: string;
26
- thinking: ThinkingLevel;
27
- /** Short terminal diagnostic; the complete report and error remain in Tasks Output. */
28
- error?: string;
29
31
  activities: AgentActivity[];
30
- }
31
- export declare function emptyUsage(): {
32
- input: number;
33
- output: number;
34
- cacheRead: number;
35
- cacheWrite: number;
36
- totalTokens: number;
37
- cost: {
38
- input: number;
39
- output: number;
40
- cacheRead: number;
41
- cacheWrite: number;
42
- total: number;
43
- };
32
+ } | {
33
+ version: 2;
34
+ state: "background";
35
+ taskId: string;
36
+ byUser: boolean;
37
+ } | {
38
+ version: 2;
39
+ state: TaskTerminalStatus;
40
+ taskId: string;
41
+ error?: string;
44
42
  };
45
43
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,kBAAkB,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,wBAAgB,UAAU;;;;;;;;;;;;;EASzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACzB;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,GAC7E;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpE;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1,14 +1,6 @@
1
1
  export const AGENT_SETTINGS_NAMESPACE = "agent";
2
+ export const AGENT_PROMPT_BYTES = 16 * 1024;
2
3
  export const AGENT_REPORT_BYTES = 24 * 1024;
3
4
  export const AGENT_MAX_ACTIVITIES = 50;
4
- export function emptyUsage() {
5
- return {
6
- input: 0,
7
- output: 0,
8
- cacheRead: 0,
9
- cacheWrite: 0,
10
- totalTokens: 0,
11
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
12
- };
13
- }
5
+ export const AGENT_CONCURRENCY = 4;
14
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/agent/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AA+BvC,MAAM,UAAU,UAAU;IACzB,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;AACH,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { TaskTerminalStatus } from \"../../core/tasks/types.ts\";\n\nexport const AGENT_SETTINGS_NAMESPACE = \"agent\";\nexport const AGENT_REPORT_BYTES = 24 * 1024;\nexport const AGENT_MAX_ACTIVITIES = 50;\n\nexport interface AgentSettings {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport type AgentActivityStatus = \"running\" | \"ok\" | \"error\" | \"cancelled\";\n\nexport interface AgentActivity {\n\tid: string;\n\tname: string;\n\targs: string;\n\t/** Short display label derived from the original arguments; args remains the full bounded form. */\n\ttarget?: string;\n\tstatus: AgentActivityStatus;\n\tdurationMs?: number;\n\terror?: string;\n}\n\nexport interface AgentToolDetails {\n\tversion: 1;\n\ttaskId: string;\n\tstatus: \"running\" | \"background\" | TaskTerminalStatus;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\t/** Short terminal diagnostic; the complete report and error remain in Tasks Output. */\n\terror?: string;\n\tactivities: AgentActivity[];\n}\n\nexport function emptyUsage() {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/agent/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { TaskTerminalStatus } from \"../../core/tasks/types.ts\";\n\nexport const AGENT_SETTINGS_NAMESPACE = \"agent\";\nexport const AGENT_PROMPT_BYTES = 16 * 1024;\nexport const AGENT_REPORT_BYTES = 24 * 1024;\nexport const AGENT_MAX_ACTIVITIES = 50;\nexport const AGENT_CONCURRENCY = 4;\n\nexport interface AgentSettings {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport type AgentActivityStatus = \"running\" | \"ok\" | \"error\" | \"cancelled\";\n\nexport interface AgentActivity {\n\tid: string;\n\tname: string;\n\targs: string;\n\t/** Short display label derived from the original arguments; args remains the full bounded form. */\n\ttarget?: string;\n\tstatus: AgentActivityStatus;\n\tdurationMs?: number;\n\terror?: string;\n}\n\n/**\n * Agent tool-result details. Only progress updates carry activities; the persisted result\n * keeps the transcript row's facts, and the full history lives in the task's Output.\n */\nexport type AgentToolDetails =\n\t| { version: 2; state: \"running\"; taskId: string; activities: AgentActivity[] }\n\t| { version: 2; state: \"background\"; taskId: string; byUser: boolean }\n\t| { version: 2; state: TaskTerminalStatus; taskId: string; error?: string };\n"]}
@@ -0,0 +1,16 @@
1
+ import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
+ import type { Model } from "@earendil-works/pi-ai/compat";
3
+ import type { ModelRuntime } from "../../core/model-runtime.ts";
4
+ import type { TaskCompletion, TaskControl } from "../../core/tasks/types.ts";
5
+ import type { AgentToolDetails } from "./types.ts";
6
+ export interface AgentRequest {
7
+ prompt: string;
8
+ cwd: string;
9
+ model: Model<any>;
10
+ thinking: ThinkingLevel;
11
+ modelRuntime: ModelRuntime;
12
+ projectTrusted: boolean;
13
+ }
14
+ /** Run one delegated task in an isolated session and settle it with a self-contained report. */
15
+ export declare function runWorker(control: TaskControl<AgentToolDetails>, request: AgentRequest): Promise<TaskCompletion<AgentToolDetails>>;
16
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAG1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CACxB;AAaD,gGAAgG;AAChG,wBAAsB,SAAS,CAC9B,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,EACtC,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CA6C3C"}