@gajae-code/coding-agent 0.13.3 → 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 +184 -2
- 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 +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- 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 +1 -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/gajae-pet-widget.d.ts +8 -30
- 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 +11 -25
- 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/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 +40 -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 +9 -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 +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- 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/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 +40 -32
- package/src/main.ts +32 -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/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/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- 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 +177 -72
- 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/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 +2857 -582
- 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 +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- 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 +98 -16
- 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 +27 -16
- 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/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
package/src/capability/index.ts
CHANGED
|
@@ -212,7 +212,9 @@ async function loadImpl<T>(
|
|
|
212
212
|
function filterProviders<T>(capability: Capability<T>, options: LoadOptions): Provider<T>[] {
|
|
213
213
|
const activeSettings = options.settings ?? settingsByCwd.get(path.normalize(options.cwd ?? getProjectDir()));
|
|
214
214
|
const activeDisabledProviders = new Set(activeSettings?.get("disabledProviders") ?? disabledProviders);
|
|
215
|
-
let providers = (capability.providers as Provider<T>[]).filter(
|
|
215
|
+
let providers = (capability.providers as Provider<T>[]).filter(
|
|
216
|
+
p => options.includeDisabledProviders === true || !activeDisabledProviders.has(p.id),
|
|
217
|
+
);
|
|
216
218
|
if (options.providers) {
|
|
217
219
|
const allowed = new Set(options.providers);
|
|
218
220
|
providers = providers.filter(p => allowed.has(p.id));
|
package/src/capability/mcp.ts
CHANGED
|
@@ -21,6 +21,12 @@ export interface MCPServer {
|
|
|
21
21
|
/** MCP connection pool identity mode; defaults to one lease per session. */
|
|
22
22
|
sharing?: "per-session" | "shared";
|
|
23
23
|
timeout?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Protocol preference for remote (http/sse) servers: `auto` (default) negotiates
|
|
26
|
+
* MCP 2026-07-28 (stateless) first with a bounded observable legacy fallback,
|
|
27
|
+
* `2026-07-28` is strict modern-only, `legacy` forces the compatibility handshake.
|
|
28
|
+
*/
|
|
29
|
+
protocol?: "auto" | "2026-07-28" | "legacy";
|
|
24
30
|
/** Command to run (for stdio transport) */
|
|
25
31
|
command?: string;
|
|
26
32
|
/** Command arguments */
|
package/src/capability/types.ts
CHANGED
|
@@ -71,6 +71,12 @@ export interface LoadOptions {
|
|
|
71
71
|
includeInvalid?: boolean;
|
|
72
72
|
/** Include items disabled via settings. Default: false */
|
|
73
73
|
includeDisabled?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Include providers disabled via settings (for diagnostics). Default: false.
|
|
76
|
+
* Items loaded from a disabled provider are not marked by the registry; callers
|
|
77
|
+
* compare `_source.provider` against the disabled-provider set themselves.
|
|
78
|
+
*/
|
|
79
|
+
includeDisabledProviders?: boolean;
|
|
74
80
|
/** Explicit disabled extension IDs to apply instead of settings. */
|
|
75
81
|
disabledExtensions?: string[];
|
|
76
82
|
/** Session settings whose provider policy applies to this load. */
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlers for the sole account-management CLI namespace (`gjc accounts`).
|
|
3
|
+
*
|
|
4
|
+
* This surface deliberately consumes AuthStorage's payload-free inventory APIs.
|
|
5
|
+
* Credential payloads are never rendered or copied into settings; persistent pins
|
|
6
|
+
* are written as canonical `id:<row-id>` selectors only.
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
type AuthCredentialSelector,
|
|
10
|
+
type AuthStorage,
|
|
11
|
+
type CredentialInventoryRecord,
|
|
12
|
+
type CredentialRemovalTarget,
|
|
13
|
+
resolveOAuthStorageProvider,
|
|
14
|
+
} from "@gajae-code/ai/core";
|
|
15
|
+
import { getAgentDir } from "@gajae-code/utils";
|
|
16
|
+
import { ModelRegistry } from "../config/model-registry";
|
|
17
|
+
import { type RawSettings, Settings, type SettingsAtomicPatch } from "../config/settings";
|
|
18
|
+
import { discoverAuthStorage } from "../sdk/session";
|
|
19
|
+
import {
|
|
20
|
+
buildAccountInventorySnapshot,
|
|
21
|
+
checkAccountInventory,
|
|
22
|
+
clearPersistentPinForRemovedRows,
|
|
23
|
+
} from "../session/account-inventory";
|
|
24
|
+
import { resolveStartupAuthConfig, type StartupAuthConfigSnapshot } from "../session/startup-auth-config";
|
|
25
|
+
|
|
26
|
+
export const ACCOUNTS_ACTIONS = ["list", "check", "pin", "logout"] as const;
|
|
27
|
+
export type AccountsAction = (typeof ACCOUNTS_ACTIONS)[number];
|
|
28
|
+
|
|
29
|
+
export interface AccountsCommandArgs {
|
|
30
|
+
action: AccountsAction;
|
|
31
|
+
provider?: string;
|
|
32
|
+
selector?: string;
|
|
33
|
+
flags: {
|
|
34
|
+
json?: boolean;
|
|
35
|
+
persistent?: boolean;
|
|
36
|
+
clear?: boolean;
|
|
37
|
+
account?: string;
|
|
38
|
+
all?: boolean;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class AccountsCommandError extends Error {
|
|
43
|
+
constructor(message: string) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.name = "AccountsCommandError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function writeJson(value: unknown): void {
|
|
50
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function writeText(lines: readonly string[]): void {
|
|
54
|
+
process.stdout.write(`${lines.join("\n")}\n`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function asRecord(value: unknown): Record<string, unknown> | undefined {
|
|
58
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
59
|
+
? (value as Record<string, unknown>)
|
|
60
|
+
: undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function cleanReason(value: unknown): string | undefined {
|
|
64
|
+
if (value === undefined || value === null) return undefined;
|
|
65
|
+
let reason = value instanceof Error ? value.message : String(value);
|
|
66
|
+
reason = reason.replace(/bearer\s+[^\s,;]+/gi, "Bearer [redacted]");
|
|
67
|
+
reason = reason.replace(/(api[_-]?key|token|secret|authorization)[=:]\s*[^\s,;]+/gi, "$1=[redacted]");
|
|
68
|
+
reason = reason.replace(/[\r\n\t ]+/g, " ").trim();
|
|
69
|
+
if (reason.length > 256) reason = `${reason.slice(0, 253)}...`;
|
|
70
|
+
return reason || undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function canonicalProvider(provider: string | undefined): string {
|
|
74
|
+
const value = provider?.trim();
|
|
75
|
+
if (!value) throw new AccountsCommandError("A provider is required.");
|
|
76
|
+
if (/[\u0000-\u001f\u007f]/u.test(value))
|
|
77
|
+
throw new AccountsCommandError("Provider contains invalid control characters.");
|
|
78
|
+
return resolveOAuthStorageProvider(value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function selectorFromInput(raw: string | undefined): AuthCredentialSelector {
|
|
82
|
+
const value = raw?.trim() ?? "";
|
|
83
|
+
if (/^id:[1-9]\d*$/.test(value)) return { kind: "id", value: value.slice(3) };
|
|
84
|
+
if (/^email:[^@\s]+@[^@\s]+$/.test(value)) return { kind: "email", value: value.slice(6) };
|
|
85
|
+
if (/^account:\S+$/.test(value)) return { kind: "account", value: value.slice(8) };
|
|
86
|
+
if (/^[^@\s]+@[^@\s]+$/.test(value)) return { kind: "email", value };
|
|
87
|
+
throw new AccountsCommandError(
|
|
88
|
+
"Pin target must be a bare email or an id:<row-id>, email:<email>, or account:<account-id> selector.",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function inventoryIdentity(row: CredentialInventoryRecord): string | undefined {
|
|
93
|
+
return typeof row.identityLabel === "string" ? row.identityLabel : undefined;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function formatCandidate(row: CredentialInventoryRecord): string {
|
|
97
|
+
const identity = inventoryIdentity(row) ?? "(no identity)";
|
|
98
|
+
return ` id=${row.id} ${identity}${row.disabled ? " [disabled]" : ""}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function withAuthStorageAndModels<T>(
|
|
102
|
+
callback: (storage: AuthStorage, modelRegistry: ModelRegistry, startupAuth: StartupAuthConfigSnapshot) => Promise<T>,
|
|
103
|
+
): Promise<T> {
|
|
104
|
+
const startupAuth = await resolveStartupAuthConfig();
|
|
105
|
+
const storage = await discoverAuthStorage(getAgentDir(), startupAuth);
|
|
106
|
+
const modelRegistry = new ModelRegistry(storage);
|
|
107
|
+
try {
|
|
108
|
+
await modelRegistry.refresh("offline");
|
|
109
|
+
return await callback(storage, modelRegistry, startupAuth);
|
|
110
|
+
} finally {
|
|
111
|
+
storage.close();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function runList(flags: AccountsCommandArgs["flags"]): Promise<void> {
|
|
116
|
+
await withAuthStorageAndModels(async (storage, modelRegistry) => {
|
|
117
|
+
const snapshot = buildAccountInventorySnapshot({ authStorage: storage, modelRegistry });
|
|
118
|
+
const accounts = snapshot.rows;
|
|
119
|
+
if (flags.json) {
|
|
120
|
+
writeJson({ ok: true, generatedAt: snapshot.generatedAt, generation: snapshot.generation, accounts });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (accounts.length === 0) {
|
|
124
|
+
writeText(["No stored accounts or configured API-key sources."]);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
writeText(
|
|
128
|
+
accounts.map(account => {
|
|
129
|
+
const identity = account.identityLabel ?? "(no identity)";
|
|
130
|
+
const usage = account.usage?.freshness ?? "unknown";
|
|
131
|
+
const health = account.health.status;
|
|
132
|
+
return `${account.provider}\tid=${account.id}\t${account.credentialKind}\t${identity}\t${account.source}\t${
|
|
133
|
+
account.disabled ? "disabled" : "active"
|
|
134
|
+
}\thealth=${health}\tusage=${usage}`;
|
|
135
|
+
}),
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function runCheck(providerArg: string | undefined, flags: AccountsCommandArgs["flags"]): Promise<void> {
|
|
141
|
+
const provider = providerArg ? canonicalProvider(providerArg) : undefined;
|
|
142
|
+
await withAuthStorageAndModels(async (storage, modelRegistry) => {
|
|
143
|
+
const snapshot = await checkAccountInventory({
|
|
144
|
+
authStorage: storage,
|
|
145
|
+
modelRegistry,
|
|
146
|
+
provider,
|
|
147
|
+
});
|
|
148
|
+
const checks = snapshot.rows
|
|
149
|
+
.filter(row => provider === undefined || row.provider === provider)
|
|
150
|
+
.map(row => ({
|
|
151
|
+
id: row.id,
|
|
152
|
+
provider: row.provider,
|
|
153
|
+
kind: row.credentialKind,
|
|
154
|
+
source: row.source,
|
|
155
|
+
...(row.identityLabel ? { identity: row.identityLabel } : {}),
|
|
156
|
+
ok: row.health.status === "ok" ? true : row.health.status === "failed" ? false : null,
|
|
157
|
+
status: row.health.status === "ok" ? "ok" : row.health.status === "failed" ? "failed" : "unknown",
|
|
158
|
+
...(cleanReason(row.health.reason) ? { reason: cleanReason(row.health.reason) } : {}),
|
|
159
|
+
}));
|
|
160
|
+
if (flags.json) {
|
|
161
|
+
writeJson({ ok: true, ...(provider ? { provider } : {}), checks });
|
|
162
|
+
} else if (checks.length === 0) {
|
|
163
|
+
writeText([provider ? `No account sources for ${provider}.` : "No account sources."]);
|
|
164
|
+
} else {
|
|
165
|
+
writeText(
|
|
166
|
+
checks.map(check => {
|
|
167
|
+
const identity = check.identity ?? "(no identity)";
|
|
168
|
+
const reason = check.reason ? ` — ${check.reason}` : "";
|
|
169
|
+
return `${check.provider}\tid=${check.id}\t${check.kind}\t${check.source}\t${identity}\t${check.status}${reason}`;
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
if (checks.some(check => check.ok === false)) process.exitCode = 1;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function assertPersistent(flags: AccountsCommandArgs["flags"]): void {
|
|
178
|
+
if (!flags.persistent) {
|
|
179
|
+
throw new AccountsCommandError("Persistent account pinning requires --persistent.");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function pinsFromCurrent(current: Readonly<RawSettings>): Record<string, string> {
|
|
184
|
+
const auth = current.auth;
|
|
185
|
+
if (auth === undefined) return {};
|
|
186
|
+
const authRecord = asRecord(auth);
|
|
187
|
+
if (!authRecord) throw new AccountsCommandError("Global auth configuration is malformed; no pin was written.");
|
|
188
|
+
const rawPins = authRecord.credentialPins;
|
|
189
|
+
if (rawPins === undefined) return {};
|
|
190
|
+
const pins = asRecord(rawPins);
|
|
191
|
+
if (!pins || Object.values(pins).some(value => typeof value !== "string")) {
|
|
192
|
+
throw new AccountsCommandError("Global auth.credentialPins is malformed; no pin was written.");
|
|
193
|
+
}
|
|
194
|
+
return Object.fromEntries(Object.entries(pins).map(([key, value]) => [key, String(value).trim()]));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async function writePersistentPin(
|
|
198
|
+
provider: string,
|
|
199
|
+
selector: string | undefined,
|
|
200
|
+
clear: boolean,
|
|
201
|
+
credentialStoreIdentity?: string,
|
|
202
|
+
): Promise<void> {
|
|
203
|
+
const settings = await Settings.init();
|
|
204
|
+
await settings.commitAtomicBatchWithCurrent(current => {
|
|
205
|
+
const pins = pinsFromCurrent(current);
|
|
206
|
+
const currentAuth = asRecord(current.auth);
|
|
207
|
+
const existingStoreIdentity =
|
|
208
|
+
typeof currentAuth?.credentialPinStoreIdentity === "string"
|
|
209
|
+
? currentAuth.credentialPinStoreIdentity.trim()
|
|
210
|
+
: undefined;
|
|
211
|
+
if (
|
|
212
|
+
Object.values(pins).some(value => value.startsWith("id:")) &&
|
|
213
|
+
credentialStoreIdentity &&
|
|
214
|
+
existingStoreIdentity !== credentialStoreIdentity
|
|
215
|
+
) {
|
|
216
|
+
for (const [pinnedProvider, pinnedSelector] of Object.entries(pins)) {
|
|
217
|
+
if (pinnedSelector.startsWith("id:")) delete pins[pinnedProvider];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (clear) delete pins[provider];
|
|
221
|
+
else if (selector) pins[provider] = selector;
|
|
222
|
+
const patches: SettingsAtomicPatch[] = [{ path: "auth.credentialPins", op: "set", value: pins }];
|
|
223
|
+
const hasNumericPins = Object.values(pins).some(value => value.startsWith("id:"));
|
|
224
|
+
if (hasNumericPins) {
|
|
225
|
+
if (credentialStoreIdentity && (!existingStoreIdentity || existingStoreIdentity === credentialStoreIdentity)) {
|
|
226
|
+
patches.push({ path: "auth.credentialPinStoreIdentity", op: "set", value: credentialStoreIdentity });
|
|
227
|
+
} else if (!clear) {
|
|
228
|
+
throw new AccountsCommandError(
|
|
229
|
+
"Numeric persistent pins require a credential-store identity; no pin was written.",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
patches.push({ path: "auth.credentialPinStoreIdentity", op: "unset" });
|
|
234
|
+
}
|
|
235
|
+
return patches;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function runPin(
|
|
240
|
+
providerArg: string | undefined,
|
|
241
|
+
selectorArg: string | undefined,
|
|
242
|
+
flags: AccountsCommandArgs["flags"],
|
|
243
|
+
): Promise<void> {
|
|
244
|
+
assertPersistent(flags);
|
|
245
|
+
const provider = canonicalProvider(providerArg);
|
|
246
|
+
if (flags.clear && selectorArg) {
|
|
247
|
+
throw new AccountsCommandError("Use either a pin selector or --clear, not both.");
|
|
248
|
+
}
|
|
249
|
+
if (!flags.clear && !selectorArg) {
|
|
250
|
+
throw new AccountsCommandError("Pin requires a selector, or use --clear to remove the persistent pin.");
|
|
251
|
+
}
|
|
252
|
+
if (flags.clear) {
|
|
253
|
+
await writePersistentPin(provider, undefined, true);
|
|
254
|
+
if (flags.json) writeJson({ ok: true, provider, cleared: true });
|
|
255
|
+
else writeText([`Cleared persistent account pin for ${provider}.`]);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const selector = selectorFromInput(selectorArg);
|
|
260
|
+
await withAuthStorageAndModels(async (storage, modelRegistry, startupAuth) => {
|
|
261
|
+
if (
|
|
262
|
+
!modelRegistry.getConfiguredProviderIds().includes(provider) &&
|
|
263
|
+
modelRegistry.getAll().every(model => model.provider !== provider)
|
|
264
|
+
) {
|
|
265
|
+
throw new AccountsCommandError(`Provider ${provider} is not configured; no pin was written.`);
|
|
266
|
+
}
|
|
267
|
+
const target = storage.resolveOAuthPinTarget(provider, selector);
|
|
268
|
+
const canonicalSelector = `${target.canonicalSelector.kind}:${target.canonicalSelector.value}`;
|
|
269
|
+
await writePersistentPin(provider, canonicalSelector, false, startupAuth.credentialStoreIdentity);
|
|
270
|
+
if (flags.json) writeJson({ ok: true, provider, selector: canonicalSelector });
|
|
271
|
+
else writeText([`Pinned ${provider} to ${canonicalSelector}.`]);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function accountMatches(row: CredentialInventoryRecord, rawAccount: string): boolean {
|
|
276
|
+
const value = rawAccount.trim();
|
|
277
|
+
if (value.length === 0) return false;
|
|
278
|
+
if (/^[1-9]\d*$/.test(value) && row.id === Number(value)) return true;
|
|
279
|
+
const identity = inventoryIdentity(row);
|
|
280
|
+
return identity?.toLowerCase() === value.toLowerCase();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function removalCandidates(
|
|
284
|
+
inventory: readonly CredentialInventoryRecord[],
|
|
285
|
+
targets: readonly CredentialRemovalTarget[],
|
|
286
|
+
): Array<{ row: CredentialInventoryRecord; target: CredentialRemovalTarget }> {
|
|
287
|
+
const targetById = new Map(targets.map(target => [target.id, target]));
|
|
288
|
+
return inventory
|
|
289
|
+
.filter(row => row.credentialKind === "oauth")
|
|
290
|
+
.map(row => ({ row, target: targetById.get(row.id) }))
|
|
291
|
+
.filter((entry): entry is { row: CredentialInventoryRecord; target: CredentialRemovalTarget } => !!entry.target);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function throwLogoutResolutionError(
|
|
295
|
+
provider: string,
|
|
296
|
+
account: string | undefined,
|
|
297
|
+
candidates: readonly { row: CredentialInventoryRecord; target: CredentialRemovalTarget }[],
|
|
298
|
+
): never {
|
|
299
|
+
const lines =
|
|
300
|
+
candidates.length > 0
|
|
301
|
+
? ["Safe candidates:", ...candidates.map(candidate => formatCandidate(candidate.row))]
|
|
302
|
+
: ["No OAuth account candidates found."];
|
|
303
|
+
const prefix = account
|
|
304
|
+
? `Account ${JSON.stringify(account)} for ${provider} was missing or ambiguous.`
|
|
305
|
+
: `No removable OAuth accounts found for ${provider}.`;
|
|
306
|
+
throw new AccountsCommandError(`${prefix} No credentials were removed.\n${lines.join("\n")}`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function runLogout(providerArg: string | undefined, flags: AccountsCommandArgs["flags"]): Promise<void> {
|
|
310
|
+
const provider = canonicalProvider(providerArg);
|
|
311
|
+
if ((flags.all ? 1 : 0) + (flags.account ? 1 : 0) !== 1) {
|
|
312
|
+
throw new AccountsCommandError("Logout requires exactly one of --account <id|email> or --all.");
|
|
313
|
+
}
|
|
314
|
+
const startupAuth = await resolveStartupAuthConfig();
|
|
315
|
+
if (startupAuth.broker) {
|
|
316
|
+
throw new AccountsCommandError(
|
|
317
|
+
"`gjc accounts logout` only mutates local credentials. A broker/gateway is configured; run logout on the broker host with `gjc auth-broker` or unset the broker configuration. No credentials were removed.",
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
const storage = await discoverAuthStorage(getAgentDir(), startupAuth);
|
|
321
|
+
try {
|
|
322
|
+
const inventory = storage.listCredentialInventory(provider);
|
|
323
|
+
const targets = removalCandidates(inventory, storage.listCredentialRemovalTargets(provider));
|
|
324
|
+
const selected = flags.all
|
|
325
|
+
? targets
|
|
326
|
+
: targets.filter(candidate => accountMatches(candidate.row, flags.account ?? ""));
|
|
327
|
+
if (selected.length !== 1 && !flags.all) throwLogoutResolutionError(provider, flags.account, targets);
|
|
328
|
+
if (selected.length === 0) throwLogoutResolutionError(provider, flags.account, targets);
|
|
329
|
+
const result = storage.removeAuthCredentialsHard(
|
|
330
|
+
provider,
|
|
331
|
+
selected.map(candidate => candidate.target),
|
|
332
|
+
);
|
|
333
|
+
if (result.kind !== "removed") {
|
|
334
|
+
throw new AccountsCommandError(
|
|
335
|
+
`Account inventory changed before logout; no credentials were removed. Retry and choose from current candidates (ids: ${result.currentIds.join(", ") || "none"}).`,
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
const settings = await Settings.init();
|
|
339
|
+
await clearPersistentPinForRemovedRows(settings, provider, inventory, result.ids);
|
|
340
|
+
if (flags.json) writeJson({ ok: true, provider, removedIds: [...result.ids] });
|
|
341
|
+
else
|
|
342
|
+
writeText([
|
|
343
|
+
`Removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${provider}.`,
|
|
344
|
+
]);
|
|
345
|
+
} finally {
|
|
346
|
+
storage.close();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function writeJsonFailure(error: unknown): void {
|
|
351
|
+
// Machine contract: exactly one JSON document on stdout, never secrets/stacks.
|
|
352
|
+
if (error instanceof AccountsCommandError) {
|
|
353
|
+
writeJson({ ok: false, error: { code: "accounts-error", message: cleanReason(error) ?? "Command failed." } });
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
writeJson({
|
|
357
|
+
ok: false,
|
|
358
|
+
error: { code: "internal-error", message: "Accounts command failed; see stderr for diagnostics." },
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export async function runAccountsCommand(cmd: AccountsCommandArgs): Promise<void> {
|
|
363
|
+
try {
|
|
364
|
+
switch (cmd.action) {
|
|
365
|
+
case "list":
|
|
366
|
+
await runList(cmd.flags);
|
|
367
|
+
return;
|
|
368
|
+
case "check":
|
|
369
|
+
await runCheck(cmd.provider, cmd.flags);
|
|
370
|
+
return;
|
|
371
|
+
case "pin":
|
|
372
|
+
await runPin(cmd.provider, cmd.selector, cmd.flags);
|
|
373
|
+
return;
|
|
374
|
+
case "logout":
|
|
375
|
+
await runLogout(cmd.provider, cmd.flags);
|
|
376
|
+
return;
|
|
377
|
+
default: {
|
|
378
|
+
const exhaustive: never = cmd.action;
|
|
379
|
+
throw new AccountsCommandError(`Unknown accounts action: ${String(exhaustive)}`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
} catch (error) {
|
|
383
|
+
if (cmd.flags.json) {
|
|
384
|
+
if (!(error instanceof AccountsCommandError)) {
|
|
385
|
+
process.stderr.write(`accounts command failed: ${cleanReason(error) ?? "Command failed."}\n`);
|
|
386
|
+
}
|
|
387
|
+
process.exitCode = 1;
|
|
388
|
+
writeJsonFailure(error);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export { AccountsCommandError };
|
package/src/cli/args.ts
CHANGED
|
@@ -47,11 +47,14 @@ export interface Args {
|
|
|
47
47
|
default?: boolean;
|
|
48
48
|
apiKey?: string;
|
|
49
49
|
credential?: string;
|
|
50
|
+
preferCredential?: string;
|
|
50
51
|
systemPrompt?: string;
|
|
51
52
|
appendSystemPrompt?: string;
|
|
52
53
|
clipboardTransport?: "auto" | "native" | "osc52" | "ssh";
|
|
53
54
|
clipboardSshHost?: string;
|
|
54
55
|
mcpConfig?: string;
|
|
56
|
+
/** Opt a standalone session out of conventional MCP autoload (mutually exclusive with --mcp-config). */
|
|
57
|
+
noMcp?: boolean;
|
|
55
58
|
thinking?: Effort;
|
|
56
59
|
continue?: boolean;
|
|
57
60
|
resume?: string | true;
|
|
@@ -223,6 +226,12 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
|
|
|
223
226
|
throw new CliParseError("--credential requires <selector>");
|
|
224
227
|
}
|
|
225
228
|
result.credential = args[++i];
|
|
229
|
+
} else if (arg === "--prefer-credential") {
|
|
230
|
+
const next = args[i + 1];
|
|
231
|
+
if (!next || next.startsWith("-")) {
|
|
232
|
+
throw new CliParseError("--prefer-credential requires <selector>");
|
|
233
|
+
}
|
|
234
|
+
result.preferCredential = args[++i];
|
|
226
235
|
} else if (arg === "--system-prompt") {
|
|
227
236
|
result.systemPrompt = takePromptValue(args, i++, "--system-prompt", hasInlineValue);
|
|
228
237
|
} else if (arg === "--append-system-prompt") {
|
|
@@ -253,11 +262,19 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
|
|
|
253
262
|
if (result.mcpConfig !== undefined) {
|
|
254
263
|
throw new CliParseError("--mcp-config can only be specified once");
|
|
255
264
|
}
|
|
265
|
+
if (result.noMcp === true) {
|
|
266
|
+
throw new CliParseError("--no-mcp and --mcp-config are mutually exclusive");
|
|
267
|
+
}
|
|
256
268
|
const next = args[i + 1];
|
|
257
269
|
if (!next || next.startsWith("-") || !path.isAbsolute(next)) {
|
|
258
270
|
throw new CliParseError("--mcp-config requires <absolute-path>");
|
|
259
271
|
}
|
|
260
272
|
result.mcpConfig = args[++i];
|
|
273
|
+
} else if (arg === "--no-mcp") {
|
|
274
|
+
result.noMcp = true;
|
|
275
|
+
if (result.mcpConfig !== undefined) {
|
|
276
|
+
throw new CliParseError("--no-mcp and --mcp-config are mutually exclusive");
|
|
277
|
+
}
|
|
261
278
|
} else if (arg === "--provider-session-id") {
|
|
262
279
|
result.providerSessionId = takeFlagValue(args, i++, "--provider-session-id");
|
|
263
280
|
} else if (arg === "--no-session") {
|
|
@@ -357,6 +374,12 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
|
|
|
357
374
|
if (result.default && !result.mpreset) {
|
|
358
375
|
throw new CliParseError("--default requires --mpreset <name>");
|
|
359
376
|
}
|
|
377
|
+
if (result.credential && result.preferCredential) {
|
|
378
|
+
throw new CliParseError("--credential and --prefer-credential cannot be used together");
|
|
379
|
+
}
|
|
380
|
+
if (result.apiKey && result.preferCredential) {
|
|
381
|
+
throw new CliParseError("--api-key and --prefer-credential cannot be used together");
|
|
382
|
+
}
|
|
360
383
|
if (result.mcpConfig !== undefined && (result.listModels !== undefined || result.export !== undefined)) {
|
|
361
384
|
throw new CliParseError(
|
|
362
385
|
"--mcp-config is only supported in standalone interactive, tmux, print, text, or json modes.",
|