@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
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable dependency surface for `gjc setup paseo`.
|
|
3
|
+
*
|
|
4
|
+
* Every module in this directory takes `PaseoSetupDependencies` explicitly so
|
|
5
|
+
* tests can substitute paths, the Paseo CLI probe, and the clock without
|
|
6
|
+
* `mock.module()`. Production wiring calls `createDefaultPaseoSetupDependencies()`.
|
|
7
|
+
*/
|
|
8
|
+
import * as os from "node:os";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { getAgentDir } from "@gajae-code/utils";
|
|
11
|
+
|
|
12
|
+
/** The five Paseo skills this setup links. `context-search` is deliberately excluded. */
|
|
13
|
+
export const INSTALL_SKILL_NAMES = [
|
|
14
|
+
"paseo",
|
|
15
|
+
"paseo-advisor",
|
|
16
|
+
"paseo-committee",
|
|
17
|
+
"paseo-handoff",
|
|
18
|
+
"paseo-loop",
|
|
19
|
+
] as const;
|
|
20
|
+
|
|
21
|
+
export type InstallSkillName = (typeof INSTALL_SKILL_NAMES)[number];
|
|
22
|
+
|
|
23
|
+
/** Prefix used to enumerate Paseo-owned skills when scanning for drift. */
|
|
24
|
+
export const PASEO_SKILL_PREFIX = "paseo";
|
|
25
|
+
|
|
26
|
+
/** Base provider key written into `agents.providers`. */
|
|
27
|
+
export const PROVIDER_KEY = "gjc";
|
|
28
|
+
|
|
29
|
+
/** Paseo's undocumented provider inheritance contract, reverse-engineered from a hand-written config. */
|
|
30
|
+
export const PROVIDER_EXTENDS = "acp";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Role keys Paseo stores under `providers` in `orchestration-preferences.json`.
|
|
34
|
+
*
|
|
35
|
+
* Verified against a live file: the roles are nested, not top-level, and the
|
|
36
|
+
* sibling `preferences` array belongs to the user.
|
|
37
|
+
*/
|
|
38
|
+
export const ORCHESTRATION_ROLE_KEYS = ["impl", "ui", "research", "planning", "audit"] as const;
|
|
39
|
+
|
|
40
|
+
export interface PaseoPaths {
|
|
41
|
+
/** `~/.paseo/config.json` */
|
|
42
|
+
readonly configJson: string;
|
|
43
|
+
/** `~/.paseo/orchestration-preferences.json` */
|
|
44
|
+
readonly orchestrationPreferences: string;
|
|
45
|
+
/** `~/.agents/skills` -- READ-ONLY, never written by this setup. */
|
|
46
|
+
readonly agentsSkillsDir: string;
|
|
47
|
+
/** `<agentDir>/paseo-skills` -- the bridge directory this setup owns. */
|
|
48
|
+
readonly bridgeDir: string;
|
|
49
|
+
/** `<agentDir>/paseo/provenance.json` -- GJC-side ownership ledger. */
|
|
50
|
+
readonly provenanceLedger: string;
|
|
51
|
+
/** `<agentDir>/paseo/intent.json` -- durable crash-recovery intent record. */
|
|
52
|
+
readonly intentRecord: string;
|
|
53
|
+
/** `<agentDir>/skills` -- second protected tree, never written by this setup. */
|
|
54
|
+
readonly gjcSkillsDir: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** A provider row as `paseo provider ls --json` reports it. */
|
|
58
|
+
export interface PaseoProviderRow {
|
|
59
|
+
readonly id: string;
|
|
60
|
+
/** Paseo reports `"available"` for a provider it can actually reach. */
|
|
61
|
+
readonly status?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Distinct outcomes of probing `paseo provider ls --json`. Never collapsed into a boolean. */
|
|
65
|
+
export type PaseoLsOutcome =
|
|
66
|
+
| { readonly kind: "ok"; readonly providerIds: readonly string[]; readonly rows: readonly PaseoProviderRow[] }
|
|
67
|
+
| { readonly kind: "unavailable"; readonly detail: string }
|
|
68
|
+
| { readonly kind: "timeout"; readonly timeoutMs: number }
|
|
69
|
+
| { readonly kind: "malformed"; readonly detail: string }
|
|
70
|
+
| { readonly kind: "nonzero-exit"; readonly exitCode: number; readonly detail: string };
|
|
71
|
+
|
|
72
|
+
export interface PaseoSetupDependencies {
|
|
73
|
+
readonly paths: PaseoPaths;
|
|
74
|
+
/** Bounded probe of the Paseo daemon. MUST enforce `timeoutMs` and kill the child on expiry. */
|
|
75
|
+
runProviderLs(timeoutMs: number): Promise<PaseoLsOutcome>;
|
|
76
|
+
now(): Date;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function createDefaultPaseoPaths(agentDir: string = getAgentDir(), home: string = os.homedir()): PaseoPaths {
|
|
80
|
+
const paseoHome = path.join(home, ".paseo");
|
|
81
|
+
return {
|
|
82
|
+
configJson: path.join(paseoHome, "config.json"),
|
|
83
|
+
orchestrationPreferences: path.join(paseoHome, "orchestration-preferences.json"),
|
|
84
|
+
agentsSkillsDir: path.join(home, ".agents", "skills"),
|
|
85
|
+
bridgeDir: path.join(agentDir, "paseo-skills"),
|
|
86
|
+
provenanceLedger: path.join(agentDir, "paseo", "provenance.json"),
|
|
87
|
+
intentRecord: path.join(agentDir, "paseo", "intent.json"),
|
|
88
|
+
gjcSkillsDir: path.join(agentDir, "skills"),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Probe the Paseo daemon for its registered providers.
|
|
94
|
+
*
|
|
95
|
+
* The daemon may be down, wedged, or a different version, so every failure mode
|
|
96
|
+
* is classified rather than collapsed: `--check` maps `unavailable`/`timeout` to
|
|
97
|
+
* `skipped` and must never report `drift` because the daemon did not answer.
|
|
98
|
+
*/
|
|
99
|
+
async function runProviderLs(timeoutMs: number): Promise<PaseoLsOutcome> {
|
|
100
|
+
const controller = new AbortController();
|
|
101
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
102
|
+
try {
|
|
103
|
+
const child = Bun.spawn(["paseo", "provider", "ls", "--json"], {
|
|
104
|
+
stdout: "pipe",
|
|
105
|
+
stderr: "pipe",
|
|
106
|
+
signal: controller.signal,
|
|
107
|
+
});
|
|
108
|
+
const [exitCode, stdout, stderr] = await Promise.all([
|
|
109
|
+
child.exited,
|
|
110
|
+
new Response(child.stdout).text(),
|
|
111
|
+
new Response(child.stderr).text(),
|
|
112
|
+
]);
|
|
113
|
+
if (controller.signal.aborted) return { kind: "timeout", timeoutMs };
|
|
114
|
+
if (exitCode !== 0) return { kind: "nonzero-exit", exitCode, detail: stderr.trim().slice(0, 500) };
|
|
115
|
+
return parseProviderLs(stdout);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
if (controller.signal.aborted) return { kind: "timeout", timeoutMs };
|
|
118
|
+
return { kind: "unavailable", detail: error instanceof Error ? error.message : String(error) };
|
|
119
|
+
} finally {
|
|
120
|
+
clearTimeout(timer);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Parse `paseo provider ls --json`.
|
|
126
|
+
*
|
|
127
|
+
* The measured shape is an array of `{ provider, label, status, ... }` rows.
|
|
128
|
+
* `id` and `name` are also accepted because the key is undocumented and has no
|
|
129
|
+
* stability guarantee, and a bare string array is accepted for the same reason.
|
|
130
|
+
*/
|
|
131
|
+
export function parseProviderLs(stdout: string): PaseoLsOutcome {
|
|
132
|
+
let parsed: unknown;
|
|
133
|
+
try {
|
|
134
|
+
parsed = JSON.parse(stdout);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
return { kind: "malformed", detail: error instanceof Error ? error.message : String(error) };
|
|
137
|
+
}
|
|
138
|
+
const raw = Array.isArray(parsed)
|
|
139
|
+
? parsed
|
|
140
|
+
: parsed && typeof parsed === "object" && Array.isArray((parsed as { providers?: unknown }).providers)
|
|
141
|
+
? ((parsed as { providers: unknown[] }).providers as unknown[])
|
|
142
|
+
: undefined;
|
|
143
|
+
if (!raw) return { kind: "malformed", detail: "expected an array or an object carrying a providers array" };
|
|
144
|
+
|
|
145
|
+
const rows: PaseoProviderRow[] = [];
|
|
146
|
+
for (const row of raw) {
|
|
147
|
+
if (typeof row === "string") {
|
|
148
|
+
rows.push({ id: row });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (!row || typeof row !== "object") {
|
|
152
|
+
return { kind: "malformed", detail: "provider entry was not an object" };
|
|
153
|
+
}
|
|
154
|
+
const candidate = row as { provider?: unknown; id?: unknown; name?: unknown; status?: unknown };
|
|
155
|
+
const id =
|
|
156
|
+
typeof candidate.provider === "string"
|
|
157
|
+
? candidate.provider
|
|
158
|
+
: typeof candidate.id === "string"
|
|
159
|
+
? candidate.id
|
|
160
|
+
: typeof candidate.name === "string"
|
|
161
|
+
? candidate.name
|
|
162
|
+
: undefined;
|
|
163
|
+
if (id === undefined) return { kind: "malformed", detail: "provider entry carried no string id" };
|
|
164
|
+
rows.push(typeof candidate.status === "string" ? { id, status: candidate.status } : { id });
|
|
165
|
+
}
|
|
166
|
+
return { kind: "ok", providerIds: rows.map(row => row.id), rows };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function createDefaultPaseoSetupDependencies(): PaseoSetupDependencies {
|
|
170
|
+
return {
|
|
171
|
+
paths: createDefaultPaseoPaths(),
|
|
172
|
+
runProviderLs,
|
|
173
|
+
now: () => new Date(),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import type { CasReceipt } from "../../config/atomic-yaml-patch";
|
|
4
|
+
import type { RawSettings, Settings } from "../../config/settings";
|
|
5
|
+
import type { SettingPath } from "../../config/settings-schema";
|
|
6
|
+
import type { DriftReason } from "./result-types";
|
|
7
|
+
import {
|
|
8
|
+
INSTALL_SKILL_NAMES,
|
|
9
|
+
type InstallSkillName,
|
|
10
|
+
PASEO_SKILL_PREFIX,
|
|
11
|
+
type PaseoSetupDependencies,
|
|
12
|
+
} from "./setup-deps";
|
|
13
|
+
|
|
14
|
+
type BridgeEntryAction = "create" | "noop" | "prune-and-recreate";
|
|
15
|
+
|
|
16
|
+
type BridgeEntryPlan = {
|
|
17
|
+
readonly name: InstallSkillName;
|
|
18
|
+
readonly action: BridgeEntryAction;
|
|
19
|
+
readonly linkPath: string;
|
|
20
|
+
readonly targetPath: string;
|
|
21
|
+
/** The dangling link text captured during preflight, used as an unlink guard. */
|
|
22
|
+
readonly danglingTarget?: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Immutable preflight evidence consumed by the install saga and its inverse. */
|
|
26
|
+
export interface SkillsBridgePreflight {
|
|
27
|
+
readonly bridgeDir: string;
|
|
28
|
+
readonly bridgeDirCreated: boolean;
|
|
29
|
+
readonly entries: Readonly<Record<InstallSkillName, BridgeEntryPlan>>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** What the forward operation actually created, rather than what preflight intended to create. */
|
|
33
|
+
export interface SkillsBridgeInstallResult {
|
|
34
|
+
readonly createdEntries: readonly InstallSkillName[];
|
|
35
|
+
readonly bridgeDirCreated: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class SkillsBridgeError extends Error {
|
|
39
|
+
constructor(message: string) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = "SkillsBridgeError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function expectedTarget(deps: PaseoSetupDependencies, name: InstallSkillName): string {
|
|
46
|
+
return path.resolve(deps.paths.agentsSkillsDir, name);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function linkPath(deps: PaseoSetupDependencies, name: InstallSkillName): string {
|
|
50
|
+
return path.join(deps.paths.bridgeDir, name);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function resolvedLinkTarget(link: string, destination: string): string {
|
|
54
|
+
return path.resolve(path.dirname(destination), link);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function entryState(
|
|
58
|
+
destination: string,
|
|
59
|
+
expected: string,
|
|
60
|
+
): Promise<
|
|
61
|
+
| { readonly kind: "absent" }
|
|
62
|
+
| { readonly kind: "expected"; readonly link: string }
|
|
63
|
+
| { readonly kind: "dangling"; readonly link: string }
|
|
64
|
+
| { readonly kind: "conflict" }
|
|
65
|
+
> {
|
|
66
|
+
try {
|
|
67
|
+
const stat = await fs.lstat(destination);
|
|
68
|
+
if (!stat.isSymbolicLink()) return { kind: "conflict" };
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return { kind: "absent" };
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
const link = await fs.readlink(destination);
|
|
74
|
+
if (resolvedLinkTarget(link, destination) !== expected) return { kind: "conflict" };
|
|
75
|
+
try {
|
|
76
|
+
await fs.stat(destination);
|
|
77
|
+
return { kind: "expected", link };
|
|
78
|
+
} catch (error) {
|
|
79
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return { kind: "dangling", link };
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function bridgeDirectoryState(bridgeDir: string): Promise<"absent" | "directory" | "conflict"> {
|
|
85
|
+
try {
|
|
86
|
+
const stat = await fs.lstat(bridgeDir);
|
|
87
|
+
return stat.isDirectory() ? "directory" : "conflict";
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return "absent";
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Classify every allowlisted bridge entry without mutating either skill tree.
|
|
96
|
+
* All conflicts are accumulated so the caller can report them together.
|
|
97
|
+
*/
|
|
98
|
+
export async function preflightSkillsBridge(deps: PaseoSetupDependencies): Promise<SkillsBridgePreflight> {
|
|
99
|
+
const directory = await bridgeDirectoryState(deps.paths.bridgeDir);
|
|
100
|
+
const conflicts: string[] = directory === "conflict" ? [deps.paths.bridgeDir] : [];
|
|
101
|
+
const entries = {} as Record<InstallSkillName, BridgeEntryPlan>;
|
|
102
|
+
|
|
103
|
+
for (const name of INSTALL_SKILL_NAMES) {
|
|
104
|
+
const destination = linkPath(deps, name);
|
|
105
|
+
const target = expectedTarget(deps, name);
|
|
106
|
+
const state = directory === "absent" ? { kind: "absent" as const } : await entryState(destination, target);
|
|
107
|
+
if (state.kind === "conflict") {
|
|
108
|
+
conflicts.push(destination);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
entries[name] = {
|
|
112
|
+
name,
|
|
113
|
+
action: state.kind === "expected" ? "noop" : state.kind === "dangling" ? "prune-and-recreate" : "create",
|
|
114
|
+
linkPath: destination,
|
|
115
|
+
targetPath: target,
|
|
116
|
+
...(state.kind === "dangling" ? { danglingTarget: state.link } : {}),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (conflicts.length > 0) {
|
|
120
|
+
throw new SkillsBridgeError(
|
|
121
|
+
`Refusing to modify Paseo skills bridge; conflicting entries: ${conflicts.join(", ")}`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
return { bridgeDir: deps.paths.bridgeDir, bridgeDirCreated: directory === "absent", entries };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function createBridgeDirectory(preflight: SkillsBridgePreflight): Promise<void> {
|
|
128
|
+
try {
|
|
129
|
+
await fs.mkdir(preflight.bridgeDir);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
|
|
132
|
+
throw new SkillsBridgeError(`Paseo skills bridge appeared during creation: ${preflight.bridgeDir}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function pruneRecordedDangling(entry: BridgeEntryPlan): Promise<void> {
|
|
137
|
+
if (entry.danglingTarget === undefined)
|
|
138
|
+
throw new SkillsBridgeError(`Missing dangling-link evidence for ${entry.linkPath}`);
|
|
139
|
+
const state = await entryState(entry.linkPath, entry.targetPath);
|
|
140
|
+
if (state.kind !== "dangling" || state.link !== entry.danglingTarget) {
|
|
141
|
+
throw new SkillsBridgeError(`Paseo skill bridge entry diverged before pruning: ${entry.linkPath}`);
|
|
142
|
+
}
|
|
143
|
+
await fs.unlink(entry.linkPath);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function createNoReplace(entry: BridgeEntryPlan): Promise<void> {
|
|
147
|
+
try {
|
|
148
|
+
await fs.symlink(entry.targetPath, entry.linkPath);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
|
|
151
|
+
const observed = await entryState(entry.linkPath, entry.targetPath);
|
|
152
|
+
throw new SkillsBridgeError(
|
|
153
|
+
`Paseo skill bridge entry appeared during creation (${observed.kind}): ${entry.linkPath}`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Create only preflight-approved bridge links; symlink publication never replaces an existing entry. */
|
|
159
|
+
export async function installSkillsBridge(preflight: SkillsBridgePreflight): Promise<SkillsBridgeInstallResult> {
|
|
160
|
+
let bridgeDirCreated = false;
|
|
161
|
+
if (preflight.bridgeDirCreated) {
|
|
162
|
+
await createBridgeDirectory(preflight);
|
|
163
|
+
bridgeDirCreated = true;
|
|
164
|
+
}
|
|
165
|
+
const createdEntries: InstallSkillName[] = [];
|
|
166
|
+
for (const name of INSTALL_SKILL_NAMES) {
|
|
167
|
+
const entry = preflight.entries[name];
|
|
168
|
+
if (entry.action === "noop") continue;
|
|
169
|
+
if (entry.action === "prune-and-recreate") await pruneRecordedDangling(entry);
|
|
170
|
+
await createNoReplace(entry);
|
|
171
|
+
createdEntries.push(name);
|
|
172
|
+
}
|
|
173
|
+
return { createdEntries, bridgeDirCreated };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Undo exactly the links this run created. A changed link is reported as a
|
|
178
|
+
* conflict rather than being deleted; this makes compensation safe after edits.
|
|
179
|
+
*/
|
|
180
|
+
export async function inverseSkillsBridge(
|
|
181
|
+
deps: PaseoSetupDependencies,
|
|
182
|
+
result: SkillsBridgeInstallResult,
|
|
183
|
+
): Promise<void> {
|
|
184
|
+
const diverged: string[] = [];
|
|
185
|
+
for (const name of result.createdEntries) {
|
|
186
|
+
const destination = linkPath(deps, name);
|
|
187
|
+
const state = await entryState(destination, expectedTarget(deps, name));
|
|
188
|
+
if (state.kind !== "expected" || state.link !== expectedTarget(deps, name)) diverged.push(destination);
|
|
189
|
+
}
|
|
190
|
+
if (diverged.length > 0) {
|
|
191
|
+
throw new SkillsBridgeError(`Refusing to remove diverged Paseo skill bridge entries: ${diverged.join(", ")}`);
|
|
192
|
+
}
|
|
193
|
+
for (const name of result.createdEntries) await fs.unlink(linkPath(deps, name));
|
|
194
|
+
if (!result.bridgeDirCreated) return;
|
|
195
|
+
try {
|
|
196
|
+
await fs.rmdir(deps.paths.bridgeDir);
|
|
197
|
+
} catch (error) {
|
|
198
|
+
if ((error as NodeJS.ErrnoException).code === "ENOTEMPTY") return;
|
|
199
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return;
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Find Paseo-prefixed bridge or source entries that the locked install allowlist does not repair. */
|
|
205
|
+
export async function scanSkillsBridgeDrift(deps: PaseoSetupDependencies): Promise<readonly DriftReason[]> {
|
|
206
|
+
const reasons: DriftReason[] = [];
|
|
207
|
+
const bridgeEntries = await fs.readdir(deps.paths.bridgeDir, { withFileTypes: true }).catch(error => {
|
|
208
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
209
|
+
throw error;
|
|
210
|
+
});
|
|
211
|
+
for (const entry of bridgeEntries) {
|
|
212
|
+
if (!entry.name.startsWith(PASEO_SKILL_PREFIX) || !entry.isSymbolicLink()) continue;
|
|
213
|
+
const destination = path.join(deps.paths.bridgeDir, entry.name);
|
|
214
|
+
try {
|
|
215
|
+
await fs.stat(destination);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
|
|
218
|
+
reasons.push({ code: "orphan-skill", subject: destination, detail: "bridge symlink target no longer exists" });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const sourceEntries = await fs.readdir(deps.paths.agentsSkillsDir, { withFileTypes: true }).catch(error => {
|
|
222
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
223
|
+
throw error;
|
|
224
|
+
});
|
|
225
|
+
for (const entry of sourceEntries) {
|
|
226
|
+
if (!entry.name.startsWith(PASEO_SKILL_PREFIX) || (INSTALL_SKILL_NAMES as readonly string[]).includes(entry.name))
|
|
227
|
+
continue;
|
|
228
|
+
reasons.push({
|
|
229
|
+
code: "unlinked-skill",
|
|
230
|
+
subject: path.join(deps.paths.agentsSkillsDir, entry.name),
|
|
231
|
+
detail: "Paseo skill is outside GJC's locked bridge allowlist",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return reasons;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function existingCustomDirectories(current: Readonly<RawSettings>): string[] {
|
|
238
|
+
const skills = current.skills;
|
|
239
|
+
if (skills === undefined) return [];
|
|
240
|
+
if (typeof skills !== "object" || skills === null || Array.isArray(skills)) {
|
|
241
|
+
throw new SkillsBridgeError("Cannot register Paseo skills bridge: skills config is not an object.");
|
|
242
|
+
}
|
|
243
|
+
const directories = (skills as Record<string, unknown>).customDirectories;
|
|
244
|
+
if (directories === undefined) return [];
|
|
245
|
+
if (!Array.isArray(directories) || directories.some(directory => typeof directory !== "string")) {
|
|
246
|
+
throw new SkillsBridgeError(
|
|
247
|
+
"Cannot register Paseo skills bridge: skills.customDirectories is not a string array.",
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
return [...directories];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Append the bridge directory without discarding concurrent user config changes. */
|
|
254
|
+
export async function registerSkillsBridgeDirectory(settings: Settings, bridgeDir: string): Promise<CasReceipt> {
|
|
255
|
+
return settings.commitAtomicBatchWithCurrent(current => {
|
|
256
|
+
const directories = existingCustomDirectories(current);
|
|
257
|
+
const next = directories.includes(bridgeDir) ? directories : [...directories, bridgeDir];
|
|
258
|
+
return [{ path: "skills.customDirectories" as SettingPath, op: "set", value: next }];
|
|
259
|
+
});
|
|
260
|
+
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
import { resolveGjcSessionForRead, SessionResolutionError } from "../gjc-runtime/session-resolution";
|
|
11
11
|
import {
|
|
12
12
|
type ActiveSessionScope,
|
|
13
|
+
type GuardedWriteResult,
|
|
13
14
|
readActiveEntries,
|
|
14
15
|
rebuildActiveSnapshot,
|
|
15
16
|
removeActiveEntry,
|
|
@@ -125,6 +126,8 @@ export interface SyncSkillActiveStateOptions {
|
|
|
125
126
|
handoff_at?: string;
|
|
126
127
|
active_subskills?: ActiveSubskillEntry[];
|
|
127
128
|
sourceRevision?: number;
|
|
129
|
+
/** Internal seed path: retain the authoritative entry receipt if snapshot rebuilding fails. */
|
|
130
|
+
bestEffortSnapshot?: boolean;
|
|
128
131
|
}
|
|
129
132
|
|
|
130
133
|
const HUD_TEXT_LIMIT = 80;
|
|
@@ -645,7 +648,7 @@ function comparePipelineEntry(a: SkillActiveEntry, b: SkillActiveEntry): number
|
|
|
645
648
|
return 0;
|
|
646
649
|
}
|
|
647
650
|
|
|
648
|
-
function upstreamPlanningPipelineSkills(skill: string): string[] {
|
|
651
|
+
export function upstreamPlanningPipelineSkills(skill: string): string[] {
|
|
649
652
|
const rank = planningPipelineRank(skill);
|
|
650
653
|
if (rank === undefined) return [];
|
|
651
654
|
return [...PLANNING_PIPELINE_RANK.entries()]
|
|
@@ -847,19 +850,19 @@ async function persistActiveEntry(
|
|
|
847
850
|
cwd: string,
|
|
848
851
|
sessionScope: ActiveSessionScope | undefined,
|
|
849
852
|
entry: SkillActiveEntry,
|
|
850
|
-
): Promise<
|
|
853
|
+
): Promise<GuardedWriteResult | undefined> {
|
|
851
854
|
if (entry.active === false) {
|
|
852
855
|
await removeActiveEntry(cwd, sessionScope, entry.skill, {
|
|
853
856
|
cwd,
|
|
854
857
|
audit: activeStateWriterAudit("remove-active-entry", sessionScope),
|
|
855
858
|
sourceRevision: entry.source_state_revision,
|
|
856
859
|
});
|
|
857
|
-
|
|
858
|
-
await writeActiveEntry(cwd, sessionScope, entry.skill, entry, {
|
|
859
|
-
cwd,
|
|
860
|
-
audit: activeStateWriterAudit("write-active-entry", sessionScope),
|
|
861
|
-
});
|
|
860
|
+
return undefined;
|
|
862
861
|
}
|
|
862
|
+
return await writeActiveEntry(cwd, sessionScope, entry.skill, entry, {
|
|
863
|
+
cwd,
|
|
864
|
+
audit: activeStateWriterAudit("write-active-entry", sessionScope),
|
|
865
|
+
});
|
|
863
866
|
}
|
|
864
867
|
|
|
865
868
|
async function writeHandoffEntry(
|
|
@@ -908,8 +911,10 @@ async function activeSubskillsForExistingEntry(
|
|
|
908
911
|
return existing?.active_subskills;
|
|
909
912
|
}
|
|
910
913
|
|
|
911
|
-
export async function syncSkillActiveState(
|
|
912
|
-
|
|
914
|
+
export async function syncSkillActiveState(
|
|
915
|
+
options: SyncSkillActiveStateOptions,
|
|
916
|
+
): Promise<GuardedWriteResult | undefined> {
|
|
917
|
+
if (!options.sessionId) return undefined;
|
|
913
918
|
const preservedActiveSubskills =
|
|
914
919
|
options.active_subskills === undefined
|
|
915
920
|
? await activeSubskillsForExistingEntry(options.cwd, options.sessionId, options.skill)
|
|
@@ -939,8 +944,13 @@ export async function syncSkillActiveState(options: SyncSkillActiveStateOptions)
|
|
|
939
944
|
};
|
|
940
945
|
const sessionScope = { sessionId: options.sessionId };
|
|
941
946
|
await removeSupersededPlanningPipelineEntries(options.cwd, sessionScope, entry);
|
|
942
|
-
await persistActiveEntry(options.cwd, sessionScope, entry);
|
|
943
|
-
|
|
947
|
+
const entryWrite = await persistActiveEntry(options.cwd, sessionScope, entry);
|
|
948
|
+
try {
|
|
949
|
+
await rebuildActiveState(options.cwd, sessionScope);
|
|
950
|
+
} catch (error) {
|
|
951
|
+
if (!options.bestEffortSnapshot) throw error;
|
|
952
|
+
}
|
|
953
|
+
return entryWrite;
|
|
944
954
|
}
|
|
945
955
|
|
|
946
956
|
export interface ApplyHandoffOptions {
|
|
@@ -15,7 +15,7 @@ export type { AcpBuiltinCommandRuntime, AcpBuiltinSlashCommandResult } from "./t
|
|
|
15
15
|
* see commands it cannot drive.
|
|
16
16
|
*/
|
|
17
17
|
export const ACP_BUILTIN_SLASH_COMMANDS: AvailableCommand[] = BUILTIN_SLASH_COMMANDS_INTERNAL.filter(
|
|
18
|
-
command => command.handle !== undefined,
|
|
18
|
+
command => command.handle !== undefined && command.acp !== false,
|
|
19
19
|
).map(command => {
|
|
20
20
|
// Honor mode-specific copy: ACP clients receive concise text-mode
|
|
21
21
|
// descriptions/hints when the spec sets `acpDescription` / `acpInputHint`,
|
|
@@ -35,14 +35,22 @@ export const ACP_BUILTIN_SLASH_COMMANDS: AvailableCommand[] = BUILTIN_SLASH_COMM
|
|
|
35
35
|
* - `{ consumed: true }` when the command handled the input entirely.
|
|
36
36
|
* - `{ prompt }` when the command was handled but a residual prompt should be
|
|
37
37
|
* sent to the model.
|
|
38
|
+
* When `disabledOnly` is set, ACP-enabled builtins also return `false` so a
|
|
39
|
+
* transport can apply only the unavailable-over-ACP policy before forwarding.
|
|
38
40
|
*/
|
|
39
41
|
export async function executeAcpBuiltinSlashCommand(
|
|
40
42
|
text: string,
|
|
41
43
|
runtime: AcpBuiltinCommandRuntime,
|
|
44
|
+
options?: { disabledOnly?: boolean },
|
|
42
45
|
): Promise<AcpBuiltinSlashCommandResult> {
|
|
43
46
|
const parsed = parseSlashCommand(text);
|
|
44
47
|
if (!parsed) return false;
|
|
45
48
|
const command = lookupBuiltinSlashCommand(parsed.name);
|
|
49
|
+
if (command?.acp === false) {
|
|
50
|
+
await runtime.output(`Slash command /${parsed.name} is unavailable over ACP.`);
|
|
51
|
+
return { consumed: true };
|
|
52
|
+
}
|
|
53
|
+
if (options?.disabledOnly) return false;
|
|
46
54
|
if (!command?.handle) {
|
|
47
55
|
const diagnostic = formatUnknownBuiltinSlashCommandDiagnostic(parsed.name);
|
|
48
56
|
if (!diagnostic) return false;
|