@oh-my-pi/pi-coding-agent 17.0.9 → 17.1.0

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 (285) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +1 -1
  3. package/dist/cli.js +4659 -4261
  4. package/dist/types/async/job-manager.d.ts +37 -1
  5. package/dist/types/cli/args.d.ts +2 -0
  6. package/dist/types/cli/bench-cli.d.ts +41 -0
  7. package/dist/types/commands/bench.d.ts +15 -3
  8. package/dist/types/commands/launch.d.ts +4 -0
  9. package/dist/types/config/model-registry.d.ts +3 -1
  10. package/dist/types/config/models-config-schema.d.ts +18 -6
  11. package/dist/types/config/models-config.d.ts +14 -5
  12. package/dist/types/config/provider-globals.d.ts +2 -2
  13. package/dist/types/config/service-tier.d.ts +5 -1
  14. package/dist/types/config/settings-schema.d.ts +316 -47
  15. package/dist/types/config/settings.d.ts +7 -0
  16. package/dist/types/dap/client.d.ts +20 -0
  17. package/dist/types/exec/bash-executor.d.ts +38 -0
  18. package/dist/types/exec/direnv.d.ts +33 -0
  19. package/dist/types/export/html/args.d.ts +15 -0
  20. package/dist/types/export/html/index.d.ts +11 -26
  21. package/dist/types/export/html/web-palette.d.ts +55 -116
  22. package/dist/types/extensibility/extensions/loader.d.ts +3 -0
  23. package/dist/types/extensibility/extensions/types.d.ts +17 -2
  24. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +13 -0
  25. package/dist/types/live/controller.d.ts +40 -0
  26. package/dist/types/live/protocol.d.ts +85 -0
  27. package/dist/types/live/protocol.test.d.ts +1 -0
  28. package/dist/types/live/transport.d.ts +48 -0
  29. package/dist/types/live/visualizer.d.ts +33 -0
  30. package/dist/types/lsp/client.d.ts +16 -1
  31. package/dist/types/mcp/config-writer.test.d.ts +1 -0
  32. package/dist/types/mcp/oauth-discovery.d.ts +2 -0
  33. package/dist/types/mcp/smithery-auth.d.ts +1 -1
  34. package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
  35. package/dist/types/memory-backend/tool-names.d.ts +2 -0
  36. package/dist/types/modes/components/login-dialog.d.ts +2 -2
  37. package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
  38. package/dist/types/modes/components/settings-defs.d.ts +7 -1
  39. package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
  40. package/dist/types/modes/components/tool-execution.d.ts +9 -1
  41. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  42. package/dist/types/modes/controllers/event-controller.d.ts +6 -1
  43. package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
  44. package/dist/types/modes/interactive-mode.d.ts +5 -0
  45. package/dist/types/modes/theme/theme.d.ts +1 -1
  46. package/dist/types/modes/types.d.ts +3 -1
  47. package/dist/types/modes/utils/context-usage.d.ts +12 -2
  48. package/dist/types/plan-mode/plan-files.d.ts +10 -0
  49. package/dist/types/registry/agent-lifecycle.d.ts +21 -9
  50. package/dist/types/registry/agent-registry.d.ts +11 -4
  51. package/dist/types/sdk.d.ts +15 -1
  52. package/dist/types/secrets/index.d.ts +15 -2
  53. package/dist/types/secrets/obfuscator.d.ts +113 -15
  54. package/dist/types/session/acp-permission-gate.d.ts +19 -0
  55. package/dist/types/session/agent-session-events.d.ts +84 -0
  56. package/dist/types/session/agent-session-types.d.ts +314 -0
  57. package/dist/types/session/agent-session.d.ts +118 -755
  58. package/dist/types/session/async-job-delivery.d.ts +28 -0
  59. package/dist/types/session/bash-runner.d.ts +75 -0
  60. package/dist/types/session/blob-store.d.ts +11 -1
  61. package/dist/types/session/blob-store.test.d.ts +1 -0
  62. package/dist/types/session/checkpoint-entries.d.ts +28 -0
  63. package/dist/types/session/eval-runner.d.ts +49 -0
  64. package/dist/types/session/irc-bridge.d.ts +46 -0
  65. package/dist/types/session/messages.d.ts +22 -0
  66. package/dist/types/session/model-controls.d.ts +180 -0
  67. package/dist/types/session/prewalk.d.ts +46 -0
  68. package/dist/types/session/queued-messages.d.ts +22 -0
  69. package/dist/types/session/redis-session-storage.d.ts +1 -0
  70. package/dist/types/session/retry-fallback-chains.d.ts +74 -0
  71. package/dist/types/session/role-models.d.ts +15 -0
  72. package/dist/types/session/session-advisors.d.ts +228 -0
  73. package/dist/types/session/session-entries.d.ts +8 -0
  74. package/dist/types/session/session-handoff.d.ts +70 -0
  75. package/dist/types/session/session-history-format.d.ts +6 -1
  76. package/dist/types/session/session-maintenance.d.ts +246 -0
  77. package/dist/types/session/session-manager.d.ts +41 -0
  78. package/dist/types/session/session-memory.d.ts +56 -0
  79. package/dist/types/session/session-provider-boundary.d.ts +62 -0
  80. package/dist/types/session/session-stats.d.ts +48 -0
  81. package/dist/types/session/session-tools.d.ts +143 -0
  82. package/dist/types/session/session-workspace.d.ts +32 -0
  83. package/dist/types/session/stream-guards.d.ts +44 -0
  84. package/dist/types/session/todo-tracker.d.ts +56 -0
  85. package/dist/types/session/ttsr-coordinator.d.ts +51 -0
  86. package/dist/types/session/turn-recovery.d.ts +225 -0
  87. package/dist/types/system-prompt.d.ts +2 -0
  88. package/dist/types/task/executor.d.ts +4 -1
  89. package/dist/types/task/output-manager.d.ts +3 -1
  90. package/dist/types/tools/approval.d.ts +1 -0
  91. package/dist/types/tools/browser/launch.d.ts +5 -0
  92. package/dist/types/tools/image-gen.d.ts +4 -4
  93. package/dist/types/tools/image-providers.d.ts +38 -0
  94. package/dist/types/tools/index.d.ts +5 -0
  95. package/dist/types/tools/path-utils.d.ts +8 -0
  96. package/dist/types/tools/todo.d.ts +10 -4
  97. package/dist/types/tools/xdev.d.ts +5 -1
  98. package/dist/types/tts/streaming-player.d.ts +14 -0
  99. package/dist/types/tts/vocalizer.d.ts +5 -0
  100. package/dist/types/utils/jj.d.ts +29 -0
  101. package/dist/types/utils/lang-from-path.d.ts +1 -0
  102. package/dist/types/utils/title-generator.d.ts +30 -0
  103. package/dist/types/vibe/runtime.d.ts +36 -8
  104. package/dist/types/web/search/index.d.ts +1 -1
  105. package/dist/types/web/search/provider.d.ts +15 -5
  106. package/dist/types/web/search/types.d.ts +94 -0
  107. package/package.json +12 -12
  108. package/scripts/generate-share-viewer.ts +4 -6
  109. package/src/advisor/__tests__/advisor.test.ts +643 -0
  110. package/src/advisor/runtime.ts +144 -43
  111. package/src/async/job-manager.ts +90 -2
  112. package/src/cli/args.ts +2 -0
  113. package/src/cli/auth-gateway-cli.ts +18 -3
  114. package/src/cli/bench-cli.ts +395 -29
  115. package/src/cli/flag-tables.ts +3 -0
  116. package/src/cli/gc-cli.ts +2 -2
  117. package/src/cli/usage-cli.ts +10 -1
  118. package/src/collab/host.ts +3 -2
  119. package/src/commands/bench.ts +18 -4
  120. package/src/commands/launch.ts +4 -0
  121. package/src/config/model-registry.ts +10 -2
  122. package/src/config/models-config-schema.ts +15 -4
  123. package/src/config/provider-globals.ts +9 -9
  124. package/src/config/service-tier.ts +26 -1
  125. package/src/config/settings-schema.ts +209 -51
  126. package/src/config/settings.ts +81 -2
  127. package/src/dap/client.ts +37 -4
  128. package/src/edit/index.ts +49 -12
  129. package/src/eval/py/executor.ts +103 -33
  130. package/src/exec/bash-executor.ts +89 -6
  131. package/src/exec/direnv.ts +145 -0
  132. package/src/export/html/args.ts +20 -0
  133. package/src/export/html/index.ts +45 -47
  134. package/src/export/html/template.css +19 -1
  135. package/src/export/html/template.html +6 -0
  136. package/src/export/html/template.js +21 -0
  137. package/src/export/html/tool-views.generated.js +31 -31
  138. package/src/export/html/web-palette.ts +116 -132
  139. package/src/export/share.ts +249 -49
  140. package/src/extensibility/extensions/loader.ts +29 -1
  141. package/src/extensibility/extensions/runner.ts +6 -0
  142. package/src/extensibility/extensions/types.ts +33 -2
  143. package/src/extensibility/plugins/legacy-pi-compat.ts +19 -1
  144. package/src/hindsight/state.ts +64 -6
  145. package/src/internal-urls/local-protocol.ts +2 -1
  146. package/src/internal-urls/memory-protocol.ts +2 -2
  147. package/src/internal-urls/skill-protocol.ts +2 -2
  148. package/src/internal-urls/ssh-protocol.ts +2 -1
  149. package/src/internal-urls/vault-protocol.ts +2 -1
  150. package/src/live/audio-worklet.txt +59 -0
  151. package/src/live/browser-runtime.txt +221 -0
  152. package/src/live/controller.ts +464 -0
  153. package/src/live/prompts/agent-final-message.md +3 -0
  154. package/src/live/prompts/live-instructions.md +23 -0
  155. package/src/live/protocol.test.ts +140 -0
  156. package/src/live/protocol.ts +233 -0
  157. package/src/live/transport.ts +490 -0
  158. package/src/live/visualizer.ts +234 -0
  159. package/src/lsp/client.ts +29 -9
  160. package/src/lsp/index.ts +19 -4
  161. package/src/main.ts +8 -1
  162. package/src/mcp/config-writer.test.ts +43 -0
  163. package/src/mcp/config-writer.ts +109 -82
  164. package/src/mcp/oauth-discovery.ts +10 -2
  165. package/src/mcp/smithery-auth.test.ts +29 -0
  166. package/src/mcp/smithery-auth.ts +3 -2
  167. package/src/memories/index.ts +40 -20
  168. package/src/memory-backend/tool-names.ts +2 -0
  169. package/src/mnemopi/backend.ts +24 -7
  170. package/src/modes/acp/acp-agent.ts +56 -10
  171. package/src/modes/acp/acp-event-mapper.ts +8 -1
  172. package/src/modes/components/agent-hub.ts +1 -1
  173. package/src/modes/components/login-dialog.ts +14 -4
  174. package/src/modes/components/plan-review-overlay.ts +350 -35
  175. package/src/modes/components/settings-defs.ts +23 -1
  176. package/src/modes/components/settings-selector.ts +169 -1
  177. package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
  178. package/src/modes/components/status-line/component.ts +123 -2
  179. package/src/modes/components/tool-execution.ts +11 -2
  180. package/src/modes/controllers/command-controller.ts +56 -15
  181. package/src/modes/controllers/event-controller.ts +111 -16
  182. package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
  183. package/src/modes/controllers/extension-ui-controller.ts +20 -4
  184. package/src/modes/controllers/live-command-controller.ts +178 -0
  185. package/src/modes/controllers/mcp-command-controller.ts +10 -1
  186. package/src/modes/controllers/omfg-controller.ts +44 -40
  187. package/src/modes/controllers/selector-controller.ts +18 -10
  188. package/src/modes/controllers/session-focus-controller.ts +6 -1
  189. package/src/modes/interactive-mode.ts +157 -38
  190. package/src/modes/runtime-init.ts +2 -0
  191. package/src/modes/setup-wizard/scenes/web-search.ts +17 -9
  192. package/src/modes/theme/theme.ts +1 -1
  193. package/src/modes/types.ts +3 -1
  194. package/src/modes/utils/context-usage.ts +23 -7
  195. package/src/modes/utils/ui-helpers.ts +10 -5
  196. package/src/plan-mode/plan-files.ts +40 -0
  197. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  198. package/src/prompts/bench/cache-prefix.md +3 -0
  199. package/src/prompts/bench/cache-suffix.md +1 -0
  200. package/src/prompts/system/custom-system-prompt.md +1 -1
  201. package/src/prompts/system/project-prompt.md +8 -1
  202. package/src/prompts/system/subagent-async-pending.md +6 -0
  203. package/src/prompts/system/system-prompt.md +1 -1
  204. package/src/prompts/system/workflow-notice.md +48 -40
  205. package/src/prompts/system/xdev-mount-notice.md +4 -0
  206. package/src/prompts/tools/todo.md +3 -1
  207. package/src/registry/agent-lifecycle.ts +116 -46
  208. package/src/registry/agent-registry.ts +35 -8
  209. package/src/registry/persisted-agents.ts +26 -2
  210. package/src/sdk.ts +210 -136
  211. package/src/secrets/index.ts +127 -4
  212. package/src/secrets/obfuscator.ts +2328 -105
  213. package/src/session/acp-permission-gate.ts +165 -0
  214. package/src/session/agent-session-error-log.test.ts +1 -1
  215. package/src/session/agent-session-events.ts +66 -0
  216. package/src/session/agent-session-types.ts +334 -0
  217. package/src/session/agent-session.ts +1892 -12226
  218. package/src/session/artifacts.ts +6 -5
  219. package/src/session/async-job-delivery.ts +74 -0
  220. package/src/session/bash-runner.ts +326 -0
  221. package/src/session/blob-store.test.ts +56 -0
  222. package/src/session/blob-store.ts +18 -2
  223. package/src/session/checkpoint-entries.ts +81 -0
  224. package/src/session/eval-runner.ts +212 -0
  225. package/src/session/indexed-session-storage.ts +9 -2
  226. package/src/session/irc-bridge.ts +203 -0
  227. package/src/session/messages.ts +263 -1
  228. package/src/session/model-controls.ts +714 -0
  229. package/src/session/prewalk.ts +252 -0
  230. package/src/session/queued-messages.ts +93 -0
  231. package/src/session/redis-session-storage.ts +51 -11
  232. package/src/session/retry-fallback-chains.ts +455 -0
  233. package/src/session/role-models.ts +85 -0
  234. package/src/session/session-advisors.ts +1679 -0
  235. package/src/session/session-context.ts +6 -3
  236. package/src/session/session-entries.ts +8 -0
  237. package/src/session/session-handoff.ts +308 -0
  238. package/src/session/session-history-format.ts +20 -9
  239. package/src/session/session-loader.ts +0 -46
  240. package/src/session/session-maintenance.ts +2983 -0
  241. package/src/session/session-manager.ts +390 -30
  242. package/src/session/session-memory.ts +222 -0
  243. package/src/session/session-provider-boundary.ts +307 -0
  244. package/src/session/session-stats.ts +293 -0
  245. package/src/session/session-tools.ts +943 -0
  246. package/src/session/session-workspace.ts +53 -0
  247. package/src/session/stream-guards.ts +417 -0
  248. package/src/session/todo-tracker.ts +380 -0
  249. package/src/session/ttsr-coordinator.ts +496 -0
  250. package/src/session/turn-recovery.ts +1629 -0
  251. package/src/slash-commands/builtin-registry.ts +92 -11
  252. package/src/slash-commands/helpers/usage-report.ts +22 -3
  253. package/src/system-prompt.ts +41 -17
  254. package/src/task/executor.ts +285 -70
  255. package/src/task/index.ts +98 -105
  256. package/src/task/output-manager.ts +25 -3
  257. package/src/task/persisted-revive.ts +4 -3
  258. package/src/task/structured-subagent.ts +1 -0
  259. package/src/tools/approval.ts +55 -10
  260. package/src/tools/bash-interactive.ts +26 -0
  261. package/src/tools/bash-skill-urls.ts +28 -2
  262. package/src/tools/bash.ts +339 -123
  263. package/src/tools/browser/launch.ts +9 -1
  264. package/src/tools/browser/tab-supervisor.ts +8 -5
  265. package/src/tools/browser.ts +94 -47
  266. package/src/tools/image-gen.ts +20 -28
  267. package/src/tools/image-providers.ts +50 -0
  268. package/src/tools/index.ts +9 -0
  269. package/src/tools/path-utils.ts +49 -2
  270. package/src/tools/read.ts +156 -88
  271. package/src/tools/renderers.ts +7 -1
  272. package/src/tools/todo.ts +101 -11
  273. package/src/tools/vibe.ts +1 -2
  274. package/src/tools/write.ts +51 -1
  275. package/src/tools/xdev.ts +67 -3
  276. package/src/tts/streaming-player.ts +62 -4
  277. package/src/tts/vocalizer.ts +18 -1
  278. package/src/utils/jj.ts +125 -4
  279. package/src/utils/lang-from-path.ts +7 -0
  280. package/src/utils/title-generator.ts +137 -1
  281. package/src/vibe/runtime.ts +852 -72
  282. package/src/web/search/index.ts +3 -6
  283. package/src/web/search/provider.ts +31 -16
  284. package/src/web/search/providers/xai.ts +7 -1
  285. package/src/web/search/types.ts +3 -0
@@ -38,6 +38,7 @@ import {
38
38
  getSmitheryApiKey,
39
39
  getSmitheryLoginUrl,
40
40
  pollSmitheryCliAuthSession,
41
+ type SmitheryCliPollResponse,
41
42
  saveSmitheryApiKey,
42
43
  } from "../../mcp/smithery-auth";
43
44
  import { SmitheryConnectError } from "../../mcp/smithery-connect";
@@ -51,6 +52,7 @@ import type { MCPAuthChallenge, MCPAuthConfig, MCPServerConfig, MCPServerConnect
51
52
  import { shortenPath } from "../../tools/render-utils";
52
53
  import { urlHyperlinkAlways } from "../../tui";
53
54
  import { copyToClipboard } from "../../utils/clipboard";
55
+ import { isTimeoutError } from "../../utils/fetch-timeout";
54
56
  import { openPath } from "../../utils/open";
55
57
  import { ChatBlock } from "../components/chat-block";
56
58
  import { MCPAddWizard } from "../components/mcp-add-wizard";
@@ -2121,7 +2123,14 @@ export class MCPCommandController {
2121
2123
  if (Date.now() - startedAt >= timeoutMs) {
2122
2124
  throw new Error("Smithery authorization timed out after 5 minutes.");
2123
2125
  }
2124
- const response = await pollSmitheryCliAuthSession(sessionId, signal);
2126
+ let response: SmitheryCliPollResponse;
2127
+ try {
2128
+ response = await pollSmitheryCliAuthSession(sessionId, signal);
2129
+ } catch (error) {
2130
+ // A single hung/slow poll aborts with TimeoutError; retry until the deadline.
2131
+ if (isTimeoutError(error)) continue;
2132
+ throw error;
2133
+ }
2125
2134
  if (response.status === "success" && response.apiKey) {
2126
2135
  return response.apiKey;
2127
2136
  }
@@ -192,56 +192,60 @@ export class OmfgController {
192
192
 
193
193
  async #saveCandidate(request: OmfgRequest, candidate: OmfgCandidate): Promise<SaveCandidateResult> {
194
194
  if (this.#shouldStop(request)) return { kind: "aborted" };
195
- request.component.setStatus("saving", "Choose where to save or amend the TTSR rule…");
196
- const location = await this.ctx.showHookSelector("Save TTSR rule where?", [
197
- PROJECT_OPTION,
198
- GLOBAL_OPTION,
199
- AMEND_OPTION,
200
- ]);
201
- if (!this.#isActiveRequest(request)) return { kind: "aborted" };
202
- if (!location) {
203
- request.component.markAborted();
204
- this.#closeActiveRequest({ abort: false });
205
- return { kind: "aborted" };
206
- }
207
195
 
208
- if (location === AMEND_OPTION) {
209
- request.component.setStatus("confirming", "Describe how to amend the rule…");
210
- const amendment = await this.ctx.showHookInput(
211
- "Amend TTSR rule",
212
- "e.g. Make it specific to Ruby string eval in tool:write(*.rb)",
213
- );
196
+ for (;;) {
197
+ request.component.setStatus("saving", "Choose where to save or amend the TTSR rule…");
198
+ const location = await this.ctx.showHookSelector("Save TTSR rule where?", [
199
+ PROJECT_OPTION,
200
+ GLOBAL_OPTION,
201
+ AMEND_OPTION,
202
+ ]);
214
203
  if (!this.#isActiveRequest(request)) return { kind: "aborted" };
215
- const feedback = amendment?.trim();
216
- if (!feedback) {
204
+ if (!location) {
217
205
  request.component.markAborted();
218
206
  this.#closeActiveRequest({ abort: false });
219
207
  return { kind: "aborted" };
220
208
  }
221
- return { kind: "amend", feedback };
222
- }
223
209
 
224
- const target = this.#resolveTarget(location, candidate.rule.name);
225
- if (await Bun.file(target.filePath).exists()) {
226
- const shouldOverwrite = await this.ctx.showHookConfirm(
227
- "Overwrite TTSR rule?",
228
- `${shortenPath(target.filePath)} already exists. Overwrite it?`,
229
- );
230
- if (!this.#isActiveRequest(request)) return { kind: "aborted" };
231
- if (!shouldOverwrite) {
232
- request.component.markRejected();
233
- return { kind: "rejected" };
210
+ if (location === AMEND_OPTION) {
211
+ request.component.setStatus("confirming", "Describe how to amend the rule…");
212
+ const amendment = await this.ctx.showHookInput(
213
+ "Amend TTSR rule",
214
+ "e.g. Make it specific to Ruby string eval in tool:write(*.rb)",
215
+ );
216
+ if (!this.#isActiveRequest(request)) return { kind: "aborted" };
217
+ const feedback = amendment?.trim();
218
+ if (!feedback) continue;
219
+ return { kind: "amend", feedback };
234
220
  }
235
- }
236
221
 
237
- request.component.setStatus("saving", `Saving ${candidate.rule.name}…`);
238
- await Bun.write(target.filePath, candidate.fileContent);
239
- if (!this.#isActiveRequest(request)) return { kind: "aborted" };
222
+ const target = this.#resolveTarget(location, candidate.rule.name);
223
+ if (await Bun.file(target.filePath).exists()) {
224
+ const shouldOverwrite = await this.ctx.showHookConfirm(
225
+ "Overwrite TTSR rule?",
226
+ `${shortenPath(target.filePath)} already exists. Overwrite it?`,
227
+ );
228
+ if (!this.#isActiveRequest(request)) return { kind: "aborted" };
229
+ if (!shouldOverwrite) {
230
+ request.component.markRejected();
231
+ return { kind: "rejected" };
232
+ }
233
+ }
240
234
 
241
- const savedRule = buildOmfgRuleForPath(candidate.rule.name, candidate.fileContent, target.filePath, target.level);
242
- this.#registerLive(savedRule);
243
- request.component.markSaved(shortenPath(target.filePath));
244
- return { kind: "saved" };
235
+ request.component.setStatus("saving", `Saving ${candidate.rule.name}…`);
236
+ await Bun.write(target.filePath, candidate.fileContent);
237
+ if (!this.#isActiveRequest(request)) return { kind: "aborted" };
238
+
239
+ const savedRule = buildOmfgRuleForPath(
240
+ candidate.rule.name,
241
+ candidate.fileContent,
242
+ target.filePath,
243
+ target.level,
244
+ );
245
+ this.#registerLive(savedRule);
246
+ request.component.markSaved(shortenPath(target.filePath));
247
+ return { kind: "saved" };
248
+ }
245
249
  }
246
250
 
247
251
  #resolveTarget(location: string, ruleName: string): { filePath: string; level: OmfgRuleSourceLevel } {
@@ -57,12 +57,10 @@ import {
57
57
  parseConfiguredThinkingLevel,
58
58
  } from "../../thinking";
59
59
  import {
60
- isImageProviderPreference,
61
60
  isSearchProviderId,
62
- isSearchProviderPreference,
63
61
  setExcludedSearchProviders,
64
- setPreferredImageProvider,
65
- setPreferredSearchProvider,
62
+ setImageProviderOrder,
63
+ setSearchProviderOrder,
66
64
  type ToolSession,
67
65
  } from "../../tools";
68
66
  import { AskTool, type AskToolDetails, type AskToolInput } from "../../tools/ask";
@@ -439,6 +437,16 @@ export class SelectorController {
439
437
  this.ctx.showError(`Failed to apply personality: ${err}`);
440
438
  });
441
439
  break;
440
+ case "tools.xdevDocs":
441
+ void this.ctx.session.refreshBaseSystemPrompt().catch(err => {
442
+ this.ctx.showError(`Failed to apply xd:// prompt docs setting: ${err}`);
443
+ });
444
+ break;
445
+ case "memory.backend":
446
+ void this.ctx.session.applyMemoryBackend().catch(err => {
447
+ this.ctx.showError(`Failed to apply memory backend: ${err}`);
448
+ });
449
+ break;
442
450
 
443
451
  case "autocompleteMaxVisible":
444
452
  this.ctx.editor.setAutocompleteMaxVisible(typeof value === "number" ? value : Number(value));
@@ -609,9 +617,9 @@ export class SelectorController {
609
617
  }
610
618
 
611
619
  // Provider settings - update runtime preferences
612
- case "providers.webSearch":
613
- if (typeof value === "string" && isSearchProviderPreference(value)) {
614
- setPreferredSearchProvider(value);
620
+ case "providers.webSearchOrder":
621
+ if (Array.isArray(value)) {
622
+ setSearchProviderOrder(value.filter(isSearchProviderId));
615
623
  }
616
624
  break;
617
625
  case "providers.webSearchExclude":
@@ -619,9 +627,9 @@ export class SelectorController {
619
627
  setExcludedSearchProviders(value.filter(isSearchProviderId));
620
628
  }
621
629
  break;
622
- case "providers.image":
623
- if (isImageProviderPreference(value)) {
624
- setPreferredImageProvider(value);
630
+ case "providers.imageOrder":
631
+ if (Array.isArray(value)) {
632
+ setImageProviderOrder(value.filter((entry): entry is string => typeof entry === "string"));
625
633
  }
626
634
  break;
627
635
 
@@ -12,6 +12,7 @@
12
12
  import { AgentLifecycleManager } from "../../registry/agent-lifecycle";
13
13
  import { AgentRegistry, MAIN_AGENT_ID, type RegistryEvent } from "../../registry/agent-registry";
14
14
  import type { AgentSession } from "../../session/agent-session";
15
+ import { setTerminalTitleState } from "../../utils/title-generator";
15
16
  import type { InteractiveModeContext } from "../types";
16
17
 
17
18
  export class SessionFocusController {
@@ -104,8 +105,12 @@ export class SessionFocusController {
104
105
  });
105
106
  this.ctx.statusLine.setSession(target, this.#focusedAgentId);
106
107
  this.ctx.renderInitialMessages({ clearTerminalHistory: true });
107
- // Mid-turn attach: no agent_start will arrive; arm the loader/turn state manually.
108
+ // Sync the run-state title to the attached target: a streaming target has no
109
+ // agent_start incoming, so arm the loader/working title manually; an idle
110
+ // target would otherwise inherit the previous session's stuck spinner, so
111
+ // reset it to idle (agent_end teardown already ran via clearTransientSessionUi).
108
112
  if (target.isStreaming) await this.ctx.eventController.handleEvent({ type: "agent_start" });
113
+ else setTerminalTitleState("idle");
109
114
  this.ctx.updateEditorBorderColor();
110
115
  this.ctx.ui.requestRender();
111
116
  }