@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
|
@@ -17,14 +17,39 @@ import {
|
|
|
17
17
|
/**
|
|
18
18
|
* Top-level surfaces that may never appear in a GJC plugin bundle: bundles may
|
|
19
19
|
* only EXTEND existing skills/agents, never register new top-level ones.
|
|
20
|
+
* Each rejection is a targeted migration diagnostic naming the safe
|
|
21
|
+
* alternative (the loose surface or the sub-skill binding model) instead of a
|
|
22
|
+
* generic forbidden-key error.
|
|
20
23
|
*/
|
|
21
|
-
const FORBIDDEN_MANIFEST_KEYS = ["skills", "slash-commands", "commands", "agents"];
|
|
24
|
+
const FORBIDDEN_MANIFEST_KEYS = ["skills", "slash-commands", "commands", "agents"] as const;
|
|
25
|
+
|
|
26
|
+
type ForbiddenManifestKey = (typeof FORBIDDEN_MANIFEST_KEYS)[number];
|
|
27
|
+
|
|
28
|
+
const FORBIDDEN_SURFACE_DIAGNOSTICS: Record<ForbiddenManifestKey, string> = {
|
|
29
|
+
skills: `Forbidden GJC plugin surface "skills": bundles may only EXTEND the four bundled workflow skills (deep-interview, ralplan, ultragoal, team) and the four role agents (executor, architect, planner, critic), never register a new top-level skill. Bind an inline sub-skill with the canonical "subskills" surface (frontmatter binds_to/phase/activation_arg), or drop the manifest and use the loose surface .gjc/skills/<name>/SKILL.md (project) / ~/.gjc/agent/skills/<name>/SKILL.md (user).`,
|
|
30
|
+
"slash-commands": `Forbidden GJC plugin surface "slash-commands": bundles cannot register slash commands. Use the loose surface .gjc/commands/<name> (TypeScript module) or a markdown slash-command file instead.`,
|
|
31
|
+
commands: `Forbidden GJC plugin surface "commands" (Claude Code plugin.json vocabulary): bundles cannot register slash commands. Use the loose surface .gjc/commands/<name> (TypeScript module) or a markdown slash-command file instead.`,
|
|
32
|
+
agents: `Forbidden GJC plugin surface "agents" (Claude Code plugin.json vocabulary): bundles cannot register top-level agents; executor/architect/planner/critic are protected. Bind a sub-skill to an existing agent with the canonical "subskills" surface (frontmatter binds_to: one of executor|architect|planner|critic, phase, activation_arg) instead.`,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Ambiguous legacy aliases whose shape cannot be mapped onto the canonical
|
|
37
|
+
* compiled representation. Rejected as `unsupported_surface` with a targeted
|
|
38
|
+
* migration diagnostic naming the canonical form, never a generic unknown-key
|
|
39
|
+
* error. `mcp` is singular and shape-ambiguous (array entry vs single object),
|
|
40
|
+
* so it stays rejected; `mcpServers` is accepted and normalized (below).
|
|
41
|
+
*/
|
|
42
|
+
const AMBIGUOUS_ALIAS_KEYS = ["mcp"] as const;
|
|
22
43
|
|
|
23
44
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
45
|
+
* Accepted compatibility aliases from Claude Code / Codex-familiar plugin
|
|
46
|
+
* vocabulary. Each is normalized into the canonical compiled representation at
|
|
47
|
+
* parse time, so a canonical manifest and its alias compile to byte-equivalent
|
|
48
|
+
* normalized surfaces. Only aliases with an unambiguous semantic mapping are
|
|
49
|
+
* accepted here; anything else falls into AMBIGUOUS_ALIAS_KEYS or a targeted
|
|
50
|
+
* per-field migration diagnostic.
|
|
26
51
|
*/
|
|
27
|
-
const
|
|
52
|
+
const ACCEPTED_ALIAS_KEYS = ["mcpServers"] as const;
|
|
28
53
|
|
|
29
54
|
const KNOWN_MANIFEST_KEYS = new Set([
|
|
30
55
|
"kind",
|
|
@@ -36,8 +61,33 @@ const KNOWN_MANIFEST_KEYS = new Set([
|
|
|
36
61
|
"mcps",
|
|
37
62
|
"system_appendix",
|
|
38
63
|
"agent-appendix",
|
|
64
|
+
...ACCEPTED_ALIAS_KEYS,
|
|
39
65
|
]);
|
|
40
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Per-server keys the `mcpServers` alias accepts and maps onto the canonical
|
|
69
|
+
* `mcps` entry (`type` is Claude Code / loose mcp.json vocabulary for the
|
|
70
|
+
* canonical `transport` field).
|
|
71
|
+
*/
|
|
72
|
+
const MCP_SERVER_ALIAS_KEYS = new Set(["type", "command", "args", "cwd", "url"]);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Per-server keys that exist in GJC's loose mcp.json surface but have NO
|
|
76
|
+
* equivalent in the canonical plugin-manifest `mcps` entry. An alias cannot
|
|
77
|
+
* preserve their semantics, so they raise a targeted migration diagnostic
|
|
78
|
+
* naming the loose surface that can hold them.
|
|
79
|
+
*/
|
|
80
|
+
const MCP_SERVER_ALIAS_UNSUPPORTED_KEYS = [
|
|
81
|
+
"env",
|
|
82
|
+
"auth",
|
|
83
|
+
"oauth",
|
|
84
|
+
"headers",
|
|
85
|
+
"enabled",
|
|
86
|
+
"timeout",
|
|
87
|
+
"autoload",
|
|
88
|
+
"noInheritEnv",
|
|
89
|
+
] as const;
|
|
90
|
+
|
|
41
91
|
const MCP_TRANSPORTS: readonly GjcPluginMcpTransport[] = ["stdio", "http", "sse"];
|
|
42
92
|
|
|
43
93
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
@@ -191,6 +241,17 @@ function parseTools(value: unknown, manifestPath: string): GjcPluginToolManifest
|
|
|
191
241
|
function parseHooks(value: unknown, manifestPath: string): GjcPluginHookManifestEntry[] {
|
|
192
242
|
const raw = optionalArray(value, "hooks", manifestPath);
|
|
193
243
|
return raw.map((entry, index) => {
|
|
244
|
+
// Claude Code plugin.json hook entries are matcher groups ({ matcher,
|
|
245
|
+
// hooks, source }) with no `name`; a GJC bundle hook is a single
|
|
246
|
+
// constrained file with a declared event. The shapes cannot be mapped
|
|
247
|
+
// onto each other, so give the author a targeted migration diagnostic
|
|
248
|
+
// instead of a generic missing-field error.
|
|
249
|
+
if (isRecord(entry) && ("matcher" in entry || "hooks" in entry || "source" in entry)) {
|
|
250
|
+
throw new GjcPluginLoadError(
|
|
251
|
+
"invalid_manifest",
|
|
252
|
+
`Invalid GJC plugin manifest at ${manifestPath}: hooks[${index}] looks like a Claude Code plugin.json hook entry ({ matcher, hooks, source }), which cannot be preserved as a GJC bundle hook. Canonical GJC bundle hooks are { name, event, target?, phase?, path, sha256? } (event "tool_call"/"tool_result" with target/phase, or a session event). For unconstrained local hooks, use the loose surface .gjc/hooks/pre/<tool>.ts / .gjc/hooks/post/<tool>.ts.`,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
194
255
|
if (!isRecord(entry)) {
|
|
195
256
|
throw new GjcPluginLoadError(
|
|
196
257
|
"invalid_manifest",
|
|
@@ -222,53 +283,151 @@ function parseHooks(value: unknown, manifestPath: string): GjcPluginHookManifest
|
|
|
222
283
|
});
|
|
223
284
|
}
|
|
224
285
|
|
|
225
|
-
function
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
286
|
+
function parseMcpEntry(entry: unknown, field: string, manifestPath: string): GjcPluginMcpManifestEntry {
|
|
287
|
+
if (!isRecord(entry)) {
|
|
288
|
+
throw new GjcPluginLoadError(
|
|
289
|
+
"invalid_manifest",
|
|
290
|
+
`Invalid GJC plugin manifest at ${manifestPath}: ${field} must be an object`,
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
const name = manifestSafeName(entry.name, `${field}.name`, manifestPath);
|
|
294
|
+
const transport = entry.transport;
|
|
295
|
+
if (typeof transport !== "string" || !MCP_TRANSPORTS.includes(transport as GjcPluginMcpTransport)) {
|
|
296
|
+
throw new GjcPluginLoadError(
|
|
297
|
+
"invalid_manifest",
|
|
298
|
+
`Invalid GJC plugin manifest at ${manifestPath}: ${field}.transport must be one of ${MCP_TRANSPORTS.join(", ")}`,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
const command =
|
|
302
|
+
entry.command === undefined ? undefined : manifestString(entry.command, `${field}.command`, manifestPath);
|
|
303
|
+
const url = entry.url === undefined ? undefined : manifestString(entry.url, `${field}.url`, manifestPath);
|
|
304
|
+
const cwd = entry.cwd === undefined ? undefined : manifestString(entry.cwd, `${field}.cwd`, manifestPath);
|
|
305
|
+
let args: string[] | undefined;
|
|
306
|
+
if (entry.args !== undefined) {
|
|
307
|
+
if (!Array.isArray(entry.args) || !entry.args.every(item => typeof item === "string")) {
|
|
229
308
|
throw new GjcPluginLoadError(
|
|
230
309
|
"invalid_manifest",
|
|
231
|
-
`Invalid GJC plugin manifest at ${manifestPath}:
|
|
310
|
+
`Invalid GJC plugin manifest at ${manifestPath}: ${field}.args must be a string array`,
|
|
232
311
|
);
|
|
233
312
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
313
|
+
args = [...(entry.args as string[])];
|
|
314
|
+
}
|
|
315
|
+
let headers: Record<string, string> | undefined;
|
|
316
|
+
if (entry.headers !== undefined) {
|
|
317
|
+
if (!isRecord(entry.headers) || !Object.values(entry.headers).every(v => typeof v === "string")) {
|
|
237
318
|
throw new GjcPluginLoadError(
|
|
238
319
|
"invalid_manifest",
|
|
239
|
-
`Invalid GJC plugin manifest at ${manifestPath}:
|
|
320
|
+
`Invalid GJC plugin manifest at ${manifestPath}: ${field}.headers must be a string map`,
|
|
240
321
|
);
|
|
241
322
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
323
|
+
headers = { ...(entry.headers as Record<string, string>) };
|
|
324
|
+
}
|
|
325
|
+
const sha256 =
|
|
326
|
+
entry.sha256 === undefined ? undefined : manifestString(entry.sha256, `${field}.sha256`, manifestPath);
|
|
327
|
+
return { name, transport: transport as GjcPluginMcpTransport, command, args, cwd, url, headers, sha256 };
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function parseMcps(value: unknown, manifestPath: string): GjcPluginMcpManifestEntry[] {
|
|
331
|
+
const raw = optionalArray(value, "mcps", manifestPath);
|
|
332
|
+
return raw.map((entry, index) => parseMcpEntry(entry, `mcps[${index}]`, manifestPath));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Claude Code / Codex-familiar `mcpServers` map (server name -> server config),
|
|
337
|
+
* normalized into the canonical `mcps` array. Only fields with an unambiguous
|
|
338
|
+
* canonical equivalent are accepted; anything the canonical `mcps` entry cannot
|
|
339
|
+
* preserve (env, auth, oauth, headers, enablement/timeout/autoload controls, unknown
|
|
340
|
+
* keys) raises a targeted migration diagnostic naming the exact alternative.
|
|
341
|
+
*/
|
|
342
|
+
function normalizeMcpServersAlias(value: unknown, manifestPath: string): GjcPluginMcpManifestEntry[] {
|
|
343
|
+
if (!isRecord(value)) {
|
|
344
|
+
throw new GjcPluginLoadError(
|
|
345
|
+
"invalid_manifest",
|
|
346
|
+
`Invalid GJC plugin manifest at ${manifestPath}: "mcpServers" must be a map of server name to configuration`,
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
const entries: GjcPluginMcpManifestEntry[] = [];
|
|
350
|
+
const serverEntries = Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
351
|
+
for (const [serverName, rawEntry] of serverEntries) {
|
|
352
|
+
if (!isRecord(rawEntry)) {
|
|
353
|
+
throw new GjcPluginLoadError(
|
|
354
|
+
"invalid_manifest",
|
|
355
|
+
`Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] must be an object`,
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
for (const key of Object.keys(rawEntry)) {
|
|
359
|
+
if ((MCP_SERVER_ALIAS_UNSUPPORTED_KEYS as readonly string[]).includes(key)) {
|
|
251
360
|
throw new GjcPluginLoadError(
|
|
252
|
-
"
|
|
253
|
-
`
|
|
361
|
+
"unsupported_surface",
|
|
362
|
+
`mcpServers["${serverName}"] uses "${key}", which the canonical GJC bundle runtime cannot preserve end to end. "${key}" is supported by GJC's canonical loose MCP surface (mcpServers map in <project>/.gjc/mcp.json or ~/.gjc/agent/mcp.json): move this server there directly or through the /extensions import flow, or drop "${key}" from the bundle manifest (${manifestPath})`,
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
if (!MCP_SERVER_ALIAS_KEYS.has(key)) {
|
|
366
|
+
throw new GjcPluginLoadError(
|
|
367
|
+
"unsupported_surface",
|
|
368
|
+
`mcpServers["${serverName}"] has unknown key "${key}". Canonical "mcps" entries support name, transport, command, args, cwd, url, headers, sha256; the "mcpServers" alias additionally accepts "type" for the transport (${manifestPath})`,
|
|
254
369
|
);
|
|
255
370
|
}
|
|
256
|
-
args = [...(entry.args as string[])];
|
|
257
371
|
}
|
|
258
|
-
let
|
|
259
|
-
if (
|
|
260
|
-
if (
|
|
372
|
+
let transport: GjcPluginMcpTransport;
|
|
373
|
+
if (rawEntry.type !== undefined) {
|
|
374
|
+
if (typeof rawEntry.type !== "string" || !MCP_TRANSPORTS.includes(rawEntry.type as GjcPluginMcpTransport)) {
|
|
261
375
|
throw new GjcPluginLoadError(
|
|
262
376
|
"invalid_manifest",
|
|
263
|
-
`Invalid GJC plugin manifest at ${manifestPath}:
|
|
377
|
+
`Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"].type must be one of ${MCP_TRANSPORTS.join(", ")}`,
|
|
264
378
|
);
|
|
265
379
|
}
|
|
266
|
-
|
|
380
|
+
transport = rawEntry.type as GjcPluginMcpTransport;
|
|
381
|
+
} else if (typeof rawEntry.command === "string" && typeof rawEntry.url === "string") {
|
|
382
|
+
// Both stdio (command) and url transports declared without a type:
|
|
383
|
+
// ambiguous, refuse rather than guess.
|
|
384
|
+
throw new GjcPluginLoadError(
|
|
385
|
+
"invalid_manifest",
|
|
386
|
+
`Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] declares both "command" and "url" without a "type". Set "type" to "stdio" (command) or "http"/"sse" (url).`,
|
|
387
|
+
);
|
|
388
|
+
} else if (typeof rawEntry.command === "string") {
|
|
389
|
+
// Claude Code defaults: a command means stdio.
|
|
390
|
+
transport = "stdio";
|
|
391
|
+
} else if (typeof rawEntry.url === "string") {
|
|
392
|
+
// A bare url means an http transport; sse must be declared explicitly.
|
|
393
|
+
transport = "http";
|
|
394
|
+
} else {
|
|
395
|
+
throw new GjcPluginLoadError(
|
|
396
|
+
"invalid_manifest",
|
|
397
|
+
`Invalid GJC plugin manifest at ${manifestPath}: mcpServers["${serverName}"] cannot determine a transport. Set "type" (stdio | http | sse), or provide "command" (stdio) or "url" (http)`,
|
|
398
|
+
);
|
|
267
399
|
}
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
400
|
+
const incompatibleKeys = transport === "stdio" ? ["url"] : ["command", "args", "cwd"];
|
|
401
|
+
for (const key of incompatibleKeys) {
|
|
402
|
+
if (rawEntry[key] !== undefined) {
|
|
403
|
+
throw new GjcPluginLoadError(
|
|
404
|
+
"unsupported_surface",
|
|
405
|
+
`mcpServers["${serverName}"] uses "${key}" with transport "${transport}", but the GJC bundle runtime cannot preserve that field for this transport. Use only command/args/cwd for stdio or url for http/sse, or move the server to the canonical loose .gjc/mcp.json surface (${manifestPath})`,
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
entries.push(
|
|
410
|
+
parseMcpEntry(
|
|
411
|
+
{
|
|
412
|
+
name: serverName,
|
|
413
|
+
transport,
|
|
414
|
+
...pickOptional(rawEntry, ["command", "args", "cwd", "url"]),
|
|
415
|
+
},
|
|
416
|
+
`mcpServers["${serverName}"]`,
|
|
417
|
+
manifestPath,
|
|
418
|
+
),
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
return entries;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function pickOptional(entry: Record<string, unknown>, keys: readonly string[]): Record<string, unknown> {
|
|
425
|
+
const out: Record<string, unknown> = {};
|
|
426
|
+
for (const key of keys) {
|
|
427
|
+
const value = entry[key];
|
|
428
|
+
if (value !== undefined) out[key] = value;
|
|
429
|
+
}
|
|
430
|
+
return out;
|
|
272
431
|
}
|
|
273
432
|
|
|
274
433
|
function parseAppendixEntry(entry: unknown, field: string, manifestPath: string): GjcPluginAppendixManifestEntry {
|
|
@@ -324,15 +483,18 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
|
|
|
324
483
|
|
|
325
484
|
for (const key of FORBIDDEN_MANIFEST_KEYS) {
|
|
326
485
|
if (Object.hasOwn(raw, key)) {
|
|
327
|
-
throw new GjcPluginLoadError(
|
|
486
|
+
throw new GjcPluginLoadError(
|
|
487
|
+
"forbidden_surface",
|
|
488
|
+
`GJC plugin manifest at ${manifestPath}: ${FORBIDDEN_SURFACE_DIAGNOSTICS[key]}`,
|
|
489
|
+
);
|
|
328
490
|
}
|
|
329
491
|
}
|
|
330
492
|
|
|
331
|
-
for (const key of
|
|
493
|
+
for (const key of AMBIGUOUS_ALIAS_KEYS) {
|
|
332
494
|
if (Object.hasOwn(raw, key)) {
|
|
333
495
|
throw new GjcPluginLoadError(
|
|
334
496
|
"unsupported_surface",
|
|
335
|
-
`Unsupported GJC plugin surface in ${manifestPath}:
|
|
497
|
+
`Unsupported GJC plugin surface "${key}" in ${manifestPath}: the singular "mcp" shape is ambiguous. Use the canonical "mcps" (array of { name, transport, command, args, cwd, url, headers }) or the Claude Code-compatible "mcpServers" map alias.`,
|
|
336
498
|
);
|
|
337
499
|
}
|
|
338
500
|
}
|
|
@@ -341,11 +503,22 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
|
|
|
341
503
|
if (!KNOWN_MANIFEST_KEYS.has(key)) {
|
|
342
504
|
throw new GjcPluginLoadError(
|
|
343
505
|
"unsupported_surface",
|
|
344
|
-
`Unsupported GJC plugin surface in ${manifestPath}: ${key}
|
|
506
|
+
`Unsupported GJC plugin surface in ${manifestPath}: ${key}. Known GJC bundle keys: ${[...KNOWN_MANIFEST_KEYS].sort().join(", ")}.`,
|
|
345
507
|
);
|
|
346
508
|
}
|
|
347
509
|
}
|
|
348
510
|
|
|
511
|
+
// Claude Code plugin.json declares hooks as an event-keyed map; GJC bundle
|
|
512
|
+
// hooks are a constrained array. Detect the foreign shape and explain the
|
|
513
|
+
// canonical form (and the loose hook surface) instead of a generic
|
|
514
|
+
// must-be-an-array error.
|
|
515
|
+
if (raw.hooks !== undefined && !Array.isArray(raw.hooks)) {
|
|
516
|
+
throw new GjcPluginLoadError(
|
|
517
|
+
"invalid_manifest",
|
|
518
|
+
`Invalid GJC plugin manifest at ${manifestPath}: "hooks" must be an array of { name, event, target?, phase?, path, sha256? }. A Claude Code plugin.json "hooks" map (event-keyed matcher groups) cannot be preserved as a GJC bundle hook. For unconstrained local hooks, use the loose surface .gjc/hooks/pre/<tool>.ts / .gjc/hooks/post/<tool>.ts.`,
|
|
519
|
+
);
|
|
520
|
+
}
|
|
521
|
+
|
|
349
522
|
if (raw.kind !== GJC_PLUGIN_KIND) {
|
|
350
523
|
throw new GjcPluginLoadError(
|
|
351
524
|
"invalid_kind",
|
|
@@ -353,6 +526,13 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
|
|
|
353
526
|
);
|
|
354
527
|
}
|
|
355
528
|
|
|
529
|
+
if (raw.mcps !== undefined && raw.mcpServers !== undefined) {
|
|
530
|
+
throw new GjcPluginLoadError(
|
|
531
|
+
"invalid_manifest",
|
|
532
|
+
`Invalid GJC plugin manifest at ${manifestPath}: use either the canonical "mcps" array or the "mcpServers" alias map, not both.`,
|
|
533
|
+
);
|
|
534
|
+
}
|
|
535
|
+
|
|
356
536
|
const name = manifestSafeName(raw.name, "name", manifestPath);
|
|
357
537
|
const version = manifestSafeVersion(raw.version, manifestPath);
|
|
358
538
|
|
|
@@ -363,7 +543,10 @@ export function parseManifest(raw: unknown, manifestPath: string): GjcPluginMani
|
|
|
363
543
|
subskills: optionalStringArray(raw.subskills, "subskills", manifestPath),
|
|
364
544
|
tools: parseTools(raw.tools, manifestPath),
|
|
365
545
|
hooks: parseHooks(raw.hooks, manifestPath),
|
|
366
|
-
mcps:
|
|
546
|
+
mcps:
|
|
547
|
+
raw.mcpServers !== undefined
|
|
548
|
+
? normalizeMcpServersAlias(raw.mcpServers, manifestPath)
|
|
549
|
+
: parseMcps(raw.mcps, manifestPath),
|
|
367
550
|
systemAppendix: parseSystemAppendix(raw.system_appendix, manifestPath),
|
|
368
551
|
agentAppendix: parseAgentAppendix(raw["agent-appendix"], manifestPath),
|
|
369
552
|
};
|
|
@@ -7,12 +7,29 @@ import * as zod from "zod/v4";
|
|
|
7
7
|
import { hookCapability } from "../../capability/hook";
|
|
8
8
|
import type { Hook } from "../../discovery";
|
|
9
9
|
import { loadCapability } from "../../discovery";
|
|
10
|
+
import { HookSourceConvention } from "../../hooks/events";
|
|
11
|
+
import { type NormalizedHook, normalizeDirectoryHook } from "../../hooks/normalize";
|
|
10
12
|
import type { HookMessage } from "../../session/messages";
|
|
11
13
|
import type { SessionManager } from "../../session/session-manager";
|
|
14
|
+
import type {
|
|
15
|
+
ExtensionAPI,
|
|
16
|
+
ExtensionCommandContext,
|
|
17
|
+
ExtensionContext,
|
|
18
|
+
ExtensionFactory,
|
|
19
|
+
MessageRenderer,
|
|
20
|
+
} from "../extensions/types";
|
|
12
21
|
import * as typebox from "../typebox";
|
|
13
22
|
import { resolvePath } from "../utils";
|
|
14
23
|
import { execCommand } from "./runner";
|
|
15
|
-
import type {
|
|
24
|
+
import type {
|
|
25
|
+
ExecOptions,
|
|
26
|
+
HookAPI,
|
|
27
|
+
HookCommandContext,
|
|
28
|
+
HookContext,
|
|
29
|
+
HookFactory,
|
|
30
|
+
HookMessageRenderer,
|
|
31
|
+
RegisteredCommand,
|
|
32
|
+
} from "./types";
|
|
16
33
|
|
|
17
34
|
/**
|
|
18
35
|
* Generic handler function type.
|
|
@@ -71,6 +88,8 @@ export interface LoadedHook {
|
|
|
71
88
|
setSendMessageHandler: (handler: SendMessageHandler) => void;
|
|
72
89
|
/** Set the append entry handler for this hook's pi.appendEntry() */
|
|
73
90
|
setAppendEntryHandler: (handler: AppendEntryHandler) => void;
|
|
91
|
+
/** Canonical discovery descriptor when loaded from a known hook convention. */
|
|
92
|
+
normalization?: NormalizedHook;
|
|
74
93
|
}
|
|
75
94
|
|
|
76
95
|
/**
|
|
@@ -83,6 +102,11 @@ export interface LoadHooksResult {
|
|
|
83
102
|
errors: Array<{ path: string; error: string }>;
|
|
84
103
|
}
|
|
85
104
|
|
|
105
|
+
export interface LoadHookExtensionsResult {
|
|
106
|
+
factories: Array<{ factory: ExtensionFactory; name: string }>;
|
|
107
|
+
errors: Array<{ path: string; error: string }>;
|
|
108
|
+
}
|
|
109
|
+
|
|
86
110
|
/**
|
|
87
111
|
* Create a HookAPI instance that collects handlers, renderers, and commands.
|
|
88
112
|
* Returns the API, maps, and functions to set handlers later.
|
|
@@ -223,17 +247,17 @@ export async function loadHooks(paths: string[], cwd: string): Promise<LoadHooks
|
|
|
223
247
|
}
|
|
224
248
|
|
|
225
249
|
/**
|
|
226
|
-
* Discover and load hooks from
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* 2. Installed plugins
|
|
230
|
-
* 3. Other editor/IDE configurations
|
|
250
|
+
* Discover and load hooks from canonical native GJC configuration.
|
|
251
|
+
* Claude Code and Codex hook layouts remain registered capability providers for
|
|
252
|
+
* explicit import and diagnostics, but are not competing runtime authorities.
|
|
231
253
|
*
|
|
232
254
|
* Plus any explicitly configured paths from settings.
|
|
233
255
|
*/
|
|
234
256
|
export async function discoverAndLoadHooks(configuredPaths: string[], cwd: string): Promise<LoadHooksResult> {
|
|
235
257
|
const allPaths: string[] = [];
|
|
236
258
|
const seen = new Set<string>();
|
|
259
|
+
const normalizationErrors: Array<{ path: string; error: string }> = [];
|
|
260
|
+
const normalizationByPath = new Map<string, NormalizedHook>();
|
|
237
261
|
|
|
238
262
|
// Helper to add paths without duplicates
|
|
239
263
|
const addPaths = (paths: string[]) => {
|
|
@@ -246,12 +270,132 @@ export async function discoverAndLoadHooks(configuredPaths: string[], cwd: strin
|
|
|
246
270
|
}
|
|
247
271
|
};
|
|
248
272
|
|
|
249
|
-
// 1. Discover hooks via capability API
|
|
250
|
-
|
|
251
|
-
|
|
273
|
+
// 1. Discover hooks via capability API and validate the provider descriptor
|
|
274
|
+
// against the canonical model before importing project-controlled code.
|
|
275
|
+
const discovered = await loadCapability<Hook>(hookCapability.id, { cwd, providers: ["native"] });
|
|
276
|
+
for (const hook of discovered.items) {
|
|
277
|
+
const convention =
|
|
278
|
+
hook._source.provider === "native"
|
|
279
|
+
? HookSourceConvention.NativeGjc
|
|
280
|
+
: hook._source.provider === "claude"
|
|
281
|
+
? HookSourceConvention.ClaudeCode
|
|
282
|
+
: hook._source.provider === "codex"
|
|
283
|
+
? HookSourceConvention.Codex
|
|
284
|
+
: null;
|
|
285
|
+
if (convention) {
|
|
286
|
+
const normalized = normalizeDirectoryHook({
|
|
287
|
+
convention,
|
|
288
|
+
phase: hook.type,
|
|
289
|
+
toolName: hook.tool,
|
|
290
|
+
source: hook.path,
|
|
291
|
+
externalName: hook.name,
|
|
292
|
+
});
|
|
293
|
+
if (!normalized.hook) {
|
|
294
|
+
normalizationErrors.push({
|
|
295
|
+
path: hook.path,
|
|
296
|
+
error: normalized.diagnostics.map(diagnostic => `${diagnostic.code}: ${diagnostic.message}`).join("; "),
|
|
297
|
+
});
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
normalizationByPath.set(path.resolve(hook.path), normalized.hook);
|
|
301
|
+
}
|
|
302
|
+
addPaths([hook.path]);
|
|
303
|
+
}
|
|
252
304
|
|
|
253
305
|
// 2. Explicitly configured paths (can override/add)
|
|
254
306
|
addPaths(configuredPaths.map(p => resolvePath(p, cwd)));
|
|
255
307
|
|
|
256
|
-
|
|
308
|
+
const loaded = await loadHooks(allPaths, cwd);
|
|
309
|
+
for (const hook of loaded.hooks) {
|
|
310
|
+
hook.normalization = normalizationByPath.get(path.resolve(hook.path));
|
|
311
|
+
}
|
|
312
|
+
return { hooks: loaded.hooks, errors: [...normalizationErrors, ...loaded.errors] };
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function toHookContext(context: ExtensionContext): HookContext {
|
|
316
|
+
return {
|
|
317
|
+
ui: {
|
|
318
|
+
select: (title, options) => context.ui.select(title, options),
|
|
319
|
+
confirm: (title, message) => context.ui.confirm(title, message),
|
|
320
|
+
input: (title, placeholder) => context.ui.input(title, placeholder),
|
|
321
|
+
notify: (message, type) => context.ui.notify(message, type),
|
|
322
|
+
setStatus: (key, text) => context.ui.setStatus(key, text),
|
|
323
|
+
custom: factory => context.ui.custom((tui, theme, _keybindings, done) => factory(tui, theme, done)),
|
|
324
|
+
setEditorText: text => context.ui.setEditorText(text),
|
|
325
|
+
getEditorText: () => context.ui.getEditorText(),
|
|
326
|
+
editor: (title, prefill, options) => context.ui.editor(title, prefill, options),
|
|
327
|
+
theme: context.ui.theme,
|
|
328
|
+
},
|
|
329
|
+
hasUI: context.hasUI,
|
|
330
|
+
cwd: context.cwd,
|
|
331
|
+
sessionManager: context.sessionManager,
|
|
332
|
+
modelRegistry: context.modelRegistry,
|
|
333
|
+
model: context.model,
|
|
334
|
+
isIdle: () => context.isIdle(),
|
|
335
|
+
abort: () => context.abort(),
|
|
336
|
+
hasQueuedMessages: () => context.hasQueuedMessages(),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function toHookCommandContext(context: ExtensionCommandContext): HookCommandContext {
|
|
341
|
+
return {
|
|
342
|
+
...toHookContext(context),
|
|
343
|
+
waitForIdle: () => context.waitForIdle(),
|
|
344
|
+
newSession: options => context.newSession(options),
|
|
345
|
+
branch: entryId => context.branch(entryId),
|
|
346
|
+
navigateTree: (targetId, options) => context.navigateTree(targetId, options),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function createHookExtensionFactory(hook: LoadedHook): ExtensionFactory {
|
|
351
|
+
return (api: ExtensionAPI) => {
|
|
352
|
+
hook.setSendMessageHandler((message, options) => api.sendMessage(message, options));
|
|
353
|
+
hook.setAppendEntryHandler((customType, data) => api.appendEntry(customType, data));
|
|
354
|
+
|
|
355
|
+
for (const [event, handlers] of hook.handlers) {
|
|
356
|
+
for (const handler of handlers) {
|
|
357
|
+
const normalized = hook.normalization;
|
|
358
|
+
const adapted: HandlerFn = async (...args: unknown[]) => {
|
|
359
|
+
const payload = args[0] as { toolName?: string };
|
|
360
|
+
if (
|
|
361
|
+
normalized &&
|
|
362
|
+
event === normalized.runtimeEvent &&
|
|
363
|
+
normalized.toolName !== "*" &&
|
|
364
|
+
payload.toolName !== normalized.toolName
|
|
365
|
+
) {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
return await handler(payload, toHookContext(args[1] as ExtensionContext));
|
|
369
|
+
};
|
|
370
|
+
(api.on as (event: string, handler: HandlerFn) => void)(event, adapted);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
for (const [customType, renderer] of hook.messageRenderers) {
|
|
375
|
+
const adaptedRenderer: MessageRenderer = (message, options, theme) =>
|
|
376
|
+
renderer({ ...message, role: "hookMessage" }, options, theme);
|
|
377
|
+
api.registerMessageRenderer(customType, adaptedRenderer);
|
|
378
|
+
}
|
|
379
|
+
for (const command of hook.commands.values()) {
|
|
380
|
+
api.registerCommand(command.name, {
|
|
381
|
+
description: command.description,
|
|
382
|
+
handler: (args, context) => command.handler(args, toHookCommandContext(context)),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/** Load normalized directory hooks and adapt them into the authoritative ExtensionRunner path. */
|
|
389
|
+
export async function discoverAndLoadHookExtensions(
|
|
390
|
+
configuredPaths: string[],
|
|
391
|
+
cwd: string,
|
|
392
|
+
): Promise<LoadHookExtensionsResult> {
|
|
393
|
+
const loaded = await discoverAndLoadHooks(configuredPaths, cwd);
|
|
394
|
+
return {
|
|
395
|
+
factories: loaded.hooks.map(hook => ({
|
|
396
|
+
factory: createHookExtensionFactory(hook),
|
|
397
|
+
name: `hook:${hook.resolvedPath}`,
|
|
398
|
+
})),
|
|
399
|
+
errors: loaded.errors,
|
|
400
|
+
};
|
|
257
401
|
}
|