@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.
- package/CHANGELOG.md +14861 -0
- package/README.md +35 -0
- package/dist/CHANGELOG-chtdxh1z.md +14861 -0
- package/dist/cli.js +20483 -0
- package/dist/template-c2hyaytt.js +1653 -0
- package/dist/template-f8wx9vfn.css +1355 -0
- package/dist/template-qat058wr.html +55 -0
- package/dist/tool-views.generated-jdfmzwmn.js +35 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +78 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +169 -0
- package/package.json +587 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/bench-title-models.ts +332 -0
- package/scripts/build-binary.ts +117 -0
- package/scripts/bundle-dist.ts +123 -0
- package/scripts/compile-binary.ts +69 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +58 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/legacy-pi-virtual-module.ts +205 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +51 -0
- package/scripts/omp.ts +19 -0
- package/scripts/security-compare.ts +40 -0
- package/src/advisor/advise-tool.ts +234 -0
- package/src/advisor/config.ts +341 -0
- package/src/advisor/emission-guard.ts +172 -0
- package/src/advisor/index.ts +6 -0
- package/src/advisor/runtime.ts +1412 -0
- package/src/advisor/transcript-recorder.ts +215 -0
- package/src/advisor/watchdog.ts +135 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +847 -0
- package/src/auto-thinking/classifier.ts +220 -0
- package/src/autolearn/controller.ts +152 -0
- package/src/autolearn/managed-skills.ts +255 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +331 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +541 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +700 -0
- package/src/autoresearch/tools/init-experiment.ts +268 -0
- package/src/autoresearch/tools/log-experiment.ts +520 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +467 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +115 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +298 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +69 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +187 -0
- package/src/cleanse/agent.ts +226 -0
- package/src/cleanse/balance.ts +79 -0
- package/src/cleanse/checkers.ts +996 -0
- package/src/cleanse/index.ts +190 -0
- package/src/cleanse/loop.ts +51 -0
- package/src/cleanse/parsers.ts +726 -0
- package/src/cleanse/progress.ts +50 -0
- package/src/cleanse/prompts/assignment.md +47 -0
- package/src/cleanse/types.ts +72 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +368 -0
- package/src/cli/auth-broker-cli.ts +940 -0
- package/src/cli/auth-gateway-cli.ts +674 -0
- package/src/cli/bench-cli.ts +990 -0
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/command-help.ts +107 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +459 -0
- package/src/cli/dry-balance-cli.ts +864 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +132 -0
- package/src/cli/flag-tables.ts +367 -0
- package/src/cli/gallery-cli.ts +272 -0
- package/src/cli/gallery-fixtures/agentic.ts +420 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +254 -0
- package/src/cli/gallery-fixtures/fs.ts +245 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +46 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +177 -0
- package/src/cli/gallery-fixtures/search.ts +135 -0
- package/src/cli/gallery-fixtures/shell.ts +241 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gc-cli.ts +1566 -0
- package/src/cli/grep-cli.ts +161 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +385 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +369 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +99 -0
- package/src/cli/session-picker.ts +110 -0
- package/src/cli/setup-cli.ts +312 -0
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +58 -0
- package/src/cli/stats-cli.ts +229 -0
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/tiny-models-cli.ts +153 -0
- package/src/cli/ttsr-cli.ts +1013 -0
- package/src/cli/update-cli.ts +1184 -0
- package/src/cli/usage-cli.ts +1084 -0
- package/src/cli/usage-error.ts +7 -0
- package/src/cli/web-search-cli.ts +144 -0
- package/src/cli/worktree-cli.ts +311 -0
- package/src/cli-commands.ts +308 -0
- package/src/cli.ts +428 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/display-name.ts +13 -0
- package/src/collab/guest.ts +764 -0
- package/src/collab/host.ts +692 -0
- package/src/collab/protocol.ts +296 -0
- package/src/collab/relay-client.ts +282 -0
- package/src/collab/replication-shrink.ts +111 -0
- package/src/commands/acp.ts +35 -0
- package/src/commands/agents.ts +58 -0
- package/src/commands/auth-broker.ts +100 -0
- package/src/commands/auth-gateway.ts +70 -0
- package/src/commands/bench.ts +64 -0
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +45 -0
- package/src/commands/commit.ts +47 -0
- package/src/commands/complete.ts +67 -0
- package/src/commands/completions.ts +61 -0
- package/src/commands/config.ts +52 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +61 -0
- package/src/commands/gc.ts +47 -0
- package/src/commands/grep.ts +49 -0
- package/src/commands/grievances.ts +52 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +40 -0
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +34 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +79 -0
- package/src/commands/read.ts +39 -0
- package/src/commands/say.ts +146 -0
- package/src/commands/setup.ts +68 -0
- package/src/commands/share.ts +71 -0
- package/src/commands/shell.ts +30 -0
- package/src/commands/ssh.ts +61 -0
- package/src/commands/stats.ts +30 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +164 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +34 -0
- package/src/commands/usage.ts +55 -0
- package/src/commands/web-search.ts +43 -0
- package/src/commands/worktree.ts +63 -0
- package/src/commit/agentic/agent.ts +322 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +383 -0
- package/src/commit/agentic/lock-files.ts +107 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +148 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +52 -0
- package/src/commit/agentic/tools/git-overview.ts +62 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +147 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +11 -0
- package/src/commit/agentic/tools/split-commit.ts +241 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +107 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +95 -0
- package/src/commit/pipeline.ts +244 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +70 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +81 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +347 -0
- package/src/config/inline-tool-descriptors-mode.ts +26 -0
- package/src/config/keybindings.ts +703 -0
- package/src/config/mcp-schema.json +252 -0
- package/src/config/model-discovery.ts +1077 -0
- package/src/config/model-registry.ts +2822 -0
- package/src/config/model-resolver.ts +2115 -0
- package/src/config/model-roles.ts +113 -0
- package/src/config/models-config-schema-bundle.ts +315 -0
- package/src/config/models-config-schema.ts +14 -0
- package/src/config/models-config.ts +130 -0
- package/src/config/prompt-templates.ts +205 -0
- package/src/config/provider-globals.ts +25 -0
- package/src/config/resolve-config-value.ts +95 -0
- package/src/config/service-tier.ts +146 -0
- package/src/config/settings-schema.ts +5887 -0
- package/src/config/settings.ts +2394 -0
- package/src/config.ts +242 -0
- package/src/cursor-bridge-tools.ts +81 -0
- package/src/cursor.ts +960 -0
- package/src/dap/client.ts +1043 -0
- package/src/dap/config.ts +480 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1841 -0
- package/src/dap/types.ts +611 -0
- package/src/debug/index.ts +584 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +966 -0
- package/src/debug/profiler.ts +168 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +421 -0
- package/src/debug/raw-sse.ts +312 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +411 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agent-plugin-format.ts +551 -0
- package/src/discovery/agent-plugins.ts +341 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +300 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
- package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
- package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
- package/src/discovery/builtin-rules/go-ioutil.md +37 -0
- package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
- package/src/discovery/builtin-rules/go-new-expr.md +44 -0
- package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
- package/src/discovery/builtin-rules/go-range-int.md +45 -0
- package/src/discovery/builtin-rules/index.ts +74 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
- package/src/discovery/builtin-rules/rs-result-type.md +20 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
- package/src/discovery/builtin-rules/ts-import-type.md +43 -0
- package/src/discovery/builtin-rules/ts-no-any.md +66 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
- package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +945 -0
- package/src/discovery/claude-plugins.ts +640 -0
- package/src/discovery/claude.ts +591 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +553 -0
- package/src/discovery/contained-path.ts +78 -0
- package/src/discovery/cursor.ts +223 -0
- package/src/discovery/gemini.ts +386 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1183 -0
- package/src/discovery/index.ts +82 -0
- package/src/discovery/mcp-json.ts +182 -0
- package/src/discovery/omp-extension-roots.ts +272 -0
- package/src/discovery/omp-plugins.ts +409 -0
- package/src/discovery/opencode.ts +441 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +77 -0
- package/src/discovery/vscode.ts +106 -0
- package/src/discovery/windsurf.ts +149 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +1008 -0
- package/src/edit/edit-clipboard.ts +23 -0
- package/src/edit/file-snapshot-store.ts +148 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +402 -0
- package/src/edit/hashline/execute.ts +313 -0
- package/src/edit/hashline/filesystem.ts +247 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +12 -0
- package/src/edit/index.ts +699 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1958 -0
- package/src/edit/modes/replace.ts +1191 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +998 -0
- package/src/edit/snapshot-details.ts +77 -0
- package/src/edit/streaming.ts +710 -0
- package/src/eval/agent-bridge.ts +224 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +65 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +212 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +562 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +551 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +236 -0
- package/src/eval/jl/prelude.jl +736 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +666 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +872 -0
- package/src/eval/js/executor.ts +178 -0
- package/src/eval/js/index.ts +41 -0
- package/src/eval/js/process-entry.ts +31 -0
- package/src/eval/js/shared/helpers.ts +170 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +364 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +294 -0
- package/src/eval/js/shared/rewrite-imports.ts +550 -0
- package/src/eval/js/shared/runtime.ts +590 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +163 -0
- package/src/eval/js/worker-core.ts +380 -0
- package/src/eval/js/worker-entry.ts +37 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/kernel-base.ts +569 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +643 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +235 -0
- package/src/eval/py/prelude.py +673 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1425 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +134 -0
- package/src/eval/py/tool-bridge.ts +201 -0
- package/src/eval/rb/executor.ts +511 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +231 -0
- package/src/eval/rb/prelude.rb +551 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +581 -0
- package/src/eval/rb/runtime.ts +132 -0
- package/src/eval/runtime-env.ts +104 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +627 -0
- package/src/exec/direnv.ts +145 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +118 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +320 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1355 -0
- package/src/export/html/template.html +55 -0
- package/src/export/html/template.js +1653 -0
- package/src/export/html/tool-views.generated.js +35 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/html/web-palette.ts +126 -0
- package/src/export/share.ts +686 -0
- package/src/export/ttsr.ts +590 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +242 -0
- package/src/extensibility/custom-commands/types.ts +119 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +301 -0
- package/src/extensibility/custom-tools/types.ts +287 -0
- package/src/extensibility/custom-tools/wrapper.ts +50 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/load-errors.ts +13 -0
- package/src/extensibility/extensions/loader.ts +663 -0
- package/src/extensibility/extensions/managed-timers.ts +83 -0
- package/src/extensibility/extensions/model-api.ts +39 -0
- package/src/extensibility/extensions/runner.ts +1396 -0
- package/src/extensibility/extensions/types.ts +1603 -0
- package/src/extensibility/extensions/wrapper.ts +395 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +243 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +124 -0
- package/src/extensibility/hooks/types.ts +612 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
- package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
- package/src/extensibility/legacy-typebox.ts +101 -0
- package/src/extensibility/plugins/bun-git-cache.ts +91 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +201 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
- package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
- package/src/extensibility/plugins/loader.ts +535 -0
- package/src/extensibility/plugins/manager.ts +1142 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +927 -0
- package/src/extensibility/plugins/marketplace/registry.ts +192 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +192 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +107 -0
- package/src/extensibility/plugins/runtime-config.ts +9 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/session-handler-types.ts +21 -0
- package/src/extensibility/shared-events.ts +401 -0
- package/src/extensibility/skills.ts +531 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-event-input.ts +80 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/utils.ts +192 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +521 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +680 -0
- package/src/hindsight/config.ts +193 -0
- package/src/hindsight/content.ts +266 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +530 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +180 -0
- package/src/internal-urls/artifact-protocol.ts +151 -0
- package/src/internal-urls/docs-index.ts +102 -0
- package/src/internal-urls/filesystem-resource.ts +34 -0
- package/src/internal-urls/history-protocol.ts +198 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/issue-pr-protocol.ts +594 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +471 -0
- package/src/internal-urls/mcp-protocol.ts +168 -0
- package/src/internal-urls/memory-protocol.ts +380 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +103 -0
- package/src/internal-urls/registry-helpers.ts +132 -0
- package/src/internal-urls/router.ts +153 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/security-protocol.ts +261 -0
- package/src/internal-urls/skill-protocol.ts +131 -0
- package/src/internal-urls/ssh-protocol.ts +368 -0
- package/src/internal-urls/types.ts +196 -0
- package/src/internal-urls/vault-protocol.ts +940 -0
- package/src/internal-urls/xd-protocol.ts +46 -0
- package/src/irc/bus.ts +380 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/launch/broker.ts +1368 -0
- package/src/launch/client.ts +521 -0
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +14 -0
- package/src/launch/presence.ts +82 -0
- package/src/launch/protocol.ts +448 -0
- package/src/launch/spawn-options.ts +17 -0
- package/src/launch/terminal-output-worker-client.ts +53 -0
- package/src/launch/terminal-output-worker-protocol.ts +11 -0
- package/src/launch/terminal-output-worker.ts +23 -0
- package/src/launch/terminal-output.ts +46 -0
- package/src/lib/xai-http.ts +150 -0
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +221 -0
- package/src/live/voices.ts +18 -0
- package/src/lsp/client.ts +1465 -0
- package/src/lsp/clients/biome-client.ts +263 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +85 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +549 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/deferred-diagnostics.ts +66 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +288 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2821 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/mux/daemon.ts +348 -0
- package/src/lsp/mux/protocol.ts +96 -0
- package/src/lsp/mux/server.ts +797 -0
- package/src/lsp/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +479 -0
- package/src/lsp/utils.ts +747 -0
- package/src/main.ts +1799 -0
- package/src/markit/NOTICE +32 -0
- package/src/markit/converters/docx.ts +56 -0
- package/src/markit/converters/epub.ts +136 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +598 -0
- package/src/markit/converters/pdf/grid.ts +780 -0
- package/src/markit/converters/pdf/headers.ts +106 -0
- package/src/markit/converters/pdf/index.ts +146 -0
- package/src/markit/converters/pdf/render.ts +501 -0
- package/src/markit/converters/pdf/types.ts +84 -0
- package/src/markit/converters/pptx.ts +325 -0
- package/src/markit/converters/xlsx.ts +173 -0
- package/src/markit/index.ts +2 -0
- package/src/markit/registry.ts +59 -0
- package/src/markit/types.ts +35 -0
- package/src/mcp/client.ts +511 -0
- package/src/mcp/config-writer.ts +377 -0
- package/src/mcp/config.ts +385 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +125 -0
- package/src/mcp/manager.ts +1524 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +587 -0
- package/src/mcp/oauth-flow.ts +830 -0
- package/src/mcp/render.ts +214 -0
- package/src/mcp/request-id.ts +24 -0
- package/src/mcp/smithery-auth.ts +108 -0
- package/src/mcp/smithery-connect.ts +154 -0
- package/src/mcp/smithery-registry.ts +500 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +691 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/header-policy.ts +95 -0
- package/src/mcp/transports/http.ts +508 -0
- package/src/mcp/transports/index.ts +7 -0
- package/src/mcp/transports/sse.ts +372 -0
- package/src/mcp/transports/stdio.ts +905 -0
- package/src/mcp/types.ts +467 -0
- package/src/memories/index.ts +1434 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +19 -0
- package/src/memory-backend/local-backend.ts +47 -0
- package/src/memory-backend/messages.ts +19 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +629 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +293 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +114 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +940 -0
- package/src/modes/acp/acp-agent.ts +2595 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +1084 -0
- package/src/modes/acp/acp-mode.ts +48 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/advisor-config.ts +635 -0
- package/src/modes/components/advisor-message.ts +109 -0
- package/src/modes/components/agent-dashboard.ts +1252 -0
- package/src/modes/components/agent-hub-projection.ts +248 -0
- package/src/modes/components/agent-hub-renderer.ts +194 -0
- package/src/modes/components/agent-hub.ts +1126 -0
- package/src/modes/components/agent-transcript-viewer.ts +647 -0
- package/src/modes/components/ask-dialog.ts +1017 -0
- package/src/modes/components/assistant-message.ts +978 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +233 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +161 -0
- package/src/modes/components/cache-invalidation-marker.ts +110 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/chat-transcript-builder.ts +518 -0
- package/src/modes/components/codex-reset-fireworks.ts +369 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +221 -0
- package/src/modes/components/copy-selector.ts +218 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +1036 -0
- package/src/modes/components/custom-message.ts +70 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +37 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +169 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +492 -0
- package/src/modes/components/extensions/extension-list.ts +507 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +326 -0
- package/src/modes/components/extensions/state-manager.ts +648 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +213 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +67 -0
- package/src/modes/components/hook-selector.ts +691 -0
- package/src/modes/components/index.ts +42 -0
- package/src/modes/components/keybinding-hints.ts +56 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +197 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1413 -0
- package/src/modes/components/message-frame.ts +98 -0
- package/src/modes/components/model-browser.ts +888 -0
- package/src/modes/components/model-hub.ts +2014 -0
- package/src/modes/components/model-picker.ts +237 -0
- package/src/modes/components/move-overlay.ts +293 -0
- package/src/modes/components/oauth-selector.ts +474 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/pause-screen.ts +208 -0
- package/src/modes/components/plan-review-overlay.ts +1226 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +100 -0
- package/src/modes/components/plugin-settings.ts +745 -0
- package/src/modes/components/queue-mode-selector.ts +61 -0
- package/src/modes/components/read-tool-group.ts +856 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/select-list-mouse-routing.ts +35 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/session-selector.ts +1035 -0
- package/src/modes/components/settings-defs.ts +267 -0
- package/src/modes/components/settings-selector.ts +1445 -0
- package/src/modes/components/show-images-selector.ts +50 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1843 -0
- package/src/modes/components/status-line/context-thresholds.ts +86 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +710 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +159 -0
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/theme-selector.ts +68 -0
- package/src/modes/components/thinking-selector.ts +57 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +26 -0
- package/src/modes/components/todo-reminder.ts +43 -0
- package/src/modes/components/tool-execution.ts +1467 -0
- package/src/modes/components/transcript-container.ts +527 -0
- package/src/modes/components/tree-selector.ts +1006 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +52 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +167 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +578 -0
- package/src/modes/controllers/btw-controller.ts +246 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +2024 -0
- package/src/modes/controllers/event-controller.ts +2173 -0
- package/src/modes/controllers/extension-ui-controller.ts +1243 -0
- package/src/modes/controllers/input-controller.ts +2037 -0
- package/src/modes/controllers/live-command-controller.ts +261 -0
- package/src/modes/controllers/mcp-command-controller.ts +2552 -0
- package/src/modes/controllers/omfg-controller.ts +287 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +2058 -0
- package/src/modes/controllers/session-focus-controller.ts +117 -0
- package/src/modes/controllers/ssh-command-controller.ts +385 -0
- package/src/modes/controllers/streaming-reveal.ts +399 -0
- package/src/modes/controllers/tan-command-controller.ts +243 -0
- package/src/modes/controllers/todo-command-controller.ts +487 -0
- package/src/modes/controllers/tool-args-reveal.ts +591 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/github-ref-autocomplete.ts +75 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +10 -0
- package/src/modes/interactive-mode.ts +5055 -0
- package/src/modes/internal-url-autocomplete.ts +158 -0
- package/src/modes/loop-limit.ts +192 -0
- package/src/modes/magic-keyword-boundary.ts +23 -0
- package/src/modes/magic-keywords.ts +42 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +43 -0
- package/src/modes/print-mode.ts +282 -0
- package/src/modes/prompt-action-autocomplete.ts +322 -0
- package/src/modes/queue-input.ts +132 -0
- package/src/modes/rpc/host-tools.ts +204 -0
- package/src/modes/rpc/host-uris.ts +241 -0
- package/src/modes/rpc/rpc-client.ts +1213 -0
- package/src/modes/rpc/rpc-frame.ts +316 -0
- package/src/modes/rpc/rpc-input.ts +38 -0
- package/src/modes/rpc/rpc-messages.ts +127 -0
- package/src/modes/rpc/rpc-mode.ts +1519 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +544 -0
- package/src/modes/running-subagent-badge.ts +13 -0
- package/src/modes/runtime-init.ts +144 -0
- package/src/modes/session-observer-registry.ts +223 -0
- package/src/modes/session-teardown.ts +82 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +103 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
- package/src/modes/setup-wizard/scenes/model.ts +132 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +105 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +330 -0
- package/src/modes/setup-wizard/scenes/types.ts +65 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
- package/src/modes/shared.ts +49 -0
- package/src/modes/skill-command.ts +91 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +143 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +143 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +92 -0
- package/src/modes/theme/shimmer.ts +305 -0
- package/src/modes/theme/theme-schema.json +463 -0
- package/src/modes/theme/theme.ts +3171 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +494 -0
- package/src/modes/ultrathink.ts +42 -0
- package/src/modes/utils/context-usage.ts +518 -0
- package/src/modes/utils/copy-targets.ts +378 -0
- package/src/modes/utils/hotkeys-markdown.ts +65 -0
- package/src/modes/utils/interactive-context-helpers.ts +31 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +31 -0
- package/src/modes/utils/transcript-render-helpers.ts +253 -0
- package/src/modes/utils/ui-helpers.ts +976 -0
- package/src/modes/warp-events.ts +232 -0
- package/src/modes/workflow.ts +55 -0
- package/src/plan-mode/approved-plan.ts +194 -0
- package/src/plan-mode/model-transition.ts +51 -0
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +60 -0
- package/src/prompts/advisor/active-repo-watchdog.md +6 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/context-files.md +8 -0
- package/src/prompts/advisor/system.md +98 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/frontmatter.md +12 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/scout.md +58 -0
- package/src/prompts/agents/security-reviewer.md +75 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/bench.md +6 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/goals/goal-mode-context.md +4 -0
- package/src/prompts/goals/goal-todo-context.md +12 -0
- package/src/prompts/goals/guided-goal-interview.md +43 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/read-path.md +17 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +21 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +68 -0
- package/src/prompts/security/scan-coordinator.md +7 -0
- package/src/prompts/security/scan-request.md +21 -0
- package/src/prompts/security/validate-request.md +8 -0
- package/src/prompts/session/launch-completion.md +1 -0
- package/src/prompts/skills/autoload.md +8 -0
- package/src/prompts/skills/user-invocation.md +11 -0
- package/src/prompts/steering/parent-irc.md +5 -0
- package/src/prompts/steering/user-interjection.md +6 -0
- package/src/prompts/system/active-repo-context.md +4 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +14 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +18 -0
- package/src/prompts/system/empty-stop-retry.md +4 -0
- package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
- package/src/prompts/system/interrupted-thinking.md +7 -0
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +9 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/mcp-xdev-guidance.md +11 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/mid-run-todo-nudge.md +3 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/personalities/default.md +18 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +125 -0
- package/src/prompts/system/plan-mode-approved.md +22 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
- package/src/prompts/system/plan-mode-reference.md +10 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/plan-yolo-handoff.md +5 -0
- package/src/prompts/system/prewalk-checklist.md +7 -0
- package/src/prompts/system/prewalk-continue.md +1 -0
- package/src/prompts/system/prewalk-plan.md +13 -0
- package/src/prompts/system/project-prompt.md +61 -0
- package/src/prompts/system/recap-user.md +9 -0
- package/src/prompts/system/resolve-device-reminder.md +3 -0
- package/src/prompts/system/rewind-report.md +6 -0
- package/src/prompts/system/side-channel-no-tools.md +3 -0
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/speech-rewrite.md +15 -0
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/subagent-system-prompt.md +73 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +23 -0
- package/src/prompts/system/system-prompt.md +263 -0
- package/src/prompts/system/tan-context-switch.md +17 -0
- package/src/prompts/system/task-label.md +23 -0
- package/src/prompts/system/thinking-loop-redirect.md +10 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/tool-call-loop-redirect.md +8 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/unexpected-stop-classifier.md +17 -0
- package/src/prompts/system/unexpected-stop-retry.md +4 -0
- package/src/prompts/system/vibe-mode-active.md +26 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +112 -0
- package/src/prompts/system/xdev-mount-notice.md +20 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +22 -0
- package/src/prompts/tools/ast-edit.md +11 -0
- package/src/prompts/tools/ast-grep.md +19 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/browser.md +29 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/debug.md +3 -0
- package/src/prompts/tools/eval.md +45 -0
- package/src/prompts/tools/github.md +22 -0
- package/src/prompts/tools/glob.md +16 -0
- package/src/prompts/tools/goal.md +11 -0
- package/src/prompts/tools/grep.md +13 -0
- package/src/prompts/tools/hub.md +34 -0
- package/src/prompts/tools/image-attachment-describe-system.md +8 -0
- package/src/prompts/tools/image-attachment-describe.md +10 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +22 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +19 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +12 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +27 -0
- package/src/prompts/tools/recall.md +7 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +14 -0
- package/src/prompts/tools/security-publish.md +1 -0
- package/src/prompts/tools/security-scan.md +1 -0
- package/src/prompts/tools/task-async-contract.md +1 -0
- package/src/prompts/tools/task-summary.md +20 -0
- package/src/prompts/tools/task.md +83 -0
- package/src/prompts/tools/todo.md +42 -0
- package/src/prompts/tools/vibe-kill.md +3 -0
- package/src/prompts/tools/vibe-list.md +3 -0
- package/src/prompts/tools/vibe-send.md +9 -0
- package/src/prompts/tools/vibe-spawn.md +10 -0
- package/src/prompts/tools/vibe-turn-result.md +19 -0
- package/src/prompts/tools/vibe-wait.md +8 -0
- package/src/prompts/tools/web-search.md +8 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +505 -0
- package/src/registry/agent-registry.ts +287 -0
- package/src/registry/persisted-agents.ts +423 -0
- package/src/sdk.ts +3820 -0
- package/src/secrets/index.ts +375 -0
- package/src/secrets/obfuscator.ts +2629 -0
- package/src/secrets/regex.ts +21 -0
- package/src/security/auth.ts +98 -0
- package/src/security/cloud.ts +686 -0
- package/src/security/comparison.ts +255 -0
- package/src/security/contracts/ids.ts +111 -0
- package/src/security/contracts/index.ts +4 -0
- package/src/security/contracts/schemas.ts +219 -0
- package/src/security/contracts/types.ts +254 -0
- package/src/security/contracts/validation.ts +69 -0
- package/src/security/coordinator.ts +708 -0
- package/src/security/importers/codex-security.ts +387 -0
- package/src/security/importers/index.ts +2 -0
- package/src/security/importers/sarif.ts +357 -0
- package/src/security/index.ts +13 -0
- package/src/security/preflight.ts +405 -0
- package/src/security/provenance.ts +106 -0
- package/src/security/publication.ts +326 -0
- package/src/security/remediation.ts +93 -0
- package/src/security/resource-output.ts +50 -0
- package/src/security/sarif.ts +78 -0
- package/src/security/store.ts +430 -0
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-events.ts +67 -0
- package/src/session/agent-session-types.ts +407 -0
- package/src/session/agent-session.ts +9000 -0
- package/src/session/agent-storage.ts +807 -0
- package/src/session/artifacts.ts +154 -0
- package/src/session/async-job-delivery.ts +82 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +25 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.ts +295 -0
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/claude-session-store.ts +426 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +673 -0
- package/src/session/codex-session-store.ts +673 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/credential-pin.ts +93 -0
- package/src/session/eval-runner.ts +219 -0
- package/src/session/exit-diagnostics.ts +310 -0
- package/src/session/foreign-session-import.ts +52 -0
- package/src/session/foreign-session-jsonl.ts +29 -0
- package/src/session/foreign-session-store.ts +26 -0
- package/src/session/history-storage.ts +329 -0
- package/src/session/indexed-session-storage.ts +553 -0
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/launch-completion.ts +37 -0
- package/src/session/messages.ts +1304 -0
- package/src/session/model-controls.ts +757 -0
- package/src/session/prewalk.ts +279 -0
- package/src/session/provider-image-budget.ts +86 -0
- package/src/session/queued-messages.ts +99 -0
- package/src/session/redis-session-storage.ts +257 -0
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1896 -0
- package/src/session/session-context.ts +584 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +306 -0
- package/src/session/session-handoff.ts +325 -0
- package/src/session/session-history-format.ts +459 -0
- package/src/session/session-listing.ts +715 -0
- package/src/session/session-loader.ts +362 -0
- package/src/session/session-maintenance.ts +3115 -0
- package/src/session/session-manager.ts +2747 -0
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-metadata.ts +53 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +280 -0
- package/src/session/session-persistence.ts +293 -0
- package/src/session/session-provider-boundary.ts +306 -0
- package/src/session/session-stats.ts +349 -0
- package/src/session/session-storage.ts +774 -0
- package/src/session/session-title-slot.ts +141 -0
- package/src/session/session-tools.ts +1385 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/settings-stream-fn.ts +79 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/snapcompact-inline.ts +545 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/sql-session-storage.ts +374 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +1459 -0
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/tool-choice-queue.ts +305 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-persistence.ts +142 -0
- package/src/session/turn-recovery.ts +2005 -0
- package/src/session/unexpected-stop-classifier.ts +141 -0
- package/src/session/yield-queue.ts +288 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +3149 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
- package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
- package/src/slash-commands/helpers/context-report.ts +66 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +108 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +533 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +68 -0
- package/src/slash-commands/helpers/security.ts +451 -0
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/ssh.ts +196 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +198 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +139 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +667 -0
- package/src/ssh/file-transfer.ts +214 -0
- package/src/ssh/sshfs-mount.ts +163 -0
- package/src/ssh/utils.ts +51 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +401 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +603 -0
- package/src/stt/downloader.ts +142 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +6 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/sherpa-runtime.ts +71 -0
- package/src/stt/stt-controller.ts +320 -0
- package/src/stt/submit-trigger.ts +74 -0
- package/src/subprocess/worker-client.ts +463 -0
- package/src/subprocess/worker-runtime.ts +494 -0
- package/src/system-prompt.ts +921 -0
- package/src/task/agents.ts +170 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +145 -0
- package/src/task/executor.ts +3431 -0
- package/src/task/index.ts +1515 -0
- package/src/task/isolation-ownership.ts +106 -0
- package/src/task/isolation-runner.ts +444 -0
- package/src/task/label.ts +40 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +115 -0
- package/src/task/parallel.ts +221 -0
- package/src/task/persisted-revive.ts +173 -0
- package/src/task/prewalk.ts +6 -0
- package/src/task/prompt-policy.ts +8 -0
- package/src/task/provider-concurrency.ts +100 -0
- package/src/task/read-only-policy.ts +27 -0
- package/src/task/render.ts +1830 -0
- package/src/task/renderer.ts +14 -0
- package/src/task/repair-args.ts +118 -0
- package/src/task/spawn-policy.ts +72 -0
- package/src/task/structured-subagent.ts +676 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +555 -0
- package/src/task/worktree.ts +967 -0
- package/src/task/yield-assembly.ts +198 -0
- package/src/telemetry-export.ts +504 -0
- package/src/thinking.ts +377 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/message-preproc.ts +155 -0
- package/src/tiny/models.ts +268 -0
- package/src/tiny/text.ts +290 -0
- package/src/tiny/title-client.ts +460 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +354 -0
- package/src/tools/acp-bridge.ts +125 -0
- package/src/tools/approval.ts +245 -0
- package/src/tools/ask.ts +1459 -0
- package/src/tools/ast-edit.ts +718 -0
- package/src/tools/ast-grep.ts +526 -0
- package/src/tools/auto-generated-guard.ts +335 -0
- package/src/tools/bash-interactive.ts +435 -0
- package/src/tools/bash-interceptor.ts +148 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +350 -0
- package/src/tools/bash.ts +1826 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +131 -0
- package/src/tools/browser/attach.ts +219 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
- package/src/tools/browser/cmux/rpc.ts +200 -0
- package/src/tools/browser/cmux/socket-client.ts +445 -0
- package/src/tools/browser/launch.ts +939 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +447 -0
- package/src/tools/browser/relay/bridge.ts +945 -0
- package/src/tools/browser/relay/daemon.ts +117 -0
- package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
- package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
- package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
- package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
- package/src/tools/browser/relay/kind.ts +41 -0
- package/src/tools/browser/relay/protocol.ts +54 -0
- package/src/tools/browser/relay/server.ts +141 -0
- package/src/tools/browser/render.ts +229 -0
- package/src/tools/browser/run-output.ts +76 -0
- package/src/tools/browser/shared-daemon.ts +139 -0
- package/src/tools/browser/tab-protocol.ts +123 -0
- package/src/tools/browser/tab-supervisor.ts +1077 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1982 -0
- package/src/tools/browser.ts +487 -0
- package/src/tools/builtin-names.ts +67 -0
- package/src/tools/checkpoint.ts +137 -0
- package/src/tools/computer/exposure.ts +14 -0
- package/src/tools/computer/protocol.ts +69 -0
- package/src/tools/computer/supervisor.ts +409 -0
- package/src/tools/computer/worker-entry.ts +39 -0
- package/src/tools/computer/worker.ts +745 -0
- package/src/tools/computer-renderer.ts +147 -0
- package/src/tools/computer.ts +222 -0
- package/src/tools/conflict-detect.ts +815 -0
- package/src/tools/context.ts +49 -0
- package/src/tools/debug.ts +1121 -0
- package/src/tools/default-renderer.ts +154 -0
- package/src/tools/essential-tools.ts +46 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-format/index.ts +24 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/julia.ts +446 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval-format/ruby.ts +380 -0
- package/src/tools/eval-render.ts +784 -0
- package/src/tools/eval.ts +774 -0
- package/src/tools/fetch.ts +1889 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +175 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +484 -0
- package/src/tools/gh.ts +3958 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/glob.ts +691 -0
- package/src/tools/grep.ts +1920 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/hub/index.ts +579 -0
- package/src/tools/hub/jobs.ts +714 -0
- package/src/tools/hub/launch.ts +690 -0
- package/src/tools/hub/messaging.ts +735 -0
- package/src/tools/hub/types.ts +117 -0
- package/src/tools/image-gen.ts +1689 -0
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +736 -0
- package/src/tools/inspect-image-renderer.ts +133 -0
- package/src/tools/inspect-image.ts +316 -0
- package/src/tools/json-tree.ts +260 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/learn.ts +141 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/manage-skill.ts +102 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +61 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +211 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +860 -0
- package/src/tools/output-schema-validator.ts +307 -0
- package/src/tools/path-utils.ts +1489 -0
- package/src/tools/plan-mode-guard.ts +155 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
- package/src/tools/read.ts +3762 -0
- package/src/tools/render-utils.ts +926 -0
- package/src/tools/renderers.ts +133 -0
- package/src/tools/report-tool-issue.ts +568 -0
- package/src/tools/resolve.ts +423 -0
- package/src/tools/review.ts +103 -0
- package/src/tools/run-scope.ts +417 -0
- package/src/tools/security-scan.ts +287 -0
- package/src/tools/shell-tokenize.ts +213 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/terminal-output.ts +141 -0
- package/src/tools/todo.ts +1226 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +38 -0
- package/src/tools/tts.ts +266 -0
- package/src/tools/vibe.ts +608 -0
- package/src/tools/write.ts +1646 -0
- package/src/tools/xdev.ts +560 -0
- package/src/tools/yield.ts +486 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +10 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/speakable.ts +392 -0
- package/src/tts/speech-enhancer.ts +206 -0
- package/src/tts/streaming-player.ts +120 -0
- package/src/tts/tts-client.ts +475 -0
- package/src/tts/tts-protocol.ts +69 -0
- package/src/tts/tts-worker.ts +434 -0
- package/src/tts/vocalizer.ts +419 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +268 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +178 -0
- package/src/tui/index.ts +13 -0
- package/src/tui/output-block.ts +268 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +172 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/tui/width-aware-text.ts +58 -0
- package/src/utils/active-repo-context.ts +143 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +373 -0
- package/src/utils/clipboard.ts +361 -0
- package/src/utils/command-args.ts +74 -0
- package/src/utils/commit-message-generator.ts +148 -0
- package/src/utils/cpuprofile.ts +235 -0
- package/src/utils/edit-mode.ts +61 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +80 -0
- package/src/utils/fetch-timeout.ts +10 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +293 -0
- package/src/utils/git.ts +2472 -0
- package/src/utils/image-loading.ts +236 -0
- package/src/utils/image-resize.ts +420 -0
- package/src/utils/image-vision-fallback.ts +196 -0
- package/src/utils/inspect-image-mode.ts +39 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +422 -0
- package/src/utils/lang-from-path.ts +251 -0
- package/src/utils/late-cleanup.ts +17 -0
- package/src/utils/local-date.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/markit-cache.ts +166 -0
- package/src/utils/markit.ts +223 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +126 -0
- package/src/utils/profile-tree.ts +111 -0
- package/src/utils/prompt-path.ts +3 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/sample-profile.ts +437 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot-fn-env.sh +63 -0
- package/src/utils/shell-snapshot.ts +326 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +163 -0
- package/src/utils/title-generator.ts +597 -0
- package/src/utils/token-rate.ts +72 -0
- package/src/utils/tool-choice.ts +50 -0
- package/src/utils/tools-manager.ts +411 -0
- package/src/utils/turndown.ts +82 -0
- package/src/utils/zip.ts +1106 -0
- package/src/vibe/runtime.ts +1684 -0
- package/src/vibe/state.ts +4 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +354 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +663 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +800 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +129 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +121 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +354 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +393 -0
- package/src/web/search/provider.ts +272 -0
- package/src/web/search/providers/anthropic.ts +406 -0
- package/src/web/search/providers/base.ts +112 -0
- package/src/web/search/providers/brave.ts +181 -0
- package/src/web/search/providers/browser-headers.ts +82 -0
- package/src/web/search/providers/browser-page.ts +125 -0
- package/src/web/search/providers/codex.ts +788 -0
- package/src/web/search/providers/duckduckgo.ts +382 -0
- package/src/web/search/providers/ecosia.ts +183 -0
- package/src/web/search/providers/exa.ts +513 -0
- package/src/web/search/providers/firecrawl.ts +213 -0
- package/src/web/search/providers/gemini.ts +634 -0
- package/src/web/search/providers/google.ts +195 -0
- package/src/web/search/providers/jina.ts +144 -0
- package/src/web/search/providers/kagi.ts +98 -0
- package/src/web/search/providers/kimi.ts +221 -0
- package/src/web/search/providers/mojeek.ts +220 -0
- package/src/web/search/providers/parallel.ts +186 -0
- package/src/web/search/providers/perplexity-auth.ts +142 -0
- package/src/web/search/providers/perplexity.ts +997 -0
- package/src/web/search/providers/public.ts +199 -0
- package/src/web/search/providers/searxng.ts +467 -0
- package/src/web/search/providers/startpage.ts +225 -0
- package/src/web/search/providers/synthetic.ts +126 -0
- package/src/web/search/providers/tavily.ts +244 -0
- package/src/web/search/providers/tinyfish.ts +166 -0
- package/src/web/search/providers/utils.ts +130 -0
- package/src/web/search/providers/xai.ts +372 -0
- package/src/web/search/providers/zai.ts +452 -0
- package/src/web/search/query.ts +850 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +518 -0
- package/src/web/search/utils.ts +17 -0
- 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
|
+
}
|