@gajae-code/coding-agent 0.13.3 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +184 -2
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +1 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +11 -25
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +40 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +9 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +40 -32
- package/src/main.ts +32 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +177 -72
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2857 -582
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +98 -16
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +27 -16
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Herdr agent lifecycle reporter.
|
|
3
|
+
*
|
|
4
|
+
* When gjc runs inside a Herdr pane (`HERDR_ENV=1`), report semantic agent
|
|
5
|
+
* state through Herdr's documented custom-integration API so the pane is
|
|
6
|
+
* recognized as the "gjc" agent in Herdr's sidebar and workspace rollups:
|
|
7
|
+
*
|
|
8
|
+
* - `idle` — waiting at the input prompt (also reported at startup)
|
|
9
|
+
* - `working` — agent turn in progress
|
|
10
|
+
* - `blocked` — waiting on a user decision (ask tool)
|
|
11
|
+
*
|
|
12
|
+
* The session title is reported through the same API as display-only pane
|
|
13
|
+
* metadata, so a pane shows what it is working on instead of a bare agent
|
|
14
|
+
* label. Herdr renders that title on the pane border and exposes it to the
|
|
15
|
+
* sidebar as the `pane` token.
|
|
16
|
+
*
|
|
17
|
+
* Reporting is strictly best-effort and never blocks or fails a turn. Outside
|
|
18
|
+
* a Herdr pane every entry point is a no-op. Herdr also clears the authority
|
|
19
|
+
* when the pane's foreground process exits, so a hard kill still recovers.
|
|
20
|
+
*
|
|
21
|
+
* Original implementation contributed by @ox8884 (#4318).
|
|
22
|
+
*/
|
|
23
|
+
import { logger } from "@gajae-code/utils";
|
|
24
|
+
|
|
25
|
+
const HERDR_ENV = "HERDR_ENV";
|
|
26
|
+
const HERDR_PANE_ID_ENV = "HERDR_PANE_ID";
|
|
27
|
+
const HERDR_BIN_PATH_ENV = "HERDR_BIN_PATH";
|
|
28
|
+
const HERDR_COMMAND = "herdr";
|
|
29
|
+
const AGENT_LABEL = "gjc";
|
|
30
|
+
const SOURCE = "custom:gjc";
|
|
31
|
+
/** A report is a fire-and-forget status ping; a hung herdr CLI must never accumulate. */
|
|
32
|
+
const HERDR_REPORT_TIMEOUT_MS = 1500;
|
|
33
|
+
/** Release runs on the shutdown path, so it is bounded even tighter. */
|
|
34
|
+
const HERDR_RELEASE_TIMEOUT_MS = 1000;
|
|
35
|
+
const CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f]/g;
|
|
36
|
+
/** Herdr truncates to the pane width anyway; this only bounds the argv. */
|
|
37
|
+
const MAX_PANE_TITLE_CHARS = 120;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Metadata reports carry their own per-source sequence in Herdr, independent of
|
|
41
|
+
* the lifecycle-state sequence, so title updates need a counter of their own.
|
|
42
|
+
* Module scope because the title is a property of the process, not of one
|
|
43
|
+
* reporter instance: `setSessionTerminalTitle` is called from controllers that
|
|
44
|
+
* never see the reporter.
|
|
45
|
+
*/
|
|
46
|
+
let metadataSeq = 0;
|
|
47
|
+
|
|
48
|
+
function nextMetadataSeq(): number {
|
|
49
|
+
metadataSeq += 1;
|
|
50
|
+
return metadataSeq;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type HerdrAgentState = "idle" | "working" | "blocked";
|
|
54
|
+
|
|
55
|
+
export interface HerdrPaneEnvironment {
|
|
56
|
+
paneId: string;
|
|
57
|
+
binPath: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface HerdrReportProcess {
|
|
61
|
+
exited: Promise<number>;
|
|
62
|
+
kill(): void;
|
|
63
|
+
unref(): void;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface HerdrReporterOptions {
|
|
67
|
+
env?: NodeJS.ProcessEnv;
|
|
68
|
+
which?: (command: string) => string | null;
|
|
69
|
+
spawn?: (
|
|
70
|
+
command: string[],
|
|
71
|
+
options: { env: NodeJS.ProcessEnv; stdin: "ignore"; stdout: "ignore"; stderr: "ignore" },
|
|
72
|
+
) => HerdrReportProcess;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Session event shape consumed by the reporter. Narrow on purpose: the state
|
|
76
|
+
* machine is driven only by lifecycle transitions, never by message content. */
|
|
77
|
+
export interface HerdrSessionEvent {
|
|
78
|
+
type: string;
|
|
79
|
+
toolName?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface HerdrReporter {
|
|
83
|
+
/** Report a new agent state. Deduplicated against the last reported state. */
|
|
84
|
+
report(state: HerdrAgentState): void;
|
|
85
|
+
/** Release this pane's lifecycle authority and stop listening. Idempotent. */
|
|
86
|
+
release(): void;
|
|
87
|
+
/** Current reported state, for tests and diagnostics. */
|
|
88
|
+
readonly state: HerdrAgentState | null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function defaultSpawn(
|
|
92
|
+
command: string[],
|
|
93
|
+
options: { env: NodeJS.ProcessEnv; stdin: "ignore"; stdout: "ignore"; stderr: "ignore" },
|
|
94
|
+
): HerdrReportProcess {
|
|
95
|
+
return Bun.spawn(command, options);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Resolve the pane environment. Returns null unless gjc is demonstrably inside
|
|
100
|
+
* a Herdr pane AND a herdr binary is resolvable.
|
|
101
|
+
*
|
|
102
|
+
* `HERDR_BIN_PATH` is honored first because Herdr sets it for its own panes;
|
|
103
|
+
* otherwise the binary is resolved from PATH. No home-directory guessing: an
|
|
104
|
+
* unverified path scavenged from an install layout is a command this process
|
|
105
|
+
* would execute, and PATH/`HERDR_BIN_PATH` are the trust boundary Herdr itself
|
|
106
|
+
* documents.
|
|
107
|
+
*/
|
|
108
|
+
export function resolveHerdrPaneEnvironment(options: HerdrReporterOptions = {}): HerdrPaneEnvironment | null {
|
|
109
|
+
const env = options.env ?? process.env;
|
|
110
|
+
if (env[HERDR_ENV]?.trim() !== "1") return null;
|
|
111
|
+
|
|
112
|
+
const paneId = env[HERDR_PANE_ID_ENV]?.trim();
|
|
113
|
+
// A pane id is forwarded verbatim as an argv element; reject anything that is
|
|
114
|
+
// not an opaque identifier rather than trusting the surrounding environment.
|
|
115
|
+
// The leading character must be alphanumeric so a pane id can never be parsed
|
|
116
|
+
// by the herdr CLI as an option.
|
|
117
|
+
if (!paneId || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(paneId)) return null;
|
|
118
|
+
|
|
119
|
+
const configured = env[HERDR_BIN_PATH_ENV]?.trim();
|
|
120
|
+
if (configured) return { paneId, binPath: configured };
|
|
121
|
+
|
|
122
|
+
const which = options.which ?? Bun.which;
|
|
123
|
+
try {
|
|
124
|
+
const resolved = which(HERDR_COMMAND);
|
|
125
|
+
return resolved ? { paneId, binPath: resolved } : null;
|
|
126
|
+
} catch (error) {
|
|
127
|
+
logger.debug("herdr binary lookup failed", { error: String(error) });
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Build the argv for a state report. Exported for tests. */
|
|
133
|
+
export function buildHerdrReportArgs(paneId: string, state: HerdrAgentState, seq: number): string[] {
|
|
134
|
+
return [
|
|
135
|
+
"pane",
|
|
136
|
+
"report-agent",
|
|
137
|
+
paneId,
|
|
138
|
+
"--source",
|
|
139
|
+
SOURCE,
|
|
140
|
+
"--agent",
|
|
141
|
+
AGENT_LABEL,
|
|
142
|
+
"--state",
|
|
143
|
+
state,
|
|
144
|
+
"--seq",
|
|
145
|
+
String(seq),
|
|
146
|
+
];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Build the argv for an authority release. Exported for tests. */
|
|
150
|
+
export function buildHerdrReleaseArgs(paneId: string, seq: number): string[] {
|
|
151
|
+
return ["pane", "release-agent", paneId, "--source", SOURCE, "--agent", AGENT_LABEL, "--seq", String(seq)];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Collapse a session name into a single-line pane title. Control characters are
|
|
156
|
+
* removed rather than escaped: the value reaches a terminal surface, and a
|
|
157
|
+
* model-generated session name must never be able to inject escapes.
|
|
158
|
+
*/
|
|
159
|
+
export function sanitizeHerdrPaneTitle(title: string | undefined): string | undefined {
|
|
160
|
+
if (!title) return undefined;
|
|
161
|
+
const sanitized = title.replace(CONTROL_CHARS, " ").replace(/\s+/g, " ").trim();
|
|
162
|
+
if (!sanitized) return undefined;
|
|
163
|
+
if (sanitized.length <= MAX_PANE_TITLE_CHARS) return sanitized;
|
|
164
|
+
// Truncate by UTF-16 code units (the Herdr argv is a string), then step back
|
|
165
|
+
// if the cut lands on the high surrogate of a pair so the title never ends
|
|
166
|
+
// with a lone surrogate.
|
|
167
|
+
let bound = MAX_PANE_TITLE_CHARS;
|
|
168
|
+
const last = sanitized.charCodeAt(bound - 1);
|
|
169
|
+
if (last >= 0xd800 && last <= 0xdbff) bound -= 1;
|
|
170
|
+
return sanitized.slice(0, bound).trimEnd();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Build the argv for a pane title report. Exported for tests. */
|
|
174
|
+
export function buildHerdrTitleArgs(paneId: string, title: string, seq: number): string[] {
|
|
175
|
+
return [
|
|
176
|
+
"pane",
|
|
177
|
+
"report-metadata",
|
|
178
|
+
paneId,
|
|
179
|
+
"--source",
|
|
180
|
+
SOURCE,
|
|
181
|
+
"--agent",
|
|
182
|
+
AGENT_LABEL,
|
|
183
|
+
"--title",
|
|
184
|
+
title,
|
|
185
|
+
"--seq",
|
|
186
|
+
String(seq),
|
|
187
|
+
];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Build the argv that retracts a previously reported pane title. Exported for tests. */
|
|
191
|
+
export function buildHerdrClearTitleArgs(paneId: string, seq: number): string[] {
|
|
192
|
+
return ["pane", "report-metadata", paneId, "--source", SOURCE, "--clear-title", "--seq", String(seq)];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Spawn a detached, timeout-bounded herdr CLI invocation. Every failure mode is
|
|
197
|
+
* swallowed: a status ping must never surface in a session.
|
|
198
|
+
*/
|
|
199
|
+
function runHerdrCommand(binPath: string, args: string[], timeoutMs: number, options: HerdrReporterOptions): void {
|
|
200
|
+
const env = options.env ?? process.env;
|
|
201
|
+
const spawn = options.spawn ?? defaultSpawn;
|
|
202
|
+
|
|
203
|
+
let proc: HerdrReportProcess;
|
|
204
|
+
try {
|
|
205
|
+
proc = spawn([binPath, ...args], {
|
|
206
|
+
env,
|
|
207
|
+
stdin: "ignore",
|
|
208
|
+
stdout: "ignore",
|
|
209
|
+
stderr: "ignore",
|
|
210
|
+
});
|
|
211
|
+
} catch (error) {
|
|
212
|
+
// Missing/unexecutable binary: reporting is best-effort, never fatal.
|
|
213
|
+
logger.debug("herdr report failed to start", { error: String(error) });
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
proc.unref();
|
|
217
|
+
const timer = setTimeout(() => {
|
|
218
|
+
try {
|
|
219
|
+
proc.kill();
|
|
220
|
+
} catch {}
|
|
221
|
+
}, timeoutMs);
|
|
222
|
+
timer.unref?.();
|
|
223
|
+
// Bun.spawn surfaces spawn failure through `exited` rejection, so this
|
|
224
|
+
// handler is what keeps an ENOENT from becoming an unhandled rejection.
|
|
225
|
+
void proc.exited
|
|
226
|
+
.then(exitCode => {
|
|
227
|
+
clearTimeout(timer);
|
|
228
|
+
if (exitCode !== 0) logger.debug("herdr report exited non-zero", { exitCode });
|
|
229
|
+
})
|
|
230
|
+
.catch(error => {
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
logger.debug("herdr report failed", { error: String(error) });
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Report the current session title for this pane. No-op outside a Herdr pane or
|
|
238
|
+
* when the session has no usable name, so a pane keeps the last real title
|
|
239
|
+
* instead of flickering to a placeholder during startup or a rename.
|
|
240
|
+
*/
|
|
241
|
+
export function syncHerdrPaneTitle(sessionName: string | undefined, options: HerdrReporterOptions = {}): void {
|
|
242
|
+
const title = sanitizeHerdrPaneTitle(sessionName);
|
|
243
|
+
if (!title) return;
|
|
244
|
+
|
|
245
|
+
const paneEnv = resolveHerdrPaneEnvironment(options);
|
|
246
|
+
if (!paneEnv) return;
|
|
247
|
+
|
|
248
|
+
runHerdrCommand(
|
|
249
|
+
paneEnv.binPath,
|
|
250
|
+
buildHerdrTitleArgs(paneEnv.paneId, title, nextMetadataSeq()),
|
|
251
|
+
HERDR_REPORT_TIMEOUT_MS,
|
|
252
|
+
options,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Create a reporter bound to a pane. `subscribe` supplies the session event
|
|
258
|
+
* stream and is parameterized so the state machine is testable without a live
|
|
259
|
+
* session.
|
|
260
|
+
*/
|
|
261
|
+
export function createHerdrReporter(
|
|
262
|
+
paneEnv: HerdrPaneEnvironment,
|
|
263
|
+
subscribe: (listener: (event: HerdrSessionEvent) => void) => () => void,
|
|
264
|
+
options: HerdrReporterOptions = {},
|
|
265
|
+
): HerdrReporter {
|
|
266
|
+
let seq = 0;
|
|
267
|
+
let currentState: HerdrAgentState | null = null;
|
|
268
|
+
let released = false;
|
|
269
|
+
/** Nesting depth of blocking ask calls; a nested ask must not unblock early. */
|
|
270
|
+
let askDepth = 0;
|
|
271
|
+
|
|
272
|
+
const run = (args: string[], timeoutMs: number): void => {
|
|
273
|
+
runHerdrCommand(paneEnv.binPath, args, timeoutMs, options);
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const report = (state: HerdrAgentState): void => {
|
|
277
|
+
if (released || state === currentState) return;
|
|
278
|
+
currentState = state;
|
|
279
|
+
seq += 1;
|
|
280
|
+
run(buildHerdrReportArgs(paneEnv.paneId, state, seq), HERDR_REPORT_TIMEOUT_MS);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
let unsubscribe: (() => void) | null = subscribe(event => {
|
|
284
|
+
switch (event.type) {
|
|
285
|
+
case "agent_start":
|
|
286
|
+
askDepth = 0;
|
|
287
|
+
report("working");
|
|
288
|
+
break;
|
|
289
|
+
case "agent_end":
|
|
290
|
+
askDepth = 0;
|
|
291
|
+
report("idle");
|
|
292
|
+
break;
|
|
293
|
+
case "tool_execution_start":
|
|
294
|
+
if (event.toolName === "ask") {
|
|
295
|
+
askDepth += 1;
|
|
296
|
+
report("blocked");
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
case "tool_execution_end":
|
|
300
|
+
if (event.toolName === "ask" && askDepth > 0) {
|
|
301
|
+
askDepth -= 1;
|
|
302
|
+
if (askDepth === 0) report("working");
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// A freshly started agent is idle at the prompt.
|
|
309
|
+
report("idle");
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
report,
|
|
313
|
+
release() {
|
|
314
|
+
if (released) return;
|
|
315
|
+
released = true;
|
|
316
|
+
unsubscribe?.();
|
|
317
|
+
unsubscribe = null;
|
|
318
|
+
seq += 1;
|
|
319
|
+
run(buildHerdrReleaseArgs(paneEnv.paneId, seq), HERDR_RELEASE_TIMEOUT_MS);
|
|
320
|
+
// The pane outlives gjc, so a session title left behind would label a
|
|
321
|
+
// plain shell with the work of a session that already ended.
|
|
322
|
+
run(buildHerdrClearTitleArgs(paneEnv.paneId, nextMetadataSeq()), HERDR_RELEASE_TIMEOUT_MS);
|
|
323
|
+
},
|
|
324
|
+
get state() {
|
|
325
|
+
return currentState;
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Install the Herdr reporter for a running session. No-op outside a Herdr pane.
|
|
332
|
+
* Returns the reporter so callers can release it deterministically, or null.
|
|
333
|
+
*/
|
|
334
|
+
export function installHerdrReporter(
|
|
335
|
+
subscribe: (listener: (event: HerdrSessionEvent) => void) => () => void,
|
|
336
|
+
options: HerdrReporterOptions = {},
|
|
337
|
+
): HerdrReporter | null {
|
|
338
|
+
const paneEnv = resolveHerdrPaneEnvironment(options);
|
|
339
|
+
if (!paneEnv) return null;
|
|
340
|
+
|
|
341
|
+
const reporter = createHerdrReporter(paneEnv, subscribe, options);
|
|
342
|
+
// `exit` handlers must be synchronous; release() only spawns and returns.
|
|
343
|
+
process.once("exit", reporter.release);
|
|
344
|
+
return reporter;
|
|
345
|
+
}
|
|
@@ -10,6 +10,7 @@ import { resolveRoleSelection } from "../config/model-resolver";
|
|
|
10
10
|
import type { Settings } from "../config/settings";
|
|
11
11
|
import titleSystemPrompt from "../prompts/system/title-system.md" with { type: "text" };
|
|
12
12
|
import { syncCmuxWorkspaceTitle } from "./cmux-workspace";
|
|
13
|
+
import { syncHerdrPaneTitle } from "./herdr-pane";
|
|
13
14
|
|
|
14
15
|
const TITLE_SYSTEM_PROMPT = prompt.render(titleSystemPrompt);
|
|
15
16
|
|
|
@@ -220,6 +221,7 @@ export function setTerminalTitle(title: string): void {
|
|
|
220
221
|
export function setSessionTerminalTitle(sessionName: string | undefined, cwd?: string): void {
|
|
221
222
|
setTerminalTitle(formatSessionTerminalTitle(sessionName, cwd));
|
|
222
223
|
void syncCmuxWorkspaceTitle(sessionName);
|
|
224
|
+
syncHerdrPaneTitle(sessionName);
|
|
223
225
|
}
|
|
224
226
|
|
|
225
227
|
/**
|
|
@@ -161,13 +161,15 @@ export {
|
|
|
161
161
|
handleYouTube,
|
|
162
162
|
};
|
|
163
163
|
|
|
164
|
-
export const specialHandlers: SpecialHandler[] = [
|
|
164
|
+
export const specialHandlers: SpecialHandler[] = [];
|
|
165
|
+
|
|
166
|
+
specialHandlers.push(
|
|
165
167
|
// Git hosting
|
|
166
168
|
handleGitHubGist,
|
|
167
169
|
handleGitHub,
|
|
168
170
|
handleGitLab,
|
|
169
171
|
// Video/Media
|
|
170
|
-
handleYouTube,
|
|
172
|
+
(url, timeout, signal) => handleYouTube(url, timeout, signal),
|
|
171
173
|
handleVimeo,
|
|
172
174
|
handleSpotify,
|
|
173
175
|
handleDiscogs,
|
|
@@ -203,7 +205,7 @@ export const specialHandlers: SpecialHandler[] = [
|
|
|
203
205
|
handleBrew,
|
|
204
206
|
handlePyPI,
|
|
205
207
|
handleCratesIo,
|
|
206
|
-
handleDockerHub,
|
|
208
|
+
(url, timeout, signal) => handleDockerHub(url, timeout, signal),
|
|
207
209
|
handleFdroid,
|
|
208
210
|
handleFlathub,
|
|
209
211
|
handleGoPkg,
|
|
@@ -249,4 +251,4 @@ export const specialHandlers: SpecialHandler[] = [
|
|
|
249
251
|
handleSpdx,
|
|
250
252
|
handleWikidata,
|
|
251
253
|
handleWikipedia,
|
|
252
|
-
|
|
254
|
+
);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { type OwnerIsolationProbe } from "../../gjc-runtime/tmux-owner-isolation";
|
|
2
|
-
import { type GjcTmuxSessionStatus } from "../../gjc-runtime/tmux-sessions";
|
|
3
|
-
import type { ResumeCandidate, SessionCreateFrame, SessionLifecycleRequest, SessionLifecycleResponse } from "./index";
|
|
4
|
-
import { type AuditEvent, type CreateEffectResult, type LedgerStore, type LifecycleOutcome, type OrchestratorDeps, type ResumeEffectResult } from "./lifecycle-orchestrator";
|
|
5
|
-
/** Minimal view of the native control server this runtime depends on. */
|
|
6
|
-
export interface ControlServerLike {
|
|
7
|
-
onLifecycleRequest(cb: (err: Error | null, req: {
|
|
8
|
-
kind: string;
|
|
9
|
-
requestId: string;
|
|
10
|
-
payloadJson: string;
|
|
11
|
-
}) => void): void;
|
|
12
|
-
respond(responseJson: string): void;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* A startable control server (the native NotificationControlServer, or a fake in
|
|
16
|
-
* tests). Extends {@link ControlServerLike} with the start/stop lifecycle the
|
|
17
|
-
* daemon owns.
|
|
18
|
-
*/
|
|
19
|
-
export interface LifecycleControlServer extends ControlServerLike {
|
|
20
|
-
start(): Promise<unknown>;
|
|
21
|
-
stop(): void;
|
|
22
|
-
}
|
|
23
|
-
/** Factory the daemon uses to construct a control server bound to its ownership. */
|
|
24
|
-
export type LifecycleControlServerFactory = (input: {
|
|
25
|
-
token: string;
|
|
26
|
-
ownerId: string;
|
|
27
|
-
agentDir: string;
|
|
28
|
-
}) => LifecycleControlServer;
|
|
29
|
-
export declare function fileLedgerStore(idempotencyFile: string): LedgerStore;
|
|
30
|
-
/** Append-only JSONL audit sink (0600). Never receives tokens or raw prompts. */
|
|
31
|
-
export declare function fileAudit(auditPath: string): (e: AuditEvent) => void;
|
|
32
|
-
/** Simple per-chat sliding-window create rate limiter. */
|
|
33
|
-
export declare function createRateLimiter(maxPerWindow: number, windowMs: number): (chatId: string, nowMs: number) => boolean;
|
|
34
|
-
/** Build the `gjc` argv for a create target (existing path / worktree / dir).
|
|
35
|
-
*
|
|
36
|
-
* The launched session id is carried via `GJC_SESSION_ID` in the child env (see
|
|
37
|
-
* {@link daemonSpawnCreate}); the root `gjc` launcher has no `--session-id`
|
|
38
|
-
* flag, so it must never appear in argv. Only flags the launch parser actually
|
|
39
|
-
* supports are emitted (`--worktree <branch>` for worktree targets,
|
|
40
|
-
* `--mpreset <profile>` for model presets). */
|
|
41
|
-
export declare function buildCreateArgv(frame: SessionCreateFrame, _ids: {
|
|
42
|
-
intendedSessionId: string;
|
|
43
|
-
startupPromptRef?: string;
|
|
44
|
-
}): {
|
|
45
|
-
cwd: string;
|
|
46
|
-
args: string[];
|
|
47
|
-
};
|
|
48
|
-
/** Real daemon-safe tmux launcher: canonical owner-isolation plan + GJC tags. */
|
|
49
|
-
export declare function daemonSpawnCreate(env?: NodeJS.ProcessEnv, opts?: {
|
|
50
|
-
ownerIsolationProbe?: OwnerIsolationProbe;
|
|
51
|
-
platform?: NodeJS.Platform;
|
|
52
|
-
processIncarnation?: (pid: number) => string | undefined;
|
|
53
|
-
}): (frame: SessionCreateFrame, ids: {
|
|
54
|
-
lifecycleRequestId: string;
|
|
55
|
-
intendedSessionId: string;
|
|
56
|
-
startupPromptRef?: string;
|
|
57
|
-
}) => Promise<CreateEffectResult>;
|
|
58
|
-
/** Real force-close effect (GJC-managed only, id-matched). */
|
|
59
|
-
export declare function daemonCloseSession(env?: NodeJS.ProcessEnv, deps?: {
|
|
60
|
-
forceClose?: (name: string, env: NodeJS.ProcessEnv, expectedSessionId?: string, sessionStateFile?: string) => Promise<void>;
|
|
61
|
-
findSession?: (name: string, env: NodeJS.ProcessEnv) => GjcTmuxSessionStatus | undefined;
|
|
62
|
-
}): (target: {
|
|
63
|
-
sessionId: string;
|
|
64
|
-
tmuxSession?: string;
|
|
65
|
-
sessionStateFile?: string;
|
|
66
|
-
}) => Promise<{
|
|
67
|
-
processGone: boolean;
|
|
68
|
-
}>;
|
|
69
|
-
/** Real resume effect: reattach if a live GJC session matches; else resolve the
|
|
70
|
-
* prefix against saved history and fail closed (`ambiguous`/`notFound`) before
|
|
71
|
-
* cold-restarting exactly one resolved session via the daemon-safe launcher. */
|
|
72
|
-
export declare function daemonResumeSession(env?: NodeJS.ProcessEnv, opts?: {
|
|
73
|
-
agentDir?: string;
|
|
74
|
-
/** Explicit managed root for isolated tests. */
|
|
75
|
-
sessionsRoot?: string;
|
|
76
|
-
listSessions?: (env: NodeJS.ProcessEnv) => GjcTmuxSessionStatus[];
|
|
77
|
-
ownerIsolationProbe?: OwnerIsolationProbe;
|
|
78
|
-
platform?: NodeJS.Platform;
|
|
79
|
-
processIncarnation?: (pid: number) => string | undefined;
|
|
80
|
-
}): (target: {
|
|
81
|
-
sessionIdOrPrefix: string;
|
|
82
|
-
path?: string;
|
|
83
|
-
}) => Promise<ResumeEffectResult | {
|
|
84
|
-
ambiguous: ResumeCandidate[];
|
|
85
|
-
} | {
|
|
86
|
-
notFound: true;
|
|
87
|
-
}>;
|
|
88
|
-
/** Translate an orchestrator outcome into a wire response frame. */
|
|
89
|
-
export declare function outcomeToResponse(frame: SessionLifecycleRequest, outcome: LifecycleOutcome): SessionLifecycleResponse;
|
|
90
|
-
/**
|
|
91
|
-
* Wire a control server's lifecycle requests through the orchestrator.
|
|
92
|
-
*
|
|
93
|
-
* Handlers run on a single serial queue (a promise chain): the daemon owns the
|
|
94
|
-
* one control endpoint, so serializing here makes each request's ledger
|
|
95
|
-
* read -> classify -> write atomic with respect to every other request. Two
|
|
96
|
-
* identical updates that arrive nearly simultaneously can no longer both
|
|
97
|
-
* classify as `new` and both spawn — the second sees the first's persisted
|
|
98
|
-
* `in_progress`/`success` entry and re-acks instead.
|
|
99
|
-
*/
|
|
100
|
-
export declare function attachLifecycleControl(server: ControlServerLike, deps: OrchestratorDeps): void;
|
|
101
|
-
/** Assemble real orchestrator deps for the daemon (ledger/audit under agentDir). */
|
|
102
|
-
export declare function buildOrchestratorDeps(input: {
|
|
103
|
-
pairedChatId: string;
|
|
104
|
-
agentNotificationsDir: string;
|
|
105
|
-
/** Required in-memory, 32-byte audit-v2 redaction key. */
|
|
106
|
-
auditRedactionKey: Uint8Array;
|
|
107
|
-
/** Root of saved session histories (`<agentDir>/sessions`), for resume resolution. */
|
|
108
|
-
sessionsRoot?: string;
|
|
109
|
-
/** Agent directory used for readonly managed-session resume resolution. */
|
|
110
|
-
agentDir?: string;
|
|
111
|
-
env?: NodeJS.ProcessEnv;
|
|
112
|
-
}): OrchestratorDeps;
|
|
113
|
-
/**
|
|
114
|
-
* Default production factory: a real native NotificationControlServer bound to
|
|
115
|
-
* the daemon's control token, owner id, and agent dir.
|
|
116
|
-
*/
|
|
117
|
-
export declare const createNativeControlServer: LifecycleControlServerFactory;
|