@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,291 @@
|
|
|
1
|
+
/** Stable canonical names used to compare hook surfaces without replacing runtime event types. */
|
|
2
|
+
export const HookEventKind = {
|
|
3
|
+
UserPromptSubmit: "user_prompt_submit",
|
|
4
|
+
PreToolUse: "pre_tool_use",
|
|
5
|
+
PostToolUse: "post_tool_use",
|
|
6
|
+
Stop: "stop",
|
|
7
|
+
SessionStart: "session_start",
|
|
8
|
+
SessionShutdown: "session_shutdown",
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
export type HookEventKind = (typeof HookEventKind)[keyof typeof HookEventKind];
|
|
12
|
+
|
|
13
|
+
export const HookAuthority = {
|
|
14
|
+
Constrained: "constrained",
|
|
15
|
+
Command: "command",
|
|
16
|
+
InProcess: "in-process",
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
export type HookAuthority = (typeof HookAuthority)[keyof typeof HookAuthority];
|
|
20
|
+
|
|
21
|
+
export const HookSourceConvention = {
|
|
22
|
+
NativeGjc: "native-gjc",
|
|
23
|
+
ClaudeCode: "claude-code",
|
|
24
|
+
Codex: "codex",
|
|
25
|
+
CodexManagedJson: "codex-managed-json",
|
|
26
|
+
GjcPlugin: "gjc-plugin",
|
|
27
|
+
InProcess: "in-process",
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
export type HookSourceConvention = (typeof HookSourceConvention)[keyof typeof HookSourceConvention];
|
|
31
|
+
|
|
32
|
+
export interface HookEventSchemaContract {
|
|
33
|
+
kind: HookEventKind;
|
|
34
|
+
input: string;
|
|
35
|
+
output: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Canonical schema references. These point at existing runtime types; they are not a
|
|
40
|
+
* second runtime event union and do not change payloads dispatched by the hook runners.
|
|
41
|
+
*/
|
|
42
|
+
export const HOOK_EVENT_SCHEMAS: Record<HookEventKind, HookEventSchemaContract> = {
|
|
43
|
+
[HookEventKind.UserPromptSubmit]: {
|
|
44
|
+
kind: HookEventKind.UserPromptSubmit,
|
|
45
|
+
input: "BeforeAgentStartEvent { type, prompt, images?, systemPrompt } or provider-owned named-event payload",
|
|
46
|
+
output: "BeforeAgentStartEventResult { message?, systemPrompt? } or provider-owned command output",
|
|
47
|
+
},
|
|
48
|
+
[HookEventKind.PreToolUse]: {
|
|
49
|
+
kind: HookEventKind.PreToolUse,
|
|
50
|
+
input: "ToolCallEvent { type, toolName, toolCallId, input }",
|
|
51
|
+
output: "ToolCallEventResult { block?, reason? }",
|
|
52
|
+
},
|
|
53
|
+
[HookEventKind.PostToolUse]: {
|
|
54
|
+
kind: HookEventKind.PostToolUse,
|
|
55
|
+
input: "ToolResultEvent { type, toolName, toolCallId, input, content, details, isError }",
|
|
56
|
+
output: "ToolResultEventResult { content?, details?, isError? }",
|
|
57
|
+
},
|
|
58
|
+
[HookEventKind.Stop]: {
|
|
59
|
+
kind: HookEventKind.Stop,
|
|
60
|
+
input: "AgentEndEvent for GJC in-process hooks, or provider-owned Stop payload",
|
|
61
|
+
output: "void for GJC in-process hooks, or provider-owned command output",
|
|
62
|
+
},
|
|
63
|
+
[HookEventKind.SessionStart]: {
|
|
64
|
+
kind: HookEventKind.SessionStart,
|
|
65
|
+
input: "SessionStartEvent { type: session_start }",
|
|
66
|
+
output: "void",
|
|
67
|
+
},
|
|
68
|
+
[HookEventKind.SessionShutdown]: {
|
|
69
|
+
kind: HookEventKind.SessionShutdown,
|
|
70
|
+
input: "SessionShutdownEvent { type: session_shutdown }",
|
|
71
|
+
output: "void",
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export type HookOrdering = "sequential" | "external-runtime";
|
|
76
|
+
export type HookAwaitBehavior = "awaited" | "external-runtime";
|
|
77
|
+
export type HookErrorBehavior = "isolate" | "fail-closed" | "external-runtime";
|
|
78
|
+
export type HookProcessAuthority = "none" | "hook-api" | "command" | "ambient-host";
|
|
79
|
+
export type HookTrustRequirement = "not-enforced" | "provider-owned";
|
|
80
|
+
export type HookRedaction = "none" | "provider-owned";
|
|
81
|
+
|
|
82
|
+
export interface HookExecutionContract {
|
|
83
|
+
kind: HookEventKind;
|
|
84
|
+
runtimeEvent: string;
|
|
85
|
+
authority: HookAuthority;
|
|
86
|
+
awaitBehavior: HookAwaitBehavior;
|
|
87
|
+
ordering: HookOrdering;
|
|
88
|
+
canCancel: boolean;
|
|
89
|
+
mutation: readonly string[];
|
|
90
|
+
timeoutMs: number | null;
|
|
91
|
+
errorBehavior: HookErrorBehavior;
|
|
92
|
+
processAuthority: HookProcessAuthority;
|
|
93
|
+
trustRequirement: HookTrustRequirement;
|
|
94
|
+
redaction: HookRedaction;
|
|
95
|
+
logging: string;
|
|
96
|
+
semanticNotes: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const hookModulePre: HookExecutionContract = {
|
|
100
|
+
kind: HookEventKind.PreToolUse,
|
|
101
|
+
runtimeEvent: "tool_call",
|
|
102
|
+
authority: HookAuthority.InProcess,
|
|
103
|
+
awaitBehavior: "awaited",
|
|
104
|
+
ordering: "sequential",
|
|
105
|
+
canCancel: true,
|
|
106
|
+
mutation: [],
|
|
107
|
+
timeoutMs: null,
|
|
108
|
+
errorBehavior: "fail-closed",
|
|
109
|
+
processAuthority: "hook-api",
|
|
110
|
+
trustRequirement: "not-enforced",
|
|
111
|
+
redaction: "none",
|
|
112
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
113
|
+
semanticNotes:
|
|
114
|
+
"The first blocking result stops later handlers. Directory hooks are imported modules, not shell scripts.",
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const hookModulePost: HookExecutionContract = {
|
|
118
|
+
kind: HookEventKind.PostToolUse,
|
|
119
|
+
runtimeEvent: "tool_result",
|
|
120
|
+
authority: HookAuthority.InProcess,
|
|
121
|
+
awaitBehavior: "awaited",
|
|
122
|
+
ordering: "sequential",
|
|
123
|
+
canCancel: false,
|
|
124
|
+
mutation: ["content", "details", "isError"],
|
|
125
|
+
timeoutMs: 30_000,
|
|
126
|
+
errorBehavior: "isolate",
|
|
127
|
+
processAuthority: "hook-api",
|
|
128
|
+
trustRequirement: "not-enforced",
|
|
129
|
+
redaction: "none",
|
|
130
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
131
|
+
semanticNotes:
|
|
132
|
+
"Handlers receive the prior handler's replacements; content, details, and isError changes are chained in registration order.",
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const constrainedPre: HookExecutionContract = {
|
|
136
|
+
...hookModulePre,
|
|
137
|
+
authority: HookAuthority.Constrained,
|
|
138
|
+
processAuthority: "ambient-host",
|
|
139
|
+
semanticNotes:
|
|
140
|
+
"The plugin API denies exec, messaging, commands, renderers, and session mutation, but the imported module is not a process sandbox and retains ambient Bun/host globals. A thrown pre-hook error blocks the tool.",
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const constrainedPost: HookExecutionContract = {
|
|
144
|
+
...hookModulePost,
|
|
145
|
+
authority: HookAuthority.Constrained,
|
|
146
|
+
timeoutMs: 30_000,
|
|
147
|
+
processAuthority: "ambient-host",
|
|
148
|
+
mutation: ["content", "details", "isError"],
|
|
149
|
+
semanticNotes: "The constrained hook is adapted into ExtensionRunner; timeout and thrown errors are isolated.",
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const constrainedLifecycle = (kind: HookEventKind, runtimeEvent: string): HookExecutionContract => ({
|
|
153
|
+
kind,
|
|
154
|
+
runtimeEvent,
|
|
155
|
+
authority: HookAuthority.Constrained,
|
|
156
|
+
awaitBehavior: "awaited",
|
|
157
|
+
ordering: "sequential",
|
|
158
|
+
canCancel: false,
|
|
159
|
+
mutation: [],
|
|
160
|
+
timeoutMs: 30_000,
|
|
161
|
+
errorBehavior: "isolate",
|
|
162
|
+
processAuthority: "ambient-host",
|
|
163
|
+
trustRequirement: "not-enforced",
|
|
164
|
+
redaction: "none",
|
|
165
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
166
|
+
semanticNotes:
|
|
167
|
+
"The constrained GJC API remains denied, but the imported plugin module retains ambient host-process authority.",
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const managedPrompt: HookExecutionContract = {
|
|
171
|
+
kind: HookEventKind.UserPromptSubmit,
|
|
172
|
+
runtimeEvent: "UserPromptSubmit",
|
|
173
|
+
authority: HookAuthority.Command,
|
|
174
|
+
awaitBehavior: "external-runtime",
|
|
175
|
+
ordering: "external-runtime",
|
|
176
|
+
canCancel: false,
|
|
177
|
+
mutation: [],
|
|
178
|
+
timeoutMs: null,
|
|
179
|
+
errorBehavior: "external-runtime",
|
|
180
|
+
processAuthority: "command",
|
|
181
|
+
trustRequirement: "provider-owned",
|
|
182
|
+
redaction: "provider-owned",
|
|
183
|
+
logging: "Codex owns command invocation logging; GJC only installs and handles its managed command payload.",
|
|
184
|
+
semanticNotes: "Normalization describes hooks.json configuration; GJC does not schedule this command itself.",
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const managedStop: HookExecutionContract = {
|
|
188
|
+
...managedPrompt,
|
|
189
|
+
kind: HookEventKind.Stop,
|
|
190
|
+
runtimeEvent: "Stop",
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const inProcessPrompt: HookExecutionContract = {
|
|
194
|
+
kind: HookEventKind.UserPromptSubmit,
|
|
195
|
+
runtimeEvent: "before_agent_start",
|
|
196
|
+
authority: HookAuthority.InProcess,
|
|
197
|
+
awaitBehavior: "awaited",
|
|
198
|
+
ordering: "sequential",
|
|
199
|
+
canCancel: false,
|
|
200
|
+
mutation: ["message", "systemPrompt"],
|
|
201
|
+
timeoutMs: 30_000,
|
|
202
|
+
errorBehavior: "isolate",
|
|
203
|
+
processAuthority: "hook-api",
|
|
204
|
+
trustRequirement: "not-enforced",
|
|
205
|
+
redaction: "none",
|
|
206
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
207
|
+
semanticNotes: "This is a before-agent-start callback, not a byte-for-byte Claude/Codex UserPromptSubmit payload.",
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const inProcessStop: HookExecutionContract = {
|
|
211
|
+
kind: HookEventKind.Stop,
|
|
212
|
+
runtimeEvent: "agent_end",
|
|
213
|
+
authority: HookAuthority.InProcess,
|
|
214
|
+
awaitBehavior: "awaited",
|
|
215
|
+
ordering: "sequential",
|
|
216
|
+
canCancel: false,
|
|
217
|
+
mutation: [],
|
|
218
|
+
timeoutMs: 30_000,
|
|
219
|
+
errorBehavior: "isolate",
|
|
220
|
+
processAuthority: "hook-api",
|
|
221
|
+
trustRequirement: "not-enforced",
|
|
222
|
+
redaction: "none",
|
|
223
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
224
|
+
semanticNotes:
|
|
225
|
+
"agent_end is the loop-end equivalent. turn_end is per-turn and is intentionally not normalized to Stop.",
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const lifecycle = (kind: HookEventKind, runtimeEvent: string): HookExecutionContract => ({
|
|
229
|
+
kind,
|
|
230
|
+
runtimeEvent,
|
|
231
|
+
authority: HookAuthority.InProcess,
|
|
232
|
+
awaitBehavior: "awaited",
|
|
233
|
+
ordering: "sequential",
|
|
234
|
+
canCancel: false,
|
|
235
|
+
mutation: [],
|
|
236
|
+
timeoutMs: 30_000,
|
|
237
|
+
errorBehavior: "isolate",
|
|
238
|
+
processAuthority: "hook-api",
|
|
239
|
+
trustRequirement: "not-enforced",
|
|
240
|
+
redaction: "none",
|
|
241
|
+
logging: "Extension errors expose the extension path, event name, error message, and stack to registered listeners.",
|
|
242
|
+
semanticNotes: "Dispatched by ExtensionRunner and awaited sequentially with the shared extension timeout.",
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
/** Per-convention execution truth. Missing entries are unsupported. */
|
|
246
|
+
export const CONVENTION_EVENT_CONTRACTS: Record<
|
|
247
|
+
HookSourceConvention,
|
|
248
|
+
Partial<Record<HookEventKind, HookExecutionContract>>
|
|
249
|
+
> = {
|
|
250
|
+
[HookSourceConvention.NativeGjc]: {
|
|
251
|
+
[HookEventKind.PreToolUse]: hookModulePre,
|
|
252
|
+
[HookEventKind.PostToolUse]: hookModulePost,
|
|
253
|
+
},
|
|
254
|
+
[HookSourceConvention.ClaudeCode]: {
|
|
255
|
+
[HookEventKind.PreToolUse]: hookModulePre,
|
|
256
|
+
[HookEventKind.PostToolUse]: hookModulePost,
|
|
257
|
+
},
|
|
258
|
+
[HookSourceConvention.Codex]: {
|
|
259
|
+
[HookEventKind.PreToolUse]: hookModulePre,
|
|
260
|
+
[HookEventKind.PostToolUse]: hookModulePost,
|
|
261
|
+
},
|
|
262
|
+
[HookSourceConvention.CodexManagedJson]: {
|
|
263
|
+
[HookEventKind.UserPromptSubmit]: managedPrompt,
|
|
264
|
+
[HookEventKind.Stop]: managedStop,
|
|
265
|
+
},
|
|
266
|
+
[HookSourceConvention.GjcPlugin]: {
|
|
267
|
+
[HookEventKind.PreToolUse]: constrainedPre,
|
|
268
|
+
[HookEventKind.PostToolUse]: constrainedPost,
|
|
269
|
+
[HookEventKind.SessionStart]: constrainedLifecycle(HookEventKind.SessionStart, "session_start"),
|
|
270
|
+
[HookEventKind.SessionShutdown]: constrainedLifecycle(HookEventKind.SessionShutdown, "session_shutdown"),
|
|
271
|
+
},
|
|
272
|
+
[HookSourceConvention.InProcess]: {
|
|
273
|
+
[HookEventKind.UserPromptSubmit]: inProcessPrompt,
|
|
274
|
+
[HookEventKind.PreToolUse]: hookModulePre,
|
|
275
|
+
[HookEventKind.PostToolUse]: hookModulePost,
|
|
276
|
+
[HookEventKind.Stop]: inProcessStop,
|
|
277
|
+
[HookEventKind.SessionStart]: lifecycle(HookEventKind.SessionStart, "session_start"),
|
|
278
|
+
[HookEventKind.SessionShutdown]: lifecycle(HookEventKind.SessionShutdown, "session_shutdown"),
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
export const EXTERNAL_EVENT_ALIASES: Readonly<Record<string, HookEventKind>> = {
|
|
283
|
+
UserPromptSubmit: HookEventKind.UserPromptSubmit,
|
|
284
|
+
Stop: HookEventKind.Stop,
|
|
285
|
+
before_agent_start: HookEventKind.UserPromptSubmit,
|
|
286
|
+
tool_call: HookEventKind.PreToolUse,
|
|
287
|
+
tool_result: HookEventKind.PostToolUse,
|
|
288
|
+
agent_end: HookEventKind.Stop,
|
|
289
|
+
session_start: HookEventKind.SessionStart,
|
|
290
|
+
session_shutdown: HookEventKind.SessionShutdown,
|
|
291
|
+
};
|
|
@@ -119,6 +119,8 @@ function mergeRawSkillConfig(
|
|
|
119
119
|
const rawSkills = readNestedRecord(raw, "skills");
|
|
120
120
|
const enabled = readBoolean(rawSkills.enabled);
|
|
121
121
|
const enableSkillCommands = readBoolean(rawSkills.enableSkillCommands);
|
|
122
|
+
const trustProjectSkills = readBoolean(rawSkills.trustProjectSkills);
|
|
123
|
+
const trustUserSkills = readBoolean(rawSkills.trustUserSkills);
|
|
122
124
|
const enablePiUser = readBoolean(rawSkills.enablePiUser);
|
|
123
125
|
const enablePiProject = readBoolean(rawSkills.enablePiProject);
|
|
124
126
|
const enableCodexUser = readBoolean(rawSkills.enableCodexUser);
|
|
@@ -133,6 +135,8 @@ function mergeRawSkillConfig(
|
|
|
133
135
|
...currentSkills,
|
|
134
136
|
...(enabled !== undefined ? { enabled } : {}),
|
|
135
137
|
...(enableSkillCommands !== undefined ? { enableSkillCommands } : {}),
|
|
138
|
+
...(trustProjectSkills !== undefined ? { trustProjectSkills } : {}),
|
|
139
|
+
...(trustUserSkills !== undefined ? { trustUserSkills } : {}),
|
|
136
140
|
...(enablePiUser !== undefined ? { enablePiUser } : {}),
|
|
137
141
|
...(enablePiProject !== undefined ? { enablePiProject } : {}),
|
|
138
142
|
...(enableCodexUser !== undefined ? { enableCodexUser } : {}),
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CONVENTION_EVENT_CONTRACTS,
|
|
3
|
+
EXTERNAL_EVENT_ALIASES,
|
|
4
|
+
type HookAuthority,
|
|
5
|
+
HookEventKind,
|
|
6
|
+
type HookExecutionContract,
|
|
7
|
+
HookSourceConvention,
|
|
8
|
+
} from "./events";
|
|
9
|
+
|
|
10
|
+
export const HookDiagnosticSeverity = {
|
|
11
|
+
Error: "error",
|
|
12
|
+
Warning: "warning",
|
|
13
|
+
} as const;
|
|
14
|
+
|
|
15
|
+
export type HookDiagnosticSeverity = (typeof HookDiagnosticSeverity)[keyof typeof HookDiagnosticSeverity];
|
|
16
|
+
|
|
17
|
+
export const HookDiagnosticCode = {
|
|
18
|
+
UnsupportedConventionEvent: "unsupported_convention_event",
|
|
19
|
+
UnrecognizedPluginEvent: "unrecognized_plugin_event",
|
|
20
|
+
InvalidPluginPhase: "invalid_plugin_phase",
|
|
21
|
+
InvalidToolMatcher: "invalid_tool_matcher",
|
|
22
|
+
InvalidSource: "invalid_source",
|
|
23
|
+
InvalidCommand: "invalid_command",
|
|
24
|
+
DuplicateHook: "duplicate_hook",
|
|
25
|
+
InProcessEventOutsideIr: "in_process_event_outside_hook_ir",
|
|
26
|
+
SemanticMismatch: "semantic_mismatch",
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
export type HookDiagnosticCode = (typeof HookDiagnosticCode)[keyof typeof HookDiagnosticCode];
|
|
30
|
+
|
|
31
|
+
export interface HookNormalizationDiagnostic {
|
|
32
|
+
severity: HookDiagnosticSeverity;
|
|
33
|
+
code: HookDiagnosticCode;
|
|
34
|
+
message: string;
|
|
35
|
+
convention: HookSourceConvention;
|
|
36
|
+
externalEvent?: string;
|
|
37
|
+
canonicalKind?: HookEventKind;
|
|
38
|
+
source?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface NormalizedHook {
|
|
42
|
+
kind: HookEventKind;
|
|
43
|
+
authority: HookAuthority;
|
|
44
|
+
convention: HookSourceConvention;
|
|
45
|
+
runtimeEvent: string;
|
|
46
|
+
toolName: string;
|
|
47
|
+
source: string;
|
|
48
|
+
contract: HookExecutionContract;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface NormalizeHookResult {
|
|
52
|
+
hook: NormalizedHook | null;
|
|
53
|
+
diagnostics: HookNormalizationDiagnostic[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function resolveExecutionContract(
|
|
57
|
+
convention: HookSourceConvention,
|
|
58
|
+
kind: HookEventKind,
|
|
59
|
+
): HookExecutionContract | null {
|
|
60
|
+
return CONVENTION_EVENT_CONTRACTS[convention][kind] ?? null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function resolveAuthority(convention: HookSourceConvention, kind: HookEventKind): HookAuthority | null {
|
|
64
|
+
return resolveExecutionContract(convention, kind)?.authority ?? null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function resolveCanonicalKind(externalEvent: string): HookEventKind | null {
|
|
68
|
+
return EXTERNAL_EVENT_ALIASES[externalEvent] ?? null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function unsupportedEventDiagnostic(
|
|
72
|
+
convention: HookSourceConvention,
|
|
73
|
+
externalEvent: string,
|
|
74
|
+
canonicalKind: HookEventKind | null,
|
|
75
|
+
source?: string,
|
|
76
|
+
): HookNormalizationDiagnostic {
|
|
77
|
+
return {
|
|
78
|
+
severity: HookDiagnosticSeverity.Error,
|
|
79
|
+
code: HookDiagnosticCode.UnsupportedConventionEvent,
|
|
80
|
+
message: canonicalKind
|
|
81
|
+
? `Convention "${convention}" does not support canonical event "${canonicalKind}".`
|
|
82
|
+
: `Convention "${convention}" received unrecognized external event "${externalEvent}".`,
|
|
83
|
+
convention,
|
|
84
|
+
externalEvent,
|
|
85
|
+
canonicalKind: canonicalKind ?? undefined,
|
|
86
|
+
source,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function invalid(
|
|
91
|
+
code: HookDiagnosticCode,
|
|
92
|
+
message: string,
|
|
93
|
+
convention: HookSourceConvention,
|
|
94
|
+
input: { source?: string; externalEvent?: string; canonicalKind?: HookEventKind },
|
|
95
|
+
): NormalizeHookResult {
|
|
96
|
+
return {
|
|
97
|
+
hook: null,
|
|
98
|
+
diagnostics: [{ severity: HookDiagnosticSeverity.Error, code, message, convention, ...input }],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function validateSource(convention: HookSourceConvention, source: string): NormalizeHookResult | null {
|
|
103
|
+
if (source.trim()) return null;
|
|
104
|
+
return invalid(HookDiagnosticCode.InvalidSource, "Hook source provenance must be non-empty.", convention, {
|
|
105
|
+
source,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Tool identifiers are logical, case-sensitive runtime names, not filesystem paths. */
|
|
110
|
+
export function normalizeToolMatcher(toolName: unknown): string | null {
|
|
111
|
+
if (typeof toolName !== "string") return null;
|
|
112
|
+
const normalized = toolName.trim();
|
|
113
|
+
if (!normalized || normalized === "." || normalized === "..") return null;
|
|
114
|
+
if (normalized !== toolName) return null;
|
|
115
|
+
if (normalized !== "*" && (normalized.includes("/") || normalized.includes("\\") || normalized.includes("\0"))) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return normalized;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function buildHook(
|
|
122
|
+
convention: HookSourceConvention,
|
|
123
|
+
kind: HookEventKind,
|
|
124
|
+
toolName: unknown,
|
|
125
|
+
source: string,
|
|
126
|
+
): NormalizeHookResult {
|
|
127
|
+
const sourceFailure = validateSource(convention, source);
|
|
128
|
+
if (sourceFailure) return sourceFailure;
|
|
129
|
+
const contract = resolveExecutionContract(convention, kind);
|
|
130
|
+
if (!contract) return { hook: null, diagnostics: [unsupportedEventDiagnostic(convention, kind, kind, source)] };
|
|
131
|
+
const matcher = normalizeToolMatcher(toolName);
|
|
132
|
+
if (!matcher) {
|
|
133
|
+
return invalid(
|
|
134
|
+
HookDiagnosticCode.InvalidToolMatcher,
|
|
135
|
+
`Invalid tool matcher "${toolName}"; matchers are case-sensitive logical names or "*", never paths.`,
|
|
136
|
+
convention,
|
|
137
|
+
{ source, canonicalKind: kind },
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
hook: {
|
|
142
|
+
kind,
|
|
143
|
+
authority: contract.authority,
|
|
144
|
+
convention,
|
|
145
|
+
runtimeEvent: contract.runtimeEvent,
|
|
146
|
+
toolName: matcher,
|
|
147
|
+
source,
|
|
148
|
+
contract,
|
|
149
|
+
},
|
|
150
|
+
diagnostics: [],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface DirectoryHookInput {
|
|
155
|
+
convention: HookSourceConvention;
|
|
156
|
+
phase: "pre" | "post";
|
|
157
|
+
toolName: string;
|
|
158
|
+
source: string;
|
|
159
|
+
/** Original discovered filename, when normalization participates in discovery. */
|
|
160
|
+
externalName?: string;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Normalize discovery metadata for native, Claude, or Codex hook modules. */
|
|
164
|
+
export function normalizeDirectoryHook(input: DirectoryHookInput): NormalizeHookResult {
|
|
165
|
+
if (
|
|
166
|
+
input.convention !== HookSourceConvention.NativeGjc &&
|
|
167
|
+
input.convention !== HookSourceConvention.ClaudeCode &&
|
|
168
|
+
input.convention !== HookSourceConvention.Codex
|
|
169
|
+
) {
|
|
170
|
+
const kind = input.phase === "pre" ? HookEventKind.PreToolUse : HookEventKind.PostToolUse;
|
|
171
|
+
return {
|
|
172
|
+
hook: null,
|
|
173
|
+
diagnostics: [unsupportedEventDiagnostic(input.convention, input.phase, kind, input.source)],
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (input.convention === HookSourceConvention.Codex && input.externalName) {
|
|
177
|
+
const expectedPrefix = `${input.phase}-`;
|
|
178
|
+
if (!input.externalName.startsWith(expectedPrefix)) {
|
|
179
|
+
return invalid(
|
|
180
|
+
HookDiagnosticCode.SemanticMismatch,
|
|
181
|
+
`Codex hook filename "${input.externalName}" must use the ${expectedPrefix}<tool>.ts|js convention.`,
|
|
182
|
+
input.convention,
|
|
183
|
+
{ source: input.source, externalEvent: input.externalName },
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return buildHook(
|
|
188
|
+
input.convention,
|
|
189
|
+
input.phase === "pre" ? HookEventKind.PreToolUse : HookEventKind.PostToolUse,
|
|
190
|
+
input.toolName,
|
|
191
|
+
input.source,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export interface ManagedJsonHookInput {
|
|
196
|
+
externalEvent: string;
|
|
197
|
+
command: string;
|
|
198
|
+
source: string;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Normalize the two GJC-managed Codex hooks.json entries. */
|
|
202
|
+
export function normalizeManagedJsonHook(input: ManagedJsonHookInput): NormalizeHookResult {
|
|
203
|
+
if (!input.command.trim()) {
|
|
204
|
+
return invalid(
|
|
205
|
+
HookDiagnosticCode.InvalidCommand,
|
|
206
|
+
"Managed hooks.json command must be non-empty.",
|
|
207
|
+
HookSourceConvention.CodexManagedJson,
|
|
208
|
+
{ source: input.source, externalEvent: input.externalEvent },
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
const kind =
|
|
212
|
+
input.externalEvent === "UserPromptSubmit"
|
|
213
|
+
? HookEventKind.UserPromptSubmit
|
|
214
|
+
: input.externalEvent === "Stop"
|
|
215
|
+
? HookEventKind.Stop
|
|
216
|
+
: null;
|
|
217
|
+
if (!kind) {
|
|
218
|
+
return {
|
|
219
|
+
hook: null,
|
|
220
|
+
diagnostics: [
|
|
221
|
+
unsupportedEventDiagnostic(HookSourceConvention.CodexManagedJson, input.externalEvent, null, input.source),
|
|
222
|
+
],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return buildHook(HookSourceConvention.CodexManagedJson, kind, "*", input.source);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export interface PluginHookInput {
|
|
229
|
+
declaredEvent: string;
|
|
230
|
+
target?: unknown;
|
|
231
|
+
phase?: unknown;
|
|
232
|
+
plugin: string;
|
|
233
|
+
source: string;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Normalize only manifest shapes that the constrained plugin compiler accepts. */
|
|
237
|
+
export function normalizePluginHook(input: PluginHookInput): NormalizeHookResult {
|
|
238
|
+
if (input.declaredEvent === "session_start" || input.declaredEvent === "session_shutdown") {
|
|
239
|
+
if (input.phase !== undefined || input.target !== undefined) {
|
|
240
|
+
return invalid(
|
|
241
|
+
HookDiagnosticCode.InvalidPluginPhase,
|
|
242
|
+
`Plugin "${input.plugin}" ${input.declaredEvent} hooks do not accept target or phase.`,
|
|
243
|
+
HookSourceConvention.GjcPlugin,
|
|
244
|
+
{ source: input.source, externalEvent: input.declaredEvent },
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
return buildHook(
|
|
248
|
+
HookSourceConvention.GjcPlugin,
|
|
249
|
+
input.declaredEvent === "session_start" ? HookEventKind.SessionStart : HookEventKind.SessionShutdown,
|
|
250
|
+
"*",
|
|
251
|
+
input.source,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
if (input.declaredEvent !== "tool_call" && input.declaredEvent !== "tool_result") {
|
|
255
|
+
return invalid(
|
|
256
|
+
HookDiagnosticCode.UnrecognizedPluginEvent,
|
|
257
|
+
`Plugin "${input.plugin}" declared unsupported event "${input.declaredEvent}"; aliases cannot expand plugin authority.`,
|
|
258
|
+
HookSourceConvention.GjcPlugin,
|
|
259
|
+
{ source: input.source, externalEvent: input.declaredEvent },
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (input.declaredEvent === "tool_call") {
|
|
264
|
+
if (!input.target || (input.phase !== "before" && input.phase !== "after")) {
|
|
265
|
+
return invalid(
|
|
266
|
+
HookDiagnosticCode.InvalidPluginPhase,
|
|
267
|
+
`Plugin "${input.plugin}" tool_call hooks require both target and before/after phase.`,
|
|
268
|
+
HookSourceConvention.GjcPlugin,
|
|
269
|
+
{ source: input.source, externalEvent: input.declaredEvent },
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
return buildHook(
|
|
273
|
+
HookSourceConvention.GjcPlugin,
|
|
274
|
+
input.phase === "before" ? HookEventKind.PreToolUse : HookEventKind.PostToolUse,
|
|
275
|
+
input.target,
|
|
276
|
+
input.source,
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (input.phase !== "after") {
|
|
281
|
+
return invalid(
|
|
282
|
+
HookDiagnosticCode.InvalidPluginPhase,
|
|
283
|
+
`Plugin "${input.plugin}" tool_result hooks require phase "after".`,
|
|
284
|
+
HookSourceConvention.GjcPlugin,
|
|
285
|
+
{ source: input.source, externalEvent: input.declaredEvent },
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
return buildHook(HookSourceConvention.GjcPlugin, HookEventKind.PostToolUse, input.target ?? "*", input.source);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export interface InProcessHookInput {
|
|
292
|
+
registeredEvent: string;
|
|
293
|
+
source: string;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function normalizeInProcessHook(input: InProcessHookInput): NormalizeHookResult {
|
|
297
|
+
if (input.registeredEvent === "turn_end") {
|
|
298
|
+
return invalid(
|
|
299
|
+
HookDiagnosticCode.SemanticMismatch,
|
|
300
|
+
"turn_end fires once per turn and is not equivalent to provider Stop/agent_end.",
|
|
301
|
+
HookSourceConvention.InProcess,
|
|
302
|
+
{ source: input.source, externalEvent: input.registeredEvent, canonicalKind: HookEventKind.Stop },
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
const kind =
|
|
306
|
+
input.registeredEvent === "before_agent_start"
|
|
307
|
+
? HookEventKind.UserPromptSubmit
|
|
308
|
+
: input.registeredEvent === "tool_call"
|
|
309
|
+
? HookEventKind.PreToolUse
|
|
310
|
+
: input.registeredEvent === "tool_result"
|
|
311
|
+
? HookEventKind.PostToolUse
|
|
312
|
+
: input.registeredEvent === "agent_end"
|
|
313
|
+
? HookEventKind.Stop
|
|
314
|
+
: input.registeredEvent === "session_start"
|
|
315
|
+
? HookEventKind.SessionStart
|
|
316
|
+
: input.registeredEvent === "session_shutdown"
|
|
317
|
+
? HookEventKind.SessionShutdown
|
|
318
|
+
: null;
|
|
319
|
+
if (!kind) {
|
|
320
|
+
return {
|
|
321
|
+
hook: null,
|
|
322
|
+
diagnostics: [
|
|
323
|
+
{
|
|
324
|
+
severity: HookDiagnosticSeverity.Warning,
|
|
325
|
+
code: HookDiagnosticCode.InProcessEventOutsideIr,
|
|
326
|
+
message: `In-process event "${input.registeredEvent}" remains on the broader HookAPI and is not normalized.`,
|
|
327
|
+
convention: HookSourceConvention.InProcess,
|
|
328
|
+
externalEvent: input.registeredEvent,
|
|
329
|
+
source: input.source,
|
|
330
|
+
},
|
|
331
|
+
],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
return buildHook(HookSourceConvention.InProcess, kind, "*", input.source);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export interface BatchNormalizeResult {
|
|
338
|
+
hooks: NormalizedHook[];
|
|
339
|
+
diagnostics: HookNormalizationDiagnostic[];
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/** Stable first-wins deduplication; rejected and duplicate entries remain visible as diagnostics. */
|
|
343
|
+
export function normalizeHookBatch(results: ReadonlyArray<NormalizeHookResult>): BatchNormalizeResult {
|
|
344
|
+
const hooks: NormalizedHook[] = [];
|
|
345
|
+
const diagnostics: HookNormalizationDiagnostic[] = [];
|
|
346
|
+
const seen = new Map<string, NormalizedHook>();
|
|
347
|
+
|
|
348
|
+
for (const result of results) {
|
|
349
|
+
diagnostics.push(...result.diagnostics);
|
|
350
|
+
if (!result.hook) continue;
|
|
351
|
+
const key = `${result.hook.convention}\0${result.hook.kind}\0${result.hook.toolName}\0${result.hook.source}`;
|
|
352
|
+
const prior = seen.get(key);
|
|
353
|
+
if (prior) {
|
|
354
|
+
diagnostics.push({
|
|
355
|
+
severity: HookDiagnosticSeverity.Warning,
|
|
356
|
+
code: HookDiagnosticCode.DuplicateHook,
|
|
357
|
+
message: `Duplicate hook descriptor ignored; first occurrence remains ordered first.`,
|
|
358
|
+
convention: result.hook.convention,
|
|
359
|
+
canonicalKind: result.hook.kind,
|
|
360
|
+
source: result.hook.source,
|
|
361
|
+
});
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
seen.set(key, result.hook);
|
|
365
|
+
hooks.push(result.hook);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return { hooks, diagnostics };
|
|
369
|
+
}
|