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

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 (349) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +1 -1
  3. package/dist/cli.js +4685 -4614
  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 +374 -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/legacy-pi-coding-agent-shim.d.ts +3 -0
  25. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +13 -0
  26. package/dist/types/live/attestation.d.ts +2 -0
  27. package/dist/types/live/controller.d.ts +48 -0
  28. package/dist/types/live/protocol.d.ts +85 -0
  29. package/dist/types/live/protocol.test.d.ts +1 -0
  30. package/dist/types/live/transport.d.ts +35 -0
  31. package/dist/types/live/visualizer.d.ts +30 -0
  32. package/dist/types/lsp/client.d.ts +16 -1
  33. package/dist/types/mcp/config-writer.test.d.ts +1 -0
  34. package/dist/types/mcp/oauth-discovery.d.ts +2 -0
  35. package/dist/types/mcp/smithery-auth.d.ts +1 -1
  36. package/dist/types/mcp/smithery-auth.test.d.ts +1 -0
  37. package/dist/types/memory-backend/tool-names.d.ts +2 -0
  38. package/dist/types/modes/components/assistant-message.d.ts +1 -0
  39. package/dist/types/modes/components/custom-message.d.ts +1 -1
  40. package/dist/types/modes/components/login-dialog.d.ts +2 -2
  41. package/dist/types/modes/components/message-frame.d.ts +8 -4
  42. package/dist/types/modes/components/plan-review-overlay.d.ts +26 -0
  43. package/dist/types/modes/components/session-account-selector.d.ts +11 -0
  44. package/dist/types/modes/components/settings-defs.d.ts +7 -1
  45. package/dist/types/modes/components/status-line/component.jj-cache.test.d.ts +1 -0
  46. package/dist/types/modes/components/tool-execution.d.ts +9 -1
  47. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  48. package/dist/types/modes/controllers/event-controller.d.ts +6 -1
  49. package/dist/types/modes/controllers/live-command-controller.d.ts +14 -0
  50. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  51. package/dist/types/modes/interactive-mode.d.ts +6 -0
  52. package/dist/types/modes/theme/theme.d.ts +1 -1
  53. package/dist/types/modes/types.d.ts +4 -1
  54. package/dist/types/modes/utils/context-usage.d.ts +12 -2
  55. package/dist/types/plan-mode/plan-files.d.ts +10 -0
  56. package/dist/types/registry/agent-lifecycle.d.ts +21 -9
  57. package/dist/types/registry/agent-registry.d.ts +11 -4
  58. package/dist/types/sdk.d.ts +15 -1
  59. package/dist/types/secrets/index.d.ts +15 -2
  60. package/dist/types/secrets/obfuscator.d.ts +113 -15
  61. package/dist/types/session/acp-permission-gate.d.ts +19 -0
  62. package/dist/types/session/agent-session-events.d.ts +84 -0
  63. package/dist/types/session/agent-session-types.d.ts +321 -0
  64. package/dist/types/session/agent-session.d.ts +135 -753
  65. package/dist/types/session/async-job-delivery.d.ts +28 -0
  66. package/dist/types/session/auth-storage.d.ts +1 -1
  67. package/dist/types/session/bash-runner.d.ts +75 -0
  68. package/dist/types/session/blob-store.d.ts +11 -1
  69. package/dist/types/session/blob-store.test.d.ts +1 -0
  70. package/dist/types/session/checkpoint-entries.d.ts +28 -0
  71. package/dist/types/session/eval-runner.d.ts +51 -0
  72. package/dist/types/session/irc-bridge.d.ts +46 -0
  73. package/dist/types/session/messages.d.ts +24 -0
  74. package/dist/types/session/model-controls.d.ts +180 -0
  75. package/dist/types/session/prewalk.d.ts +46 -0
  76. package/dist/types/session/queued-messages.d.ts +22 -0
  77. package/dist/types/session/redis-session-storage.d.ts +1 -0
  78. package/dist/types/session/retry-fallback-chains.d.ts +74 -0
  79. package/dist/types/session/role-models.d.ts +15 -0
  80. package/dist/types/session/session-advisors.d.ts +228 -0
  81. package/dist/types/session/session-entries.d.ts +8 -0
  82. package/dist/types/session/session-handoff.d.ts +70 -0
  83. package/dist/types/session/session-history-format.d.ts +6 -1
  84. package/dist/types/session/session-maintenance.d.ts +246 -0
  85. package/dist/types/session/session-manager.d.ts +41 -0
  86. package/dist/types/session/session-memory.d.ts +56 -0
  87. package/dist/types/session/session-provider-boundary.d.ts +62 -0
  88. package/dist/types/session/session-stats.d.ts +48 -0
  89. package/dist/types/session/session-tools.d.ts +158 -0
  90. package/dist/types/session/session-workspace.d.ts +32 -0
  91. package/dist/types/session/stream-guards.d.ts +44 -0
  92. package/dist/types/session/streaming-output.d.ts +8 -0
  93. package/dist/types/session/todo-tracker.d.ts +56 -0
  94. package/dist/types/session/ttsr-coordinator.d.ts +51 -0
  95. package/dist/types/session/turn-recovery.d.ts +225 -0
  96. package/dist/types/slash-commands/helpers/session-pin.d.ts +9 -0
  97. package/dist/types/stt/index.d.ts +0 -2
  98. package/dist/types/stt/stt-controller.d.ts +7 -0
  99. package/dist/types/system-prompt.d.ts +2 -0
  100. package/dist/types/task/executor.d.ts +4 -1
  101. package/dist/types/task/output-manager.d.ts +3 -1
  102. package/dist/types/tiny/title-client.d.ts +10 -0
  103. package/dist/types/tools/approval.d.ts +1 -0
  104. package/dist/types/tools/browser/launch.d.ts +5 -0
  105. package/dist/types/tools/builtin-names.d.ts +1 -1
  106. package/dist/types/tools/computer/protocol.d.ts +43 -0
  107. package/dist/types/tools/computer/supervisor.d.ts +32 -0
  108. package/dist/types/tools/computer/worker-entry.d.ts +1 -0
  109. package/dist/types/tools/computer/worker.d.ts +15 -0
  110. package/dist/types/tools/computer-renderer.d.ts +22 -0
  111. package/dist/types/tools/computer.d.ts +71 -0
  112. package/dist/types/tools/context.d.ts +2 -0
  113. package/dist/types/tools/default-renderer.d.ts +21 -0
  114. package/dist/types/tools/image-gen.d.ts +4 -4
  115. package/dist/types/tools/image-providers.d.ts +38 -0
  116. package/dist/types/tools/index.d.ts +7 -0
  117. package/dist/types/tools/path-utils.d.ts +8 -0
  118. package/dist/types/tools/todo.d.ts +10 -4
  119. package/dist/types/tools/xdev.d.ts +5 -1
  120. package/dist/types/tts/streaming-player.d.ts +10 -29
  121. package/dist/types/tts/vocalizer.d.ts +5 -0
  122. package/dist/types/utils/jj.d.ts +29 -0
  123. package/dist/types/utils/lang-from-path.d.ts +1 -0
  124. package/dist/types/utils/title-generator.d.ts +30 -0
  125. package/dist/types/utils/tools-manager.d.ts +1 -2
  126. package/dist/types/vibe/runtime.d.ts +36 -8
  127. package/dist/types/web/search/index.d.ts +1 -1
  128. package/dist/types/web/search/provider.d.ts +15 -5
  129. package/dist/types/web/search/types.d.ts +94 -0
  130. package/package.json +12 -12
  131. package/scripts/generate-share-viewer.ts +4 -6
  132. package/src/advisor/__tests__/advisor.test.ts +643 -0
  133. package/src/advisor/runtime.ts +144 -43
  134. package/src/async/job-manager.ts +90 -2
  135. package/src/cli/args.ts +3 -0
  136. package/src/cli/auth-gateway-cli.ts +18 -3
  137. package/src/cli/bench-cli.ts +395 -29
  138. package/src/cli/flag-tables.ts +3 -0
  139. package/src/cli/gc-cli.ts +2 -2
  140. package/src/cli/setup-cli.ts +2 -14
  141. package/src/cli/usage-cli.ts +10 -1
  142. package/src/cli.ts +8 -0
  143. package/src/collab/host.ts +3 -2
  144. package/src/commands/bench.ts +18 -4
  145. package/src/commands/launch.ts +4 -0
  146. package/src/config/model-registry.ts +16 -2
  147. package/src/config/models-config-schema.ts +15 -4
  148. package/src/config/provider-globals.ts +9 -9
  149. package/src/config/service-tier.ts +26 -1
  150. package/src/config/settings-schema.ts +270 -51
  151. package/src/config/settings.ts +81 -2
  152. package/src/dap/client.ts +37 -4
  153. package/src/edit/index.ts +49 -12
  154. package/src/eval/executor-base.ts +1 -0
  155. package/src/eval/js/executor.ts +2 -0
  156. package/src/eval/py/executor.ts +103 -33
  157. package/src/exec/bash-executor.ts +90 -6
  158. package/src/exec/direnv.ts +145 -0
  159. package/src/export/html/args.ts +20 -0
  160. package/src/export/html/index.ts +45 -47
  161. package/src/export/html/template.css +19 -1
  162. package/src/export/html/template.html +6 -0
  163. package/src/export/html/template.js +21 -0
  164. package/src/export/html/tool-views.generated.js +31 -31
  165. package/src/export/html/web-palette.ts +116 -132
  166. package/src/export/share.ts +249 -49
  167. package/src/extensibility/extensions/loader.ts +29 -1
  168. package/src/extensibility/extensions/runner.ts +6 -0
  169. package/src/extensibility/extensions/types.ts +33 -2
  170. package/src/extensibility/extensions/wrapper.ts +68 -12
  171. package/src/extensibility/legacy-pi-coding-agent-shim.ts +7 -1
  172. package/src/extensibility/plugins/legacy-pi-compat.ts +19 -1
  173. package/src/hindsight/state.ts +64 -6
  174. package/src/internal-urls/local-protocol.ts +2 -1
  175. package/src/internal-urls/memory-protocol.ts +2 -2
  176. package/src/internal-urls/skill-protocol.ts +2 -2
  177. package/src/internal-urls/ssh-protocol.ts +2 -1
  178. package/src/internal-urls/vault-protocol.ts +2 -1
  179. package/src/live/attestation.ts +91 -0
  180. package/src/live/controller.ts +517 -0
  181. package/src/live/prompts/agent-final-message.md +3 -0
  182. package/src/live/prompts/live-instructions.md +23 -0
  183. package/src/live/protocol.test.ts +140 -0
  184. package/src/live/protocol.ts +233 -0
  185. package/src/live/transport.ts +422 -0
  186. package/src/live/visualizer.ts +214 -0
  187. package/src/lsp/client.ts +29 -9
  188. package/src/lsp/index.ts +19 -4
  189. package/src/main.ts +8 -1
  190. package/src/mcp/config-writer.test.ts +43 -0
  191. package/src/mcp/config-writer.ts +109 -82
  192. package/src/mcp/oauth-discovery.ts +10 -2
  193. package/src/mcp/smithery-auth.test.ts +29 -0
  194. package/src/mcp/smithery-auth.ts +3 -2
  195. package/src/memories/index.ts +40 -20
  196. package/src/memory-backend/tool-names.ts +2 -0
  197. package/src/mnemopi/backend.ts +24 -7
  198. package/src/modes/acp/acp-agent.ts +56 -10
  199. package/src/modes/acp/acp-event-mapper.ts +8 -1
  200. package/src/modes/components/agent-hub.ts +1 -1
  201. package/src/modes/components/assistant-message.ts +7 -2
  202. package/src/modes/components/custom-message.ts +4 -1
  203. package/src/modes/components/login-dialog.ts +14 -4
  204. package/src/modes/components/message-frame.ts +14 -8
  205. package/src/modes/components/plan-review-overlay.ts +350 -35
  206. package/src/modes/components/session-account-selector.ts +62 -0
  207. package/src/modes/components/settings-defs.ts +23 -1
  208. package/src/modes/components/settings-selector.ts +169 -1
  209. package/src/modes/components/status-line/component.jj-cache.test.ts +229 -0
  210. package/src/modes/components/status-line/component.ts +123 -2
  211. package/src/modes/components/tool-execution.ts +28 -112
  212. package/src/modes/controllers/command-controller.ts +56 -15
  213. package/src/modes/controllers/event-controller.ts +111 -16
  214. package/src/modes/controllers/extension-ui-controller.test.ts +1 -0
  215. package/src/modes/controllers/extension-ui-controller.ts +20 -4
  216. package/src/modes/controllers/input-controller.ts +47 -39
  217. package/src/modes/controllers/live-command-controller.ts +255 -0
  218. package/src/modes/controllers/mcp-command-controller.ts +10 -1
  219. package/src/modes/controllers/omfg-controller.ts +44 -40
  220. package/src/modes/controllers/selector-controller.ts +80 -10
  221. package/src/modes/controllers/session-focus-controller.ts +6 -1
  222. package/src/modes/interactive-mode.ts +176 -38
  223. package/src/modes/runtime-init.ts +2 -0
  224. package/src/modes/setup-wizard/scenes/web-search.ts +17 -9
  225. package/src/modes/theme/theme.ts +1 -1
  226. package/src/modes/types.ts +4 -1
  227. package/src/modes/utils/context-usage.ts +23 -7
  228. package/src/modes/utils/ui-helpers.ts +10 -5
  229. package/src/plan-mode/plan-files.ts +40 -0
  230. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  231. package/src/prompts/bench/cache-prefix.md +3 -0
  232. package/src/prompts/bench/cache-suffix.md +1 -0
  233. package/src/prompts/system/computer-safety.md +14 -0
  234. package/src/prompts/system/custom-system-prompt.md +1 -1
  235. package/src/prompts/system/project-prompt.md +8 -1
  236. package/src/prompts/system/subagent-async-pending.md +6 -0
  237. package/src/prompts/system/system-prompt.md +1 -1
  238. package/src/prompts/system/workflow-notice.md +48 -40
  239. package/src/prompts/system/xdev-mount-notice.md +4 -0
  240. package/src/prompts/tools/computer.md +26 -0
  241. package/src/prompts/tools/todo.md +3 -1
  242. package/src/registry/agent-lifecycle.ts +116 -46
  243. package/src/registry/agent-registry.ts +35 -8
  244. package/src/registry/persisted-agents.ts +26 -2
  245. package/src/sdk.ts +215 -136
  246. package/src/secrets/index.ts +127 -4
  247. package/src/secrets/obfuscator.ts +2328 -105
  248. package/src/session/acp-permission-gate.ts +165 -0
  249. package/src/session/agent-session-error-log.test.ts +1 -1
  250. package/src/session/agent-session-events.ts +66 -0
  251. package/src/session/agent-session-types.ts +343 -0
  252. package/src/session/agent-session.ts +1940 -12218
  253. package/src/session/artifacts.ts +6 -5
  254. package/src/session/async-job-delivery.ts +74 -0
  255. package/src/session/auth-storage.ts +1 -0
  256. package/src/session/bash-runner.ts +326 -0
  257. package/src/session/blob-store.test.ts +56 -0
  258. package/src/session/blob-store.ts +18 -2
  259. package/src/session/checkpoint-entries.ts +81 -0
  260. package/src/session/eval-runner.ts +217 -0
  261. package/src/session/indexed-session-storage.ts +9 -2
  262. package/src/session/irc-bridge.ts +203 -0
  263. package/src/session/messages.ts +266 -1
  264. package/src/session/model-controls.ts +714 -0
  265. package/src/session/prewalk.ts +252 -0
  266. package/src/session/queued-messages.ts +93 -0
  267. package/src/session/redis-session-storage.ts +51 -11
  268. package/src/session/retry-fallback-chains.ts +455 -0
  269. package/src/session/role-models.ts +85 -0
  270. package/src/session/session-advisors.ts +1679 -0
  271. package/src/session/session-context.ts +6 -3
  272. package/src/session/session-entries.ts +8 -0
  273. package/src/session/session-handoff.ts +308 -0
  274. package/src/session/session-history-format.ts +20 -9
  275. package/src/session/session-loader.ts +0 -46
  276. package/src/session/session-maintenance.ts +2983 -0
  277. package/src/session/session-manager.ts +390 -30
  278. package/src/session/session-memory.ts +222 -0
  279. package/src/session/session-provider-boundary.ts +307 -0
  280. package/src/session/session-stats.ts +293 -0
  281. package/src/session/session-tools.ts +980 -0
  282. package/src/session/session-workspace.ts +53 -0
  283. package/src/session/stream-guards.ts +417 -0
  284. package/src/session/streaming-output.ts +52 -5
  285. package/src/session/todo-tracker.ts +380 -0
  286. package/src/session/ttsr-coordinator.ts +496 -0
  287. package/src/session/turn-recovery.ts +1629 -0
  288. package/src/slash-commands/builtin-registry.ts +257 -20
  289. package/src/slash-commands/helpers/session-pin.ts +44 -0
  290. package/src/slash-commands/helpers/usage-report.ts +22 -3
  291. package/src/stt/downloader.ts +0 -2
  292. package/src/stt/index.ts +0 -2
  293. package/src/stt/stt-controller.ts +57 -146
  294. package/src/system-prompt.ts +45 -17
  295. package/src/task/executor.ts +285 -70
  296. package/src/task/index.ts +98 -105
  297. package/src/task/output-manager.ts +25 -3
  298. package/src/task/persisted-revive.ts +4 -3
  299. package/src/task/structured-subagent.ts +1 -0
  300. package/src/tiny/title-client.ts +22 -0
  301. package/src/tools/approval.ts +55 -10
  302. package/src/tools/bash-interactive.ts +116 -86
  303. package/src/tools/bash-skill-urls.ts +28 -2
  304. package/src/tools/bash.ts +339 -123
  305. package/src/tools/browser/launch.ts +9 -1
  306. package/src/tools/browser/tab-supervisor.ts +8 -5
  307. package/src/tools/browser.ts +94 -47
  308. package/src/tools/builtin-names.ts +1 -0
  309. package/src/tools/computer/protocol.ts +28 -0
  310. package/src/tools/computer/supervisor.ts +258 -0
  311. package/src/tools/computer/worker-entry.ts +25 -0
  312. package/src/tools/computer/worker.ts +135 -0
  313. package/src/tools/computer-renderer.ts +108 -0
  314. package/src/tools/computer.ts +433 -0
  315. package/src/tools/context.ts +2 -0
  316. package/src/tools/default-renderer.ts +139 -0
  317. package/src/tools/essential-tools.ts +1 -0
  318. package/src/tools/image-gen.ts +20 -28
  319. package/src/tools/image-providers.ts +50 -0
  320. package/src/tools/index.ts +14 -0
  321. package/src/tools/path-utils.ts +49 -2
  322. package/src/tools/read.ts +156 -88
  323. package/src/tools/renderers.ts +9 -1
  324. package/src/tools/todo.ts +101 -11
  325. package/src/tools/vibe.ts +1 -2
  326. package/src/tools/write.ts +51 -1
  327. package/src/tools/xdev.ts +121 -29
  328. package/src/tts/streaming-player.ts +82 -283
  329. package/src/tts/vocalizer.ts +18 -1
  330. package/src/utils/clipboard.ts +1 -30
  331. package/src/utils/jj.ts +125 -4
  332. package/src/utils/lang-from-path.ts +7 -0
  333. package/src/utils/mac-file-urls.applescript +37 -0
  334. package/src/utils/title-generator.ts +137 -1
  335. package/src/utils/tool-choice.ts +14 -0
  336. package/src/utils/tools-manager.ts +1 -19
  337. package/src/vibe/runtime.ts +852 -72
  338. package/src/web/search/index.ts +3 -6
  339. package/src/web/search/provider.ts +31 -16
  340. package/src/web/search/providers/xai.ts +7 -1
  341. package/src/web/search/types.ts +3 -0
  342. package/dist/types/stt/recorder.d.ts +0 -30
  343. package/dist/types/stt/transcriber.d.ts +0 -14
  344. package/dist/types/stt/wav.d.ts +0 -29
  345. package/dist/types/tts/player.d.ts +0 -32
  346. package/src/stt/recorder.ts +0 -551
  347. package/src/stt/transcriber.ts +0 -60
  348. package/src/stt/wav.ts +0 -173
  349. package/src/tts/player.ts +0 -137
package/src/cli.ts CHANGED
@@ -79,6 +79,7 @@ async function runSmokeTest(): Promise<void> {
79
79
  const { smokeTestTtsWorker } = await import("./tts/tts-client");
80
80
  const { smokeTestMnemopiEmbedWorker } = await import("./mnemopi/embed-client");
81
81
  const { smokeTestJsEvalWorker } = await import("./eval/js/context-manager");
82
+ const { smokeTestComputerWorker } = await import("./tools/computer/supervisor");
82
83
  // Smoke dependencies stay lazy so normal CLI startup does not load worker clients.
83
84
  const { smokeTestDaemonBroker } = await import("./launch/client");
84
85
  await smokeTestSyncWorker();
@@ -98,6 +99,7 @@ async function runSmokeTest(): Promise<void> {
98
99
  await smokeTestTinyTitleWorker();
99
100
  await smokeTestSttWorker();
100
101
  await smokeTestJsEvalWorker();
102
+ await smokeTestComputerWorker();
101
103
  await smokeTestTtsWorker();
102
104
  await smokeTestMnemopiEmbedWorker();
103
105
  await smokeTestDaemonBroker();
@@ -107,6 +109,7 @@ async function runSmokeTest(): Promise<void> {
107
109
  const TINY_WORKER_ARG = "__omp_worker_tiny_inference";
108
110
  const STATS_SYNC_WORKER_ARG = "__omp_worker_stats_sync";
109
111
  const TAB_WORKER_ARG = "__omp_worker_tab";
112
+ const COMPUTER_WORKER_ARG = "__omp_worker_computer";
110
113
  const JS_EVAL_WORKER_ARG = "__omp_worker_js_eval";
111
114
  const JS_EVAL_PROCESS_ARG = "__omp_worker_js_eval_process";
112
115
  const STT_WORKER_ARG = "__omp_worker_stt";
@@ -152,6 +155,11 @@ async function runWorkerEntrypoint(arg: string | undefined): Promise<boolean> {
152
155
  await import("./tools/browser/tab-worker-entry");
153
156
  return true;
154
157
  }
158
+ if (arg === COMPUTER_WORKER_ARG) {
159
+ if (parentPort) installWorkerInbox(parentPort);
160
+ await import("./tools/computer/worker-entry");
161
+ return true;
162
+ }
155
163
  if (arg === JS_EVAL_WORKER_ARG) {
156
164
  if (parentPort) installWorkerInbox(parentPort);
157
165
  await import("./eval/js/worker-entry");
@@ -614,10 +614,11 @@ export class CollabHost {
614
614
  case "kill": {
615
615
  const kill = async () => {
616
616
  const ref = AgentRegistry.global().get(agentId);
617
- if (ref && ref.status === "running" && ref.session) {
617
+ if (!ref) return;
618
+ if (ref.status === "running" && ref.session) {
618
619
  await ref.session.abort({ reason: USER_INTERRUPT_LABEL });
619
620
  }
620
- await AgentLifecycleManager.global().release(agentId);
621
+ await AgentLifecycleManager.global().release(agentId, ref);
621
622
  };
622
623
  kill().catch(fail);
623
624
  break;
@@ -15,15 +15,24 @@ export default class Bench extends Command {
15
15
  };
16
16
 
17
17
  static flags = {
18
- runs: Flags.integer({ description: "Requests per model (results are averaged)", default: 10 }),
19
- "max-tokens": Flags.integer({ description: "Max output tokens per request", default: 512 }),
18
+ runs: Flags.integer({ description: "Requests per model (results are averaged; default: 10)" }),
19
+ "max-tokens": Flags.integer({ description: "Max output tokens per request (default: 512; cache mode: 64)" }),
20
20
  prompt: Flags.string({ description: "Custom prompt text (default: bundled bench prompt)" }),
21
21
  "service-tier": Flags.string({
22
22
  description: "Service tier applied per model family (default: configured `tier.*` settings; `none` omits it)",
23
23
  options: SERVICE_TIER_OPENAI_VALUES,
24
24
  }),
25
25
  json: Flags.boolean({ description: "Output JSON" }),
26
- par: Flags.integer({ description: "Execute runs with N parallel queries/requests", default: 4 }),
26
+ par: Flags.integer({ description: "Execute runs with N parallel queries/requests (default: 4)" }),
27
+ cache: Flags.boolean({
28
+ description: "Run independent cold/warm prompt-cache pairs (not supported for openai-codex-responses)",
29
+ }),
30
+ "cache-prefix-file": Flags.string({ description: "Stable prompt prefix file for --cache" }),
31
+ "cache-prefix-bytes": Flags.integer({ description: "Stable prefix byte budget for --cache (default: 8192)" }),
32
+ "cache-pairs": Flags.integer({ description: "Cold/warm pairs per model for --cache (default: 1)" }),
33
+ "cache-concurrency": Flags.integer({
34
+ description: "Concurrent cache pairs for --cache; each pair remains sequential (default: 1)",
35
+ }),
27
36
  };
28
37
 
29
38
  static examples = [
@@ -31,7 +40,7 @@ export default class Bench extends Command {
31
40
  "# Fuzzy selectors work\n omp bench opus sonnet",
32
41
  "# Average over 3 runs each\n omp bench opus gpt-5.2 --runs 3",
33
42
  "# Force priority serving tier\n omp bench openai-codex/gpt-5.5:low --runs 10 --service-tier priority",
34
- "# Machine-readable output\n omp bench opus --json",
43
+ "# Measure one cold/warm prompt-cache pair\n omp bench openai/gpt-5.6 --cache --json",
35
44
  ];
36
45
 
37
46
  async run(): Promise<void> {
@@ -45,6 +54,11 @@ export default class Bench extends Command {
45
54
  serviceTier: flags["service-tier"],
46
55
  json: flags.json,
47
56
  par: flags.par,
57
+ cache: flags.cache,
58
+ cachePrefixFile: flags["cache-prefix-file"],
59
+ cachePrefixBytes: flags["cache-prefix-bytes"],
60
+ cachePairs: flags["cache-pairs"],
61
+ cacheConcurrency: flags["cache-concurrency"],
48
62
  },
49
63
  });
50
64
  }
@@ -83,6 +83,10 @@ export default class Index extends Command {
83
83
  description: "Load an extra config.yml-style overlay for this run (repeatable)",
84
84
  multiple: true,
85
85
  }),
86
+ "add-dir": Flags.string({
87
+ description: "Add a workspace directory beyond the working directory (repeatable)",
88
+ multiple: true,
89
+ }),
86
90
  print: Flags.boolean({
87
91
  char: "p",
88
92
  description: "Non-interactive mode: process prompt and exit",
@@ -65,6 +65,7 @@ const BUILT_IN_DISCOVERY_NON_AUTHORITATIVE_RETRY_MS = 5 * 60 * 1000;
65
65
  import type { ApiKeyResolver, FetchImpl } from "@oh-my-pi/pi-ai";
66
66
  import { registerOAuthProvider, unregisterOAuthProviders } from "@oh-my-pi/pi-ai/oauth";
67
67
  import type { OAuthCredentials, OAuthLoginCallbacks } from "@oh-my-pi/pi-ai/oauth/types";
68
+ import { setCodexAttestationProvider } from "@oh-my-pi/pi-ai/providers/openai-codex-responses";
68
69
  import {
69
70
  getBundledModelReferenceIndex,
70
71
  inheritReferenceThinking,
@@ -72,6 +73,7 @@ import {
72
73
  } from "@oh-my-pi/pi-catalog/identity";
73
74
  import { isBunTestRuntime, isRecord, logger, wrapFetchForExtraCa } from "@oh-my-pi/pi-utils";
74
75
  import { parseModelString, resolveProviderModelReference } from "../config/model-resolver";
76
+ import { generateCodexAttestation } from "../live/attestation";
75
77
  import type { AuthStorage, OAuthCredential } from "../session/auth-storage";
76
78
  import { type ApiKeyResolverModel, type ApiKeyResolverOptions, createApiKeyResolver } from "./api-key-resolver";
77
79
  import type { ConfigError, ConfigFile } from "./config-file";
@@ -90,6 +92,10 @@ import { ModelsConfigFile, type ProviderValidationModel, validateProviderConfigu
90
92
  import type { ModelOverride, ModelsConfig, ProviderAuthMode } from "./models-config-schema";
91
93
  import { settings } from "./settings";
92
94
 
95
+ // DeviceCheck attestation (`x-oai-attestation`) for ChatGPT-OAuth Codex
96
+ // requests; the pi-ai provider resolves it just-in-time per request.
97
+ setCodexAttestationProvider(generateCodexAttestation);
98
+
93
99
  export const kNoAuth = "N/A";
94
100
 
95
101
  export function isAuthenticated(apiKey: string | undefined | null): apiKey is string {
@@ -2171,13 +2177,21 @@ export class ModelRegistry {
2171
2177
  /**
2172
2178
  * Get API key for a model.
2173
2179
  */
2174
- async getApiKey(model: Model<Api>, sessionId?: string): Promise<string | undefined> {
2180
+ async getApiKey(
2181
+ model: Model<Api>,
2182
+ sessionId?: string,
2183
+ options?: { signal?: AbortSignal },
2184
+ ): Promise<string | undefined> {
2175
2185
  const commandKey = this.#resolveCommandBackedApiKey(model.provider);
2176
2186
  if (commandKey.configured) return commandKey.value;
2177
2187
  if (this.#keylessProviders.has(model.provider) && !this.authStorage.hasAuth(model.provider)) {
2178
2188
  return kNoAuth;
2179
2189
  }
2180
- return this.authStorage.getApiKey(model.provider, sessionId, { baseUrl: model.baseUrl, modelId: model.id });
2190
+ return this.authStorage.getApiKey(model.provider, sessionId, {
2191
+ baseUrl: model.baseUrl,
2192
+ modelId: model.id,
2193
+ signal: options?.signal,
2194
+ });
2181
2195
  }
2182
2196
 
2183
2197
  /**
@@ -73,8 +73,19 @@ export const OpenAICompatSchema = type({
73
73
  "whenThinking?": OpenAICompatFieldsSchema,
74
74
  });
75
75
 
76
+ const BedrockCompatSchema = type({
77
+ "promptCacheMode?": '"none" | "automatic" | "explicit"',
78
+ "supportsLongPromptCacheRetention?": "boolean",
79
+ "promptCacheMinimumTokens?": "number >= 0",
80
+ "promptCacheMaximumCheckpoints?": "number >= 0",
81
+ });
82
+
83
+ // Provider-level overrides can target bundled models whose API is not repeated
84
+ // in models.yml, so preserve the sparse compat shape for each supported API.
85
+ const ApiCompatSchema = OpenAICompatSchema.and(BedrockCompatSchema);
86
+
76
87
  const ApiSchema = type(
77
- '"openai-completions" | "openai-responses" | "openai-codex-responses" | "azure-openai-responses" | "anthropic-messages" | "google-generative-ai" | "google-gemini-cli" | "google-vertex"',
88
+ '"openai-completions" | "openai-responses" | "openai-codex-responses" | "azure-openai-responses" | "anthropic-messages" | "bedrock-converse-stream" | "google-generative-ai" | "google-gemini-cli" | "google-vertex"',
78
89
  );
79
90
 
80
91
  const EffortSchema = type('"minimal" | "low" | "medium" | "high" | "xhigh" | "max"');
@@ -173,7 +184,7 @@ const ModelDefinitionSchema = type({
173
184
  "maxTokens?": "number",
174
185
  "omitMaxOutputTokens?": "boolean",
175
186
  "headers?": { "[string]": "string" },
176
- "compat?": OpenAICompatSchema,
187
+ "compat?": ApiCompatSchema,
177
188
  "contextPromotionTarget?": "string",
178
189
  "compactionModel?": "string",
179
190
  "remoteCompaction?": RemoteCompactionSchema,
@@ -222,7 +233,7 @@ export const ModelOverrideSchema = type({
222
233
  "maxTokens?": "number",
223
234
  "omitMaxOutputTokens?": "boolean",
224
235
  "headers?": { "[string]": "string" },
225
- "compat?": OpenAICompatSchema,
236
+ "compat?": ApiCompatSchema,
226
237
  "contextPromotionTarget?": "string",
227
238
  "compactionModel?": "string",
228
239
  "remoteCompaction?": RemoteCompactionSchema,
@@ -263,7 +274,7 @@ const ProviderConfigSchema = type({
263
274
  "apiKey?": "string",
264
275
  "api?": ApiSchema,
265
276
  "headers?": { "[string]": "string" },
266
- "compat?": OpenAICompatSchema,
277
+ "compat?": ApiCompatSchema,
267
278
  "remoteCompaction?": RemoteCompactionSchema,
268
279
  "authHeader?": "boolean",
269
280
  "auth?": ProviderAuthSchema,
@@ -1,10 +1,10 @@
1
- import * as imageGen from "../tools/image-gen";
1
+ import { setImageProviderOrder } from "../tools/image-gen";
2
2
  import * as webSearch from "../web/search";
3
3
 
4
4
  interface ProviderGlobalSettings {
5
+ get(path: "providers.webSearchOrder"): unknown;
5
6
  get(path: "providers.webSearchExclude"): unknown;
6
- get(path: "providers.webSearch"): unknown;
7
- get(path: "providers.image"): unknown;
7
+ get(path: "providers.imageOrder"): unknown;
8
8
  }
9
9
 
10
10
  export function applyProviderGlobalsFromSettings(settings: ProviderGlobalSettings): void {
@@ -13,13 +13,13 @@ export function applyProviderGlobalsFromSettings(settings: ProviderGlobalSetting
13
13
  webSearch.setExcludedSearchProviders(excludedWebSearchProviders.filter(webSearch.isSearchProviderId));
14
14
  }
15
15
 
16
- const webSearchProvider = settings.get("providers.webSearch");
17
- if (typeof webSearchProvider === "string" && webSearch.isSearchProviderPreference(webSearchProvider)) {
18
- webSearch.setPreferredSearchProvider(webSearchProvider);
16
+ const orderedWebSearchProviders = settings.get("providers.webSearchOrder");
17
+ if (Array.isArray(orderedWebSearchProviders)) {
18
+ webSearch.setSearchProviderOrder(orderedWebSearchProviders.filter(webSearch.isSearchProviderId));
19
19
  }
20
20
 
21
- const imageProvider = settings.get("providers.image");
22
- if (imageGen.isImageProviderPreference(imageProvider)) {
23
- imageGen.setPreferredImageProvider(imageProvider);
21
+ const orderedImageProviders = settings.get("providers.imageOrder");
22
+ if (Array.isArray(orderedImageProviders)) {
23
+ setImageProviderOrder(orderedImageProviders.filter((entry): entry is string => typeof entry === "string"));
24
24
  }
25
25
  }
@@ -1,4 +1,4 @@
1
- import type { ServiceTier, ServiceTierByFamily } from "@oh-my-pi/pi-ai";
1
+ import type { ServiceTier, ServiceTierByFamily, ServiceTierFamily } from "@oh-my-pi/pi-ai";
2
2
  import type { SubmenuOption } from "./settings-schema";
3
3
 
4
4
  /**
@@ -16,6 +16,31 @@ export type ServiceTierOpenAISettingValue = (typeof SERVICE_TIER_OPENAI_VALUES)[
16
16
  export type ServiceTierAnthropicSettingValue = (typeof SERVICE_TIER_ANTHROPIC_VALUES)[number];
17
17
  export type ServiceTierGoogleSettingValue = (typeof SERVICE_TIER_GOOGLE_VALUES)[number];
18
18
 
19
+ /** Whether a runtime value names a provider family with an independent service-tier knob. */
20
+ export function isServiceTierFamily(value: unknown): value is ServiceTierFamily {
21
+ return value === "openai" || value === "anthropic" || value === "google";
22
+ }
23
+
24
+ /** Whether a runtime value is a supported service tier for one provider family. */
25
+ export function isServiceTierForFamily(family: string, tier: unknown): tier is ServiceTier {
26
+ if (typeof tier !== "string" || tier === "none") return false;
27
+ let values: readonly string[];
28
+ switch (family) {
29
+ case "openai":
30
+ values = SERVICE_TIER_OPENAI_VALUES;
31
+ break;
32
+ case "anthropic":
33
+ values = SERVICE_TIER_ANTHROPIC_VALUES;
34
+ break;
35
+ case "google":
36
+ values = SERVICE_TIER_GOOGLE_VALUES;
37
+ break;
38
+ default:
39
+ return false;
40
+ }
41
+ return values.includes(tier);
42
+ }
43
+
19
44
  /**
20
45
  * Inherit-capable single value for the subagent/advisor tiers. The chosen tier
21
46
  * is broadcast across families and applied to whichever family the spawned