@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
@@ -1,6 +1,6 @@
1
1
  import { Container, TruncatedText, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
2
  import { getTextOutput, startToolTimer, toolTimerText } from "../../core/tools/render-utils.js";
3
- import { activityGlyph, activityTarget, clipText, formatActivityDuration } from "./activity.js";
3
+ import { activityGlyph, clipText, formatActivityDuration, targetOf } from "./activity.js";
4
4
  const EXPANDED_ACTIVITIES = 5;
5
5
  class AgentCallComponent {
6
6
  constructor(theme) {
@@ -49,16 +49,6 @@ function activityColor(status) {
49
49
  return "muted";
50
50
  }
51
51
  }
52
- function targetOf(activity) {
53
- if (activity.target)
54
- return activity.target;
55
- try {
56
- return activityTarget(activity.name, JSON.parse(activity.args));
57
- }
58
- catch {
59
- return activity.args;
60
- }
61
- }
62
52
  function renderActivity(activity, theme) {
63
53
  const target = targetOf(activity);
64
54
  const duration = formatActivityDuration(activity.durationMs);
@@ -69,20 +59,20 @@ function renderActivity(activity, theme) {
69
59
  }
70
60
  function detailsOf(result) {
71
61
  const details = result?.details;
72
- return details?.version === 1 && Array.isArray(details.activities) ? details : undefined;
62
+ return details?.version === 2 && typeof details.state === "string" ? details : undefined;
73
63
  }
74
64
  function singleLine(text, bytes = 120) {
75
65
  return clipText(text.replace(/\s+/gu, " ").trim(), bytes);
76
66
  }
77
67
  function errorOf(result, details) {
78
- if (details?.error)
68
+ if (details && "error" in details && details.error)
79
69
  return singleLine(details.error, 240);
80
70
  const output = result ? getTextOutput(result, false).trim() : "";
81
71
  const marker = output.lastIndexOf("Error:");
82
72
  return singleLine(marker >= 0 ? output.slice(marker + 6) : output.split("\n")[0] || "Failed", 240);
83
73
  }
84
74
  function statusParts(context, details) {
85
- const status = details?.status;
75
+ const status = details?.state;
86
76
  if (status === "background") {
87
77
  toolTimerText(context, false);
88
78
  return { diagnostic: "Background", tasks: "/tasks" };
@@ -91,7 +81,7 @@ function statusParts(context, details) {
91
81
  const duration = timer?.replace(/^(?:Took|Elapsed) /, "");
92
82
  const tasks = details?.taskId ? "/tasks" : undefined;
93
83
  if (context.isPartial || status === "running") {
94
- const latest = details?.activities.at(-1);
84
+ const latest = details?.state === "running" ? details.activities.at(-1) : undefined;
95
85
  const activity = latest ? `${latest.name}${targetOf(latest) ? ` ${targetOf(latest)}` : ""}` : "Starting…";
96
86
  return { diagnostic: context.expanded ? undefined : activity, duration };
97
87
  }
@@ -119,9 +109,10 @@ export const agentRenderers = {
119
109
  const component = context.lastComponent ?? new Container();
120
110
  component.clear();
121
111
  const details = detailsOf(result);
122
- if ((!options.isPartial && details?.status !== "running") || !options.expanded)
112
+ // Only live progress carries activities; settled rows stay one line.
113
+ if (details?.state !== "running" || !options.expanded)
123
114
  return component;
124
- for (const activity of (details?.activities ?? []).slice(-EXPANDED_ACTIVITIES))
115
+ for (const activity of details.activities.slice(-EXPANDED_ACTIVITIES))
125
116
  component.addChild(new TruncatedText(renderActivity(activity, theme), 0, 0));
126
117
  return component;
127
118
  },
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/agent/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, Container, TruncatedText, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolDefinition, ToolRenderContext } from \"../../core/extensions/types.ts\";\nimport { getTextOutput, startToolTimer, toolTimerText } from \"../../core/tools/render-utils.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { activityGlyph, activityTarget, clipText, formatActivityDuration } from \"./activity.ts\";\nimport type { AgentActivity, AgentToolDetails } from \"./types.ts\";\n\nconst EXPANDED_ACTIVITIES = 5;\n\ntype AgentRenderer = Required<Pick<ToolDefinition<any, AgentToolDetails>, \"renderCall\" | \"renderResult\">>;\n\ninterface StatusParts {\n\tdiagnostic?: string;\n\tduration?: string;\n\ttasks?: string;\n}\n\nclass AgentCallComponent implements Component {\n\tprivate title = \"\";\n\tprivate parts: StatusParts = {};\n\tprivate theme: Theme;\n\n\tconstructor(theme: Theme) {\n\t\tthis.theme = theme;\n\t}\n\n\tupdate(theme: Theme, title: string, parts: StatusParts): void {\n\t\tthis.theme = theme;\n\t\tthis.title = singleLine(title, 160);\n\t\tthis.parts = parts;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width <= 0) return [];\n\t\tconst heading = this.theme.fg(\"toolTitle\", this.theme.bold(\"Agent\"));\n\t\tconst available = width - visibleWidth(heading) - 1;\n\t\tif (available <= 0) return [truncateToWidth(heading, width, \"\")];\n\n\t\t// Tasks access and time are fixed; diagnostics take precedence over the task label.\n\t\tconst { diagnostic, duration, tasks } = this.parts;\n\t\tconst fullSuffix = [duration, tasks].filter(Boolean).join(\" · \");\n\t\tconst suffix = truncateToWidth(\n\t\t\tvisibleWidth(fullSuffix) <= available ? fullSuffix : (tasks ?? duration ?? \"\"),\n\t\t\tavailable,\n\t\t\t\"…\",\n\t\t);\n\t\tconst contentWidth = Math.max(0, available - visibleWidth(suffix) - (suffix ? 3 : 0));\n\t\tconst shownDiagnostic = truncateToWidth(diagnostic ?? \"\", contentWidth, \"…\");\n\t\tconst titleWidth = Math.max(0, contentWidth - visibleWidth(shownDiagnostic) - (shownDiagnostic ? 3 : 0));\n\t\tconst title = truncateToWidth(this.title, titleWidth, \"…\");\n\t\tconst parts = [\n\t\t\ttitle ? this.theme.fg(\"muted\", title) : undefined,\n\t\t\tshownDiagnostic ? this.theme.fg(\"dim\", shownDiagnostic) : undefined,\n\t\t\tsuffix ? this.theme.fg(\"dim\", suffix) : undefined,\n\t\t].filter(Boolean);\n\t\treturn [heading + (parts.length ? ` ${parts.join(this.theme.fg(\"dim\", \" · \"))}` : \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction activityColor(status: AgentActivity[\"status\"]): \"warning\" | \"success\" | \"error\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"running\":\n\t\t\treturn \"warning\";\n\t\tcase \"ok\":\n\t\t\treturn \"success\";\n\t\tcase \"error\":\n\t\t\treturn \"error\";\n\t\tcase \"cancelled\":\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction targetOf(activity: AgentActivity): string {\n\tif (activity.target) return activity.target;\n\ttry {\n\t\treturn activityTarget(activity.name, JSON.parse(activity.args));\n\t} catch {\n\t\treturn activity.args;\n\t}\n}\n\nfunction renderActivity(activity: AgentActivity, theme: Theme): string {\n\tconst target = targetOf(activity);\n\tconst duration = formatActivityDuration(activity.durationMs);\n\treturn [\n\t\t`${theme.fg(activityColor(activity.status), activityGlyph(activity.status))} ${theme.fg(\"toolTitle\", activity.name)}${target ? theme.fg(\"muted\", ` ${target}`) : \"\"}`,\n\t\t...(duration ? [theme.fg(\"dim\", duration)] : []),\n\t].join(theme.fg(\"dim\", \" · \"));\n}\n\nfunction detailsOf(result: AgentToolResult<AgentToolDetails> | undefined): AgentToolDetails | undefined {\n\tconst details = result?.details;\n\treturn details?.version === 1 && Array.isArray(details.activities) ? details : undefined;\n}\n\nfunction singleLine(text: string, bytes = 120): string {\n\treturn clipText(text.replace(/\\s+/gu, \" \").trim(), bytes);\n}\n\nfunction errorOf(result: AgentToolResult<AgentToolDetails> | undefined, details: AgentToolDetails | undefined): string {\n\tif (details?.error) return singleLine(details.error, 240);\n\tconst output = result ? getTextOutput(result, false).trim() : \"\";\n\tconst marker = output.lastIndexOf(\"Error:\");\n\treturn singleLine(marker >= 0 ? output.slice(marker + 6) : output.split(\"\\n\")[0] || \"Failed\", 240);\n}\n\nfunction statusParts(\n\tcontext: ToolRenderContext<any, any, AgentToolDetails>,\n\tdetails: AgentToolDetails | undefined,\n): StatusParts {\n\tconst status = details?.status;\n\tif (status === \"background\") {\n\t\ttoolTimerText(context, false);\n\t\treturn { diagnostic: \"Background\", tasks: \"/tasks\" };\n\t}\n\tconst timer = toolTimerText(context, context.isPartial);\n\tconst duration = timer?.replace(/^(?:Took|Elapsed) /, \"\");\n\tconst tasks = details?.taskId ? \"/tasks\" : undefined;\n\tif (context.isPartial || status === \"running\") {\n\t\tconst latest = details?.activities.at(-1);\n\t\tconst activity = latest ? `${latest.name}${targetOf(latest) ? ` ${targetOf(latest)}` : \"\"}` : \"Starting…\";\n\t\treturn { diagnostic: context.expanded ? undefined : activity, duration };\n\t}\n\tif (status === \"cancelled\") return { diagnostic: \"Cancelled\", duration, tasks };\n\tif (status === \"failed\" || status === \"timeout\" || context.isError)\n\t\treturn { diagnostic: errorOf(context.result, details), duration, tasks };\n\treturn { duration, tasks };\n}\n\nexport const agentRenderers: AgentRenderer = {\n\trenderCall(args, theme, context) {\n\t\tstartToolTimer(context);\n\t\tconst input = args as { description?: unknown; prompt?: unknown };\n\t\tconst title =\n\t\t\ttypeof input.description === \"string\" && input.description.trim()\n\t\t\t\t? input.description\n\t\t\t\t: typeof input.prompt === \"string\"\n\t\t\t\t\t? input.prompt\n\t\t\t\t\t: \"Delegated task\";\n\t\tconst parts = statusParts(context, detailsOf(context.result));\n\t\tconst component =\n\t\t\tcontext.lastComponent instanceof AgentCallComponent ? context.lastComponent : new AgentCallComponent(theme);\n\t\tcomponent.update(theme, title, parts);\n\t\treturn component;\n\t},\n\trenderResult(result, options, theme, context) {\n\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\tcomponent.clear();\n\t\tconst details = detailsOf(result);\n\t\tif ((!options.isPartial && details?.status !== \"running\") || !options.expanded) return component;\n\t\tfor (const activity of (details?.activities ?? []).slice(-EXPANDED_ACTIVITIES))\n\t\t\tcomponent.addChild(new TruncatedText(renderActivity(activity, theme), 0, 0));\n\t\treturn component;\n\t},\n};\n"]}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/agent/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, Container, TruncatedText, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolDefinition, ToolRenderContext } from \"../../core/extensions/types.ts\";\nimport { getTextOutput, startToolTimer, toolTimerText } from \"../../core/tools/render-utils.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { activityGlyph, clipText, formatActivityDuration, targetOf } from \"./activity.ts\";\nimport type { AgentActivity, AgentToolDetails } from \"./types.ts\";\n\nconst EXPANDED_ACTIVITIES = 5;\n\ntype AgentRenderer = Required<Pick<ToolDefinition<any, AgentToolDetails>, \"renderCall\" | \"renderResult\">>;\n\ninterface StatusParts {\n\tdiagnostic?: string;\n\tduration?: string;\n\ttasks?: string;\n}\n\nclass AgentCallComponent implements Component {\n\tprivate title = \"\";\n\tprivate parts: StatusParts = {};\n\tprivate theme: Theme;\n\n\tconstructor(theme: Theme) {\n\t\tthis.theme = theme;\n\t}\n\n\tupdate(theme: Theme, title: string, parts: StatusParts): void {\n\t\tthis.theme = theme;\n\t\tthis.title = singleLine(title, 160);\n\t\tthis.parts = parts;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width <= 0) return [];\n\t\tconst heading = this.theme.fg(\"toolTitle\", this.theme.bold(\"Agent\"));\n\t\tconst available = width - visibleWidth(heading) - 1;\n\t\tif (available <= 0) return [truncateToWidth(heading, width, \"\")];\n\n\t\t// Tasks access and time are fixed; diagnostics take precedence over the task label.\n\t\tconst { diagnostic, duration, tasks } = this.parts;\n\t\tconst fullSuffix = [duration, tasks].filter(Boolean).join(\" · \");\n\t\tconst suffix = truncateToWidth(\n\t\t\tvisibleWidth(fullSuffix) <= available ? fullSuffix : (tasks ?? duration ?? \"\"),\n\t\t\tavailable,\n\t\t\t\"…\",\n\t\t);\n\t\tconst contentWidth = Math.max(0, available - visibleWidth(suffix) - (suffix ? 3 : 0));\n\t\tconst shownDiagnostic = truncateToWidth(diagnostic ?? \"\", contentWidth, \"…\");\n\t\tconst titleWidth = Math.max(0, contentWidth - visibleWidth(shownDiagnostic) - (shownDiagnostic ? 3 : 0));\n\t\tconst title = truncateToWidth(this.title, titleWidth, \"…\");\n\t\tconst parts = [\n\t\t\ttitle ? this.theme.fg(\"muted\", title) : undefined,\n\t\t\tshownDiagnostic ? this.theme.fg(\"dim\", shownDiagnostic) : undefined,\n\t\t\tsuffix ? this.theme.fg(\"dim\", suffix) : undefined,\n\t\t].filter(Boolean);\n\t\treturn [heading + (parts.length ? ` ${parts.join(this.theme.fg(\"dim\", \" · \"))}` : \"\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction activityColor(status: AgentActivity[\"status\"]): \"warning\" | \"success\" | \"error\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"running\":\n\t\t\treturn \"warning\";\n\t\tcase \"ok\":\n\t\t\treturn \"success\";\n\t\tcase \"error\":\n\t\t\treturn \"error\";\n\t\tcase \"cancelled\":\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction renderActivity(activity: AgentActivity, theme: Theme): string {\n\tconst target = targetOf(activity);\n\tconst duration = formatActivityDuration(activity.durationMs);\n\treturn [\n\t\t`${theme.fg(activityColor(activity.status), activityGlyph(activity.status))} ${theme.fg(\"toolTitle\", activity.name)}${target ? theme.fg(\"muted\", ` ${target}`) : \"\"}`,\n\t\t...(duration ? [theme.fg(\"dim\", duration)] : []),\n\t].join(theme.fg(\"dim\", \" · \"));\n}\n\nfunction detailsOf(result: AgentToolResult<AgentToolDetails> | undefined): AgentToolDetails | undefined {\n\tconst details = result?.details;\n\treturn details?.version === 2 && typeof details.state === \"string\" ? details : undefined;\n}\n\nfunction singleLine(text: string, bytes = 120): string {\n\treturn clipText(text.replace(/\\s+/gu, \" \").trim(), bytes);\n}\n\nfunction errorOf(result: AgentToolResult<AgentToolDetails> | undefined, details: AgentToolDetails | undefined): string {\n\tif (details && \"error\" in details && details.error) return singleLine(details.error, 240);\n\tconst output = result ? getTextOutput(result, false).trim() : \"\";\n\tconst marker = output.lastIndexOf(\"Error:\");\n\treturn singleLine(marker >= 0 ? output.slice(marker + 6) : output.split(\"\\n\")[0] || \"Failed\", 240);\n}\n\nfunction statusParts(\n\tcontext: ToolRenderContext<any, any, AgentToolDetails>,\n\tdetails: AgentToolDetails | undefined,\n): StatusParts {\n\tconst status = details?.state;\n\tif (status === \"background\") {\n\t\ttoolTimerText(context, false);\n\t\treturn { diagnostic: \"Background\", tasks: \"/tasks\" };\n\t}\n\tconst timer = toolTimerText(context, context.isPartial);\n\tconst duration = timer?.replace(/^(?:Took|Elapsed) /, \"\");\n\tconst tasks = details?.taskId ? \"/tasks\" : undefined;\n\tif (context.isPartial || status === \"running\") {\n\t\tconst latest = details?.state === \"running\" ? details.activities.at(-1) : undefined;\n\t\tconst activity = latest ? `${latest.name}${targetOf(latest) ? ` ${targetOf(latest)}` : \"\"}` : \"Starting…\";\n\t\treturn { diagnostic: context.expanded ? undefined : activity, duration };\n\t}\n\tif (status === \"cancelled\") return { diagnostic: \"Cancelled\", duration, tasks };\n\tif (status === \"failed\" || status === \"timeout\" || context.isError)\n\t\treturn { diagnostic: errorOf(context.result, details), duration, tasks };\n\treturn { duration, tasks };\n}\n\nexport const agentRenderers: AgentRenderer = {\n\trenderCall(args, theme, context) {\n\t\tstartToolTimer(context);\n\t\tconst input = args as { description?: unknown; prompt?: unknown };\n\t\tconst title =\n\t\t\ttypeof input.description === \"string\" && input.description.trim()\n\t\t\t\t? input.description\n\t\t\t\t: typeof input.prompt === \"string\"\n\t\t\t\t\t? input.prompt\n\t\t\t\t\t: \"Delegated task\";\n\t\tconst parts = statusParts(context, detailsOf(context.result));\n\t\tconst component =\n\t\t\tcontext.lastComponent instanceof AgentCallComponent ? context.lastComponent : new AgentCallComponent(theme);\n\t\tcomponent.update(theme, title, parts);\n\t\treturn component;\n\t},\n\trenderResult(result, options, theme, context) {\n\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\tcomponent.clear();\n\t\tconst details = detailsOf(result);\n\t\t// Only live progress carries activities; settled rows stay one line.\n\t\tif (details?.state !== \"running\" || !options.expanded) return component;\n\t\tfor (const activity of details.activities.slice(-EXPANDED_ACTIVITIES))\n\t\t\tcomponent.addChild(new TruncatedText(renderActivity(activity, theme), 0, 0));\n\t\treturn component;\n\t},\n};\n"]}
@@ -0,0 +1,9 @@
1
+ import type { TaskControl } from "../../core/tasks/types.ts";
2
+ import { type AgentToolDetails } from "./types.ts";
3
+ export declare function boundedReport(text: string, fullOutputPath?: string): string;
4
+ /**
5
+ * The model-facing report. An oversized report keeps its beginning and names a managed
6
+ * Markdown file with the complete text, which the task owns and cleans up.
7
+ */
8
+ export declare function finalReport(control: TaskControl<AgentToolDetails>, report: string, error: string | undefined): Promise<string>;
9
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3E;AAQD;;;GAGG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -0,0 +1,40 @@
1
+ import { unlink } from "node:fs/promises";
2
+ import { boundText } from "../../core/tasks/output.js";
3
+ import { writeOutputFile } from "../../utils/output-files.js";
4
+ import { AGENT_REPORT_BYTES } from "./types.js";
5
+ export function boundedReport(text, fullOutputPath) {
6
+ if (Buffer.byteLength(text) <= AGENT_REPORT_BYTES)
7
+ return text;
8
+ const notice = fullOutputPath
9
+ ? `\n\n[Agent output truncated. Full output: ${fullOutputPath}]`
10
+ : "\n\n[Agent output truncated. Full output unavailable.]";
11
+ return boundText(text, AGENT_REPORT_BYTES - Buffer.byteLength(notice)) + notice;
12
+ }
13
+ async function removeOutputFile(path) {
14
+ await unlink(path).catch((error) => {
15
+ if (error.code !== "ENOENT")
16
+ throw error;
17
+ });
18
+ }
19
+ /**
20
+ * The model-facing report. An oversized report keeps its beginning and names a managed
21
+ * Markdown file with the complete text, which the task owns and cleans up.
22
+ */
23
+ export async function finalReport(control, report, error) {
24
+ const text = !report ? (error ?? "No report returned.") : error ? `${report}\n\nError: ${error}` : report;
25
+ if (Buffer.byteLength(text) <= AGENT_REPORT_BYTES)
26
+ return text;
27
+ let path;
28
+ try {
29
+ path = await writeOutputFile("pi-agent", ".md", text);
30
+ const saved = path;
31
+ control.attachOutput(saved, () => removeOutputFile(saved));
32
+ return boundedReport(text, saved);
33
+ }
34
+ catch {
35
+ if (path)
36
+ await removeOutputFile(path).catch(() => { });
37
+ return boundedReport(text);
38
+ }
39
+ }
40
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/extensions/agent/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAEvE,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,cAAuB;IAClE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,cAAc;QAC5B,CAAC,CAAC,6CAA6C,cAAc,GAAG;QAChE,CAAC,CAAC,wDAAwD,CAAC;IAC5D,OAAO,SAAS,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QACzD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IAC1C,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,OAAsC,EACtC,MAAc,EACd,KAAyB;IAEzB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1G,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACJ,IAAI,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC;QACnB,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,IAAI,IAAI;YAAE,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC","sourcesContent":["import { unlink } from \"node:fs/promises\";\nimport { boundText } from \"../../core/tasks/output.ts\";\nimport type { TaskControl } from \"../../core/tasks/types.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.ts\";\nimport { AGENT_REPORT_BYTES, type AgentToolDetails } from \"./types.ts\";\n\nexport function boundedReport(text: string, fullOutputPath?: string): string {\n\tif (Buffer.byteLength(text) <= AGENT_REPORT_BYTES) return text;\n\tconst notice = fullOutputPath\n\t\t? `\\n\\n[Agent output truncated. Full output: ${fullOutputPath}]`\n\t\t: \"\\n\\n[Agent output truncated. Full output unavailable.]\";\n\treturn boundText(text, AGENT_REPORT_BYTES - Buffer.byteLength(notice)) + notice;\n}\n\nasync function removeOutputFile(path: string): Promise<void> {\n\tawait unlink(path).catch((error: NodeJS.ErrnoException) => {\n\t\tif (error.code !== \"ENOENT\") throw error;\n\t});\n}\n\n/**\n * The model-facing report. An oversized report keeps its beginning and names a managed\n * Markdown file with the complete text, which the task owns and cleans up.\n */\nexport async function finalReport(\n\tcontrol: TaskControl<AgentToolDetails>,\n\treport: string,\n\terror: string | undefined,\n): Promise<string> {\n\tconst text = !report ? (error ?? \"No report returned.\") : error ? `${report}\\n\\nError: ${error}` : report;\n\tif (Buffer.byteLength(text) <= AGENT_REPORT_BYTES) return text;\n\tlet path: string | undefined;\n\ttry {\n\t\tpath = await writeOutputFile(\"pi-agent\", \".md\", text);\n\t\tconst saved = path;\n\t\tcontrol.attachOutput(saved, () => removeOutputFile(saved));\n\t\treturn boundedReport(text, saved);\n\t} catch {\n\t\tif (path) await removeOutputFile(path).catch(() => {});\n\t\treturn boundedReport(text);\n\t}\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { type Component, type TUI, type TuiMouseEvent, type TuiMouseEventResult } from "@earendil-works/pi-tui";
2
+ import type { KeybindingsManager } from "../../core/keybindings.ts";
3
+ import type { Theme } from "../../modes/interactive/theme/theme.ts";
4
+ export type AgentSettingsAction = "model" | "thinking" | "reset";
5
+ /** The current value of a setting row; the reset action row carries no field. */
6
+ export interface AgentSettingsField {
7
+ value: string;
8
+ following?: boolean;
9
+ status?: string;
10
+ tone?: "warning" | "error";
11
+ }
12
+ export interface AgentSettingsRow {
13
+ action: AgentSettingsAction;
14
+ label: string;
15
+ field?: AgentSettingsField;
16
+ }
17
+ /** Aligned setting rows with one action row, navigated through the host keybindings. */
18
+ export declare class AgentSettingsPanel implements Component {
19
+ private readonly tui;
20
+ private readonly theme;
21
+ private readonly keys;
22
+ private readonly rows;
23
+ private readonly onSelect;
24
+ private readonly onCancel;
25
+ private readonly labelWidth;
26
+ private selectedIndex;
27
+ /** Line index of each row, recorded while rendering so click hit-testing cannot drift. */
28
+ private rowLines;
29
+ constructor(tui: TUI, theme: Theme, keys: KeybindingsManager, rows: AgentSettingsRow[], selected: AgentSettingsAction, onSelect: (action: AgentSettingsAction) => void, onCancel: () => void);
30
+ render(width: number): string[];
31
+ handleInput(data: string): void;
32
+ handleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined;
33
+ invalidate(): void;
34
+ private move;
35
+ private select;
36
+ private renderRow;
37
+ /** Values keep their room before the inheritance marker degrades, because that marker is the meaning. */
38
+ private renderValue;
39
+ private followText;
40
+ private hints;
41
+ private key;
42
+ }
43
+ //# sourceMappingURL=settings-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-panel.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EACd,KAAK,GAAG,EACR,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAIxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEjE,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AASD,wFAAwF;AACxF,qBAAa,kBAAmB,YAAW,SAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAgB;gBAG/B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,gBAAgB,EAAE,EACxB,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,EAC/C,QAAQ,EAAE,MAAM,IAAI;IAgBrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAc/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/B,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,GAAG,SAAS;IAalE,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,SAAS;IAQjB,yGAAyG;IACzG,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,GAAG;CAGX"}
@@ -0,0 +1,125 @@
1
+ import { truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "@earendil-works/pi-tui";
2
+ import { keyLabel } from "../../modes/interactive/components/keybinding-hints.js";
3
+ const FOLLOW = " · Follow current session";
4
+ const FOLLOW_SHORT = " · follow";
5
+ /** Room the value keeps before the full inheritance marker is shown. */
6
+ const VALUE_PRIORITY_WIDTH = 12;
7
+ /** Room the value keeps once only the compact inheritance marker fits. */
8
+ const COMPACT_PRIORITY_WIDTH = 4;
9
+ /** Aligned setting rows with one action row, navigated through the host keybindings. */
10
+ export class AgentSettingsPanel {
11
+ constructor(tui, theme, keys, rows, selected, onSelect, onCancel) {
12
+ /** Line index of each row, recorded while rendering so click hit-testing cannot drift. */
13
+ this.rowLines = [];
14
+ this.tui = tui;
15
+ this.theme = theme;
16
+ this.keys = keys;
17
+ this.rows = rows;
18
+ this.onSelect = onSelect;
19
+ this.onCancel = onCancel;
20
+ this.selectedIndex = Math.max(0, rows.findIndex((row) => row.action === selected));
21
+ const labels = rows.flatMap((row) => (row.field ? [visibleWidth(row.label)] : []));
22
+ this.labelWidth = Math.max(0, ...labels) + 2;
23
+ }
24
+ render(width) {
25
+ if (width < 1)
26
+ return [];
27
+ const border = this.theme.fg("borderMuted", "─".repeat(width));
28
+ const lines = [this.theme.fg("accent", this.theme.bold("Agent Settings")), border];
29
+ this.rowLines = [];
30
+ for (const [index, row] of this.rows.entries()) {
31
+ if (lines.length > 2)
32
+ lines.push("");
33
+ this.rowLines.push(lines.length);
34
+ lines.push(this.renderRow(row, index === this.selectedIndex, width));
35
+ }
36
+ lines.push(border, ...wrapTextWithAnsi(this.theme.fg("dim", this.hints()), width));
37
+ return lines.map((line) => truncateToWidth(line, width));
38
+ }
39
+ handleInput(data) {
40
+ if (this.keys.matches(data, "tui.select.up"))
41
+ this.move(-1);
42
+ else if (this.keys.matches(data, "tui.select.down"))
43
+ this.move(1);
44
+ else if (this.keys.matches(data, "tui.select.confirm"))
45
+ this.select(this.selectedIndex);
46
+ else if (this.keys.matches(data, "tui.select.cancel")) {
47
+ this.onCancel();
48
+ return;
49
+ }
50
+ else
51
+ return;
52
+ this.tui.requestRender();
53
+ }
54
+ handleMouse(event) {
55
+ const index = this.rowLines.indexOf(event.y);
56
+ if (index < 0 || event.button !== "left")
57
+ return undefined;
58
+ if (event.type === "press") {
59
+ this.selectedIndex = index;
60
+ return { handled: true, focus: true };
61
+ }
62
+ if (event.type !== "click")
63
+ return undefined;
64
+ this.selectedIndex = index;
65
+ this.select(index);
66
+ return { handled: true, focus: true };
67
+ }
68
+ invalidate() {
69
+ this.rowLines = [];
70
+ }
71
+ move(delta) {
72
+ const count = this.rows.length;
73
+ this.selectedIndex = (this.selectedIndex + delta + count) % count;
74
+ }
75
+ select(index) {
76
+ const row = this.rows[index];
77
+ if (row)
78
+ this.onSelect(row.action);
79
+ }
80
+ renderRow(row, active, width) {
81
+ const cursor = active ? this.theme.fg("accent", "› ") : " ";
82
+ const label = row.field ? row.label + " ".repeat(this.labelWidth - visibleWidth(row.label)) : row.label;
83
+ const heading = cursor + this.theme.fg(active ? "accent" : "muted", label);
84
+ if (!row.field)
85
+ return truncateToWidth(heading, width);
86
+ return truncateToWidth(heading + this.renderValue(row.field, Math.max(0, width - visibleWidth(heading))), width);
87
+ }
88
+ /** Values keep their room before the inheritance marker degrades, because that marker is the meaning. */
89
+ renderValue(field, width) {
90
+ if (width < 1)
91
+ return "";
92
+ const follow = this.followText(field, width);
93
+ const status = field.status ?? "";
94
+ const statusWidth = status ? visibleWidth(status) + 1 : 0;
95
+ const value = truncateToWidth(field.value, Math.max(0, width - visibleWidth(follow) - statusWidth), "…");
96
+ const head = value + (status ? `${value ? " " : ""}${status}` : "");
97
+ const styled = this.theme.fg(field.tone ?? "text", truncateToWidth(head, width));
98
+ if (!follow)
99
+ return styled;
100
+ const room = width - visibleWidth(styled);
101
+ return room >= visibleWidth(follow) ? styled + this.theme.fg("dim", follow) : styled;
102
+ }
103
+ followText(field, width) {
104
+ if (!field.following)
105
+ return "";
106
+ const available = width - (field.status ? visibleWidth(field.status) + 1 : 0);
107
+ if (visibleWidth(FOLLOW) + VALUE_PRIORITY_WIDTH <= available)
108
+ return FOLLOW;
109
+ if (visibleWidth(FOLLOW_SHORT) + COMPACT_PRIORITY_WIDTH <= available)
110
+ return FOLLOW_SHORT;
111
+ return "";
112
+ }
113
+ hints() {
114
+ const navigation = [this.key("tui.select.up"), this.key("tui.select.down")].filter(Boolean).join("/");
115
+ const confirm = this.key("tui.select.confirm");
116
+ const cancel = this.key("tui.select.cancel");
117
+ return [navigation && `${navigation} navigate`, confirm && `${confirm} change`, cancel && `${cancel} close`]
118
+ .filter(Boolean)
119
+ .join(" · ");
120
+ }
121
+ key(action) {
122
+ return keyLabel(action, { keybindings: this.keys });
123
+ }
124
+ }
125
+ //# sourceMappingURL=settings-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-panel.js","sourceRoot":"","sources":["../../../src/extensions/agent/settings-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\ttype TUI,\n\ttype TuiMouseEvent,\n\ttype TuiMouseEventResult,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport type { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nexport type AgentSettingsAction = \"model\" | \"thinking\" | \"reset\";\n\n/** The current value of a setting row; the reset action row carries no field. */\nexport interface AgentSettingsField {\n\tvalue: string;\n\tfollowing?: boolean;\n\tstatus?: string;\n\ttone?: \"warning\" | \"error\";\n}\n\nexport interface AgentSettingsRow {\n\taction: AgentSettingsAction;\n\tlabel: string;\n\tfield?: AgentSettingsField;\n}\n\nconst FOLLOW = \" · Follow current session\";\nconst FOLLOW_SHORT = \" · follow\";\n/** Room the value keeps before the full inheritance marker is shown. */\nconst VALUE_PRIORITY_WIDTH = 12;\n/** Room the value keeps once only the compact inheritance marker fits. */\nconst COMPACT_PRIORITY_WIDTH = 4;\n\n/** Aligned setting rows with one action row, navigated through the host keybindings. */\nexport class AgentSettingsPanel implements Component {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keys: KeybindingsManager;\n\tprivate readonly rows: AgentSettingsRow[];\n\tprivate readonly onSelect: (action: AgentSettingsAction) => void;\n\tprivate readonly onCancel: () => void;\n\tprivate readonly labelWidth: number;\n\tprivate selectedIndex: number;\n\t/** Line index of each row, recorded while rendering so click hit-testing cannot drift. */\n\tprivate rowLines: number[] = [];\n\n\tconstructor(\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeys: KeybindingsManager,\n\t\trows: AgentSettingsRow[],\n\t\tselected: AgentSettingsAction,\n\t\tonSelect: (action: AgentSettingsAction) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.keys = keys;\n\t\tthis.rows = rows;\n\t\tthis.onSelect = onSelect;\n\t\tthis.onCancel = onCancel;\n\t\tthis.selectedIndex = Math.max(\n\t\t\t0,\n\t\t\trows.findIndex((row) => row.action === selected),\n\t\t);\n\t\tconst labels = rows.flatMap((row) => (row.field ? [visibleWidth(row.label)] : []));\n\t\tthis.labelWidth = Math.max(0, ...labels) + 2;\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width < 1) return [];\n\t\tconst border = this.theme.fg(\"borderMuted\", \"─\".repeat(width));\n\t\tconst lines = [this.theme.fg(\"accent\", this.theme.bold(\"Agent Settings\")), border];\n\t\tthis.rowLines = [];\n\t\tfor (const [index, row] of this.rows.entries()) {\n\t\t\tif (lines.length > 2) lines.push(\"\");\n\t\t\tthis.rowLines.push(lines.length);\n\t\t\tlines.push(this.renderRow(row, index === this.selectedIndex, width));\n\t\t}\n\t\tlines.push(border, ...wrapTextWithAnsi(this.theme.fg(\"dim\", this.hints()), width));\n\t\treturn lines.map((line) => truncateToWidth(line, width));\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.keys.matches(data, \"tui.select.up\")) this.move(-1);\n\t\telse if (this.keys.matches(data, \"tui.select.down\")) this.move(1);\n\t\telse if (this.keys.matches(data, \"tui.select.confirm\")) this.select(this.selectedIndex);\n\t\telse if (this.keys.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t\treturn;\n\t\t} else return;\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined {\n\t\tconst index = this.rowLines.indexOf(event.y);\n\t\tif (index < 0 || event.button !== \"left\") return undefined;\n\t\tif (event.type === \"press\") {\n\t\t\tthis.selectedIndex = index;\n\t\t\treturn { handled: true, focus: true };\n\t\t}\n\t\tif (event.type !== \"click\") return undefined;\n\t\tthis.selectedIndex = index;\n\t\tthis.select(index);\n\t\treturn { handled: true, focus: true };\n\t}\n\n\tinvalidate(): void {\n\t\tthis.rowLines = [];\n\t}\n\n\tprivate move(delta: number): void {\n\t\tconst count = this.rows.length;\n\t\tthis.selectedIndex = (this.selectedIndex + delta + count) % count;\n\t}\n\n\tprivate select(index: number): void {\n\t\tconst row = this.rows[index];\n\t\tif (row) this.onSelect(row.action);\n\t}\n\n\tprivate renderRow(row: AgentSettingsRow, active: boolean, width: number): string {\n\t\tconst cursor = active ? this.theme.fg(\"accent\", \"› \") : \" \";\n\t\tconst label = row.field ? row.label + \" \".repeat(this.labelWidth - visibleWidth(row.label)) : row.label;\n\t\tconst heading = cursor + this.theme.fg(active ? \"accent\" : \"muted\", label);\n\t\tif (!row.field) return truncateToWidth(heading, width);\n\t\treturn truncateToWidth(heading + this.renderValue(row.field, Math.max(0, width - visibleWidth(heading))), width);\n\t}\n\n\t/** Values keep their room before the inheritance marker degrades, because that marker is the meaning. */\n\tprivate renderValue(field: AgentSettingsField, width: number): string {\n\t\tif (width < 1) return \"\";\n\t\tconst follow = this.followText(field, width);\n\t\tconst status = field.status ?? \"\";\n\t\tconst statusWidth = status ? visibleWidth(status) + 1 : 0;\n\t\tconst value = truncateToWidth(field.value, Math.max(0, width - visibleWidth(follow) - statusWidth), \"…\");\n\t\tconst head = value + (status ? `${value ? \" \" : \"\"}${status}` : \"\");\n\t\tconst styled = this.theme.fg(field.tone ?? \"text\", truncateToWidth(head, width));\n\t\tif (!follow) return styled;\n\t\tconst room = width - visibleWidth(styled);\n\t\treturn room >= visibleWidth(follow) ? styled + this.theme.fg(\"dim\", follow) : styled;\n\t}\n\n\tprivate followText(field: AgentSettingsField, width: number): string {\n\t\tif (!field.following) return \"\";\n\t\tconst available = width - (field.status ? visibleWidth(field.status) + 1 : 0);\n\t\tif (visibleWidth(FOLLOW) + VALUE_PRIORITY_WIDTH <= available) return FOLLOW;\n\t\tif (visibleWidth(FOLLOW_SHORT) + COMPACT_PRIORITY_WIDTH <= available) return FOLLOW_SHORT;\n\t\treturn \"\";\n\t}\n\n\tprivate hints(): string {\n\t\tconst navigation = [this.key(\"tui.select.up\"), this.key(\"tui.select.down\")].filter(Boolean).join(\"/\");\n\t\tconst confirm = this.key(\"tui.select.confirm\");\n\t\tconst cancel = this.key(\"tui.select.cancel\");\n\t\treturn [navigation && `${navigation} navigate`, confirm && `${confirm} change`, cancel && `${cancel} close`]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\" · \");\n\t}\n\n\tprivate key(action: Parameters<typeof keyLabel>[0]): string {\n\t\treturn keyLabel(action, { keybindings: this.keys });\n\t}\n}\n"]}
@@ -9,7 +9,7 @@ export declare function resolveAgentConfiguration(ctx: ModelContext & Pick<Exten
9
9
  thinking: ThinkingLevel;
10
10
  settings: AgentSettings;
11
11
  };
12
- /** Two small native selectors; every confirmed choice affects future Agents only. */
12
+ /** The native pickers save only Agent overrides; reset clears both in one write. */
13
13
  export declare function openAgentSettings(ctx: ExtensionCommandContext): Promise<void>;
14
14
  export {};
15
15
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAkD,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAE1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGhG,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1E,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC;AA8BvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG,aAAa,CAOpG;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG;IAC9G,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACxB,CAcA;AAuCD,qFAAqF;AACrF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FnF"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAkD,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAE1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAUhG,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1E,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC;AA8BvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG,aAAa,CAOpG;AAgCD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,GAAG;IAC9G,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC;CACxB,CAYA;AAmGD,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEnF"}