@esso0428/pi-subagents 0.17.16 → 0.17.18

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 (359) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/ROADMAP.md +87 -0
  3. package/docs/post-0.17.6-agents-roster-viewer-spec.md +42 -0
  4. package/docs/post-0.17.6-durable-history-spec.md +41 -0
  5. package/docs/post-0.17.6-feature-specs.md +50 -0
  6. package/docs/post-0.17.6-nested-agents-spec.md +38 -0
  7. package/docs/post-0.17.6-recovery-shutdown-spec.md +46 -0
  8. package/docs/post-0.17.6-ui-latency-baseline-spec.md +46 -0
  9. package/docs/post-0.17.6-workflow-rpc-lifecycle-spec.md +54 -0
  10. package/package.json +1 -1
  11. package/src/agent-history.ts +2 -54
  12. package/src/agent-manager.ts +406 -1288
  13. package/src/agent-runner.ts +27 -251
  14. package/src/agent-types.ts +32 -188
  15. package/src/cross-extension-rpc.ts +20 -96
  16. package/src/custom-agents.ts +13 -170
  17. package/src/index.ts +480 -1920
  18. package/src/invocation-config.ts +3 -118
  19. package/src/model-resolver.ts +0 -18
  20. package/src/output-file.ts +6 -61
  21. package/src/prompts.ts +2 -45
  22. package/src/schedule.ts +14 -35
  23. package/src/settings.ts +2 -301
  24. package/src/status-note.ts +1 -66
  25. package/src/types.ts +10 -177
  26. package/src/ui/agent-widget.ts +57 -278
  27. package/src/ui/conversation-blocks.ts +0 -6
  28. package/src/ui/conversation-timeline.ts +25 -139
  29. package/src/ui/conversation-viewer.ts +48 -212
  30. package/src/ui/schedule-menu.ts +8 -9
  31. package/src/usage.ts +2 -109
  32. package/src/worktree.ts +55 -69
  33. package/dist/abortable.d.ts +0 -13
  34. package/dist/abortable.d.ts.map +0 -1
  35. package/dist/abortable.js +0 -43
  36. package/dist/abortable.js.map +0 -1
  37. package/dist/agent-color.d.ts +0 -36
  38. package/dist/agent-color.d.ts.map +0 -1
  39. package/dist/agent-color.js +0 -124
  40. package/dist/agent-color.js.map +0 -1
  41. package/dist/agent-file-toggle.d.ts +0 -126
  42. package/dist/agent-file-toggle.d.ts.map +0 -1
  43. package/dist/agent-file-toggle.js +0 -259
  44. package/dist/agent-file-toggle.js.map +0 -1
  45. package/dist/agent-history-list.d.ts +0 -19
  46. package/dist/agent-history-list.d.ts.map +0 -1
  47. package/dist/agent-history-list.js +0 -69
  48. package/dist/agent-history-list.js.map +0 -1
  49. package/dist/agent-history.d.ts +0 -35
  50. package/dist/agent-history.d.ts.map +0 -1
  51. package/dist/agent-history.js +0 -188
  52. package/dist/agent-history.js.map +0 -1
  53. package/dist/agent-manager.d.ts +0 -503
  54. package/dist/agent-manager.d.ts.map +0 -1
  55. package/dist/agent-manager.js +0 -1572
  56. package/dist/agent-manager.js.map +0 -1
  57. package/dist/agent-recovery.d.ts +0 -37
  58. package/dist/agent-recovery.d.ts.map +0 -1
  59. package/dist/agent-recovery.js +0 -171
  60. package/dist/agent-recovery.js.map +0 -1
  61. package/dist/agent-runner.d.ts +0 -303
  62. package/dist/agent-runner.d.ts.map +0 -1
  63. package/dist/agent-runner.js +0 -1003
  64. package/dist/agent-runner.js.map +0 -1
  65. package/dist/agent-types.d.ts +0 -120
  66. package/dist/agent-types.d.ts.map +0 -1
  67. package/dist/agent-types.js +0 -301
  68. package/dist/agent-types.js.map +0 -1
  69. package/dist/child-context.d.ts +0 -3
  70. package/dist/child-context.d.ts.map +0 -1
  71. package/dist/child-context.js +0 -13
  72. package/dist/child-context.js.map +0 -1
  73. package/dist/context.d.ts +0 -13
  74. package/dist/context.d.ts.map +0 -1
  75. package/dist/context.js +0 -57
  76. package/dist/context.js.map +0 -1
  77. package/dist/cross-extension-rpc.d.ts +0 -67
  78. package/dist/cross-extension-rpc.d.ts.map +0 -1
  79. package/dist/cross-extension-rpc.js +0 -139
  80. package/dist/cross-extension-rpc.js.map +0 -1
  81. package/dist/custom-agents.d.ts +0 -55
  82. package/dist/custom-agents.d.ts.map +0 -1
  83. package/dist/custom-agents.js +0 -309
  84. package/dist/custom-agents.js.map +0 -1
  85. package/dist/default-agents.d.ts +0 -8
  86. package/dist/default-agents.d.ts.map +0 -1
  87. package/dist/default-agents.js +0 -123
  88. package/dist/default-agents.js.map +0 -1
  89. package/dist/enabled-models.d.ts +0 -50
  90. package/dist/enabled-models.d.ts.map +0 -1
  91. package/dist/enabled-models.js +0 -146
  92. package/dist/enabled-models.js.map +0 -1
  93. package/dist/env.d.ts +0 -7
  94. package/dist/env.d.ts.map +0 -1
  95. package/dist/env.js +0 -29
  96. package/dist/env.js.map +0 -1
  97. package/dist/group-join.d.ts +0 -33
  98. package/dist/group-join.d.ts.map +0 -1
  99. package/dist/group-join.js +0 -117
  100. package/dist/group-join.js.map +0 -1
  101. package/dist/index.d.ts +0 -51
  102. package/dist/index.d.ts.map +0 -1
  103. package/dist/index.js +0 -3687
  104. package/dist/index.js.map +0 -1
  105. package/dist/invocation-config.d.ts +0 -108
  106. package/dist/invocation-config.d.ts.map +0 -1
  107. package/dist/invocation-config.js +0 -84
  108. package/dist/invocation-config.js.map +0 -1
  109. package/dist/memory.d.ts +0 -54
  110. package/dist/memory.d.ts.map +0 -1
  111. package/dist/memory.js +0 -166
  112. package/dist/memory.js.map +0 -1
  113. package/dist/mention-clone.d.ts +0 -88
  114. package/dist/mention-clone.d.ts.map +0 -1
  115. package/dist/mention-clone.js +0 -154
  116. package/dist/mention-clone.js.map +0 -1
  117. package/dist/mention.d.ts +0 -82
  118. package/dist/mention.d.ts.map +0 -1
  119. package/dist/mention.js +0 -132
  120. package/dist/mention.js.map +0 -1
  121. package/dist/model-resolver.d.ts +0 -37
  122. package/dist/model-resolver.d.ts.map +0 -1
  123. package/dist/model-resolver.js +0 -96
  124. package/dist/model-resolver.js.map +0 -1
  125. package/dist/model-scope.d.ts +0 -50
  126. package/dist/model-scope.d.ts.map +0 -1
  127. package/dist/model-scope.js +0 -49
  128. package/dist/model-scope.js.map +0 -1
  129. package/dist/nested-tools.d.ts +0 -57
  130. package/dist/nested-tools.d.ts.map +0 -1
  131. package/dist/nested-tools.js +0 -301
  132. package/dist/nested-tools.js.map +0 -1
  133. package/dist/nico-overrides.d.ts +0 -54
  134. package/dist/nico-overrides.d.ts.map +0 -1
  135. package/dist/nico-overrides.js +0 -170
  136. package/dist/nico-overrides.js.map +0 -1
  137. package/dist/output-file.d.ts +0 -44
  138. package/dist/output-file.d.ts.map +0 -1
  139. package/dist/output-file.js +0 -156
  140. package/dist/output-file.js.map +0 -1
  141. package/dist/prompts.d.ts +0 -56
  142. package/dist/prompts.d.ts.map +0 -1
  143. package/dist/prompts.js +0 -92
  144. package/dist/prompts.js.map +0 -1
  145. package/dist/schedule-store.d.ts +0 -39
  146. package/dist/schedule-store.d.ts.map +0 -1
  147. package/dist/schedule-store.js +0 -156
  148. package/dist/schedule-store.js.map +0 -1
  149. package/dist/schedule.d.ts +0 -110
  150. package/dist/schedule.d.ts.map +0 -1
  151. package/dist/schedule.js +0 -360
  152. package/dist/schedule.js.map +0 -1
  153. package/dist/settings.d.ts +0 -354
  154. package/dist/settings.d.ts.map +0 -1
  155. package/dist/settings.js +0 -247
  156. package/dist/settings.js.map +0 -1
  157. package/dist/skill-loader.d.ts +0 -25
  158. package/dist/skill-loader.d.ts.map +0 -1
  159. package/dist/skill-loader.js +0 -94
  160. package/dist/skill-loader.js.map +0 -1
  161. package/dist/status-note.d.ts +0 -62
  162. package/dist/status-note.d.ts.map +0 -1
  163. package/dist/status-note.js +0 -86
  164. package/dist/status-note.js.map +0 -1
  165. package/dist/structured-output.d.ts +0 -62
  166. package/dist/structured-output.d.ts.map +0 -1
  167. package/dist/structured-output.js +0 -113
  168. package/dist/structured-output.js.map +0 -1
  169. package/dist/types.d.ts +0 -372
  170. package/dist/types.d.ts.map +0 -1
  171. package/dist/types.js +0 -6
  172. package/dist/types.js.map +0 -1
  173. package/dist/ui/agent-mention.d.ts +0 -83
  174. package/dist/ui/agent-mention.d.ts.map +0 -1
  175. package/dist/ui/agent-mention.js +0 -188
  176. package/dist/ui/agent-mention.js.map +0 -1
  177. package/dist/ui/agent-widget.d.ts +0 -241
  178. package/dist/ui/agent-widget.d.ts.map +0 -1
  179. package/dist/ui/agent-widget.js +0 -992
  180. package/dist/ui/agent-widget.js.map +0 -1
  181. package/dist/ui/ccstyle/diff/ansi-utils.d.ts +0 -11
  182. package/dist/ui/ccstyle/diff/ansi-utils.d.ts.map +0 -1
  183. package/dist/ui/ccstyle/diff/ansi-utils.js +0 -145
  184. package/dist/ui/ccstyle/diff/ansi-utils.js.map +0 -1
  185. package/dist/ui/ccstyle/diff/diff-presentation.d.ts +0 -12
  186. package/dist/ui/ccstyle/diff/diff-presentation.d.ts.map +0 -1
  187. package/dist/ui/ccstyle/diff/diff-presentation.js +0 -48
  188. package/dist/ui/ccstyle/diff/diff-presentation.js.map +0 -1
  189. package/dist/ui/ccstyle/diff/diff-renderer.d.ts +0 -46
  190. package/dist/ui/ccstyle/diff/diff-renderer.d.ts.map +0 -1
  191. package/dist/ui/ccstyle/diff/diff-renderer.js +0 -2049
  192. package/dist/ui/ccstyle/diff/diff-renderer.js.map +0 -1
  193. package/dist/ui/ccstyle/diff/line-width-safety.d.ts +0 -12
  194. package/dist/ui/ccstyle/diff/line-width-safety.d.ts.map +0 -1
  195. package/dist/ui/ccstyle/diff/line-width-safety.js +0 -58
  196. package/dist/ui/ccstyle/diff/line-width-safety.js.map +0 -1
  197. package/dist/ui/ccstyle/diff/render-utils.d.ts +0 -6
  198. package/dist/ui/ccstyle/diff/render-utils.d.ts.map +0 -1
  199. package/dist/ui/ccstyle/diff/render-utils.js +0 -25
  200. package/dist/ui/ccstyle/diff/render-utils.js.map +0 -1
  201. package/dist/ui/ccstyle/diff/shiki-highlight.d.ts +0 -19
  202. package/dist/ui/ccstyle/diff/shiki-highlight.d.ts.map +0 -1
  203. package/dist/ui/ccstyle/diff/shiki-highlight.js +0 -85
  204. package/dist/ui/ccstyle/diff/shiki-highlight.js.map +0 -1
  205. package/dist/ui/ccstyle/diff/types.d.ts +0 -22
  206. package/dist/ui/ccstyle/diff/types.d.ts.map +0 -1
  207. package/dist/ui/ccstyle/diff/types.js +0 -10
  208. package/dist/ui/ccstyle/diff/types.js.map +0 -1
  209. package/dist/ui/ccstyle/diff/write-display-utils.d.ts +0 -2
  210. package/dist/ui/ccstyle/diff/write-display-utils.d.ts.map +0 -1
  211. package/dist/ui/ccstyle/diff/write-display-utils.js +0 -12
  212. package/dist/ui/ccstyle/diff/write-display-utils.js.map +0 -1
  213. package/dist/ui/ccstyle/tool-renderer.d.ts +0 -17
  214. package/dist/ui/ccstyle/tool-renderer.d.ts.map +0 -1
  215. package/dist/ui/ccstyle/tool-renderer.js +0 -74
  216. package/dist/ui/ccstyle/tool-renderer.js.map +0 -1
  217. package/dist/ui/ccstyle/tool-result.d.ts +0 -44
  218. package/dist/ui/ccstyle/tool-result.d.ts.map +0 -1
  219. package/dist/ui/ccstyle/tool-result.js +0 -423
  220. package/dist/ui/ccstyle/tool-result.js.map +0 -1
  221. package/dist/ui/conversation-blocks.d.ts +0 -46
  222. package/dist/ui/conversation-blocks.d.ts.map +0 -1
  223. package/dist/ui/conversation-blocks.js +0 -313
  224. package/dist/ui/conversation-blocks.js.map +0 -1
  225. package/dist/ui/conversation-nvim.d.ts +0 -8
  226. package/dist/ui/conversation-nvim.d.ts.map +0 -1
  227. package/dist/ui/conversation-nvim.js +0 -117
  228. package/dist/ui/conversation-nvim.js.map +0 -1
  229. package/dist/ui/conversation-role.d.ts +0 -13
  230. package/dist/ui/conversation-role.d.ts.map +0 -1
  231. package/dist/ui/conversation-role.js +0 -39
  232. package/dist/ui/conversation-role.js.map +0 -1
  233. package/dist/ui/conversation-search.d.ts +0 -39
  234. package/dist/ui/conversation-search.d.ts.map +0 -1
  235. package/dist/ui/conversation-search.js +0 -124
  236. package/dist/ui/conversation-search.js.map +0 -1
  237. package/dist/ui/conversation-timeline.d.ts +0 -102
  238. package/dist/ui/conversation-timeline.d.ts.map +0 -1
  239. package/dist/ui/conversation-timeline.js +0 -555
  240. package/dist/ui/conversation-timeline.js.map +0 -1
  241. package/dist/ui/conversation-viewer.d.ts +0 -138
  242. package/dist/ui/conversation-viewer.d.ts.map +0 -1
  243. package/dist/ui/conversation-viewer.js +0 -1175
  244. package/dist/ui/conversation-viewer.js.map +0 -1
  245. package/dist/ui/schedule-menu.d.ts +0 -17
  246. package/dist/ui/schedule-menu.d.ts.map +0 -1
  247. package/dist/ui/schedule-menu.js +0 -95
  248. package/dist/ui/schedule-menu.js.map +0 -1
  249. package/dist/ui/select-item.d.ts +0 -28
  250. package/dist/ui/select-item.d.ts.map +0 -1
  251. package/dist/ui/select-item.js +0 -35
  252. package/dist/ui/select-item.js.map +0 -1
  253. package/dist/ui/viewer-keys.d.ts +0 -21
  254. package/dist/ui/viewer-keys.d.ts.map +0 -1
  255. package/dist/ui/viewer-keys.js +0 -18
  256. package/dist/ui/viewer-keys.js.map +0 -1
  257. package/dist/ui/workflow-card.d.ts +0 -176
  258. package/dist/ui/workflow-card.d.ts.map +0 -1
  259. package/dist/ui/workflow-card.js +0 -333
  260. package/dist/ui/workflow-card.js.map +0 -1
  261. package/dist/ui/workflow-dialog.d.ts +0 -306
  262. package/dist/ui/workflow-dialog.d.ts.map +0 -1
  263. package/dist/ui/workflow-dialog.js +0 -844
  264. package/dist/ui/workflow-dialog.js.map +0 -1
  265. package/dist/ui/workflow-menu.d.ts +0 -42
  266. package/dist/ui/workflow-menu.d.ts.map +0 -1
  267. package/dist/ui/workflow-menu.js +0 -127
  268. package/dist/ui/workflow-menu.js.map +0 -1
  269. package/dist/usage.d.ts +0 -136
  270. package/dist/usage.d.ts.map +0 -1
  271. package/dist/usage.js +0 -121
  272. package/dist/usage.js.map +0 -1
  273. package/dist/workflow/collisions.d.ts +0 -96
  274. package/dist/workflow/collisions.d.ts.map +0 -1
  275. package/dist/workflow/collisions.js +0 -89
  276. package/dist/workflow/collisions.js.map +0 -1
  277. package/dist/workflow/entry.d.ts +0 -33
  278. package/dist/workflow/entry.d.ts.map +0 -1
  279. package/dist/workflow/entry.js +0 -30
  280. package/dist/workflow/entry.js.map +0 -1
  281. package/dist/workflow/host.d.ts +0 -63
  282. package/dist/workflow/host.d.ts.map +0 -1
  283. package/dist/workflow/host.js +0 -363
  284. package/dist/workflow/host.js.map +0 -1
  285. package/dist/workflow/journal.d.ts +0 -98
  286. package/dist/workflow/journal.d.ts.map +0 -1
  287. package/dist/workflow/journal.js +0 -121
  288. package/dist/workflow/journal.js.map +0 -1
  289. package/dist/workflow/json-schema.d.ts +0 -52
  290. package/dist/workflow/json-schema.d.ts.map +0 -1
  291. package/dist/workflow/json-schema.js +0 -112
  292. package/dist/workflow/json-schema.js.map +0 -1
  293. package/dist/workflow/meta.d.ts +0 -68
  294. package/dist/workflow/meta.d.ts.map +0 -1
  295. package/dist/workflow/meta.js +0 -318
  296. package/dist/workflow/meta.js.map +0 -1
  297. package/dist/workflow/progress.d.ts +0 -225
  298. package/dist/workflow/progress.d.ts.map +0 -1
  299. package/dist/workflow/progress.js +0 -362
  300. package/dist/workflow/progress.js.map +0 -1
  301. package/dist/workflow/runtime.d.ts +0 -335
  302. package/dist/workflow/runtime.d.ts.map +0 -1
  303. package/dist/workflow/runtime.js +0 -831
  304. package/dist/workflow/runtime.js.map +0 -1
  305. package/dist/workflow/saved.d.ts +0 -91
  306. package/dist/workflow/saved.d.ts.map +0 -1
  307. package/dist/workflow/saved.js +0 -204
  308. package/dist/workflow/saved.js.map +0 -1
  309. package/dist/workflow/task.d.ts +0 -137
  310. package/dist/workflow/task.d.ts.map +0 -1
  311. package/dist/workflow/task.js +0 -208
  312. package/dist/workflow/task.js.map +0 -1
  313. package/dist/workflow/tool-description.d.ts +0 -39
  314. package/dist/workflow/tool-description.d.ts.map +0 -1
  315. package/dist/workflow/tool-description.js +0 -200
  316. package/dist/workflow/tool-description.js.map +0 -1
  317. package/dist/workflow/worker-source.d.ts +0 -48
  318. package/dist/workflow/worker-source.d.ts.map +0 -1
  319. package/dist/workflow/worker-source.js +0 -779
  320. package/dist/workflow/worker-source.js.map +0 -1
  321. package/dist/worktree.d.ts +0 -53
  322. package/dist/worktree.d.ts.map +0 -1
  323. package/dist/worktree.js +0 -165
  324. package/dist/worktree.js.map +0 -1
  325. package/dist/write-execution.d.ts +0 -42
  326. package/dist/write-execution.d.ts.map +0 -1
  327. package/dist/write-execution.js +0 -138
  328. package/dist/write-execution.js.map +0 -1
  329. package/dist/xml.d.ts +0 -11
  330. package/dist/xml.d.ts.map +0 -1
  331. package/dist/xml.js +0 -13
  332. package/dist/xml.js.map +0 -1
  333. package/src/abortable.ts +0 -43
  334. package/src/agent-color.ts +0 -161
  335. package/src/agent-file-toggle.ts +0 -269
  336. package/src/child-context.ts +0 -15
  337. package/src/mention-clone.ts +0 -196
  338. package/src/mention.ts +0 -141
  339. package/src/model-scope.ts +0 -70
  340. package/src/nested-tools.ts +0 -424
  341. package/src/structured-output.ts +0 -130
  342. package/src/ui/agent-mention.ts +0 -216
  343. package/src/ui/select-item.ts +0 -45
  344. package/src/ui/workflow-card.ts +0 -470
  345. package/src/ui/workflow-dialog.ts +0 -1115
  346. package/src/ui/workflow-menu.ts +0 -166
  347. package/src/workflow/collisions.ts +0 -123
  348. package/src/workflow/entry.ts +0 -47
  349. package/src/workflow/host.ts +0 -403
  350. package/src/workflow/journal.ts +0 -164
  351. package/src/workflow/json-schema.ts +0 -128
  352. package/src/workflow/meta.ts +0 -325
  353. package/src/workflow/progress.ts +0 -550
  354. package/src/workflow/runtime.ts +0 -1219
  355. package/src/workflow/saved.ts +0 -217
  356. package/src/workflow/task.ts +0 -302
  357. package/src/workflow/tool-description.ts +0 -200
  358. package/src/workflow/worker-source.ts +0 -781
  359. package/src/xml.ts +0 -13
@@ -1,188 +0,0 @@
1
- /**
2
- * agent-mention.ts — what `@` can address, and the suggestions pi renders for it.
3
- *
4
- * A subagent is addressable whether or not it is currently running: a live
5
- * record is messaged or resumed, an evicted one whose session is still on disk
6
- * is reopened, and an agent *type* with no instance at all is started. That is
7
- * the point of the handle — `@explore` means the Explore agent, not "the
8
- * Explore process that happens to exist right now" — so the roster below unions
9
- * all three, and the dispatcher and the popup read the same list.
10
- *
11
- * Rows are per *agent*, not per handle. An agent given a `name` holds two names
12
- * (its alias and its type-derived handle) and both resolve, but it lists once,
13
- * under the alias, with its type moved into the description so the row still
14
- * says what it is.
15
- *
16
- * pi's `CombinedAutocompleteProvider` already owns `@`, where it means "attach a
17
- * file". Extensions can wrap it (`ctx.ui.addAutocompleteProvider`), so this
18
- * provider adds the `@` tokens that name an agent and delegates everything else
19
- * — including all of `applyCompletion`, whose `@`-branch already inserts
20
- * `item.value` plus a trailing space, which is exactly what a handle needs.
21
- *
22
- * Matching mirrors Claude Code: case-insensitive prefix, not fuzzy. What it does
23
- * NOT mirror is Claude Code dropping files whenever an agent matches. Here `@` is
24
- * pi's file picker first, and the handles are additive, so a token matching both
25
- * lists both — agents first. Suppressing on any match sounds narrow and is not:
26
- * an empty token prefix-matches every handle, so a bare `@` — the gesture people
27
- * use to browse files — would offer no files at all, and a single letter
28
- * beginning any handle would do the same.
29
- *
30
- * Both halves ship under ONE `prefix`, which is sound because wherever BOTH sides
31
- * produce rows they measured the same span. pi's `extractAtPrefix` takes the
32
- * token after the last of `{space, tab, ", ', =}` and keeps it only if it starts
33
- * with `@`; `MENTION_TRIGGER` matches `@[\w-]*` at the cursor, after start-of-line
34
- * or `[\s。、?!]`. Where those two disagree, exactly one side answers and there
35
- * is nothing to merge: `@src/index.ts` and `@"my file` are pi's alone (no handle
36
- * matches), `=@ex` is pi's alone (`=` is a delimiter to pi, not a boundary to us),
37
- * and `。@ex` is ours alone (the reverse). A merged response therefore never
38
- * carries a prefix from one side and an item from the other.
39
- *
40
- * Offering never-started types is a deliberate step beyond Claude Code, whose
41
- * registry holds only live tasks, so an agent you had not launched yet was
42
- * unaddressable.
43
- */
44
- import { handleBase, MENTION_TRIGGER } from "../mention.js";
45
- /**
46
- * Everything `@` can reach, in the order the popup lists it: steerable agents
47
- * first, then the other live ones earliest-launched, then agent types with no
48
- * live instance. A type whose handle a record already holds is omitted — that
49
- * name addresses the existing agent, which is what makes `@explore` mean
50
- * "message the one that's running" and only otherwise "start one".
51
- */
52
- export function mentionRoster(manager, types,
53
- // Identity by default: a caller with no registry to consult gets the raw
54
- // type, which is also what `getConfig` falls back to when no label is set.
55
- displayNameOf = type => type) {
56
- const live = (r) => r.status === "running" || r.status === "queued";
57
- const records = manager.listAgents()
58
- .filter(r => r.handle !== undefined && r.parentAgentId === undefined)
59
- .sort((a, b) => (Number(live(b)) - Number(live(a))) || (a.startedAt - b.startedAt));
60
- const taken = new Set();
61
- const targets = [];
62
- // One row per agent, not per handle. An aliased agent lists under its alias
63
- // only — both names resolve, but showing two rows for one agent reads as two
64
- // agents. The type handle stays addressable whether or not it is listed.
65
- for (const record of records) {
66
- const handle = record.alias ?? record.handle;
67
- taken.add(handle.toLowerCase());
68
- if (record.handle)
69
- taken.add(record.handle.toLowerCase());
70
- targets.push({ kind: "record", handle, record, typeLabel: displayNameOf(record.type) });
71
- }
72
- // Then agents that are gone but whose conversation can be reopened. After the
73
- // live ones: a running agent is the likelier target, and this keeps the
74
- // ordering "what exists now, then what can be brought back, then what can be
75
- // started".
76
- for (const entry of manager.listTombstones()) {
77
- const handle = entry.alias ?? entry.handle;
78
- if (taken.has(handle.toLowerCase()))
79
- continue;
80
- taken.add(handle.toLowerCase());
81
- taken.add(entry.handle.toLowerCase());
82
- targets.push({ kind: "tombstone", handle, entry, typeLabel: displayNameOf(entry.type) });
83
- }
84
- for (const type of types) {
85
- const handle = handleBase(type.name);
86
- if (taken.has(handle))
87
- continue;
88
- taken.add(handle);
89
- targets.push({ kind: "type", handle, type: type.name, description: type.description });
90
- }
91
- return targets;
92
- }
93
- export function createMentionProvider(current, roster, isEnabled) {
94
- // One warning per provider, not per keystroke: `getSuggestions` runs on every
95
- // character typed after `@`, so an unguarded log would bury the terminal in
96
- // the time it takes to finish a word.
97
- let warnedInnerFailure = false;
98
- return {
99
- // Only `@` — the contract is "characters that should naturally trigger
100
- // THIS provider", and pi unions each wrapper's own set onto the outermost
101
- // one itself (interactive-mode.js:432), so re-declaring the wrapped
102
- // provider's characters here would both misreport us and duplicate that.
103
- triggerCharacters: ["@"],
104
- async getSuggestions(lines, cursorLine, cursorCol, options) {
105
- const mine = isEnabled() ? mentionItems(roster(), lines[cursorLine] ?? "", cursorCol) : null;
106
- // Asked unconditionally: pi owns `@` and must keep answering for it even
107
- // when a handle matches too. That is the same work vanilla pi does on any
108
- // `@` keystroke — a capped `fd` search, or nothing at all when the host
109
- // configured no `fd` path — but we now do it on tokens we used to answer
110
- // alone, so it must not be able to take the popup down with it. The
111
- // wrapped provider is not always pi's: another extension may sit inside
112
- // us, and before this it was never called for a token naming an agent.
113
- // try/catch, not `.catch()`: a provider that throws SYNCHRONOUSLY never
114
- // returns the promise a `.catch()` would attach to, and the throw escapes
115
- // this method as a rejection — which pi does not handle either
116
- // (components/editor.js:1892 awaits with no catch of its own).
117
- let theirs = null;
118
- try {
119
- theirs = await current.getSuggestions(lines, cursorLine, cursorCol, options);
120
- }
121
- catch (err) {
122
- // Safe to treat as "no files": pi discards any response whose request is
123
- // no longer current, so an aborted search that surfaces as a rejection
124
- // cannot leave a stale popup behind (`isAutocompleteRequestCurrent`).
125
- // Warned rather than swallowed outright — the failure is invisible in
126
- // the popup, and the same `console.warn` channel already carries this
127
- // extension's other non-fatal failures.
128
- if (!warnedInnerFailure) {
129
- warnedInnerFailure = true;
130
- console.warn("[pi-subagents] the autocomplete provider below us failed; showing agent rows only:", err);
131
- }
132
- theirs = null;
133
- }
134
- if (!mine)
135
- return theirs;
136
- if (!theirs)
137
- return mine;
138
- // Agents first: there are a handful of them against pi's 20 file rows, and
139
- // a handle buried under fuzzy path matches is a handle nobody finds. The
140
- // prefix is ours by the span argument in the header — identical to pi's
141
- // whenever both sides have something to say.
142
- return { items: [...mine.items, ...theirs.items], prefix: mine.prefix };
143
- },
144
- applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
145
- return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
146
- },
147
- shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
148
- return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;
149
- },
150
- };
151
- }
152
- /** Suggestions for the `@…` token under the cursor, or null when it names no agent. */
153
- function mentionItems(roster, line, cursorCol) {
154
- const match = MENTION_TRIGGER.exec(line.slice(0, cursorCol));
155
- if (!match)
156
- return null;
157
- const typed = match[2].toLowerCase();
158
- const items = [];
159
- for (const target of roster) {
160
- if (!target.handle.toLowerCase().startsWith(typed))
161
- continue;
162
- items.push({ value: `@${target.handle}`, label: `@${target.handle}`, description: describeTarget(target) });
163
- }
164
- return items.length > 0 ? { items, prefix: `@${match[2]}` } : null;
165
- }
166
- /** Name the action that will actually happen, so the list never mispromises. */
167
- function describeTarget(target) {
168
- if (target.kind === "type")
169
- return `start agent · ${summarize(target.description)}`;
170
- if (target.kind === "tombstone") {
171
- // No status: the record is gone, and "completed" would imply one is still
172
- // being tracked. The type carries the identity the handle may not.
173
- return `resume · ${target.typeLabel} · ${target.entry.description}`;
174
- }
175
- const { status, description, alias } = target.record;
176
- const action = status === "running" || status === "queued" ? "send message" : "resume";
177
- // A row listed under its alias has lost the type its handle would have shown,
178
- // so name it — `@auth-audit` alone says nothing about what the agent is.
179
- // A type-derived row already reads as its type and would just repeat itself.
180
- const identity = alias ? `${target.typeLabel} · ` : "";
181
- return `${action} · ${identity}${status} · ${description}`;
182
- }
183
- /** First sentence of an agent description, clipped — these run to paragraphs. */
184
- function summarize(description) {
185
- const first = (description.match(/^.*?[.!?](?=\s|$)/s)?.[0] ?? description).replace(/\s+/g, " ").trim();
186
- return first.length > 60 ? `${first.slice(0, 59).trimEnd()}…` : first;
187
- }
188
- //# sourceMappingURL=agent-mention.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-mention.js","sourceRoot":"","sources":["../../src/ui/agent-mention.ts"],"names":[],"mappings":"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"}
@@ -1,241 +0,0 @@
1
- /**
2
- * agent-widget.ts — Persistent widget showing running/completed agents above the editor.
3
- *
4
- * Displays a tree of agents with animated spinners, live stats, and activity descriptions.
5
- * Uses the callback form of setWidget for themed rendering.
6
- */
7
- import type { AgentManager } from "../agent-manager.js";
8
- import type { AgentInvocation, AgentRecord, SubagentType, WidgetMode } from "../types.js";
9
- import { type LifetimeUsage, type SessionLike } from "../usage.js";
10
- /** Maximum number of rendered lines before overflow collapse kicks in. */
11
- export declare const MAX_WIDGET_LINES = 12;
12
- /**
13
- * Derive the widget ceiling from the terminal height while retaining the
14
- * historical MAX_WIDGET_LINES ceiling. Very short terminals may have no room
15
- * for the widget; that is preferable to consuming the editor/input area.
16
- */
17
- export declare function getWidgetLineBudget(rows: number): number;
18
- /** Braille spinner frames for animated running indicator. */
19
- export declare const SPINNER: string[];
20
- /** Statuses that indicate an error/non-success outcome (used for linger behavior and icon rendering). */
21
- export declare const ERROR_STATUSES: Set<string>;
22
- export type Theme = {
23
- fg(color: string, text: string): string;
24
- bold(text: string): string;
25
- };
26
- export type AgentWidgetOpenMode = "live" | "history";
27
- export type AgentWidgetOpenCallback = (record: AgentRecord, mode: AgentWidgetOpenMode) => void | Promise<void>;
28
- export interface AgentWidgetOptions {
29
- canOpenHistory?: (record: AgentRecord) => boolean;
30
- onOpen?: AgentWidgetOpenCallback;
31
- showCost?: () => boolean;
32
- }
33
- /** @deprecated Use AgentWidgetOpenMode. */
34
- export type AgentOpenMode = AgentWidgetOpenMode;
35
- /** @deprecated Use AgentWidgetOpenCallback. */
36
- export type AgentOpenCallback = AgentWidgetOpenCallback;
37
- /** @deprecated Use AgentWidgetOptions.canOpenHistory. */
38
- export type AgentHistoryCapability = AgentWidgetOptions["canOpenHistory"];
39
- export type UICtx = {
40
- setStatus(key: string, text: string | undefined): void;
41
- setWidget(key: string, content: undefined | ((tui: any, theme: Theme) => {
42
- render(): string[];
43
- invalidate(): void;
44
- }), options?: {
45
- placement?: "aboveEditor" | "belowEditor";
46
- }): void;
47
- onTerminalInput?(handler: (data: string) => {
48
- consume?: boolean;
49
- data?: string;
50
- } | undefined): () => void;
51
- getEditorText?(): string;
52
- };
53
- /** Per-agent live activity state. */
54
- export interface AgentActivity {
55
- activeTools: Map<string, string>;
56
- toolUses: number;
57
- responseText: string;
58
- session?: SessionLike;
59
- /** Current turn count. */
60
- turnCount: number;
61
- /** Effective max turns for this agent (undefined = unlimited). */
62
- maxTurns?: number;
63
- /** Lifetime usage breakdown — see LifetimeUsage docs. */
64
- lifetimeUsage: LifetimeUsage;
65
- }
66
- /** Metadata attached to Agent tool results for custom rendering. */
67
- export interface AgentDetails {
68
- displayName: string;
69
- description: string;
70
- subagentType: string;
71
- toolUses: number;
72
- tokens: string;
73
- durationMs: number;
74
- status: "queued" | "running" | "completed" | "steered" | "aborted" | "stopped" | "error" | "background";
75
- /** Human-readable description of what the agent is currently doing. */
76
- activity?: string;
77
- /** Current spinner frame index (for animated running indicator). */
78
- spinnerFrame?: number;
79
- /** Short model name if different from parent (e.g. "haiku", "sonnet"). */
80
- modelName?: string;
81
- /** Notable config tags (e.g. ["thinking: high", "isolated"]). */
82
- tags?: string[];
83
- /** Current turn count. */
84
- turnCount?: number;
85
- /** Effective max turns (undefined = unlimited). */
86
- maxTurns?: number;
87
- /** Estimated cost in USD; 0 when the model has no pricing data. */
88
- cost?: number;
89
- agentId?: string;
90
- error?: string;
91
- }
92
- /** Apply foreground styling while restoring it after nested foreground/full ANSI resets. */
93
- export declare function fgPreservingNestedStyles(theme: Theme, color: string, text: string): string;
94
- /** Format a token count compactly: "33.8k token", "1.2M token". */
95
- export declare function formatTokens(count: number): string;
96
- /**
97
- * Token count with optional context-fill % and compaction-count annotations.
98
- * Thresholds for percent: <70% dim, 70–85% warning, ≥85% error.
99
- * Compaction count rendered as `⇊N` in dim.
100
- *
101
- * "12.3k token" — no annotations
102
- * "12.3k token (45%)" — percent only
103
- * "12.3k token (⇊2)" — compactions only (e.g. right after compact)
104
- * "12.3k token (45% · ⇊2)" — both
105
- */
106
- export declare function formatSessionTokens(tokens: number, percent: number | null, theme: Theme, compactions?: number): string;
107
- /** Format turn count with optional max limit: "↻5≤30" or "↻5". */
108
- export declare function formatTurns(turnCount: number, maxTurns?: number | null): string;
109
- /** Format milliseconds as human-readable duration. */
110
- export declare function formatMs(ms: number): string;
111
- /** Format duration from start/completed timestamps. */
112
- export declare function formatDuration(startedAt: number, completedAt?: number): string;
113
- /** Format an estimated model cost without implying billing precision. */
114
- export declare function formatCost(cost: number): string;
115
- /** Get display name for any agent type (built-in or custom). */
116
- export declare function getDisplayName(type: SubagentType): string;
117
- /** Short label for prompt mode: "twin" for append, nothing for replace (the default). */
118
- export declare function getPromptModeLabel(type: SubagentType): string | undefined;
119
- /** Mode label is not included — callers add it where they want it. */
120
- export declare function buildInvocationTags(invocation: AgentInvocation | undefined): {
121
- modelName?: string;
122
- modelId?: string;
123
- tags: string[];
124
- };
125
- /** Build a human-readable activity string from currently-running tools or response text. */
126
- export declare function describeActivity(activeTools: Map<string, string>, responseText?: string): string;
127
- export declare class AgentWidget {
128
- private manager;
129
- private agentActivity;
130
- /** Read live at render time. Selects which agents the widget shows. */
131
- private mode;
132
- private uiCtx;
133
- private widgetFrame;
134
- private widgetInterval;
135
- private inputUnsub;
136
- /** Whether arrow keys currently navigate the agent roster. */
137
- private navigationActive;
138
- /** Stable identity of the selected row, so roster changes do not jump selection. */
139
- private selectedAgentId;
140
- /** Last logical roster index of the selected row, used when it disappears. */
141
- private selectedRosterIndex;
142
- /** First logical row currently represented by the bounded viewport. */
143
- private viewportStart;
144
- /** Cached records and roster. Rebuilt by update(), never by an arrow press. */
145
- private cachedAgents;
146
- private cachedRoster;
147
- private rosterCacheKey;
148
- private rosterCacheInitialized;
149
- /** Terminal history capability is a potentially filesystem-backed lookup. */
150
- private historyOpenabilityCache;
151
- /** Whether the widget callback is currently registered with the TUI. */
152
- private widgetRegistered;
153
- /** Cached TUI reference from widget factory callback, used for requestRender(). */
154
- private tui;
155
- /** Last status bar text, used to avoid redundant setStatus calls. */
156
- private lastStatusText;
157
- /** Snapshot of the state used for the last widget registration/render request. */
158
- private lastRenderKey;
159
- private readonly openOptions;
160
- private readonly showCost;
161
- private readonly showModel;
162
- constructor(manager: AgentManager, agentActivity: Map<string, AgentActivity>,
163
- /** Read live at render time. Selects which agents the widget shows. */
164
- mode?: () => WidgetMode, showCostOrOptions?: (() => boolean) | AgentWidgetOptions, showModel?: () => boolean);
165
- /**
166
- * Agents eligible for the widget, per the current `WidgetMode`:
167
- * - `off`: none (the widget's existing empty-state path hides it entirely).
168
- * - `background`: drop only agents *known* to be foreground
169
- * (`isBackground === false`); keep everything else — background, queued,
170
- * scheduled, or RPC-spawned (`undefined`). Keying off the `isBackground`
171
- * record flag rather than the UI-only `invocation` snapshot (which only the
172
- * Agent-tool path sets), and excluding rather than allow-listing, means
173
- * only proven-foreground runs drop out — nothing else silently vanishes.
174
- * - `all`: every agent.
175
- */
176
- private widgetAgentsFromManager;
177
- /** Records currently visible to the widget; safe for render and input paths. */
178
- private widgetAgents;
179
- private canOpenHistory;
180
- private historyOpenabilityKey;
181
- /**
182
- * Cache terminal history capability by the record state that can affect it.
183
- * The supplied predicate may call `existsSync`, so it must not run from a
184
- * timer refresh, render-key calculation, or arrow-navigation path more than
185
- * once for the same terminal record state.
186
- */
187
- private cachedCanOpenHistory;
188
- /** Refresh the manager snapshot and openability cache at lifecycle/update time. */
189
- private refreshRoster;
190
- /** Set the UI context (grabbed from first tool execution). */
191
- setUICtx(ctx: UICtx): boolean;
192
- /** Request a render on the currently registered TUI without touching input. */
193
- requestUiRefresh(force?: boolean): boolean;
194
- /** Called on each new turn (tool_execution_start). */
195
- onTurnStart(): void;
196
- /** Keep the spinner/elapsed-time timer alive only while a visible agent runs. */
197
- ensureTimer(): void;
198
- private syncTimer;
199
- /**
200
- * Retained for the lifecycle call sites. Terminal visibility is determined
201
- * by the manager record and the history capability, not a one-turn timer.
202
- */
203
- markFinished(_agentId: string): void;
204
- /** Retained for lifecycle call sites; terminal rows are record-driven now. */
205
- markRunning(_agentId: string): void;
206
- /**
207
- * Records represented by selectable rows in the above-editor widget.
208
- *
209
- * Keep this order as the single source of truth for both rendering and key
210
- * navigation. `listAgents()` is newest-first; active rows come first so the
211
- * panel exposes currently useful work before terminal history.
212
- */
213
- private roster;
214
- /** True when pi's prompt editor owns the keyboard. */
215
- private editorHasFocus;
216
- private selectedIndexOf;
217
- private deactivate;
218
- /** Resume navigation from the retained row, or select the first row. */
219
- private activate;
220
- /** Move the selected row, activating only from an empty focused editor. */
221
- private moveSelection;
222
- private openSelected;
223
- /** Handle terminal input before it reaches the focused prompt editor. */
224
- handleKey(data: string): {
225
- consume?: boolean;
226
- data?: string;
227
- } | undefined;
228
- /** Render a finished agent line. */
229
- private renderFinishedLine;
230
- /**
231
- * Render the widget content. Called from the registered widget's render() callback,
232
- * reading live state each time instead of capturing it in a closure.
233
- */
234
- private renderWidget;
235
- /** Build a render-relevant snapshot without capturing mutable records. */
236
- private renderKey;
237
- /** Force an immediate widget update. `advanceSpinner` is reserved for the timer. */
238
- update(advanceSpinner?: boolean): void;
239
- dispose(): void;
240
- }
241
- //# sourceMappingURL=agent-widget.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-widget.d.ts","sourceRoot":"","sources":["../../src/ui/agent-widget.ts"],"names":[],"mappings":"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"}