@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
|
@@ -641,6 +641,24 @@ function exactUnlinkFailure(result: NativeExactUnlinkResult): SessionDeleteVerif
|
|
|
641
641
|
: "stat";
|
|
642
642
|
return new SessionDeleteVerificationError(kind, `Exact transcript deletion rejected: ${result.code}`);
|
|
643
643
|
}
|
|
644
|
+
/**
|
|
645
|
+
* A transcript-phase exact unlink is terminal when no live bytes survive. The
|
|
646
|
+
* native exchange-placeholder protocol on POSIX always retains a zero-length,
|
|
647
|
+
* descriptor-scrubbed, fsync'd internal recovery entry after scrubbing the
|
|
648
|
+
* detached transcript; `payloadDurable` proves the payload was destroyed before
|
|
649
|
+
* that entry was retained, so a placeholder alone never keeps transcript bytes
|
|
650
|
+
* alive. A retained successor or unknown path is genuine uncertainty and must
|
|
651
|
+
* stay `cleanup_pending`.
|
|
652
|
+
*/
|
|
653
|
+
function transcriptDeletionTerminal(result: NativeExactUnlinkResult): boolean {
|
|
654
|
+
if (result.ok) return true;
|
|
655
|
+
return (
|
|
656
|
+
result.code === "cleanup_pending" &&
|
|
657
|
+
(result as typeof result & { payloadDurable?: boolean }).payloadDurable === true &&
|
|
658
|
+
result.retainedSuccessorPath === undefined &&
|
|
659
|
+
result.retainedUnknownPath === undefined
|
|
660
|
+
);
|
|
661
|
+
}
|
|
644
662
|
|
|
645
663
|
function isValidManagedSecurityContext(value: SessionStorageSecurityContext): value is ManagedSessionSecurityContext {
|
|
646
664
|
if (
|
|
@@ -1672,7 +1690,8 @@ function exactRemoveSessionStorageLockPath(
|
|
|
1672
1690
|
(result.code === "cleanup_pending" &&
|
|
1673
1691
|
result.payloadDurable === true &&
|
|
1674
1692
|
!result.retainedSuccessorPath &&
|
|
1675
|
-
!result.retainedUnknownPath
|
|
1693
|
+
!result.retainedUnknownPath &&
|
|
1694
|
+
(!result.retainedPlaceholderPath || path.resolve(result.retainedPlaceholderPath) !== path.resolve(lockPath)))
|
|
1676
1695
|
);
|
|
1677
1696
|
}
|
|
1678
1697
|
|
|
@@ -1890,7 +1909,9 @@ export class FileSessionStorage implements SessionStorage {
|
|
|
1890
1909
|
removal.code === "cleanup_pending" &&
|
|
1891
1910
|
removal.payloadDurable === true &&
|
|
1892
1911
|
!removal.retainedSuccessorPath &&
|
|
1893
|
-
!removal.retainedUnknownPath
|
|
1912
|
+
!removal.retainedUnknownPath &&
|
|
1913
|
+
(!removal.retainedPlaceholderPath ||
|
|
1914
|
+
path.resolve(removal.retainedPlaceholderPath) !== path.resolve(lockPath))
|
|
1894
1915
|
) {
|
|
1895
1916
|
released = true;
|
|
1896
1917
|
return;
|
|
@@ -2651,13 +2672,7 @@ export class FileSessionStorage implements SessionStorage {
|
|
|
2651
2672
|
quarantineName: path.basename(plannedTranscriptPath),
|
|
2652
2673
|
});
|
|
2653
2674
|
if (!deletion.ok) {
|
|
2654
|
-
if (
|
|
2655
|
-
deletion.code === "cleanup_pending" &&
|
|
2656
|
-
(deletion as typeof deletion & { payloadDurable?: boolean }).payloadDurable === true &&
|
|
2657
|
-
deletion.retainedSuccessorPath === undefined &&
|
|
2658
|
-
deletion.retainedUnknownPath === undefined
|
|
2659
|
-
)
|
|
2660
|
-
return { kind: "deleted" };
|
|
2675
|
+
if (transcriptDeletionTerminal(deletion)) return { kind: "deleted" };
|
|
2661
2676
|
const error = exactUnlinkFailure(deletion);
|
|
2662
2677
|
const retainedAuthority =
|
|
2663
2678
|
deletion.detachedPath ||
|
|
@@ -2726,13 +2741,7 @@ export class FileSessionStorage implements SessionStorage {
|
|
|
2726
2741
|
quarantineName: path.basename(plannedTranscriptPath),
|
|
2727
2742
|
});
|
|
2728
2743
|
if (!deletion.ok) {
|
|
2729
|
-
if (
|
|
2730
|
-
deletion.code === "cleanup_pending" &&
|
|
2731
|
-
(deletion as typeof deletion & { payloadDurable?: boolean }).payloadDurable === true &&
|
|
2732
|
-
deletion.retainedSuccessorPath === undefined &&
|
|
2733
|
-
deletion.retainedUnknownPath === undefined
|
|
2734
|
-
)
|
|
2735
|
-
return { kind: "deleted" };
|
|
2744
|
+
if (transcriptDeletionTerminal(deletion)) return { kind: "deleted" };
|
|
2736
2745
|
const error = exactUnlinkFailure(deletion);
|
|
2737
2746
|
const retainedAuthority =
|
|
2738
2747
|
deletion.detachedPath ||
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read the global startup-auth configuration before Settings is initialized.
|
|
3
|
+
*
|
|
4
|
+
* The config file is canonical nested YAML only. Legacy literal dotted auth keys
|
|
5
|
+
* are rejected with a manual rewrite diagnostic; no compatibility migration is
|
|
6
|
+
* performed. Environment values are trusted credential sources and take
|
|
7
|
+
* precedence over global config values.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import type { AuthCredentialSelector, CredentialRankingMode } from "@gajae-code/ai/core";
|
|
13
|
+
import { $credentialEnv, getAgentDbPath, getAgentDir, getConfigRootDir, isEnoent, logger } from "@gajae-code/utils";
|
|
14
|
+
import { YAML } from "bun";
|
|
15
|
+
import { readSecureTokenFile } from "./secure-token-file";
|
|
16
|
+
|
|
17
|
+
export interface AuthBrokerClientConfig {
|
|
18
|
+
url: string;
|
|
19
|
+
token: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface StartupAuthConfigSnapshot {
|
|
23
|
+
broker: AuthBrokerClientConfig | null;
|
|
24
|
+
/** Opaque credential-store authority used to bind numeric row-id pins. */
|
|
25
|
+
credentialStoreIdentity: string;
|
|
26
|
+
/** Persisted authority for global numeric pins; absent values invalidate ID pins. */
|
|
27
|
+
credentialPinStoreIdentity?: string;
|
|
28
|
+
credentialRankingMode: CredentialRankingMode;
|
|
29
|
+
credentialPins: Readonly<Record<string, string>>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type StartupAuthConfigErrorKind =
|
|
33
|
+
| "unreadable"
|
|
34
|
+
| "invalid-yaml"
|
|
35
|
+
| "non-mapping-root"
|
|
36
|
+
| "invalid-auth"
|
|
37
|
+
| "invalid-broker"
|
|
38
|
+
| "invalid-gateway"
|
|
39
|
+
| "invalid-ranking-mode"
|
|
40
|
+
| "invalid-credential-pins";
|
|
41
|
+
|
|
42
|
+
/** A malformed startup-auth config aborts resolution rather than downgrading to local authority. */
|
|
43
|
+
export class StartupAuthConfigError extends Error {
|
|
44
|
+
readonly name = "StartupAuthConfigError";
|
|
45
|
+
readonly code: StartupAuthConfigErrorKind;
|
|
46
|
+
readonly causeClass: StartupAuthConfigErrorKind;
|
|
47
|
+
|
|
48
|
+
constructor(
|
|
49
|
+
readonly kind: StartupAuthConfigErrorKind,
|
|
50
|
+
configPath: string,
|
|
51
|
+
) {
|
|
52
|
+
const displayPath = shortenConfigPath(configPath);
|
|
53
|
+
super(`Startup auth config ${displayPath}: ${kind}.`);
|
|
54
|
+
this.code = kind;
|
|
55
|
+
this.causeClass = kind;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const DEFAULT_CREDENTIAL_RANKING_MODE: CredentialRankingMode = "balanced";
|
|
60
|
+
/** JSON-schema pattern shared with the runtime persisted-selector grammar. */
|
|
61
|
+
export const PERSISTED_CREDENTIAL_SELECTOR_PATTERN = "^(id:[1-9][0-9]*|email:[^@\\s]+@[^@\\s]+|account:\\S+)$";
|
|
62
|
+
const LEGACY_LITERAL_AUTH_KEYS = new Set([
|
|
63
|
+
"auth.broker.url",
|
|
64
|
+
"auth.broker.token",
|
|
65
|
+
"auth.credentialRankingMode",
|
|
66
|
+
"auth.credentialPins",
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
function configPathForAgentDir(agentDir: string): string {
|
|
70
|
+
return path.join(agentDir, "config.yml");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function shortenConfigPath(configPath: string): string {
|
|
74
|
+
const absolutePath = path.resolve(configPath).replace(/[\u0000-\u001f\u007f]/gu, "?");
|
|
75
|
+
const homePath = path.resolve(os.homedir());
|
|
76
|
+
if (absolutePath === homePath) return "~";
|
|
77
|
+
const homePrefix = `${homePath}${path.sep}`;
|
|
78
|
+
return absolutePath.startsWith(homePrefix) ? `~${absolutePath.slice(homePath.length)}` : absolutePath;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function startupAuthConfigError(agentDir: string, kind: StartupAuthConfigErrorKind): StartupAuthConfigError {
|
|
82
|
+
return new StartupAuthConfigError(kind, configPathForAgentDir(agentDir));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Path to the local bearer token file. Created on the broker host by `gjc auth-broker token`. */
|
|
86
|
+
export function getAuthBrokerTokenFilePath(): string {
|
|
87
|
+
return path.join(getConfigRootDir(), "auth-broker.token");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Validate the persisted selector grammar used by `auth.credentialPins`. */
|
|
91
|
+
export function parsePersistedCredentialSelector(value: string): AuthCredentialSelector | undefined {
|
|
92
|
+
const trimmed = value.trim();
|
|
93
|
+
if (/^id:[1-9][0-9]*$/.test(trimmed)) return { kind: "id", value: trimmed.slice(3) };
|
|
94
|
+
if (/^email:[^@\s]+@[^@\s]+$/.test(trimmed)) return { kind: "email", value: trimmed.slice(6) };
|
|
95
|
+
if (/^account:\S+$/.test(trimmed)) return { kind: "account", value: trimmed.slice(8) };
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function isValidPersistedCredentialSelector(value: string): boolean {
|
|
100
|
+
return parsePersistedCredentialSelector(value) !== undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function asRecord(value: unknown): Record<string, unknown> | undefined {
|
|
104
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
105
|
+
? (value as Record<string, unknown>)
|
|
106
|
+
: undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function resolveRankingMode(value: unknown): CredentialRankingMode | undefined {
|
|
110
|
+
return value === "balanced" || value === "earliest-reset" ? value : undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Resolve the documented `$ENV_NAME` indirection without consulting project `.env` values. */
|
|
114
|
+
function resolveNestedBrokerValue(raw: string | undefined): string | undefined {
|
|
115
|
+
const trimmed = raw?.trim();
|
|
116
|
+
if (!trimmed) return undefined;
|
|
117
|
+
const match = /^\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(trimmed);
|
|
118
|
+
if (!match) return trimmed;
|
|
119
|
+
return $credentialEnv(match[1]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function canonicalBrokerUrl(raw: string): string {
|
|
123
|
+
let parsed: URL;
|
|
124
|
+
try {
|
|
125
|
+
parsed = new URL(raw);
|
|
126
|
+
} catch {
|
|
127
|
+
throw new Error("Auth broker URL is invalid.");
|
|
128
|
+
}
|
|
129
|
+
if ((parsed.protocol !== "http:" && parsed.protocol !== "https:") || parsed.username || parsed.password) {
|
|
130
|
+
throw new Error("Auth broker URL must be an HTTP(S) origin without credentials.");
|
|
131
|
+
}
|
|
132
|
+
if (parsed.search || parsed.hash) throw new Error("Auth broker URL must not contain a query or fragment.");
|
|
133
|
+
parsed.pathname = parsed.pathname.replace(/\/+$/, "");
|
|
134
|
+
return parsed.toString().replace(/\/$/, "");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function throwLegacyLiteralKeyError(keys: string[]): never {
|
|
138
|
+
throw new Error(
|
|
139
|
+
`Unsupported legacy dotted auth configuration key${keys.length === 1 ? "" : "s"}: ${keys.join(", ")}. ` +
|
|
140
|
+
"Rewrite config.yml manually using canonical nested YAML (no automatic migration):\n" +
|
|
141
|
+
"auth:\n" +
|
|
142
|
+
" broker:\n" +
|
|
143
|
+
" url: <broker-url>\n" +
|
|
144
|
+
" token: <broker-token>\n" +
|
|
145
|
+
" credentialRankingMode: balanced\n" +
|
|
146
|
+
" credentialPins:\n" +
|
|
147
|
+
" <provider>: id:<positive-id>\n" +
|
|
148
|
+
"Do not copy secret values into command output; rewrite the file by hand.",
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function readCredentialPins(
|
|
153
|
+
auth: Record<string, unknown> | undefined,
|
|
154
|
+
configPath: string,
|
|
155
|
+
): Readonly<Record<string, string>> {
|
|
156
|
+
const rawPins = auth?.credentialPins;
|
|
157
|
+
if (rawPins === undefined) return {};
|
|
158
|
+
const pins = asRecord(rawPins);
|
|
159
|
+
if (!pins) throw new StartupAuthConfigError("invalid-credential-pins", configPath);
|
|
160
|
+
|
|
161
|
+
const result: Record<string, string> = {};
|
|
162
|
+
for (const [provider, rawSelector] of Object.entries(pins)) {
|
|
163
|
+
const normalizedProvider = provider.trim();
|
|
164
|
+
if (normalizedProvider.length === 0 || /[\u0000-\u001f\u007f]/u.test(normalizedProvider)) {
|
|
165
|
+
throw new StartupAuthConfigError("invalid-credential-pins", configPath);
|
|
166
|
+
}
|
|
167
|
+
if (typeof rawSelector !== "string" || !isValidPersistedCredentialSelector(rawSelector)) {
|
|
168
|
+
throw new StartupAuthConfigError("invalid-credential-pins", configPath);
|
|
169
|
+
}
|
|
170
|
+
result[normalizedProvider] = rawSelector.trim();
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface GlobalStartupAuthYaml {
|
|
176
|
+
auth: Record<string, unknown> | undefined;
|
|
177
|
+
credentialPinStoreIdentity: string | undefined;
|
|
178
|
+
credentialPins: Readonly<Record<string, string>>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function readGlobalStartupAuthYaml(agentDir: string): Promise<GlobalStartupAuthYaml> {
|
|
182
|
+
const configPath = configPathForAgentDir(agentDir);
|
|
183
|
+
let raw: string;
|
|
184
|
+
try {
|
|
185
|
+
raw = await Bun.file(configPath).text();
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (isEnoent(error)) return { auth: undefined, credentialPinStoreIdentity: undefined, credentialPins: {} };
|
|
188
|
+
logger.warn("startup auth config.yml unreadable", { path: shortenConfigPath(configPath), cause: "unreadable" });
|
|
189
|
+
throw startupAuthConfigError(agentDir, "unreadable");
|
|
190
|
+
}
|
|
191
|
+
if (raw.trim() === "") return { auth: undefined, credentialPinStoreIdentity: undefined, credentialPins: {} };
|
|
192
|
+
|
|
193
|
+
let parsed: unknown;
|
|
194
|
+
try {
|
|
195
|
+
parsed = YAML.parse(raw);
|
|
196
|
+
} catch {
|
|
197
|
+
logger.warn("startup auth config.yml has invalid YAML", {
|
|
198
|
+
path: shortenConfigPath(configPath),
|
|
199
|
+
cause: "invalid-yaml",
|
|
200
|
+
});
|
|
201
|
+
throw startupAuthConfigError(agentDir, "invalid-yaml");
|
|
202
|
+
}
|
|
203
|
+
const root = asRecord(parsed);
|
|
204
|
+
if (!root) {
|
|
205
|
+
logger.warn("startup auth config.yml root is not a mapping", {
|
|
206
|
+
path: shortenConfigPath(configPath),
|
|
207
|
+
cause: "non-mapping-root",
|
|
208
|
+
});
|
|
209
|
+
throw startupAuthConfigError(agentDir, "non-mapping-root");
|
|
210
|
+
}
|
|
211
|
+
const legacyKeys = Object.keys(root).filter(key => LEGACY_LITERAL_AUTH_KEYS.has(key));
|
|
212
|
+
if (legacyKeys.length > 0) throwLegacyLiteralKeyError(legacyKeys);
|
|
213
|
+
|
|
214
|
+
if (root.auth === undefined) return { auth: undefined, credentialPinStoreIdentity: undefined, credentialPins: {} };
|
|
215
|
+
const auth = asRecord(root.auth);
|
|
216
|
+
if (!auth) throw startupAuthConfigError(agentDir, "invalid-auth");
|
|
217
|
+
|
|
218
|
+
for (const [sectionName, errorKind] of [
|
|
219
|
+
["broker", "invalid-broker"],
|
|
220
|
+
["gateway", "invalid-gateway"],
|
|
221
|
+
] as const) {
|
|
222
|
+
const section = auth[sectionName];
|
|
223
|
+
if (section === undefined) continue;
|
|
224
|
+
const sectionRecord = asRecord(section);
|
|
225
|
+
if (!sectionRecord) throw startupAuthConfigError(agentDir, errorKind);
|
|
226
|
+
for (const key of ["url", "token"] as const) {
|
|
227
|
+
if (Object.hasOwn(sectionRecord, key) && typeof sectionRecord[key] !== "string") {
|
|
228
|
+
throw startupAuthConfigError(agentDir, errorKind);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (Object.hasOwn(auth, "credentialRankingMode") && resolveRankingMode(auth.credentialRankingMode) === undefined) {
|
|
234
|
+
throw startupAuthConfigError(agentDir, "invalid-ranking-mode");
|
|
235
|
+
}
|
|
236
|
+
const credentialPins = readCredentialPins(auth, configPath);
|
|
237
|
+
const rawCredentialPinStoreIdentity = auth.credentialPinStoreIdentity;
|
|
238
|
+
const credentialPinStoreIdentity =
|
|
239
|
+
typeof rawCredentialPinStoreIdentity === "string" && rawCredentialPinStoreIdentity.trim().length > 0
|
|
240
|
+
? rawCredentialPinStoreIdentity.trim()
|
|
241
|
+
: undefined;
|
|
242
|
+
return { auth, credentialPinStoreIdentity, credentialPins };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async function readTokenFile(): Promise<string | undefined> {
|
|
246
|
+
const token = await readSecureTokenFile(getAuthBrokerTokenFilePath());
|
|
247
|
+
return token ?? undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Resolve one typed startup-auth snapshot from trusted env and global config.
|
|
252
|
+
* Project settings are intentionally not read here, so project-scoped pins
|
|
253
|
+
* cannot influence credential selection.
|
|
254
|
+
*/
|
|
255
|
+
export async function resolveStartupAuthConfig(agentDir: string = getAgentDir()): Promise<StartupAuthConfigSnapshot> {
|
|
256
|
+
const { auth, credentialPinStoreIdentity, credentialPins } = await readGlobalStartupAuthYaml(agentDir);
|
|
257
|
+
const broker = asRecord(auth?.broker);
|
|
258
|
+
const envUrl = $credentialEnv("GJC_AUTH_BROKER_URL")?.trim();
|
|
259
|
+
const envToken = $credentialEnv("GJC_AUTH_BROKER_TOKEN")?.trim();
|
|
260
|
+
|
|
261
|
+
let url = envUrl || undefined;
|
|
262
|
+
const nestedUrlRaw = typeof broker?.url === "string" ? broker.url : undefined;
|
|
263
|
+
const nestedUrl = resolveNestedBrokerValue(nestedUrlRaw);
|
|
264
|
+
if (!url && nestedUrlRaw?.trim() && nestedUrl === undefined) {
|
|
265
|
+
throw startupAuthConfigError(agentDir, "invalid-broker");
|
|
266
|
+
}
|
|
267
|
+
if (!url && nestedUrl) url = nestedUrl;
|
|
268
|
+
if (url) url = canonicalBrokerUrl(url);
|
|
269
|
+
|
|
270
|
+
const configToken = resolveNestedBrokerValue(typeof broker?.token === "string" ? broker.token : undefined);
|
|
271
|
+
|
|
272
|
+
let resolvedBroker: AuthBrokerClientConfig | null = null;
|
|
273
|
+
if (url) {
|
|
274
|
+
const token = envToken || configToken || (await readTokenFile());
|
|
275
|
+
if (!token) {
|
|
276
|
+
throw new Error(
|
|
277
|
+
"An auth broker URL is configured but no bearer token is available. " +
|
|
278
|
+
`Set GJC_AUTH_BROKER_TOKEN, the nested \`auth.broker.token\` config entry, or place one at ${getAuthBrokerTokenFilePath()}.`,
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
resolvedBroker = { url, token };
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const rankingMode =
|
|
285
|
+
resolveRankingMode($credentialEnv("GJC_CREDENTIAL_RANKING_MODE")) ??
|
|
286
|
+
resolveRankingMode(auth?.credentialRankingMode) ??
|
|
287
|
+
DEFAULT_CREDENTIAL_RANKING_MODE;
|
|
288
|
+
return {
|
|
289
|
+
broker: resolvedBroker,
|
|
290
|
+
credentialStoreIdentity: resolvedBroker
|
|
291
|
+
? `broker:${resolvedBroker.url}`
|
|
292
|
+
: `local:${path.resolve(getAgentDbPath(agentDir))}`,
|
|
293
|
+
...(credentialPinStoreIdentity ? { credentialPinStoreIdentity } : {}),
|
|
294
|
+
credentialRankingMode: rankingMode,
|
|
295
|
+
credentialPins,
|
|
296
|
+
};
|
|
297
|
+
}
|