pi-agent-zh 17.1.8

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 (1519) hide show
  1. package/CHANGELOG.md +14459 -0
  2. package/README.md +35 -0
  3. package/dist/CHANGELOG-vt8ene9g.md +14459 -0
  4. package/dist/cli.js +22079 -0
  5. package/dist/template-dys3vk5b.js +1671 -0
  6. package/dist/template-f8wx9vfn.css +1355 -0
  7. package/dist/template-qat058wr.html +55 -0
  8. package/dist/tool-views.generated-jdfmzwmn.js +35 -0
  9. package/examples/README.md +21 -0
  10. package/examples/custom-tools/README.md +104 -0
  11. package/examples/custom-tools/hello/index.ts +20 -0
  12. package/examples/extensions/README.md +142 -0
  13. package/examples/extensions/api-demo.ts +79 -0
  14. package/examples/extensions/chalk-logger.ts +25 -0
  15. package/examples/extensions/hello.ts +31 -0
  16. package/examples/extensions/pirate.ts +43 -0
  17. package/examples/extensions/plan-mode.ts +549 -0
  18. package/examples/extensions/reload-runtime.ts +38 -0
  19. package/examples/extensions/thinking-note.ts +13 -0
  20. package/examples/extensions/tools.ts +145 -0
  21. package/examples/extensions/with-deps/index.ts +36 -0
  22. package/examples/extensions/with-deps/package-lock.json +31 -0
  23. package/examples/extensions/with-deps/package.json +17 -0
  24. package/examples/hooks/README.md +56 -0
  25. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  26. package/examples/hooks/confirm-destructive.ts +58 -0
  27. package/examples/hooks/custom-compaction.ts +115 -0
  28. package/examples/hooks/dirty-repo-guard.ts +51 -0
  29. package/examples/hooks/file-trigger.ts +40 -0
  30. package/examples/hooks/git-checkpoint.ts +52 -0
  31. package/examples/hooks/handoff.ts +149 -0
  32. package/examples/hooks/permission-gate.ts +33 -0
  33. package/examples/hooks/protected-paths.ts +29 -0
  34. package/examples/hooks/qna.ts +118 -0
  35. package/examples/hooks/status-line.ts +39 -0
  36. package/examples/sdk/01-minimal.ts +21 -0
  37. package/examples/sdk/02-custom-model.ts +49 -0
  38. package/examples/sdk/03-custom-prompt.ts +46 -0
  39. package/examples/sdk/04-skills.ts +43 -0
  40. package/examples/sdk/06-extensions.ts +82 -0
  41. package/examples/sdk/06-hooks.ts +61 -0
  42. package/examples/sdk/07-context-files.ts +35 -0
  43. package/examples/sdk/08-prompt-templates.ts +41 -0
  44. package/examples/sdk/08-slash-commands.ts +46 -0
  45. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  46. package/examples/sdk/11-sessions.ts +47 -0
  47. package/examples/sdk/12-redis-sessions.ts +54 -0
  48. package/examples/sdk/13-sql-sessions.ts +61 -0
  49. package/examples/sdk/README.md +169 -0
  50. package/package.json +606 -0
  51. package/scripts/bench-guard.ts +71 -0
  52. package/scripts/bench-title-models.ts +332 -0
  53. package/scripts/build-binary.ts +117 -0
  54. package/scripts/bundle-dist.ts +133 -0
  55. package/scripts/compile-binary.ts +69 -0
  56. package/scripts/embed-mupdf-wasm.ts +67 -0
  57. package/scripts/format-prompts.ts +68 -0
  58. package/scripts/generate-aria-snapshot.ts +134 -0
  59. package/scripts/generate-docs-index.ts +58 -0
  60. package/scripts/generate-share-viewer.ts +34 -0
  61. package/scripts/legacy-pi-virtual-module.ts +195 -0
  62. package/scripts/measure-prompt-tokens.ts +63 -0
  63. package/scripts/omp +42 -0
  64. package/scripts/omp.ts +19 -0
  65. package/src/advisor/advise-tool.ts +216 -0
  66. package/src/advisor/config.ts +341 -0
  67. package/src/advisor/emission-guard.ts +172 -0
  68. package/src/advisor/index.ts +6 -0
  69. package/src/advisor/runtime.ts +1232 -0
  70. package/src/advisor/transcript-recorder.ts +159 -0
  71. package/src/advisor/watchdog.ts +135 -0
  72. package/src/async/index.ts +1 -0
  73. package/src/async/job-manager.ts +821 -0
  74. package/src/auto-thinking/classifier.ts +182 -0
  75. package/src/autolearn/controller.ts +152 -0
  76. package/src/autolearn/managed-skills.ts +255 -0
  77. package/src/autoresearch/command-resume.md +14 -0
  78. package/src/autoresearch/dashboard.ts +436 -0
  79. package/src/autoresearch/git.ts +331 -0
  80. package/src/autoresearch/helpers.ts +218 -0
  81. package/src/autoresearch/index.ts +541 -0
  82. package/src/autoresearch/prompt-setup.md +43 -0
  83. package/src/autoresearch/prompt.md +103 -0
  84. package/src/autoresearch/resume-message.md +10 -0
  85. package/src/autoresearch/state.ts +273 -0
  86. package/src/autoresearch/storage.ts +700 -0
  87. package/src/autoresearch/tools/init-experiment.ts +269 -0
  88. package/src/autoresearch/tools/log-experiment.ts +521 -0
  89. package/src/autoresearch/tools/run-experiment.ts +407 -0
  90. package/src/autoresearch/tools/update-notes.ts +109 -0
  91. package/src/autoresearch/types.ts +168 -0
  92. package/src/capability/context-file.ts +44 -0
  93. package/src/capability/extension-module.ts +34 -0
  94. package/src/capability/extension.ts +47 -0
  95. package/src/capability/fs.ts +117 -0
  96. package/src/capability/hook.ts +40 -0
  97. package/src/capability/index.ts +467 -0
  98. package/src/capability/instruction.ts +37 -0
  99. package/src/capability/mcp.ts +97 -0
  100. package/src/capability/prompt.ts +35 -0
  101. package/src/capability/rule-buckets.ts +66 -0
  102. package/src/capability/rule.ts +298 -0
  103. package/src/capability/settings.ts +34 -0
  104. package/src/capability/skill.ts +63 -0
  105. package/src/capability/slash-command.ts +40 -0
  106. package/src/capability/ssh.ts +41 -0
  107. package/src/capability/system-prompt.ts +34 -0
  108. package/src/capability/tool.ts +38 -0
  109. package/src/capability/types.ts +187 -0
  110. package/src/cleanse/agent.ts +226 -0
  111. package/src/cleanse/balance.ts +79 -0
  112. package/src/cleanse/checkers.ts +996 -0
  113. package/src/cleanse/index.ts +190 -0
  114. package/src/cleanse/loop.ts +51 -0
  115. package/src/cleanse/parsers.ts +726 -0
  116. package/src/cleanse/progress.ts +50 -0
  117. package/src/cleanse/prompts/assignment.md +47 -0
  118. package/src/cleanse/types.ts +72 -0
  119. package/src/cli/agents-cli.ts +138 -0
  120. package/src/cli/args.ts +420 -0
  121. package/src/cli/auth-broker-cli.ts +940 -0
  122. package/src/cli/auth-gateway-cli.ts +674 -0
  123. package/src/cli/bench-cli.ts +990 -0
  124. package/src/cli/classify-install-target.ts +76 -0
  125. package/src/cli/claude-trace-cli.ts +795 -0
  126. package/src/cli/commands/init-xdg.ts +27 -0
  127. package/src/cli/completion-gen.ts +550 -0
  128. package/src/cli/config-cli.ts +459 -0
  129. package/src/cli/dry-balance-cli.ts +864 -0
  130. package/src/cli/extension-flags.ts +48 -0
  131. package/src/cli/file-processor.ts +132 -0
  132. package/src/cli/flag-tables.ts +352 -0
  133. package/src/cli/gallery-cli.ts +272 -0
  134. package/src/cli/gallery-fixtures/agentic.ts +420 -0
  135. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  136. package/src/cli/gallery-fixtures/edit.ts +254 -0
  137. package/src/cli/gallery-fixtures/fs.ts +220 -0
  138. package/src/cli/gallery-fixtures/index.ts +40 -0
  139. package/src/cli/gallery-fixtures/interaction.ts +46 -0
  140. package/src/cli/gallery-fixtures/memory.ts +81 -0
  141. package/src/cli/gallery-fixtures/misc.ts +177 -0
  142. package/src/cli/gallery-fixtures/search.ts +135 -0
  143. package/src/cli/gallery-fixtures/shell.ts +241 -0
  144. package/src/cli/gallery-fixtures/types.ts +57 -0
  145. package/src/cli/gallery-fixtures/web.ts +158 -0
  146. package/src/cli/gallery-screenshot.ts +279 -0
  147. package/src/cli/gc-cli.ts +946 -0
  148. package/src/cli/grep-cli.ts +161 -0
  149. package/src/cli/grievances-cli.ts +256 -0
  150. package/src/cli/initial-message.ts +58 -0
  151. package/src/cli/models-cli.ts +388 -0
  152. package/src/cli/plugin-cli.ts +996 -0
  153. package/src/cli/profile-alias.ts +369 -0
  154. package/src/cli/profile-bootstrap.ts +233 -0
  155. package/src/cli/read-cli.ts +99 -0
  156. package/src/cli/session-picker.ts +93 -0
  157. package/src/cli/setup-cli.ts +320 -0
  158. package/src/cli/setup-model-picker.ts +43 -0
  159. package/src/cli/shell-cli.ts +176 -0
  160. package/src/cli/ssh-cli.ts +179 -0
  161. package/src/cli/startup-cwd.ts +58 -0
  162. package/src/cli/stats-cli.ts +229 -0
  163. package/src/cli/tiny-models-cli.ts +153 -0
  164. package/src/cli/ttsr-cli.ts +995 -0
  165. package/src/cli/update-cli.ts +1219 -0
  166. package/src/cli/usage-cli.ts +1084 -0
  167. package/src/cli/usage-error.ts +7 -0
  168. package/src/cli/web-search-cli.ts +144 -0
  169. package/src/cli/worktree-cli.ts +311 -0
  170. package/src/cli-commands.ts +166 -0
  171. package/src/cli.ts +407 -0
  172. package/src/collab/crypto.ts +63 -0
  173. package/src/collab/display-name.ts +13 -0
  174. package/src/collab/guest.ts +731 -0
  175. package/src/collab/host.ts +691 -0
  176. package/src/collab/protocol.ts +296 -0
  177. package/src/collab/relay-client.ts +282 -0
  178. package/src/collab/replication-shrink.ts +111 -0
  179. package/src/commands/acp.ts +33 -0
  180. package/src/commands/agents.ts +57 -0
  181. package/src/commands/auth-broker.ts +99 -0
  182. package/src/commands/auth-gateway.ts +69 -0
  183. package/src/commands/bench.ts +65 -0
  184. package/src/commands/cleanse.ts +45 -0
  185. package/src/commands/commit.ts +46 -0
  186. package/src/commands/complete.ts +66 -0
  187. package/src/commands/completions.ts +60 -0
  188. package/src/commands/config.ts +51 -0
  189. package/src/commands/dry-balance.ts +43 -0
  190. package/src/commands/gallery.ts +60 -0
  191. package/src/commands/gc.ts +46 -0
  192. package/src/commands/grep.ts +48 -0
  193. package/src/commands/grievances.ts +51 -0
  194. package/src/commands/install.ts +107 -0
  195. package/src/commands/join.ts +39 -0
  196. package/src/commands/launch.ts +212 -0
  197. package/src/commands/models.ts +60 -0
  198. package/src/commands/plugin.ts +78 -0
  199. package/src/commands/read.ts +38 -0
  200. package/src/commands/say.ts +145 -0
  201. package/src/commands/setup.ts +67 -0
  202. package/src/commands/shell.ts +29 -0
  203. package/src/commands/ssh.ts +60 -0
  204. package/src/commands/stats.ts +29 -0
  205. package/src/commands/tiny-models.ts +36 -0
  206. package/src/commands/token.ts +164 -0
  207. package/src/commands/ttsr.ts +125 -0
  208. package/src/commands/update.ts +33 -0
  209. package/src/commands/usage.ts +54 -0
  210. package/src/commands/web-search.ts +42 -0
  211. package/src/commands/worktree.ts +62 -0
  212. package/src/commit/agentic/agent.ts +322 -0
  213. package/src/commit/agentic/fallback.ts +96 -0
  214. package/src/commit/agentic/index.ts +382 -0
  215. package/src/commit/agentic/lock-files.ts +107 -0
  216. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  217. package/src/commit/agentic/prompts/session-user.md +25 -0
  218. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  219. package/src/commit/agentic/prompts/system.md +38 -0
  220. package/src/commit/agentic/state.ts +60 -0
  221. package/src/commit/agentic/tools/analyze-file.ts +148 -0
  222. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  223. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  224. package/src/commit/agentic/tools/git-overview.ts +62 -0
  225. package/src/commit/agentic/tools/index.ts +54 -0
  226. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  227. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  228. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  229. package/src/commit/agentic/tools/schemas.ts +11 -0
  230. package/src/commit/agentic/tools/split-commit.ts +241 -0
  231. package/src/commit/agentic/topo-sort.ts +44 -0
  232. package/src/commit/agentic/trivial.ts +51 -0
  233. package/src/commit/agentic/validation.ts +183 -0
  234. package/src/commit/analysis/conventional.ts +64 -0
  235. package/src/commit/analysis/index.ts +4 -0
  236. package/src/commit/analysis/scope.ts +242 -0
  237. package/src/commit/analysis/summary.ts +107 -0
  238. package/src/commit/analysis/validation.ts +66 -0
  239. package/src/commit/changelog/detect.ts +40 -0
  240. package/src/commit/changelog/generate.ts +101 -0
  241. package/src/commit/changelog/index.ts +234 -0
  242. package/src/commit/changelog/parse.ts +44 -0
  243. package/src/commit/cli.ts +85 -0
  244. package/src/commit/git/diff.ts +148 -0
  245. package/src/commit/index.ts +5 -0
  246. package/src/commit/map-reduce/index.ts +69 -0
  247. package/src/commit/map-reduce/map-phase.ts +193 -0
  248. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  249. package/src/commit/map-reduce/utils.ts +9 -0
  250. package/src/commit/message.ts +11 -0
  251. package/src/commit/model-selection.ts +95 -0
  252. package/src/commit/pipeline.ts +243 -0
  253. package/src/commit/prompts/analysis-system.md +148 -0
  254. package/src/commit/prompts/analysis-user.md +38 -0
  255. package/src/commit/prompts/changelog-system.md +50 -0
  256. package/src/commit/prompts/changelog-user.md +18 -0
  257. package/src/commit/prompts/file-observer-system.md +24 -0
  258. package/src/commit/prompts/file-observer-user.md +8 -0
  259. package/src/commit/prompts/reduce-system.md +50 -0
  260. package/src/commit/prompts/reduce-user.md +17 -0
  261. package/src/commit/prompts/summary-retry.md +3 -0
  262. package/src/commit/prompts/summary-system.md +38 -0
  263. package/src/commit/prompts/summary-user.md +13 -0
  264. package/src/commit/prompts/types-description.md +2 -0
  265. package/src/commit/shared-llm.ts +70 -0
  266. package/src/commit/types.ts +118 -0
  267. package/src/commit/utils/exclusions.ts +42 -0
  268. package/src/commit/utils.ts +58 -0
  269. package/src/config/api-key-resolver.ts +81 -0
  270. package/src/config/append-only-context-mode.ts +76 -0
  271. package/src/config/config-file.ts +347 -0
  272. package/src/config/file-lock.ts +164 -0
  273. package/src/config/inline-tool-descriptors-mode.ts +26 -0
  274. package/src/config/keybindings.ts +688 -0
  275. package/src/config/mcp-schema.json +247 -0
  276. package/src/config/model-discovery.ts +999 -0
  277. package/src/config/model-registry.ts +2725 -0
  278. package/src/config/model-resolver.ts +2068 -0
  279. package/src/config/model-roles.ts +113 -0
  280. package/src/config/models-config-schema-bundle.ts +313 -0
  281. package/src/config/models-config-schema.ts +14 -0
  282. package/src/config/models-config.ts +130 -0
  283. package/src/config/prompt-templates.ts +205 -0
  284. package/src/config/provider-globals.ts +25 -0
  285. package/src/config/resolve-config-value.ts +94 -0
  286. package/src/config/service-tier.ts +141 -0
  287. package/src/config/settings-schema.ts +5751 -0
  288. package/src/config/settings.ts +2369 -0
  289. package/src/config.ts +242 -0
  290. package/src/cursor.ts +513 -0
  291. package/src/dap/client.ts +1043 -0
  292. package/src/dap/config.ts +480 -0
  293. package/src/dap/defaults.json +212 -0
  294. package/src/dap/index.ts +4 -0
  295. package/src/dap/session.ts +1841 -0
  296. package/src/dap/types.ts +611 -0
  297. package/src/debug/index.ts +584 -0
  298. package/src/debug/log-formatting.ts +58 -0
  299. package/src/debug/log-viewer.ts +966 -0
  300. package/src/debug/profiler.ts +168 -0
  301. package/src/debug/protocol-probe.ts +267 -0
  302. package/src/debug/raw-sse-buffer.ts +421 -0
  303. package/src/debug/raw-sse.ts +312 -0
  304. package/src/debug/remote-debugger.ts +151 -0
  305. package/src/debug/report-bundle.ts +411 -0
  306. package/src/debug/system-info.ts +111 -0
  307. package/src/debug/terminal-info.ts +124 -0
  308. package/src/discovery/agents-md.ts +67 -0
  309. package/src/discovery/agents.ts +230 -0
  310. package/src/discovery/at-imports.ts +273 -0
  311. package/src/discovery/builtin-defaults.ts +39 -0
  312. package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
  313. package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
  314. package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
  315. package/src/discovery/builtin-rules/go-ioutil.md +37 -0
  316. package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
  317. package/src/discovery/builtin-rules/go-new-expr.md +44 -0
  318. package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
  319. package/src/discovery/builtin-rules/go-range-int.md +45 -0
  320. package/src/discovery/builtin-rules/index.ts +74 -0
  321. package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
  322. package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
  323. package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
  324. package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
  325. package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
  326. package/src/discovery/builtin-rules/rs-result-type.md +20 -0
  327. package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
  328. package/src/discovery/builtin-rules/ts-import-type.md +43 -0
  329. package/src/discovery/builtin-rules/ts-no-any.md +66 -0
  330. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
  331. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
  332. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  333. package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
  334. package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
  335. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  336. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  337. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
  338. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  339. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  340. package/src/discovery/builtin.ts +935 -0
  341. package/src/discovery/claude-plugins.ts +624 -0
  342. package/src/discovery/claude.ts +588 -0
  343. package/src/discovery/cline.ts +83 -0
  344. package/src/discovery/codex.ts +540 -0
  345. package/src/discovery/cursor.ts +220 -0
  346. package/src/discovery/gemini.ts +383 -0
  347. package/src/discovery/github.ts +337 -0
  348. package/src/discovery/helpers.ts +1159 -0
  349. package/src/discovery/index.ts +81 -0
  350. package/src/discovery/mcp-json.ts +172 -0
  351. package/src/discovery/omp-extension-roots.ts +213 -0
  352. package/src/discovery/omp-plugins.ts +387 -0
  353. package/src/discovery/opencode.ts +441 -0
  354. package/src/discovery/plugin-dir-roots.ts +28 -0
  355. package/src/discovery/ssh.ts +153 -0
  356. package/src/discovery/substitute-plugin-root.ts +77 -0
  357. package/src/discovery/vscode.ts +105 -0
  358. package/src/discovery/windsurf.ts +147 -0
  359. package/src/edit/apply-patch/index.ts +87 -0
  360. package/src/edit/apply-patch/parser.ts +174 -0
  361. package/src/edit/diff.ts +999 -0
  362. package/src/edit/file-snapshot-store.ts +148 -0
  363. package/src/edit/hashline/block-resolver.ts +33 -0
  364. package/src/edit/hashline/diff.ts +356 -0
  365. package/src/edit/hashline/execute.ts +280 -0
  366. package/src/edit/hashline/filesystem.ts +223 -0
  367. package/src/edit/hashline/index.ts +5 -0
  368. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  369. package/src/edit/hashline/params.ts +12 -0
  370. package/src/edit/index.ts +676 -0
  371. package/src/edit/modes/apply-patch.lark +19 -0
  372. package/src/edit/modes/apply-patch.ts +53 -0
  373. package/src/edit/modes/patch.ts +1958 -0
  374. package/src/edit/modes/replace.ts +1137 -0
  375. package/src/edit/normalize.ts +345 -0
  376. package/src/edit/notebook.ts +242 -0
  377. package/src/edit/read-file.ts +25 -0
  378. package/src/edit/renderer.ts +998 -0
  379. package/src/edit/snapshot-details.ts +77 -0
  380. package/src/edit/streaming.ts +698 -0
  381. package/src/eval/agent-bridge.ts +224 -0
  382. package/src/eval/backend-helpers.ts +48 -0
  383. package/src/eval/backend.ts +71 -0
  384. package/src/eval/bridge-timeout.ts +62 -0
  385. package/src/eval/budget-bridge.ts +48 -0
  386. package/src/eval/completion-bridge.ts +211 -0
  387. package/src/eval/concurrency-bridge.ts +34 -0
  388. package/src/eval/executor-base.ts +504 -0
  389. package/src/eval/idle-timeout.ts +91 -0
  390. package/src/eval/index.ts +6 -0
  391. package/src/eval/jl/executor.ts +540 -0
  392. package/src/eval/jl/index.ts +54 -0
  393. package/src/eval/jl/kernel.ts +236 -0
  394. package/src/eval/jl/prelude.jl +736 -0
  395. package/src/eval/jl/prelude.ts +3 -0
  396. package/src/eval/jl/runner.jl +666 -0
  397. package/src/eval/jl/runtime.ts +118 -0
  398. package/src/eval/js/context-manager.ts +701 -0
  399. package/src/eval/js/executor.ts +175 -0
  400. package/src/eval/js/index.ts +40 -0
  401. package/src/eval/js/process-entry.ts +31 -0
  402. package/src/eval/js/shared/helpers.ts +170 -0
  403. package/src/eval/js/shared/indirect-eval.ts +30 -0
  404. package/src/eval/js/shared/local-module-loader.ts +364 -0
  405. package/src/eval/js/shared/prelude.ts +2 -0
  406. package/src/eval/js/shared/prelude.txt +294 -0
  407. package/src/eval/js/shared/rewrite-imports.ts +550 -0
  408. package/src/eval/js/shared/runtime.ts +590 -0
  409. package/src/eval/js/shared/types.ts +18 -0
  410. package/src/eval/js/tool-bridge.ts +163 -0
  411. package/src/eval/js/worker-core.ts +380 -0
  412. package/src/eval/js/worker-entry.ts +37 -0
  413. package/src/eval/js/worker-protocol.ts +47 -0
  414. package/src/eval/kernel-base.ts +569 -0
  415. package/src/eval/py/display.ts +71 -0
  416. package/src/eval/py/executor.ts +603 -0
  417. package/src/eval/py/index.ts +57 -0
  418. package/src/eval/py/kernel.ts +234 -0
  419. package/src/eval/py/prelude.py +672 -0
  420. package/src/eval/py/prelude.ts +3 -0
  421. package/src/eval/py/runner.py +1388 -0
  422. package/src/eval/py/runtime.ts +276 -0
  423. package/src/eval/py/spawn-options.ts +139 -0
  424. package/src/eval/py/tool-bridge.ts +181 -0
  425. package/src/eval/rb/executor.ts +504 -0
  426. package/src/eval/rb/index.ts +54 -0
  427. package/src/eval/rb/kernel.ts +231 -0
  428. package/src/eval/rb/prelude.rb +552 -0
  429. package/src/eval/rb/prelude.ts +3 -0
  430. package/src/eval/rb/runner.rb +581 -0
  431. package/src/eval/rb/runtime.ts +132 -0
  432. package/src/eval/runtime-env.ts +104 -0
  433. package/src/eval/session-id.ts +8 -0
  434. package/src/eval/types.ts +48 -0
  435. package/src/exa/index.ts +2 -0
  436. package/src/exa/mcp-client.ts +370 -0
  437. package/src/exa/types.ts +69 -0
  438. package/src/exec/bash-executor.ts +627 -0
  439. package/src/exec/direnv.ts +145 -0
  440. package/src/exec/exec.ts +53 -0
  441. package/src/exec/non-interactive-env.ts +118 -0
  442. package/src/export/custom-share.ts +65 -0
  443. package/src/export/html/args.ts +20 -0
  444. package/src/export/html/index.ts +313 -0
  445. package/src/export/html/share-loader.js +102 -0
  446. package/src/export/html/template.css +1355 -0
  447. package/src/export/html/template.html +55 -0
  448. package/src/export/html/template.js +1671 -0
  449. package/src/export/html/tool-views.generated.js +35 -0
  450. package/src/export/html/vendor/highlight.min.js +1213 -0
  451. package/src/export/html/vendor/marked.min.js +6 -0
  452. package/src/export/html/web-palette.ts +126 -0
  453. package/src/export/share.ts +682 -0
  454. package/src/export/ttsr.ts +590 -0
  455. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  456. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  457. package/src/extensibility/custom-commands/index.ts +2 -0
  458. package/src/extensibility/custom-commands/loader.ts +242 -0
  459. package/src/extensibility/custom-commands/types.ts +119 -0
  460. package/src/extensibility/custom-tools/index.ts +7 -0
  461. package/src/extensibility/custom-tools/loader.ts +301 -0
  462. package/src/extensibility/custom-tools/types.ts +286 -0
  463. package/src/extensibility/custom-tools/wrapper.ts +50 -0
  464. package/src/extensibility/extensions/compact-handler.ts +40 -0
  465. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  466. package/src/extensibility/extensions/index.ts +16 -0
  467. package/src/extensibility/extensions/load-errors.ts +13 -0
  468. package/src/extensibility/extensions/loader.ts +624 -0
  469. package/src/extensibility/extensions/managed-timers.ts +83 -0
  470. package/src/extensibility/extensions/model-api.ts +39 -0
  471. package/src/extensibility/extensions/runner.ts +1209 -0
  472. package/src/extensibility/extensions/types.ts +1526 -0
  473. package/src/extensibility/extensions/wrapper.ts +377 -0
  474. package/src/extensibility/hooks/index.ts +6 -0
  475. package/src/extensibility/hooks/loader.ts +244 -0
  476. package/src/extensibility/hooks/runner.ts +425 -0
  477. package/src/extensibility/hooks/tool-wrapper.ts +124 -0
  478. package/src/extensibility/hooks/types.ts +612 -0
  479. package/src/extensibility/legacy-pi-ai-shim.ts +140 -0
  480. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1384 -0
  481. package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
  482. package/src/extensibility/plugins/bun-git-cache.ts +91 -0
  483. package/src/extensibility/plugins/doctor.ts +65 -0
  484. package/src/extensibility/plugins/git-url.ts +367 -0
  485. package/src/extensibility/plugins/index.ts +9 -0
  486. package/src/extensibility/plugins/installer.ts +201 -0
  487. package/src/extensibility/plugins/legacy-pi-compat.ts +2532 -0
  488. package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
  489. package/src/extensibility/plugins/loader.ts +535 -0
  490. package/src/extensibility/plugins/manager.ts +1142 -0
  491. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  492. package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
  493. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  494. package/src/extensibility/plugins/marketplace/manager.ts +926 -0
  495. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  496. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  497. package/src/extensibility/plugins/marketplace/types.ts +192 -0
  498. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  499. package/src/extensibility/plugins/parser.ts +107 -0
  500. package/src/extensibility/plugins/runtime-config.ts +9 -0
  501. package/src/extensibility/plugins/types.ts +194 -0
  502. package/src/extensibility/session-handler-types.ts +21 -0
  503. package/src/extensibility/shared-events.ts +401 -0
  504. package/src/extensibility/skills.ts +511 -0
  505. package/src/extensibility/slash-commands.ts +131 -0
  506. package/src/extensibility/tool-event-input.ts +80 -0
  507. package/src/extensibility/tool-proxy.ts +28 -0
  508. package/src/extensibility/typebox.ts +958 -0
  509. package/src/extensibility/utils.ts +184 -0
  510. package/src/goals/index.ts +3 -0
  511. package/src/goals/runtime.ts +521 -0
  512. package/src/goals/state.ts +37 -0
  513. package/src/goals/tools/goal-tool.ts +251 -0
  514. package/src/hindsight/backend.ts +354 -0
  515. package/src/hindsight/bank.ts +156 -0
  516. package/src/hindsight/client.ts +680 -0
  517. package/src/hindsight/config.ts +193 -0
  518. package/src/hindsight/content.ts +266 -0
  519. package/src/hindsight/index.ts +8 -0
  520. package/src/hindsight/mental-models.ts +429 -0
  521. package/src/hindsight/seeds.json +32 -0
  522. package/src/hindsight/state.ts +550 -0
  523. package/src/hindsight/transcript.ts +71 -0
  524. package/src/index.ts +66 -0
  525. package/src/internal-urls/agent-protocol.ts +180 -0
  526. package/src/internal-urls/artifact-protocol.ts +151 -0
  527. package/src/internal-urls/docs-index.ts +102 -0
  528. package/src/internal-urls/filesystem-resource.ts +34 -0
  529. package/src/internal-urls/history-protocol.ts +198 -0
  530. package/src/internal-urls/index.ts +27 -0
  531. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  532. package/src/internal-urls/json-query.ts +126 -0
  533. package/src/internal-urls/local-protocol.ts +470 -0
  534. package/src/internal-urls/mcp-protocol.ts +165 -0
  535. package/src/internal-urls/memory-protocol.ts +347 -0
  536. package/src/internal-urls/omp-protocol.ts +94 -0
  537. package/src/internal-urls/parse.ts +103 -0
  538. package/src/internal-urls/registry-helpers.ts +132 -0
  539. package/src/internal-urls/router.ts +150 -0
  540. package/src/internal-urls/rule-protocol.ts +45 -0
  541. package/src/internal-urls/skill-protocol.ts +117 -0
  542. package/src/internal-urls/ssh-protocol.ts +368 -0
  543. package/src/internal-urls/types.ts +196 -0
  544. package/src/internal-urls/vault-protocol.ts +940 -0
  545. package/src/internal-urls/xd-protocol.ts +46 -0
  546. package/src/irc/bus.ts +380 -0
  547. package/src/jsonrpc/message-framing.ts +142 -0
  548. package/src/launch/broker.ts +1134 -0
  549. package/src/launch/client.ts +350 -0
  550. package/src/launch/paths.ts +17 -0
  551. package/src/launch/presence.ts +82 -0
  552. package/src/launch/protocol.ts +396 -0
  553. package/src/launch/spawn-options.ts +17 -0
  554. package/src/launch/terminal-output.ts +46 -0
  555. package/src/lib/xai-http.ts +150 -0
  556. package/src/live/attestation.ts +91 -0
  557. package/src/live/controller.ts +517 -0
  558. package/src/live/prompts/agent-final-message.md +3 -0
  559. package/src/live/prompts/live-instructions.md +23 -0
  560. package/src/live/protocol.ts +233 -0
  561. package/src/live/transport.ts +422 -0
  562. package/src/live/visualizer.ts +214 -0
  563. package/src/live/voices.ts +18 -0
  564. package/src/lsp/client.ts +1429 -0
  565. package/src/lsp/clients/biome-client.ts +263 -0
  566. package/src/lsp/clients/index.ts +50 -0
  567. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  568. package/src/lsp/clients/swiftlint-client.ts +120 -0
  569. package/src/lsp/config.ts +549 -0
  570. package/src/lsp/defaults.json +499 -0
  571. package/src/lsp/deferred-diagnostics.ts +66 -0
  572. package/src/lsp/diagnostics-ledger.ts +51 -0
  573. package/src/lsp/edits.ts +288 -0
  574. package/src/lsp/format-options.ts +119 -0
  575. package/src/lsp/index.ts +2766 -0
  576. package/src/lsp/lspmux.ts +233 -0
  577. package/src/lsp/render.ts +668 -0
  578. package/src/lsp/startup-events.ts +13 -0
  579. package/src/lsp/types.ts +453 -0
  580. package/src/lsp/utils.ts +718 -0
  581. package/src/main.ts +1647 -0
  582. package/src/markit/NOTICE +32 -0
  583. package/src/markit/converters/docx.ts +56 -0
  584. package/src/markit/converters/epub.ts +136 -0
  585. package/src/markit/converters/mammoth.d.ts +24 -0
  586. package/src/markit/converters/pdf/columns.ts +103 -0
  587. package/src/markit/converters/pdf/extract.ts +598 -0
  588. package/src/markit/converters/pdf/grid.ts +780 -0
  589. package/src/markit/converters/pdf/headers.ts +106 -0
  590. package/src/markit/converters/pdf/index.ts +146 -0
  591. package/src/markit/converters/pdf/render.ts +501 -0
  592. package/src/markit/converters/pdf/types.ts +84 -0
  593. package/src/markit/converters/pptx.ts +325 -0
  594. package/src/markit/converters/xlsx.ts +173 -0
  595. package/src/markit/index.ts +2 -0
  596. package/src/markit/registry.ts +59 -0
  597. package/src/markit/types.ts +35 -0
  598. package/src/mcp/client.ts +511 -0
  599. package/src/mcp/config-writer.ts +377 -0
  600. package/src/mcp/config.ts +381 -0
  601. package/src/mcp/index.ts +29 -0
  602. package/src/mcp/json-rpc.ts +122 -0
  603. package/src/mcp/loader.ts +125 -0
  604. package/src/mcp/manager.ts +1419 -0
  605. package/src/mcp/oauth-credentials.ts +104 -0
  606. package/src/mcp/oauth-discovery.ts +587 -0
  607. package/src/mcp/oauth-flow.ts +820 -0
  608. package/src/mcp/render.ts +214 -0
  609. package/src/mcp/smithery-auth.ts +108 -0
  610. package/src/mcp/smithery-connect.ts +154 -0
  611. package/src/mcp/smithery-registry.ts +500 -0
  612. package/src/mcp/startup-events.ts +116 -0
  613. package/src/mcp/timeout.ts +59 -0
  614. package/src/mcp/tool-bridge.ts +691 -0
  615. package/src/mcp/tool-cache.ts +117 -0
  616. package/src/mcp/transports/http.ts +523 -0
  617. package/src/mcp/transports/index.ts +7 -0
  618. package/src/mcp/transports/sse.ts +377 -0
  619. package/src/mcp/transports/stdio.ts +903 -0
  620. package/src/mcp/types.ts +437 -0
  621. package/src/memories/index.ts +1434 -0
  622. package/src/memories/storage.ts +578 -0
  623. package/src/memory-backend/index.ts +18 -0
  624. package/src/memory-backend/local-backend.ts +47 -0
  625. package/src/memory-backend/off-backend.ts +25 -0
  626. package/src/memory-backend/resolve.ts +25 -0
  627. package/src/memory-backend/runtime.ts +66 -0
  628. package/src/memory-backend/tool-names.ts +2 -0
  629. package/src/memory-backend/types.ts +166 -0
  630. package/src/mnemopi/backend.ts +629 -0
  631. package/src/mnemopi/config.ts +267 -0
  632. package/src/mnemopi/embed-client.ts +246 -0
  633. package/src/mnemopi/embed-protocol.ts +35 -0
  634. package/src/mnemopi/embed-worker.ts +114 -0
  635. package/src/mnemopi/index.ts +3 -0
  636. package/src/mnemopi/state.ts +906 -0
  637. package/src/modes/acp/acp-agent.ts +2577 -0
  638. package/src/modes/acp/acp-client-bridge.ts +154 -0
  639. package/src/modes/acp/acp-event-mapper.ts +1084 -0
  640. package/src/modes/acp/acp-mode.ts +48 -0
  641. package/src/modes/acp/index.ts +2 -0
  642. package/src/modes/acp/terminal-auth.ts +37 -0
  643. package/src/modes/components/advisor-config.ts +635 -0
  644. package/src/modes/components/advisor-message.ts +109 -0
  645. package/src/modes/components/agent-dashboard.ts +1252 -0
  646. package/src/modes/components/agent-hub.ts +648 -0
  647. package/src/modes/components/agent-transcript-viewer.ts +649 -0
  648. package/src/modes/components/ask-dialog.ts +975 -0
  649. package/src/modes/components/assistant-message.ts +972 -0
  650. package/src/modes/components/background-tan-message.ts +36 -0
  651. package/src/modes/components/bash-execution.ts +233 -0
  652. package/src/modes/components/bordered-loader.ts +41 -0
  653. package/src/modes/components/btw-panel.ts +124 -0
  654. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  655. package/src/modes/components/chat-block.ts +111 -0
  656. package/src/modes/components/chat-transcript-builder.ts +495 -0
  657. package/src/modes/components/collab-prompt-message.ts +32 -0
  658. package/src/modes/components/compaction-summary-message.ts +221 -0
  659. package/src/modes/components/copy-selector.ts +218 -0
  660. package/src/modes/components/countdown-timer.ts +75 -0
  661. package/src/modes/components/custom-editor.ts +1027 -0
  662. package/src/modes/components/custom-message.ts +70 -0
  663. package/src/modes/components/diff.ts +254 -0
  664. package/src/modes/components/dynamic-border.ts +37 -0
  665. package/src/modes/components/error-banner.ts +33 -0
  666. package/src/modes/components/eval-execution.ts +169 -0
  667. package/src/modes/components/execution-shared.ts +101 -0
  668. package/src/modes/components/extensions/extension-dashboard.ts +492 -0
  669. package/src/modes/components/extensions/extension-list.ts +507 -0
  670. package/src/modes/components/extensions/index.ts +9 -0
  671. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  672. package/src/modes/components/extensions/state-manager.ts +648 -0
  673. package/src/modes/components/extensions/types.ts +186 -0
  674. package/src/modes/components/footer.ts +276 -0
  675. package/src/modes/components/history-search.ts +268 -0
  676. package/src/modes/components/hook-editor.ts +213 -0
  677. package/src/modes/components/hook-input.ts +87 -0
  678. package/src/modes/components/hook-message.ts +67 -0
  679. package/src/modes/components/hook-selector.ts +691 -0
  680. package/src/modes/components/index.ts +42 -0
  681. package/src/modes/components/keybinding-hints.ts +65 -0
  682. package/src/modes/components/late-diagnostics-message.ts +60 -0
  683. package/src/modes/components/login-dialog.ts +197 -0
  684. package/src/modes/components/logout-account-selector.ts +130 -0
  685. package/src/modes/components/mcp-add-wizard.ts +1413 -0
  686. package/src/modes/components/message-frame.ts +98 -0
  687. package/src/modes/components/model-browser.ts +872 -0
  688. package/src/modes/components/model-hub.ts +2011 -0
  689. package/src/modes/components/model-picker.ts +233 -0
  690. package/src/modes/components/move-overlay.ts +293 -0
  691. package/src/modes/components/oauth-selector.ts +474 -0
  692. package/src/modes/components/omfg-panel.ts +141 -0
  693. package/src/modes/components/overlay-box.ts +109 -0
  694. package/src/modes/components/pause-screen.ts +208 -0
  695. package/src/modes/components/plan-review-overlay.ts +1226 -0
  696. package/src/modes/components/plan-toc.ts +138 -0
  697. package/src/modes/components/plugin-selector.ts +100 -0
  698. package/src/modes/components/plugin-settings.ts +745 -0
  699. package/src/modes/components/queue-mode-selector.ts +61 -0
  700. package/src/modes/components/read-tool-group.ts +678 -0
  701. package/src/modes/components/reset-usage-selector.ts +161 -0
  702. package/src/modes/components/segment-track.ts +89 -0
  703. package/src/modes/components/select-list-mouse-routing.ts +35 -0
  704. package/src/modes/components/selector-helpers.ts +129 -0
  705. package/src/modes/components/session-account-selector.ts +62 -0
  706. package/src/modes/components/session-selector.ts +1019 -0
  707. package/src/modes/components/settings-defs.ts +267 -0
  708. package/src/modes/components/settings-selector.ts +1445 -0
  709. package/src/modes/components/show-images-selector.ts +50 -0
  710. package/src/modes/components/skill-message.ts +110 -0
  711. package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
  712. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  713. package/src/modes/components/status-line/component.ts +1516 -0
  714. package/src/modes/components/status-line/context-thresholds.ts +86 -0
  715. package/src/modes/components/status-line/git-utils.ts +42 -0
  716. package/src/modes/components/status-line/index.ts +5 -0
  717. package/src/modes/components/status-line/presets.ts +106 -0
  718. package/src/modes/components/status-line/segments.ts +710 -0
  719. package/src/modes/components/status-line/separators.ts +55 -0
  720. package/src/modes/components/status-line/types.ts +159 -0
  721. package/src/modes/components/theme-selector.ts +68 -0
  722. package/src/modes/components/thinking-selector.ts +57 -0
  723. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  724. package/src/modes/components/tips.txt +26 -0
  725. package/src/modes/components/todo-reminder.ts +43 -0
  726. package/src/modes/components/tool-execution.ts +1356 -0
  727. package/src/modes/components/transcript-container.ts +527 -0
  728. package/src/modes/components/tree-selector.ts +1008 -0
  729. package/src/modes/components/ttsr-notification.ts +123 -0
  730. package/src/modes/components/usage-row.ts +47 -0
  731. package/src/modes/components/user-message-selector.ts +227 -0
  732. package/src/modes/components/user-message.ts +167 -0
  733. package/src/modes/components/visual-truncate.ts +63 -0
  734. package/src/modes/components/welcome.ts +578 -0
  735. package/src/modes/controllers/btw-controller.ts +198 -0
  736. package/src/modes/controllers/command-controller-shared.ts +109 -0
  737. package/src/modes/controllers/command-controller.ts +1993 -0
  738. package/src/modes/controllers/event-controller.ts +1781 -0
  739. package/src/modes/controllers/extension-ui-controller.ts +1242 -0
  740. package/src/modes/controllers/input-controller.ts +2004 -0
  741. package/src/modes/controllers/live-command-controller.ts +260 -0
  742. package/src/modes/controllers/mcp-command-controller.ts +2403 -0
  743. package/src/modes/controllers/omfg-controller.ts +287 -0
  744. package/src/modes/controllers/omfg-rule.ts +647 -0
  745. package/src/modes/controllers/selector-controller.ts +1968 -0
  746. package/src/modes/controllers/session-focus-controller.ts +117 -0
  747. package/src/modes/controllers/ssh-command-controller.ts +385 -0
  748. package/src/modes/controllers/streaming-reveal.ts +399 -0
  749. package/src/modes/controllers/tan-command-controller.ts +229 -0
  750. package/src/modes/controllers/todo-command-controller.ts +487 -0
  751. package/src/modes/controllers/tool-args-reveal.ts +591 -0
  752. package/src/modes/data/emojis.json +1 -0
  753. package/src/modes/emoji-autocomplete.ts +285 -0
  754. package/src/modes/github-ref-autocomplete.ts +75 -0
  755. package/src/modes/gradient-highlight.ts +99 -0
  756. package/src/modes/image-references.ts +137 -0
  757. package/src/modes/index.ts +10 -0
  758. package/src/modes/interactive-mode.ts +4957 -0
  759. package/src/modes/internal-url-autocomplete.ts +158 -0
  760. package/src/modes/loop-limit.ts +192 -0
  761. package/src/modes/magic-keyword-boundary.ts +23 -0
  762. package/src/modes/magic-keywords.ts +42 -0
  763. package/src/modes/markdown-prose.ts +247 -0
  764. package/src/modes/oauth-manual-input.ts +69 -0
  765. package/src/modes/orchestrate.ts +43 -0
  766. package/src/modes/print-mode.ts +265 -0
  767. package/src/modes/prompt-action-autocomplete.ts +322 -0
  768. package/src/modes/queue-input.ts +132 -0
  769. package/src/modes/rpc/host-tools.ts +204 -0
  770. package/src/modes/rpc/host-uris.ts +235 -0
  771. package/src/modes/rpc/rpc-client.ts +1195 -0
  772. package/src/modes/rpc/rpc-frame.ts +316 -0
  773. package/src/modes/rpc/rpc-input.ts +38 -0
  774. package/src/modes/rpc/rpc-messages.ts +127 -0
  775. package/src/modes/rpc/rpc-mode.ts +1504 -0
  776. package/src/modes/rpc/rpc-subagents.ts +265 -0
  777. package/src/modes/rpc/rpc-types.ts +533 -0
  778. package/src/modes/running-subagent-badge.ts +13 -0
  779. package/src/modes/runtime-init.ts +144 -0
  780. package/src/modes/session-observer-registry.ts +218 -0
  781. package/src/modes/session-teardown.ts +82 -0
  782. package/src/modes/setup-version.ts +11 -0
  783. package/src/modes/setup-wizard/index.ts +103 -0
  784. package/src/modes/setup-wizard/lazy.ts +16 -0
  785. package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
  786. package/src/modes/setup-wizard/scenes/model.ts +132 -0
  787. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  788. package/src/modes/setup-wizard/scenes/providers.ts +105 -0
  789. package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
  790. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  791. package/src/modes/setup-wizard/scenes/theme.ts +330 -0
  792. package/src/modes/setup-wizard/scenes/types.ts +65 -0
  793. package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
  794. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  795. package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
  796. package/src/modes/shared.ts +49 -0
  797. package/src/modes/skill-command.ts +91 -0
  798. package/src/modes/theme/dark.json +95 -0
  799. package/src/modes/theme/defaults/alabaster.json +93 -0
  800. package/src/modes/theme/defaults/amethyst.json +96 -0
  801. package/src/modes/theme/defaults/anthracite.json +93 -0
  802. package/src/modes/theme/defaults/basalt.json +91 -0
  803. package/src/modes/theme/defaults/birch.json +95 -0
  804. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  805. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  806. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  807. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  808. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  809. package/src/modes/theme/defaults/dark-copper.json +95 -0
  810. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  811. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  812. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  813. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  814. package/src/modes/theme/defaults/dark-ember.json +95 -0
  815. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  816. package/src/modes/theme/defaults/dark-forest.json +96 -0
  817. package/src/modes/theme/defaults/dark-github.json +105 -0
  818. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  819. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  820. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  821. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  822. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  823. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  824. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  825. package/src/modes/theme/defaults/dark-nord.json +97 -0
  826. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  827. package/src/modes/theme/defaults/dark-one.json +100 -0
  828. package/src/modes/theme/defaults/dark-poimandres.json +143 -0
  829. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  830. package/src/modes/theme/defaults/dark-reef.json +91 -0
  831. package/src/modes/theme/defaults/dark-retro.json +92 -0
  832. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  833. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  834. package/src/modes/theme/defaults/dark-slate.json +95 -0
  835. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  836. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  837. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  838. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  839. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  840. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  841. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  842. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  843. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  844. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  845. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  846. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  847. package/src/modes/theme/defaults/graphite.json +92 -0
  848. package/src/modes/theme/defaults/index.ts +199 -0
  849. package/src/modes/theme/defaults/light-arctic.json +107 -0
  850. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  851. package/src/modes/theme/defaults/light-canyon.json +91 -0
  852. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  853. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  854. package/src/modes/theme/defaults/light-coral.json +95 -0
  855. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  856. package/src/modes/theme/defaults/light-dawn.json +90 -0
  857. package/src/modes/theme/defaults/light-dunes.json +91 -0
  858. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  859. package/src/modes/theme/defaults/light-forest.json +100 -0
  860. package/src/modes/theme/defaults/light-frost.json +95 -0
  861. package/src/modes/theme/defaults/light-github.json +115 -0
  862. package/src/modes/theme/defaults/light-glacier.json +91 -0
  863. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  864. package/src/modes/theme/defaults/light-haze.json +90 -0
  865. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  866. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  867. package/src/modes/theme/defaults/light-lavender.json +95 -0
  868. package/src/modes/theme/defaults/light-meadow.json +91 -0
  869. package/src/modes/theme/defaults/light-mint.json +95 -0
  870. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  871. package/src/modes/theme/defaults/light-ocean.json +99 -0
  872. package/src/modes/theme/defaults/light-one.json +99 -0
  873. package/src/modes/theme/defaults/light-opal.json +91 -0
  874. package/src/modes/theme/defaults/light-orchard.json +91 -0
  875. package/src/modes/theme/defaults/light-paper.json +95 -0
  876. package/src/modes/theme/defaults/light-poimandres.json +143 -0
  877. package/src/modes/theme/defaults/light-prism.json +90 -0
  878. package/src/modes/theme/defaults/light-retro.json +98 -0
  879. package/src/modes/theme/defaults/light-sand.json +95 -0
  880. package/src/modes/theme/defaults/light-savanna.json +91 -0
  881. package/src/modes/theme/defaults/light-solarized.json +102 -0
  882. package/src/modes/theme/defaults/light-soleil.json +90 -0
  883. package/src/modes/theme/defaults/light-sunset.json +99 -0
  884. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  885. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  886. package/src/modes/theme/defaults/light-wetland.json +91 -0
  887. package/src/modes/theme/defaults/light-zenith.json +89 -0
  888. package/src/modes/theme/defaults/limestone.json +94 -0
  889. package/src/modes/theme/defaults/mahogany.json +97 -0
  890. package/src/modes/theme/defaults/marble.json +93 -0
  891. package/src/modes/theme/defaults/obsidian.json +91 -0
  892. package/src/modes/theme/defaults/onyx.json +91 -0
  893. package/src/modes/theme/defaults/pearl.json +93 -0
  894. package/src/modes/theme/defaults/porcelain.json +91 -0
  895. package/src/modes/theme/defaults/quartz.json +96 -0
  896. package/src/modes/theme/defaults/sandstone.json +95 -0
  897. package/src/modes/theme/defaults/titanium.json +90 -0
  898. package/src/modes/theme/light.json +93 -0
  899. package/src/modes/theme/mermaid-cache.ts +92 -0
  900. package/src/modes/theme/shimmer.ts +305 -0
  901. package/src/modes/theme/theme-schema.json +463 -0
  902. package/src/modes/theme/theme.ts +3019 -0
  903. package/src/modes/turn-budget.ts +31 -0
  904. package/src/modes/types.ts +479 -0
  905. package/src/modes/ultrathink.ts +42 -0
  906. package/src/modes/utils/context-usage.ts +518 -0
  907. package/src/modes/utils/copy-targets.ts +378 -0
  908. package/src/modes/utils/hotkeys-markdown.ts +63 -0
  909. package/src/modes/utils/interactive-context-helpers.ts +30 -0
  910. package/src/modes/utils/keybinding-matchers.ts +86 -0
  911. package/src/modes/utils/tools-markdown.ts +31 -0
  912. package/src/modes/utils/transcript-render-helpers.ts +253 -0
  913. package/src/modes/utils/ui-helpers.ts +963 -0
  914. package/src/modes/warp-events.ts +232 -0
  915. package/src/modes/workflow.ts +49 -0
  916. package/src/plan-mode/approved-plan.ts +194 -0
  917. package/src/plan-mode/model-transition.ts +51 -0
  918. package/src/plan-mode/plan-files.ts +40 -0
  919. package/src/plan-mode/plan-handoff.ts +37 -0
  920. package/src/plan-mode/plan-protection.ts +31 -0
  921. package/src/plan-mode/state.ts +6 -0
  922. package/src/priority.json +60 -0
  923. package/src/prompts/advisor/active-repo-watchdog.md +6 -0
  924. package/src/prompts/advisor/advise-tool.md +3 -0
  925. package/src/prompts/advisor/context-files.md +8 -0
  926. package/src/prompts/advisor/system.md +98 -0
  927. package/src/prompts/agents/designer.md +74 -0
  928. package/src/prompts/agents/frontmatter.md +12 -0
  929. package/src/prompts/agents/init.md +33 -0
  930. package/src/prompts/agents/librarian.md +119 -0
  931. package/src/prompts/agents/reviewer.md +139 -0
  932. package/src/prompts/agents/scout.md +58 -0
  933. package/src/prompts/agents/task.md +17 -0
  934. package/src/prompts/bench/cache-prefix-chunk.md +1 -0
  935. package/src/prompts/bench/cache-prefix.md +3 -0
  936. package/src/prompts/bench/cache-suffix.md +1 -0
  937. package/src/prompts/bench.md +6 -0
  938. package/src/prompts/ci-green-request.md +36 -0
  939. package/src/prompts/dry-balance-bench.md +8 -0
  940. package/src/prompts/goals/goal-budget-limit.md +16 -0
  941. package/src/prompts/goals/goal-continuation.md +28 -0
  942. package/src/prompts/goals/goal-mode-active.md +23 -0
  943. package/src/prompts/goals/goal-mode-context.md +4 -0
  944. package/src/prompts/goals/goal-todo-context.md +12 -0
  945. package/src/prompts/goals/guided-goal-interview.md +43 -0
  946. package/src/prompts/memories/consolidation.md +30 -0
  947. package/src/prompts/memories/consolidation_system.md +4 -0
  948. package/src/prompts/memories/read-path.md +17 -0
  949. package/src/prompts/memories/stage_one_input.md +6 -0
  950. package/src/prompts/memories/stage_one_system.md +21 -0
  951. package/src/prompts/review-custom-request.md +21 -0
  952. package/src/prompts/review-headless-request.md +16 -0
  953. package/src/prompts/review-request.md +68 -0
  954. package/src/prompts/skills/autoload.md +8 -0
  955. package/src/prompts/skills/user-invocation.md +11 -0
  956. package/src/prompts/steering/parent-irc.md +5 -0
  957. package/src/prompts/steering/user-interjection.md +6 -0
  958. package/src/prompts/system/active-repo-context.md +4 -0
  959. package/src/prompts/system/agent-creation-architect.md +50 -0
  960. package/src/prompts/system/agent-creation-user.md +6 -0
  961. package/src/prompts/system/auto-continue.md +1 -0
  962. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  963. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  964. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  965. package/src/prompts/system/autolearn-guidance.md +7 -0
  966. package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
  967. package/src/prompts/system/background-tan-dispatch.md +8 -0
  968. package/src/prompts/system/btw-user.md +8 -0
  969. package/src/prompts/system/commit-message-system.md +14 -0
  970. package/src/prompts/system/computer-safety.md +14 -0
  971. package/src/prompts/system/custom-system-prompt.md +64 -0
  972. package/src/prompts/system/eager-task.md +7 -0
  973. package/src/prompts/system/eager-todo.md +18 -0
  974. package/src/prompts/system/empty-stop-retry.md +4 -0
  975. package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
  976. package/src/prompts/system/interrupted-thinking.md +7 -0
  977. package/src/prompts/system/irc-autoreply.md +6 -0
  978. package/src/prompts/system/irc-incoming.md +9 -0
  979. package/src/prompts/system/manual-continue.md +7 -0
  980. package/src/prompts/system/mcp-xdev-guidance.md +11 -0
  981. package/src/prompts/system/memory-consolidation-system.md +8 -0
  982. package/src/prompts/system/memory-extraction-system.md +26 -0
  983. package/src/prompts/system/mid-run-todo-nudge.md +3 -0
  984. package/src/prompts/system/omfg-user.md +50 -0
  985. package/src/prompts/system/orchestrate-notice.md +40 -0
  986. package/src/prompts/system/personalities/default.md +18 -0
  987. package/src/prompts/system/personalities/friendly.md +17 -0
  988. package/src/prompts/system/personalities/pragmatic.md +15 -0
  989. package/src/prompts/system/plan-mode-active.md +125 -0
  990. package/src/prompts/system/plan-mode-approved.md +22 -0
  991. package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
  992. package/src/prompts/system/plan-mode-reference.md +10 -0
  993. package/src/prompts/system/plan-mode-subagent.md +33 -0
  994. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  995. package/src/prompts/system/plan-yolo-handoff.md +5 -0
  996. package/src/prompts/system/prewalk-checklist.md +7 -0
  997. package/src/prompts/system/prewalk-continue.md +1 -0
  998. package/src/prompts/system/prewalk-plan.md +13 -0
  999. package/src/prompts/system/project-prompt.md +61 -0
  1000. package/src/prompts/system/recap-user.md +9 -0
  1001. package/src/prompts/system/resolve-device-reminder.md +3 -0
  1002. package/src/prompts/system/rewind-report.md +6 -0
  1003. package/src/prompts/system/side-channel-no-tools.md +3 -0
  1004. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  1005. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  1006. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  1007. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  1008. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  1009. package/src/prompts/system/speech-rewrite.md +15 -0
  1010. package/src/prompts/system/subagent-async-pending.md +6 -0
  1011. package/src/prompts/system/subagent-system-prompt.md +73 -0
  1012. package/src/prompts/system/subagent-user-prompt.md +3 -0
  1013. package/src/prompts/system/subagent-yield-reminder.md +23 -0
  1014. package/src/prompts/system/system-prompt.md +283 -0
  1015. package/src/prompts/system/tan-context-switch.md +17 -0
  1016. package/src/prompts/system/task-label.md +23 -0
  1017. package/src/prompts/system/thinking-loop-redirect.md +10 -0
  1018. package/src/prompts/system/title-marker-instruction.md +1 -0
  1019. package/src/prompts/system/title-system.md +16 -0
  1020. package/src/prompts/system/tool-call-loop-redirect.md +8 -0
  1021. package/src/prompts/system/ttsr-interrupt.md +7 -0
  1022. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  1023. package/src/prompts/system/ultrathink-notice.md +3 -0
  1024. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  1025. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  1026. package/src/prompts/system/vibe-mode-active.md +26 -0
  1027. package/src/prompts/system/web-search.md +25 -0
  1028. package/src/prompts/system/workflow-notice.md +112 -0
  1029. package/src/prompts/system/xdev-mount-notice.md +20 -0
  1030. package/src/prompts/tools/apply-patch.md +65 -0
  1031. package/src/prompts/tools/ask.md +22 -0
  1032. package/src/prompts/tools/ast-edit.md +11 -0
  1033. package/src/prompts/tools/ast-grep.md +19 -0
  1034. package/src/prompts/tools/async-result.md +8 -0
  1035. package/src/prompts/tools/bash.md +25 -0
  1036. package/src/prompts/tools/browser.md +28 -0
  1037. package/src/prompts/tools/checkpoint.md +15 -0
  1038. package/src/prompts/tools/computer.md +26 -0
  1039. package/src/prompts/tools/debug.md +3 -0
  1040. package/src/prompts/tools/eval.md +45 -0
  1041. package/src/prompts/tools/github.md +22 -0
  1042. package/src/prompts/tools/glob.md +15 -0
  1043. package/src/prompts/tools/goal.md +11 -0
  1044. package/src/prompts/tools/grep.md +12 -0
  1045. package/src/prompts/tools/hub.md +34 -0
  1046. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  1047. package/src/prompts/tools/image-attachment-describe.md +10 -0
  1048. package/src/prompts/tools/image-gen.md +7 -0
  1049. package/src/prompts/tools/inspect-image-system.md +20 -0
  1050. package/src/prompts/tools/inspect-image.md +22 -0
  1051. package/src/prompts/tools/learn.md +7 -0
  1052. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  1053. package/src/prompts/tools/lsp.md +19 -0
  1054. package/src/prompts/tools/manage-skill.md +9 -0
  1055. package/src/prompts/tools/memory-edit.md +12 -0
  1056. package/src/prompts/tools/patch.md +57 -0
  1057. package/src/prompts/tools/read.md +27 -0
  1058. package/src/prompts/tools/recall.md +7 -0
  1059. package/src/prompts/tools/reflect.md +5 -0
  1060. package/src/prompts/tools/replace.md +29 -0
  1061. package/src/prompts/tools/retain.md +6 -0
  1062. package/src/prompts/tools/rewind.md +14 -0
  1063. package/src/prompts/tools/task-async-contract.md +1 -0
  1064. package/src/prompts/tools/task-summary.md +20 -0
  1065. package/src/prompts/tools/task.md +83 -0
  1066. package/src/prompts/tools/todo.md +42 -0
  1067. package/src/prompts/tools/vibe-kill.md +3 -0
  1068. package/src/prompts/tools/vibe-list.md +3 -0
  1069. package/src/prompts/tools/vibe-send.md +9 -0
  1070. package/src/prompts/tools/vibe-spawn.md +10 -0
  1071. package/src/prompts/tools/vibe-turn-result.md +19 -0
  1072. package/src/prompts/tools/vibe-wait.md +8 -0
  1073. package/src/prompts/tools/web-search.md +8 -0
  1074. package/src/prompts/tools/write.md +14 -0
  1075. package/src/registry/agent-lifecycle.ts +455 -0
  1076. package/src/registry/agent-registry.ts +217 -0
  1077. package/src/registry/persisted-agents.ts +98 -0
  1078. package/src/sdk.ts +3553 -0
  1079. package/src/secrets/index.ts +246 -0
  1080. package/src/secrets/obfuscator.ts +2574 -0
  1081. package/src/secrets/regex.ts +21 -0
  1082. package/src/session/acp-permission-gate.ts +165 -0
  1083. package/src/session/agent-session-events.ts +66 -0
  1084. package/src/session/agent-session-types.ts +346 -0
  1085. package/src/session/agent-session.ts +8406 -0
  1086. package/src/session/agent-storage.ts +805 -0
  1087. package/src/session/artifacts.ts +154 -0
  1088. package/src/session/async-job-delivery.ts +82 -0
  1089. package/src/session/auth-broker-config.ts +92 -0
  1090. package/src/session/auth-storage.ts +25 -0
  1091. package/src/session/bash-runner.ts +326 -0
  1092. package/src/session/blob-store.ts +295 -0
  1093. package/src/session/checkpoint-entries.ts +81 -0
  1094. package/src/session/client-bridge.ts +85 -0
  1095. package/src/session/codex-auto-reset.ts +202 -0
  1096. package/src/session/compact-modes.ts +105 -0
  1097. package/src/session/eval-runner.ts +217 -0
  1098. package/src/session/exit-diagnostics.ts +310 -0
  1099. package/src/session/history-storage.ts +327 -0
  1100. package/src/session/indexed-session-storage.ts +544 -0
  1101. package/src/session/irc-bridge.ts +203 -0
  1102. package/src/session/messages.ts +1280 -0
  1103. package/src/session/model-controls.ts +750 -0
  1104. package/src/session/prewalk.ts +257 -0
  1105. package/src/session/provider-image-budget.ts +86 -0
  1106. package/src/session/queued-messages.ts +99 -0
  1107. package/src/session/redis-session-storage.ts +257 -0
  1108. package/src/session/retry-fallback-chains.ts +455 -0
  1109. package/src/session/role-models.ts +85 -0
  1110. package/src/session/session-advisors.ts +1754 -0
  1111. package/src/session/session-context.ts +554 -0
  1112. package/src/session/session-dump-format.ts +216 -0
  1113. package/src/session/session-entries.ts +260 -0
  1114. package/src/session/session-handoff.ts +308 -0
  1115. package/src/session/session-history-format.ts +459 -0
  1116. package/src/session/session-listing.ts +715 -0
  1117. package/src/session/session-loader.ts +280 -0
  1118. package/src/session/session-maintenance.ts +2983 -0
  1119. package/src/session/session-manager.ts +2557 -0
  1120. package/src/session/session-memory.ts +222 -0
  1121. package/src/session/session-metadata.ts +53 -0
  1122. package/src/session/session-migrations.ts +78 -0
  1123. package/src/session/session-paths.ts +222 -0
  1124. package/src/session/session-persistence.ts +293 -0
  1125. package/src/session/session-provider-boundary.ts +306 -0
  1126. package/src/session/session-stats.ts +293 -0
  1127. package/src/session/session-storage.ts +734 -0
  1128. package/src/session/session-title-slot.ts +141 -0
  1129. package/src/session/session-tools.ts +1226 -0
  1130. package/src/session/session-workspace.ts +53 -0
  1131. package/src/session/settings-stream-fn.ts +74 -0
  1132. package/src/session/shake-types.ts +43 -0
  1133. package/src/session/snapcompact-inline.ts +545 -0
  1134. package/src/session/snapcompact-savings-journal.ts +113 -0
  1135. package/src/session/sql-session-storage.ts +374 -0
  1136. package/src/session/stream-guards.ts +417 -0
  1137. package/src/session/streaming-output.ts +1459 -0
  1138. package/src/session/todo-tracker.ts +380 -0
  1139. package/src/session/tool-choice-queue.ts +305 -0
  1140. package/src/session/ttsr-coordinator.ts +496 -0
  1141. package/src/session/turn-persistence.ts +142 -0
  1142. package/src/session/turn-recovery.ts +1728 -0
  1143. package/src/session/unexpected-stop-classifier.ts +132 -0
  1144. package/src/session/yield-queue.ts +183 -0
  1145. package/src/slash-commands/acp-builtins.ts +70 -0
  1146. package/src/slash-commands/available-commands.ts +105 -0
  1147. package/src/slash-commands/builtin-registry.ts +2982 -0
  1148. package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
  1149. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  1150. package/src/slash-commands/helpers/context-report.ts +66 -0
  1151. package/src/slash-commands/helpers/format.ts +46 -0
  1152. package/src/slash-commands/helpers/logout.ts +108 -0
  1153. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  1154. package/src/slash-commands/helpers/mcp.ts +533 -0
  1155. package/src/slash-commands/helpers/parse.ts +85 -0
  1156. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  1157. package/src/slash-commands/helpers/session-pin.ts +44 -0
  1158. package/src/slash-commands/helpers/ssh.ts +196 -0
  1159. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  1160. package/src/slash-commands/helpers/todo.ts +285 -0
  1161. package/src/slash-commands/helpers/usage-report.ts +198 -0
  1162. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1163. package/src/slash-commands/types.ts +139 -0
  1164. package/src/ssh/config-writer.ts +183 -0
  1165. package/src/ssh/connection-manager.ts +667 -0
  1166. package/src/ssh/file-transfer.ts +214 -0
  1167. package/src/ssh/sshfs-mount.ts +163 -0
  1168. package/src/ssh/utils.ts +51 -0
  1169. package/src/startup-splash.ts +19 -0
  1170. package/src/stt/asr-client.ts +401 -0
  1171. package/src/stt/asr-protocol.ts +65 -0
  1172. package/src/stt/asr-worker.ts +603 -0
  1173. package/src/stt/downloader.ts +142 -0
  1174. package/src/stt/endpointer.ts +259 -0
  1175. package/src/stt/index.ts +6 -0
  1176. package/src/stt/models.ts +150 -0
  1177. package/src/stt/sherpa-runtime.ts +71 -0
  1178. package/src/stt/stt-controller.ts +320 -0
  1179. package/src/stt/submit-trigger.ts +74 -0
  1180. package/src/subprocess/worker-client.ts +463 -0
  1181. package/src/subprocess/worker-runtime.ts +494 -0
  1182. package/src/system-prompt.ts +894 -0
  1183. package/src/task/agents.ts +168 -0
  1184. package/src/task/commands.ts +132 -0
  1185. package/src/task/discovery.ts +145 -0
  1186. package/src/task/executor.ts +3129 -0
  1187. package/src/task/index.ts +1519 -0
  1188. package/src/task/isolation-ownership.ts +106 -0
  1189. package/src/task/isolation-runner.ts +413 -0
  1190. package/src/task/label.ts +40 -0
  1191. package/src/task/name-generator.ts +1577 -0
  1192. package/src/task/omp-command.ts +26 -0
  1193. package/src/task/output-manager.ts +115 -0
  1194. package/src/task/parallel.ts +221 -0
  1195. package/src/task/persisted-revive.ts +141 -0
  1196. package/src/task/prewalk.ts +6 -0
  1197. package/src/task/prompt-policy.ts +8 -0
  1198. package/src/task/provider-concurrency.ts +100 -0
  1199. package/src/task/render.ts +1814 -0
  1200. package/src/task/renderer.ts +14 -0
  1201. package/src/task/repair-args.ts +118 -0
  1202. package/src/task/spawn-policy.ts +58 -0
  1203. package/src/task/structured-subagent.ts +649 -0
  1204. package/src/task/subprocess-tool-registry.ts +88 -0
  1205. package/src/task/types.ts +551 -0
  1206. package/src/task/worktree.ts +967 -0
  1207. package/src/task/yield-assembly.ts +198 -0
  1208. package/src/telemetry-export.ts +500 -0
  1209. package/src/thinking.ts +364 -0
  1210. package/src/tiny/device.ts +111 -0
  1211. package/src/tiny/dtype.ts +101 -0
  1212. package/src/tiny/message-preproc.ts +155 -0
  1213. package/src/tiny/models.ts +268 -0
  1214. package/src/tiny/text.ts +278 -0
  1215. package/src/tiny/title-client.ts +460 -0
  1216. package/src/tiny/title-protocol.ts +56 -0
  1217. package/src/tiny/worker.ts +354 -0
  1218. package/src/tools/acp-bridge.ts +81 -0
  1219. package/src/tools/approval.ts +245 -0
  1220. package/src/tools/ask.ts +1459 -0
  1221. package/src/tools/ast-edit.ts +718 -0
  1222. package/src/tools/ast-grep.ts +520 -0
  1223. package/src/tools/auto-generated-guard.ts +335 -0
  1224. package/src/tools/bash-interactive.ts +435 -0
  1225. package/src/tools/bash-interceptor.ts +67 -0
  1226. package/src/tools/bash-pty-selection.ts +14 -0
  1227. package/src/tools/bash-skill-urls.ts +335 -0
  1228. package/src/tools/bash.ts +1762 -0
  1229. package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
  1230. package/src/tools/browser/aria/aria-snapshot.ts +131 -0
  1231. package/src/tools/browser/attach.ts +194 -0
  1232. package/src/tools/browser/cmux/cmux-tab.ts +1400 -0
  1233. package/src/tools/browser/cmux/rpc.ts +206 -0
  1234. package/src/tools/browser/cmux/socket-client.ts +445 -0
  1235. package/src/tools/browser/launch.ts +788 -0
  1236. package/src/tools/browser/readable.ts +112 -0
  1237. package/src/tools/browser/registry.ts +287 -0
  1238. package/src/tools/browser/render.ts +226 -0
  1239. package/src/tools/browser/run-cancellation.ts +131 -0
  1240. package/src/tools/browser/run-output.ts +76 -0
  1241. package/src/tools/browser/tab-protocol.ts +115 -0
  1242. package/src/tools/browser/tab-supervisor.ts +1040 -0
  1243. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1244. package/src/tools/browser/tab-worker.ts +1842 -0
  1245. package/src/tools/browser.ts +457 -0
  1246. package/src/tools/builtin-names.ts +66 -0
  1247. package/src/tools/checkpoint.ts +150 -0
  1248. package/src/tools/computer/exposure.ts +38 -0
  1249. package/src/tools/computer/protocol.ts +28 -0
  1250. package/src/tools/computer/supervisor.ts +306 -0
  1251. package/src/tools/computer/worker-entry.ts +34 -0
  1252. package/src/tools/computer/worker.ts +131 -0
  1253. package/src/tools/computer-renderer.ts +108 -0
  1254. package/src/tools/computer.ts +516 -0
  1255. package/src/tools/conflict-detect.ts +815 -0
  1256. package/src/tools/context.ts +46 -0
  1257. package/src/tools/debug.ts +1121 -0
  1258. package/src/tools/default-renderer.ts +139 -0
  1259. package/src/tools/essential-tools.ts +46 -0
  1260. package/src/tools/eval-backends.ts +34 -0
  1261. package/src/tools/eval-format/index.ts +24 -0
  1262. package/src/tools/eval-format/javascript.ts +952 -0
  1263. package/src/tools/eval-format/julia.ts +446 -0
  1264. package/src/tools/eval-format/python.ts +544 -0
  1265. package/src/tools/eval-format/ruby.ts +380 -0
  1266. package/src/tools/eval-render.ts +784 -0
  1267. package/src/tools/eval.ts +774 -0
  1268. package/src/tools/fetch.ts +1889 -0
  1269. package/src/tools/file-recorder.ts +35 -0
  1270. package/src/tools/fs-cache-invalidation.ts +28 -0
  1271. package/src/tools/gh-cache-invalidation.ts +175 -0
  1272. package/src/tools/gh-format.ts +12 -0
  1273. package/src/tools/gh-renderer.ts +484 -0
  1274. package/src/tools/gh.ts +3959 -0
  1275. package/src/tools/github-cache.ts +663 -0
  1276. package/src/tools/glob.ts +682 -0
  1277. package/src/tools/grep.ts +1858 -0
  1278. package/src/tools/grouped-file-output.ts +210 -0
  1279. package/src/tools/hub/index.ts +579 -0
  1280. package/src/tools/hub/jobs.ts +714 -0
  1281. package/src/tools/hub/launch.ts +579 -0
  1282. package/src/tools/hub/messaging.ts +735 -0
  1283. package/src/tools/hub/types.ts +117 -0
  1284. package/src/tools/image-gen.ts +1689 -0
  1285. package/src/tools/image-providers.ts +50 -0
  1286. package/src/tools/index.ts +691 -0
  1287. package/src/tools/inspect-image-renderer.ts +133 -0
  1288. package/src/tools/inspect-image.ts +290 -0
  1289. package/src/tools/json-tree.ts +260 -0
  1290. package/src/tools/jtd-to-json-schema.ts +219 -0
  1291. package/src/tools/jtd-to-typescript.ts +136 -0
  1292. package/src/tools/jtd-utils.ts +102 -0
  1293. package/src/tools/learn.ts +141 -0
  1294. package/src/tools/list-limit.ts +40 -0
  1295. package/src/tools/manage-skill.ts +102 -0
  1296. package/src/tools/match-line-format.ts +20 -0
  1297. package/src/tools/memory-edit.ts +61 -0
  1298. package/src/tools/memory-recall.ts +102 -0
  1299. package/src/tools/memory-reflect.ts +88 -0
  1300. package/src/tools/memory-render.ts +211 -0
  1301. package/src/tools/memory-retain.ts +89 -0
  1302. package/src/tools/output-meta.ts +845 -0
  1303. package/src/tools/output-schema-validator.ts +307 -0
  1304. package/src/tools/path-utils.ts +1381 -0
  1305. package/src/tools/plan-mode-guard.ts +155 -0
  1306. package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
  1307. package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
  1308. package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
  1309. package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
  1310. package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
  1311. package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
  1312. package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
  1313. package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
  1314. package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
  1315. package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
  1316. package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
  1317. package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
  1318. package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
  1319. package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
  1320. package/src/tools/read.ts +3742 -0
  1321. package/src/tools/render-utils.ts +924 -0
  1322. package/src/tools/renderers.ts +133 -0
  1323. package/src/tools/report-tool-issue.ts +568 -0
  1324. package/src/tools/resolve.ts +423 -0
  1325. package/src/tools/review.ts +103 -0
  1326. package/src/tools/shell-tokenize.ts +83 -0
  1327. package/src/tools/sqlite-reader.ts +884 -0
  1328. package/src/tools/terminal-output.ts +141 -0
  1329. package/src/tools/todo.ts +1226 -0
  1330. package/src/tools/tool-errors.ts +62 -0
  1331. package/src/tools/tool-result.ts +102 -0
  1332. package/src/tools/tool-timeouts.ts +37 -0
  1333. package/src/tools/tts.ts +266 -0
  1334. package/src/tools/vibe.ts +607 -0
  1335. package/src/tools/write.ts +1640 -0
  1336. package/src/tools/xdev.ts +508 -0
  1337. package/src/tools/yield.ts +486 -0
  1338. package/src/tts/downloader.ts +64 -0
  1339. package/src/tts/index.ts +10 -0
  1340. package/src/tts/models.ts +137 -0
  1341. package/src/tts/runtime.ts +21 -0
  1342. package/src/tts/speakable.ts +392 -0
  1343. package/src/tts/speech-enhancer.ts +206 -0
  1344. package/src/tts/streaming-player.ts +120 -0
  1345. package/src/tts/tts-client.ts +475 -0
  1346. package/src/tts/tts-protocol.ts +69 -0
  1347. package/src/tts/tts-worker.ts +434 -0
  1348. package/src/tts/vocalizer.ts +419 -0
  1349. package/src/tts/wav.ts +58 -0
  1350. package/src/tui/code-cell.ts +268 -0
  1351. package/src/tui/file-list.ts +55 -0
  1352. package/src/tui/hyperlink.ts +178 -0
  1353. package/src/tui/index.ts +13 -0
  1354. package/src/tui/output-block.ts +268 -0
  1355. package/src/tui/status-line.ts +54 -0
  1356. package/src/tui/tree-list.ts +172 -0
  1357. package/src/tui/types.ts +15 -0
  1358. package/src/tui/utils.ts +103 -0
  1359. package/src/tui/width-aware-text.ts +58 -0
  1360. package/src/utils/active-repo-context.ts +143 -0
  1361. package/src/utils/block-context.ts +312 -0
  1362. package/src/utils/changelog.ts +232 -0
  1363. package/src/utils/clipboard.ts +327 -0
  1364. package/src/utils/command-args.ts +76 -0
  1365. package/src/utils/commit-message-generator.ts +148 -0
  1366. package/src/utils/cpuprofile.ts +235 -0
  1367. package/src/utils/edit-mode.ts +61 -0
  1368. package/src/utils/enhanced-paste.ts +230 -0
  1369. package/src/utils/event-bus.ts +33 -0
  1370. package/src/utils/external-editor.ts +78 -0
  1371. package/src/utils/fetch-timeout.ts +10 -0
  1372. package/src/utils/file-display-mode.ts +44 -0
  1373. package/src/utils/file-mentions.ts +293 -0
  1374. package/src/utils/git.ts +2425 -0
  1375. package/src/utils/image-loading.ts +231 -0
  1376. package/src/utils/image-resize.ts +420 -0
  1377. package/src/utils/image-vision-fallback.ts +196 -0
  1378. package/src/utils/inspect-image-mode.ts +39 -0
  1379. package/src/utils/ipc.ts +38 -0
  1380. package/src/utils/jj.ts +416 -0
  1381. package/src/utils/lang-from-path.ts +251 -0
  1382. package/src/utils/local-date.ts +7 -0
  1383. package/src/utils/mac-file-urls.applescript +37 -0
  1384. package/src/utils/markit-cache.ts +166 -0
  1385. package/src/utils/markit.ts +223 -0
  1386. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1387. package/src/utils/open.ts +126 -0
  1388. package/src/utils/profile-tree.ts +111 -0
  1389. package/src/utils/prompt-path.ts +3 -0
  1390. package/src/utils/qrcode.ts +535 -0
  1391. package/src/utils/sample-profile.ts +437 -0
  1392. package/src/utils/session-color.ts +142 -0
  1393. package/src/utils/shell-snapshot-fn-env.sh +63 -0
  1394. package/src/utils/shell-snapshot.ts +316 -0
  1395. package/src/utils/sixel.ts +69 -0
  1396. package/src/utils/thinking-display.ts +163 -0
  1397. package/src/utils/title-generator.ts +597 -0
  1398. package/src/utils/token-rate.ts +72 -0
  1399. package/src/utils/tool-choice.ts +63 -0
  1400. package/src/utils/tools-manager.ts +411 -0
  1401. package/src/utils/turndown.ts +83 -0
  1402. package/src/utils/zip.ts +1106 -0
  1403. package/src/vibe/runtime.ts +1540 -0
  1404. package/src/vibe/state.ts +4 -0
  1405. package/src/web/kagi.ts +304 -0
  1406. package/src/web/parallel.ts +354 -0
  1407. package/src/web/scrapers/artifacthub.ts +207 -0
  1408. package/src/web/scrapers/arxiv.ts +83 -0
  1409. package/src/web/scrapers/aur.ts +162 -0
  1410. package/src/web/scrapers/biorxiv.ts +133 -0
  1411. package/src/web/scrapers/bluesky.ts +262 -0
  1412. package/src/web/scrapers/brew.ts +172 -0
  1413. package/src/web/scrapers/cheatsh.ts +68 -0
  1414. package/src/web/scrapers/chocolatey.ts +196 -0
  1415. package/src/web/scrapers/choosealicense.ts +95 -0
  1416. package/src/web/scrapers/cisa-kev.ts +87 -0
  1417. package/src/web/scrapers/clojars.ts +154 -0
  1418. package/src/web/scrapers/coingecko.ts +177 -0
  1419. package/src/web/scrapers/crates-io.ts +97 -0
  1420. package/src/web/scrapers/crossref.ts +136 -0
  1421. package/src/web/scrapers/devto.ts +147 -0
  1422. package/src/web/scrapers/discogs.ts +306 -0
  1423. package/src/web/scrapers/discourse.ts +197 -0
  1424. package/src/web/scrapers/dockerhub.ts +138 -0
  1425. package/src/web/scrapers/docs-rs.ts +663 -0
  1426. package/src/web/scrapers/fdroid.ts +134 -0
  1427. package/src/web/scrapers/firefox-addons.ts +191 -0
  1428. package/src/web/scrapers/flathub.ts +223 -0
  1429. package/src/web/scrapers/github-gist.ts +58 -0
  1430. package/src/web/scrapers/github.ts +800 -0
  1431. package/src/web/scrapers/gitlab.ts +401 -0
  1432. package/src/web/scrapers/go-pkg.ts +266 -0
  1433. package/src/web/scrapers/hackage.ts +140 -0
  1434. package/src/web/scrapers/hackernews.ts +189 -0
  1435. package/src/web/scrapers/hex.ts +105 -0
  1436. package/src/web/scrapers/huggingface.ts +321 -0
  1437. package/src/web/scrapers/iacr.ts +89 -0
  1438. package/src/web/scrapers/index.ts +252 -0
  1439. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1440. package/src/web/scrapers/lemmy.ts +203 -0
  1441. package/src/web/scrapers/lobsters.ts +175 -0
  1442. package/src/web/scrapers/mastodon.ts +292 -0
  1443. package/src/web/scrapers/maven.ts +138 -0
  1444. package/src/web/scrapers/mdn.ts +173 -0
  1445. package/src/web/scrapers/metacpan.ts +222 -0
  1446. package/src/web/scrapers/musicbrainz.ts +250 -0
  1447. package/src/web/scrapers/npm.ts +98 -0
  1448. package/src/web/scrapers/nuget.ts +183 -0
  1449. package/src/web/scrapers/nvd.ts +222 -0
  1450. package/src/web/scrapers/ollama.ts +239 -0
  1451. package/src/web/scrapers/open-vsx.ts +106 -0
  1452. package/src/web/scrapers/opencorporates.ts +292 -0
  1453. package/src/web/scrapers/openlibrary.ts +336 -0
  1454. package/src/web/scrapers/orcid.ts +286 -0
  1455. package/src/web/scrapers/osv.ts +176 -0
  1456. package/src/web/scrapers/packagist.ts +160 -0
  1457. package/src/web/scrapers/pub-dev.ts +143 -0
  1458. package/src/web/scrapers/pubmed.ts +211 -0
  1459. package/src/web/scrapers/pypi.ts +112 -0
  1460. package/src/web/scrapers/rawg.ts +110 -0
  1461. package/src/web/scrapers/readthedocs.ts +120 -0
  1462. package/src/web/scrapers/reddit.ts +95 -0
  1463. package/src/web/scrapers/repology.ts +251 -0
  1464. package/src/web/scrapers/rfc.ts +201 -0
  1465. package/src/web/scrapers/rubygems.ts +103 -0
  1466. package/src/web/scrapers/searchcode.ts +189 -0
  1467. package/src/web/scrapers/sec-edgar.ts +261 -0
  1468. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1469. package/src/web/scrapers/snapcraft.ts +187 -0
  1470. package/src/web/scrapers/sourcegraph.ts +336 -0
  1471. package/src/web/scrapers/spdx.ts +108 -0
  1472. package/src/web/scrapers/spotify.ts +198 -0
  1473. package/src/web/scrapers/stackoverflow.ts +120 -0
  1474. package/src/web/scrapers/terraform.ts +277 -0
  1475. package/src/web/scrapers/tldr.ts +47 -0
  1476. package/src/web/scrapers/twitter.ts +94 -0
  1477. package/src/web/scrapers/types.ts +354 -0
  1478. package/src/web/scrapers/utils.ts +109 -0
  1479. package/src/web/scrapers/vimeo.ts +133 -0
  1480. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1481. package/src/web/scrapers/w3c.ts +156 -0
  1482. package/src/web/scrapers/wikidata.ts +344 -0
  1483. package/src/web/scrapers/wikipedia.ts +84 -0
  1484. package/src/web/scrapers/youtube.ts +325 -0
  1485. package/src/web/search/index.ts +376 -0
  1486. package/src/web/search/provider.ts +272 -0
  1487. package/src/web/search/providers/anthropic.ts +401 -0
  1488. package/src/web/search/providers/base.ts +110 -0
  1489. package/src/web/search/providers/brave.ts +179 -0
  1490. package/src/web/search/providers/browser-headers.ts +109 -0
  1491. package/src/web/search/providers/browser-page.ts +123 -0
  1492. package/src/web/search/providers/codex.ts +749 -0
  1493. package/src/web/search/providers/duckduckgo.ts +213 -0
  1494. package/src/web/search/providers/ecosia.ts +182 -0
  1495. package/src/web/search/providers/exa.ts +511 -0
  1496. package/src/web/search/providers/firecrawl.ts +211 -0
  1497. package/src/web/search/providers/gemini.ts +628 -0
  1498. package/src/web/search/providers/google.ts +194 -0
  1499. package/src/web/search/providers/jina.ts +134 -0
  1500. package/src/web/search/providers/kagi.ts +95 -0
  1501. package/src/web/search/providers/kimi.ts +217 -0
  1502. package/src/web/search/providers/mojeek.ts +219 -0
  1503. package/src/web/search/providers/parallel.ts +182 -0
  1504. package/src/web/search/providers/perplexity-auth.ts +142 -0
  1505. package/src/web/search/providers/perplexity.ts +994 -0
  1506. package/src/web/search/providers/public.ts +199 -0
  1507. package/src/web/search/providers/searxng.ts +461 -0
  1508. package/src/web/search/providers/startpage.ts +219 -0
  1509. package/src/web/search/providers/synthetic.ts +120 -0
  1510. package/src/web/search/providers/tavily.ts +242 -0
  1511. package/src/web/search/providers/tinyfish.ts +164 -0
  1512. package/src/web/search/providers/utils.ts +128 -0
  1513. package/src/web/search/providers/xai.ts +372 -0
  1514. package/src/web/search/providers/zai.ts +437 -0
  1515. package/src/web/search/query.ts +850 -0
  1516. package/src/web/search/render.ts +262 -0
  1517. package/src/web/search/types.ts +507 -0
  1518. package/src/web/search/utils.ts +17 -0
  1519. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1232 @@
1
+ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
2
+ import { estimateTokens } from "@oh-my-pi/pi-agent-core/compaction";
3
+ import type { AssistantMessage, ImageContent, TextContent } from "@oh-my-pi/pi-ai";
4
+ import * as AIError from "@oh-my-pi/pi-ai/error";
5
+ import { type CursorExecResolvedCarrier, kCursorExecResolved } from "@oh-my-pi/pi-ai/utils/block-symbols";
6
+ import { logger } from "@oh-my-pi/pi-utils";
7
+ import { obfuscateToolArguments, type SecretObfuscator } from "../secrets/obfuscator";
8
+ import {
9
+ formatExecutionSourcePreview,
10
+ formatSessionHistoryMarkdown,
11
+ formatToolResultErrorPreview,
12
+ PRIMARY_CONTEXT_CUSTOM_TYPES,
13
+ } from "../session/session-history-format";
14
+
15
+ /**
16
+ * Minimal slice of `Agent` the runtime drives — satisfied by pi-agent-core
17
+ * `Agent`. `state.error` mirrors `Agent.state.error`: provider/stream failures
18
+ * the loop catches internally never reject `prompt()`, so the runtime reads
19
+ * this field after every prompt to detect a failed turn.
20
+ */
21
+ export interface AdvisorAgent {
22
+ prompt(input: string): Promise<void>;
23
+ abort(reason?: unknown): void;
24
+ reset(): void;
25
+ /**
26
+ * Drop messages appended past `count`. Called after a failed `prompt()` so a
27
+ * retry doesn't replay the failed user batch + synthetic assistant-error
28
+ * turn `Agent.#runLoop` records on its internal state.
29
+ */
30
+ rollbackTo?(count: number): void;
31
+ readonly state: { messages: AgentMessage[]; error?: string };
32
+ }
33
+
34
+ export interface AdvisorRuntimeHost {
35
+ /** Live primary transcript (use `agent.state.messages`). */
36
+ snapshotMessages(): AgentMessage[];
37
+ /** Surface one advice note to the primary (enqueues into the session YieldQueue). */
38
+ enqueueAdvice(note: string, severity?: "nit" | "concern" | "blocker"): void;
39
+ /** Redact primary transcript bytes before they reach the advisor model. */
40
+ obfuscator?: SecretObfuscator;
41
+ /**
42
+ * Pre-prompt context maintenance for the advisor's own append-only context.
43
+ * Promotes the advisor model to a larger sibling when its context nears the
44
+ * window (mirroring the primary's promote-first policy) and resolves `true`
45
+ * when the advisor must clear its own context before sending the current
46
+ * incremental update. The cursor stays at the current primary position: this
47
+ * recovery path must never replay the full primary transcript.
48
+ * Optional: hosts that omit it get no proactive maintenance.
49
+ */
50
+ maintainContext?(incomingTokens: number): Promise<boolean>;
51
+ /**
52
+ * Called immediately before each `agent.prompt(batch)` cycle. Lets the host
53
+ * clear per-update advisor state — currently the one-advise-per-update gate
54
+ * in {@link AdvisorEmissionGuard}, which the host owns because it is the
55
+ * one that routes `advise()` results back to the primary.
56
+ */
57
+ beginAdvisorUpdate?(): void;
58
+ /**
59
+ * Called with the error of every failed advisor turn, before the retry sleep
60
+ * or the dropped-after-3 path. Lets the host apply credential-level remedies
61
+ * and configured model fallback that the advisor loop cannot perform itself.
62
+ * Return `true` after switching models so the same clean batch is retried
63
+ * immediately with a fresh failure budget. `failedMessages` contains the
64
+ * failed prompt's appended turns before rollback. Errors thrown here are
65
+ * logged and swallowed.
66
+ */
67
+ onTurnError?(
68
+ error: unknown,
69
+ failedMessages: readonly AgentMessage[],
70
+ ): Promise<boolean | undefined> | boolean | undefined;
71
+ /** Called after a successful advisor turn so the host can finish fallback lifecycle reporting. */
72
+ onTurnSuccess?(): Promise<void> | void;
73
+ /** Surface a non-recovering advisor failure to the host UI without adding model-visible context. */
74
+ notifyFailure?(error: unknown): void;
75
+ /** Signal that the advisor paused on a quota/rate-limit after host-level
76
+ * recovery (credential switch, fallback chain) declined. Cleared only by
77
+ * an explicit reset (`/new`, config rebuild, session restart). */
78
+ notifyQuotaExhausted?(): void;
79
+ }
80
+
81
+ /**
82
+ * A request rejection that no amount of retrying can fix for this advisor
83
+ * configuration: the provider refuses the model/request shape outright (e.g.
84
+ * "The 'gpt-5.3-codex-spark' model is not supported when using Codex with a
85
+ * ChatGPT account", code=invalid_request_error). Distinct from quota errors,
86
+ * which pause via the dedicated quota path and auto-resume on reset.
87
+ */
88
+ function isPermanentAdvisorError(error: unknown): boolean {
89
+ const message = error instanceof Error ? error.message : String(error);
90
+ return /invalid_request_error|model[_ ]not[_ ]found|is not supported when|does not exist/i.test(message);
91
+ }
92
+
93
+ const ADVISOR_QUARANTINE_PREFIX = "Advisor response quarantined";
94
+
95
+ /** Signals that an advisor response was discarded before it could become model-visible context. */
96
+ export class AdvisorOutputQuarantinedError extends Error {
97
+ constructor(message: string) {
98
+ super(message);
99
+ this.name = "AdvisorOutputQuarantinedError";
100
+ }
101
+ }
102
+
103
+ interface AdvisorOutputHazard {
104
+ label: string;
105
+ pattern: RegExp;
106
+ }
107
+
108
+ const ADVISOR_OUTPUT_ONLY_HAZARDS: readonly AdvisorOutputHazard[] = [
109
+ { label: "account-deletion claim", pattern: /\buser\b.{0,80}\b(?:deleted|erased)\b.{0,80}\baccount\b/i },
110
+ {
111
+ label: "instruction override",
112
+ pattern: /\bignore\s+(?:all\s+)?(?:prior|previous|earlier)\s+(?:user\s+)?instructions\b/i,
113
+ },
114
+ {
115
+ label: "destructive shell command",
116
+ pattern: /\brm\s+(?=(?:-[a-z]+\s*)*-[a-z]*r[a-z]*)(?=(?:-[a-z]+\s*)*-[a-z]*f[a-z]*)(?:-[a-z]+\s*)+/i,
117
+ },
118
+ { label: "denial instruction", pattern: /\bdeny\s+(?:this|it|the\s+request)\s+if\s+(?:asked|questioned)\b/i },
119
+ ];
120
+
121
+ /**
122
+ * Replaces an advisor assistant turn that requested unavailable tools or generated
123
+ * output-only destructive directives with a sanitized error before dispatch.
124
+ *
125
+ * The agent loop records assistant turns before dispatching tools. Without this
126
+ * pre-dispatch rewrite, an advisor hallucination can leave unrelated text in the
127
+ * advisor transcript even though the action itself never executes.
128
+ */
129
+ export function quarantineAdvisorUnsafeOutput(
130
+ message: AssistantMessage,
131
+ availableToolNames: ReadonlySet<string>,
132
+ sourceText = "",
133
+ ): string | undefined {
134
+ const reasons: string[] = [];
135
+ const unavailableToolNames = new Set<string>();
136
+ const generatedParts: string[] = [];
137
+ for (const block of message.content) {
138
+ // Cursor exec-channel native blocks (bash/read/grep/...) are stamped
139
+ // kCursorExecResolved: they already ran server-side through the
140
+ // advisor-scoped CursorExecHandlers bridge, which rejects ungranted
141
+ // tools in-band ("Tool not available") and lets the model self-correct.
142
+ // Quarantining them would discard the legitimate advise emitted in the
143
+ // same turn (issue #5900). The scoped bridge is the grant gate here, not
144
+ // this pre-dispatch check.
145
+ if (
146
+ block.type === "toolCall" &&
147
+ !availableToolNames.has(block.name) &&
148
+ (block as CursorExecResolvedCarrier)[kCursorExecResolved] !== true
149
+ ) {
150
+ unavailableToolNames.add(block.name);
151
+ }
152
+ if (block.type === "toolCall" && block.name === "advise" && typeof block.arguments.note === "string") {
153
+ generatedParts.push(block.arguments.note);
154
+ }
155
+ if (block.type === "text") generatedParts.push(block.text);
156
+ }
157
+ if (unavailableToolNames.size > 0) {
158
+ const names = [...unavailableToolNames].sort();
159
+ const toolLabel = names.length === 1 ? "tool" : "tools";
160
+ reasons.push(`requested unavailable ${toolLabel} ${names.join(", ")}`);
161
+ }
162
+
163
+ const generatedText = generatedParts.join("\n");
164
+ if (generatedText) {
165
+ const labels: string[] = [];
166
+ const matchedLabels: string[] = [];
167
+ for (const hazard of ADVISOR_OUTPUT_ONLY_HAZARDS) {
168
+ if (!hazard.pattern.test(generatedText)) continue;
169
+ matchedLabels.push(hazard.label);
170
+ if (!hazard.pattern.test(sourceText)) labels.push(hazard.label);
171
+ }
172
+ // A transcript can quote a destructive command while the advisor turns it
173
+ // into a new instruction. The output-only override remains sufficient
174
+ // provenance to quarantine that combination.
175
+ if (
176
+ matchedLabels.includes("destructive shell command") &&
177
+ labels.includes("instruction override") &&
178
+ !labels.includes("destructive shell command")
179
+ ) {
180
+ labels.push("destructive shell command");
181
+ }
182
+ if (labels.includes("destructive shell command") || labels.length >= 3) {
183
+ reasons.push(`generated output-only destructive directives: ${labels.join(", ")}`);
184
+ }
185
+ }
186
+
187
+ if (reasons.length === 0) return undefined;
188
+
189
+ const messageText = `${ADVISOR_QUARANTINE_PREFIX}: ${reasons.join("; ")}`;
190
+ message.content = [{ type: "text", text: messageText }];
191
+ message.stopReason = "error";
192
+ message.stopDetails = undefined;
193
+ message.toolCallAbortMessages = undefined;
194
+ message.providerPayload = undefined;
195
+ message.errorMessage = messageText;
196
+ return messageText;
197
+ }
198
+
199
+ /**
200
+ * Builds the provenance text used to decide whether hazardous advisor output was
201
+ * generated by the advisor or came from model-visible primary/tool context.
202
+ */
203
+ export function buildAdvisorQuarantineSourceText(currentInput: string, messages: readonly AgentMessage[]): string {
204
+ const parts: string[] = [];
205
+ if (currentInput) parts.push(currentInput);
206
+ for (const message of messages) {
207
+ if (message.role !== "toolResult") continue;
208
+ for (const block of message.content) {
209
+ if (block.type === "text") parts.push(block.text);
210
+ }
211
+ }
212
+ return parts.join("\n");
213
+ }
214
+ /**
215
+ * Maximum number of late-arrival coalescing rounds in {@link AdvisorRuntime.#collectAndMaintainBatch}.
216
+ * After this many rounds any items still in `#pending` are left for the next drain iteration
217
+ * so a pathologically fast primary + slow `maintainContext` cannot stall dispatch indefinitely.
218
+ */
219
+ const MAX_COALESCE_ROUNDS = 3;
220
+
221
+ /**
222
+ * Consecutive quarantined advisor turns tolerated before the failure is surfaced
223
+ * to the host UI. A quarantine discards the advisor's whole turn before dispatch,
224
+ * so its advice never reaches the primary; one silent re-prime is allowed to
225
+ * recover a one-off hallucination, but a persistent quarantine loop is a real
226
+ * supervision gap the user must see (issue #6661). Reset on any successful turn.
227
+ */
228
+ const MAX_QUARANTINE_RETRIES = 2;
229
+
230
+ const ADVISOR_RENDER_OPTIONS = {
231
+ includeThinking: true,
232
+ includeToolIntent: true,
233
+ watchedRoles: true,
234
+ expandPrimaryContext: true,
235
+ expandEditDiffs: true,
236
+ } as const;
237
+
238
+ interface PendingDelta {
239
+ text: string;
240
+ rawMessages: AgentMessage[];
241
+ renderRevision: number;
242
+ turns: number;
243
+ /** Whether the primary was mid-turn (willContinue:true) when this delta was rendered. */
244
+ wip: boolean;
245
+ overflowRecovery?: boolean;
246
+ }
247
+
248
+ interface CatchupWaiter {
249
+ threshold: number;
250
+ finish: (caughtUp: boolean) => void;
251
+ timer?: NodeJS.Timeout;
252
+ }
253
+
254
+ interface DeliveredMessage {
255
+ message: AgentMessage;
256
+ fingerprint: bigint | undefined;
257
+ }
258
+
259
+ function fingerprintMessage(message: AgentMessage): bigint | undefined {
260
+ try {
261
+ const serialized = JSON.stringify(message);
262
+ if (serialized === undefined) return undefined;
263
+ return Bun.hash.wyhash(serialized);
264
+ } catch {
265
+ return undefined;
266
+ }
267
+ }
268
+
269
+ export class AdvisorRuntime {
270
+ #lastCount = 0;
271
+ /**
272
+ * Delivered prefix identities. References make the normal append-only path
273
+ * allocation-free; fingerprints preserve identity across equivalent clones.
274
+ */
275
+ #deliveredPrefix: DeliveredMessage[] = [];
276
+ /** Last-shown body, keyed by primary-context customType (plan/goal mode rules,
277
+ * approved plan). These prompts are re-injected verbatim every primary turn;
278
+ * this lets {@link #renderDelta} collapse an unchanged copy to a one-line
279
+ * marker so the advisor isn't re-fed the full ~1k-token rules each turn.
280
+ * Cleared on every re-prime/seed and when a failed batch is dropped. */
281
+ #seenContext = new Map<string, string>();
282
+ /** Incremented whenever the advisor loses context so queued raw deltas are re-rendered against fresh dedupe state. */
283
+ #renderRevision = 0;
284
+ /** Regex secret values observed in primary deltas and retained until advisor context resets. */
285
+ #advisorRegexSecretValues = new Set<string>();
286
+ #pending: PendingDelta[] = [];
287
+ #busy = false;
288
+ #backlog = 0;
289
+ #consecutiveFailures = 0;
290
+ #failureNotified = false;
291
+ /** Consecutive quarantined turns since the last success/reset (issue #6661). */
292
+ #consecutiveQuarantines = 0;
293
+ /** Completed 3-failure backlog-drop cycles since the last success/reset. */
294
+ #droppedBacklogs = 0;
295
+ /**
296
+ * Hard stop after repeated drop cycles or a permanent request rejection
297
+ * (e.g. "model not supported"): without it the advisor re-attempts on every
298
+ * new delta forever, and in a shared daemon that unbounded churn burns CPU
299
+ * and starves every hosted session's event loop. Cleared only by an
300
+ * explicit {@link reset} (config rebuild, /new, session restart).
301
+ */
302
+ #halted = false;
303
+ /** True from the moment an advisor turn fails until one succeeds (or an
304
+ * explicit reset/seed). While set, {@link waitForCatchup} resolves
305
+ * immediately: the primary agent NEVER parks on a failing advisor. */
306
+ #failing = false;
307
+ #latestMessages?: AgentMessage[];
308
+ #waiters: CatchupWaiter[] = [];
309
+ /** Bumped by every external {@link reset}/{@link dispose}. A drain iteration
310
+ * captures it before its awaits; a mismatch on resume means a reset aborted
311
+ * the in-flight advisor prompt, so the stale batch is dropped instead of
312
+ * being retried/requeued into the post-reset conversation. */
313
+ #epoch = 0;
314
+ disposed = false;
315
+ /** Quota/rate-limit pause state. When `true`, the advisor stops processing
316
+ * turns and drops new deltas until an explicit {@link reset} clears it
317
+ * (triggered by `/new`, config rebuild, or session restart). There is no
318
+ * timer-based auto-resume: provider quota windows (5h/7d) are far longer
319
+ * than any reasonable timer, and premature retries waste calls and
320
+ * re-trigger the same error. */
321
+ #quotaExhausted = false;
322
+
323
+ constructor(
324
+ private readonly agent: AdvisorAgent,
325
+ private readonly host: AdvisorRuntimeHost,
326
+ private readonly retryDelayMs = 1000,
327
+ ) {}
328
+
329
+ get backlog(): number {
330
+ return this.#backlog;
331
+ }
332
+ get quotaExhausted(): boolean {
333
+ return this.#quotaExhausted;
334
+ }
335
+ get failureNotified(): boolean {
336
+ return this.#failureNotified;
337
+ }
338
+ /** True after the runtime hard-stopped on repeated or permanent failures. */
339
+ get halted(): boolean {
340
+ return this.#halted;
341
+ }
342
+
343
+ /**
344
+ * Called after each primary turn ends. Renders the incremental delta and
345
+ * queues it for the advisor model.
346
+ *
347
+ * @param messages - Live primary transcript snapshot (defaults to `snapshotMessages()`).
348
+ * @param opts.willContinue - When `true` the primary is mid-turn (more tool-call
349
+ * steps will follow). The rendered heading is tagged `[in progress]` so the
350
+ * advisor knows to withhold critique on partial work. The flag is carried on
351
+ * the delta and forwarded to the reprime path so it is never silently dropped.
352
+ */
353
+ onTurnEnd(messages?: AgentMessage[], opts?: { willContinue?: boolean }): void {
354
+ if (this.disposed || this.#quotaExhausted || this.#halted) return;
355
+ const all = messages ?? this.host.snapshotMessages();
356
+ this.#latestMessages = all;
357
+ const wip = opts?.willContinue ?? false;
358
+ let rendered: Omit<PendingDelta, "turns" | "overflowRecovery"> | null = null;
359
+ // #renderDelta advances the cursor/prefix/dedup state before formatting
360
+ // can throw; snapshot them so a formatter bug loses NOTHING — the next
361
+ // turn re-renders this delta (a prefix change mid-render self-heals via
362
+ // the fingerprint scan, at worst costing one full replay).
363
+ const cursorBefore = this.#lastCount;
364
+ const prefixBefore = this.#deliveredPrefix.slice();
365
+ const seenBefore = [...this.#seenContext];
366
+ try {
367
+ rendered = this.#renderDelta(all, wip);
368
+ } catch (err) {
369
+ // A render bug must never propagate into the primary agent's
370
+ // turn-end callback: the advisor skips this delta and stops gating
371
+ // the catch-up wait until a turn succeeds.
372
+ this.#lastCount = cursorBefore;
373
+ this.#deliveredPrefix = prefixBefore;
374
+ this.#seenContext.clear();
375
+ for (const [key, value] of seenBefore) this.#seenContext.set(key, value);
376
+ this.#failing = true;
377
+ this.#wakeAllWaiters();
378
+ logger.warn("advisor delta render failed", { err: String(err) });
379
+ }
380
+ if (rendered) {
381
+ this.#pending.push({ ...rendered, turns: 1 });
382
+ this.#backlog++;
383
+ this.#notifyWaiters();
384
+ void this.#drain();
385
+ }
386
+ }
387
+
388
+ /**
389
+ * Wait until the advisor backlog falls below `threshold`.
390
+ *
391
+ * Returns `false` when the deadline, abort signal, or a runtime failure releases
392
+ * the waiter before the requested backlog was drained.
393
+ */
394
+ waitForCatchup(maxMs: number, threshold: number, signal?: AbortSignal): Promise<boolean> {
395
+ if (
396
+ this.disposed ||
397
+ signal?.aborted ||
398
+ this.#backlog < threshold ||
399
+ this.#quotaExhausted ||
400
+ this.#halted ||
401
+ // An advisor mid-failure/retry must NEVER gate the primary agent:
402
+ // its backlog cannot drain until the retry cycle resolves, and the
403
+ // primary would otherwise park for the full catch-up budget.
404
+ this.#failing
405
+ )
406
+ return Promise.resolve(this.#backlog < threshold);
407
+ const { promise, resolve } = Promise.withResolvers<boolean>();
408
+ let waiter!: CatchupWaiter;
409
+ const finish = (caughtUp: boolean): void => {
410
+ const idx = this.#waiters.indexOf(waiter);
411
+ if (idx >= 0) this.#waiters.splice(idx, 1);
412
+ clearTimeout(waiter.timer);
413
+ signal?.removeEventListener("abort", abort);
414
+ resolve(caughtUp);
415
+ };
416
+ const abort = (): void => finish(false);
417
+ waiter = {
418
+ threshold,
419
+ finish,
420
+ timer: setTimeout(abort, maxMs),
421
+ };
422
+ this.#waiters.push(waiter);
423
+ signal?.addEventListener("abort", abort, { once: true });
424
+ if (signal?.aborted) {
425
+ abort();
426
+ }
427
+ return promise;
428
+ }
429
+
430
+ dispose(): void {
431
+ this.disposed = true;
432
+ this.#epoch++;
433
+ this.#pending = [];
434
+ this.#backlog = 0;
435
+ this.#consecutiveFailures = 0;
436
+ this.#failureNotified = false;
437
+ this.#advisorRegexSecretValues.clear();
438
+ this.#wakeAllWaiters();
439
+ try {
440
+ this.agent.abort("advisor disposed");
441
+ } catch {}
442
+ }
443
+
444
+ #clearSeenContext(): void {
445
+ this.#seenContext.clear();
446
+ this.#advisorRegexSecretValues.clear();
447
+ this.#renderRevision++;
448
+ }
449
+
450
+ #clearAdvisorContextAtCurrentCursor(): void {
451
+ this.#consecutiveFailures = 0;
452
+ this.#clearSeenContext();
453
+ try {
454
+ this.agent.reset();
455
+ } catch {}
456
+ try {
457
+ this.agent.abort("advisor reset");
458
+ } catch {}
459
+ }
460
+
461
+ #resetAdvisorContext(clearBacklog: boolean, wakeWaiters: boolean): void {
462
+ this.#lastCount = 0;
463
+ this.#deliveredPrefix = [];
464
+ this.#pending = [];
465
+ this.#clearAdvisorContextAtCurrentCursor();
466
+ if (clearBacklog) {
467
+ this.#backlog = 0;
468
+ }
469
+ if (wakeWaiters) {
470
+ this.#wakeAllWaiters();
471
+ }
472
+ }
473
+
474
+ /**
475
+ * Account one completed 3-failure backlog-drop cycle. Repeated cycles (or a
476
+ * single permanent request rejection, e.g. "model not supported") hard-stop
477
+ * the runtime: in a shared daemon, unbounded advisor churn re-builds heavy
478
+ * context on every new delta and starves every hosted session's event loop.
479
+ * Only an explicit {@link reset} (config rebuild, /new, restart) resumes.
480
+ */
481
+ #noteDroppedBacklog(error: unknown): void {
482
+ this.#droppedBacklogs++;
483
+ if (this.#droppedBacklogs < 3 && !isPermanentAdvisorError(error)) return;
484
+ this.#halted = true;
485
+ this.#pending = [];
486
+ this.#wakeAllWaiters();
487
+ logger.warn("advisor halted after repeated failures; use /advisor or reload config to re-enable", {
488
+ droppedBacklogs: this.#droppedBacklogs,
489
+ err: String(error),
490
+ });
491
+ }
492
+
493
+ /**
494
+ * Re-prime the advisor after a history rewrite (compaction, session
495
+ * switch/resume, branch). Clears the advisor's own (non-persisted) context
496
+ * and rewinds the cursor to 0 so the NEXT turn replays the full current —
497
+ * post-compaction — transcript, giving the advisor fresh context instead of
498
+ * leaving it blind to everything before the rewrite.
499
+ */
500
+ reset(): void {
501
+ this.#epoch++;
502
+ this.#quotaExhausted = false;
503
+ this.#halted = false;
504
+ this.#failing = false;
505
+ this.#droppedBacklogs = 0;
506
+ this.#consecutiveQuarantines = 0;
507
+ this.#failureNotified = false;
508
+ this.#resetAdvisorContext(true, true);
509
+ }
510
+
511
+ /**
512
+ * Seed the cursor to the current transcript length when the advisor is enabled
513
+ * mid-session. Prevents the next turn from replaying the entire history to the
514
+ * advisor (which would be expensive and likely stale).
515
+ */
516
+ seedTo(count: number): void {
517
+ const messages = this.host.snapshotMessages().slice(0, count);
518
+ this.#lastCount = messages.length;
519
+ this.#deliveredPrefix = messages.map(message => ({
520
+ message,
521
+ fingerprint: fingerprintMessage(message),
522
+ }));
523
+ this.#pending = [];
524
+ this.#backlog = 0;
525
+ this.#consecutiveFailures = 0;
526
+ this.#failing = false;
527
+ this.#droppedBacklogs = 0;
528
+ this.#failureNotified = false;
529
+ this.#clearSeenContext();
530
+ this.#wakeAllWaiters();
531
+ }
532
+
533
+ #formatRawDelta(rawMessages: AgentMessage[], wip = false): string | null {
534
+ const delta = rawMessages
535
+ .filter(message => !(message.role === "custom" && message.customType === "advisor"))
536
+ .map(message => this.#dedupContextMessage(message));
537
+ if (delta.length === 0) return null;
538
+ const obfuscator = this.host.obfuscator;
539
+ let md = formatSessionHistoryMarkdown(delta, ADVISOR_RENDER_OPTIONS);
540
+ if (!md.trim()) return null;
541
+ if (obfuscator?.hasSecrets()) {
542
+ let discoveredNewRegexSecretValue = false;
543
+ const addRegexValues = (text: string): void => {
544
+ for (const secretValue of obfuscator.collectRegexSecretValuesForObfuscation(text)) {
545
+ if (this.#advisorRegexSecretValues.has(secretValue)) continue;
546
+ this.#advisorRegexSecretValues.add(secretValue);
547
+ discoveredNewRegexSecretValue = true;
548
+ }
549
+ };
550
+ for (const message of delta) {
551
+ if (
552
+ message.role === "custom" &&
553
+ PRIMARY_CONTEXT_CUSTOM_TYPES.has(message.customType) &&
554
+ typeof message.content === "string"
555
+ ) {
556
+ addRegexValues(message.content);
557
+ }
558
+ }
559
+ addRegexValues(md);
560
+ scrubAdvisorHistory(obfuscator, this.agent.state.messages, this.#advisorRegexSecretValues);
561
+ if (discoveredNewRegexSecretValue) {
562
+ this.#pending = this.#pending.map(delta => ({
563
+ ...delta,
564
+ text: obfuscator.stripUnsafeFriendlyPlaceholderPrefixes(delta.text, this.#advisorRegexSecretValues),
565
+ }));
566
+ }
567
+ md = formatSessionHistoryMarkdown(
568
+ delta.map(message =>
569
+ message.role === "custom" && PRIMARY_CONTEXT_CUSTOM_TYPES.has(message.customType)
570
+ ? obfuscateAdvisorMessage(obfuscator, message, this.#advisorRegexSecretValues)
571
+ : message,
572
+ ),
573
+ ADVISOR_RENDER_OPTIONS,
574
+ );
575
+ md = obfuscator.obfuscate(md, this.#advisorRegexSecretValues);
576
+ }
577
+ const heading = wip ? "### Session update [in progress — more steps follow]" : "### Session update";
578
+ return `${heading}\n\n${md}`;
579
+ }
580
+
581
+ #renderDelta(messages?: AgentMessage[], wip = false): Omit<PendingDelta, "turns" | "overflowRecovery"> | null {
582
+ const all = messages ?? this.#latestMessages ?? this.host.snapshotMessages();
583
+ let prefixChanged = all.length < this.#lastCount;
584
+ for (let i = 0; !prefixChanged && i < this.#lastCount; i++) {
585
+ const delivered = this.#deliveredPrefix[i];
586
+ const current = all[i];
587
+ if (delivered === undefined || current === undefined) {
588
+ prefixChanged = true;
589
+ break;
590
+ }
591
+ if (delivered.message === current) continue;
592
+ const fingerprint = fingerprintMessage(current);
593
+ if (
594
+ delivered.fingerprint === undefined ||
595
+ fingerprint === undefined ||
596
+ delivered.fingerprint !== fingerprint
597
+ ) {
598
+ prefixChanged = true;
599
+ break;
600
+ }
601
+ delivered.message = current;
602
+ }
603
+ if (prefixChanged) {
604
+ this.#epoch++;
605
+ this.#resetAdvisorContext(true, true);
606
+ }
607
+ const rawMessages = all.slice(this.#lastCount);
608
+ for (let i = this.#lastCount; i < all.length; i++) {
609
+ const message = all[i];
610
+ if (message === undefined) continue;
611
+ this.#deliveredPrefix.push({ message, fingerprint: fingerprintMessage(message) });
612
+ }
613
+ this.#lastCount = all.length;
614
+ const text = this.#formatRawDelta(rawMessages, wip);
615
+ return text ? { text, rawMessages, renderRevision: this.#renderRevision, wip } : null;
616
+ }
617
+
618
+ /**
619
+ * Collapse a re-injected primary-context prompt (plan/goal mode rules, the
620
+ * approved plan) to a short marker when its body is byte-identical to the
621
+ * copy already shown to the advisor since the last re-prime. The primary
622
+ * re-injects these verbatim every turn; without this the advisor re-reads the
623
+ * full rules (~1k tokens) each turn. Returns a CLONE when collapsing — the
624
+ * input shares the live primary transcript and must never be mutated.
625
+ */
626
+ #dedupContextMessage(msg: AgentMessage): AgentMessage {
627
+ if (msg.role !== "custom") return msg;
628
+ // Narrowed to CustomMessage: customType and content are properly typed.
629
+ if (!PRIMARY_CONTEXT_CUSTOM_TYPES.has(msg.customType)) return msg;
630
+ if (typeof msg.content !== "string") return msg;
631
+ if (this.#seenContext.get(msg.customType) === msg.content) {
632
+ return { ...msg, content: "(unchanged — still in effect)" };
633
+ }
634
+ this.#seenContext.set(msg.customType, msg.content);
635
+ return msg;
636
+ }
637
+
638
+ #notifyWaiters(): void {
639
+ for (let i = this.#waiters.length - 1; i >= 0; i--) {
640
+ const w = this.#waiters[i];
641
+ if (this.#backlog < w.threshold) {
642
+ w.finish(true);
643
+ }
644
+ }
645
+ }
646
+
647
+ #wakeAllWaiters(): void {
648
+ for (const w of [...this.#waiters]) {
649
+ w.finish(false);
650
+ }
651
+ }
652
+
653
+ /**
654
+ * Drop the user batch + synthetic assistant-error turn `Agent.#runLoop`
655
+ * appended for a failed prompt so a retry replays a clean baseline and the
656
+ * dropped-after-3 path never leaks orphan failures into the next successful
657
+ * run. Prefers the agent's own `rollbackTo` (which also re-syncs its
658
+ * append-only context); falls back to truncating `state.messages` for tests
659
+ * that hand-roll a minimal facade.
660
+ */
661
+ #rollbackFailedTurn(snapshot: number): void {
662
+ const messages = this.agent.state.messages;
663
+ if (messages.length <= snapshot) return;
664
+ try {
665
+ if (this.agent.rollbackTo) {
666
+ this.agent.rollbackTo(snapshot);
667
+ return;
668
+ }
669
+ messages.length = snapshot;
670
+ } catch (err) {
671
+ logger.debug("advisor rollback failed", { err: String(err) });
672
+ }
673
+ }
674
+
675
+ /**
676
+ * Collect the popped deltas into one batch, running `maintainContext` for
677
+ * correct token budgeting. Loops until the pending queue is stable (no new
678
+ * deltas arrived during a maintenance check) or the round cap is reached.
679
+ * Every `await` inside the loop has an epoch guard so a reset/dispose
680
+ * mid-await cannot leak a stale batch into the post-reset conversation.
681
+ *
682
+ * When maintenance requests recovery, only the advisor Agent/log is reset
683
+ * (at the current primary cursor) and the already-collected raw batch is
684
+ * re-rendered — older, already-delivered primary transcript is never
685
+ * replayed.
686
+ *
687
+ * The coalescing loop is capped at {@link MAX_COALESCE_ROUNDS} iterations so
688
+ * a pathologically fast primary combined with a slow `maintainContext` cannot
689
+ * stall dispatch indefinitely — any items still in `#pending` after the cap
690
+ * are left for the next drain iteration. Overflow-recovery batches skip
691
+ * coalescing entirely: they retry exactly the bounded batch that overflowed.
692
+ *
693
+ * Returns `null` when the epoch was invalidated — caller should `continue`.
694
+ */
695
+ async #collectAndMaintainBatch(
696
+ epoch: number,
697
+ initial: PendingDelta[],
698
+ recoveringOverflow: boolean,
699
+ ): Promise<{
700
+ batch: string | null;
701
+ rawMessages: AgentMessage[];
702
+ finalTurns: number;
703
+ wip: boolean;
704
+ resetContext: boolean;
705
+ } | null> {
706
+ let batchText = initial.map(b => b.text).join("\n\n");
707
+ let rawMessages = initial.flatMap(b => b.rawMessages);
708
+ let turns = initial.reduce((sum, b) => sum + b.turns, 0);
709
+ // Track WIP state of the most recent delta — forwarded to the re-render
710
+ // so a willContinue:true turn keeps its [in progress] heading. Also
711
+ // returned to #drain so the retry-requeue path preserves it on failed turns.
712
+ let wip = initial.at(-1)?.wip ?? false;
713
+
714
+ for (let round = 0; round < MAX_COALESCE_ROUNDS; round++) {
715
+ if (this.host.maintainContext) {
716
+ const incomingTokens = estimateTokens({ role: "user", content: batchText, timestamp: Date.now() });
717
+ let shouldResetContext = false;
718
+ try {
719
+ shouldResetContext = await this.host.maintainContext(incomingTokens);
720
+ } catch (err) {
721
+ logger.debug("advisor context maintenance failed", { err: String(err) });
722
+ }
723
+ // Epoch guard — a reset/dispose during the maintainContext await
724
+ // invalidates this batch.
725
+ if (this.#epoch !== epoch) return null;
726
+
727
+ if (shouldResetContext) {
728
+ // Once coalescing has begun (round > 0), deltas that arrived during
729
+ // this await are part of the coalescing window: tally them so
730
+ // finalTurns stays accurate for backlog accounting and their raw
731
+ // messages join the bounded re-render. On the initial round the
732
+ // popped batch stays bounded exactly as dispatched — later arrivals
733
+ // remain queued and ship as their own subsequent batch.
734
+ if (round > 0) {
735
+ const lateItems = this.#pending.splice(0);
736
+ turns += lateItems.reduce((sum, b) => sum + b.turns, 0);
737
+ if (lateItems.length > 0) {
738
+ wip = lateItems.at(-1)!.wip;
739
+ rawMessages = rawMessages.concat(lateItems.flatMap(b => b.rawMessages));
740
+ }
741
+ }
742
+ // Reset only the advisor Agent/log. The primary cursor, backlog,
743
+ // waiters, latest snapshot, and epoch stay untouched. Re-render only
744
+ // this already-popped raw batch so active plan/reference bodies are
745
+ // restored without replaying any older primary transcript.
746
+ this.#clearAdvisorContextAtCurrentCursor();
747
+ const rerendered = this.#formatRawDelta(rawMessages, wip);
748
+ return {
749
+ batch: rerendered ?? (batchText || null),
750
+ rawMessages,
751
+ finalTurns: turns,
752
+ wip,
753
+ resetContext: true,
754
+ };
755
+ }
756
+ }
757
+
758
+ // Overflow-recovery batches retry exactly the bounded batch that
759
+ // overflowed; pending updates stay queued behind them.
760
+ if (recoveringOverflow) break;
761
+
762
+ // On the final round stop here — any late arrivals would ship without
763
+ // a subsequent maintainContext budget check. Leave them in #pending for
764
+ // the next drain iteration where they will be properly budgeted.
765
+ if (round === MAX_COALESCE_ROUNDS - 1) break;
766
+
767
+ // Coalesce any deltas that arrived while we were awaiting maintenance.
768
+ // If none arrived the batch is stable and we're done; otherwise merge,
769
+ // update WIP state, and re-check the maintenance budget.
770
+ const late = this.#pending.splice(0);
771
+ if (late.length === 0) break;
772
+ batchText = [batchText, ...late.map(b => b.text)].join("\n\n");
773
+ rawMessages = rawMessages.concat(late.flatMap(b => b.rawMessages));
774
+ turns += late.reduce((sum, b) => sum + b.turns, 0);
775
+ wip = late.at(-1)!.wip;
776
+ }
777
+
778
+ const batchObfuscator = this.host.obfuscator;
779
+ if (batchObfuscator?.hasSecrets()) {
780
+ batchText = batchObfuscator.stripUnsafeFriendlyPlaceholderPrefixes(batchText, this.#advisorRegexSecretValues);
781
+ }
782
+ return { batch: batchText || null, rawMessages, finalTurns: turns, wip, resetContext: false };
783
+ }
784
+
785
+ #terminalAssistantFailure(snapshot: number): AssistantMessage | undefined {
786
+ const messages = this.agent.state.messages;
787
+ for (let i = messages.length - 1; i >= snapshot; i--) {
788
+ const message = messages[i];
789
+ if (message.role === "assistant" && message.stopReason === "error") return message;
790
+ }
791
+ return undefined;
792
+ }
793
+
794
+ #notifyFailureOnce(error: unknown): void {
795
+ if (this.#failureNotified) return;
796
+ this.#failureNotified = true;
797
+ try {
798
+ this.host.notifyFailure?.(error);
799
+ } catch (notifyErr) {
800
+ logger.warn("advisor failure notification failed", { err: String(notifyErr) });
801
+ }
802
+ }
803
+
804
+ async #drain(): Promise<void> {
805
+ if (this.#busy) return;
806
+ this.#busy = true;
807
+ try {
808
+ while (!this.disposed && this.#pending.length) {
809
+ let popped: PendingDelta[];
810
+ if (this.#pending[0]?.overflowRecovery) {
811
+ const recovery = this.#pending.shift();
812
+ if (!recovery) continue;
813
+ popped = [recovery];
814
+ } else {
815
+ popped = this.#pending.splice(0);
816
+ }
817
+ const epoch = this.#epoch;
818
+ for (const delta of popped) {
819
+ if (delta.renderRevision === this.#renderRevision) continue;
820
+ const refreshed = this.#formatRawDelta(delta.rawMessages, delta.wip);
821
+ if (refreshed) delta.text = refreshed;
822
+ delta.renderRevision = this.#renderRevision;
823
+ }
824
+ const recoveringOverflow = popped.some(delta => delta.overflowRecovery === true);
825
+ const result = await this.#collectAndMaintainBatch(epoch, popped, recoveringOverflow);
826
+
827
+ // Epoch was invalidated during batch collection; restart the loop.
828
+ if (result === null) continue;
829
+
830
+ const { batch, rawMessages, finalTurns, wip, resetContext } = result;
831
+
832
+ if (this.disposed || batch === null) {
833
+ this.#backlog = Math.max(0, this.#backlog - finalTurns);
834
+ this.#notifyWaiters();
835
+ continue;
836
+ }
837
+
838
+ let success = false;
839
+ // Capture the advisor's message count BEFORE the prompt so a failure can
840
+ // roll back the user batch + synthetic assistant-error turn Agent.#runLoop
841
+ // appends to internal state. Without this, a retry would replay the failed
842
+ // batch on top of stale turns and the dropped-after-3 path would leak
843
+ // orphan failures into the next successful run's context.
844
+ const messageSnapshot = this.agent.state.messages.length;
845
+ const contextWasFresh = resetContext || recoveringOverflow || messageSnapshot === 0;
846
+ try {
847
+ // Reset the host's per-update advisor state (one-advise-per-update
848
+ // gate) before each model cycle so the new batch starts fresh.
849
+ this.host.beginAdvisorUpdate?.();
850
+ await this.agent.prompt(batch);
851
+ // Agent.#runLoop catches provider/stream failures internally and
852
+ // resolves prompt() cleanly with stopReason: "error". Treat that
853
+ // as a failed turn so endpoint rejections trip the retry path.
854
+ const promptError = this.agent.state.error;
855
+ if (promptError) throw new Error(promptError);
856
+ // A content-less stop is a deliberate silent review — the documented
857
+ // verifier behavior ("prefer silence when the agent is on track") — and
858
+ // completes the turn. Sessions can legitimately have nothing to advise
859
+ // on for any number of consecutive turns, so silence is never warned
860
+ // about (#5216 did, spamming "Advisor unavailable" at quiet models).
861
+ const turnError = getAdvisorTurnError(this.agent.state.messages.slice(messageSnapshot));
862
+ if (turnError) throw turnError;
863
+ success = true;
864
+ this.#failing = false;
865
+ this.#consecutiveFailures = 0;
866
+ this.#failureNotified = false;
867
+ this.#droppedBacklogs = 0;
868
+ this.#consecutiveQuarantines = 0;
869
+ if (this.host.onTurnSuccess) {
870
+ try {
871
+ await this.host.onTurnSuccess();
872
+ } catch (hookErr) {
873
+ logger.debug("advisor onTurnSuccess hook failed", { err: String(hookErr) });
874
+ }
875
+ }
876
+ } catch (err) {
877
+ // reset()/dispose() aborts the in-flight prompt; treat it as a
878
+ // reset, not a transient failure — drop the stale batch.
879
+ if (this.#epoch !== epoch) continue;
880
+ // Release any parked primary-agent waiters IMMEDIATELY — before
881
+ // the async onTurnError hook or any retry sleep — and refuse new
882
+ // parks until a turn succeeds. A failing advisor must never hold
883
+ // the primary on the catch-up gate.
884
+ this.#failing = true;
885
+ this.#wakeAllWaiters();
886
+ const failedMessages = this.agent.state.messages.slice(messageSnapshot);
887
+ const terminalFailure = this.#terminalAssistantFailure(messageSnapshot);
888
+ const terminalFailureId =
889
+ terminalFailure === undefined ? undefined : AIError.classifyMessage(terminalFailure);
890
+ const contextOverflow =
891
+ (terminalFailureId !== undefined && AIError.is(terminalFailureId, AIError.Flag.ContextOverflow)) ||
892
+ AIError.is(AIError.classify(err), AIError.Flag.ContextOverflow);
893
+ // A terminal provider failure that is neither retriable nor an
894
+ // overflow (e.g. a blocked prompt) will fail identically on every
895
+ // retry — classify it before rollback so the batch is dropped after
896
+ // one attempt instead of burning the 3-attempt budget (#5468).
897
+ const terminalFailureRetriable =
898
+ terminalFailureId === undefined ||
899
+ AIError.retriable(terminalFailureId) ||
900
+ AIError.is(terminalFailureId, AIError.Flag.ContextOverflow);
901
+ this.#rollbackFailedTurn(messageSnapshot);
902
+ logger.debug("advisor turn failed", { err: String(err) });
903
+ let recovered = false;
904
+ try {
905
+ recovered = (await this.host.onTurnError?.(err, failedMessages)) === true;
906
+ } catch (hookErr) {
907
+ logger.debug("advisor onTurnError hook failed", { err: String(hookErr) });
908
+ }
909
+ if (err instanceof AdvisorOutputQuarantinedError) {
910
+ // A quarantine discards the advisor's whole turn before dispatch, so
911
+ // its advice never reaches the primary. One re-prime is allowed to
912
+ // recover a one-off hallucination silently; a persistent quarantine
913
+ // loop is a supervision gap the user must see in the main UI — not an
914
+ // unbounded silent retry. Surface it (deduped by #notifyFailureOnce)
915
+ // and drop the batch to break the loop (issue #6661).
916
+ this.#consecutiveQuarantines++;
917
+ if (this.#consecutiveQuarantines >= MAX_QUARANTINE_RETRIES) {
918
+ this.#notifyFailureOnce(err);
919
+ this.#consecutiveQuarantines = 0;
920
+ this.#resetAdvisorContext(true, true);
921
+ continue;
922
+ }
923
+ const rePrime = this.#pending.length > 0 ? this.#latestMessages : undefined;
924
+ // Wake catchup waiters only when nothing is re-primed; otherwise the
925
+ // re-primed turn restores the backlog and waiters resolve on its completion.
926
+ this.#resetAdvisorContext(true, !rePrime);
927
+ if (rePrime) this.onTurnEnd(rePrime);
928
+ continue;
929
+ }
930
+ // Epoch guard after the async error hook.
931
+ if (this.#epoch !== epoch) continue;
932
+ if (recovered) {
933
+ this.#consecutiveFailures = 0;
934
+ this.#failureNotified = false;
935
+ this.#pending.unshift({
936
+ text: batch,
937
+ rawMessages,
938
+ renderRevision: this.#renderRevision,
939
+ turns: finalTurns,
940
+ wip,
941
+ overflowRecovery: recoveringOverflow || undefined,
942
+ });
943
+ continue;
944
+ }
945
+ if (AIError.isUsageLimit(err)) {
946
+ // Host recovery (credential switch / fallback chain) declined:
947
+ // pause on the quota latch instead of burning retries — provider
948
+ // quota windows (5h/7d) outlast any retry budget. The batch is
949
+ // requeued and the backlog stays visible so reset() replays it.
950
+ logger.warn("advisor quota exhausted", { err: String(err) });
951
+ this.#quotaExhausted = true;
952
+ this.#consecutiveFailures = 0;
953
+ this.#failureNotified = false;
954
+ this.#clearSeenContext();
955
+ this.#pending.unshift({
956
+ text: batch,
957
+ rawMessages,
958
+ renderRevision: this.#renderRevision,
959
+ turns: finalTurns,
960
+ wip,
961
+ overflowRecovery: recoveringOverflow || undefined,
962
+ });
963
+ this.#wakeAllWaiters();
964
+ try {
965
+ this.host.notifyQuotaExhausted?.();
966
+ } catch (notifyErr) {
967
+ logger.warn("advisor quota notification failed", { err: String(notifyErr) });
968
+ }
969
+ break;
970
+ }
971
+ if (!terminalFailureRetriable) {
972
+ logger.warn("advisor terminal failure is non-retriable; dropping bounded batch");
973
+ this.#notifyFailureOnce(err);
974
+ this.#consecutiveFailures = 0;
975
+ // The dropped batch may carry primary-context we never delivered; drop
976
+ // the seen-state too so queued raw deltas re-expand before delivery.
977
+ this.#clearSeenContext();
978
+ this.#noteDroppedBacklog(err);
979
+ success = true;
980
+ } else if (contextOverflow) {
981
+ this.#clearAdvisorContextAtCurrentCursor();
982
+ if (contextWasFresh) {
983
+ // The bounded update cannot fit even with no advisor history. Drop
984
+ // only this batch after its one fresh-context retry; pending and later
985
+ // deltas remain eligible so one oversized update cannot disable the advisor.
986
+ logger.warn("advisor update overflowed a fresh context; dropping bounded batch");
987
+ this.#notifyFailureOnce(err);
988
+ success = true;
989
+ } else {
990
+ // Retry once against the fresh advisor context, using only the same
991
+ // bounded raw batch. Pending updates remain queued behind it.
992
+ const recoveryBatch = this.#formatRawDelta(rawMessages, wip) ?? batch;
993
+ this.#pending.unshift({
994
+ text: recoveryBatch,
995
+ rawMessages,
996
+ renderRevision: this.#renderRevision,
997
+ turns: finalTurns,
998
+ wip,
999
+ overflowRecovery: true,
1000
+ });
1001
+ logger.debug("advisor context overflow recovered at current primary cursor");
1002
+ }
1003
+ } else {
1004
+ this.#consecutiveFailures++;
1005
+ if (this.#consecutiveFailures >= 3) {
1006
+ logger.warn("advisor failed consecutively 3 times; dropping backlog to prevent stall");
1007
+ this.#notifyFailureOnce(err);
1008
+ this.#consecutiveFailures = 0;
1009
+ // The dropped batch may carry primary-context we never delivered; drop
1010
+ // the seen-state too so queued raw deltas re-expand before delivery.
1011
+ this.#clearSeenContext();
1012
+ this.#noteDroppedBacklog(err);
1013
+ success = true;
1014
+ } else {
1015
+ this.#pending.unshift({
1016
+ text: batch,
1017
+ rawMessages,
1018
+ renderRevision: this.#renderRevision,
1019
+ turns: finalTurns,
1020
+ wip,
1021
+ overflowRecovery: recoveringOverflow || undefined,
1022
+ });
1023
+ await Bun.sleep(this.retryDelayMs);
1024
+ }
1025
+ }
1026
+ }
1027
+
1028
+ if (success && this.#epoch === epoch) {
1029
+ this.#backlog = Math.max(0, this.#backlog - finalTurns);
1030
+ this.#notifyWaiters();
1031
+ }
1032
+ }
1033
+ } finally {
1034
+ this.#busy = false;
1035
+ }
1036
+ }
1037
+ }
1038
+
1039
+ /**
1040
+ * The only malformed advisor turn shape: the prompt resolved but produced no
1041
+ * assistant response at all. Everything an assistant message carries — advice,
1042
+ * reasoning, or deliberate silence (empty `stop`) — is a completed review.
1043
+ */
1044
+ function getAdvisorTurnError(messages: readonly AgentMessage[]): Error | undefined {
1045
+ if (messages.length === 0) return undefined;
1046
+ if (messages.some(message => message.role === "assistant")) return undefined;
1047
+ return new Error("Advisor turn ended without an assistant response");
1048
+ }
1049
+
1050
+ type TextualContent = string | readonly (TextContent | ImageContent)[];
1051
+
1052
+ function obfuscateTextualContent(
1053
+ obfuscator: SecretObfuscator,
1054
+ content: TextualContent,
1055
+ sharedRegexSecretValues: ReadonlySet<string>,
1056
+ ): TextualContent {
1057
+ if (typeof content === "string") return obfuscator.obfuscate(content, sharedRegexSecretValues);
1058
+ let changed = false;
1059
+ const result = content.map((block): TextContent | ImageContent => {
1060
+ if (block.type !== "text") return block;
1061
+ const text = obfuscator.obfuscate(block.text, sharedRegexSecretValues);
1062
+ if (text === block.text) return block;
1063
+ changed = true;
1064
+ return { ...block, text };
1065
+ });
1066
+ return changed ? result : content;
1067
+ }
1068
+
1069
+ function firstAdvisorToolResultErrorLine(content: TextualContent): string | undefined {
1070
+ if (typeof content === "string") return content.split("\n", 1)[0];
1071
+ const first = content[0];
1072
+ if (first?.type !== "text") return undefined;
1073
+ return first.text.split("\n", 1)[0];
1074
+ }
1075
+
1076
+ function obfuscateAdvisorToolResultErrorContent(
1077
+ obfuscator: SecretObfuscator,
1078
+ content: TextualContent,
1079
+ sharedRegexSecretValues: ReadonlySet<string>,
1080
+ ): TextualContent {
1081
+ const firstLine = firstAdvisorToolResultErrorLine(content);
1082
+ if (firstLine === undefined) return content;
1083
+ const preview = formatToolResultErrorPreview(content);
1084
+ const obfuscatedPreview = obfuscator.obfuscate(preview, sharedRegexSecretValues);
1085
+ if (obfuscatedPreview === firstLine) return content;
1086
+ if (typeof content === "string") return obfuscatedPreview + content.slice(firstLine.length);
1087
+ const first = content[0]!;
1088
+ if (first.type !== "text") return content;
1089
+ return [{ ...first, text: obfuscatedPreview + first.text.slice(firstLine.length) }, ...content.slice(1)];
1090
+ }
1091
+
1092
+ function obfuscateAssistantMessage(
1093
+ obfuscator: SecretObfuscator,
1094
+ message: AssistantMessage,
1095
+ sharedRegexSecretValues: ReadonlySet<string>,
1096
+ ): AssistantMessage {
1097
+ let changed = false;
1098
+ const content = message.content.map((block): AssistantMessage["content"][number] => {
1099
+ if (block.type === "text") {
1100
+ const text = obfuscator.obfuscate(block.text, sharedRegexSecretValues);
1101
+ if (text === block.text) return block;
1102
+ changed = true;
1103
+ return { ...block, text };
1104
+ }
1105
+ if (block.type === "thinking") {
1106
+ const thinking = obfuscator.obfuscate(block.thinking, sharedRegexSecretValues);
1107
+ if (thinking === block.thinking) return block;
1108
+ changed = true;
1109
+ return { ...block, thinking, thinkingSignature: undefined };
1110
+ }
1111
+ if (block.type === "toolCall") {
1112
+ const args = obfuscateToolArguments(obfuscator, block.arguments, sharedRegexSecretValues);
1113
+ if (args === block.arguments) return block;
1114
+ changed = true;
1115
+ return { ...block, arguments: args };
1116
+ }
1117
+ return block;
1118
+ });
1119
+ return changed ? { ...message, content } : message;
1120
+ }
1121
+
1122
+ function obfuscateDetails(
1123
+ obfuscator: SecretObfuscator,
1124
+ details: Record<string, unknown> | undefined,
1125
+ sharedRegexSecretValues: ReadonlySet<string>,
1126
+ ): Record<string, unknown> | undefined {
1127
+ if (!details) return details;
1128
+ // Walk strings at every depth: `customOneLiner` renders nested fields
1129
+ // (e.g. `async-result` reads `details.jobs[].label`/`jobId`), so a shallow
1130
+ // pass leaks any secret a background job's label happens to contain.
1131
+ return obfuscateToolArguments(obfuscator, details, sharedRegexSecretValues);
1132
+ }
1133
+
1134
+ function obfuscateAdvisorMessage(
1135
+ obfuscator: SecretObfuscator,
1136
+ message: AgentMessage,
1137
+ sharedRegexSecretValues: ReadonlySet<string>,
1138
+ ): AgentMessage {
1139
+ switch (message.role) {
1140
+ case "user":
1141
+ case "developer": {
1142
+ const content = obfuscateTextualContent(
1143
+ obfuscator,
1144
+ message.content as TextualContent,
1145
+ sharedRegexSecretValues,
1146
+ );
1147
+ return content === message.content ? message : ({ ...(message as object), content } as AgentMessage);
1148
+ }
1149
+ case "toolResult": {
1150
+ const msg = message as AgentMessage & {
1151
+ content: TextualContent;
1152
+ details?: Record<string, unknown>;
1153
+ isError?: boolean;
1154
+ };
1155
+ const content = msg.isError
1156
+ ? obfuscateAdvisorToolResultErrorContent(obfuscator, msg.content, sharedRegexSecretValues)
1157
+ : msg.content;
1158
+ let details = msg.details;
1159
+ if (typeof details?.diff === "string") {
1160
+ const diff = obfuscator.obfuscate(details.diff, sharedRegexSecretValues);
1161
+ if (diff !== details.diff) details = { ...details, diff };
1162
+ }
1163
+ if (content === msg.content && details === msg.details) return message;
1164
+ return { ...(message as object), content, details } as AgentMessage;
1165
+ }
1166
+ case "assistant":
1167
+ return obfuscateAssistantMessage(
1168
+ obfuscator,
1169
+ message as AssistantMessage,
1170
+ sharedRegexSecretValues,
1171
+ ) as AgentMessage;
1172
+ case "custom":
1173
+ case "hookMessage": {
1174
+ if (!formatSessionHistoryMarkdown([message], { expandPrimaryContext: true }).trim()) return message;
1175
+ const msg = message as AgentMessage & {
1176
+ content: TextualContent;
1177
+ details?: Record<string, unknown>;
1178
+ };
1179
+ const content = obfuscateTextualContent(obfuscator, msg.content, sharedRegexSecretValues);
1180
+ const details = obfuscateDetails(obfuscator, msg.details, sharedRegexSecretValues);
1181
+ if (content === msg.content && details === msg.details) return message;
1182
+ return { ...(message as object), content, details } as AgentMessage;
1183
+ }
1184
+ case "bashExecution": {
1185
+ const msg = message as AgentMessage & { command: string };
1186
+ const command = obfuscator.obfuscate(formatExecutionSourcePreview(msg.command), sharedRegexSecretValues);
1187
+ return command === msg.command ? message : ({ ...(message as object), command } as AgentMessage);
1188
+ }
1189
+ case "pythonExecution": {
1190
+ const msg = message as AgentMessage & { code: string };
1191
+ const code = obfuscator.obfuscate(formatExecutionSourcePreview(msg.code), sharedRegexSecretValues);
1192
+ return code === msg.code ? message : ({ ...(message as object), code } as AgentMessage);
1193
+ }
1194
+ case "branchSummary": {
1195
+ const msg = message as AgentMessage & { summary: string };
1196
+ const summary = obfuscator.obfuscate(msg.summary, sharedRegexSecretValues);
1197
+ return summary === msg.summary ? message : ({ ...(message as object), summary } as AgentMessage);
1198
+ }
1199
+ case "compactionSummary": {
1200
+ const msg = message as AgentMessage & { summary: string };
1201
+ const summary = obfuscator.obfuscate(msg.summary, sharedRegexSecretValues);
1202
+ return summary === msg.summary ? message : ({ ...(message as object), summary } as AgentMessage);
1203
+ }
1204
+ case "fileMention": {
1205
+ const msg = message as AgentMessage & {
1206
+ files: Array<{ path: string; content: string; image?: unknown }>;
1207
+ };
1208
+ let changed = false;
1209
+ const files = msg.files.map(file => {
1210
+ const path = obfuscator.obfuscate(file.path, sharedRegexSecretValues);
1211
+ if (path === file.path) return file;
1212
+ changed = true;
1213
+ return { ...file, path };
1214
+ });
1215
+ return changed ? ({ ...(message as object), files } as AgentMessage) : message;
1216
+ }
1217
+ default:
1218
+ return message;
1219
+ }
1220
+ }
1221
+
1222
+ function scrubAdvisorHistory(
1223
+ obfuscator: SecretObfuscator,
1224
+ messages: AgentMessage[],
1225
+ sharedRegexSecretValues: ReadonlySet<string>,
1226
+ ): void {
1227
+ for (let index = 0; index < messages.length; index++) {
1228
+ const message = messages[index]!;
1229
+ const next = obfuscateAdvisorMessage(obfuscator, message, sharedRegexSecretValues);
1230
+ if (next !== message) messages[index] = next;
1231
+ }
1232
+ }