@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,1084 @@
1
+ /**
2
+ * Usage CLI command handler.
3
+ *
4
+ * Handles `omp usage` — fetches provider usage reports for every
5
+ * authenticated account and prints a detailed per-account breakdown
6
+ * (limits, windows, reset times, plan metadata). Accounts whose
7
+ * credentials produced no usage report are listed too, so the output
8
+ * always covers the full credential pool.
9
+ */
10
+ import {
11
+ ANTHROPIC_OAUTH_GRANT_TTL_MS,
12
+ type AuthStorage,
13
+ type DisabledCredentialSummary,
14
+ resolveUsedFraction,
15
+ type UsageHistoryEntry,
16
+ type UsageLimit,
17
+ type UsageReport,
18
+ type UsageUnit,
19
+ } from "@oh-my-pi/pi-ai";
20
+ import { formatDuration, formatNumber, sanitizeText } from "@oh-my-pi/pi-utils";
21
+ import chalk from "@oh-my-pi/pi-utils/chalk";
22
+ import { ModelRegistry } from "../config/model-registry";
23
+ import { discoverAuthStorage } from "../sdk";
24
+
25
+ const BAR_WIDTH = 28;
26
+
27
+ export interface UsageCommandArgs {
28
+ action?: string;
29
+ json?: boolean;
30
+ provider?: string;
31
+ redact?: boolean;
32
+ /** Show recorded usage-limit history instead of a live snapshot. */
33
+ history?: boolean;
34
+ /** History window in days (with `history`). */
35
+ days?: number;
36
+ }
37
+
38
+ /** Identity slice of a stored credential, for "every account" coverage. */
39
+ export interface UsageAccountIdentity {
40
+ provider: string;
41
+ type: "api_key" | "oauth";
42
+ email?: string;
43
+ accountId?: string;
44
+ projectId?: string;
45
+ enterpriseUrl?: string;
46
+ /** Organization/workspace the credential is scoped to (Anthropic multi-subscription). */
47
+ orgId?: string;
48
+ orgName?: string;
49
+ /** Epoch ms of the interactive login that minted the OAuth grant (see `OAuthCredentials.authorizedAt`). */
50
+ authorizedAt?: number;
51
+ }
52
+
53
+ /**
54
+ * Minimal-reveal masks for identity strings (`--redact`).
55
+ *
56
+ * Every mask shows a two-character anchor. When two identities share the
57
+ * anchor, the mask additionally reveals the shortest "middle-out"
58
+ * differentiator — the shortest substring (closest to the string's middle on
59
+ * ties) that no colliding identity contains — as `an*`, `ca*9*`, `ca*nb*`.
60
+ * Prefix growth is deliberately avoided: it leaks the start of the local
61
+ * part (`can.boluk@*`) when a couple of mid-string characters suffice.
62
+ * Duplicate strings (same account on two providers) share a mask.
63
+ */
64
+ export function buildRedactionMap(values: Iterable<string>): Map<string, string> {
65
+ const unique = [...new Set(values)];
66
+ const map = new Map<string, string>();
67
+ const byAnchor = new Map<string, string[]>();
68
+ for (const value of unique) {
69
+ const anchor = value.slice(0, 2);
70
+ const list = byAnchor.get(anchor) ?? [];
71
+ list.push(value);
72
+ byAnchor.set(anchor, list);
73
+ }
74
+ for (const value of unique) {
75
+ const anchor = value.slice(0, 2);
76
+ const peers = (byAnchor.get(anchor) ?? []).filter(other => other !== value);
77
+ if (peers.length === 0) {
78
+ map.set(value, `${anchor}*`);
79
+ continue;
80
+ }
81
+ const infix = findDistinguishingInfix(value, peers);
82
+ map.set(value, infix === undefined ? `${anchor}*` : `${anchor}*${infix}*`);
83
+ }
84
+ // Residual collisions (a value whose every substring also occurs in a
85
+ // peer gets the bare anchor mask) fall back to prefix extension.
86
+ const byMask = new Map<string, string[]>();
87
+ for (const value of unique) {
88
+ const mask = map.get(value)!;
89
+ const list = byMask.get(mask) ?? [];
90
+ list.push(value);
91
+ byMask.set(mask, list);
92
+ }
93
+ for (const collided of byMask.values()) {
94
+ if (collided.length < 2) continue;
95
+ for (const value of collided) {
96
+ let length = Math.min(2, value.length);
97
+ while (
98
+ length < value.length &&
99
+ collided.some(other => other !== value && other.startsWith(value.slice(0, length)))
100
+ ) {
101
+ length++;
102
+ }
103
+ map.set(value, `${value.slice(0, length)}*`);
104
+ }
105
+ }
106
+ return map;
107
+ }
108
+
109
+ /**
110
+ * Shortest substring of `value` (past the revealed two-char anchor) that no
111
+ * peer contains. Among equal-length candidates, picks the one centered
112
+ * closest to the middle of the string. Returns undefined when every
113
+ * substring also occurs in a peer (e.g. `value` is contained in a peer —
114
+ * that peer's own differentiator keeps the masks distinct).
115
+ */
116
+ function findDistinguishingInfix(value: string, peers: string[]): string | undefined {
117
+ const start = Math.min(2, value.length);
118
+ const center = value.length / 2;
119
+ for (let length = 1; length <= value.length - start; length++) {
120
+ let best: { infix: string; distance: number } | undefined;
121
+ for (let pos = start; pos + length <= value.length; pos++) {
122
+ const candidate = value.slice(pos, pos + length);
123
+ if (peers.some(peer => peer.includes(candidate))) continue;
124
+ const distance = Math.abs(pos + length / 2 - center);
125
+ if (!best || distance < best.distance) best = { infix: candidate, distance };
126
+ }
127
+ if (best) return best.infix;
128
+ }
129
+ return undefined;
130
+ }
131
+
132
+ /** Every identity string the output could surface — input for {@link buildRedactionMap}. */
133
+ function collectIdentityStrings(
134
+ reports: UsageReport[],
135
+ accounts: UsageAccountIdentity[],
136
+ disabled: DisabledCredentialSummary[] = [],
137
+ ): string[] {
138
+ const values: string[] = [];
139
+ const add = (value: unknown): void => {
140
+ if (typeof value === "string" && value) values.push(value);
141
+ };
142
+ for (const report of reports) {
143
+ const meta = report.metadata ?? {};
144
+ add(meta.email);
145
+ add(meta.accountId);
146
+ add(meta.projectId);
147
+ add(meta.orgId);
148
+ add(meta.orgName);
149
+ for (const limit of report.limits) {
150
+ add(limit.scope.accountId);
151
+ add(limit.scope.projectId);
152
+ add(limit.scope.orgId);
153
+ }
154
+ }
155
+ for (const account of accounts) {
156
+ add(account.email);
157
+ add(account.accountId);
158
+ add(account.projectId);
159
+ add(account.orgId);
160
+ add(account.orgName);
161
+ add(account.enterpriseUrl);
162
+ }
163
+ for (const summary of disabled) {
164
+ add(summary.email);
165
+ add(summary.accountId);
166
+ add(summary.orgId);
167
+ add(summary.orgName);
168
+ }
169
+ return values;
170
+ }
171
+
172
+ type LimitStatus = NonNullable<UsageLimit["status"]>;
173
+
174
+ function resolveStatus(limit: UsageLimit): LimitStatus {
175
+ if (limit.status && limit.status !== "unknown") return limit.status;
176
+ const fraction = resolveUsedFraction(limit);
177
+ if (fraction === undefined) return "unknown";
178
+ if (fraction >= 1) return "exhausted";
179
+ if (fraction >= 0.8) return "warning";
180
+ return "ok";
181
+ }
182
+
183
+ const STATUS_COLOR: Record<LimitStatus, (text: string) => string> = {
184
+ exhausted: chalk.red,
185
+ warning: chalk.yellow,
186
+ ok: chalk.green,
187
+ unknown: chalk.dim,
188
+ };
189
+
190
+ /** Worst-of aggregation: exhausted > warning > ok > unknown. */
191
+ function aggregateStatus(limits: UsageLimit[]): LimitStatus {
192
+ const statuses = limits.map(resolveStatus);
193
+ if (statuses.includes("exhausted")) return "exhausted";
194
+ if (statuses.includes("warning")) return "warning";
195
+ if (statuses.includes("ok")) return "ok";
196
+ return "unknown";
197
+ }
198
+
199
+ function formatProviderName(provider: string): string {
200
+ return provider
201
+ .split(/[-_]/g)
202
+ .map(part => (part ? part[0].toUpperCase() + part.slice(1) : ""))
203
+ .join(" ");
204
+ }
205
+
206
+ function formatUnitValue(value: number, unit: UsageUnit): string {
207
+ if (unit === "usd") return `$${value.toFixed(2)}`;
208
+ return formatNumber(value);
209
+ }
210
+
211
+ const UNIT_SUFFIX: Record<UsageUnit, string> = {
212
+ tokens: " tokens",
213
+ requests: " requests",
214
+ minutes: " min",
215
+ bytes: " bytes",
216
+ percent: "",
217
+ usd: "",
218
+ unknown: "",
219
+ };
220
+
221
+ function describeAmount(limit: UsageLimit): string {
222
+ const amount = limit.amount;
223
+ const parts: string[] = [];
224
+ const absoluteUnit = amount.unit !== "percent" && amount.unit !== "unknown";
225
+ const fraction = resolveUsedFraction(limit);
226
+ if (absoluteUnit && amount.used !== undefined && amount.limit !== undefined) {
227
+ parts.push(
228
+ `${formatUnitValue(amount.used, amount.unit)} / ${formatUnitValue(amount.limit, amount.unit)}${UNIT_SUFFIX[amount.unit]}`,
229
+ );
230
+ } else if (absoluteUnit && amount.remaining !== undefined) {
231
+ parts.push(`${formatUnitValue(amount.remaining, amount.unit)}${UNIT_SUFFIX[amount.unit]} left`);
232
+ } else if (
233
+ absoluteUnit &&
234
+ amount.used !== undefined &&
235
+ Number.isFinite(amount.used) &&
236
+ amount.limit === undefined &&
237
+ amount.remaining === undefined &&
238
+ fraction === undefined
239
+ ) {
240
+ parts.push(`${formatUnitValue(amount.used, amount.unit)}${UNIT_SUFFIX[amount.unit]} used`);
241
+ }
242
+ if (fraction !== undefined) {
243
+ parts.push(`${(fraction * 100).toFixed(1)}% used`);
244
+ } else if (amount.remainingFraction !== undefined) {
245
+ parts.push(`${(amount.remainingFraction * 100).toFixed(1)}% left`);
246
+ }
247
+ if (parts.length === 0) parts.push("no data");
248
+ return parts.join(" · ");
249
+ }
250
+
251
+ function renderBar(limit: UsageLimit): string {
252
+ const fraction = resolveUsedFraction(limit);
253
+ if (fraction === undefined) return chalk.dim("·".repeat(BAR_WIDTH));
254
+ const clamped = Math.min(Math.max(fraction, 0), 1);
255
+ const filled = Math.round(clamped * BAR_WIDTH);
256
+ const color = STATUS_COLOR[resolveStatus(limit)];
257
+ return color("█".repeat(filled)) + chalk.dim("░".repeat(BAR_WIDTH - filled));
258
+ }
259
+
260
+ /** Append the window label when the limit label doesn't already carry it. */
261
+ function limitTitle(limit: UsageLimit): string {
262
+ let label = limit.label;
263
+ const tier = limit.scope.tier;
264
+ if (tier && !label.toLowerCase().includes(tier.toLowerCase())) label = `${label} (${tier})`;
265
+ const windowLabel = limit.window?.label ?? limit.scope.windowId;
266
+ if (!windowLabel) return label;
267
+ if (windowLabel.toLowerCase() === "quota window") return label;
268
+ if (label.toLowerCase().includes(windowLabel.toLowerCase())) return label;
269
+ return `${label} (${windowLabel})`;
270
+ }
271
+
272
+ function reportAccountLabel(report: UsageReport, index: number): string {
273
+ const meta = report.metadata ?? {};
274
+ for (const key of ["email", "accountId", "projectId"] as const) {
275
+ const value = meta[key];
276
+ if (typeof value === "string" && value) return value;
277
+ }
278
+ for (const limit of report.limits) {
279
+ const scoped = limit.scope.accountId ?? limit.scope.projectId;
280
+ if (scoped) return scoped;
281
+ }
282
+ return `account ${index + 1}`;
283
+ }
284
+
285
+ /** Lowercased identity strings a report can be attributed to. */
286
+ function reportIdentifiers(report: UsageReport): Set<string> {
287
+ const ids = new Set<string>();
288
+ const add = (value: unknown): void => {
289
+ if (typeof value === "string" && value) ids.add(value.toLowerCase());
290
+ };
291
+ const meta = report.metadata ?? {};
292
+ add(meta.email);
293
+ add(meta.accountId);
294
+ add(meta.projectId);
295
+ add(meta.orgId);
296
+ for (const limit of report.limits) {
297
+ add(limit.scope.accountId);
298
+ add(limit.scope.projectId);
299
+ add(limit.scope.orgId);
300
+ }
301
+ return ids;
302
+ }
303
+
304
+ /**
305
+ * Stored credentials that no usage report could be attributed to.
306
+ *
307
+ * Conservative on purpose: when a provider's reports carry no identity at
308
+ * all (or the credential is an API key alongside existing reports), we
309
+ * can't attribute, so we don't claim the account is missing.
310
+ */
311
+ export function collectUnreportedAccounts(
312
+ reports: UsageReport[],
313
+ accounts: UsageAccountIdentity[],
314
+ ): UsageAccountIdentity[] {
315
+ const byProvider = new Map<string, UsageReport[]>();
316
+ for (const report of reports) {
317
+ const list = byProvider.get(report.provider) ?? [];
318
+ list.push(report);
319
+ byProvider.set(report.provider, list);
320
+ }
321
+ return accounts.filter(account => {
322
+ const providerReports = byProvider.get(account.provider) ?? [];
323
+ if (providerReports.length === 0) return true;
324
+ if (account.type === "api_key") return false;
325
+ // Org-decisive attribution when EITHER side carries an org (Anthropic
326
+ // multi-subscription): two orgs share every other identifier, so an
327
+ // org-scoped account is covered only by its own org's report, and an
328
+ // org-less legacy account is never covered by an org-attributed sibling
329
+ // report — its own fetch failing must surface as "no usage data". Its
330
+ // own ORG-LESS report still covers it, though: a mixed pool (fresh
331
+ // org-scoped logins beside pre-org-capture rows) must not duplicate
332
+ // every legacy account. The shared org is a GATE, not a match: two Team
333
+ // members share the org id while drawing on per-user pools, so coverage
334
+ // also requires the account's own base identity inside the same-org
335
+ // subset (an org-only account, with no base identifiers, is covered by
336
+ // any same-org report). The email/account fallback below applies only
337
+ // when both sides are org-less.
338
+ const accountOrg = account.orgId?.toLowerCase();
339
+ const ids = [account.email, account.accountId, account.projectId]
340
+ .filter((value): value is string => typeof value === "string" && value.length > 0)
341
+ .map(value => value.toLowerCase());
342
+ const sameOrgReports: UsageReport[] = [];
343
+ let sawReportOrg = false;
344
+ for (const report of providerReports) {
345
+ const metaOrg = report.metadata?.orgId;
346
+ if (typeof metaOrg === "string" && metaOrg) {
347
+ sawReportOrg = true;
348
+ if (accountOrg !== undefined && metaOrg.toLowerCase() === accountOrg) sameOrgReports.push(report);
349
+ }
350
+ }
351
+ if (accountOrg || sawReportOrg) {
352
+ const candidates = accountOrg
353
+ ? sameOrgReports
354
+ : providerReports.filter(report => {
355
+ const metaOrg = report.metadata?.orgId;
356
+ return !(typeof metaOrg === "string" && metaOrg);
357
+ });
358
+ if (candidates.length === 0) return true;
359
+ if (ids.length === 0) return false;
360
+ return !candidates.some(report => {
361
+ const identifiers = reportIdentifiers(report);
362
+ return ids.some(id => identifiers.has(id));
363
+ });
364
+ }
365
+ if (ids.length === 0) return false;
366
+ const reported = new Set<string>();
367
+ let anyIdentified = false;
368
+ for (const report of providerReports) {
369
+ const identifiers = reportIdentifiers(report);
370
+ if (identifiers.size > 0) anyIdentified = true;
371
+ for (const id of identifiers) reported.add(id);
372
+ }
373
+ if (!anyIdentified) return false;
374
+ return !ids.some(id => reported.has(id));
375
+ });
376
+ }
377
+
378
+ /** Compose the account label from parts, masking each part individually so `--redact` cannot be bypassed by the composite string. */
379
+ function accountIdentityLabel(account: UsageAccountIdentity, redaction?: Map<string, string>): string {
380
+ if (account.type === "api_key") return "API key";
381
+ const base = account.email ?? account.accountId ?? account.projectId ?? account.enterpriseUrl ?? "OAuth account";
382
+ const masked = redaction?.get(base) ?? base;
383
+ // orgId fallback: the uuid is the actual scoped identity; a token response
384
+ // can carry it without a display name, and two same-email rows must still
385
+ // be tellable apart.
386
+ const org = account.orgName ?? account.orgId;
387
+ if (!org || org === base) return masked;
388
+ return `${masked} · ${redaction?.get(org) ?? org}`;
389
+ }
390
+
391
+ function formatAccountHeader(
392
+ report: UsageReport,
393
+ index: number,
394
+ nowMs: number,
395
+ redaction?: Map<string, string>,
396
+ ): string {
397
+ const status = aggregateStatus(report.limits);
398
+ const icon = STATUS_COLOR[status]("●");
399
+ const label = reportAccountLabel(report, index);
400
+ let header = `${icon} ${chalk.bold(redaction?.get(label) ?? label)}`;
401
+ const metaOrgName = report.metadata?.orgName;
402
+ const metaOrgId = report.metadata?.orgId;
403
+ const org = typeof metaOrgName === "string" && metaOrgName ? metaOrgName : metaOrgId;
404
+ if (typeof org === "string" && org && org !== label) {
405
+ header += chalk.dim(` · ${redaction?.get(org) ?? org}`);
406
+ }
407
+ const planType = report.metadata?.planType;
408
+ if (typeof planType === "string" && planType) header += chalk.dim(` · plan: ${planType}`);
409
+ const savedResets = report.resetCredits?.availableCount ?? 0;
410
+ if (savedResets > 0) {
411
+ header += chalk.cyan(` · ✦ ${savedResets} saved reset${savedResets === 1 ? "" : "s"}`);
412
+ const credits = report.resetCredits?.credits;
413
+ if (credits) {
414
+ const expiries = credits
415
+ .filter(c => c.expiresAt)
416
+ .map(c => ({ date: c.expiresAt!, ms: Date.parse(c.expiresAt!) }))
417
+ .filter(c => !Number.isNaN(c.ms))
418
+ .sort((a, b) => a.ms - b.ms);
419
+ const upcoming = expiries.find(c => c.ms > nowMs);
420
+ if (upcoming) {
421
+ header += chalk.dim(
422
+ ` · soonest expires in ${formatDuration(upcoming.ms - nowMs)} (${upcoming.date.slice(0, 10)})`,
423
+ );
424
+ } else {
425
+ const lastExpired = expiries.at(-1);
426
+ if (lastExpired) header += chalk.dim(` · expired (${lastExpired.date.slice(0, 10)})`);
427
+ }
428
+ }
429
+ }
430
+ if (report.fetchedAt && nowMs - report.fetchedAt > 90_000) {
431
+ header += chalk.dim(` · fetched ${formatDuration(nowMs - report.fetchedAt)} ago`);
432
+ }
433
+ return header;
434
+ }
435
+
436
+ function formatLimitLine(limit: UsageLimit, labelWidth: number, nowMs: number): string[] {
437
+ const status = resolveStatus(limit);
438
+ const title = limitTitle(limit);
439
+ const padded = title.padEnd(labelWidth);
440
+ const details: string[] = [describeAmount(limit)];
441
+ const resetsAt = limit.window?.resetsAt;
442
+ if (resetsAt !== undefined && resetsAt > nowMs) {
443
+ details.push(`${limit.window?.resetLabel ?? "resets"} in ${formatDuration(resetsAt - nowMs)}`);
444
+ }
445
+ const lines = [
446
+ ` ${STATUS_COLOR[status]("●")} ${padded} ${renderBar(limit)} ${chalk.dim(details.join(" · "))}`,
447
+ ];
448
+ if (limit.notes && limit.notes.length > 0) {
449
+ lines.push(` ${chalk.dim(limit.notes.join(" · "))}`);
450
+ }
451
+ return lines;
452
+ }
453
+
454
+ interface ProviderLimitTemplate {
455
+ id: string;
456
+ title: string;
457
+ }
458
+
459
+ function collectProviderLimitTemplates(reports: UsageReport[]): ProviderLimitTemplate[] {
460
+ const seen = new Set<string>();
461
+ const templates: ProviderLimitTemplate[] = [];
462
+ for (const report of reports) {
463
+ for (const limit of report.limits) {
464
+ if (seen.has(limit.id)) continue;
465
+ seen.add(limit.id);
466
+ templates.push({ id: limit.id, title: limitTitle(limit) });
467
+ }
468
+ }
469
+ return templates;
470
+ }
471
+
472
+ function formatMissingLimitLine(template: ProviderLimitTemplate, labelWidth: number): string {
473
+ const padded = template.title.padEnd(labelWidth);
474
+ return ` ${chalk.dim("○")} ${padded} ${chalk.dim("·".repeat(BAR_WIDTH))} ${chalk.dim("not reported")}`;
475
+ }
476
+
477
+ /** Per-window capacity stat: how much account quota is burned and left. */
478
+ export interface ProviderWindowStat {
479
+ /** Compact window label, e.g. "5h", "7d". */
480
+ window: string;
481
+ durationMs?: number;
482
+ /** Accounts reporting a limit in this window. */
483
+ accounts: number;
484
+ /** Sum of each account's binding used fraction — accounts' worth of quota burned. */
485
+ usedAccounts: number;
486
+ /** Accounts' worth of quota still available across reporting accounts. */
487
+ remainingAccounts: number;
488
+ }
489
+
490
+ /**
491
+ * Aggregate one provider's reports into per-window quota capacity stats.
492
+ *
493
+ * Limits are bucketed by window duration (5h, 7d, ...). Within a bucket each
494
+ * account contributes its single highest used fraction — when an account has
495
+ * several meters on the same window (tiered/metered limits), the most-burned
496
+ * one is what binds.
497
+ */
498
+ export function computeProviderWindowStats(reports: UsageReport[]): ProviderWindowStat[] {
499
+ const buckets = new Map<string, { window: string; durationMs?: number; fractions: number[] }>();
500
+ for (const report of reports) {
501
+ const accountMax = new Map<string, number>();
502
+ for (const limit of report.limits) {
503
+ const fraction = resolveUsedFraction(limit);
504
+ if (fraction === undefined) continue;
505
+ const durationMs = limit.window?.durationMs;
506
+ const key =
507
+ durationMs !== undefined ? `d:${durationMs}` : (limit.scope.windowId ?? limit.window?.label ?? limit.label);
508
+ const previous = accountMax.get(key);
509
+ if (previous === undefined || fraction > previous) accountMax.set(key, fraction);
510
+ if (!buckets.has(key)) {
511
+ const window =
512
+ durationMs !== undefined
513
+ ? formatDuration(durationMs)
514
+ : (limit.window?.label ?? limit.scope.windowId ?? limit.label);
515
+ buckets.set(key, { window, durationMs, fractions: [] });
516
+ }
517
+ }
518
+ for (const [key, fraction] of accountMax) buckets.get(key)!.fractions.push(fraction);
519
+ }
520
+ return [...buckets.values()]
521
+ .sort((a, b) => (a.durationMs ?? Number.POSITIVE_INFINITY) - (b.durationMs ?? Number.POSITIVE_INFINITY))
522
+ .map(bucket => {
523
+ const usedAccounts = bucket.fractions.reduce((sum, fraction) => sum + fraction, 0);
524
+ return {
525
+ window: bucket.window,
526
+ durationMs: bucket.durationMs,
527
+ accounts: bucket.fractions.length,
528
+ usedAccounts,
529
+ remainingAccounts: Math.max(0, bucket.fractions.length - usedAccounts),
530
+ };
531
+ });
532
+ }
533
+
534
+ /** Re-login warnings render once remaining grant life drops below this. */
535
+ const RELOGIN_WARN_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
536
+
537
+ /**
538
+ * Re-login deadline line for providers whose OAuth grants expire a fixed
539
+ * period after the interactive login (today: Anthropic, ~30 days regardless
540
+ * of refresh rotation). Silent until the deadline is under a week out — a
541
+ * nudge before the broker auto-disables the row, not a permanent countdown.
542
+ */
543
+ function formatReloginDeadline(
544
+ account: UsageAccountIdentity,
545
+ nowMs: number,
546
+ redaction?: Map<string, string>,
547
+ ): string | undefined {
548
+ if (account.provider !== "anthropic" || account.type !== "oauth" || !account.authorizedAt) return undefined;
549
+ const remaining = account.authorizedAt + ANTHROPIC_OAUTH_GRANT_TTL_MS - nowMs;
550
+ if (remaining > RELOGIN_WARN_WINDOW_MS) return undefined;
551
+ const label = accountIdentityLabel(account, redaction);
552
+ if (remaining <= 0) {
553
+ return ` ${chalk.red(`⚠ ${label} — grant is past Anthropic's ~30d lifetime; re-login now`)}`;
554
+ }
555
+ return ` ${chalk.yellow(`⚠ ${label} — re-login within ${formatDuration(remaining)} (Anthropic expires OAuth grants ~30d after login)`)}`;
556
+ }
557
+
558
+ /**
559
+ * Tombstones worth a row in `omp usage`: OAuth credentials torn down
560
+ * automatically (refresh failure, upstream invalidation). Rows the user
561
+ * replaced or deleted deliberately are lifecycle noise, not lost capacity.
562
+ */
563
+ function isActionableDisable(summary: DisabledCredentialSummary, activeAccounts: UsageAccountIdentity[] = []): boolean {
564
+ if (summary.type !== "oauth") return false;
565
+ if (/^(replaced by|deleted by user)/i.test(summary.cause)) return false;
566
+
567
+ // Do not display tombstone if there is an active account for the same provider
568
+ // matching the same identity (email, accountId, or org).
569
+ const summaryEmail = summary.email?.toLowerCase();
570
+ const summaryAccountId = summary.accountId?.toLowerCase();
571
+ const summaryOrgId = summary.orgId?.toLowerCase();
572
+
573
+ const matchesActive = activeAccounts.some(account => {
574
+ if (account.provider !== summary.provider) return false;
575
+
576
+ const accountEmail = account.email?.toLowerCase();
577
+ const accountAccountId = account.accountId?.toLowerCase();
578
+ const accountOrgId = account.orgId?.toLowerCase();
579
+
580
+ // If email or accountId match, it's the same identity
581
+ if (summaryEmail && accountEmail && summaryEmail === accountEmail) return true;
582
+ if (summaryAccountId && accountAccountId && summaryAccountId === accountAccountId) return true;
583
+
584
+ // Fallback: if orgId matches and neither email nor accountId contradicts
585
+ if (summaryOrgId && accountOrgId && summaryOrgId === accountOrgId) return true;
586
+
587
+ return false;
588
+ });
589
+
590
+ return !matchesActive;
591
+ }
592
+
593
+ /** Human-sized disable cause: the upstream `error_description` when embedded, else the first clause. */
594
+ function shortDisableCause(cause: string): string {
595
+ const description = cause.match(/\\?"error_description\\?"\s*:\s*\\?"([^"\\]+)/)?.[1];
596
+ if (description) return description;
597
+ const stripped = cause.replace(/^oauth refresh failed:\s*/i, "");
598
+ const clause = stripped.split(/[;\n]/, 1)[0] ?? stripped;
599
+ return clause.length > 80 ? `${clause.slice(0, 77)}…` : clause;
600
+ }
601
+
602
+ /** Label for a disabled tombstone, masking each identity part under `--redact`. */
603
+ function disabledIdentityLabel(summary: DisabledCredentialSummary, redaction?: Map<string, string>): string {
604
+ const base = summary.email ?? summary.accountId ?? "OAuth account";
605
+ const masked = redaction?.get(base) ?? base;
606
+ const org = summary.orgName ?? summary.orgId;
607
+ if (!org || org === base) return masked;
608
+ return `${masked} · ${redaction?.get(org) ?? org}`;
609
+ }
610
+
611
+ /**
612
+ * Render the full text breakdown: per provider, per account, every limit
613
+ * with a bar, amounts, and reset times; unattributed credentials trail
614
+ * each provider section as "no usage data" rows.
615
+ */
616
+ export function formatUsageBreakdown(
617
+ reports: UsageReport[],
618
+ accounts: UsageAccountIdentity[],
619
+ nowMs: number,
620
+ redaction?: Map<string, string>,
621
+ disabled: DisabledCredentialSummary[] = [],
622
+ ): string {
623
+ const reportsByProvider = new Map<string, UsageReport[]>();
624
+ for (const report of reports) {
625
+ const list = reportsByProvider.get(report.provider) ?? [];
626
+ list.push(report);
627
+ reportsByProvider.set(report.provider, list);
628
+ }
629
+ const unreported = collectUnreportedAccounts(reports, accounts);
630
+ const unreportedByProvider = new Map<string, UsageAccountIdentity[]>();
631
+ for (const account of unreported) {
632
+ const list = unreportedByProvider.get(account.provider) ?? [];
633
+ list.push(account);
634
+ unreportedByProvider.set(account.provider, list);
635
+ }
636
+ const disabledByProvider = new Map<string, DisabledCredentialSummary[]>();
637
+ for (const summary of disabled) {
638
+ if (!isActionableDisable(summary, accounts)) continue;
639
+ const list = disabledByProvider.get(summary.provider) ?? [];
640
+ list.push(summary);
641
+ disabledByProvider.set(summary.provider, list);
642
+ }
643
+
644
+ const providers = [
645
+ ...new Set([...reportsByProvider.keys(), ...unreportedByProvider.keys(), ...disabledByProvider.keys()]),
646
+ ].sort((a, b) => a.localeCompare(b));
647
+
648
+ const lines: string[] = [];
649
+ const latestFetchedAt = Math.max(0, ...reports.map(report => report.fetchedAt ?? 0));
650
+ const headerSuffix = latestFetchedAt ? chalk.dim(` · fetched ${formatDuration(nowMs - latestFetchedAt)} ago`) : "";
651
+ lines.push(`${chalk.bold("Usage")}${headerSuffix}`);
652
+
653
+ for (const provider of providers) {
654
+ const providerReports = reportsByProvider.get(provider) ?? [];
655
+ const providerUnreported = unreportedByProvider.get(provider) ?? [];
656
+ const accountCount = providerReports.length + providerUnreported.length;
657
+ lines.push("");
658
+ lines.push(
659
+ `${chalk.bold.cyan(formatProviderName(provider))} ${chalk.dim(`— ${accountCount} ${accountCount === 1 ? "account" : "accounts"}`)}`,
660
+ );
661
+ // Provider-wide disclaimers render once per provider, not per limit.
662
+ const providerNotes = [...new Set(providerReports.flatMap(report => report.notes ?? []))];
663
+ for (const note of providerNotes)
664
+ lines.push(` ${chalk.dim(sanitizeText(note.replace(/[\r\n]+/g, " ").replace(/\t/g, " ")))}`);
665
+
666
+ const providerLimitTemplates = collectProviderLimitTemplates(providerReports);
667
+ const labelWidth = providerLimitTemplates.reduce((max, template) => Math.max(max, template.title.length), 0);
668
+
669
+ providerReports.forEach((report, index) => {
670
+ lines.push(` ${formatAccountHeader(report, index, nowMs, redaction)}`);
671
+ if (report.limits.length === 0) {
672
+ lines.push(` ${chalk.dim("no limits reported")}`);
673
+ return;
674
+ }
675
+ const limitsById = new Map<string, UsageLimit>();
676
+ for (const limit of report.limits) limitsById.set(limit.id, limit);
677
+ for (const template of providerLimitTemplates) {
678
+ const limit = limitsById.get(template.id);
679
+ if (limit) {
680
+ lines.push(...formatLimitLine(limit, labelWidth, nowMs));
681
+ } else {
682
+ lines.push(formatMissingLimitLine(template, labelWidth));
683
+ }
684
+ }
685
+ });
686
+
687
+ for (const account of providerUnreported) {
688
+ const label = accountIdentityLabel(account, redaction);
689
+ lines.push(` ${chalk.dim("○")} ${chalk.dim(`${label} — no usage data`)}`);
690
+ }
691
+
692
+ for (const summary of disabledByProvider.get(provider) ?? []) {
693
+ const label = disabledIdentityLabel(summary, redaction);
694
+ const ago = summary.disabledAtMs !== undefined ? ` ${formatDuration(nowMs - summary.disabledAtMs)} ago` : "";
695
+ lines.push(
696
+ ` ${chalk.red(`✗ ${label} — disabled${ago}: ${sanitizeText(shortDisableCause(summary.cause))}`)} ${chalk.dim("(re-login to restore)")}`,
697
+ );
698
+ }
699
+
700
+ for (const account of accounts) {
701
+ if (account.provider !== provider) continue;
702
+ const warning = formatReloginDeadline(account, nowMs, redaction);
703
+ if (warning) lines.push(warning);
704
+ }
705
+
706
+ const stats = computeProviderWindowStats(providerReports);
707
+ if (stats.length > 0) {
708
+ const parts = stats.map(
709
+ stat =>
710
+ `${stat.window} → ${stat.usedAccounts.toFixed(2)}/${stat.accounts} ${stat.accounts === 1 ? "account" : "accounts"} used (${stat.remainingAccounts.toFixed(2)}× quota left)`,
711
+ );
712
+ lines.push(` ${chalk.dim(`capacity: ${parts.join(" · ")}`)}`);
713
+ }
714
+ }
715
+
716
+ return lines.join("\n");
717
+ }
718
+
719
+ const HISTORY_SPARK_WIDTH = 48;
720
+ const SPARK_LEVELS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] as const;
721
+
722
+ interface HistorySeries {
723
+ title: string;
724
+ /** Snapshots ascending by recordedAt (listUsageHistory order). */
725
+ entries: UsageHistoryEntry[];
726
+ }
727
+
728
+ interface HistoryAccount {
729
+ label: string;
730
+ series: Map<string, HistorySeries>;
731
+ }
732
+
733
+ /** Mirror of {@link limitTitle} for history rows (no scope/tier available). */
734
+ function historySeriesTitle(entry: UsageHistoryEntry): string {
735
+ const label = entry.label;
736
+ const windowLabel = entry.windowLabel;
737
+ if (!windowLabel) return label;
738
+ if (windowLabel.toLowerCase() === "quota window") return label;
739
+ if (label.toLowerCase().includes(windowLabel.toLowerCase())) return label;
740
+ return `${label} (${windowLabel})`;
741
+ }
742
+
743
+ function historyAccountLabel(entry: UsageHistoryEntry): string {
744
+ return entry.email ?? entry.accountId ?? entry.accountKey;
745
+ }
746
+
747
+ function historyStatus(fraction: number | undefined, status: UsageHistoryEntry["status"]): LimitStatus {
748
+ if (status && status !== "unknown") return status;
749
+ if (fraction === undefined) return "unknown";
750
+ if (fraction >= 1) return "exhausted";
751
+ if (fraction >= 0.8) return "warning";
752
+ return "ok";
753
+ }
754
+
755
+ /** Peak-per-bucket sparkline over [sinceMs, nowMs]; empty buckets render dim dots. */
756
+ function renderHistorySparkline(entries: UsageHistoryEntry[], sinceMs: number, nowMs: number): string {
757
+ const span = Math.max(1, nowMs - sinceMs);
758
+ const buckets: Array<number | undefined> = new Array(HISTORY_SPARK_WIDTH).fill(undefined);
759
+ for (const entry of entries) {
760
+ if (entry.usedFraction === undefined) continue;
761
+ const offset = Math.floor(((entry.recordedAt - sinceMs) / span) * HISTORY_SPARK_WIDTH);
762
+ const index = Math.min(HISTORY_SPARK_WIDTH - 1, Math.max(0, offset));
763
+ const prev = buckets[index];
764
+ buckets[index] = prev === undefined ? entry.usedFraction : Math.max(prev, entry.usedFraction);
765
+ }
766
+ return buckets
767
+ .map(fraction => {
768
+ if (fraction === undefined) return chalk.dim("·");
769
+ const clamped = Math.min(Math.max(fraction, 0), 1);
770
+ const level = SPARK_LEVELS[Math.min(SPARK_LEVELS.length - 1, Math.floor(clamped * SPARK_LEVELS.length))];
771
+ return STATUS_COLOR[historyStatus(clamped, undefined)](level);
772
+ })
773
+ .join("");
774
+ }
775
+
776
+ /** Identity strings a history rendering could surface — input for {@link buildRedactionMap}. */
777
+ function collectHistoryIdentityStrings(entries: UsageHistoryEntry[]): string[] {
778
+ const values: string[] = [];
779
+ for (const entry of entries) {
780
+ if (entry.email) values.push(entry.email);
781
+ if (entry.accountId) values.push(entry.accountId);
782
+ values.push(entry.accountKey);
783
+ }
784
+ return values;
785
+ }
786
+
787
+ /**
788
+ * Render recorded usage-limit history: per provider, per account, one
789
+ * peak-per-bucket sparkline per limit window plus latest/peak percentages.
790
+ */
791
+ export function formatUsageHistory(
792
+ entries: UsageHistoryEntry[],
793
+ sinceMs: number,
794
+ nowMs: number,
795
+ redaction?: Map<string, string>,
796
+ ): string {
797
+ const providers = new Map<string, Map<string, HistoryAccount>>();
798
+ for (const entry of entries) {
799
+ let accounts = providers.get(entry.provider);
800
+ if (!accounts) {
801
+ accounts = new Map();
802
+ providers.set(entry.provider, accounts);
803
+ }
804
+ let account = accounts.get(entry.accountKey);
805
+ if (!account) {
806
+ account = { label: historyAccountLabel(entry), series: new Map() };
807
+ accounts.set(entry.accountKey, account);
808
+ }
809
+ let series = account.series.get(entry.limitId);
810
+ if (!series) {
811
+ series = { title: historySeriesTitle(entry), entries: [] };
812
+ account.series.set(entry.limitId, series);
813
+ }
814
+ // Labels can change across snapshots (provider renames); latest wins.
815
+ series.title = historySeriesTitle(entry);
816
+ series.entries.push(entry);
817
+ }
818
+
819
+ const lines: string[] = [];
820
+ lines.push(
821
+ `${chalk.bold("Usage history")}${chalk.dim(` · last ${formatDuration(nowMs - sinceMs)} · peak per bucket`)}`,
822
+ );
823
+
824
+ for (const provider of [...providers.keys()].sort((a, b) => a.localeCompare(b))) {
825
+ const accounts = providers.get(provider) ?? new Map<string, HistoryAccount>();
826
+ lines.push("");
827
+ lines.push(
828
+ `${chalk.bold.cyan(formatProviderName(provider))} ${chalk.dim(`— ${accounts.size} ${accounts.size === 1 ? "account" : "accounts"}`)}`,
829
+ );
830
+ const sortedAccounts = [...accounts.values()].sort((a, b) => a.label.localeCompare(b.label));
831
+ for (const account of sortedAccounts) {
832
+ lines.push(` ${chalk.bold(redaction?.get(account.label) ?? account.label)}`);
833
+ const labelWidth = [...account.series.values()].reduce((max, series) => Math.max(max, series.title.length), 0);
834
+ const sortedSeries = [...account.series.values()].sort((a, b) => a.title.localeCompare(b.title));
835
+ for (const series of sortedSeries) {
836
+ const fractions = series.entries
837
+ .map(entry => entry.usedFraction)
838
+ .filter((fraction): fraction is number => fraction !== undefined);
839
+ const latestEntry = series.entries[series.entries.length - 1];
840
+ const latestFraction = fractions.length > 0 ? fractions[fractions.length - 1] : undefined;
841
+ const peakFraction = fractions.length > 0 ? Math.max(...fractions) : undefined;
842
+ const status = historyStatus(latestFraction, latestEntry?.status);
843
+ const details: string[] = [];
844
+ if (latestFraction !== undefined) details.push(`latest ${(latestFraction * 100).toFixed(1)}%`);
845
+ if (peakFraction !== undefined) details.push(`peak ${(peakFraction * 100).toFixed(1)}%`);
846
+ details.push(`${series.entries.length} snapshot${series.entries.length === 1 ? "" : "s"}`);
847
+ lines.push(
848
+ ` ${STATUS_COLOR[status]("●")} ${series.title.padEnd(labelWidth)} ${renderHistorySparkline(series.entries, sinceMs, nowMs)} ${chalk.dim(details.join(" · "))}`,
849
+ );
850
+ }
851
+ }
852
+ }
853
+
854
+ return lines.join("\n");
855
+ }
856
+
857
+ function collectStoredAccounts(authStorage: AuthStorage): UsageAccountIdentity[] {
858
+ const accounts: UsageAccountIdentity[] = [];
859
+ const all = authStorage.getAll();
860
+ for (const provider in all) {
861
+ const entry = all[provider];
862
+ const credentials = Array.isArray(entry) ? entry : [entry];
863
+ for (const credential of credentials) {
864
+ if (credential.type === "oauth") {
865
+ accounts.push({
866
+ provider,
867
+ type: "oauth",
868
+ email: credential.email,
869
+ accountId: credential.accountId,
870
+ projectId: credential.projectId,
871
+ enterpriseUrl: credential.enterpriseUrl,
872
+ orgId: credential.orgId,
873
+ orgName: credential.orgName,
874
+ authorizedAt: credential.authorizedAt,
875
+ });
876
+ } else {
877
+ accounts.push({ provider, type: "api_key" });
878
+ }
879
+ }
880
+ }
881
+ return accounts;
882
+ }
883
+
884
+ /**
885
+ * Keep only accounts worth a usage row: those whose provider has a usage
886
+ * provider, so a missing report is a real gap rather than the absence of any
887
+ * usage concept. Providers with no usage endpoint (web-search keys, local /
888
+ * keyless servers, inference providers without a usage API) would only ever
889
+ * render as noise, so they are dropped.
890
+ *
891
+ * `hasUsageProvider` is injected (in practice {@link AuthStorage.usageProviderFor})
892
+ * so custom/broker resolvers stay authoritative — no provider list is duplicated
893
+ * here. An explicit `--provider` request bypasses the cull, so
894
+ * `omp usage --provider xai` can still confirm the stored credential has no
895
+ * usage endpoint.
896
+ */
897
+ export function selectReportableAccounts(
898
+ accounts: UsageAccountIdentity[],
899
+ hasUsageProvider: (provider: string) => boolean,
900
+ explicitProvider?: string,
901
+ ): UsageAccountIdentity[] {
902
+ if (explicitProvider) return accounts;
903
+ return accounts.filter(account => hasUsageProvider(account.provider));
904
+ }
905
+
906
+ /** Apply a redaction mask to an optional identity field. */
907
+ function maskIdentity(redaction: Map<string, string>, value: string | undefined): string | undefined {
908
+ return value === undefined ? undefined : (redaction.get(value) ?? value);
909
+ }
910
+
911
+ const IDENTITY_METADATA_KEYS = ["email", "accountId", "projectId", "orgId", "orgName"] as const;
912
+
913
+ /** Mask identity fields in a raw-stripped report for `--redact --json`. */
914
+ function redactReportForJson(
915
+ report: Omit<UsageReport, "raw">,
916
+ redaction: Map<string, string>,
917
+ ): Omit<UsageReport, "raw"> {
918
+ let metadata = report.metadata;
919
+ if (metadata) {
920
+ metadata = { ...metadata };
921
+ for (const key of IDENTITY_METADATA_KEYS) {
922
+ const value = metadata[key];
923
+ if (typeof value === "string") metadata[key] = redaction.get(value) ?? value;
924
+ }
925
+ }
926
+ const limits = report.limits.map(limit => ({
927
+ ...limit,
928
+ scope: {
929
+ ...limit.scope,
930
+ accountId: maskIdentity(redaction, limit.scope.accountId),
931
+ projectId: maskIdentity(redaction, limit.scope.projectId),
932
+ orgId: maskIdentity(redaction, limit.scope.orgId),
933
+ },
934
+ }));
935
+ return { ...report, metadata, limits };
936
+ }
937
+
938
+ export async function runUsageCommand(cmd: UsageCommandArgs): Promise<void> {
939
+ const authStorage = await discoverAuthStorage();
940
+ try {
941
+ if (cmd.action === "invalidate") {
942
+ const provider = cmd.provider?.toLowerCase();
943
+ await authStorage.invalidateUsageCache(provider);
944
+ if (provider) {
945
+ process.stdout.write(`Invalidated cached usage reports for provider "${provider}".\n`);
946
+ } else {
947
+ process.stdout.write("Invalidated cached usage reports for all providers.\n");
948
+ }
949
+ return;
950
+ }
951
+ if (cmd.history) {
952
+ const days = cmd.days !== undefined && Number.isFinite(cmd.days) && cmd.days > 0 ? cmd.days : 7;
953
+ const nowMs = Date.now();
954
+ const sinceMs = nowMs - days * 86_400_000;
955
+ const entries = authStorage.listUsageHistory({ sinceMs, provider: cmd.provider?.toLowerCase() });
956
+ const redaction = cmd.redact ? buildRedactionMap(collectHistoryIdentityStrings(entries)) : undefined;
957
+ if (cmd.json) {
958
+ const masked = redaction
959
+ ? entries.map(entry => ({
960
+ ...entry,
961
+ accountKey: redaction.get(entry.accountKey) ?? entry.accountKey,
962
+ email: maskIdentity(redaction, entry.email),
963
+ accountId: maskIdentity(redaction, entry.accountId),
964
+ }))
965
+ : entries;
966
+ process.stdout.write(`${JSON.stringify({ generatedAt: nowMs, sinceMs, entries: masked }, null, 2)}\n`);
967
+ return;
968
+ }
969
+ if (entries.length === 0) {
970
+ const scope = cmd.provider ? ` for provider "${cmd.provider}"` : "";
971
+ process.stderr.write(
972
+ chalk.yellow(
973
+ `No usage history recorded${scope} yet. Snapshots accumulate whenever usage is fetched (TUI footer, /usage, omp usage).\n`,
974
+ ),
975
+ );
976
+ process.exitCode = 1;
977
+ return;
978
+ }
979
+ process.stdout.write(`${formatUsageHistory(entries, sinceMs, nowMs, redaction)}\n`);
980
+ return;
981
+ }
982
+ const modelRegistry = new ModelRegistry(authStorage);
983
+ const reports =
984
+ (await authStorage.fetchUsageReports({
985
+ baseUrlResolver: provider => modelRegistry.getProviderBaseUrl(provider),
986
+ })) ?? [];
987
+ // Reports are always fresh (broker-side fetch) but the account list can
988
+ // come from a disk-cached snapshot up to an hour old — revalidate so a
989
+ // just-logged-in (or just-rotated-identity) credential isn't rendered
990
+ // as a stale duplicate. Best-effort: offline broker keeps the cache.
991
+ try {
992
+ await authStorage.revalidateCredentials();
993
+ } catch {
994
+ // Stale identities beat no output.
995
+ }
996
+ const storedAccounts = collectStoredAccounts(authStorage);
997
+ let accounts = selectReportableAccounts(
998
+ storedAccounts,
999
+ provider => authStorage.usageProviderFor(provider) !== undefined,
1000
+ cmd.provider,
1001
+ );
1002
+ // Tombstones ride alongside the live pool so an auto-disabled account
1003
+ // (e.g. an expired Anthropic grant) is loudly visible instead of just
1004
+ // missing. Best-effort: a broker predating the endpoint yields [].
1005
+ let disabled: DisabledCredentialSummary[] = [];
1006
+ try {
1007
+ disabled = await authStorage.listDisabledCredentials();
1008
+ } catch {
1009
+ // Usage output must not fail because tombstone listing did.
1010
+ }
1011
+ let filteredReports = reports;
1012
+ if (cmd.provider) {
1013
+ const wanted = cmd.provider.toLowerCase();
1014
+ filteredReports = reports.filter(report => report.provider.toLowerCase() === wanted);
1015
+ accounts = accounts.filter(account => account.provider.toLowerCase() === wanted);
1016
+ disabled = disabled.filter(summary => summary.provider.toLowerCase() === wanted);
1017
+ }
1018
+
1019
+ const redaction = cmd.redact
1020
+ ? buildRedactionMap(collectIdentityStrings(filteredReports, accounts, disabled))
1021
+ : undefined;
1022
+
1023
+ if (cmd.json) {
1024
+ // Drop the heavy provider-specific `raw` payload — same shape as the
1025
+ // broker/gateway `/v1/usage` endpoints.
1026
+ let trimmed = filteredReports.map(({ raw: _raw, ...rest }) => rest);
1027
+ let unreportedAccounts = collectUnreportedAccounts(filteredReports, accounts);
1028
+ if (redaction) {
1029
+ trimmed = trimmed.map(report => redactReportForJson(report, redaction));
1030
+ unreportedAccounts = unreportedAccounts.map(account => ({
1031
+ ...account,
1032
+ email: maskIdentity(redaction, account.email),
1033
+ accountId: maskIdentity(redaction, account.accountId),
1034
+ projectId: maskIdentity(redaction, account.projectId),
1035
+ enterpriseUrl: maskIdentity(redaction, account.enterpriseUrl),
1036
+ orgId: maskIdentity(redaction, account.orgId),
1037
+ orgName: maskIdentity(redaction, account.orgName),
1038
+ }));
1039
+ }
1040
+ const capacity: Record<string, ProviderWindowStat[]> = {};
1041
+ for (const report of filteredReports) {
1042
+ if (capacity[report.provider]) continue;
1043
+ const stats = computeProviderWindowStats(filteredReports.filter(peer => peer.provider === report.provider));
1044
+ if (stats.length > 0) capacity[report.provider] = stats;
1045
+ }
1046
+ let disabledForJson = disabled.filter(summary => isActionableDisable(summary, accounts));
1047
+ if (redaction) {
1048
+ disabledForJson = disabledForJson.map(summary => ({
1049
+ ...summary,
1050
+ email: maskIdentity(redaction, summary.email),
1051
+ accountId: maskIdentity(redaction, summary.accountId),
1052
+ orgId: maskIdentity(redaction, summary.orgId),
1053
+ orgName: maskIdentity(redaction, summary.orgName),
1054
+ }));
1055
+ }
1056
+ const payload = {
1057
+ generatedAt: Date.now(),
1058
+ reports: trimmed,
1059
+ accountsWithoutUsage: unreportedAccounts,
1060
+ disabledCredentials: disabledForJson,
1061
+ capacity,
1062
+ };
1063
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
1064
+ return;
1065
+ }
1066
+
1067
+ if (filteredReports.length === 0 && accounts.length === 0) {
1068
+ const scope = cmd.provider ? ` for provider "${cmd.provider}"` : "";
1069
+ // Credentials exist but every one is for a provider without a usage
1070
+ // endpoint — say so rather than implying nothing is logged in.
1071
+ const message =
1072
+ storedAccounts.length > 0
1073
+ ? `No usage data${scope}. Stored credentials are for providers without a usage endpoint.\n`
1074
+ : `No credentials found${scope}. Run \`omp\` and use /login to add accounts.\n`;
1075
+ process.stderr.write(chalk.yellow(message));
1076
+ process.exitCode = 1;
1077
+ return;
1078
+ }
1079
+
1080
+ process.stdout.write(`${formatUsageBreakdown(filteredReports, accounts, Date.now(), redaction, disabled)}\n`);
1081
+ } finally {
1082
+ authStorage.close();
1083
+ }
1084
+ }