@gajae-code/coding-agent 0.13.2 → 0.14.0
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 +215 -8
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +10 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +73 -9
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +2 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +7 -21
- package/dist/types/modes/components/settings-selector.d.ts +5 -0
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +118 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +47 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +10 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +23 -2
- package/src/config/model-profiles.ts +88 -21
- package/src/config/model-registry.ts +147 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +77 -7
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +41 -32
- package/src/main.ts +36 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/chrome.ts +4 -3
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/dynamic-theme-text.ts +22 -0
- package/src/modes/components/gajae-pet-widget.ts +607 -193
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/model-selector.ts +1 -6
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +35 -31
- package/src/modes/components/settings-selector.ts +29 -5
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +19 -4
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +238 -77
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/defaults/ouroboros.json +118 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2873 -559
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +199 -31
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +757 -57
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +117 -19
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +349 -142
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/todo-contract.ts +55 -3
- package/src/tools/todo-write.ts +4 -3
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -3,7 +3,7 @@ import * as path from "node:path";
|
|
|
3
3
|
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
4
4
|
import { type Model, modelsAreEqual } from "@gajae-code/ai/core";
|
|
5
5
|
import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
|
|
6
|
-
import { PET_SKINS, type PetMode, Spacer, Text } from "@gajae-code/tui";
|
|
6
|
+
import { PET_SKIN_IDS, PET_SKINS, type PetMode, Spacer, Text } from "@gajae-code/tui";
|
|
7
7
|
import { setProjectDir } from "@gajae-code/utils";
|
|
8
8
|
import { jobElapsedMs } from "../async";
|
|
9
9
|
import { activateModelProfile, materializeActiveModelProfileAssignments } from "../config/model-profile-activation";
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
GJC_MODEL_ASSIGNMENT_TARGET_IDS,
|
|
13
13
|
GJC_MODEL_ASSIGNMENT_TARGETS,
|
|
14
14
|
type GjcModelAssignmentTargetId,
|
|
15
|
+
requiresExplicitThinkingChoice,
|
|
15
16
|
} from "../config/model-registry";
|
|
16
17
|
|
|
17
18
|
import {
|
|
@@ -33,6 +34,7 @@ import {
|
|
|
33
34
|
// import graph; the /notify handlers import them lazily at first use.
|
|
34
35
|
import type { NotificationProvider } from "../sdk/bus/config";
|
|
35
36
|
import { computeCacheMissCostSummary, formatCacheMissSummaryLines } from "../session/cache-economics";
|
|
37
|
+
import { formatProviderSessionImportSummary, runSessionImportCommand } from "../session-import";
|
|
36
38
|
import { formatModelOnboardingGuidance } from "../setup/model-onboarding-guidance";
|
|
37
39
|
import {
|
|
38
40
|
addApiCompatibleProvider,
|
|
@@ -43,6 +45,7 @@ import {
|
|
|
43
45
|
import { parseThinkingLevel } from "../thinking";
|
|
44
46
|
import { getDisplayChangelogEntries } from "../utils/changelog";
|
|
45
47
|
import { buildContextReportText } from "./helpers/context-report";
|
|
48
|
+
import { switchSessionCredentialCommand } from "./helpers/credential-switch";
|
|
46
49
|
import { buildFastStatusReport } from "./helpers/fast-status-report";
|
|
47
50
|
import { formatDuration } from "./helpers/format";
|
|
48
51
|
import { commandConsumed, errorMessage, parseSlashCommand, parseSubcommand, usage } from "./helpers/parse";
|
|
@@ -70,8 +73,11 @@ function canClearComposer(runtime: BuiltinSlashCommandRuntime): boolean {
|
|
|
70
73
|
|
|
71
74
|
const PET_COMMAND_OPTIONS: ReadonlyArray<{ name: string; mode: PetMode; description: string }> = [
|
|
72
75
|
{ name: "off", mode: "off", description: "Hide the pet" },
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
...PET_SKIN_IDS.map(id => ({
|
|
77
|
+
name: PET_SKINS[id].label,
|
|
78
|
+
mode: id,
|
|
79
|
+
description: PET_SKINS[id].description,
|
|
80
|
+
})),
|
|
75
81
|
];
|
|
76
82
|
const PET_COMMAND_HINT = `[${PET_COMMAND_OPTIONS.map(option => option.name).join("|")}]`;
|
|
77
83
|
/**
|
|
@@ -87,7 +93,12 @@ const PET_COMMAND_DEPRECATED_INPUTS: Readonly<Record<string, PetMode>> = {
|
|
|
87
93
|
type GjcModelBatchAssignmentTargetId = "all-role-agents" | "all-targets";
|
|
88
94
|
type ParsedModelCommandArgs =
|
|
89
95
|
| { kind: "summary" }
|
|
90
|
-
| {
|
|
96
|
+
| {
|
|
97
|
+
kind: "assign";
|
|
98
|
+
targetId: GjcModelAssignmentTargetId | GjcModelBatchAssignmentTargetId;
|
|
99
|
+
selector: string;
|
|
100
|
+
hasExplicitTarget: boolean;
|
|
101
|
+
};
|
|
91
102
|
|
|
92
103
|
const GJC_MODEL_ROLE_AGENT_TARGET_IDS: GjcModelAssignmentTargetId[] = ["executor", "architect", "planner", "critic"];
|
|
93
104
|
|
|
@@ -230,19 +241,19 @@ function parseModelCommandArgs(args: string): ParsedModelCommandArgs {
|
|
|
230
241
|
|
|
231
242
|
if (first === "assign") {
|
|
232
243
|
const targetId = parseTarget(tokens[1]);
|
|
233
|
-
if (targetId) return { kind: "assign", targetId, selector: tokens.slice(2).join(" ") };
|
|
234
|
-
return { kind: "assign", targetId: "default", selector: tokens.slice(1).join(" ") };
|
|
244
|
+
if (targetId) return { kind: "assign", targetId, selector: tokens.slice(2).join(" "), hasExplicitTarget: true };
|
|
245
|
+
return { kind: "assign", targetId: "default", selector: tokens.slice(1).join(" "), hasExplicitTarget: false };
|
|
235
246
|
}
|
|
236
247
|
|
|
237
248
|
const explicitTarget = parseTarget(first);
|
|
238
249
|
if (explicitTarget) {
|
|
239
|
-
return { kind: "assign", targetId: explicitTarget, selector: tokens.slice(1).join(" ") };
|
|
250
|
+
return { kind: "assign", targetId: explicitTarget, selector: tokens.slice(1).join(" "), hasExplicitTarget: true };
|
|
240
251
|
}
|
|
241
252
|
if (first === "set") {
|
|
242
253
|
const targetId = parseTarget(tokens[1]);
|
|
243
|
-
if (targetId) return { kind: "assign", targetId, selector: tokens.slice(2).join(" ") };
|
|
254
|
+
if (targetId) return { kind: "assign", targetId, selector: tokens.slice(2).join(" "), hasExplicitTarget: true };
|
|
244
255
|
}
|
|
245
|
-
return { kind: "assign", targetId: "default", selector: args.trim() };
|
|
256
|
+
return { kind: "assign", targetId: "default", selector: args.trim(), hasExplicitTarget: false };
|
|
246
257
|
}
|
|
247
258
|
/**
|
|
248
259
|
* Optional namespace prefix accepted on `/model <preset>` selectors so users
|
|
@@ -593,7 +604,28 @@ const shutdownHandlerTui = (_command: ParsedSlashCommand, runtime: TuiSlashComma
|
|
|
593
604
|
return commandConsumed();
|
|
594
605
|
};
|
|
595
606
|
|
|
607
|
+
const IMPORT_SESSION_RETAINED_DESCRIPTOR_AUTHORITY_AVAILABLE = process.platform === "linux";
|
|
608
|
+
|
|
596
609
|
const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
610
|
+
{
|
|
611
|
+
name: "import-session",
|
|
612
|
+
priority: 29,
|
|
613
|
+
description: "Import a Codex or Claude transcript into native GJC history",
|
|
614
|
+
inlineHint: "<transcript-file> [--provider codex|claude]",
|
|
615
|
+
allowArgs: true,
|
|
616
|
+
acp: false,
|
|
617
|
+
localHeadless: true,
|
|
618
|
+
handle: async (command, runtime) => {
|
|
619
|
+
if (runtime.session?.isStreaming) return usage("Cannot import a session while streaming.", runtime);
|
|
620
|
+
const outcome = await runSessionImportCommand(command.args, runtime.cwd);
|
|
621
|
+
if (outcome.kind === "error") {
|
|
622
|
+
await runtime.output(outcome.message);
|
|
623
|
+
return { consumed: true, exitCode: 1 };
|
|
624
|
+
}
|
|
625
|
+
await runtime.output(formatProviderSessionImportSummary(outcome.result));
|
|
626
|
+
return { consumed: true };
|
|
627
|
+
},
|
|
628
|
+
},
|
|
597
629
|
{
|
|
598
630
|
name: "notify",
|
|
599
631
|
priority: 30,
|
|
@@ -836,11 +868,11 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
|
836
868
|
);
|
|
837
869
|
}
|
|
838
870
|
// Preset shortcut: when the selector names a known model profile
|
|
839
|
-
// (optionally `gajae-code/`-prefixed) and
|
|
840
|
-
//
|
|
841
|
-
//
|
|
842
|
-
// `/model
|
|
843
|
-
if (parsedArgs.targetId === "default") {
|
|
871
|
+
// (optionally `gajae-code/`-prefixed) and the target is implicit,
|
|
872
|
+
// activate the profile immediately instead of treating the preset name
|
|
873
|
+
// as a model id and failing with "Unknown model". Explicit targets,
|
|
874
|
+
// including `/model default <preset>`, remain ordinary assignments.
|
|
875
|
+
if (parsedArgs.targetId === "default" && !parsedArgs.hasExplicitTarget) {
|
|
844
876
|
const presetName = resolvePresetSelector(modelId, runtime.session.modelRegistry);
|
|
845
877
|
if (presetName) {
|
|
846
878
|
try {
|
|
@@ -870,6 +902,18 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
|
870
902
|
return usage(modelSelectionUsage(runtime, resolution.failure.message), runtime);
|
|
871
903
|
}
|
|
872
904
|
const { selection } = resolution;
|
|
905
|
+
if (
|
|
906
|
+
selection.thinkingLevel === undefined &&
|
|
907
|
+
targetIds.some(targetId => requiresExplicitThinkingChoice(selection.model, targetId))
|
|
908
|
+
) {
|
|
909
|
+
return usage(
|
|
910
|
+
modelSelectionUsage(
|
|
911
|
+
runtime,
|
|
912
|
+
`Model ${selection.model.provider}/${selection.model.id} requires an explicit effort suffix.`,
|
|
913
|
+
),
|
|
914
|
+
runtime,
|
|
915
|
+
);
|
|
916
|
+
}
|
|
873
917
|
try {
|
|
874
918
|
const includesDefault = targetIds.includes("default");
|
|
875
919
|
const includesRoleAgent = targetIds.some(role => role !== "default");
|
|
@@ -1288,12 +1332,43 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
|
1288
1332
|
name: "usage",
|
|
1289
1333
|
description: "Show provider usage and limits",
|
|
1290
1334
|
acpDescription: "Show token usage",
|
|
1291
|
-
|
|
1292
|
-
|
|
1335
|
+
subcommands: [{ name: "check", description: "Explicitly check account health and usage" }],
|
|
1336
|
+
inlineHint: "[check]",
|
|
1337
|
+
acpInputHint: "[check]",
|
|
1338
|
+
allowArgs: true,
|
|
1339
|
+
handle: async (command, runtime) => {
|
|
1340
|
+
const args = command.args.trim().toLowerCase();
|
|
1341
|
+
if (args !== "" && args !== "check") return usage("Usage: /usage [check]", runtime);
|
|
1342
|
+
await runtime.output(await buildUsageReportText(runtime, { check: args === "check" }));
|
|
1293
1343
|
return commandConsumed();
|
|
1294
1344
|
},
|
|
1295
|
-
handleTui: async (
|
|
1296
|
-
|
|
1345
|
+
handleTui: async (command, runtime) => {
|
|
1346
|
+
const args = command.args.trim().toLowerCase();
|
|
1347
|
+
if (args !== "" && args !== "check") {
|
|
1348
|
+
runtime.ctx.showError("Usage: /usage [check]");
|
|
1349
|
+
} else {
|
|
1350
|
+
const adapted = toSlashCommandRuntime(runtime);
|
|
1351
|
+
await adapted.output(await buildUsageReportText(adapted, { check: args === "check" }));
|
|
1352
|
+
}
|
|
1353
|
+
runtime.ctx.editor.setText("");
|
|
1354
|
+
},
|
|
1355
|
+
},
|
|
1356
|
+
{
|
|
1357
|
+
name: "credential",
|
|
1358
|
+
aliases: ["account"],
|
|
1359
|
+
description: "Switch this session's active stored account, or list accounts",
|
|
1360
|
+
acpDescription: "Switch or list stored credentials for this session",
|
|
1361
|
+
inlineHint: "[email:<addr>|id:<n>|account:<id>|project:<id>|provider/<selector>]",
|
|
1362
|
+
acpInputHint: "[selector]",
|
|
1363
|
+
allowArgs: true,
|
|
1364
|
+
handle: async (command, runtime) => {
|
|
1365
|
+
await runtime.output(await switchSessionCredentialCommand(runtime, command.args));
|
|
1366
|
+
return commandConsumed();
|
|
1367
|
+
},
|
|
1368
|
+
handleTui: async (command, runtime) => {
|
|
1369
|
+
const result = await switchSessionCredentialCommand(toSlashCommandRuntime(runtime), command.args);
|
|
1370
|
+
refreshStatusLine(runtime.ctx);
|
|
1371
|
+
runtime.ctx.showStatus(result);
|
|
1297
1372
|
runtime.ctx.editor.setText("");
|
|
1298
1373
|
},
|
|
1299
1374
|
},
|
|
@@ -1364,6 +1439,15 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
|
1364
1439
|
runtime.ctx.editor.setText("");
|
|
1365
1440
|
},
|
|
1366
1441
|
},
|
|
1442
|
+
|
|
1443
|
+
{
|
|
1444
|
+
name: "extensions",
|
|
1445
|
+
description: "Configure skills, hooks, and MCPs.",
|
|
1446
|
+
handleTui: (_command, runtime) => {
|
|
1447
|
+
runtime.ctx.showCustomizationDashboard();
|
|
1448
|
+
runtime.ctx.editor.setText("");
|
|
1449
|
+
},
|
|
1450
|
+
},
|
|
1367
1451
|
{
|
|
1368
1452
|
name: "monitors",
|
|
1369
1453
|
description: "Open the monitor/cron jobs overlay",
|
|
@@ -1922,7 +2006,9 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
|
|
|
1922
2006
|
const QUARANTINED_UTILITY_SLASH_COMMANDS = new Set(["agents"]);
|
|
1923
2007
|
|
|
1924
2008
|
const ACTIVE_BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = BUILTIN_SLASH_COMMAND_REGISTRY.filter(
|
|
1925
|
-
command =>
|
|
2009
|
+
command =>
|
|
2010
|
+
!QUARANTINED_UTILITY_SLASH_COMMANDS.has(command.name) &&
|
|
2011
|
+
(command.name !== "import-session" || IMPORT_SESSION_RETAINED_DESCRIPTOR_AUTHORITY_AVAILABLE),
|
|
1926
2012
|
);
|
|
1927
2013
|
|
|
1928
2014
|
const BUILTIN_SLASH_COMMAND_LOOKUP = new Map<string, SlashCommandSpec>();
|
|
@@ -2005,6 +2091,18 @@ export async function executeBuiltinSlashCommand(
|
|
|
2005
2091
|
return false;
|
|
2006
2092
|
}
|
|
2007
2093
|
|
|
2094
|
+
/** Dispatch a command explicitly authorized for trusted local non-interactive mode. */
|
|
2095
|
+
export async function executeLocalHeadlessBuiltinSlashCommand(
|
|
2096
|
+
text: string,
|
|
2097
|
+
runtime: SlashCommandRuntime,
|
|
2098
|
+
): Promise<false | Exclude<SlashCommandResult, undefined>> {
|
|
2099
|
+
const parsed = parseSlashCommand(text);
|
|
2100
|
+
if (!parsed) return false;
|
|
2101
|
+
const command = BUILTIN_SLASH_COMMAND_LOOKUP.get(parsed.name);
|
|
2102
|
+
if (!command?.handle || command.localHeadless !== true) return false;
|
|
2103
|
+
if (parsed.args.length > 0 && !command.allowArgs) return false;
|
|
2104
|
+
return (await command.handle(parsed, runtime)) ?? { consumed: true };
|
|
2105
|
+
}
|
|
2008
2106
|
/** Look up a unified spec by name or alias. Used by the ACP dispatcher. */
|
|
2009
2107
|
export function lookupBuiltinSlashCommand(name: string): SlashCommandSpec | undefined {
|
|
2010
2108
|
return BUILTIN_SLASH_COMMAND_LOOKUP.get(name);
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { AuthCredentialSelector, AuthCredentialSnapshotEntry } from "@gajae-code/ai/core";
|
|
2
|
+
import { parseCliCredentialSelector } from "../../runtime-credential-selector";
|
|
3
|
+
import type { SlashCommandRuntime } from "../types";
|
|
4
|
+
|
|
5
|
+
/** Human-readable label for one stored OAuth credential row. */
|
|
6
|
+
function describeCredentialRow(entry: AuthCredentialSnapshotEntry): string {
|
|
7
|
+
if (entry.credential.type !== "oauth") return `id:${entry.id} (api key)`;
|
|
8
|
+
const email = entry.credential.email;
|
|
9
|
+
const accountId = entry.credential.accountId;
|
|
10
|
+
const label = email ?? accountId ?? `row ${entry.id}`;
|
|
11
|
+
return `id:${entry.id} — ${label}`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function formatProviderName(provider: string): string {
|
|
15
|
+
return provider
|
|
16
|
+
.split(/[-_]/g)
|
|
17
|
+
.map(part => (part ? part[0].toUpperCase() + part.slice(1) : ""))
|
|
18
|
+
.join(" ");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Whether a stored OAuth snapshot row matches a credential selector. */
|
|
22
|
+
function selectorMatchesRow(selector: AuthCredentialSelector, entry: AuthCredentialSnapshotEntry): boolean {
|
|
23
|
+
if (entry.credential.type !== "oauth") return false;
|
|
24
|
+
switch (selector.kind) {
|
|
25
|
+
case "id":
|
|
26
|
+
return String(entry.id) === selector.value;
|
|
27
|
+
case "email":
|
|
28
|
+
return (
|
|
29
|
+
typeof entry.credential.email === "string" &&
|
|
30
|
+
entry.credential.email.toLowerCase() === selector.value.toLowerCase()
|
|
31
|
+
);
|
|
32
|
+
case "account":
|
|
33
|
+
return entry.credential.accountId === selector.value;
|
|
34
|
+
case "project":
|
|
35
|
+
return entry.credential.projectId === selector.value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolve which provider a bare (unqualified) `/credential <selector>`
|
|
41
|
+
* targets. Prefers the current session model's provider when it actually has
|
|
42
|
+
* a matching OAuth row (the common case: switching among a provider's own
|
|
43
|
+
* accounts while that provider is active). Falls back to scanning every
|
|
44
|
+
* provider's stored OAuth rows for a unique match, so `/credential
|
|
45
|
+
* email:me@example.com` still works when the selector uniquely matches a
|
|
46
|
+
* provider other than the active one. Ambiguous or absent matches return an
|
|
47
|
+
* explanatory string instead of a provider id.
|
|
48
|
+
*/
|
|
49
|
+
function inferProvider(
|
|
50
|
+
runtime: SlashCommandRuntime,
|
|
51
|
+
oauthRows: AuthCredentialSnapshotEntry[],
|
|
52
|
+
selector: AuthCredentialSelector,
|
|
53
|
+
selectorRaw: string,
|
|
54
|
+
): { provider: string } | { error: string } {
|
|
55
|
+
const currentProvider = runtime.session.model?.provider;
|
|
56
|
+
if (
|
|
57
|
+
currentProvider &&
|
|
58
|
+
oauthRows.some(entry => entry.provider === currentProvider && selectorMatchesRow(selector, entry))
|
|
59
|
+
) {
|
|
60
|
+
return { provider: currentProvider };
|
|
61
|
+
}
|
|
62
|
+
const matchingProviders = [
|
|
63
|
+
...new Set(oauthRows.filter(entry => selectorMatchesRow(selector, entry)).map(entry => entry.provider)),
|
|
64
|
+
];
|
|
65
|
+
if (matchingProviders.length === 1) return { provider: matchingProviders[0]! };
|
|
66
|
+
if (oauthRows.length === 0) {
|
|
67
|
+
return { error: "No provider has any stored OAuth credentials to switch between." };
|
|
68
|
+
}
|
|
69
|
+
if (matchingProviders.length === 0) {
|
|
70
|
+
return { error: `No stored OAuth credential matches ${selector.kind}:${selector.value}.` };
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
error: `"${selectorRaw}" is ambiguous across providers (${matchingProviders.join(", ")}). Use provider/${selectorRaw}.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* List every provider's stored OAuth accounts, marking which row each
|
|
79
|
+
* currently-tracked session is using.
|
|
80
|
+
*/
|
|
81
|
+
export async function buildCredentialListText(runtime: SlashCommandRuntime): Promise<string> {
|
|
82
|
+
const authStorage = runtime.session.modelRegistry.authStorage;
|
|
83
|
+
const snapshot = authStorage.exportSnapshot();
|
|
84
|
+
const oauthRows = snapshot.credentials.filter(entry => entry.credential.type === "oauth");
|
|
85
|
+
if (oauthRows.length === 0) {
|
|
86
|
+
return "No stored OAuth credentials. Use /login <provider> to add one.";
|
|
87
|
+
}
|
|
88
|
+
const grouped = new Map<string, AuthCredentialSnapshotEntry[]>();
|
|
89
|
+
for (const entry of oauthRows) {
|
|
90
|
+
const rows = grouped.get(entry.provider) ?? [];
|
|
91
|
+
rows.push(entry);
|
|
92
|
+
grouped.set(entry.provider, rows);
|
|
93
|
+
}
|
|
94
|
+
const lines = ["Stored accounts (/credential <selector> to switch this session):"];
|
|
95
|
+
for (const [provider, rows] of [...grouped.entries()].sort(([left], [right]) => left.localeCompare(right))) {
|
|
96
|
+
lines.push("", formatProviderName(provider));
|
|
97
|
+
const activeRowId = authStorage.getSessionCredentialRowId(provider, runtime.session.credentialSessionId);
|
|
98
|
+
for (const entry of rows) {
|
|
99
|
+
const active = entry.id === activeRowId ? " (active this session)" : "";
|
|
100
|
+
lines.push(`- ${describeCredentialRow(entry)}${active}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Switch the running session's stored OAuth credential for a provider,
|
|
108
|
+
* independent of quota state. Returns the confirmation/error text to show
|
|
109
|
+
* the user; never throws.
|
|
110
|
+
*/
|
|
111
|
+
export async function switchSessionCredentialCommand(runtime: SlashCommandRuntime, args: string): Promise<string> {
|
|
112
|
+
const trimmed = args.trim();
|
|
113
|
+
if (!trimmed) return await buildCredentialListText(runtime);
|
|
114
|
+
|
|
115
|
+
let parsed: ReturnType<typeof parseCliCredentialSelector>;
|
|
116
|
+
try {
|
|
117
|
+
parsed = parseCliCredentialSelector(trimmed);
|
|
118
|
+
} catch {
|
|
119
|
+
return `Invalid selector "${trimmed}". Use email:name@example.com, id:15, account:<id>, project:<id>, or provider/<selector>.`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const authStorage = runtime.session.modelRegistry.authStorage;
|
|
123
|
+
const snapshot = authStorage.exportSnapshot();
|
|
124
|
+
const oauthRows = snapshot.credentials.filter(entry => entry.credential.type === "oauth");
|
|
125
|
+
|
|
126
|
+
let provider = parsed.provider;
|
|
127
|
+
if (!provider) {
|
|
128
|
+
const inferred = inferProvider(runtime, oauthRows, parsed.selector, trimmed);
|
|
129
|
+
if ("error" in inferred) return inferred.error;
|
|
130
|
+
provider = inferred.provider;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
authStorage.switchSessionCredential(provider, runtime.session.credentialSessionId, parsed.selector);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
return error instanceof Error ? error.message : String(error);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const rowId = authStorage.getSessionCredentialRowId(provider, runtime.session.credentialSessionId);
|
|
140
|
+
const matchedRow = oauthRows.find(entry => entry.id === rowId);
|
|
141
|
+
const label = matchedRow ? describeCredentialRow(matchedRow) : `${provider} (${trimmed})`;
|
|
142
|
+
return `Switched this session to ${label}. Takes effect on the next request to ${formatProviderName(provider)}.`;
|
|
143
|
+
}
|
|
@@ -351,7 +351,11 @@ async function handleListCommand(runtime: SlashCommandRuntime): Promise<SlashCom
|
|
|
351
351
|
readMCPConfigFile(userPath),
|
|
352
352
|
readMCPConfigFile(projectPath),
|
|
353
353
|
]);
|
|
354
|
-
const
|
|
354
|
+
const [userDisabled, projectDisabled] = await Promise.all([
|
|
355
|
+
readDisabledServers(userPath),
|
|
356
|
+
readDisabledServers(projectPath),
|
|
357
|
+
]);
|
|
358
|
+
const disabledSet = new Set([...userDisabled, ...projectDisabled]);
|
|
355
359
|
const entries: Array<{ name: string; config: MCPServerConfig; scope: string }> = [];
|
|
356
360
|
for (const [name, config] of Object.entries(userConfig.mcpServers ?? {})) {
|
|
357
361
|
entries.push({ name, config, scope: "user" });
|
|
@@ -367,7 +371,9 @@ async function handleListCommand(runtime: SlashCommandRuntime): Promise<SlashCom
|
|
|
367
371
|
entries
|
|
368
372
|
.map(({ name, config, scope }) => {
|
|
369
373
|
const type = config.type ?? "stdio";
|
|
370
|
-
const
|
|
374
|
+
const disabled = config.enabled === false || disabledSet.has(name);
|
|
375
|
+
const autoloadOff = !disabled && config.autoload === false;
|
|
376
|
+
const status = disabled ? "disabled" : autoloadOff ? "autoload-off" : "autoload";
|
|
371
377
|
let location: string | undefined;
|
|
372
378
|
if (config.type === "http" || config.type === "sse") {
|
|
373
379
|
// Strip query string and userinfo from URLs to avoid leaking
|
|
@@ -388,7 +394,7 @@ async function handleListCommand(runtime: SlashCommandRuntime): Promise<SlashCom
|
|
|
388
394
|
} else {
|
|
389
395
|
location = (config as { command: string }).command;
|
|
390
396
|
}
|
|
391
|
-
return `${name} | ${type} | ${
|
|
397
|
+
return `${name} | ${type} | ${status} | ${location ?? "(unknown)"} [${scope}]`;
|
|
392
398
|
})
|
|
393
399
|
.join("\n"),
|
|
394
400
|
);
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import type { UsageLimit
|
|
1
|
+
import type { UsageLimit } from "@gajae-code/ai/core";
|
|
2
|
+
import { sanitizeText } from "@gajae-code/utils";
|
|
3
|
+
import {
|
|
4
|
+
type AccountInventoryRow,
|
|
5
|
+
buildAccountInventorySnapshot,
|
|
6
|
+
checkAccountInventory,
|
|
7
|
+
} from "../../session/account-inventory";
|
|
8
|
+
import { truncateHead } from "../../session/streaming-output";
|
|
2
9
|
import type { SlashCommandRuntime } from "../types";
|
|
3
|
-
import { formatDuration
|
|
10
|
+
import { formatDuration } from "./format";
|
|
4
11
|
|
|
5
|
-
function
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
.map(part => (part ? part[0].toUpperCase() + part.slice(1) : ""))
|
|
9
|
-
.join(" ");
|
|
12
|
+
function sanitizeAndTruncateOutput(text: string): string {
|
|
13
|
+
const sanitized = sanitizeText(text);
|
|
14
|
+
return truncateHead(sanitized, { maxBytes: 32_768, maxLines: 1_000 }).content;
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
function formatUsageAmount(limit: UsageLimit): string {
|
|
@@ -21,63 +26,40 @@ function formatUsageAmount(limit: UsageLimit): string {
|
|
|
21
26
|
return `${usedText}${remainingText}`;
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
if (
|
|
27
|
-
|
|
28
|
-
if (
|
|
29
|
-
return
|
|
29
|
+
function healthLabel(row: AccountInventoryRow): string {
|
|
30
|
+
if (row.disabled) return `disabled${row.disabledCause ? `: ${row.disabledCause}` : ""}`;
|
|
31
|
+
if (row.health.status === "ok") return "ok";
|
|
32
|
+
if (row.health.status === "failed") return `failed${row.health.reason ? `: ${row.health.reason}` : ""}`;
|
|
33
|
+
if (row.health.status === "unverifiable") return `unverifiable${row.health.reason ? `: ${row.health.reason}` : ""}`;
|
|
34
|
+
return "unknown";
|
|
30
35
|
}
|
|
31
36
|
|
|
32
|
-
function
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const providerReports = grouped.get(report.provider) ?? [];
|
|
38
|
-
providerReports.push(report);
|
|
39
|
-
grouped.set(report.provider, providerReports);
|
|
37
|
+
function renderAccountRows(rows: AccountInventoryRow[], nowMs: number, checked: boolean): string {
|
|
38
|
+
const lines = [`Accounts${checked ? " (checked)" : " (cache only)"}`];
|
|
39
|
+
if (rows.length === 0) {
|
|
40
|
+
lines.push("No configured accounts or API-key sources discovered.");
|
|
41
|
+
return lines.join("\n");
|
|
40
42
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
for (
|
|
53
|
-
|
|
54
|
-
const window = limit.window?.label ?? limit.scope.windowId;
|
|
55
|
-
const tier = limit.scope.tier ? ` (${limit.scope.tier})` : "";
|
|
56
|
-
lines.push(`- ${limit.label}${tier}${window ? ` — ${window}` : ""}`);
|
|
57
|
-
lines.push(` ${formatUsageReportAccount(report, limit, index)}: ${formatUsageAmount(limit)}`);
|
|
58
|
-
lines.push(` ${renderAsciiBar(limit.amount.usedFraction)}`);
|
|
59
|
-
if (limit.window?.resetsAt) lines.push(` resets in ${formatDuration(limit.window.resetsAt - nowMs)}`);
|
|
60
|
-
if (limit.notes && limit.notes.length > 0) lines.push(` ${limit.notes.join(" • ")}`);
|
|
43
|
+
for (const row of rows) {
|
|
44
|
+
const identity = row.identityLabel ? ` — ${row.identityLabel}` : "";
|
|
45
|
+
const marker =
|
|
46
|
+
row.routing.marker === "active" ? " [active]" : row.routing.marker === "selected" ? " [selected]" : "";
|
|
47
|
+
const cache = row.usage
|
|
48
|
+
? `, usage ${row.usage.freshness}${formatDuration(Math.max(0, nowMs - row.usage.fetchedAt)) ? ` ${formatDuration(Math.max(0, nowMs - row.usage.fetchedAt))} ago` : ""}`
|
|
49
|
+
: "";
|
|
50
|
+
lines.push(
|
|
51
|
+
`- ${row.id}: ${row.provider}/${row.credentialKind} (${row.sourceLabel})${identity}${marker} — ${healthLabel(row)}${cache}`,
|
|
52
|
+
);
|
|
53
|
+
if (row.usage?.report.limits.length) {
|
|
54
|
+
for (const limit of row.usage.report.limits.slice(0, 8)) {
|
|
55
|
+
lines.push(` ${sanitizeText(limit.label)}: ${formatUsageAmount(limit)}`);
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
|
-
return
|
|
59
|
+
return lines.join("\n");
|
|
65
60
|
}
|
|
66
61
|
|
|
67
|
-
|
|
68
|
-
* Build the `/usage` ACP-mode text. Prefers provider-reported limits when the
|
|
69
|
-
* session exposes `fetchUsageReports`; otherwise falls back to the local
|
|
70
|
-
* session-manager tallies.
|
|
71
|
-
*/
|
|
72
|
-
export async function buildUsageReportText(runtime: SlashCommandRuntime): Promise<string> {
|
|
73
|
-
const provider = runtime.session as SlashCommandRuntime["session"] & {
|
|
74
|
-
fetchUsageReports?: () => Promise<UsageReport[] | null>;
|
|
75
|
-
};
|
|
76
|
-
if (provider.fetchUsageReports) {
|
|
77
|
-
const reports = await provider.fetchUsageReports();
|
|
78
|
-
if (reports && reports.length > 0) return renderUsageReports(reports, Date.now());
|
|
79
|
-
}
|
|
80
|
-
|
|
62
|
+
function buildLegacyUsage(runtime: SlashCommandRuntime): string {
|
|
81
63
|
const stats = runtime.session.sessionManager.getUsageStatistics();
|
|
82
64
|
return [
|
|
83
65
|
"Usage",
|
|
@@ -89,3 +71,26 @@ export async function buildUsageReportText(runtime: SlashCommandRuntime): Promis
|
|
|
89
71
|
`Cost: $${stats.cost.toFixed(6)}`,
|
|
90
72
|
].join("\n");
|
|
91
73
|
}
|
|
74
|
+
|
|
75
|
+
export interface UsageReportOptions {
|
|
76
|
+
check?: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Build `/usage`; plain mode is cache-only and never fetches or probes. */
|
|
80
|
+
export async function buildUsageReportText(
|
|
81
|
+
runtime: SlashCommandRuntime,
|
|
82
|
+
options: UsageReportOptions = {},
|
|
83
|
+
): Promise<string> {
|
|
84
|
+
const session = runtime.session;
|
|
85
|
+
const modelRegistry = session.modelRegistry;
|
|
86
|
+
const input = {
|
|
87
|
+
authStorage: modelRegistry.authStorage,
|
|
88
|
+
modelRegistry,
|
|
89
|
+
sessionId: session.credentialSessionId ?? session.sessionId,
|
|
90
|
+
};
|
|
91
|
+
const snapshot = options.check ? await checkAccountInventory(input) : buildAccountInventorySnapshot(input);
|
|
92
|
+
const report = renderAccountRows(snapshot.rows, Date.now(), options.check === true);
|
|
93
|
+
const legacy = buildLegacyUsage(runtime);
|
|
94
|
+
|
|
95
|
+
return sanitizeAndTruncateOutput(`${report}\n\n${legacy}`);
|
|
96
|
+
}
|
|
@@ -34,11 +34,12 @@ export interface ParsedSlashCommand {
|
|
|
34
34
|
* Result returned by a slash-command handler.
|
|
35
35
|
*
|
|
36
36
|
* - `void` / `undefined` — command was handled and consumed; no further input.
|
|
37
|
-
* - `{ consumed: true }` — explicit equivalent of the above
|
|
37
|
+
* - `{ consumed: true, exitCode?: number }` — explicit equivalent of the above;
|
|
38
|
+
* trusted local headless mode applies an optional non-zero process status.
|
|
38
39
|
* - `{ prompt: string }` — command handled, pass `prompt` through as the new
|
|
39
40
|
* user input (e.g. `/force <tool> <prompt>` keeps `<prompt>` as the message).
|
|
40
41
|
*/
|
|
41
|
-
export type SlashCommandResult = undefined | { consumed: true } | { prompt: string };
|
|
42
|
+
export type SlashCommandResult = undefined | { consumed: true; exitCode?: number } | { prompt: string };
|
|
42
43
|
|
|
43
44
|
/**
|
|
44
45
|
* Runtime visible to slash-command handlers that run in text/ACP mode.
|
|
@@ -98,6 +99,10 @@ export interface SlashCommandSpec extends BuiltinSlashCommand {
|
|
|
98
99
|
* not silently drop it from `available_commands_update`.
|
|
99
100
|
*/
|
|
100
101
|
acpInputHint?: string;
|
|
102
|
+
/** Set false for trusted local commands that must never be advertised or dispatched through ACP. */
|
|
103
|
+
acp?: boolean;
|
|
104
|
+
/** Explicitly authorizes this handler in trusted local non-interactive print mode. */
|
|
105
|
+
localHeadless?: boolean;
|
|
101
106
|
/**
|
|
102
107
|
* Text/ACP-mode handler. The same body is invoked from the ACP dispatcher
|
|
103
108
|
* and, via the TUI adapter, when no `handleTui` override is provided.
|