@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
package/src/task/executor.ts
CHANGED
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
type ServiceTier,
|
|
25
25
|
} from "@gajae-code/ai/core";
|
|
26
26
|
import { type JsonSchemaValidationIssue, validateJsonSchemaValue } from "@gajae-code/ai/utils/schema";
|
|
27
|
+
import * as canonicalSdk from "@gajae-code/coding-agent/sdk";
|
|
27
28
|
import { logger, prompt, untilAborted } from "@gajae-code/utils";
|
|
28
29
|
import { AsyncJobManager } from "../async";
|
|
29
30
|
import { ModelRegistry } from "../config/model-registry";
|
|
@@ -42,7 +43,7 @@ import subagentSystemPromptTemplate from "../prompts/system/subagent-system-prom
|
|
|
42
43
|
import subagentUserPromptTemplate from "../prompts/system/subagent-user-prompt.md" with { type: "text" };
|
|
43
44
|
import submitReminderTemplate from "../prompts/system/subagent-yield-reminder.md" with { type: "text" };
|
|
44
45
|
import { AgentRegistry } from "../registry/agent-registry";
|
|
45
|
-
import {
|
|
46
|
+
import { discoverAuthStorage } from "../sdk";
|
|
46
47
|
import type { AgentSession, AgentSessionEvent, ForkContextSeed } from "../session/agent-session";
|
|
47
48
|
import type { ArtifactManager } from "../session/artifacts";
|
|
48
49
|
import type { AuthStorage } from "../session/auth-storage";
|
|
@@ -269,6 +270,15 @@ export interface ExecutorOptions {
|
|
|
269
270
|
*/
|
|
270
271
|
parentArtifactManager?: ArtifactManager;
|
|
271
272
|
managedPersistence?: ManagedTaskPersistence;
|
|
273
|
+
/**
|
|
274
|
+
* The parent session's ENDPOINT-owned AsyncJobManager (resolved by the
|
|
275
|
+
* TaskTool via forEndpoint(sessionId) ?? instance()). Model metadata and
|
|
276
|
+
* live-handle state for THIS subagent are recorded in the SAME manager the
|
|
277
|
+
* task job runs in — with concurrent top-level sessions the process-global
|
|
278
|
+
* instance belongs to a different session and would surface this subagent
|
|
279
|
+
* under the wrong session's record (review thread P1).
|
|
280
|
+
*/
|
|
281
|
+
asyncJobManager?: AsyncJobManager;
|
|
272
282
|
parentHindsightSessionState?: HindsightSessionState;
|
|
273
283
|
/**
|
|
274
284
|
* Parent agent's OpenTelemetry configuration. When defined, the subagent's
|
|
@@ -1560,7 +1570,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1560
1570
|
// Record which model the subagent actually runs on (and any auth fallback,
|
|
1561
1571
|
// see #985) so the subagent panel can surface it to the user.
|
|
1562
1572
|
if (model) {
|
|
1563
|
-
AsyncJobManager.instance()?.updateSubagentModel?.(options.subagentId ?? id, {
|
|
1573
|
+
(options.asyncJobManager ?? AsyncJobManager.instance())?.updateSubagentModel?.(options.subagentId ?? id, {
|
|
1564
1574
|
requestedModel: modelSubstitutionWarning?.requested ?? resolvedModelString,
|
|
1565
1575
|
effectiveModel: resolvedModelString,
|
|
1566
1576
|
modelFellBack: authFallbackUsed === true,
|
|
@@ -1676,7 +1686,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1676
1686
|
}
|
|
1677
1687
|
|
|
1678
1688
|
const { session } = await awaitAbortable(
|
|
1679
|
-
createAgentSession({
|
|
1689
|
+
canonicalSdk.createAgentSession({
|
|
1680
1690
|
cwd: worktree ?? cwd,
|
|
1681
1691
|
authStorage,
|
|
1682
1692
|
modelRegistry,
|
|
@@ -1738,6 +1748,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1738
1748
|
},
|
|
1739
1749
|
parentHindsightSessionState: options.parentHindsightSessionState,
|
|
1740
1750
|
parentTaskPrefix: id,
|
|
1751
|
+
inheritedAsyncJobManager: options.asyncJobManager,
|
|
1741
1752
|
inheritedMcpManager: options.parentMcpManager,
|
|
1742
1753
|
agentId: id,
|
|
1743
1754
|
agentDisplayName: agent.name,
|
|
@@ -1761,7 +1772,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1761
1772
|
session.seedDefaultFallbackResolution(activeIndex ?? 0, skips);
|
|
1762
1773
|
}
|
|
1763
1774
|
const liveSubagentId = options.subagentId ?? id;
|
|
1764
|
-
const manager = AsyncJobManager.instance();
|
|
1775
|
+
const manager = options.asyncJobManager ?? AsyncJobManager.instance();
|
|
1765
1776
|
if (manager) {
|
|
1766
1777
|
manager.registerLiveHandle(liveSubagentId, {
|
|
1767
1778
|
requestPause: () => {
|
|
@@ -1964,12 +1975,20 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1964
1975
|
if (event.type === "model_fallback_switched") {
|
|
1965
1976
|
activeProviderModelString = event.to;
|
|
1966
1977
|
progress.fastMode = isFastForModel(session.model);
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1978
|
+
// Keep the fallback metadata on the SAME manager the initial
|
|
1979
|
+
// update used: another session may have become the
|
|
1980
|
+
// process-global instance, and writing to it would leave this
|
|
1981
|
+
// session's subagent metadata stale or overwrite an unrelated
|
|
1982
|
+
// same-ID record (review thread P2).
|
|
1983
|
+
(options.asyncJobManager ?? AsyncJobManager.instance())?.updateSubagentModel?.(
|
|
1984
|
+
options.subagentId ?? id,
|
|
1985
|
+
{
|
|
1986
|
+
requestedModel: modelSubstitutionWarning?.requested ?? resolvedModelString,
|
|
1987
|
+
effectiveModel: event.to,
|
|
1988
|
+
modelFellBack: true,
|
|
1989
|
+
fastMode: progress.fastMode,
|
|
1990
|
+
},
|
|
1991
|
+
);
|
|
1973
1992
|
scheduleProgress(true);
|
|
1974
1993
|
forwardSubagentEvent(event);
|
|
1975
1994
|
return;
|
|
@@ -2108,7 +2127,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
2108
2127
|
if (exitCode === 0) exitCode = 1;
|
|
2109
2128
|
}
|
|
2110
2129
|
sessionAbortController.abort();
|
|
2111
|
-
AsyncJobManager.instance()?.removeLiveHandle(options.subagentId ?? id);
|
|
2130
|
+
(options.asyncJobManager ?? AsyncJobManager.instance())?.removeLiveHandle(options.subagentId ?? id);
|
|
2112
2131
|
if (unsubscribe) {
|
|
2113
2132
|
try {
|
|
2114
2133
|
unsubscribe();
|
package/src/task/index.ts
CHANGED
|
@@ -18,9 +18,14 @@ import * as os from "node:os";
|
|
|
18
18
|
import path from "node:path";
|
|
19
19
|
import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "@gajae-code/agent-core";
|
|
20
20
|
import type { Model, Usage } from "@gajae-code/ai/core";
|
|
21
|
+
import {
|
|
22
|
+
AsyncJobManager,
|
|
23
|
+
OwnerSubagentShutdownError,
|
|
24
|
+
type ResumeRunner,
|
|
25
|
+
type SubagentRunOutcome,
|
|
26
|
+
} from "@gajae-code/coding-agent/async";
|
|
21
27
|
import { $pickenv, prompt, Snowflake } from "@gajae-code/utils";
|
|
22
28
|
import type { ToolSession } from "..";
|
|
23
|
-
import { AsyncJobManager, OwnerSubagentShutdownError, type ResumeRunner, type SubagentRunOutcome } from "../async";
|
|
24
29
|
import { resolveProfileBindings } from "../config/model-profiles";
|
|
25
30
|
import { resolveAgentModelPatterns } from "../config/model-resolver";
|
|
26
31
|
import type { Theme } from "../modes/theme/theme";
|
|
@@ -56,8 +61,10 @@ import {
|
|
|
56
61
|
} from "../gjc-runtime/repository-binding";
|
|
57
62
|
import { initializeLocalRoot, type LocalProtocolOptions, resolveLocalUrlToPath } from "../internal-urls";
|
|
58
63
|
import { ArtifactManager } from "../session/artifacts";
|
|
64
|
+
import { registerOwnedIfLineaged } from "../session/terminal-abort";
|
|
59
65
|
import { generateCommitMessage } from "../utils/commit-message-generator";
|
|
60
66
|
import * as git from "../utils/git";
|
|
67
|
+
import { loadBundledAgents } from "./agents";
|
|
61
68
|
import { discoverAgents, filterVisibleAgents, getAgent } from "./discovery";
|
|
62
69
|
import { createManagedTaskPersistence, renderSubagentUserPrompt, runSubprocess } from "./executor";
|
|
63
70
|
import { adviseForkContextMode } from "./fork-context-advisory";
|
|
@@ -66,7 +73,6 @@ import { getTaskIdValidationError, validateAllocatedTaskId } from "./id";
|
|
|
66
73
|
import { AgentOutputManager } from "./output-manager";
|
|
67
74
|
import { mapWithConcurrencyLimit, Semaphore } from "./parallel";
|
|
68
75
|
import { assertNoRawTaskFields, buildTaskReceipt, buildTaskRoiSummary, type TaskResultReceipt } from "./receipt";
|
|
69
|
-
|
|
70
76
|
import { renderResult, renderCall as renderTaskCall } from "./render";
|
|
71
77
|
import { reconcileSpawnRoi } from "./roi-reconciliation";
|
|
72
78
|
import { getTaskSimpleModeCapabilities, type TaskSimpleMode } from "./simple-mode";
|
|
@@ -796,6 +802,30 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
796
802
|
return new TaskTool(session, agents, publicRepositoryBinding(sessionRepositoryBinding));
|
|
797
803
|
}
|
|
798
804
|
|
|
805
|
+
/** Create catalog metadata from bundled agents only, without ambient filesystem discovery. */
|
|
806
|
+
static async createForToolCatalog(session: ToolSession): Promise<TaskTool> {
|
|
807
|
+
const sessionRepositoryBinding = await captureRepositoryBinding(session.cwd, { displayPath: session.cwd });
|
|
808
|
+
await assertExecutionRootMatchesRepositoryBinding(session.cwd, sessionRepositoryBinding);
|
|
809
|
+
return new TaskTool(session, loadBundledAgents(), publicRepositoryBinding(sessionRepositoryBinding));
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* The session's ENDPOINT-owned AsyncJobManager, falling back to the
|
|
814
|
+
* process-global instance. Concurrent top-level sessions each register
|
|
815
|
+
* their manager under their endpoint (sdk/session.ts), so a task job
|
|
816
|
+
* created by THIS session must be registered, resumed, and reported
|
|
817
|
+
* through THIS session's manager — otherwise a scope:"owned" abort
|
|
818
|
+
* consults the endpoint manager and cannot cancel or prove the task, and
|
|
819
|
+
* its completion is delivered by the wrong session's callback (review
|
|
820
|
+
* thread P1).
|
|
821
|
+
*/
|
|
822
|
+
#resolveOwnedJobManager(): AsyncJobManager | undefined {
|
|
823
|
+
const endpointId = this.session.getSessionId?.() ?? undefined;
|
|
824
|
+
return (
|
|
825
|
+
this.session.getAsyncJobManager?.() ?? AsyncJobManager.forEndpoint(endpointId) ?? AsyncJobManager.instance()
|
|
826
|
+
);
|
|
827
|
+
}
|
|
828
|
+
|
|
799
829
|
async execute(
|
|
800
830
|
_toolCallId: string,
|
|
801
831
|
rawParams: unknown,
|
|
@@ -886,7 +916,14 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
886
916
|
};
|
|
887
917
|
}
|
|
888
918
|
|
|
889
|
-
|
|
919
|
+
// The session's ENDPOINT-owned manager first: with concurrent top-level
|
|
920
|
+
// sessions the process-global instance may belong to a different
|
|
921
|
+
// session, and an endpoint-qualified owned registration recorded here
|
|
922
|
+
// must live in the SAME manager the job actually runs in — otherwise a
|
|
923
|
+
// scope:"owned" abort consults the endpoint manager, cannot cancel or
|
|
924
|
+
// prove the task, and returns uncertainty while the task continues
|
|
925
|
+
// (review thread P1).
|
|
926
|
+
const manager = this.#resolveOwnedJobManager();
|
|
890
927
|
if (!manager) {
|
|
891
928
|
return {
|
|
892
929
|
content: [{ type: "text", text: "Subagent background execution is unavailable in this session." }],
|
|
@@ -1015,7 +1052,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
1015
1052
|
};
|
|
1016
1053
|
let resumeRunner: ResumeRunner | undefined;
|
|
1017
1054
|
if (typeof manager.setResumeRunner === "function") {
|
|
1018
|
-
resumeRunner = (_subagentId, message, resumeDescriptor) => {
|
|
1055
|
+
resumeRunner = (_subagentId, message, resumeDescriptor, resumeToolCallId) => {
|
|
1019
1056
|
const descriptor = isTaskResumeDescriptor(resumeDescriptor?.data) ? resumeDescriptor.data : undefined;
|
|
1020
1057
|
if (!descriptor) return undefined;
|
|
1021
1058
|
const admission = (() => {
|
|
@@ -1066,7 +1103,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
1066
1103
|
repositoryBinding: descriptor.repositoryBinding,
|
|
1067
1104
|
duplicate_policy: descriptor.duplicatePolicy,
|
|
1068
1105
|
};
|
|
1069
|
-
|
|
1106
|
+
const resumeJobId = manager.register(
|
|
1070
1107
|
"task",
|
|
1071
1108
|
descriptor.task.id,
|
|
1072
1109
|
async ({ signal: runSignal }) => {
|
|
@@ -1128,6 +1165,21 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
1128
1165
|
},
|
|
1129
1166
|
},
|
|
1130
1167
|
);
|
|
1168
|
+
// Bind the resumed job to the CURRENT resume request's tool call
|
|
1169
|
+
// (the original launch id would attribute it to the OLD turn, so a
|
|
1170
|
+
// scope:"owned" abort of the resuming turn could miss it — review
|
|
1171
|
+
// thread P1).
|
|
1172
|
+
// The registration is ENDPOINT-qualified: concurrent sessions can
|
|
1173
|
+
// receive the same provider-local tool-call id, and an
|
|
1174
|
+
// endpoint-less resolve would take the FIRST matching binding —
|
|
1175
|
+
// registering B's task under A's endpoint/lineage (review P1).
|
|
1176
|
+
registerOwnedIfLineaged(
|
|
1177
|
+
manager,
|
|
1178
|
+
resumeToolCallId ?? descriptor.toolCallId,
|
|
1179
|
+
resumeJobId,
|
|
1180
|
+
this.session.getSessionId?.() ?? undefined,
|
|
1181
|
+
);
|
|
1182
|
+
return resumeJobId;
|
|
1131
1183
|
};
|
|
1132
1184
|
manager.setResumeRunner(resumeRunner);
|
|
1133
1185
|
}
|
|
@@ -1357,6 +1409,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
1357
1409
|
},
|
|
1358
1410
|
},
|
|
1359
1411
|
);
|
|
1412
|
+
registerOwnedIfLineaged(manager, _toolCallId, jobId, this.session.getSessionId?.() ?? undefined);
|
|
1360
1413
|
startedJobs.push({ jobId, taskId: taskItem.id });
|
|
1361
1414
|
if (typeof manager.registerResumeDescriptor === "function") {
|
|
1362
1415
|
manager.registerResumeDescriptor(
|
|
@@ -1960,6 +2013,10 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
1960
2013
|
},
|
|
1961
2014
|
) => {
|
|
1962
2015
|
const forkContextSeed = prebuiltForkContextSeeds?.get(task.id) ?? (await buildForkContextSeed(task));
|
|
2016
|
+
// The session's ENDPOINT-owned manager (resolved once per task so
|
|
2017
|
+
// model metadata and live handles land in the SAME manager the
|
|
2018
|
+
// job runs in — review thread P1).
|
|
2019
|
+
const manager = this.#resolveOwnedJobManager();
|
|
1963
2020
|
const forkContext = requestsForkContext(task)
|
|
1964
2021
|
? { mode: task.inheritContext, clonedTokens: forkContextSeed?.metadata.approximateTokens ?? 0 }
|
|
1965
2022
|
: undefined;
|
|
@@ -2000,6 +2057,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
2000
2057
|
runMode: overrides?.runMode ?? executionOverrides?.runMode,
|
|
2001
2058
|
resumeMessage: overrides?.resumeMessage ?? executionOverrides?.resumeMessage,
|
|
2002
2059
|
subagentId: task.id,
|
|
2060
|
+
asyncJobManager: manager,
|
|
2003
2061
|
taskDepth,
|
|
2004
2062
|
modelOverride,
|
|
2005
2063
|
parentActiveModelPattern,
|
|
@@ -2022,7 +2080,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
2022
2080
|
progressMap.set(index, {
|
|
2023
2081
|
...structuredClone(progress),
|
|
2024
2082
|
});
|
|
2025
|
-
|
|
2083
|
+
this.#resolveOwnedJobManager()?.recordSubagentProgress(task.id, progress);
|
|
2026
2084
|
emitProgress();
|
|
2027
2085
|
},
|
|
2028
2086
|
authStorage: this.session.authStorage,
|
|
@@ -2077,6 +2135,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
2077
2135
|
runMode: overrides?.runMode ?? executionOverrides?.runMode,
|
|
2078
2136
|
resumeMessage: overrides?.resumeMessage ?? executionOverrides?.resumeMessage,
|
|
2079
2137
|
subagentId: task.id,
|
|
2138
|
+
asyncJobManager: manager,
|
|
2080
2139
|
taskDepth,
|
|
2081
2140
|
modelOverride,
|
|
2082
2141
|
parentActiveModelPattern,
|
|
@@ -2099,7 +2158,7 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
|
|
|
2099
2158
|
progressMap.set(index, {
|
|
2100
2159
|
...structuredClone(progress),
|
|
2101
2160
|
});
|
|
2102
|
-
|
|
2161
|
+
this.#resolveOwnedJobManager()?.recordSubagentProgress(task.id, progress);
|
|
2103
2162
|
emitProgress();
|
|
2104
2163
|
},
|
|
2105
2164
|
authStorage: this.session.authStorage,
|
package/src/task/render.ts
CHANGED
|
@@ -987,12 +987,17 @@ export function renderResult(
|
|
|
987
987
|
|
|
988
988
|
const lines: string[] = [];
|
|
989
989
|
|
|
990
|
+
// Tool details can be restored from a persisted session or arrive through
|
|
991
|
+
// a runtime update, so the declared receipt array is not sufficient at
|
|
992
|
+
// this rendering boundary.
|
|
993
|
+
const resultsUnavailable = !Array.isArray(details.results);
|
|
994
|
+
const results = resultsUnavailable ? [] : details.results;
|
|
990
995
|
const hasProgress = Boolean(details.progress && details.progress.length > 0);
|
|
991
|
-
const shouldRenderProgress = hasProgress && (isPartial ||
|
|
992
|
-
const hasResults =
|
|
996
|
+
const shouldRenderProgress = hasProgress && (isPartial || results.length === 0);
|
|
997
|
+
const hasResults = results.length > 0;
|
|
993
998
|
if (hasResults) {
|
|
994
|
-
|
|
995
|
-
const isLast = !shouldRenderProgress && i ===
|
|
999
|
+
results.forEach((res, i) => {
|
|
1000
|
+
const isLast = !shouldRenderProgress && i === results.length - 1;
|
|
996
1001
|
lines.push(...renderAgentResult(res, isLast, expanded, theme));
|
|
997
1002
|
});
|
|
998
1003
|
}
|
|
@@ -1004,10 +1009,10 @@ export function renderResult(
|
|
|
1004
1009
|
});
|
|
1005
1010
|
}
|
|
1006
1011
|
if (hasResults && !shouldRenderProgress) {
|
|
1007
|
-
const abortedCount =
|
|
1008
|
-
const mergeFailedCount =
|
|
1009
|
-
const successCount =
|
|
1010
|
-
const failCount =
|
|
1012
|
+
const abortedCount = results.filter(r => r.status === "aborted").length;
|
|
1013
|
+
const mergeFailedCount = results.filter(r => r.status === "merge_failed").length;
|
|
1014
|
+
const successCount = results.filter(r => r.status === "completed").length;
|
|
1015
|
+
const failCount = results.length - successCount - mergeFailedCount - abortedCount;
|
|
1011
1016
|
let summary = `${theme.fg("dim", "Total:")} `;
|
|
1012
1017
|
if (abortedCount > 0) {
|
|
1013
1018
|
summary += theme.fg("error", `${abortedCount} aborted`);
|
|
@@ -1027,9 +1032,18 @@ export function renderResult(
|
|
|
1027
1032
|
summary += `${theme.sep.dot}${theme.fg("dim", formatDuration(details.totalDurationMs))}`;
|
|
1028
1033
|
lines.push(summary);
|
|
1029
1034
|
}
|
|
1035
|
+
if (resultsUnavailable && !isPartial) {
|
|
1036
|
+
lines.push(theme.fg("dim", "Task result details unavailable"));
|
|
1037
|
+
}
|
|
1030
1038
|
|
|
1031
1039
|
if (lines.length === 0) {
|
|
1032
|
-
const text =
|
|
1040
|
+
const text = resultsUnavailable
|
|
1041
|
+
? isPartial
|
|
1042
|
+
? "Task results pending"
|
|
1043
|
+
: "Task result details unavailable"
|
|
1044
|
+
: fallbackText.trim()
|
|
1045
|
+
? fallbackText
|
|
1046
|
+
: "No results";
|
|
1033
1047
|
const result = [theme.fg("dim", truncateToWidth(text, width))];
|
|
1034
1048
|
if (!hasDynamicRetry) cached = { key, lines: result };
|
|
1035
1049
|
return result;
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Decouples the `ask` tool (which reads the source via `AgentSession`) from the
|
|
5
5
|
* notifications extension (which registers one), without threading a new method
|
|
6
|
-
* through the extension/runner/controller wiring. A session
|
|
7
|
-
* source
|
|
6
|
+
* through the extension/runner/controller wiring. A session may have multiple
|
|
7
|
+
* sources. A "protocol" source always takes precedence over an "interactive"
|
|
8
|
+
* source regardless of registration order; within the same kind, the most
|
|
9
|
+
* recently registered source wins. Registering returns a disposer.
|
|
8
10
|
*/
|
|
9
11
|
|
|
10
12
|
/** Error code a remote ask source uses to signal that its own timeout fired. */
|
|
@@ -14,19 +16,31 @@ import { logger } from "@gajae-code/utils";
|
|
|
14
16
|
import type { WorkflowGateEmitter } from "../modes/shared/agent-wire/workflow-gate-broker";
|
|
15
17
|
import type { AskAnswerSource } from "./index";
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
export type AskAnswerSourceKind = "protocol" | "interactive";
|
|
20
|
+
|
|
21
|
+
interface RegisteredAskAnswerSource {
|
|
22
|
+
readonly source: AskAnswerSource;
|
|
23
|
+
readonly kind: AskAnswerSourceKind;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const sources = new Map<string, RegisteredAskAnswerSource[]>();
|
|
18
27
|
const workflowGateEmitters = new Map<string, WorkflowGateEmitter>();
|
|
19
28
|
const workflowGateListeners = new Map<string, Set<(emitter: WorkflowGateEmitter | undefined) => void>>();
|
|
20
29
|
|
|
21
30
|
/** Register `source` for `sessionId`. Returns a disposer that restores the prior source. */
|
|
22
|
-
export function registerAskAnswerSource(
|
|
31
|
+
export function registerAskAnswerSource(
|
|
32
|
+
sessionId: string,
|
|
33
|
+
source: AskAnswerSource,
|
|
34
|
+
kind: AskAnswerSourceKind = "interactive",
|
|
35
|
+
): () => void {
|
|
23
36
|
const stack = sources.get(sessionId) ?? [];
|
|
24
|
-
|
|
37
|
+
const entry: RegisteredAskAnswerSource = { source, kind };
|
|
38
|
+
stack.push(entry);
|
|
25
39
|
sources.set(sessionId, stack);
|
|
26
40
|
return () => {
|
|
27
41
|
const current = sources.get(sessionId);
|
|
28
42
|
if (!current) return;
|
|
29
|
-
const index = current.lastIndexOf(
|
|
43
|
+
const index = current.lastIndexOf(entry);
|
|
30
44
|
if (index >= 0) current.splice(index, 1);
|
|
31
45
|
if (current.length === 0) sources.delete(sessionId);
|
|
32
46
|
};
|
|
@@ -34,7 +48,9 @@ export function registerAskAnswerSource(sessionId: string, source: AskAnswerSour
|
|
|
34
48
|
|
|
35
49
|
/** The highest-priority answer source for `sessionId`, if one is registered. */
|
|
36
50
|
export function getAskAnswerSource(sessionId: string): AskAnswerSource | undefined {
|
|
37
|
-
|
|
51
|
+
const entries = sources.get(sessionId);
|
|
52
|
+
const protocolEntry = entries?.findLast(entry => entry.kind === "protocol");
|
|
53
|
+
return protocolEntry?.source ?? entries?.at(-1)?.source;
|
|
38
54
|
}
|
|
39
55
|
|
|
40
56
|
/** Publish a session's current workflow-gate emitter after mode initialization. */
|
package/src/tools/ask.ts
CHANGED
|
@@ -803,10 +803,14 @@ export class AskTool implements AgentTool<AskParametersSchema, AskToolDetails> {
|
|
|
803
803
|
_onUpdate?: AgentToolUpdateCallback<AskToolDetails>,
|
|
804
804
|
context?: AgentToolContext,
|
|
805
805
|
): Promise<AgentToolResult<AskToolDetails>> {
|
|
806
|
-
await assertUltragoalAskAllowed(
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
806
|
+
await assertUltragoalAskAllowed(
|
|
807
|
+
this.session.cwd,
|
|
808
|
+
{
|
|
809
|
+
activeSkillState: this.session.getActiveSkillState?.(),
|
|
810
|
+
sessionId: this.session.getSessionId?.() ?? null,
|
|
811
|
+
},
|
|
812
|
+
this.session.getSessionAgentDir?.() ?? this.session.settings.getAgentDir(),
|
|
813
|
+
);
|
|
810
814
|
assertDeepInterviewStructuredResponseWithinLimit(params);
|
|
811
815
|
let activeRemoteReceipt: AskRemoteReceipt | undefined;
|
|
812
816
|
let activeRemoteRequest: AskAnswerRequest | undefined;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisory detection of long blocking `sleep` in bash commands (#4465).
|
|
3
|
+
*
|
|
4
|
+
* When the agent reaches for a long silent `sleep N` instead of using
|
|
5
|
+
* `subagent await` or `job poll` to wait for background work, the session emits
|
|
6
|
+
* nothing for the entire duration and looks indistinguishable from a hang to
|
|
7
|
+
* the operator. This module detects that pattern and returns a bounded advisory
|
|
8
|
+
* notice — it never blocks the command, adds no fake progress, and respects the
|
|
9
|
+
* authority boundary: only the tool result/guidance surfaces the warning, not a
|
|
10
|
+
* runtime refusal. Legitimate sleeps (daemons, test servers, rate-limit pacing)
|
|
11
|
+
* are not blocked; the notice is purely advisory.
|
|
12
|
+
*
|
|
13
|
+
* Detection is intentionally conservative: a standalone `sleep` with an explicit
|
|
14
|
+
* numeric duration at or above the threshold, or a `sleep` chained with `&&` to
|
|
15
|
+
* a single trailing command (the common "sleep then check" pattern from #4465).
|
|
16
|
+
* Compound commands where `sleep` is incidental to real work are not flagged.
|
|
17
|
+
/**
|
|
18
|
+
* Minimum sleep duration (in seconds) that triggers the advisory notice.
|
|
19
|
+
*/
|
|
20
|
+
const LONG_SLEEP_THRESHOLD_SEC = 120;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Matches a standalone `sleep` command with an explicit numeric duration.
|
|
24
|
+
* Supports `sleep N`, `sleep Ns`, `sleep Nm`, `sleep Nh`, `sleep 1d`, and
|
|
25
|
+
* multiple arguments (`sleep 5 3` — sleeps 5s per POSIX, but the intent is the
|
|
26
|
+
* same). The number is parsed as seconds for the threshold check.
|
|
27
|
+
*
|
|
28
|
+
* Examples that trigger:
|
|
29
|
+
* `sleep 800`
|
|
30
|
+
* `sleep 800; git log --oneline -1`
|
|
31
|
+
* `sleep 300 && git log --oneline -1`
|
|
32
|
+
* `sleep 5m`
|
|
33
|
+
*
|
|
34
|
+
* Examples that do NOT trigger:
|
|
35
|
+
* `sleep 5`
|
|
36
|
+
* `sleep 10; echo done`
|
|
37
|
+
* `server --port 3000` (no sleep at all)
|
|
38
|
+
*/
|
|
39
|
+
const SLEEP_DURATION_RE = /(?:^|[\s;&|]+)sleep\s+([0-9]+(?:\.[0-9]+)?)([smhd]?)/;
|
|
40
|
+
|
|
41
|
+
/** Parse a sleep duration token into seconds. */
|
|
42
|
+
function parseSleepSeconds(rawNumber: string, unit: string): number {
|
|
43
|
+
const value = Number.parseFloat(rawNumber);
|
|
44
|
+
if (!Number.isFinite(value) || value <= 0) return 0;
|
|
45
|
+
const unitLower = unit.toLowerCase();
|
|
46
|
+
switch (unitLower) {
|
|
47
|
+
case "":
|
|
48
|
+
case "s":
|
|
49
|
+
return value;
|
|
50
|
+
case "m":
|
|
51
|
+
return value * 60;
|
|
52
|
+
case "h":
|
|
53
|
+
return value * 3600;
|
|
54
|
+
case "d":
|
|
55
|
+
return value * 86400;
|
|
56
|
+
default:
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Round seconds to the nearest whole minute for human-readable display. */
|
|
62
|
+
function roundToMinutes(seconds: number): number {
|
|
63
|
+
return Math.round(seconds / 60);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Format a duration in seconds as a short `Xm` / `Xs` string.
|
|
68
|
+
*
|
|
69
|
+
* `Xs` for anything under a minute (covers the zero case), otherwise `Xm`.
|
|
70
|
+
* Uses the same minute rounding as the notice body so the two stay consistent.
|
|
71
|
+
*/
|
|
72
|
+
function formatDuration(seconds: number): string {
|
|
73
|
+
return seconds < 60 ? `${Math.round(seconds)}s` : `${roundToMinutes(seconds)}m`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Detect a long blocking sleep in a bash command and return an advisory notice,
|
|
78
|
+
* or `undefined` if the command does not contain a qualifying sleep. The notice
|
|
79
|
+
* is appended to the bash result output; it never blocks execution.
|
|
80
|
+
*
|
|
81
|
+
* `timeoutSec` is the effective (already-clamped) execution timeout the command
|
|
82
|
+
* will run under, when known. The bash tool kills the command at this timeout
|
|
83
|
+
* whether the sleep fits inside it or not. Passing it lets the notice report
|
|
84
|
+
* the bounded effective silent wait the operator will actually observe, instead
|
|
85
|
+
* of the requested duration (which may be much longer and is never reached).
|
|
86
|
+
* When `timeoutSec` is `undefined` (no timeout known at the construction
|
|
87
|
+
* boundary), the notice reports only the requested duration and stays useful.
|
|
88
|
+
*/
|
|
89
|
+
export function longSleepAdvisory(command: string, timeoutSec?: number): string | undefined {
|
|
90
|
+
const match = command.match(SLEEP_DURATION_RE);
|
|
91
|
+
if (!match) return undefined;
|
|
92
|
+
const requestedSeconds = parseSleepSeconds(match[1]!, match[2]!);
|
|
93
|
+
if (requestedSeconds < LONG_SLEEP_THRESHOLD_SEC) return undefined;
|
|
94
|
+
|
|
95
|
+
const parts = [
|
|
96
|
+
`Note: this command requests a sleep of ~${formatDuration(requestedSeconds)}, during which the session produces no output and is indistinguishable from a hang (#4465).`,
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
// When the effective timeout is known and is shorter than the requested
|
|
100
|
+
// sleep, the command is killed at the timeout — the operator never sees the
|
|
101
|
+
// full requested duration. Surface the bounded wait so the notice matches
|
|
102
|
+
// observable behavior. (For PTY/async the same timeout applies: the tool
|
|
103
|
+
// kills the command at timeoutSec regardless of mode.)
|
|
104
|
+
if (timeoutSec !== undefined && timeoutSec < requestedSeconds) {
|
|
105
|
+
parts.push(
|
|
106
|
+
`The execution timeout will kill this command after ~${formatDuration(timeoutSec)}, so the effective silent wait is bounded by the timeout, not the requested sleep.`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
parts.push(
|
|
111
|
+
"Long blocking sleeps are not how to wait for subagents or background jobs.",
|
|
112
|
+
"Prefer `subagent await` (which emits periodic liveness) or `job poll` to wait observably.",
|
|
113
|
+
);
|
|
114
|
+
return parts.join(" ");
|
|
115
|
+
}
|