@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
|
@@ -1247,6 +1247,14 @@ export interface NotificationRecoveryReport {
|
|
|
1247
1247
|
endpointsRetainedPlaceholders?: string[];
|
|
1248
1248
|
/** Cleanup entries retained with unverified or mismatching identity. */
|
|
1249
1249
|
endpointsRetainedUnknown?: string[];
|
|
1250
|
+
/** Stale quarantine/staging debris removed from the endpoint and daemon dirs. */
|
|
1251
|
+
debrisRemoved?: string[];
|
|
1252
|
+
/** Debris candidates retained by policy (young, live writer). */
|
|
1253
|
+
debrisKept?: number;
|
|
1254
|
+
/** Debris removals attempted without conclusive success (identity/unlink). */
|
|
1255
|
+
debrisFailures?: number;
|
|
1256
|
+
/** At least one debris directory listing failed; the sweep was not exhaustive. */
|
|
1257
|
+
debrisScanFailed?: boolean;
|
|
1250
1258
|
daemon: {
|
|
1251
1259
|
action: DaemonRecoveryAction;
|
|
1252
1260
|
detail: string;
|
|
@@ -1478,6 +1486,168 @@ async function detachStaleTransitionMarker(input: {
|
|
|
1478
1486
|
return await detachTransitionMarker(input.fs, input.path, snapshot);
|
|
1479
1487
|
}
|
|
1480
1488
|
|
|
1489
|
+
// --- stale debris sweep ---------------------------------------------------
|
|
1490
|
+
|
|
1491
|
+
/**
|
|
1492
|
+
* Minimum age before age-based debris removal. Quarantine artifacts are inert
|
|
1493
|
+
* the moment they are detached, but the age bound keeps the sweep clear of any
|
|
1494
|
+
* recovery pass still holding a `detachedPath` reference in its report.
|
|
1495
|
+
*/
|
|
1496
|
+
export const NOTIFICATION_DEBRIS_MIN_AGE_MS = 60 * 60 * 1_000;
|
|
1497
|
+
|
|
1498
|
+
const UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
1499
|
+
/** Quarantine target of a detached daemon transition marker (telegram-daemon exact unlink). */
|
|
1500
|
+
const DEBRIS_TRANSITION_QUARANTINE = new RegExp(`^transition-${UUID_PATTERN}$`);
|
|
1501
|
+
/** Quarantine target of a detached notification endpoint file. */
|
|
1502
|
+
const DEBRIS_ENDPOINT_QUARANTINE = new RegExp(`^\\.gjc-delete-notification-endpoint-${UUID_PATTERN}\\.json$`);
|
|
1503
|
+
/** Native exact-unlink exchange placeholder left behind by a failed verified cleanup. */
|
|
1504
|
+
const DEBRIS_UNLINK_PLACEHOLDER = /^\.gjc-exact-unlink-placeholder-/;
|
|
1505
|
+
/** Atomic-write staging file: `<canonical>.<pid>.<epochMs>.<random>.tmp`. */
|
|
1506
|
+
const DEBRIS_STAGING_TMP = /\.([0-9]{1,10})\.[0-9]{1,16}\.[a-z0-9]{1,24}\.tmp$/;
|
|
1507
|
+
|
|
1508
|
+
export interface NotificationDebrisSweepReport {
|
|
1509
|
+
/** Basenames removed from the swept directory. */
|
|
1510
|
+
removed: string[];
|
|
1511
|
+
/** Debris candidates retained (young, live writer, or identity/unlink refusal). */
|
|
1512
|
+
kept: number;
|
|
1513
|
+
/**
|
|
1514
|
+
* Candidates whose removal was ATTEMPTED and did not conclusively succeed
|
|
1515
|
+
* (identity mismatch, unreadable candidate, unlink error). Distinct from
|
|
1516
|
+
* `kept`-by-policy so a caller can see that a sweep was not fully effective.
|
|
1517
|
+
*/
|
|
1518
|
+
failures: number;
|
|
1519
|
+
/** The directory listing itself failed; nothing could be inspected. */
|
|
1520
|
+
scanFailed?: boolean;
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
/**
|
|
1524
|
+
* Remove inert filesystem debris from a notification/state directory:
|
|
1525
|
+
* quarantine targets of already-detached markers and endpoints, exact-unlink
|
|
1526
|
+
* exchange placeholders, and leaked atomic-write staging files.
|
|
1527
|
+
*
|
|
1528
|
+
* Removal requires positive staleness proof — a dead recorded writer pid for
|
|
1529
|
+
* staging files, or an mtime older than {@link NOTIFICATION_DEBRIS_MIN_AGE_MS}
|
|
1530
|
+
* for everything else. Canonical files can never match the debris patterns, and
|
|
1531
|
+
* a young staging file with a live writer is kept.
|
|
1532
|
+
*
|
|
1533
|
+
* Age, terminal-scrub proof, and the delete identity all come from ONE
|
|
1534
|
+
* no-follow snapshot of the candidate. Judging age from a separate `stat` would
|
|
1535
|
+
* prove one pathname stale and then bind the delete to whatever occupied that
|
|
1536
|
+
* pathname afterwards, so a live successor could be removed on a predecessor's
|
|
1537
|
+
* staleness. A candidate replaced after the snapshot fails the identity match
|
|
1538
|
+
* and is retained; a symlinked, non-regular, or unreadable candidate is refused
|
|
1539
|
+
* outright. Every inconclusive attempt is counted in `failures` rather than
|
|
1540
|
+
* silently folded into `kept`.
|
|
1541
|
+
*/
|
|
1542
|
+
export async function sweepNotificationDebris(input: {
|
|
1543
|
+
dir: string;
|
|
1544
|
+
deps?: NotificationServiceDeps;
|
|
1545
|
+
minAgeMs?: number;
|
|
1546
|
+
}): Promise<NotificationDebrisSweepReport> {
|
|
1547
|
+
const deps = input.deps ?? {};
|
|
1548
|
+
const fs = deps.fs ?? nodeServiceFs;
|
|
1549
|
+
const pidAlive = deps.pidAlive ?? defaultPidAlive;
|
|
1550
|
+
const now = deps.now ?? Date.now;
|
|
1551
|
+
const minAgeMs = input.minAgeMs ?? NOTIFICATION_DEBRIS_MIN_AGE_MS;
|
|
1552
|
+
const removed: string[] = [];
|
|
1553
|
+
let kept = 0;
|
|
1554
|
+
let failures = 0;
|
|
1555
|
+
let names: string[] = [];
|
|
1556
|
+
try {
|
|
1557
|
+
names = await fs.readdir(input.dir);
|
|
1558
|
+
} catch {
|
|
1559
|
+
return { removed, kept, failures, scanFailed: true };
|
|
1560
|
+
}
|
|
1561
|
+
for (const name of names) {
|
|
1562
|
+
const staging = DEBRIS_STAGING_TMP.exec(name);
|
|
1563
|
+
const placeholder = DEBRIS_UNLINK_PLACEHOLDER.test(name);
|
|
1564
|
+
const quarantineLike =
|
|
1565
|
+
DEBRIS_TRANSITION_QUARANTINE.test(name) || DEBRIS_ENDPOINT_QUARANTINE.test(name) || placeholder;
|
|
1566
|
+
if (!staging && !quarantineLike) continue;
|
|
1567
|
+
const file = path.join(input.dir, name);
|
|
1568
|
+
// ONE no-follow snapshot decides everything: age, terminal-scrub proof, and
|
|
1569
|
+
// the identity the delete is bound to. Reading mtime separately (e.g. via
|
|
1570
|
+
// `stat`) would judge the age of one pathname and then delete whatever
|
|
1571
|
+
// occupied it afterwards — the exact-unlink identity would faithfully bind
|
|
1572
|
+
// to a successor that was never proved stale.
|
|
1573
|
+
const candidate = await fs.readEndpointFile(file).catch(() => undefined);
|
|
1574
|
+
if (!candidate) {
|
|
1575
|
+
// Unreadable, symlinked, or non-regular: never a pathname unlink, and
|
|
1576
|
+
// an operational failure rather than silent policy retention.
|
|
1577
|
+
failures += 1;
|
|
1578
|
+
continue;
|
|
1579
|
+
}
|
|
1580
|
+
const mtimeMs = Number(candidate.identity.mtimeNs / 1_000_000n);
|
|
1581
|
+
const olderThanMinAge = Number.isFinite(mtimeMs) && now() - mtimeMs > minAgeMs;
|
|
1582
|
+
const deadWriter =
|
|
1583
|
+
staging !== null &&
|
|
1584
|
+
(() => {
|
|
1585
|
+
const writerPid = Number.parseInt(staging[1] ?? "", 10);
|
|
1586
|
+
return Number.isSafeInteger(writerPid) && writerPid > 0 && !pidAlive(writerPid);
|
|
1587
|
+
})();
|
|
1588
|
+
if (!deadWriter && !olderThanMinAge) {
|
|
1589
|
+
kept += 1;
|
|
1590
|
+
continue;
|
|
1591
|
+
}
|
|
1592
|
+
if (placeholder && candidate.bytes.length > 0) {
|
|
1593
|
+
// A native exchange placeholder is inert only once it is the terminal
|
|
1594
|
+
// scrubbed remnant. A NONEMPTY placeholder may still carry the retained
|
|
1595
|
+
// cleanup evidence for an endpoint whose verified removal failed.
|
|
1596
|
+
kept += 1;
|
|
1597
|
+
continue;
|
|
1598
|
+
}
|
|
1599
|
+
try {
|
|
1600
|
+
const result = await fs.exactUnlink(file, candidate.identity);
|
|
1601
|
+
if (result.ok) {
|
|
1602
|
+
removed.push(name);
|
|
1603
|
+
continue;
|
|
1604
|
+
}
|
|
1605
|
+
// A typed retained cleanup with the canonical path proven absent is a
|
|
1606
|
+
// completed removal; anything else keeps the file.
|
|
1607
|
+
const retainedRemoved =
|
|
1608
|
+
result.code === "cleanup_pending" &&
|
|
1609
|
+
typeof result.detachedPath === "string" &&
|
|
1610
|
+
result.detachedPath.length > 0 &&
|
|
1611
|
+
(await fs.readFile(file, "utf8").catch(() => undefined)) === undefined;
|
|
1612
|
+
if (retainedRemoved) removed.push(name);
|
|
1613
|
+
else failures += 1;
|
|
1614
|
+
} catch {
|
|
1615
|
+
failures += 1;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
return { removed, kept, failures };
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
/**
|
|
1622
|
+
* Operator-authorized detach of a provenance-less blocking transition marker.
|
|
1623
|
+
*
|
|
1624
|
+
* The normal reclaim path (`detachStaleTransitionMarker`) refuses malformed and
|
|
1625
|
+
* empty markers because they carry no owner proof. `--force-daemon-lock` is the
|
|
1626
|
+
* documented operator confirmation that no legacy writer remains, so under that
|
|
1627
|
+
* flag a marker that is unparseable AND older than the transition grace window
|
|
1628
|
+
* may be detached through the identity-bound primitive. Valid markers are never
|
|
1629
|
+
* force-detached here — dead-owner reclaim already covers them, and a live
|
|
1630
|
+
* owner's marker must stay untouchable even under force.
|
|
1631
|
+
*/
|
|
1632
|
+
async function forceDetachBlockedTransitionMarker(input: {
|
|
1633
|
+
fs: TransitionMarkerFs;
|
|
1634
|
+
path: string;
|
|
1635
|
+
now: number;
|
|
1636
|
+
}): Promise<boolean> {
|
|
1637
|
+
const snapshot = await readTransitionMarker(input.fs, input.path);
|
|
1638
|
+
if (!snapshot) return false;
|
|
1639
|
+
try {
|
|
1640
|
+
if (isDaemonTransitionLock(JSON.parse(snapshot.raw))) return false;
|
|
1641
|
+
} catch {
|
|
1642
|
+
// Unparseable marker: exactly the class force is for.
|
|
1643
|
+
}
|
|
1644
|
+
if (!input.fs.stat) return false;
|
|
1645
|
+
const st = await input.fs.stat(input.path).catch(() => undefined);
|
|
1646
|
+
if (!st || !Number.isFinite(st.mtimeMs)) return false;
|
|
1647
|
+
if (input.now - st.mtimeMs <= TRANSITION_MARKER_GRACE_MS) return false;
|
|
1648
|
+
return await detachTransitionMarker(input.fs, input.path, snapshot);
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1481
1651
|
/**
|
|
1482
1652
|
* Owner-bound removal of a dead daemon's lock. Closes the classic
|
|
1483
1653
|
* check-then-unlink TOCTOU: a naive `unlink(lock)` after observing a dead owner
|
|
@@ -1494,6 +1664,7 @@ async function removeDeadOwnerLock(
|
|
|
1494
1664
|
expected: NormalizedDaemonState,
|
|
1495
1665
|
now: () => number,
|
|
1496
1666
|
pidIncarnation: (pid: number) => string | undefined,
|
|
1667
|
+
forceDaemonLock = false,
|
|
1497
1668
|
): Promise<"cleared" | "contended" | "superseded" | "now-alive" | "unlink-failed"> {
|
|
1498
1669
|
let transition = await acquireDaemonTransitionLock({
|
|
1499
1670
|
fs,
|
|
@@ -1510,6 +1681,7 @@ async function removeDeadOwnerLock(
|
|
|
1510
1681
|
pidAlive,
|
|
1511
1682
|
pidIncarnation,
|
|
1512
1683
|
});
|
|
1684
|
+
if (forceDaemonLock) await forceDetachBlockedTransitionMarker({ fs, path: paths.steal, now: now() });
|
|
1513
1685
|
transition = await acquireDaemonTransitionLock({
|
|
1514
1686
|
fs,
|
|
1515
1687
|
path: paths.steal,
|
|
@@ -1656,6 +1828,7 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
|
|
|
1656
1828
|
state,
|
|
1657
1829
|
now,
|
|
1658
1830
|
deps.pidIncarnation ?? defaultTransitionPidIncarnation,
|
|
1831
|
+
opts.forceDaemonLock === true,
|
|
1659
1832
|
);
|
|
1660
1833
|
const action: DaemonRecoveryAction =
|
|
1661
1834
|
outcome === "cleared"
|
|
@@ -1713,6 +1886,21 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
|
|
|
1713
1886
|
};
|
|
1714
1887
|
}
|
|
1715
1888
|
|
|
1889
|
+
// Stale debris (quarantine targets, exchange placeholders, leaked staging
|
|
1890
|
+
// tmp files) accumulates in both the endpoint dir and the daemon dir and
|
|
1891
|
+
// slows every later scan; sweep it with positive staleness proof only.
|
|
1892
|
+
const debrisRemoved: string[] = [];
|
|
1893
|
+
let debrisKept = 0;
|
|
1894
|
+
let debrisFailures = 0;
|
|
1895
|
+
let debrisScanFailed = false;
|
|
1896
|
+
for (const sweepDir of new Set([dir, paths.dir])) {
|
|
1897
|
+
const swept = await sweepNotificationDebris({ dir: sweepDir, deps });
|
|
1898
|
+
debrisRemoved.push(...swept.removed);
|
|
1899
|
+
debrisKept += swept.kept;
|
|
1900
|
+
debrisFailures += swept.failures;
|
|
1901
|
+
debrisScanFailed ||= swept.scanFailed === true;
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1716
1904
|
return {
|
|
1717
1905
|
endpointsScanned: removed.length + kept + unreadable + recoveryFailures,
|
|
1718
1906
|
endpointsRemoved: removed,
|
|
@@ -1722,6 +1910,10 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
|
|
|
1722
1910
|
endpointsRetainedSuccessors: retainedSuccessors,
|
|
1723
1911
|
endpointsRetainedPlaceholders: retainedPlaceholders,
|
|
1724
1912
|
endpointsRetainedUnknown: retainedUnknown,
|
|
1913
|
+
debrisRemoved,
|
|
1914
|
+
debrisKept,
|
|
1915
|
+
debrisFailures,
|
|
1916
|
+
...(debrisScanFailed ? { debrisScanFailed } : {}),
|
|
1725
1917
|
daemon,
|
|
1726
1918
|
};
|
|
1727
1919
|
}
|
|
@@ -1742,6 +1934,10 @@ export function formatNotificationRecoveryReport(report: NotificationRecoveryRep
|
|
|
1742
1934
|
lines.push(` - retained exchange placeholder cleanup path ${placeholder}`);
|
|
1743
1935
|
for (const unknown of report.endpointsRetainedUnknown ?? [])
|
|
1744
1936
|
lines.push(` - retained unverified cleanup path ${unknown}`);
|
|
1937
|
+
if (report.debrisRemoved !== undefined || report.debrisKept !== undefined)
|
|
1938
|
+
lines.push(
|
|
1939
|
+
` debris: removed ${report.debrisRemoved?.length ?? 0}, kept ${report.debrisKept ?? 0}, failed ${report.debrisFailures ?? 0}${report.debrisScanFailed ? ", scan failed" : ""}`,
|
|
1940
|
+
);
|
|
1745
1941
|
lines.push(` daemon: ${report.daemon.action} — ${report.daemon.detail}`);
|
|
1746
1942
|
if (report.daemon.blockingReason) lines.push(` - blocking reason: ${report.daemon.blockingReason}`);
|
|
1747
1943
|
if (report.daemon.markerAgeMs !== undefined)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface NotificationOperatorTimerDeps {
|
|
2
2
|
now?: () => number;
|
|
3
|
-
setTimeoutImpl?:
|
|
3
|
+
setTimeoutImpl?: (callback: () => void, ms?: number) => Timer | NodeJS.Timeout;
|
|
4
4
|
clearTimeoutImpl?: typeof clearTimeout;
|
|
5
5
|
setIntervalImpl?: typeof setInterval;
|
|
6
6
|
clearIntervalImpl?: typeof clearInterval;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Bounded
|
|
2
|
+
* Bounded prompt reconciliation state for canonical Q26 `turn.result` with
|
|
3
|
+
* `kind: "prompt"`, plus the legacy `turn.prompt_status` alias.
|
|
3
4
|
*
|
|
4
5
|
* Separate from the lifecycle delivery buffers (promptSubmissions /
|
|
5
6
|
* promptTerminalTombstones), which exist to deliver frames and intentionally
|
|
@@ -9,8 +10,8 @@
|
|
|
9
10
|
*
|
|
10
11
|
* Semantics (public contract, mirrored in sdk/prompt-status.ts):
|
|
11
12
|
* - Active records are NEVER converted to terminal by age or capacity.
|
|
12
|
-
* - Terminal records are
|
|
13
|
-
*
|
|
13
|
+
* - Terminal records are bounded to TERMINAL_CAPACITY and evicted
|
|
14
|
+
* oldest-terminal-first by terminalAt; only then
|
|
14
15
|
* does a lookup honestly report `unknown`.
|
|
15
16
|
* - Process-local durability floor is the live session process: restart means `unknown`.
|
|
16
17
|
* Session-scoped durable retention (kind-aware store) is provided by reconciliation-store.ts (#3032).
|
|
@@ -22,12 +23,11 @@
|
|
|
22
23
|
*/
|
|
23
24
|
|
|
24
25
|
import { PROMPT_FAILURE_CODE_MAX, sanitizePromptFailure } from "../prompt-failure";
|
|
26
|
+
import type { ReceiptState } from "../receipt-state";
|
|
25
27
|
|
|
26
28
|
export { PROMPT_FAILURE_CODE_MAX, sanitizePromptFailure };
|
|
27
|
-
|
|
28
29
|
export const PROMPT_RECONCILIATION_ACTIVE_CAPACITY = 128;
|
|
29
30
|
export const PROMPT_RECONCILIATION_TERMINAL_CAPACITY = 256;
|
|
30
|
-
export const PROMPT_RECONCILIATION_TERMINAL_TTL_MS = 15 * 60_000;
|
|
31
31
|
|
|
32
32
|
export type PromptReconciliationStatus = "accepted" | "in_flight" | "terminal_ok" | "failed";
|
|
33
33
|
|
|
@@ -43,11 +43,13 @@ export interface PromptReconciliationRecord extends PromptCorrelation {
|
|
|
43
43
|
acceptedAt: number;
|
|
44
44
|
startedAt?: number;
|
|
45
45
|
terminalAt?: number;
|
|
46
|
+
receiptState?: Exclude<ReceiptState, "absent">;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
export type TurnPromptReconciliation =
|
|
49
50
|
| {
|
|
50
51
|
status: "accepted";
|
|
52
|
+
receiptState: "absent";
|
|
51
53
|
commandId: string;
|
|
52
54
|
turnId: string;
|
|
53
55
|
clientRef?: string;
|
|
@@ -55,6 +57,7 @@ export type TurnPromptReconciliation =
|
|
|
55
57
|
}
|
|
56
58
|
| {
|
|
57
59
|
status: "in_flight";
|
|
60
|
+
receiptState: "absent";
|
|
58
61
|
commandId: string;
|
|
59
62
|
turnId: string;
|
|
60
63
|
clientRef?: string;
|
|
@@ -63,6 +66,7 @@ export type TurnPromptReconciliation =
|
|
|
63
66
|
}
|
|
64
67
|
| {
|
|
65
68
|
status: "terminal_ok";
|
|
69
|
+
receiptState: Exclude<ReceiptState, "absent">;
|
|
66
70
|
commandId: string;
|
|
67
71
|
turnId: string;
|
|
68
72
|
clientRef?: string;
|
|
@@ -74,6 +78,7 @@ export type TurnPromptReconciliation =
|
|
|
74
78
|
}
|
|
75
79
|
| {
|
|
76
80
|
status: "failed";
|
|
81
|
+
receiptState: Exclude<ReceiptState, "absent">;
|
|
77
82
|
commandId: string;
|
|
78
83
|
turnId: string;
|
|
79
84
|
clientRef?: string;
|
|
@@ -82,7 +87,7 @@ export type TurnPromptReconciliation =
|
|
|
82
87
|
terminalAt: number;
|
|
83
88
|
error: { code: string; message: string };
|
|
84
89
|
}
|
|
85
|
-
| { status: "unknown" };
|
|
90
|
+
| { status: "unknown"; receiptState: "unknown" };
|
|
86
91
|
|
|
87
92
|
export interface PromptReconciliation {
|
|
88
93
|
/** Fail-closed admission BEFORE any execution; holds an identity-bound reservation. */
|
|
@@ -94,7 +99,10 @@ export interface PromptReconciliation {
|
|
|
94
99
|
/** Lifecycle transition; terminal outcomes settle exactly once. */
|
|
95
100
|
noteTransition(
|
|
96
101
|
correlation: PromptCorrelation | undefined,
|
|
97
|
-
frame:
|
|
102
|
+
frame:
|
|
103
|
+
| { type: "agent_start" }
|
|
104
|
+
| { type: "agent_end"; finalText?: string }
|
|
105
|
+
| { type: "agent_failed"; error: unknown; finalText?: string },
|
|
98
106
|
): void;
|
|
99
107
|
lookup(selector: { commandId?: string; turnId?: string; clientRef?: string }): TurnPromptReconciliation;
|
|
100
108
|
cleanup(): void;
|
|
@@ -121,10 +129,6 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
|
|
|
121
129
|
};
|
|
122
130
|
|
|
123
131
|
const cleanup = () => {
|
|
124
|
-
const at = now();
|
|
125
|
-
for (const [key, record] of records)
|
|
126
|
-
if (record.terminalAt !== undefined && record.terminalAt + PROMPT_RECONCILIATION_TERMINAL_TTL_MS <= at)
|
|
127
|
-
remove(key);
|
|
128
132
|
const terminalEntries = [...records.entries()].filter(([, record]) => record.terminalAt !== undefined);
|
|
129
133
|
if (terminalEntries.length <= PROMPT_RECONCILIATION_TERMINAL_CAPACITY) return;
|
|
130
134
|
// Evict oldest-terminal-first by terminalAt, not acceptance/insertion
|
|
@@ -184,7 +188,10 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
|
|
|
184
188
|
|
|
185
189
|
const noteTransition = (
|
|
186
190
|
correlation: PromptCorrelation | undefined,
|
|
187
|
-
frame:
|
|
191
|
+
frame:
|
|
192
|
+
| { type: "agent_start" }
|
|
193
|
+
| { type: "agent_end"; finalText?: string }
|
|
194
|
+
| { type: "agent_failed"; error: unknown; finalText?: string },
|
|
188
195
|
) => {
|
|
189
196
|
if (!correlation) return;
|
|
190
197
|
const record = records.get(keyOf(correlation));
|
|
@@ -207,6 +214,7 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
|
|
|
207
214
|
return;
|
|
208
215
|
}
|
|
209
216
|
record.terminalAt = now();
|
|
217
|
+
record.receiptState = frame.finalText?.trim() ? "present" : "missing";
|
|
210
218
|
if (frame.type === "agent_failed") {
|
|
211
219
|
record.status = "failed";
|
|
212
220
|
record.error = sanitizePromptFailure(frame.error);
|
|
@@ -226,20 +234,21 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
|
|
|
226
234
|
? keyOf({ commandId: selector.commandId, turnId: selector.turnId })
|
|
227
235
|
: undefined;
|
|
228
236
|
const record = key === undefined ? undefined : records.get(key);
|
|
229
|
-
if (!record) return { status: "unknown" };
|
|
237
|
+
if (!record) return { status: "unknown", receiptState: "unknown" };
|
|
230
238
|
const identity = {
|
|
231
239
|
commandId: record.commandId,
|
|
232
240
|
turnId: record.turnId,
|
|
233
241
|
...(record.clientRef !== undefined ? { clientRef: record.clientRef } : {}),
|
|
234
242
|
acceptedAt: record.acceptedAt,
|
|
235
243
|
};
|
|
236
|
-
if (record.status === "accepted") return { status: "accepted", ...identity };
|
|
244
|
+
if (record.status === "accepted") return { status: "accepted", receiptState: "absent", ...identity };
|
|
237
245
|
if (record.status === "in_flight")
|
|
238
|
-
return { status: "in_flight", ...identity, startedAt: record.startedAt as number };
|
|
246
|
+
return { status: "in_flight", receiptState: "absent", ...identity, startedAt: record.startedAt as number };
|
|
239
247
|
const terminal = {
|
|
240
248
|
...identity,
|
|
241
249
|
...(record.startedAt !== undefined ? { startedAt: record.startedAt } : {}),
|
|
242
250
|
terminalAt: record.terminalAt as number,
|
|
251
|
+
receiptState: record.receiptState ?? "unknown",
|
|
243
252
|
};
|
|
244
253
|
if (record.status === "terminal_ok")
|
|
245
254
|
return {
|