@selesai/code 0.13.3 → 0.13.5

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 (511) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/compaction/utils.js +2 -2
  5. package/dist/core/export-html/template.css +1066 -1066
  6. package/dist/core/export-html/template.html +55 -55
  7. package/dist/core/export-html/template.js +1864 -1864
  8. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  9. package/dist/core/export-html/vendor/marked.min.js +78 -78
  10. package/dist/core/messages.js +7 -7
  11. package/dist/defaults/models.json +17 -1
  12. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  13. package/dist/extensions/context-compaction-reminder.ts +28 -28
  14. package/dist/extensions/cost-reconcile.test.ts +24 -5
  15. package/dist/extensions/cost-reconcile.ts +14 -7
  16. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +0 -0
  17. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +0 -0
  18. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  19. package/dist/extensions/pi-intercom/LICENSE +21 -21
  20. package/dist/extensions/pi-intercom/README.md +4 -5
  21. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  22. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  23. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  24. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  25. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  26. package/dist/extensions/pi-intercom/config.test.ts +3 -31
  27. package/dist/extensions/pi-intercom/config.ts +0 -15
  28. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  29. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  30. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  31. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  32. package/dist/extensions/pi-intercom/index.ts +9 -46
  33. package/dist/extensions/pi-intercom/intercom.integration.test.ts +49 -57
  34. package/dist/extensions/pi-intercom/package.json +1 -1
  35. package/dist/extensions/pi-intercom/reply-tracker.test.ts +20 -0
  36. package/dist/extensions/pi-intercom/reply-tracker.ts +8 -0
  37. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  38. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  39. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  40. package/dist/extensions/pi-subagents/CHANGELOG.md +27 -0
  41. package/dist/extensions/pi-subagents/docs/tool-reference.md +4 -1
  42. package/dist/extensions/pi-subagents/docs/workflows.md +2 -2
  43. package/dist/extensions/pi-subagents/install.mjs +0 -0
  44. package/dist/extensions/pi-subagents/package-lock.json +2 -2
  45. package/dist/extensions/pi-subagents/package.json +1 -1
  46. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +48 -243
  47. package/dist/extensions/pi-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  48. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +87 -37
  49. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +29 -233
  50. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +49 -8
  51. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  52. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +13 -1
  53. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +34 -27
  54. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +73 -0
  55. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +157 -28
  56. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  57. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +1 -0
  58. package/dist/extensions/pi-subagents/src/extension/schemas.ts +1 -0
  59. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +4 -1
  60. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +2 -2
  61. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +3 -0
  62. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +45 -2
  63. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +3 -2
  64. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +13 -2
  65. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +5 -1
  66. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +10 -2
  67. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +3 -0
  68. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +11 -2
  69. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +98 -1
  70. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +138 -4
  71. package/dist/extensions/pi-subagents/src/runs/shared/background-process-options.ts +9 -0
  72. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +2 -5
  73. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +52 -3
  74. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +47 -1
  75. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +45 -18
  76. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +21 -2
  77. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +15 -0
  78. package/dist/extensions/pi-subagents/src/shared/types.ts +34 -1
  79. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +11 -3
  80. package/dist/extensions/pi-subagents/src/tui/render-helpers.ts +31 -0
  81. package/dist/extensions/pi-subagents/src/tui/render.ts +597 -112
  82. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +40 -1
  83. package/dist/extensions/pi-subagents/src/workflows/host-command.ts +6 -1
  84. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +53 -2
  85. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +55 -6
  86. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +111 -1
  87. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +206 -38
  88. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +522 -31
  89. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +123 -0
  90. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +48 -0
  91. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +57 -1
  92. package/dist/extensions/pi-subagents/test/unit/background-process-options.test.ts +17 -0
  93. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +1 -1
  94. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +44 -4
  95. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +91 -0
  96. package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +1 -0
  97. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +0 -1
  98. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +20 -3
  99. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +27 -0
  100. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +93 -17
  101. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +1 -0
  102. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +103 -26
  103. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +58 -0
  104. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +22 -2
  105. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +21 -0
  106. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -0
  107. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +54 -0
  108. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +2 -0
  109. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +32 -0
  110. package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +48 -1
  111. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +21 -6
  112. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +11 -0
  113. package/dist/extensions/pi-web-agent/CHANGELOG.md +410 -0
  114. package/dist/extensions/pi-web-agent/README.md +131 -0
  115. package/dist/extensions/pi-web-agent/package.json +4 -2
  116. package/dist/extensions/pi-web-agent/src/backends/config.ts +62 -5
  117. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -0
  118. package/dist/extensions/pi-web-agent/src/backends/factory.ts +96 -6
  119. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  120. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  121. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  122. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +183 -47
  123. package/dist/extensions/pi-web-agent/src/extension.ts +62 -25
  124. package/dist/extensions/pi-web-agent/src/extract/readability.ts +19 -11
  125. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  126. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  127. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  128. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  129. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  130. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +5 -4
  131. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +2 -25
  132. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +5 -2
  133. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +2 -0
  134. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  135. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  136. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +72 -7
  137. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +8 -1
  138. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +28 -3
  139. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +4 -0
  140. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  141. package/dist/extensions/pi-web-agent/src/orchestration/url.ts +35 -0
  142. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  143. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  144. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +18 -6
  145. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  146. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +14 -2
  147. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  148. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  149. package/dist/extensions/pi-web-agent/src/readers/github-reader.ts +150 -0
  150. package/dist/extensions/pi-web-agent/src/readers/limits.ts +3 -0
  151. package/dist/extensions/pi-web-agent/src/readers/pdf-reader.ts +87 -0
  152. package/dist/extensions/pi-web-agent/src/readers/resolver.ts +25 -0
  153. package/dist/extensions/pi-web-agent/src/readers/types.ts +11 -0
  154. package/dist/extensions/pi-web-agent/src/readers/youtube-reader.ts +79 -0
  155. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  156. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +32 -5
  157. package/dist/extensions/pi-web-agent/src/search/exa.ts +109 -0
  158. package/dist/extensions/pi-web-agent/src/search/fanout.ts +154 -0
  159. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  160. package/dist/extensions/pi-web-agent/src/search/tavily.ts +113 -0
  161. package/dist/extensions/pi-web-agent/src/search/youcom.ts +109 -0
  162. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  163. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  164. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  165. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +22 -9
  166. package/dist/extensions/pi-web-agent/src/types.ts +19 -4
  167. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +7 -1
  168. package/dist/extensions/ponytail/package.json +8 -8
  169. package/dist/extensions/question/constants.ts +30 -30
  170. package/dist/extensions/question/helpers.ts +58 -58
  171. package/dist/extensions/question/navigation.ts +14 -14
  172. package/dist/extensions/question/package.json +19 -19
  173. package/dist/extensions/question/selection-mode.ts +46 -46
  174. package/dist/extensions/question/shortcuts.ts +44 -44
  175. package/dist/extensions/question/types.ts +132 -132
  176. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  177. package/dist/extensions/test-resolve-hook.mjs +6 -6
  178. package/dist/extensions/web-agent-onboarding.ts +222 -222
  179. package/dist/package-manager-cli.js +71 -71
  180. package/dist/rpc-entry.js +0 -0
  181. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  182. package/docs/compaction.md +396 -396
  183. package/docs/containerization.md +111 -111
  184. package/docs/development.md +71 -71
  185. package/docs/docs.json +164 -164
  186. package/docs/environment-variables.md +86 -86
  187. package/docs/index.md +83 -83
  188. package/docs/json.md +82 -82
  189. package/docs/models.md +502 -502
  190. package/docs/packages.md +227 -227
  191. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  192. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  193. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  194. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  195. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  196. package/docs/prompt-templates.md +95 -95
  197. package/docs/providers.md +293 -293
  198. package/docs/security.md +59 -59
  199. package/docs/session-format.md +414 -414
  200. package/docs/sessions.md +145 -145
  201. package/docs/shared-host-extensions.md +109 -109
  202. package/docs/shell-aliases.md +13 -13
  203. package/docs/skills.md +231 -231
  204. package/docs/terminal-setup.md +142 -142
  205. package/docs/termux.md +127 -127
  206. package/docs/themes.md +295 -295
  207. package/docs/tmux.md +63 -63
  208. package/docs/tui.md +927 -927
  209. package/docs/windows.md +17 -17
  210. package/examples/README.md +25 -25
  211. package/examples/extensions/README.md +211 -211
  212. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  213. package/examples/extensions/bash-spawn-hook.ts +30 -30
  214. package/examples/extensions/bookmark.ts +50 -50
  215. package/examples/extensions/border-status-editor.ts +150 -150
  216. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  217. package/examples/extensions/claude-rules.ts +86 -86
  218. package/examples/extensions/commands.ts +72 -72
  219. package/examples/extensions/confirm-destructive.ts +59 -59
  220. package/examples/extensions/custom-compaction.ts +130 -130
  221. package/examples/extensions/custom-footer.ts +64 -64
  222. package/examples/extensions/custom-header.ts +73 -73
  223. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  224. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  225. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  226. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  227. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  228. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  229. package/examples/extensions/dirty-repo-guard.ts +56 -56
  230. package/examples/extensions/doom-overlay/README.md +46 -46
  231. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  232. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  233. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  234. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  235. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  236. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  237. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  238. package/examples/extensions/doom-overlay/index.ts +74 -74
  239. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  240. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  241. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  242. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  243. package/examples/extensions/dynamic-resources/index.ts +15 -15
  244. package/examples/extensions/dynamic-tools.ts +74 -74
  245. package/examples/extensions/event-bus.ts +43 -43
  246. package/examples/extensions/file-trigger.ts +41 -41
  247. package/examples/extensions/git-checkpoint.ts +53 -53
  248. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  249. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  250. package/examples/extensions/gondolin/index.ts +531 -531
  251. package/examples/extensions/gondolin/package-lock.json +185 -185
  252. package/examples/extensions/gondolin/package.json +19 -19
  253. package/examples/extensions/handoff.ts +199 -199
  254. package/examples/extensions/hello.ts +26 -26
  255. package/examples/extensions/hidden-thinking-label.ts +53 -53
  256. package/examples/extensions/inline-bash.ts +94 -94
  257. package/examples/extensions/input-transform-streaming.ts +39 -39
  258. package/examples/extensions/input-transform.ts +43 -43
  259. package/examples/extensions/interactive-shell.ts +196 -196
  260. package/examples/extensions/mac-system-theme.ts +47 -47
  261. package/examples/extensions/message-renderer.ts +59 -59
  262. package/examples/extensions/minimal-mode.ts +426 -426
  263. package/examples/extensions/modal-editor.ts +85 -85
  264. package/examples/extensions/model-status.ts +31 -31
  265. package/examples/extensions/notify.ts +55 -55
  266. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  267. package/examples/extensions/overlay-test.ts +153 -153
  268. package/examples/extensions/permission-gate.ts +34 -34
  269. package/examples/extensions/pirate.ts +47 -47
  270. package/examples/extensions/plan-mode/README.md +66 -66
  271. package/examples/extensions/plan-mode/index.ts +390 -390
  272. package/examples/extensions/plan-mode/utils.ts +168 -168
  273. package/examples/extensions/preset.ts +436 -436
  274. package/examples/extensions/project-trust.ts +64 -64
  275. package/examples/extensions/prompt-customizer.ts +97 -97
  276. package/examples/extensions/protected-paths.ts +30 -30
  277. package/examples/extensions/provider-payload.ts +18 -18
  278. package/examples/extensions/qna.ts +122 -122
  279. package/examples/extensions/question.ts +285 -285
  280. package/examples/extensions/questionnaire.ts +448 -448
  281. package/examples/extensions/rainbow-editor.ts +88 -88
  282. package/examples/extensions/reload-runtime.ts +37 -37
  283. package/examples/extensions/rpc-demo.ts +118 -118
  284. package/examples/extensions/sandbox/index.ts +321 -321
  285. package/examples/extensions/sandbox/package-lock.json +92 -92
  286. package/examples/extensions/sandbox/package.json +19 -19
  287. package/examples/extensions/send-user-message.ts +97 -97
  288. package/examples/extensions/session-name.ts +27 -27
  289. package/examples/extensions/shutdown-command.ts +63 -63
  290. package/examples/extensions/snake.ts +343 -343
  291. package/examples/extensions/space-invaders.ts +560 -560
  292. package/examples/extensions/ssh.ts +220 -220
  293. package/examples/extensions/status-line.ts +32 -32
  294. package/examples/extensions/structured-output.ts +65 -65
  295. package/examples/extensions/subagent/README.md +175 -175
  296. package/examples/extensions/subagent/agents/planner.md +37 -37
  297. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  298. package/examples/extensions/subagent/agents/scout.md +50 -50
  299. package/examples/extensions/subagent/agents/worker.md +24 -24
  300. package/examples/extensions/subagent/agents.ts +126 -126
  301. package/examples/extensions/subagent/index.ts +1015 -1015
  302. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  303. package/examples/extensions/subagent/prompts/implement.md +10 -10
  304. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  305. package/examples/extensions/summarize.ts +209 -209
  306. package/examples/extensions/system-prompt-header.ts +17 -17
  307. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  308. package/examples/extensions/timed-confirm.ts +70 -70
  309. package/examples/extensions/titlebar-spinner.ts +58 -58
  310. package/examples/extensions/todo.ts +297 -297
  311. package/examples/extensions/tool-override.ts +144 -144
  312. package/examples/extensions/tools.ts +146 -146
  313. package/examples/extensions/trigger-compact.ts +50 -50
  314. package/examples/extensions/truncated-tool.ts +195 -195
  315. package/examples/extensions/widget-placement.ts +9 -9
  316. package/examples/extensions/with-deps/index.ts +32 -32
  317. package/examples/extensions/with-deps/package-lock.json +31 -31
  318. package/examples/extensions/with-deps/package.json +22 -22
  319. package/examples/extensions/working-indicator.ts +123 -123
  320. package/examples/extensions/working-message-test.ts +25 -25
  321. package/examples/rpc-extension-ui.ts +632 -632
  322. package/examples/sdk/01-minimal.ts +26 -26
  323. package/examples/sdk/02-custom-model.ts +53 -53
  324. package/examples/sdk/03-custom-prompt.ts +75 -75
  325. package/examples/sdk/04-skills.ts +55 -55
  326. package/examples/sdk/05-tools.ts +48 -48
  327. package/examples/sdk/06-extensions.ts +99 -99
  328. package/examples/sdk/07-context-files.ts +47 -47
  329. package/examples/sdk/08-prompt-templates.ts +51 -51
  330. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  331. package/examples/sdk/10-settings.ts +53 -53
  332. package/examples/sdk/11-sessions.ts +52 -52
  333. package/examples/sdk/12-full-control.ts +79 -79
  334. package/examples/sdk/13-session-runtime.ts +67 -67
  335. package/examples/sdk/README.md +144 -144
  336. package/package.json +3 -2
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  377. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  378. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  379. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  380. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  381. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  382. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  383. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  384. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  385. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  386. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  387. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  388. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  389. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  390. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  391. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  392. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  393. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  394. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  395. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  396. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  397. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  398. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  399. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  400. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  401. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  402. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  403. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  404. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  405. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  406. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  407. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  408. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  409. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  410. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  411. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  412. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  413. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  414. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  415. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  416. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  417. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  418. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  419. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  420. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  421. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  422. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +0 -3
  423. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  424. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  425. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  426. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  427. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  428. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  429. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  430. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  431. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  432. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  433. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  434. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  435. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  436. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  437. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  438. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  439. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  440. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  441. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  442. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  443. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  444. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  445. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  446. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  447. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  448. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  449. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  450. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  451. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  452. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  453. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  454. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  455. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  456. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  457. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  458. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  459. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  460. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  461. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  462. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  463. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  464. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  465. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  466. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  467. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  468. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  469. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  470. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  471. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  472. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  473. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  474. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  475. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  476. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  477. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  478. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  479. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  480. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  481. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  482. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  483. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  484. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  485. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  486. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  487. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  488. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  489. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  490. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  491. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  492. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  493. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  494. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  495. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  496. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  497. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  498. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  499. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  500. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  501. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  502. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  503. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  504. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  505. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  506. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  507. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  508. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  509. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  510. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  511. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
@@ -24,7 +24,6 @@ export function getIntercomScopeId(env: NodeJS.ProcessEnv = process.env): string
24
24
  }
25
25
 
26
26
  export type InboundTriggerPolicy = "always" | "replies" | "never";
27
- export type IntercomToolVisibility = "always" | "after-first-use";
28
27
 
29
28
  export interface IntercomConfig {
30
29
  /** Broker command used to spawn the broker process (e.g. "npx" or "bun") */
@@ -39,9 +38,6 @@ export interface IntercomConfig {
39
38
  /** Controls whether inbound broker messages may automatically trigger a model turn */
40
39
  inboundTrigger: InboundTriggerPolicy;
41
40
 
42
- /** Controls when the intercom tool enters the active model tool set */
43
- toolVisibility: IntercomToolVisibility;
44
-
45
41
  /** Optional custom status suffix shown after automatic lifecycle status */
46
42
  status?: string;
47
43
 
@@ -64,7 +60,6 @@ const defaults: IntercomConfig = {
64
60
  brokerArgs: ["--no-install", "tsx"],
65
61
  confirmSend: false,
66
62
  inboundTrigger: "always",
67
- toolVisibility: "always",
68
63
  enabled: true,
69
64
  replyHint: true,
70
65
  };
@@ -135,16 +130,6 @@ export function loadConfig(): IntercomConfig {
135
130
  config.inboundTrigger = parsedConfig.inboundTrigger;
136
131
  }
137
132
 
138
- if (Object.hasOwn(parsedConfig, "toolVisibility")) {
139
- if (
140
- parsedConfig.toolVisibility !== "always"
141
- && parsedConfig.toolVisibility !== "after-first-use"
142
- ) {
143
- throw new Error(`"toolVisibility" must be "always" or "after-first-use"`);
144
- }
145
- config.toolVisibility = parsedConfig.toolVisibility;
146
- }
147
-
148
133
  if (Object.hasOwn(parsedConfig, "replyHint")) {
149
134
  if (typeof parsedConfig.replyHint !== "boolean") {
150
135
  throw new Error(`"replyHint" must be a boolean`);
@@ -1,40 +1,40 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { mkdtempSync, rmSync, symlinkSync, mkdirSync, realpathSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { normalizeCwd, sameCwd } from "./cwd.ts";
7
-
8
- test("sameCwd collapses a trailing slash", () => {
9
- assert.equal(sameCwd("/usr/local", "/usr/local/"), true);
10
- });
11
-
12
- test("sameCwd collapses lexical '.' and '..' segments", () => {
13
- assert.equal(sameCwd("/usr/local/../local/./bin", "/usr/local/bin"), true);
14
- });
15
-
16
- test("sameCwd treats genuinely different directories as different", () => {
17
- assert.equal(sameCwd("/usr/local", "/usr/lib"), false);
18
- });
19
-
20
- test("sameCwd collapses a symlink to its real target", () => {
21
- const base = mkdtempSync(join(tmpdir(), "cwd-symlink-"));
22
- try {
23
- const real = join(base, "real");
24
- const link = join(base, "link");
25
- mkdirSync(real);
26
- symlinkSync(real, link);
27
- // Reached via the symlink vs its canonical path — must compare equal.
28
- assert.equal(sameCwd(link, real), true);
29
- // And normalizeCwd resolves the link to the real path.
30
- assert.equal(normalizeCwd(link), realpathSync(real));
31
- } finally {
32
- rmSync(base, { recursive: true, force: true });
33
- }
34
- });
35
-
36
- test("normalizeCwd falls back to the resolved path for a nonexistent dir", () => {
37
- // realpathSync throws for a missing dir; normalizeCwd must still collapse the
38
- // lexical variants rather than throw.
39
- assert.equal(normalizeCwd("/no/such/dir/../dir"), "/no/such/dir");
40
- });
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync, symlinkSync, mkdirSync, realpathSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { normalizeCwd, sameCwd } from "./cwd.ts";
7
+
8
+ test("sameCwd collapses a trailing slash", () => {
9
+ assert.equal(sameCwd("/usr/local", "/usr/local/"), true);
10
+ });
11
+
12
+ test("sameCwd collapses lexical '.' and '..' segments", () => {
13
+ assert.equal(sameCwd("/usr/local/../local/./bin", "/usr/local/bin"), true);
14
+ });
15
+
16
+ test("sameCwd treats genuinely different directories as different", () => {
17
+ assert.equal(sameCwd("/usr/local", "/usr/lib"), false);
18
+ });
19
+
20
+ test("sameCwd collapses a symlink to its real target", () => {
21
+ const base = mkdtempSync(join(tmpdir(), "cwd-symlink-"));
22
+ try {
23
+ const real = join(base, "real");
24
+ const link = join(base, "link");
25
+ mkdirSync(real);
26
+ symlinkSync(real, link);
27
+ // Reached via the symlink vs its canonical path — must compare equal.
28
+ assert.equal(sameCwd(link, real), true);
29
+ // And normalizeCwd resolves the link to the real path.
30
+ assert.equal(normalizeCwd(link), realpathSync(real));
31
+ } finally {
32
+ rmSync(base, { recursive: true, force: true });
33
+ }
34
+ });
35
+
36
+ test("normalizeCwd falls back to the resolved path for a nonexistent dir", () => {
37
+ // realpathSync throws for a missing dir; normalizeCwd must still collapse the
38
+ // lexical variants rather than throw.
39
+ assert.equal(normalizeCwd("/no/such/dir/../dir"), "/no/such/dir");
40
+ });
@@ -1,31 +1,31 @@
1
- import { resolve } from "node:path";
2
- import { realpathSync } from "node:fs";
3
-
4
- // Normalize a cwd for same-directory comparison. A raw string match ("a === b")
5
- // hides genuine same-directory peers when two cwd strings differ only by a
6
- // trailing slash, a "."/".." segment, or a symlink (e.g. macOS /tmp <->
7
- // /private/tmp). resolve() collapses the lexical variants; realpathSync()
8
- // collapses symlinks (best-effort: falls back to the resolved path if the
9
- // directory no longer exists). Memoized — the set of distinct cwd strings is
10
- // small and stable, so repeat comparisons are free after warmup.
11
- const normalizeCache = new Map<string, string>();
12
-
13
- export function normalizeCwd(cwd: string): string {
14
- const cached = normalizeCache.get(cwd);
15
- if (cached !== undefined) {
16
- return cached;
17
- }
18
- const resolved = resolve(cwd);
19
- let normalized: string;
20
- try {
21
- normalized = realpathSync(resolved);
22
- } catch {
23
- normalized = resolved;
24
- }
25
- normalizeCache.set(cwd, normalized);
26
- return normalized;
27
- }
28
-
29
- export function sameCwd(a: string, b: string): boolean {
30
- return normalizeCwd(a) === normalizeCwd(b);
31
- }
1
+ import { resolve } from "node:path";
2
+ import { realpathSync } from "node:fs";
3
+
4
+ // Normalize a cwd for same-directory comparison. A raw string match ("a === b")
5
+ // hides genuine same-directory peers when two cwd strings differ only by a
6
+ // trailing slash, a "."/".." segment, or a symlink (e.g. macOS /tmp <->
7
+ // /private/tmp). resolve() collapses the lexical variants; realpathSync()
8
+ // collapses symlinks (best-effort: falls back to the resolved path if the
9
+ // directory no longer exists). Memoized — the set of distinct cwd strings is
10
+ // small and stable, so repeat comparisons are free after warmup.
11
+ const normalizeCache = new Map<string, string>();
12
+
13
+ export function normalizeCwd(cwd: string): string {
14
+ const cached = normalizeCache.get(cwd);
15
+ if (cached !== undefined) {
16
+ return cached;
17
+ }
18
+ const resolved = resolve(cwd);
19
+ let normalized: string;
20
+ try {
21
+ normalized = realpathSync(resolved);
22
+ } catch {
23
+ normalized = resolved;
24
+ }
25
+ normalizeCache.set(cwd, normalized);
26
+ return normalized;
27
+ }
28
+
29
+ export function sameCwd(a: string, b: string): boolean {
30
+ return normalizeCwd(a) === normalizeCwd(b);
31
+ }
@@ -1,31 +1,31 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
- import { formatTokenCount, formatContextUsage } from "./format-context.ts";
4
- import type { SessionInfo } from "./types.ts";
5
-
6
- const base: SessionInfo = { id: "s1", cwd: "/w", model: "m", pid: 1, startedAt: 0, lastActivity: 0 };
7
-
8
- test("formatTokenCount compacts thousands", () => {
9
- assert.equal(formatTokenCount(0), "0");
10
- assert.equal(formatTokenCount(999), "999");
11
- assert.equal(formatTokenCount(1432), "1.4k");
12
- assert.equal(formatTokenCount(144000), "144k");
13
- assert.equal(formatTokenCount(200000), "200k");
14
- });
15
-
16
- test("formatContextUsage renders percent + token detail when all known", () => {
17
- assert.equal(
18
- formatContextUsage({ ...base, contextPct: 72, contextTokens: 144000, contextWindow: 200000 }),
19
- " · 72% ctx (144k/200k)",
20
- );
21
- });
22
-
23
- test("formatContextUsage shows percent only when token counts are absent", () => {
24
- assert.equal(formatContextUsage({ ...base, contextPct: 30 }), " · 30% ctx");
25
- });
26
-
27
- test("formatContextUsage renders nothing when percent is unknown (never a stale %)", () => {
28
- assert.equal(formatContextUsage(base), "");
29
- // Tokens present but no percent (e.g. right after a compaction) still renders nothing.
30
- assert.equal(formatContextUsage({ ...base, contextTokens: 100, contextWindow: 200 }), "");
31
- });
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { formatTokenCount, formatContextUsage } from "./format-context.ts";
4
+ import type { SessionInfo } from "./types.ts";
5
+
6
+ const base: SessionInfo = { id: "s1", cwd: "/w", model: "m", pid: 1, startedAt: 0, lastActivity: 0 };
7
+
8
+ test("formatTokenCount compacts thousands", () => {
9
+ assert.equal(formatTokenCount(0), "0");
10
+ assert.equal(formatTokenCount(999), "999");
11
+ assert.equal(formatTokenCount(1432), "1.4k");
12
+ assert.equal(formatTokenCount(144000), "144k");
13
+ assert.equal(formatTokenCount(200000), "200k");
14
+ });
15
+
16
+ test("formatContextUsage renders percent + token detail when all known", () => {
17
+ assert.equal(
18
+ formatContextUsage({ ...base, contextPct: 72, contextTokens: 144000, contextWindow: 200000 }),
19
+ " · 72% ctx (144k/200k)",
20
+ );
21
+ });
22
+
23
+ test("formatContextUsage shows percent only when token counts are absent", () => {
24
+ assert.equal(formatContextUsage({ ...base, contextPct: 30 }), " · 30% ctx");
25
+ });
26
+
27
+ test("formatContextUsage renders nothing when percent is unknown (never a stale %)", () => {
28
+ assert.equal(formatContextUsage(base), "");
29
+ // Tokens present but no percent (e.g. right after a compaction) still renders nothing.
30
+ assert.equal(formatContextUsage({ ...base, contextTokens: 100, contextWindow: 200 }), "");
31
+ });
@@ -1,32 +1,32 @@
1
- import type { SessionInfo } from "./types.ts";
2
-
3
- // Compact token count for display: 1432 -> "1.4k", 144000 -> "144k". Keeps list
4
- // rows short while staying legible.
5
- export function formatTokenCount(tokens: number): string {
6
- if (tokens < 1000) {
7
- return String(Math.max(0, Math.round(tokens)));
8
- }
9
- const k = tokens / 1000;
10
- const value = k >= 100 ? String(Math.round(k)) : k.toFixed(1).replace(/\.0$/, "");
11
- return `${value}k`;
12
- }
13
-
14
- // Render a session's context-window usage to sit beside its model, e.g.
15
- // " · 72% ctx (144k/200k)". The token detail is appended only when both counts
16
- // are known. Unknown percent (e.g. right after a compaction, before the next
17
- // assistant response) renders nothing, so a frozen value is never shown as a
18
- // stale percentage.
19
- export function formatContextUsage(session: SessionInfo): string {
20
- if (typeof session.contextPct !== "number") {
21
- return "";
22
- }
23
- let out = ` · ${session.contextPct}% ctx`;
24
- if (
25
- typeof session.contextTokens === "number"
26
- && typeof session.contextWindow === "number"
27
- && session.contextWindow > 0
28
- ) {
29
- out += ` (${formatTokenCount(session.contextTokens)}/${formatTokenCount(session.contextWindow)})`;
30
- }
31
- return out;
32
- }
1
+ import type { SessionInfo } from "./types.ts";
2
+
3
+ // Compact token count for display: 1432 -> "1.4k", 144000 -> "144k". Keeps list
4
+ // rows short while staying legible.
5
+ export function formatTokenCount(tokens: number): string {
6
+ if (tokens < 1000) {
7
+ return String(Math.max(0, Math.round(tokens)));
8
+ }
9
+ const k = tokens / 1000;
10
+ const value = k >= 100 ? String(Math.round(k)) : k.toFixed(1).replace(/\.0$/, "");
11
+ return `${value}k`;
12
+ }
13
+
14
+ // Render a session's context-window usage to sit beside its model, e.g.
15
+ // " · 72% ctx (144k/200k)". The token detail is appended only when both counts
16
+ // are known. Unknown percent (e.g. right after a compaction, before the next
17
+ // assistant response) renders nothing, so a frozen value is never shown as a
18
+ // stale percentage.
19
+ export function formatContextUsage(session: SessionInfo): string {
20
+ if (typeof session.contextPct !== "number") {
21
+ return "";
22
+ }
23
+ let out = ` · ${session.contextPct}% ctx`;
24
+ if (
25
+ typeof session.contextTokens === "number"
26
+ && typeof session.contextWindow === "number"
27
+ && session.contextWindow > 0
28
+ ) {
29
+ out += ` (${formatTokenCount(session.contextTokens)}/${formatTokenCount(session.contextWindow)})`;
30
+ }
31
+ return out;
32
+ }
@@ -27,15 +27,12 @@ import {
27
27
  type IntercomOutboxResultV1,
28
28
  } from "./extension-api.ts";
29
29
  import { ReplyTracker } from "./reply-tracker.ts";
30
- import { realpathSync } from "node:fs";
31
30
  import { resolve as resolvePath } from "node:path";
32
- import { fileURLToPath } from "node:url";
33
31
  import { sameCwd } from "./cwd.ts";
34
32
  import { formatContextUsage } from "./format-context.ts";
35
33
  import { openProjectPane, resolveTargetInCwd, waitForProjectSession, type ProjectPaneLaunch } from "./project-agent.ts";
36
34
 
37
35
  const INTERCOM_TOOL_NAME = "intercom";
38
- const INTERCOM_SKILL_PATH = realpathSync(fileURLToPath(new URL("./skills/pi-intercom/SKILL.md", import.meta.url)));
39
36
  const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
40
37
  const SUBAGENT_RESULT_INTERCOM_EVENT = "subagent:result-intercom";
41
38
  const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = "subagent:result-intercom-delivery";
@@ -116,18 +113,6 @@ function getErrorMessage(error: unknown): string {
116
113
  return error instanceof Error ? error.message : String(error);
117
114
  }
118
115
 
119
- function isIntercomSkillRead(input: unknown, cwd: string): boolean {
120
- if (!input || typeof input !== "object") return false;
121
- const inputPath = Reflect.get(input, "path");
122
- if (typeof inputPath !== "string") return false;
123
- const normalizedPath = inputPath.startsWith("@") ? inputPath.slice(1) : inputPath;
124
- try {
125
- return realpathSync(resolvePath(cwd, normalizedPath)) === INTERCOM_SKILL_PATH;
126
- } catch {
127
- return false;
128
- }
129
- }
130
-
131
116
  function deliveryDetails(result: SendResult): Record<string, unknown> {
132
117
  return {
133
118
  messageId: result.id,
@@ -622,23 +607,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
622
607
  let runtimeGeneration = 0;
623
608
  let agentRunning = false;
624
609
  const activeTools = new Map<string, string>();
625
- let intercomToolHiddenByPolicy = false;
626
610
  const replyTracker = new ReplyTracker();
627
- function hideIntercomTool(): void {
628
- if (config.toolVisibility !== "after-first-use") return;
629
- const activeToolNames = pi.getActiveTools();
630
- if (!activeToolNames.includes(INTERCOM_TOOL_NAME)) return;
631
- pi.setActiveTools(activeToolNames.filter((name) => name !== INTERCOM_TOOL_NAME));
632
- intercomToolHiddenByPolicy = true;
633
- }
634
- function activateIntercomTool(): void {
635
- if (!intercomToolHiddenByPolicy) return;
636
- const activeToolNames = pi.getActiveTools();
637
- if (!activeToolNames.includes(INTERCOM_TOOL_NAME)) {
638
- pi.setActiveTools([...activeToolNames, INTERCOM_TOOL_NAME]);
639
- }
640
- intercomToolHiddenByPolicy = false;
641
- }
642
611
 
643
612
  const seenInboundMessages = new Map<string, number>();
644
613
  const latestOutboundReceipts = new Map<string, { status: MessageReceiptStatus; timestamp: number; detail?: string }>();
@@ -1221,7 +1190,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1221
1190
  );
1222
1191
  }
1223
1192
  function sendIncomingBrokerMessage(entry: InboundMessageEntry, delivery: "trigger" | "steer", generation = runtimeGeneration): void {
1224
- activateIntercomTool();
1225
1193
  sendIncomingMessage(entry, delivery, generation);
1226
1194
  }
1227
1195
  function handleIncomingMessage(ctx: ExtensionContext, from: SessionInfo, message: Message): void {
@@ -1572,7 +1540,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1572
1540
  });
1573
1541
  }
1574
1542
  function startSessionRuntime(ctx: ExtensionContext): void {
1575
- hideIntercomTool();
1576
1543
  const previousClient = client;
1577
1544
  failPendingOutboxRequests(runtimeGeneration, "session_ended", "Session replaced");
1578
1545
  shuttingDown = false;
@@ -1819,17 +1786,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1819
1786
  return new InlineMessageComponent(details.from, details.message, theme, details.replyCommand, details.bodyText, !options.expanded);
1820
1787
  });
1821
1788
 
1822
- pi.on("input", (event) => {
1823
- if (/^\/skill: pi-intercom(?:\s|$)/u.test(event.text.trimStart())) {
1824
- activateIntercomTool();
1825
- }
1826
- });
1827
-
1828
- pi.on("tool_result", (event, ctx) => {
1829
- if (event.toolName === "read" && event.isError !== true && isIntercomSkillRead(event.input, ctx.cwd)) {
1830
- activateIntercomTool();
1831
- return;
1832
- }
1789
+ pi.on("tool_result", (event) => {
1833
1790
  if (event.toolName !== "intercom" && event.toolName !== "contact_supervisor") {
1834
1791
  return;
1835
1792
  }
@@ -2181,7 +2138,6 @@ Usage:
2181
2138
  }),
2182
2139
 
2183
2140
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
2184
- activateIntercomTool();
2185
2141
  let connectedClient: IntercomClient;
2186
2142
  try {
2187
2143
  connectedClient = await ensureConnected("tool");
@@ -2350,6 +2306,14 @@ Usage:
2350
2306
  details: { error: true },
2351
2307
  };
2352
2308
  }
2309
+ const activeReplyMismatch = replyTo ? null : replyTracker.findActiveReplyTargetMismatch(sendTo);
2310
+ if (activeReplyMismatch) {
2311
+ const senderLabel = activeReplyMismatch.from.name || activeReplyMismatch.from.id;
2312
+ return {
2313
+ content: [{ type: "text", text: `This turn is responding to an intercom ask from "${senderLabel}". Use intercom({ action: "reply", message: "..." }) or set replyTo: "${activeReplyMismatch.message.id}". Refusing non-reply send to "${targetDisplay}" to avoid a misdirected reply.` }],
2314
+ details: { error: true, replyTo: activeReplyMismatch.message.id },
2315
+ };
2316
+ }
2353
2317
  const inferredAsk = replyTo ? null : replyTracker.findUniquePendingAskFrom(sendTo);
2354
2318
  const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
2355
2319
  if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
@@ -2761,7 +2725,6 @@ Usage:
2761
2725
  ).catch(() => undefined);
2762
2726
 
2763
2727
  if (result?.sent && result.messageId && result.text && getLiveContext(ctx, overlayGeneration)) {
2764
- activateIntercomTool();
2765
2728
  pi.appendEntry("intercom_sent", {
2766
2729
  to: selectedSession.name || selectedSession.id,
2767
2730
  message: { text: result.text },
@@ -1672,59 +1672,7 @@ test("intercom tool result hook marks failed details as errors", async () => {
1672
1672
  assert.deepEqual(okResults.filter(Boolean), []);
1673
1673
  });
1674
1674
 
1675
- test("lazy tool visibility reveals intercom on bundled skill use only", { concurrency: false }, async () => {
1676
- const { default: piIntercomExtension } = await import("./index.ts");
1677
-
1678
- await withIntercomConfig({ toolVisibility: "after-first-use" }, () => withChildOrchestratorEnv({
1679
- orchestratorTarget: "orchestrator",
1680
- runId: "78f659a3",
1681
- agent: "worker",
1682
- index: "0",
1683
- }, async () => {
1684
- const harness = createExtensionHarness("lazy-skill-worker", { activeTools: ["read", "bash"] });
1685
- piIntercomExtension(harness.pi as never);
1686
-
1687
- try {
1688
- await harness.emitLifecycle("session_start");
1689
- assert.deepEqual(harness.getActiveTools(), ["read", "bash", "contact_supervisor"]);
1690
-
1691
- harness.pi.events.emit("subagent:control-intercom", {
1692
- to: "session-child-test",
1693
- message: "Local relay traffic should not reveal the generic tool.",
1694
- });
1695
- assert.equal(harness.sentMessages.at(-1)?.activeTools.includes("intercom"), false);
1696
- assert.equal(harness.getActiveTools().includes("intercom"), false);
1697
-
1698
- await harness.emitLifecycle("tool_result", {
1699
- toolName: "read",
1700
- input: { path: path.join(repoDir, "README.md") },
1701
- isError: false,
1702
- });
1703
- await harness.emitLifecycle("tool_result", {
1704
- toolName: "read",
1705
- input: { path: path.join(repoDir, "skills", "pi-intercom", "SKILL.md") },
1706
- isError: true,
1707
- });
1708
- assert.equal(harness.getActiveTools().includes("intercom"), false);
1709
-
1710
- await harness.emitLifecycle("tool_result", {
1711
- toolName: "read",
1712
- input: { path: path.join(repoDir, "skills", "pi-intercom", "SKILL.md") },
1713
- isError: false,
1714
- });
1715
- assert.deepEqual(harness.getActiveTools(), ["read", "bash", "contact_supervisor", "intercom"]);
1716
-
1717
- await harness.emitLifecycle("session_start");
1718
- assert.equal(harness.getActiveTools().includes("intercom"), false);
1719
- await harness.emitLifecycle("input", { text: " /skill: pi-intercom", source: "user" });
1720
- assert.equal(harness.getActiveTools().includes("intercom"), true);
1721
- } finally {
1722
- await harness.emitLifecycle("session_shutdown");
1723
- }
1724
- }));
1725
- });
1726
-
1727
- test("lazy tool visibility reveals intercom before broker injection and after an overlay send", { concurrency: false }, async () => {
1675
+ test("obsolete toolVisibility config never hides or reveals the intercom tool", { concurrency: false }, async () => {
1728
1676
  const { default: piIntercomExtension } = await import("./index.ts");
1729
1677
 
1730
1678
  await withIntercomConfig({ toolVisibility: "after-first-use" }, async () => {
@@ -1754,14 +1702,14 @@ test("lazy tool visibility reveals intercom before broker injection and after an
1754
1702
  piIntercomExtension(inboundHarness.pi as never);
1755
1703
  await overlayHarness.emitLifecycle("session_start");
1756
1704
  await inboundHarness.emitLifecycle("session_start");
1757
- assert.equal(overlayHarness.getActiveTools().includes("intercom"), false);
1758
- assert.equal(inboundHarness.getActiveTools().includes("intercom"), false);
1705
+ assert.equal(overlayHarness.getActiveTools().includes("intercom"), true);
1706
+ assert.equal(inboundHarness.getActiveTools().includes("intercom"), true);
1759
1707
 
1760
1708
  selectedSession = await waitForSessionByName(planner, "planner");
1761
1709
  const inboundSession = await waitForSessionByName(planner, "lazy-inbound-worker");
1762
1710
  const delivered = await planner.send(inboundSession.id, {
1763
- messageId: "lazy-inbound-message",
1764
- text: "Reveal intercom before injecting this message.",
1711
+ messageId: "stable-inbound-message",
1712
+ text: "Keep intercom active before injecting this message.",
1765
1713
  });
1766
1714
  assert.equal(delivered.delivered, true);
1767
1715
  const deadline = Date.now() + 1000;
@@ -1770,6 +1718,13 @@ test("lazy tool visibility reveals intercom before broker injection and after an
1770
1718
  }
1771
1719
  assert.equal(inboundHarness.sentMessages[0]?.activeTools.includes("intercom"), true);
1772
1720
 
1721
+ await inboundHarness.emitLifecycle("tool_result", {
1722
+ toolName: "read",
1723
+ input: { path: path.join(repoDir, "skills", "pi-intercom", "SKILL.md") },
1724
+ isError: false,
1725
+ });
1726
+ assert.equal(inboundHarness.getActiveTools().includes("intercom"), true);
1727
+
1773
1728
  await overlayHarness.commands.get("intercom")!("", overlayHarness.ctx);
1774
1729
  assert.equal(overlayStep, 2);
1775
1730
  assert.equal(overlayHarness.getActiveTools().includes("intercom"), true);
@@ -3148,6 +3103,43 @@ test("intercom reply sends attachments", { concurrency: false }, async () => {
3148
3103
  }
3149
3104
  });
3150
3105
 
3106
+ test("intercom send refuses a different target during an active inbound ask turn", { concurrency: false }, async () => {
3107
+ const { planner, orchestrator, cleanup } = await setupClients();
3108
+ const { default: piIntercomExtension } = await import("./index.ts");
3109
+ const harness = createExtensionHarness("cwd-reply-worker");
3110
+
3111
+ try {
3112
+ piIntercomExtension(harness.pi as never);
3113
+ await harness.emitLifecycle("session_start");
3114
+ const worker = await waitForSessionByName(planner, "cwd-reply-worker");
3115
+
3116
+ assert.equal((await planner.send(worker.id, {
3117
+ messageId: "cwd-hierarchy-ask",
3118
+ text: "Please answer me, not the repo-root session.",
3119
+ expectsReply: true,
3120
+ })).delivered, true);
3121
+ const deadline = Date.now() + 1000;
3122
+ while (harness.sentMessages.length === 0 && Date.now() < deadline) {
3123
+ await new Promise((resolve) => setTimeout(resolve, 20));
3124
+ }
3125
+ await harness.emitLifecycle("turn_start");
3126
+
3127
+ const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
3128
+ const result = await intercomTool.execute("misdirected-send", {
3129
+ action: "send",
3130
+ to: "orchestrator",
3131
+ message: "This was meant as the ask answer.",
3132
+ }, new AbortController().signal, undefined, harness.ctx);
3133
+
3134
+ assert.equal(result.details?.error, true);
3135
+ assert.equal(result.details?.replyTo, "cwd-hierarchy-ask");
3136
+ assert.match(result.content[0]?.text ?? "", /Refusing non-reply send to "orchestrator"/);
3137
+ } finally {
3138
+ await harness.emitLifecycle("session_shutdown");
3139
+ await cleanup();
3140
+ }
3141
+ });
3142
+
3151
3143
  test("intercom reply targets one of multiple pending asks by short session ID", { concurrency: false }, async () => {
3152
3144
  const { planner, orchestrator, cleanup } = await setupClients();
3153
3145
  const { default: piIntercomExtension } = await import("./index.ts");
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-intercom",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -93,6 +93,26 @@ test("explicit to overrides the current turn context", () => {
93
93
  assert.throws(() => tracker.resolveReplyTarget({ to: "missing" }, 1003), /No pending ask from/);
94
94
  });
95
95
 
96
+ test("active ask context flags non-reply sends to a different target", () => {
97
+ const tracker = new ReplyTracker();
98
+ const current = tracker.recordIncomingMessage(createSession("planner-id", "planner"), createMessage("ask-1", "Need a reply"), 1000);
99
+ tracker.queueTurnContext(current);
100
+ tracker.beginTurn(1001);
101
+
102
+ assert.equal(tracker.findActiveReplyTargetMismatch("planner-id", 1002), null);
103
+ assert.equal(tracker.findActiveReplyTargetMismatch("planner", 1002)?.message.id, "ask-1");
104
+ assert.equal(tracker.findActiveReplyTargetMismatch("repo-root", 1002)?.message.id, "ask-1");
105
+ });
106
+
107
+ test("active ask context does not trust sender names as destination identity", () => {
108
+ const tracker = new ReplyTracker();
109
+ const current = tracker.recordIncomingMessage(createSession("asker-session", "root-session"), createMessage("ask-1", "Need a reply"), 1000);
110
+ tracker.queueTurnContext(current);
111
+ tracker.beginTurn(1001);
112
+
113
+ assert.equal(tracker.findActiveReplyTargetMismatch("root-session", 1002)?.message.id, "ask-1");
114
+ });
115
+
96
116
  test("replyTo resolves the exact pending ask", () => {
97
117
  const tracker = new ReplyTracker();
98
118
  tracker.recordIncomingMessage(createSession("planner-id", "planner"), createMessage("ask-1", "First"), 1000);
@@ -121,6 +121,14 @@ export class ReplyTracker {
121
121
  return candidates.length === 1 ? candidates[0]! : null;
122
122
  }
123
123
 
124
+ findActiveReplyTargetMismatch(to: string, now = Date.now()): IntercomContext | null {
125
+ this.pruneExpired(now);
126
+ if (!this.currentTurnContext?.message.expectsReply) {
127
+ return null;
128
+ }
129
+ return this.currentTurnContext.from.id === to ? null : this.currentTurnContext;
130
+ }
131
+
124
132
  markReplied(replyTo: string): void {
125
133
  this.dismissPendingAsk(replyTo);
126
134
  }