@kr78/pi-coding-agent 17.2.10

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