@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,1184 @@
1
+ /**
2
+ * Update CLI command handler.
3
+ *
4
+ * Handles `omp update` to check for and install updates.
5
+ * Uses the installer that owns the active omp executable when it can be detected.
6
+ */
7
+ import { createHash } from "node:crypto";
8
+ import * as fs from "node:fs";
9
+ import * as os from "node:os";
10
+ import * as path from "node:path";
11
+ import { Transform } from "node:stream";
12
+ import { pipeline } from "node:stream/promises";
13
+ import { $env, $which, APP_NAME, compareVersions, isEnoent, VERSION } from "@oh-my-pi/pi-utils";
14
+ import chalk from "@oh-my-pi/pi-utils/chalk";
15
+ import { $ } from "bun";
16
+ import { theme } from "../modes/theme/theme";
17
+ import { isTimeoutError, withTimeoutSignal } from "../utils/fetch-timeout";
18
+
19
+ const REPO = "can1357/oh-my-pi";
20
+ const PACKAGE = "@oh-my-pi/pi-coding-agent";
21
+ const HOMEBREW_FORMULA = "can1357/tap/omp";
22
+ const MISE_TOOL = "github:can1357/oh-my-pi";
23
+ /**
24
+ * Official npm registry origin.
25
+ *
26
+ * Pinned across both the version check and the bun install step so the two
27
+ * agree on which catalog they are talking to. A user's bun may be pointed at
28
+ * an unofficial mirror (corporate proxy, Taobao, etc.) that lags the upstream
29
+ * registry by minutes-to-hours, in which case `getLatestRelease` would resolve
30
+ * a version the mirror has not yet replicated and the install would fail with
31
+ * `No version matching "X" found for specifier "<pkg>" (but package exists)`.
32
+ * See #1686.
33
+ */
34
+ const NPM_REGISTRY = "https://registry.npmjs.org/";
35
+ const GITHUB_API = "https://api.github.com";
36
+ const RELEASE_METADATA_TIMEOUT_MS = 30_000;
37
+ const BINARY_DOWNLOAD_TIMEOUT_MS = 15 * 60_000;
38
+
39
+ /**
40
+ * Core native addon package. Bumped in lock-step with {@link PACKAGE} so the
41
+ * version sentinel the loader looks up at runtime matches the `.node` on
42
+ * disk; see {@link buildBunInstallArgs} for why this must be installed
43
+ * explicitly rather than inherited as a transitive dependency.
44
+ */
45
+ const NATIVES_PACKAGE = "@oh-my-pi/pi-natives";
46
+
47
+ /**
48
+ * Platform tags the release pipeline publishes as
49
+ * `@oh-my-pi/pi-natives-<tag>` leaves. Mirrors `SUPPORTED_PLATFORMS` in
50
+ * `packages/natives/native/loader-state.js` and `LEAF_TARGETS` in
51
+ * `packages/natives/scripts/gen-npm-packages.ts`; kept here as the local
52
+ * source of truth so the update path stays free of cross-package imports.
53
+ */
54
+ const SUPPORTED_NATIVE_TAGS: ReadonlySet<string> = new Set([
55
+ "linux-x64",
56
+ "linux-arm64",
57
+ "darwin-x64",
58
+ "darwin-arm64",
59
+ "win32-x64",
60
+ ]);
61
+
62
+ function currentNativeTag(): string {
63
+ return `${process.platform}-${process.arch}`;
64
+ }
65
+
66
+ interface ReleaseInfo {
67
+ tag: string;
68
+ version: string;
69
+ }
70
+
71
+ export interface ReleaseBinaryAsset {
72
+ url: string;
73
+ size: number;
74
+ digest: string;
75
+ }
76
+
77
+ type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
78
+
79
+ function isRecord(value: unknown): value is Record<string, unknown> {
80
+ return typeof value === "object" && value !== null;
81
+ }
82
+
83
+ /**
84
+ * Select and validate the binary asset from GitHub release metadata.
85
+ */
86
+ export function resolveReleaseBinaryAsset(
87
+ release: unknown,
88
+ expectedTag: string,
89
+ binaryName: string,
90
+ ): ReleaseBinaryAsset {
91
+ if (!isRecord(release)) {
92
+ throw new Error("Invalid GitHub release metadata");
93
+ }
94
+ if (release.tag_name !== expectedTag) {
95
+ throw new Error(`GitHub release tag mismatch: expected ${expectedTag}`);
96
+ }
97
+ if (release.draft !== false || release.prerelease !== false) {
98
+ throw new Error(`GitHub release ${expectedTag} is not a published stable release`);
99
+ }
100
+ if (!Array.isArray(release.assets)) {
101
+ throw new Error(`GitHub release ${expectedTag} has no asset list`);
102
+ }
103
+
104
+ const matches = release.assets.filter(asset => isRecord(asset) && asset.name === binaryName);
105
+ if (matches.length !== 1) {
106
+ throw new Error(`GitHub release ${expectedTag} has ${matches.length} assets named ${binaryName}`);
107
+ }
108
+
109
+ const asset = matches[0];
110
+ if (!isRecord(asset) || asset.state !== "uploaded") {
111
+ throw new Error(`GitHub release asset ${binaryName} is not fully uploaded`);
112
+ }
113
+ if (typeof asset.size !== "number" || !Number.isSafeInteger(asset.size) || asset.size <= 0) {
114
+ throw new Error(`GitHub release asset ${binaryName} has an invalid size`);
115
+ }
116
+ if (typeof asset.digest !== "string") {
117
+ throw new Error(`GitHub release asset ${binaryName} has no digest`);
118
+ }
119
+ const digest = /^sha256:([0-9a-f]{64})$/i.exec(asset.digest)?.[1];
120
+ if (!digest) {
121
+ throw new Error(`GitHub release asset ${binaryName} has an unsupported digest`);
122
+ }
123
+
124
+ const expectedUrl = `https://github.com/${REPO}/releases/download/${expectedTag}/${binaryName}`;
125
+ if (asset.browser_download_url !== expectedUrl) {
126
+ throw new Error(`GitHub release asset ${binaryName} has an unexpected download URL`);
127
+ }
128
+
129
+ return {
130
+ url: expectedUrl,
131
+ size: asset.size,
132
+ digest: `sha256:${digest.toLowerCase()}`,
133
+ };
134
+ }
135
+
136
+ async function getReleaseBinaryAsset(
137
+ expectedVersion: string,
138
+ binaryName: string,
139
+ fetchImpl: Fetch = fetch,
140
+ githubToken: string | undefined = $env.GITHUB_TOKEN || $env.GH_TOKEN,
141
+ ): Promise<ReleaseBinaryAsset> {
142
+ const tag = `v${expectedVersion}`;
143
+ const headers: Record<string, string> = {
144
+ Accept: "application/vnd.github+json",
145
+ "X-GitHub-Api-Version": "2022-11-28",
146
+ };
147
+ if (githubToken) headers.Authorization = `Bearer ${githubToken}`;
148
+
149
+ let response: Response;
150
+ try {
151
+ response = await fetchImpl(`${GITHUB_API}/repos/${REPO}/releases/tags/${encodeURIComponent(tag)}`, {
152
+ headers,
153
+ signal: withTimeoutSignal(RELEASE_METADATA_TIMEOUT_MS),
154
+ });
155
+ } catch (err) {
156
+ if (isTimeoutError(err)) {
157
+ throw new Error("Timed out fetching GitHub release metadata after 30s", { cause: err });
158
+ }
159
+ throw err;
160
+ }
161
+ if ((response.status === 403 && !githubToken) || response.status === 429) {
162
+ throw new Error(
163
+ "GitHub API rate limit exceeded while fetching release metadata; retry later or set GITHUB_TOKEN or GH_TOKEN",
164
+ );
165
+ }
166
+ if (!response.ok) {
167
+ throw new Error(`Failed to fetch GitHub release metadata: ${response.statusText}`);
168
+ }
169
+
170
+ return resolveReleaseBinaryAsset(await response.json(), tag, binaryName);
171
+ }
172
+
173
+ export interface VerifiedBinaryDownloadOptions {
174
+ url: string;
175
+ targetPath: string;
176
+ expectedSize: number;
177
+ expectedDigest: string;
178
+ fetchImpl?: Fetch;
179
+ }
180
+
181
+ /**
182
+ * Download a binary and verify its GitHub-reported size and SHA-256 digest.
183
+ */
184
+ export async function downloadVerifiedBinary(options: VerifiedBinaryDownloadOptions): Promise<void> {
185
+ const fetchImpl = options.fetchImpl ?? fetch;
186
+ await unlinkIfExists(options.targetPath);
187
+
188
+ let response: Response;
189
+ try {
190
+ response = await fetchImpl(options.url, {
191
+ redirect: "follow",
192
+ signal: withTimeoutSignal(BINARY_DOWNLOAD_TIMEOUT_MS),
193
+ });
194
+ } catch (err) {
195
+ if (isTimeoutError(err)) {
196
+ throw new Error("Timed out downloading release binary after 15 minutes", { cause: err });
197
+ }
198
+ throw err;
199
+ }
200
+ if (!response.ok || !response.body) {
201
+ throw new Error(`Download failed: ${response.statusText}`);
202
+ }
203
+
204
+ const hash = createHash("sha256");
205
+ let size = 0;
206
+ const verifier = new Transform({
207
+ transform(chunk, _encoding, callback) {
208
+ size += chunk.byteLength;
209
+ if (size > options.expectedSize) {
210
+ callback(
211
+ new Error(
212
+ `Downloaded binary size mismatch: expected ${options.expectedSize} bytes, received at least ${size}`,
213
+ ),
214
+ );
215
+ return;
216
+ }
217
+ hash.update(chunk);
218
+ callback(null, chunk);
219
+ },
220
+ });
221
+
222
+ try {
223
+ await pipeline(response.body, verifier, fs.createWriteStream(options.targetPath, { mode: 0o600 }));
224
+ const digest = `sha256:${hash.digest("hex")}`;
225
+ if (size !== options.expectedSize) {
226
+ throw new Error(`Downloaded binary size mismatch: expected ${options.expectedSize} bytes, received ${size}`);
227
+ }
228
+ if (digest !== options.expectedDigest) {
229
+ throw new Error(`Downloaded binary digest mismatch: expected ${options.expectedDigest}, received ${digest}`);
230
+ }
231
+ await fs.promises.chmod(options.targetPath, 0o755);
232
+ } catch (err) {
233
+ await unlinkIfExists(options.targetPath);
234
+ if (isTimeoutError(err)) {
235
+ throw new Error("Timed out downloading release binary after 15 minutes", { cause: err });
236
+ }
237
+ throw err;
238
+ }
239
+ }
240
+
241
+ /** Result from running the installed binary and parsing its reported version. */
242
+ export interface InstalledVersionVerification {
243
+ ok: boolean;
244
+ actual?: string;
245
+ path?: string;
246
+ }
247
+
248
+ /** Paths and verifier used while replacing a downloaded binary update. */
249
+ export interface BinaryReplacementOptions {
250
+ targetPath: string;
251
+ tempPath: string;
252
+ backupPath: string;
253
+ expectedVersion: string;
254
+ verifyInstalledVersion: (expectedVersion: string) => Promise<InstalledVersionVerification>;
255
+ }
256
+
257
+ /**
258
+ * Parse update subcommand arguments.
259
+ * Returns undefined if not an update command.
260
+ */
261
+ export function parseUpdateArgs(args: string[]): { force: boolean; check: boolean; plugins: boolean } | undefined {
262
+ if (args.length === 0 || args[0] !== "update") {
263
+ return undefined;
264
+ }
265
+
266
+ return {
267
+ force: args.includes("--force") || args.includes("-f"),
268
+ check: args.includes("--check") || args.includes("-c"),
269
+ plugins: args.includes("--plugins") || args.includes("-l"),
270
+ };
271
+ }
272
+
273
+ async function getBunGlobalBinDir(): Promise<string | undefined> {
274
+ if (!$which("bun")) return undefined;
275
+ try {
276
+ const result = await $`bun pm bin -g`.quiet().nothrow();
277
+ if (result.exitCode !== 0) return undefined;
278
+ const output = result.text().trim();
279
+ return output.length > 0 ? output : undefined;
280
+ } catch {
281
+ return undefined;
282
+ }
283
+ }
284
+
285
+ async function getNpmGlobalBinDir(): Promise<string | undefined> {
286
+ if (!$which("npm")) return undefined;
287
+ try {
288
+ const result = await $`npm prefix -g`.quiet().nothrow();
289
+ if (result.exitCode !== 0) return undefined;
290
+ const prefix = result.text().trim();
291
+ if (prefix.length === 0) return undefined;
292
+ return process.platform === "win32" ? prefix : path.join(prefix, "bin");
293
+ } catch {
294
+ return undefined;
295
+ }
296
+ }
297
+
298
+ async function getHomebrewFormulaPrefix(): Promise<string | undefined> {
299
+ if (!$which("brew")) return undefined;
300
+ for (const formula of [HOMEBREW_FORMULA, APP_NAME]) {
301
+ try {
302
+ const result = await $`brew --prefix ${formula}`.quiet().nothrow();
303
+ if (result.exitCode !== 0) continue;
304
+ const output = result.text().trim();
305
+ if (output.length > 0) return output;
306
+ } catch {}
307
+ }
308
+ return undefined;
309
+ }
310
+
311
+ async function getMiseBinDirs(): Promise<string[]> {
312
+ if (!$which("mise")) return [];
313
+ try {
314
+ const result = await $`mise bin-paths ${MISE_TOOL}`.quiet().nothrow();
315
+ if (result.exitCode !== 0) return [];
316
+ return result
317
+ .text()
318
+ .split(/\r?\n/)
319
+ .map(line => line.trim())
320
+ .filter(line => line.length > 0);
321
+ } catch {
322
+ return [];
323
+ }
324
+ }
325
+
326
+ function getMiseDataDir(): string {
327
+ const override = process.env.MISE_DATA_DIR;
328
+ if (override && override.length > 0) return override;
329
+ if (process.platform === "win32") {
330
+ const localAppData = process.env.LOCALAPPDATA;
331
+ if (localAppData && localAppData.length > 0) return path.join(localAppData, "mise");
332
+ }
333
+ const xdgDataHome = process.env.XDG_DATA_HOME;
334
+ if (xdgDataHome && xdgDataHome.length > 0) return path.join(xdgDataHome, "mise");
335
+ return path.join(os.homedir(), ".local", "share", "mise");
336
+ }
337
+
338
+ function normalizePathForComparison(filePath: string): string {
339
+ const normalized = path.normalize(filePath);
340
+ if (process.platform === "win32") return normalized.toLowerCase();
341
+ return normalized;
342
+ }
343
+
344
+ function tryRealpath(p: string): string | undefined {
345
+ try {
346
+ return fs.realpathSync.native(p);
347
+ } catch {
348
+ return undefined;
349
+ }
350
+ }
351
+
352
+ function isPathInDirectoryLexical(filePath: string, directoryPath: string): boolean {
353
+ const normalizedPath = normalizePathForComparison(path.resolve(filePath));
354
+ const normalizedDirectory = normalizePathForComparison(path.resolve(directoryPath));
355
+ const relativePath = path.relative(normalizedDirectory, normalizedPath);
356
+ return relativePath === "" || (!relativePath.startsWith("..") && !path.isAbsolute(relativePath));
357
+ }
358
+
359
+ function isPathInDirectory(filePath: string, directoryPath: string): boolean {
360
+ if (isPathInDirectoryLexical(filePath, directoryPath)) return true;
361
+ // Layer realpath resolution on top of the lexical guard. On Windows, ~/.bun
362
+ // is a junction when Bun is installed via Scoop, so `bun pm bin -g` and the
363
+ // PATH-resolved omp path can refer to the same directory through different
364
+ // strings. path.resolve does not traverse junctions/symlinks; realpath does.
365
+ // Resolve both the file and its parent directory: the file catches manager
366
+ // links like Homebrew's `bin/omp -> Cellar/.../bin/omp`; the parent fallback
367
+ // still tolerates fresh install paths where the file does not exist yet.
368
+ const dirReal = tryRealpath(path.resolve(directoryPath));
369
+ if (!dirReal) return false;
370
+ const fileReal = tryRealpath(path.resolve(filePath));
371
+ if (fileReal && isPathInDirectoryLexical(fileReal, dirReal)) return true;
372
+ const fileDir = tryRealpath(path.dirname(path.resolve(filePath)));
373
+ if (!fileDir) return false;
374
+ const resolvedFile = path.join(fileDir, path.basename(filePath));
375
+ return isPathInDirectoryLexical(resolvedFile, dirReal);
376
+ }
377
+
378
+ type UpdateMethod = "brew" | "mise" | "bun" | "npm" | "binary";
379
+
380
+ interface UpdateMethodResolutionOptions {
381
+ homebrewPrefix?: string;
382
+ miseBinDirs?: readonly string[];
383
+ miseDataDir?: string;
384
+ npmBinDir?: string;
385
+ /**
386
+ * Whether the resolved omp path is a plain file (the standalone binary)
387
+ * rather than a package-manager symlink. Stops a binary install from being
388
+ * misrouted to npm/bun when the global bin dir overlaps the installer's
389
+ * target directory.
390
+ */
391
+ ompIsRegularFile?: boolean;
392
+ }
393
+
394
+ type UpdateTarget =
395
+ | { method: "brew" }
396
+ | { method: "mise" }
397
+ | { method: "bun" }
398
+ | { method: "npm" }
399
+ | { method: "binary"; path: string };
400
+
401
+ function resolveUpdateMethod(
402
+ ompPath: string,
403
+ bunBinDir: string | undefined,
404
+ options: UpdateMethodResolutionOptions = {},
405
+ ): UpdateMethod {
406
+ const { homebrewPrefix, miseBinDirs = [], miseDataDir, npmBinDir, ompIsRegularFile = false } = options;
407
+ const launcherExtension = path.extname(ompPath).toLowerCase();
408
+ const isWindowsScriptLauncher =
409
+ launcherExtension === ".cmd" || launcherExtension === ".ps1" || launcherExtension === ".bat";
410
+ if (homebrewPrefix && isPathInDirectory(ompPath, path.join(homebrewPrefix, "bin"))) return "brew";
411
+ if (miseBinDirs.some(dir => isPathInDirectory(ompPath, dir))) return "mise";
412
+ if (miseDataDir && isPathInDirectory(ompPath, path.join(miseDataDir, "shims"))) return "mise";
413
+ // A plain executable file in a package-manager bin dir is the standalone
414
+ // binary the installer placed there, not an npm/bun-managed install (those
415
+ // symlink into node_modules on POSIX). When the global bin dir overlaps the
416
+ // installer's default (~/.local/bin), classifying by directory alone routes
417
+ // a binary install through npm/bun, whose reinstall then collides with the
418
+ // existing file (npm EEXIST). Fall through to binary replacement instead.
419
+ // Windows is excluded: there package managers write regular-file shims
420
+ // (bun's .exe launcher, npm's .cmd/.ps1), so a regular file is NOT evidence
421
+ // of a standalone install and the override would hijack managed installs.
422
+ const isStandaloneRegularFile = ompIsRegularFile && process.platform !== "win32";
423
+ if (bunBinDir && isPathInDirectory(ompPath, bunBinDir) && !isStandaloneRegularFile) return "bun";
424
+ if ((npmBinDir && isPathInDirectory(ompPath, npmBinDir) && !isStandaloneRegularFile) || isWindowsScriptLauncher)
425
+ return "npm";
426
+ return "binary";
427
+ }
428
+
429
+ export function resolveUpdateMethodForTest(
430
+ ompPath: string,
431
+ bunBinDir: string | undefined,
432
+ options: UpdateMethodResolutionOptions = {},
433
+ ): UpdateMethod {
434
+ return resolveUpdateMethod(ompPath, bunBinDir, options);
435
+ }
436
+ async function resolveUpdateTarget(): Promise<UpdateTarget> {
437
+ const bunBinDir = await getBunGlobalBinDir();
438
+ const npmBinDir = await getNpmGlobalBinDir();
439
+ const homebrewPrefix = await getHomebrewFormulaPrefix();
440
+ const miseAvailable = $which("mise") !== undefined;
441
+ const miseBinDirs = miseAvailable ? await getMiseBinDirs() : [];
442
+ const miseDataDir = miseAvailable ? getMiseDataDir() : undefined;
443
+ const ompPath = resolveOmpPath();
444
+
445
+ if (ompPath) {
446
+ // Package-manager installs symlink the bin entry into node_modules; the
447
+ // standalone installer writes a plain executable. When the global bin dir
448
+ // overlaps the installer's default (~/.local/bin), that file type — not
449
+ // directory containment — distinguishes a binary install from npm/bun.
450
+ let ompIsRegularFile = false;
451
+ try {
452
+ const stat = fs.lstatSync(ompPath);
453
+ ompIsRegularFile = stat.isFile() && !stat.isSymbolicLink();
454
+ } catch {}
455
+ const method = resolveUpdateMethod(ompPath, bunBinDir, {
456
+ homebrewPrefix,
457
+ miseBinDirs,
458
+ miseDataDir,
459
+ npmBinDir,
460
+ ompIsRegularFile,
461
+ });
462
+ if (method === "binary") return { method, path: ompPath };
463
+ return { method };
464
+ }
465
+
466
+ if (bunBinDir) return { method: "bun" };
467
+
468
+ throw new Error(`Could not resolve ${APP_NAME} binary path in PATH`);
469
+ }
470
+
471
+ /**
472
+ * Get the latest release info from the npm registry.
473
+ * Uses npm instead of GitHub API to avoid unauthenticated rate limiting.
474
+ */
475
+ async function getLatestRelease(): Promise<ReleaseInfo> {
476
+ let response: Response;
477
+ try {
478
+ response = await fetch(`${NPM_REGISTRY}${PACKAGE}/latest`, {
479
+ signal: withTimeoutSignal(RELEASE_METADATA_TIMEOUT_MS),
480
+ });
481
+ } catch (err) {
482
+ if (isTimeoutError(err)) {
483
+ throw new Error("Timed out fetching release info after 30s", { cause: err });
484
+ }
485
+ throw err;
486
+ }
487
+ if (!response.ok) {
488
+ throw new Error(`Failed to fetch release info: ${response.statusText}`);
489
+ }
490
+
491
+ const data = (await response.json()) as { version: string };
492
+ const version = data.version;
493
+ const tag = `v${version}`;
494
+
495
+ return {
496
+ tag,
497
+ version,
498
+ };
499
+ }
500
+
501
+ interface BunInstallCachePruneResult {
502
+ scannedPackages: number;
503
+ removedEntries: number;
504
+ }
505
+
506
+ interface BunCachePackageGroup {
507
+ actualDirs: Map<string, string[]>;
508
+ markerDir?: string;
509
+ markerEntries: Map<string, string[]>;
510
+ }
511
+
512
+ function stripBunCacheVersionSuffix(name: string): string {
513
+ const metadataIndex = name.indexOf("@@");
514
+ return metadataIndex === -1 ? name : name.slice(0, metadataIndex);
515
+ }
516
+
517
+ async function readdirIfExists(dir: string): Promise<fs.Dirent[]> {
518
+ try {
519
+ return await fs.promises.readdir(dir, { withFileTypes: true });
520
+ } catch (err) {
521
+ if (isEnoent(err)) return [];
522
+ throw err;
523
+ }
524
+ }
525
+
526
+ function getBunCacheGroup(groups: Map<string, BunCachePackageGroup>, packageName: string): BunCachePackageGroup {
527
+ let group = groups.get(packageName);
528
+ if (!group) {
529
+ group = { actualDirs: new Map(), markerEntries: new Map() };
530
+ groups.set(packageName, group);
531
+ }
532
+ return group;
533
+ }
534
+
535
+ function addVersionPath(entries: Map<string, string[]>, version: string, entryPath: string): void {
536
+ const paths = entries.get(version);
537
+ if (paths) {
538
+ paths.push(entryPath);
539
+ return;
540
+ }
541
+ entries.set(version, [entryPath]);
542
+ }
543
+
544
+ async function addBunCacheActualDir(
545
+ groups: Map<string, BunCachePackageGroup>,
546
+ dirPath: string,
547
+ packageNames: Set<string> | undefined,
548
+ ): Promise<void> {
549
+ try {
550
+ const manifest = (await Bun.file(path.join(dirPath, "package.json")).json()) as Partial<
551
+ Record<"name" | "version", unknown>
552
+ >;
553
+ if (typeof manifest.name !== "string" || typeof manifest.version !== "string") return;
554
+ if (packageNames && !packageNames.has(manifest.name)) return;
555
+ const group = getBunCacheGroup(groups, manifest.name);
556
+ addVersionPath(group.actualDirs, manifest.version, dirPath);
557
+ } catch (err) {
558
+ if (isEnoent(err)) return;
559
+ throw err;
560
+ }
561
+ }
562
+
563
+ async function addBunCacheMarkerDir(
564
+ groups: Map<string, BunCachePackageGroup>,
565
+ packageName: string,
566
+ markerDir: string,
567
+ packageNames: Set<string> | undefined,
568
+ ): Promise<void> {
569
+ if (packageNames && !packageNames.has(packageName)) return;
570
+ const markerEntries = await readdirIfExists(markerDir);
571
+ const group = getBunCacheGroup(groups, packageName);
572
+ group.markerDir = markerDir;
573
+ for (const entry of markerEntries) {
574
+ const cacheVersion = stripBunCacheVersionSuffix(entry.name);
575
+ addVersionPath(group.markerEntries, cacheVersion, path.join(markerDir, entry.name));
576
+ }
577
+ }
578
+
579
+ async function collectBunCacheGroups(
580
+ cacheDir: string,
581
+ packageNames: Set<string> | undefined,
582
+ ): Promise<Map<string, BunCachePackageGroup>> {
583
+ const groups = new Map<string, BunCachePackageGroup>();
584
+ for (const entry of await readdirIfExists(cacheDir)) {
585
+ if (!entry.isDirectory()) continue;
586
+ const entryPath = path.join(cacheDir, entry.name);
587
+ if (entry.name.startsWith("@")) {
588
+ for (const scopedEntry of await readdirIfExists(entryPath)) {
589
+ if (!scopedEntry.isDirectory()) continue;
590
+ const scopedEntryPath = path.join(entryPath, scopedEntry.name);
591
+ const versionSeparator = scopedEntry.name.lastIndexOf("@");
592
+ if (versionSeparator === -1) {
593
+ await addBunCacheMarkerDir(groups, `${entry.name}/${scopedEntry.name}`, scopedEntryPath, packageNames);
594
+ } else {
595
+ await addBunCacheActualDir(groups, scopedEntryPath, packageNames);
596
+ }
597
+ }
598
+ continue;
599
+ }
600
+ const versionSeparator = entry.name.lastIndexOf("@");
601
+ if (versionSeparator === -1) {
602
+ await addBunCacheMarkerDir(groups, entry.name, entryPath, packageNames);
603
+ } else {
604
+ await addBunCacheActualDir(groups, entryPath, packageNames);
605
+ }
606
+ }
607
+ return groups;
608
+ }
609
+
610
+ async function removeCacheEntries(paths: string[]): Promise<number> {
611
+ for (const entryPath of paths) {
612
+ await fs.promises.rm(entryPath, { recursive: true, force: true });
613
+ }
614
+ return paths.length;
615
+ }
616
+
617
+ /**
618
+ * Prune Bun's package cache so each package keeps only its newest cached version.
619
+ *
620
+ * Bun stores package cache entries as both a package marker directory
621
+ * (`react/19.2.6@@@1`) and a materialized package directory
622
+ * (`react@19.2.6@@@1`). Global `omp` updates can leave one full copy per
623
+ * release. The marker and materialized entries are removed together so the
624
+ * cache stays internally consistent.
625
+ */
626
+ export async function pruneBunInstallCache(
627
+ cacheDir: string,
628
+ packageNames?: Set<string>,
629
+ ): Promise<BunInstallCachePruneResult> {
630
+ const groups = await collectBunCacheGroups(cacheDir, packageNames);
631
+ let scannedPackages = 0;
632
+ let removedEntries = 0;
633
+ for (const group of groups.values()) {
634
+ if (group.actualDirs.size === 0) continue;
635
+ scannedPackages++;
636
+ let latestVersion: string | undefined;
637
+ for (const version of group.actualDirs.keys()) {
638
+ if (!latestVersion || compareVersions(version, latestVersion) > 0) latestVersion = version;
639
+ }
640
+ if (!latestVersion) continue;
641
+ for (const [version, paths] of group.actualDirs) {
642
+ if (version !== latestVersion) removedEntries += await removeCacheEntries(paths);
643
+ }
644
+ for (const [version, paths] of group.markerEntries) {
645
+ if (version !== latestVersion) removedEntries += await removeCacheEntries(paths);
646
+ }
647
+ }
648
+ return { scannedPackages, removedEntries };
649
+ }
650
+
651
+ async function resolveBunInstallCacheDir(): Promise<string | undefined> {
652
+ try {
653
+ const result = await $`bun pm cache`.quiet().nothrow();
654
+ if (result.exitCode !== 0) return undefined;
655
+ const output = result.text().trim();
656
+ return output.length > 0 ? output : undefined;
657
+ } catch {
658
+ return undefined;
659
+ }
660
+ }
661
+
662
+ export function resolveBunGlobalNodeModulesDirFromLocations(
663
+ globalBinDir: string | undefined,
664
+ cacheDir: string | undefined,
665
+ ): string | undefined {
666
+ if (globalBinDir && globalBinDir.length > 0) {
667
+ return path.join(path.dirname(globalBinDir), "install", "global", "node_modules");
668
+ }
669
+ if (cacheDir && cacheDir.length > 0) {
670
+ return path.join(path.dirname(cacheDir), "global", "node_modules");
671
+ }
672
+ return undefined;
673
+ }
674
+
675
+ async function resolveBunGlobalNodeModulesDir(cacheDir: string): Promise<string | undefined> {
676
+ try {
677
+ const result = await $`bun pm bin -g`.quiet().nothrow();
678
+ const globalBinDir = result.exitCode === 0 ? result.text().trim() : undefined;
679
+ return resolveBunGlobalNodeModulesDirFromLocations(globalBinDir, cacheDir);
680
+ } catch {
681
+ return resolveBunGlobalNodeModulesDirFromLocations(undefined, cacheDir);
682
+ }
683
+ }
684
+
685
+ async function collectInstalledPackageNames(nodeModulesDir: string): Promise<Set<string>> {
686
+ const packageNames = new Set<string>();
687
+ for (const entry of await readdirIfExists(nodeModulesDir)) {
688
+ if (!entry.isDirectory() || entry.name === ".bin") continue;
689
+ if (entry.name.startsWith("@")) {
690
+ for (const scopedEntry of await readdirIfExists(path.join(nodeModulesDir, entry.name))) {
691
+ if (scopedEntry.isDirectory()) packageNames.add(`${entry.name}/${scopedEntry.name}`);
692
+ }
693
+ continue;
694
+ }
695
+ packageNames.add(entry.name);
696
+ }
697
+ return packageNames;
698
+ }
699
+
700
+ async function pruneBunCacheAfterGlobalInstall(): Promise<BunInstallCachePruneResult | undefined> {
701
+ const cacheDir = await resolveBunInstallCacheDir();
702
+ if (!cacheDir) return undefined;
703
+ const globalNodeModulesDir = await resolveBunGlobalNodeModulesDir(cacheDir);
704
+ const packageNames = globalNodeModulesDir
705
+ ? await collectInstalledPackageNames(globalNodeModulesDir)
706
+ : new Set<string>();
707
+ if (packageNames.size === 0 && !path.basename(cacheDir).toLowerCase().includes("omp")) return undefined;
708
+ return await pruneBunInstallCache(cacheDir, packageNames.size === 0 ? undefined : packageNames);
709
+ }
710
+
711
+ /**
712
+ * Detect a musl-libc Linux host (Alpine, Void-musl) so self-update replaces a
713
+ * musl binary with the musl release asset instead of the glibc build, which
714
+ * would fail to start on the next run. The loader file alone is not sufficient:
715
+ * glibc hosts may have musl installed for cross-compilation.
716
+ */
717
+ interface MuslDetectionOptions {
718
+ platform?: NodeJS.Platform;
719
+ alpineRelease?: boolean;
720
+ lddOutput?: string;
721
+ }
722
+
723
+ function detectLddOutput(): string | undefined {
724
+ try {
725
+ const result = Bun.spawnSync(["ldd", "--version"], { stdout: "pipe", stderr: "pipe" });
726
+ return `${result.stdout.toString("utf-8")}\n${result.stderr.toString("utf-8")}`;
727
+ } catch {
728
+ return undefined;
729
+ }
730
+ }
731
+
732
+ function isMuslLinux(options: MuslDetectionOptions = {}): boolean {
733
+ if ((options.platform ?? process.platform) !== "linux") return false;
734
+ if (options.alpineRelease ?? fs.existsSync("/etc/alpine-release")) return true;
735
+ return /\bmusl\b/i.test(options.lddOutput ?? detectLddOutput() ?? "");
736
+ }
737
+
738
+ /** Test seam for libc detection. */
739
+ export function isMuslLinuxForTest(options: Required<MuslDetectionOptions>): boolean {
740
+ return isMuslLinux(options);
741
+ }
742
+
743
+ /**
744
+ * Get the appropriate binary name for this platform.
745
+ */
746
+ function getBinaryName(): string {
747
+ const platform = process.platform;
748
+ const arch = process.arch;
749
+
750
+ let os: string;
751
+ switch (platform) {
752
+ case "linux":
753
+ os = isMuslLinux() ? "linux-musl" : "linux";
754
+ break;
755
+ case "darwin":
756
+ os = "darwin";
757
+ break;
758
+ case "win32":
759
+ os = "windows";
760
+ break;
761
+ default:
762
+ throw new Error(`Unsupported platform: ${platform}`);
763
+ }
764
+
765
+ let archName: string;
766
+ switch (arch) {
767
+ case "x64":
768
+ archName = "x64";
769
+ break;
770
+ case "arm64":
771
+ archName = "arm64";
772
+ break;
773
+ default:
774
+ throw new Error(`Unsupported architecture: ${arch}`);
775
+ }
776
+
777
+ if (os === "windows") {
778
+ return `${APP_NAME}-${os}-${archName}.exe`;
779
+ }
780
+ return `${APP_NAME}-${os}-${archName}`;
781
+ }
782
+
783
+ /**
784
+ * Resolve the path that `omp` maps to in the user's PATH.
785
+ */
786
+ function resolveOmpPath(): string | undefined {
787
+ return $which(APP_NAME) ?? undefined;
788
+ }
789
+
790
+ /**
791
+ * Run the resolved omp binary and check if it reports the expected version.
792
+ */
793
+ async function verifyInstalledVersion(expectedVersion: string): Promise<InstalledVersionVerification> {
794
+ const ompPath = resolveOmpPath();
795
+ if (!ompPath) return { ok: false };
796
+ try {
797
+ const result = await $`${ompPath} --version`.quiet().nothrow();
798
+ if (result.exitCode !== 0) return { ok: false, path: ompPath };
799
+ const output = result.text().trim();
800
+ // Output format: "omp/X.Y.Z"
801
+ const match = output.match(/\/(\d+\.\d+\.\d+)/);
802
+ const actual = match?.[1];
803
+ return { ok: actual === expectedVersion, actual, path: ompPath };
804
+ } catch {
805
+ return { ok: false, path: ompPath };
806
+ }
807
+ }
808
+
809
+ function printVerifiedVersion(expectedVersion: string): void {
810
+ console.log(chalk.green(`\n${theme.status.success} Updated to ${expectedVersion}`));
811
+ }
812
+
813
+ function formatVerificationFailure(result: InstalledVersionVerification, expectedVersion: string): string {
814
+ if (result.actual) {
815
+ return `${APP_NAME} at ${result.path} still reports ${result.actual} (expected ${expectedVersion})`;
816
+ }
817
+ return `could not verify updated version${result.path ? ` at ${result.path}` : ""}`;
818
+ }
819
+
820
+ /**
821
+ * Print post-update verification result.
822
+ */
823
+ async function printVerification(expectedVersion: string): Promise<void> {
824
+ const result = await verifyInstalledVersion(expectedVersion);
825
+ if (result.ok) {
826
+ printVerifiedVersion(expectedVersion);
827
+ return;
828
+ }
829
+ console.log(chalk.yellow(`\nWarning: ${formatVerificationFailure(result, expectedVersion)}`));
830
+ console.log(chalk.yellow(`You may need to reinstall: curl -fsSL https://omp.sh/install | sh`));
831
+ }
832
+
833
+ async function unlinkIfExists(filePath: string): Promise<void> {
834
+ try {
835
+ await fs.promises.unlink(filePath);
836
+ } catch (err) {
837
+ if (!isEnoent(err)) throw err;
838
+ }
839
+ }
840
+
841
+ /**
842
+ * Remove a backup binary without letting the removal abort a completed update.
843
+ *
844
+ * On Windows the executable that was just moved aside is still mapped as the
845
+ * running process image, so unlinking it fails with EPERM/EACCES until this
846
+ * process exits (issue #845). The replacement and verification already
847
+ * succeeded by the time we get here, so every error is swallowed; the leftover
848
+ * is reclaimed by {@link sweepStaleBackups} on the next update once it is no
849
+ * longer in use. Returns whether the file is gone.
850
+ */
851
+ async function removeBackupBestEffort(filePath: string): Promise<boolean> {
852
+ try {
853
+ await fs.promises.unlink(filePath);
854
+ return true;
855
+ } catch (err) {
856
+ return isEnoent(err);
857
+ }
858
+ }
859
+
860
+ /**
861
+ * Best-effort removal of binary-update backups left by earlier runs.
862
+ *
863
+ * Each self-update moves the previous executable to `<binary>.<timestamp>.<pid>.bak`
864
+ * before swapping the new one in. On Windows that backup cannot be deleted
865
+ * while the updating process is alive, so it is left for a later run to reclaim
866
+ * once its owning process has exited. Also matches the legacy fixed
867
+ * `<binary>.bak` name produced before backups were timestamped, so users
868
+ * upgrading from a buggy release get the orphaned file cleaned up.
869
+ */
870
+ export async function sweepStaleBackups(targetPath: string): Promise<void> {
871
+ const dir = path.dirname(targetPath);
872
+ const base = path.basename(targetPath);
873
+ let entries: string[];
874
+ try {
875
+ entries = await fs.promises.readdir(dir);
876
+ } catch {
877
+ return;
878
+ }
879
+ for (const entry of entries) {
880
+ if (!entry.startsWith(`${base}.`) || !entry.endsWith(".bak")) continue;
881
+ // Legacy "<base>.bak" → empty middle; new "<base>.<timestamp>.<pid>.bak"
882
+ // → dot-separated numeric run. Anything else is an unrelated *.bak file.
883
+ const middle = entry.slice(base.length + 1, entry.length - ".bak".length);
884
+ if (middle.length > 0 && !/^\d+(\.\d+)*$/.test(middle)) continue;
885
+ await removeBackupBestEffort(path.join(dir, entry));
886
+ }
887
+ }
888
+
889
+ /**
890
+ * Atomically replace the installed binary and roll back if version verification fails.
891
+ */
892
+ export async function replaceBinaryForUpdate(options: BinaryReplacementOptions): Promise<InstalledVersionVerification> {
893
+ let backupReady = false;
894
+ try {
895
+ // `backupPath` is unique per attempt (see updateViaBinaryAt), so this rename
896
+ // never has to overwrite — or unlink — a possibly-locked leftover from an
897
+ // earlier run. Renaming the running executable itself is permitted on
898
+ // Windows; only deleting its still-mapped image is not.
899
+ await fs.promises.rename(options.targetPath, options.backupPath);
900
+ backupReady = true;
901
+ await fs.promises.rename(options.tempPath, options.targetPath);
902
+
903
+ const verification = await options.verifyInstalledVersion(options.expectedVersion);
904
+ if (!verification.ok) {
905
+ throw new Error(
906
+ `${formatVerificationFailure(verification, options.expectedVersion)}; restored previous ${APP_NAME} binary`,
907
+ );
908
+ }
909
+
910
+ backupReady = false;
911
+ // Swap done and verified. On Windows the backup is still the running
912
+ // process image and cannot be unlinked until this process exits, so a
913
+ // failure here must NOT fail an otherwise-successful update.
914
+ await removeBackupBestEffort(options.backupPath);
915
+ return verification;
916
+ } catch (err) {
917
+ if (backupReady) {
918
+ await unlinkIfExists(options.targetPath);
919
+ await fs.promises.rename(options.backupPath, options.targetPath);
920
+ }
921
+ await unlinkIfExists(options.tempPath);
922
+ throw err;
923
+ }
924
+ }
925
+
926
+ function buildVersionedPackageInstallArgs(expectedVersion: string, nativeTag: string): string[] {
927
+ const args = [`${PACKAGE}@${expectedVersion}`, `${NATIVES_PACKAGE}@${expectedVersion}`];
928
+ if (SUPPORTED_NATIVE_TAGS.has(nativeTag)) {
929
+ args.push(`${NATIVES_PACKAGE}-${nativeTag}@${expectedVersion}`);
930
+ }
931
+ return args;
932
+ }
933
+
934
+ /**
935
+ * Build the bun argv used to globally install a specific omp version.
936
+ *
937
+ * The version is selected by hitting {@link NPM_REGISTRY} directly in
938
+ * {@link getLatestRelease}, so the install MUST observe the same catalog:
939
+ *
940
+ * - `--registry=${NPM_REGISTRY}` pins the install to the official registry
941
+ * regardless of the user's bunfig/`.npmrc`. A mirror (corporate proxy,
942
+ * Taobao, …) that hasn't yet replicated the release would otherwise reject
943
+ * a version the upstream registry already advertises.
944
+ * - `--no-cache` tells bun to ignore its on-disk manifest snapshot so it
945
+ * re-fetches metadata from that registry on every invocation.
946
+ *
947
+ * Together these two flags make `omp update` produce exactly the registry
948
+ * lookup the version check just performed. See #1686.
949
+ *
950
+ * Also pins {@link NATIVES_PACKAGE} and the platform-specific
951
+ * `@oh-my-pi/pi-natives-<tag>` leaf to `expectedVersion`. `bun install -g`
952
+ * does not reliably refresh transitive `optionalDependencies` when the
953
+ * top-level package is the only one bumped, so the native addon and its
954
+ * version sentinel can drift out of sync with the freshly installed
955
+ * `@oh-my-pi/pi-coding-agent` and the loader aborts at
956
+ * `validateLoadedBindings` on the next launch
957
+ * (`The .node file on disk is from a different release than this loader`).
958
+ * Listing the natives explicitly forces bun to replace them in lock-step.
959
+ * The leaf is added only on tags the release pipeline actually publishes
960
+ * ({@link SUPPORTED_NATIVE_TAGS}) so unsupported platforms still fail with
961
+ * the original "no matching version" message instead of `EBADPLATFORM`.
962
+ * See #1824.
963
+ */
964
+ export function buildBunInstallArgs(expectedVersion: string, nativeTag: string = currentNativeTag()): string[] {
965
+ return [
966
+ "install",
967
+ "-g",
968
+ "--no-cache",
969
+ `--registry=${NPM_REGISTRY}`,
970
+ ...buildVersionedPackageInstallArgs(expectedVersion, nativeTag),
971
+ ];
972
+ }
973
+
974
+ /** Build the npm argv used to update npm-managed global installs. */
975
+ export function buildNpmInstallArgs(expectedVersion: string, nativeTag: string = currentNativeTag()): string[] {
976
+ const args = [
977
+ "install",
978
+ "-g",
979
+ `--registry=${NPM_REGISTRY}`,
980
+ ...buildVersionedPackageInstallArgs(expectedVersion, nativeTag),
981
+ ];
982
+ return args;
983
+ }
984
+
985
+ export function buildHomebrewUpdateArgs(force: boolean): string[] {
986
+ return [force ? "reinstall" : "upgrade", HOMEBREW_FORMULA];
987
+ }
988
+
989
+ export function buildMiseUpgradeArgs(): string[] {
990
+ return ["upgrade", MISE_TOOL, "--bump"];
991
+ }
992
+
993
+ export function buildMiseForceInstallArgs(expectedVersion: string): string[] {
994
+ return ["install", "--force", `${MISE_TOOL}@${expectedVersion}`];
995
+ }
996
+
997
+ /**
998
+ * Update via package manager.
999
+ */
1000
+ async function updateViaBun(expectedVersion: string): Promise<void> {
1001
+ console.log(chalk.dim("Updating via bun..."));
1002
+ const args = buildBunInstallArgs(expectedVersion);
1003
+ const result = await $`bun ${args}`.nothrow();
1004
+ if (result.exitCode !== 0) {
1005
+ throw new Error(`bun install failed with exit code ${result.exitCode}`);
1006
+ }
1007
+
1008
+ await printVerification(expectedVersion);
1009
+ try {
1010
+ const pruneResult = await pruneBunCacheAfterGlobalInstall();
1011
+ if (pruneResult && pruneResult.removedEntries > 0) {
1012
+ console.log(chalk.dim(`Pruned ${pruneResult.removedEntries} stale Bun cache entries`));
1013
+ }
1014
+ } catch (err) {
1015
+ console.log(chalk.yellow(`Warning: could not prune stale Bun cache entries: ${err}`));
1016
+ }
1017
+ }
1018
+
1019
+ async function updateViaNpm(expectedVersion: string): Promise<void> {
1020
+ console.log(chalk.dim("Updating via npm..."));
1021
+ const args = buildNpmInstallArgs(expectedVersion);
1022
+ const result = await $`npm ${args}`.nothrow();
1023
+ if (result.exitCode !== 0) {
1024
+ throw new Error(`npm install failed with exit code ${result.exitCode}`);
1025
+ }
1026
+
1027
+ await printVerification(expectedVersion);
1028
+ }
1029
+
1030
+ async function updateViaHomebrew(expectedVersion: string, force: boolean): Promise<void> {
1031
+ console.log(chalk.dim("Updating Homebrew formulae..."));
1032
+ const update = await $`brew update`.nothrow();
1033
+ if (update.exitCode !== 0) {
1034
+ throw new Error(`brew update failed with exit code ${update.exitCode}`);
1035
+ }
1036
+
1037
+ console.log(chalk.dim("Updating via Homebrew..."));
1038
+ const args = buildHomebrewUpdateArgs(force);
1039
+ const result = await $`brew ${args}`.nothrow();
1040
+ if (result.exitCode !== 0) {
1041
+ throw new Error(`brew ${args[0]} failed with exit code ${result.exitCode}`);
1042
+ }
1043
+
1044
+ await printVerification(expectedVersion);
1045
+ }
1046
+
1047
+ async function updateViaMise(expectedVersion: string, force: boolean): Promise<void> {
1048
+ console.log(chalk.dim("Updating via mise..."));
1049
+ const args = buildMiseUpgradeArgs();
1050
+ const result = await $`mise ${args}`.nothrow();
1051
+ if (result.exitCode !== 0) {
1052
+ throw new Error(`mise upgrade failed with exit code ${result.exitCode}`);
1053
+ }
1054
+
1055
+ if (force) {
1056
+ const forceArgs = buildMiseForceInstallArgs(expectedVersion);
1057
+ const forceResult = await $`mise ${forceArgs}`.nothrow();
1058
+ if (forceResult.exitCode !== 0) {
1059
+ throw new Error(`mise install --force failed with exit code ${forceResult.exitCode}`);
1060
+ }
1061
+ }
1062
+
1063
+ await printVerification(expectedVersion);
1064
+ }
1065
+
1066
+ /**
1067
+ * Download a release binary to a target path, replacing an existing file.
1068
+ */
1069
+ export async function updateViaBinaryAt(
1070
+ targetPath: string,
1071
+ expectedVersion: string,
1072
+ options: {
1073
+ binaryName?: string;
1074
+ fetchImpl?: Fetch;
1075
+ githubToken?: string;
1076
+ verifyInstalledVersion?: typeof verifyInstalledVersion;
1077
+ } = {},
1078
+ ): Promise<void> {
1079
+ const binaryName = options.binaryName ?? getBinaryName();
1080
+ const tempPath = `${targetPath}.new`;
1081
+ // Unique per attempt: a stale backup from an earlier update may still be
1082
+ // locked (it is the previous process image on Windows), and a fixed name
1083
+ // would force the move-aside rename to overwrite it. pid + timestamp keeps
1084
+ // two forced updates in the same millisecond from colliding.
1085
+ const backupPath = `${targetPath}.${Date.now()}.${process.pid}.bak`;
1086
+ const asset = await getReleaseBinaryAsset(expectedVersion, binaryName, options.fetchImpl, options.githubToken);
1087
+ console.log(chalk.dim(`Downloading ${binaryName}…`));
1088
+ await downloadVerifiedBinary({
1089
+ url: asset.url,
1090
+ targetPath: tempPath,
1091
+ expectedSize: asset.size,
1092
+ expectedDigest: asset.digest,
1093
+ fetchImpl: options.fetchImpl,
1094
+ });
1095
+ console.log(chalk.dim(`Verified ${asset.digest}`));
1096
+
1097
+ console.log(chalk.dim("Installing update..."));
1098
+ await replaceBinaryForUpdate({
1099
+ targetPath,
1100
+ tempPath,
1101
+ backupPath,
1102
+ expectedVersion,
1103
+ verifyInstalledVersion: options.verifyInstalledVersion ?? verifyInstalledVersion,
1104
+ });
1105
+ // Reclaim backups from earlier updates whose owning process has since exited.
1106
+ await sweepStaleBackups(targetPath);
1107
+ printVerifiedVersion(expectedVersion);
1108
+ console.log(chalk.dim(`Restart ${APP_NAME} to use the new version`));
1109
+ }
1110
+
1111
+ /**
1112
+ * Run the update command.
1113
+ */
1114
+ export async function runUpdateCommand(opts: { force: boolean; check: boolean }): Promise<void> {
1115
+ console.log(chalk.dim(`Current version: ${VERSION}`));
1116
+
1117
+ // Check for updates
1118
+ let release: ReleaseInfo;
1119
+ try {
1120
+ release = await getLatestRelease();
1121
+ } catch (err) {
1122
+ console.error(chalk.red(`Failed to check for updates: ${err}`));
1123
+ process.exit(1);
1124
+ }
1125
+
1126
+ const comparison = compareVersions(release.version, VERSION);
1127
+
1128
+ if (comparison <= 0 && !opts.force) {
1129
+ console.log(chalk.green(`${theme.status.success} Already up to date`));
1130
+ return;
1131
+ }
1132
+
1133
+ if (comparison > 0) {
1134
+ console.log(chalk.cyan(`New version available: ${release.version}`));
1135
+ } else {
1136
+ console.log(chalk.yellow(`Forcing reinstall of ${release.version}`));
1137
+ }
1138
+
1139
+ if (opts.check) {
1140
+ // Just check, don't install
1141
+ return;
1142
+ }
1143
+
1144
+ // Choose update method based on the prioritized omp binary in PATH
1145
+ try {
1146
+ const target = await resolveUpdateTarget();
1147
+ if (target.method === "brew") {
1148
+ await updateViaHomebrew(release.version, opts.force);
1149
+ } else if (target.method === "mise") {
1150
+ await updateViaMise(release.version, opts.force);
1151
+ } else if (target.method === "bun") {
1152
+ await updateViaBun(release.version);
1153
+ } else if (target.method === "npm") {
1154
+ await updateViaNpm(release.version);
1155
+ } else {
1156
+ await updateViaBinaryAt(target.path, release.version);
1157
+ }
1158
+ } catch (err) {
1159
+ console.error(chalk.red(`Update failed: ${err}`));
1160
+ process.exit(1);
1161
+ }
1162
+ }
1163
+
1164
+ /**
1165
+ * Print update command help.
1166
+ */
1167
+ export function printUpdateHelp(): void {
1168
+ console.log(`${chalk.bold(`${APP_NAME} update`)} - Check for and install updates
1169
+
1170
+ ${chalk.bold("Usage:")}
1171
+ ${APP_NAME} update [options]
1172
+
1173
+ ${chalk.bold("Options:")}
1174
+ -c, --check Check for updates without installing
1175
+ -f, --force Force reinstall even if up to date
1176
+ -l, --plugins Update installed plugins
1177
+
1178
+ ${chalk.bold("Examples:")}
1179
+ ${APP_NAME} update Update to latest version
1180
+ ${APP_NAME} update --check Check if updates are available
1181
+ ${APP_NAME} update --force Force reinstall
1182
+ ${APP_NAME} update -l Update installed plugins
1183
+ `);
1184
+ }