@prestyj/cli 5.10.0 → 5.11.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/README.md +3 -4
- package/dist/app-sidecar-auth-broadcast.test.d.ts +2 -0
- package/dist/app-sidecar-auth-broadcast.test.d.ts.map +1 -0
- package/dist/app-sidecar-auth-broadcast.test.js +282 -0
- package/dist/app-sidecar-auth-broadcast.test.js.map +1 -0
- package/dist/app-sidecar-sessions.d.ts +5 -2
- package/dist/app-sidecar-sessions.d.ts.map +1 -1
- package/dist/app-sidecar-sessions.js +34 -8
- package/dist/app-sidecar-sessions.js.map +1 -1
- package/dist/app-sidecar-sessions.test.js +95 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -1
- package/dist/app-sidecar.js +497 -128
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/command-routing.d.ts +1 -1
- package/dist/cli/command-routing.d.ts.map +1 -1
- package/dist/cli/command-routing.js +1 -0
- package/dist/cli/command-routing.js.map +1 -1
- package/dist/cli/command-routing.test.js +1 -0
- package/dist/cli/command-routing.test.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +167 -47
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +10 -1
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-notifications.d.ts +62 -0
- package/dist/core/agent-notifications.d.ts.map +1 -0
- package/dist/core/agent-notifications.js +92 -0
- package/dist/core/agent-notifications.js.map +1 -0
- package/dist/core/agent-notifications.test.d.ts +2 -0
- package/dist/core/agent-notifications.test.d.ts.map +1 -0
- package/dist/core/agent-notifications.test.js +97 -0
- package/dist/core/agent-notifications.test.js.map +1 -0
- package/dist/core/agent-session-checkpoint-flush.test.d.ts +2 -0
- package/dist/core/agent-session-checkpoint-flush.test.d.ts.map +1 -0
- package/dist/core/agent-session-checkpoint-flush.test.js +201 -0
- package/dist/core/agent-session-checkpoint-flush.test.js.map +1 -0
- package/dist/core/agent-session-compaction.test.js +323 -6
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-crash-durability.test.d.ts +2 -0
- package/dist/core/agent-session-crash-durability.test.d.ts.map +1 -0
- package/dist/core/agent-session-crash-durability.test.js +102 -0
- package/dist/core/agent-session-crash-durability.test.js.map +1 -0
- package/dist/core/agent-session-marker-anchors.test.js +181 -2
- package/dist/core/agent-session-marker-anchors.test.js.map +1 -1
- package/dist/core/agent-session-model-switch.test.d.ts +2 -0
- package/dist/core/agent-session-model-switch.test.d.ts.map +1 -0
- package/dist/core/agent-session-model-switch.test.js +161 -0
- package/dist/core/agent-session-model-switch.test.js.map +1 -0
- package/dist/core/agent-session-notifications.test.d.ts +2 -0
- package/dist/core/agent-session-notifications.test.d.ts.map +1 -0
- package/dist/core/agent-session-notifications.test.js +114 -0
- package/dist/core/agent-session-notifications.test.js.map +1 -0
- package/dist/core/agent-session-process-gate.test.d.ts +2 -0
- package/dist/core/agent-session-process-gate.test.d.ts.map +1 -0
- package/dist/core/agent-session-process-gate.test.js +92 -0
- package/dist/core/agent-session-process-gate.test.js.map +1 -0
- package/dist/core/agent-session-queue.test.js +65 -0
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-session-review-coverage.test.js +80 -23
- package/dist/core/agent-session-review-coverage.test.js.map +1 -1
- package/dist/core/agent-session-slash-restore.test.d.ts +2 -0
- package/dist/core/agent-session-slash-restore.test.d.ts.map +1 -0
- package/dist/core/agent-session-slash-restore.test.js +121 -0
- package/dist/core/agent-session-slash-restore.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +214 -10
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +978 -212
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/active-context.test.js +21 -0
- package/dist/core/compaction/active-context.test.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts +108 -8
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +423 -119
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +360 -8
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/policy.d.ts +17 -0
- package/dist/core/compaction/policy.d.ts.map +1 -0
- package/dist/core/compaction/policy.js +22 -0
- package/dist/core/compaction/policy.js.map +1 -0
- package/dist/core/compaction/policy.test.d.ts +2 -0
- package/dist/core/compaction/policy.test.d.ts.map +1 -0
- package/dist/core/compaction/policy.test.js +35 -0
- package/dist/core/compaction/policy.test.js.map +1 -0
- package/dist/core/compaction/query-aware-selector.d.ts +33 -0
- package/dist/core/compaction/query-aware-selector.d.ts.map +1 -0
- package/dist/core/compaction/query-aware-selector.js +202 -0
- package/dist/core/compaction/query-aware-selector.js.map +1 -0
- package/dist/core/compaction/query-aware-selector.test.d.ts +2 -0
- package/dist/core/compaction/query-aware-selector.test.d.ts.map +1 -0
- package/dist/core/compaction/query-aware-selector.test.js +96 -0
- package/dist/core/compaction/query-aware-selector.test.js.map +1 -0
- package/dist/core/compaction/tool-result-pruner.d.ts +24 -11
- package/dist/core/compaction/tool-result-pruner.d.ts.map +1 -1
- package/dist/core/compaction/tool-result-pruner.js +98 -26
- package/dist/core/compaction/tool-result-pruner.js.map +1 -1
- package/dist/core/compaction/tool-result-pruner.test.js +178 -6
- package/dist/core/compaction/tool-result-pruner.test.js.map +1 -1
- package/dist/core/event-bus.d.ts +23 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +10 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +28 -8
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/plugin-bundles.d.ts +23 -0
- package/dist/core/extensions/plugin-bundles.d.ts.map +1 -0
- package/dist/core/extensions/plugin-bundles.js +228 -0
- package/dist/core/extensions/plugin-bundles.js.map +1 -0
- package/dist/core/extensions/plugin-bundles.test.d.ts +2 -0
- package/dist/core/extensions/plugin-bundles.test.d.ts.map +1 -0
- package/dist/core/extensions/plugin-bundles.test.js +110 -0
- package/dist/core/extensions/plugin-bundles.test.js.map +1 -0
- package/dist/core/foreign-session-import.d.ts +120 -0
- package/dist/core/foreign-session-import.d.ts.map +1 -0
- package/dist/core/foreign-session-import.js +598 -0
- package/dist/core/foreign-session-import.js.map +1 -0
- package/dist/core/foreign-session-import.test.d.ts +2 -0
- package/dist/core/foreign-session-import.test.d.ts.map +1 -0
- package/dist/core/foreign-session-import.test.js +220 -0
- package/dist/core/foreign-session-import.test.js.map +1 -0
- package/dist/core/foreign-transcript-blocks.d.ts +51 -0
- package/dist/core/foreign-transcript-blocks.d.ts.map +1 -0
- package/dist/core/foreign-transcript-blocks.js +151 -0
- package/dist/core/foreign-transcript-blocks.js.map +1 -0
- package/dist/core/ideal-review.d.ts +20 -1
- package/dist/core/ideal-review.d.ts.map +1 -1
- package/dist/core/ideal-review.js +37 -2
- package/dist/core/ideal-review.js.map +1 -1
- package/dist/core/ideal-review.test.js +99 -3
- package/dist/core/ideal-review.test.js.map +1 -1
- package/dist/core/loop-breaker.d.ts.map +1 -1
- package/dist/core/loop-breaker.js +1 -0
- package/dist/core/loop-breaker.js.map +1 -1
- package/dist/core/lsp/client.d.ts +15 -0
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +39 -1
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/manager.d.ts +47 -9
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +96 -69
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/manager.test.js +18 -0
- package/dist/core/lsp/manager.test.js.map +1 -1
- package/dist/core/lsp/pool.d.ts +113 -0
- package/dist/core/lsp/pool.d.ts.map +1 -0
- package/dist/core/lsp/pool.js +255 -0
- package/dist/core/lsp/pool.js.map +1 -0
- package/dist/core/lsp/pool.test.d.ts +2 -0
- package/dist/core/lsp/pool.test.d.ts.map +1 -0
- package/dist/core/lsp/pool.test.js +286 -0
- package/dist/core/lsp/pool.test.js.map +1 -0
- package/dist/core/lsp/servers.d.ts.map +1 -1
- package/dist/core/lsp/servers.js +43 -3
- package/dist/core/lsp/servers.js.map +1 -1
- package/dist/core/lsp/servers.test.d.ts +2 -0
- package/dist/core/lsp/servers.test.d.ts.map +1 -0
- package/dist/core/lsp/servers.test.js +67 -0
- package/dist/core/lsp/servers.test.js.map +1 -0
- package/dist/core/lsp/windows.test.js +2 -14
- package/dist/core/lsp/windows.test.js.map +1 -1
- package/dist/core/mcp/catalog-cache.d.ts +63 -0
- package/dist/core/mcp/catalog-cache.d.ts.map +1 -0
- package/dist/core/mcp/catalog-cache.js +163 -0
- package/dist/core/mcp/catalog-cache.js.map +1 -0
- package/dist/core/mcp/catalog-cache.test.d.ts +2 -0
- package/dist/core/mcp/catalog-cache.test.d.ts.map +1 -0
- package/dist/core/mcp/catalog-cache.test.js +99 -0
- package/dist/core/mcp/catalog-cache.test.js.map +1 -0
- package/dist/core/mcp/client-session-recovery.test.d.ts +2 -0
- package/dist/core/mcp/client-session-recovery.test.d.ts.map +1 -0
- package/dist/core/mcp/client-session-recovery.test.js +231 -0
- package/dist/core/mcp/client-session-recovery.test.js.map +1 -0
- package/dist/core/mcp/client.d.ts +158 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +476 -35
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/elicitation-bridge.d.ts +41 -0
- package/dist/core/mcp/elicitation-bridge.d.ts.map +1 -0
- package/dist/core/mcp/elicitation-bridge.js +52 -0
- package/dist/core/mcp/elicitation-bridge.js.map +1 -0
- package/dist/core/mcp/elicitation.test.d.ts +2 -0
- package/dist/core/mcp/elicitation.test.d.ts.map +1 -0
- package/dist/core/mcp/elicitation.test.js +158 -0
- package/dist/core/mcp/elicitation.test.js.map +1 -0
- package/dist/core/mcp/index.d.ts +5 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js +2 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/legacy-negotiation.test.d.ts +2 -0
- package/dist/core/mcp/legacy-negotiation.test.d.ts.map +1 -0
- package/dist/core/mcp/legacy-negotiation.test.js +80 -0
- package/dist/core/mcp/legacy-negotiation.test.js.map +1 -0
- package/dist/core/mcp/oauth-provider.d.ts +1 -2
- package/dist/core/mcp/oauth-provider.d.ts.map +1 -1
- package/dist/core/mcp/oauth-provider.js +6 -2
- package/dist/core/mcp/oauth-provider.js.map +1 -1
- package/dist/core/mcp/oauth-store.d.ts +1 -1
- package/dist/core/mcp/oauth-store.d.ts.map +1 -1
- package/dist/core/mcp/oauth-store.js.map +1 -1
- package/dist/core/mcp/session-elicitation-wiring.test.d.ts +2 -0
- package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +1 -0
- package/dist/core/mcp/session-elicitation-wiring.test.js +138 -0
- package/dist/core/mcp/session-elicitation-wiring.test.js.map +1 -0
- package/dist/core/mcp/shared-pool.d.ts +158 -0
- package/dist/core/mcp/shared-pool.d.ts.map +1 -0
- package/dist/core/mcp/shared-pool.js +235 -0
- package/dist/core/mcp/shared-pool.js.map +1 -0
- package/dist/core/mcp/shared-pool.test.d.ts +2 -0
- package/dist/core/mcp/shared-pool.test.d.ts.map +1 -0
- package/dist/core/mcp/shared-pool.test.js +425 -0
- package/dist/core/mcp/shared-pool.test.js.map +1 -0
- package/dist/core/mcp/types.d.ts +12 -0
- package/dist/core/mcp/types.d.ts.map +1 -1
- package/dist/core/mcp/when-connected.test.d.ts +2 -0
- package/dist/core/mcp/when-connected.test.d.ts.map +1 -0
- package/dist/core/mcp/when-connected.test.js +46 -0
- package/dist/core/mcp/when-connected.test.js.map +1 -0
- package/dist/core/nolan-context.d.ts.map +1 -1
- package/dist/core/nolan-context.js +8 -0
- package/dist/core/nolan-context.js.map +1 -1
- package/dist/core/nolan-context.test.js +40 -0
- package/dist/core/nolan-context.test.js.map +1 -1
- package/dist/core/nolan-prompt.js +3 -0
- package/dist/core/nolan-prompt.js.map +1 -1
- package/dist/core/nolan-prompt.test.js +5 -0
- package/dist/core/nolan-prompt.test.js.map +1 -1
- package/dist/core/persistent-shell.d.ts +3 -2
- package/dist/core/persistent-shell.d.ts.map +1 -1
- package/dist/core/persistent-shell.js +10 -3
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-gate.d.ts +45 -0
- package/dist/core/process-gate.d.ts.map +1 -0
- package/dist/core/process-gate.js +79 -0
- package/dist/core/process-gate.js.map +1 -0
- package/dist/core/process-gate.test.d.ts +2 -0
- package/dist/core/process-gate.test.d.ts.map +1 -0
- package/dist/core/process-gate.test.js +87 -0
- package/dist/core/process-gate.test.js.map +1 -0
- package/dist/core/process-manager-notifications.test.d.ts +2 -0
- package/dist/core/process-manager-notifications.test.d.ts.map +1 -0
- package/dist/core/process-manager-notifications.test.js +217 -0
- package/dist/core/process-manager-notifications.test.js.map +1 -0
- package/dist/core/process-manager.d.ts +50 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +189 -2
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts +31 -6
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +287 -31
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +124 -0
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/regrounding.d.ts.map +1 -1
- package/dist/core/regrounding.js +1 -0
- package/dist/core/regrounding.js.map +1 -1
- package/dist/core/run-claim.d.ts +37 -0
- package/dist/core/run-claim.d.ts.map +1 -0
- package/dist/core/run-claim.js +46 -0
- package/dist/core/run-claim.js.map +1 -0
- package/dist/core/run-claim.test.d.ts +2 -0
- package/dist/core/run-claim.test.d.ts.map +1 -0
- package/dist/core/run-claim.test.js +107 -0
- package/dist/core/run-claim.test.js.map +1 -0
- package/dist/core/run-journal.test.d.ts +2 -0
- package/dist/core/run-journal.test.d.ts.map +1 -0
- package/dist/core/run-journal.test.js +195 -0
- package/dist/core/run-journal.test.js.map +1 -0
- package/dist/core/run-lifecycle.d.ts +22 -3
- package/dist/core/run-lifecycle.d.ts.map +1 -1
- package/dist/core/run-lifecycle.js +12 -3
- package/dist/core/run-lifecycle.js.map +1 -1
- package/dist/core/sandbox-domains.d.ts +14 -0
- package/dist/core/sandbox-domains.d.ts.map +1 -0
- package/dist/core/sandbox-domains.js +76 -0
- package/dist/core/sandbox-domains.js.map +1 -0
- package/dist/core/sandbox-feedback.d.ts +22 -0
- package/dist/core/sandbox-feedback.d.ts.map +1 -0
- package/dist/core/sandbox-feedback.js +69 -0
- package/dist/core/sandbox-feedback.js.map +1 -0
- package/dist/core/sandbox-feedback.test.d.ts +2 -0
- package/dist/core/sandbox-feedback.test.d.ts.map +1 -0
- package/dist/core/sandbox-feedback.test.js +32 -0
- package/dist/core/sandbox-feedback.test.js.map +1 -0
- package/dist/core/sandbox.d.ts +91 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +254 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/sandbox.test.d.ts +2 -0
- package/dist/core/sandbox.test.d.ts.map +1 -0
- package/dist/core/sandbox.test.js +157 -0
- package/dist/core/sandbox.test.js.map +1 -0
- package/dist/core/session-compaction.d.ts +6 -0
- package/dist/core/session-compaction.d.ts.map +1 -1
- package/dist/core/session-compaction.js +11 -1
- package/dist/core/session-compaction.js.map +1 -1
- package/dist/core/session-compaction.test.js +18 -1
- package/dist/core/session-compaction.test.js.map +1 -1
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js +12 -4
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-history.d.ts +95 -6
- package/dist/core/session-history.d.ts.map +1 -1
- package/dist/core/session-history.js +261 -17
- package/dist/core/session-history.js.map +1 -1
- package/dist/core/session-history.test.js +173 -2
- package/dist/core/session-history.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +223 -6
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +515 -26
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-manager.test.js +147 -3
- package/dist/core/session-manager.test.js.map +1 -1
- package/dist/core/session-notification-visibility.test.d.ts +2 -0
- package/dist/core/session-notification-visibility.test.d.ts.map +1 -0
- package/dist/core/session-notification-visibility.test.js +113 -0
- package/dist/core/session-notification-visibility.test.js.map +1 -0
- package/dist/core/session-preview.d.ts +5 -4
- package/dist/core/session-preview.d.ts.map +1 -1
- package/dist/core/session-preview.js +12 -5
- package/dist/core/session-preview.js.map +1 -1
- package/dist/core/session-restore-display.test.js +25 -0
- package/dist/core/session-restore-display.test.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +39 -3
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/session-storage.test.js +6 -1
- package/dist/core/session-storage.test.js.map +1 -1
- package/dist/core/settings-manager.d.ts +8 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +26 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/steering.d.ts +12 -0
- package/dist/core/steering.d.ts.map +1 -1
- package/dist/core/steering.js +16 -0
- package/dist/core/steering.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +13 -0
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +39 -1
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +43 -7
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/verification-evidence.d.ts +17 -0
- package/dist/core/verification-evidence.d.ts.map +1 -0
- package/dist/core/verification-evidence.js +283 -0
- package/dist/core/verification-evidence.js.map +1 -0
- package/dist/core/verification-evidence.test.d.ts +2 -0
- package/dist/core/verification-evidence.test.d.ts.map +1 -0
- package/dist/core/verification-evidence.test.js +103 -0
- package/dist/core/verification-evidence.test.js.map +1 -0
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +17 -3
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-mode.d.ts +122 -0
- package/dist/modes/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp-mode.js +1366 -0
- package/dist/modes/acp-mode.js.map +1 -0
- package/dist/modes/acp-mode.test.d.ts +2 -0
- package/dist/modes/acp-mode.test.d.ts.map +1 -0
- package/dist/modes/acp-mode.test.js +1065 -0
- package/dist/modes/acp-mode.test.js.map +1 -0
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/json-mode.d.ts +28 -0
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +37 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/json-mode.test.d.ts +2 -0
- package/dist/modes/json-mode.test.d.ts.map +1 -0
- package/dist/modes/json-mode.test.js +84 -0
- package/dist/modes/json-mode.test.js.map +1 -0
- package/dist/modes/subagent-worker-mode.d.ts +3 -0
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +91 -11
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.test.d.ts +2 -0
- package/dist/modes/subagent-worker-mode.test.d.ts.map +1 -0
- package/dist/modes/subagent-worker-mode.test.js +52 -0
- package/dist/modes/subagent-worker-mode.test.js.map +1 -0
- package/dist/session.d.ts +29 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +41 -0
- package/dist/session.js.map +1 -1
- package/dist/tools/bash.d.ts +2 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +55 -16
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/goals.d.ts +2 -2
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +2 -1
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +13 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +55 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/read-only-bash.d.ts +3 -0
- package/dist/tools/read-only-bash.d.ts.map +1 -1
- package/dist/tools/read-only-bash.js +7 -9
- package/dist/tools/read-only-bash.js.map +1 -1
- package/dist/tools/subagent-control.d.ts.map +1 -1
- package/dist/tools/subagent-control.js +6 -2
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +6 -0
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +6 -0
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +43 -8
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/subagent.test.js +65 -3
- package/dist/tools/subagent.test.js.map +1 -1
- package/dist/tools/task-output.d.ts.map +1 -1
- package/dist/tools/task-output.js +3 -1
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/tool-search.d.ts +12 -1
- package/dist/tools/tool-search.d.ts.map +1 -1
- package/dist/tools/tool-search.js +22 -3
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-search.test.d.ts +2 -0
- package/dist/tools/tool-search.test.d.ts.map +1 -0
- package/dist/tools/tool-search.test.js +69 -0
- package/dist/tools/tool-search.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +5 -2
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +27 -1
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +18 -4
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/utils/github.test.js +3 -3
- package/dist/utils/github.test.js.map +1 -1
- package/dist/utils/image.d.ts +26 -3
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js +83 -14
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/image.test.d.ts +2 -0
- package/dist/utils/image.test.d.ts.map +1 -0
- package/dist/utils/image.test.js +139 -0
- package/dist/utils/image.test.js.map +1 -0
- package/package.json +7 -6
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A long background build must report itself. These tests drive real processes
|
|
3
|
+
* (the watcher works off the on-disk log, so a fake would prove nothing) and
|
|
4
|
+
* assert the two invariants that keep it cheap: bounded injected bytes, and no
|
|
5
|
+
* timer outliving its process.
|
|
6
|
+
*/
|
|
7
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { ProcessManager } from "./process-manager.js";
|
|
12
|
+
import { AgentNotificationQueue, NOTIFICATION_MAX_CHARS, } from "./agent-notifications.js";
|
|
13
|
+
const managers = [];
|
|
14
|
+
const tempDirs = [];
|
|
15
|
+
/** Mirrors WATCH_MAX_REPORTS in process-manager.ts (module-private). */
|
|
16
|
+
const WATCH_MAX_REPORTS_EXPECTED = 3;
|
|
17
|
+
function manager(notifications) {
|
|
18
|
+
const instance = new ProcessManager({ notifications });
|
|
19
|
+
managers.push(instance);
|
|
20
|
+
return instance;
|
|
21
|
+
}
|
|
22
|
+
async function tempDir() {
|
|
23
|
+
const directory = await fs.mkdtemp(path.join(os.tmpdir(), "gg-process-notify-"));
|
|
24
|
+
tempDirs.push(directory);
|
|
25
|
+
return directory;
|
|
26
|
+
}
|
|
27
|
+
/** Poll the queue until a notification matching `predicate` is drained. */
|
|
28
|
+
async function waitForNotification(queue, predicate, timeoutMs = 20_000) {
|
|
29
|
+
const deadline = Date.now() + timeoutMs;
|
|
30
|
+
const seen = [];
|
|
31
|
+
while (Date.now() < deadline) {
|
|
32
|
+
for (const entry of queue.drain()) {
|
|
33
|
+
seen.push(entry);
|
|
34
|
+
if (predicate(entry))
|
|
35
|
+
return entry;
|
|
36
|
+
}
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Timed out. Saw: ${JSON.stringify(seen)}`);
|
|
40
|
+
}
|
|
41
|
+
afterEach(async () => {
|
|
42
|
+
for (const instance of managers.splice(0))
|
|
43
|
+
instance.shutdownAll();
|
|
44
|
+
await Promise.all(tempDirs
|
|
45
|
+
.splice(0)
|
|
46
|
+
.map((directory) => fs.rm(directory, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 })));
|
|
47
|
+
});
|
|
48
|
+
describe("ProcessManager progress notifications", () => {
|
|
49
|
+
it("pushes a terminal exit checkpoint without any task_output call", async () => {
|
|
50
|
+
const queue = new AgentNotificationQueue();
|
|
51
|
+
const instance = manager(queue);
|
|
52
|
+
const cwd = await tempDir();
|
|
53
|
+
const started = await instance.start("echo hello-from-build; exit 3", cwd);
|
|
54
|
+
const exit = await waitForNotification(queue, (entry) => entry.terminal);
|
|
55
|
+
expect(exit.kind).toBe("process");
|
|
56
|
+
expect(exit.id).toBe(started.id);
|
|
57
|
+
expect(exit.text).toContain("exited with code 3");
|
|
58
|
+
expect(exit.text).toContain("hello-from-build");
|
|
59
|
+
expect(exit.text).toContain("task_output");
|
|
60
|
+
expect(exit.text.length).toBeLessThanOrEqual(NOTIFICATION_MAX_CHARS);
|
|
61
|
+
}, 30_000);
|
|
62
|
+
it("surfaces progress on a long-running process before it exits", async () => {
|
|
63
|
+
const queue = new AgentNotificationQueue();
|
|
64
|
+
const instance = manager(queue);
|
|
65
|
+
const cwd = await tempDir();
|
|
66
|
+
// Logs steadily for ~12s: long enough for at least one 5s checkpoint tick.
|
|
67
|
+
const started = await instance.start(`for i in $(seq 1 12); do echo "step-$i"; sleep 1; done`, cwd);
|
|
68
|
+
const progress = await waitForNotification(queue, (entry) => !entry.terminal);
|
|
69
|
+
expect(progress.id).toBe(started.id);
|
|
70
|
+
expect(progress.text).toContain("still running");
|
|
71
|
+
expect(progress.text).toContain("step-");
|
|
72
|
+
expect(progress.text.length).toBeLessThanOrEqual(NOTIFICATION_MAX_CHARS);
|
|
73
|
+
// Proven without a single task_output call.
|
|
74
|
+
await instance.stop(started.id);
|
|
75
|
+
}, 40_000);
|
|
76
|
+
it("bounds the digest of a process that floods its log", async () => {
|
|
77
|
+
const queue = new AgentNotificationQueue();
|
|
78
|
+
const instance = manager(queue);
|
|
79
|
+
const cwd = await tempDir();
|
|
80
|
+
await instance.start(`for i in $(seq 1 2000); do echo "line-$i padding padding"; done`, cwd);
|
|
81
|
+
const exit = await waitForNotification(queue, (entry) => entry.terminal);
|
|
82
|
+
expect(exit.text.length).toBeLessThanOrEqual(NOTIFICATION_MAX_CHARS);
|
|
83
|
+
// Digest is the TAIL, so the newest lines survive.
|
|
84
|
+
expect(exit.text).toContain("line-2000");
|
|
85
|
+
}, 30_000);
|
|
86
|
+
it("leaves no watcher timer alive after a process exits", async () => {
|
|
87
|
+
const queue = new AgentNotificationQueue();
|
|
88
|
+
const instance = manager(queue);
|
|
89
|
+
const cwd = await tempDir();
|
|
90
|
+
const started = await instance.start("true", cwd);
|
|
91
|
+
expect(instance.activeWatchers()).toContain(started.id);
|
|
92
|
+
await waitForNotification(queue, (entry) => entry.terminal);
|
|
93
|
+
expect(instance.activeWatchers()).toEqual([]);
|
|
94
|
+
}, 30_000);
|
|
95
|
+
it("disposes the watcher when a running process is stopped", async () => {
|
|
96
|
+
const queue = new AgentNotificationQueue();
|
|
97
|
+
const instance = manager(queue);
|
|
98
|
+
const cwd = await tempDir();
|
|
99
|
+
const started = await instance.start("sleep 30", cwd);
|
|
100
|
+
expect(instance.activeWatchers()).toContain(started.id);
|
|
101
|
+
await instance.stop(started.id);
|
|
102
|
+
await waitForNotification(queue, (entry) => entry.terminal);
|
|
103
|
+
expect(instance.activeWatchers()).toEqual([]);
|
|
104
|
+
}, 30_000);
|
|
105
|
+
it("backs off repeated progress checkpoints on a long-lived chatty process", async () => {
|
|
106
|
+
const queue = new AgentNotificationQueue();
|
|
107
|
+
const instance = manager(queue);
|
|
108
|
+
const cwd = await tempDir();
|
|
109
|
+
// A dev server: logs continuously and never exits on its own. At a flat 5s
|
|
110
|
+
// this produced a fresh checkpoint for essentially every loop step — the
|
|
111
|
+
// measured ~2k tokens per minute of overlap that prompted the backoff.
|
|
112
|
+
const started = await instance.start(`for i in $(seq 1 400); do echo "[electron] compiled ok $i"; sleep 0.2; done`, cwd);
|
|
113
|
+
// Drain on the cadence a fast tool batch would, for 30s.
|
|
114
|
+
let progressCount = 0;
|
|
115
|
+
const until = Date.now() + 30_000;
|
|
116
|
+
while (Date.now() < until) {
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
118
|
+
progressCount += queue.drain().filter((entry) => !entry.terminal).length;
|
|
119
|
+
}
|
|
120
|
+
await instance.stop(started.id);
|
|
121
|
+
// Ticks land at 5s, 15s, 35s… so 30s admits at most the first two, plus a
|
|
122
|
+
// boundary tick. Flat 5s would have produced ~6.
|
|
123
|
+
expect(progressCount).toBeGreaterThanOrEqual(1);
|
|
124
|
+
expect(progressCount).toBeLessThanOrEqual(3);
|
|
125
|
+
}, 60_000);
|
|
126
|
+
it("still reports a short build promptly, before any backoff matters", async () => {
|
|
127
|
+
const queue = new AgentNotificationQueue();
|
|
128
|
+
const instance = manager(queue);
|
|
129
|
+
const cwd = await tempDir();
|
|
130
|
+
const started = await instance.start(`for i in $(seq 1 12); do echo "step-$i"; sleep 1; done`, cwd);
|
|
131
|
+
// The FIRST checkpoint must still arrive on the original 5s tick — backoff
|
|
132
|
+
// must not cost a short build its near-real-time reporting.
|
|
133
|
+
const first = await waitForNotification(queue, (entry) => !entry.terminal, 9_000);
|
|
134
|
+
expect(first.text).toContain("still running");
|
|
135
|
+
await instance.stop(started.id);
|
|
136
|
+
}, 40_000);
|
|
137
|
+
it("stays responsive after an idle stretch instead of drifting to the cap", async () => {
|
|
138
|
+
const queue = new AgentNotificationQueue();
|
|
139
|
+
const instance = manager(queue);
|
|
140
|
+
const cwd = await tempDir();
|
|
141
|
+
// A dev server that boots, idles, then fails a recompile and KEEPS RUNNING
|
|
142
|
+
// (so the progress watcher, not the exit checkpoint, has to carry the news).
|
|
143
|
+
//
|
|
144
|
+
// Driven from a script file on purpose: every notification embeds
|
|
145
|
+
// `proc.command`, so a marker written inline would also appear in the boot
|
|
146
|
+
// checkpoint's text and match there — which silently made an earlier
|
|
147
|
+
// version of this test assert nothing.
|
|
148
|
+
const IDLE_MS = 40_000;
|
|
149
|
+
const script = path.join(cwd, "server.sh");
|
|
150
|
+
await fs.writeFile(script, `#!/bin/sh\necho booted\nsleep ${IDLE_MS / 1000}\necho LATE_RECOMPILE_FAILURE\nsleep 120\n`, { mode: 0o755 });
|
|
151
|
+
const spawnedAt = Date.now();
|
|
152
|
+
const started = await instance.start("sh server.sh", cwd);
|
|
153
|
+
// Consume the boot checkpoint (this one legitimately backs off to 10s).
|
|
154
|
+
const boot = await waitForNotification(queue, (entry) => !entry.terminal);
|
|
155
|
+
expect(boot.text).not.toContain("LATE_RECOMPILE_FAILURE");
|
|
156
|
+
await waitForNotification(queue, (entry) => entry.text.includes("LATE_RECOMPILE_FAILURE"), 60_000);
|
|
157
|
+
// The failure line is written IDLE_MS after spawn; everything past that is
|
|
158
|
+
// watcher latency.
|
|
159
|
+
const latencyMs = Date.now() - (spawnedAt + IDLE_MS);
|
|
160
|
+
// Backing off on SILENT ticks would have grown the interval through the
|
|
161
|
+
// idle window (5→10→20→40…), making this land ~35s late. Damping only
|
|
162
|
+
// actual reports keeps the interval at 10s, so it lands within one tick.
|
|
163
|
+
expect(latencyMs).toBeLessThan(15_000);
|
|
164
|
+
await instance.stop(started.id);
|
|
165
|
+
}, 120_000);
|
|
166
|
+
it("stops pushing progress entirely once the report budget is spent", async () => {
|
|
167
|
+
const queue = new AgentNotificationQueue();
|
|
168
|
+
const instance = manager(queue);
|
|
169
|
+
const cwd = await tempDir();
|
|
170
|
+
// A dev server: logs continuously, never exits. Without a budget this kept
|
|
171
|
+
// producing checkpoints for the life of the process — the unbounded tail
|
|
172
|
+
// Anthropic removed from Claude Code (task_progress /
|
|
173
|
+
// background_task_status are now LEGACY_ATTACHMENT_TYPES, dropped before
|
|
174
|
+
// the model sees them).
|
|
175
|
+
const started = await instance.start(`for i in $(seq 1 600); do echo "[electron] compiled ok $i"; sleep 0.2; done`, cwd);
|
|
176
|
+
// Reports land at ~5s/15s/35s; the 4th would be at ~75s. Rather than idle
|
|
177
|
+
// until then, assert the structural end state: the watcher RETIRES, so no
|
|
178
|
+
// further tick can exist to fire. That is stronger than any wait.
|
|
179
|
+
let progressCount = 0;
|
|
180
|
+
const until = Date.now() + 50_000;
|
|
181
|
+
while (Date.now() < until && instance.activeWatchers().length > 0) {
|
|
182
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
183
|
+
progressCount += queue.drain().filter((entry) => !entry.terminal).length;
|
|
184
|
+
}
|
|
185
|
+
progressCount += queue.drain().filter((entry) => !entry.terminal).length;
|
|
186
|
+
expect(progressCount).toBe(WATCH_MAX_REPORTS_EXPECTED);
|
|
187
|
+
// Process is still very much alive — this is retirement, not exit.
|
|
188
|
+
expect((await instance.readOutput(started.id)).isRunning).toBe(true);
|
|
189
|
+
expect(instance.activeWatchers()).toEqual([]);
|
|
190
|
+
await instance.stop(started.id);
|
|
191
|
+
}, 120_000);
|
|
192
|
+
it("still reports the exit after the progress budget is spent", async () => {
|
|
193
|
+
const queue = new AgentNotificationQueue();
|
|
194
|
+
const instance = manager(queue);
|
|
195
|
+
const cwd = await tempDir();
|
|
196
|
+
// Chatty enough to burn the budget, then exits non-zero. "It finished, and
|
|
197
|
+
// how" is the one fact the agent cannot get without polling — retiring the
|
|
198
|
+
// progress watcher must never cost it.
|
|
199
|
+
const started = await instance.start(`for i in $(seq 1 200); do echo "line-$i"; sleep 0.2; done; echo BUILD_FAILED; exit 7`, cwd);
|
|
200
|
+
const exit = await waitForNotification(queue, (entry) => entry.terminal, 90_000);
|
|
201
|
+
expect(exit.id).toBe(started.id);
|
|
202
|
+
expect(exit.text).toContain("exited with code 7");
|
|
203
|
+
expect(exit.text).toContain("BUILD_FAILED");
|
|
204
|
+
}, 120_000);
|
|
205
|
+
it("stays silent when no notification queue is wired", async () => {
|
|
206
|
+
const instance = new ProcessManager();
|
|
207
|
+
managers.push(instance);
|
|
208
|
+
const cwd = await tempDir();
|
|
209
|
+
const started = await instance.start("echo quiet", cwd);
|
|
210
|
+
expect(instance.activeWatchers()).toEqual([]);
|
|
211
|
+
// The pull path still works exactly as before.
|
|
212
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
213
|
+
const read = await instance.readOutput(started.id);
|
|
214
|
+
expect(read.output).toContain("quiet");
|
|
215
|
+
}, 30_000);
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=process-manager-notifications.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager-notifications.test.js","sourceRoot":"","sources":["../../src/core/process-manager-notifications.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { spawnSync } from "node:child_process";
|
|
2
|
+
import { type ShellResolution } from "./shell.js";
|
|
3
|
+
import type { AgentNotificationQueue } from "./agent-notifications.js";
|
|
2
4
|
export interface BackgroundProcess {
|
|
3
5
|
id: string;
|
|
4
6
|
pid: number;
|
|
@@ -7,6 +9,13 @@ export interface BackgroundProcess {
|
|
|
7
9
|
startedAt: number;
|
|
8
10
|
exitCode: number | null;
|
|
9
11
|
lastReadOffset: number;
|
|
12
|
+
/**
|
|
13
|
+
* Last known size of `logFile` in bytes. Kept current by the progress
|
|
14
|
+
* watcher, the exit handler and every `readOutput`, so consumers (notably
|
|
15
|
+
* the pre-stop process gate) can tell "output was never consumed" from
|
|
16
|
+
* "output was read" without an fs stat per check.
|
|
17
|
+
*/
|
|
18
|
+
logSize: number;
|
|
10
19
|
}
|
|
11
20
|
export interface StartResult {
|
|
12
21
|
id: string;
|
|
@@ -24,13 +33,53 @@ export interface ProcessManagerOps {
|
|
|
24
33
|
kill?: typeof process.kill;
|
|
25
34
|
killProcessTree?: (pid: number) => void;
|
|
26
35
|
spawnSync?: typeof spawnSync;
|
|
36
|
+
/**
|
|
37
|
+
* Push queue for background-process progress checkpoints. When set, a long
|
|
38
|
+
* build reports progress and its exit code into the agent's next turn
|
|
39
|
+
* instead of waiting to be polled with `task_output`.
|
|
40
|
+
*/
|
|
41
|
+
notifications?: AgentNotificationQueue;
|
|
27
42
|
}
|
|
28
43
|
export declare class ProcessManager {
|
|
29
44
|
private readonly ops;
|
|
30
45
|
private processes;
|
|
31
46
|
private children;
|
|
47
|
+
/** Per-process progress timers. Cleared on exit, stop and shutdown. */
|
|
48
|
+
private watchers;
|
|
49
|
+
/** Log size at the last emitted checkpoint, so a quiet process stays quiet. */
|
|
50
|
+
private watchedSizes;
|
|
32
51
|
constructor(ops?: ProcessManagerOps);
|
|
33
|
-
start(command: string, cwd: string): Promise<StartResult>;
|
|
52
|
+
start(command: string, cwd: string, launch?: ShellResolution): Promise<StartResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Arm a backing-off, budgeted progress watcher for one background process.
|
|
55
|
+
* Emits at most one latest-only checkpoint per interval, only when the log
|
|
56
|
+
* actually grew, and at most {@link WATCH_MAX_REPORTS} times in total — so a
|
|
57
|
+
* build reports itself early without the agent ever calling `task_output`,
|
|
58
|
+
* while an idle or long-lived process stops costing context.
|
|
59
|
+
*
|
|
60
|
+
* Once the budget is spent the watcher retires completely (no timer, no
|
|
61
|
+
* further injections). The terminal exit notification is unaffected: it is
|
|
62
|
+
* produced by the exit handler, not this watcher, so "it finished" always
|
|
63
|
+
* still reaches the agent.
|
|
64
|
+
*
|
|
65
|
+
* Self-rescheduling rather than `setInterval` because the delay changes; a
|
|
66
|
+
* tick is only scheduled once the previous one has been handled.
|
|
67
|
+
*
|
|
68
|
+
* No-op when no notification queue is wired, so hosts that never drain
|
|
69
|
+
* notifications pay nothing.
|
|
70
|
+
*/
|
|
71
|
+
private armWatcher;
|
|
72
|
+
/** Stat the log once and cache its size on the record. Returns 0 if unreadable. */
|
|
73
|
+
private refreshLogSize;
|
|
74
|
+
/** Emit one progress checkpoint if the log grew. Returns whether it did. */
|
|
75
|
+
private emitProgress;
|
|
76
|
+
private notifyExit;
|
|
77
|
+
/** Read the trailing bytes of a log without loading the whole file. */
|
|
78
|
+
private readTail;
|
|
79
|
+
/** Stop and forget a process's watcher. A finished process keeps no timer. */
|
|
80
|
+
private disposeWatcher;
|
|
81
|
+
/** Live watcher ids. Exposed for leak assertions in tests. */
|
|
82
|
+
activeWatchers(): string[];
|
|
34
83
|
readOutput(id: string, fromStart?: boolean): Promise<ReadOutputResult>;
|
|
35
84
|
/**
|
|
36
85
|
* Write input to a running background process's stdin, enabling interactive
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AASpD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkDD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAWD,qBAAa,cAAc;IAQb,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,QAAQ,CAAmC;IACnD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAoD;IACpE,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAA6B;gBAEpB,GAAG,GAAE,iBAAsB;IAElD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAwDzF;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,UAAU;IAwClB,mFAAmF;YACrE,cAAc;IAS5B,4EAA4E;YAC9D,YAAY;IAoB1B,OAAO,CAAC,UAAU;IAkBlB,uEAAuE;YACzD,QAAQ;IAgBtB,8EAA8E;IAC9E,OAAO,CAAC,cAAc;IAOtB,8DAA8D;IAC9D,cAAc,IAAI,MAAM,EAAE;IAIpB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiC5E;;;;;OAKG;IACG,SAAS,CACb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAC5C,OAAO,CAAC,MAAM,CAAC;IAoCZ,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8CvC,IAAI,IAAI,iBAAiB,EAAE;IAY3B,WAAW,IAAI,IAAI;CAUpB"}
|
|
@@ -8,6 +8,50 @@ import { killProcessTree } from "../utils/process.js";
|
|
|
8
8
|
import { getSafeToolEnv } from "../tools/safe-env.js";
|
|
9
9
|
import { resolveShell } from "./shell.js";
|
|
10
10
|
const BG_DIR = path.join(os.homedir(), ".ezcoder", "bg");
|
|
11
|
+
/** Delay before a running process may first report progress. */
|
|
12
|
+
const WATCH_INTERVAL_MS = 5_000;
|
|
13
|
+
/** Ceiling on the progress interval as it backs off between reports. */
|
|
14
|
+
const WATCH_INTERVAL_MAX_MS = 120_000;
|
|
15
|
+
/**
|
|
16
|
+
* How many progress checkpoints one background process may push, ever.
|
|
17
|
+
*
|
|
18
|
+
* A progress checkpoint is worth most early ("the build is underway", "it died
|
|
19
|
+
* on startup") and approaches zero after that: a dev server the agent started
|
|
20
|
+
* itself, still logging an hour on, tells it nothing it doesn't already know
|
|
21
|
+
* and can always be inspected on demand with `task_output`.
|
|
22
|
+
*
|
|
23
|
+
* At a flat interval with no budget, such a server produced a fresh checkpoint
|
|
24
|
+
* for essentially every loop step — measured here at ~2k tokens per minute of
|
|
25
|
+
* overlap, i.e. a whole context window per hour spent restating "still
|
|
26
|
+
* running".
|
|
27
|
+
*
|
|
28
|
+
* Anthropic reached the same conclusion the hard way: Claude Code shipped
|
|
29
|
+
* periodic background status into the model's context as `task_progress` and
|
|
30
|
+
* `background_task_status` attachments, then REMOVED both (they survive only in
|
|
31
|
+
* a `LEGACY_ATTACHMENT_TYPES` list that drops them from resumed sessions).
|
|
32
|
+
* Their progress is now a host-side stream event for the UI, and the only thing
|
|
33
|
+
* pushed into context is the terminal completion notice.
|
|
34
|
+
*
|
|
35
|
+
* We keep a small early budget rather than going to zero: the first few reports
|
|
36
|
+
* are what let the agent notice a build that died on startup without blocking
|
|
37
|
+
* on it. Combined with the backoff those land at ~5s, ~15s and ~35s, after
|
|
38
|
+
* which the watcher retires and only the exit notification remains.
|
|
39
|
+
*/
|
|
40
|
+
const WATCH_MAX_REPORTS = 3;
|
|
41
|
+
/** Chars of log tail carried in a progress checkpoint. */
|
|
42
|
+
const CHECKPOINT_TAIL_CHARS = 320;
|
|
43
|
+
/** Last line(s) of the log, collapsed and bounded — never the raw log. */
|
|
44
|
+
function tailDigest(text) {
|
|
45
|
+
const collapsed = text.replace(/\s+/g, " ").trim();
|
|
46
|
+
if (!collapsed)
|
|
47
|
+
return "";
|
|
48
|
+
return collapsed.length <= CHECKPOINT_TAIL_CHARS
|
|
49
|
+
? collapsed
|
|
50
|
+
: `\u2026${collapsed.slice(collapsed.length - CHECKPOINT_TAIL_CHARS)}`;
|
|
51
|
+
}
|
|
52
|
+
function formatElapsed(ms) {
|
|
53
|
+
return ms >= 60_000 ? `${Math.round(ms / 6_000) / 10}m` : `${Math.round(ms / 1_000)}s`;
|
|
54
|
+
}
|
|
11
55
|
function stopProcessTree(pid, ops = {}) {
|
|
12
56
|
if (ops.killProcessTree) {
|
|
13
57
|
ops.killProcessTree(pid);
|
|
@@ -20,17 +64,21 @@ export class ProcessManager {
|
|
|
20
64
|
ops;
|
|
21
65
|
processes = new Map();
|
|
22
66
|
children = new Map();
|
|
67
|
+
/** Per-process progress timers. Cleared on exit, stop and shutdown. */
|
|
68
|
+
watchers = new Map();
|
|
69
|
+
/** Log size at the last emitted checkpoint, so a quiet process stays quiet. */
|
|
70
|
+
watchedSizes = new Map();
|
|
23
71
|
constructor(ops = {}) {
|
|
24
72
|
this.ops = ops;
|
|
25
73
|
}
|
|
26
|
-
async start(command, cwd) {
|
|
74
|
+
async start(command, cwd, launch) {
|
|
27
75
|
await fsp.mkdir(BG_DIR, { recursive: true });
|
|
28
76
|
const id = crypto.randomUUID().slice(0, 8);
|
|
29
77
|
const logFile = path.join(BG_DIR, `${id}.log`);
|
|
30
78
|
const fd = fs.openSync(logFile, "w");
|
|
31
79
|
// Cross-platform shell (see core/shell.ts): bash on POSIX, Git Bash on
|
|
32
80
|
// Windows, cmd.exe fallback. Same resolution as the foreground bash tool.
|
|
33
|
-
const shell = resolveShell(command);
|
|
81
|
+
const shell = launch ?? resolveShell(command);
|
|
34
82
|
const child = spawn(shell.file, shell.args, {
|
|
35
83
|
cwd,
|
|
36
84
|
detached: true,
|
|
@@ -53,15 +101,151 @@ export class ProcessManager {
|
|
|
53
101
|
startedAt: Date.now(),
|
|
54
102
|
exitCode: null,
|
|
55
103
|
lastReadOffset: 0,
|
|
104
|
+
logSize: 0,
|
|
56
105
|
};
|
|
57
106
|
this.processes.set(id, proc);
|
|
58
107
|
this.children.set(id, child);
|
|
59
108
|
child.on("close", (code) => {
|
|
60
109
|
proc.exitCode = code ?? 1;
|
|
61
110
|
this.children.delete(id);
|
|
111
|
+
this.disposeWatcher(id);
|
|
112
|
+
// Refresh unconditionally: the gate needs a final size even when no
|
|
113
|
+
// notification queue is wired and notifyExit is a no-op.
|
|
114
|
+
void this.refreshLogSize(proc).then(() => this.notifyExit(proc));
|
|
62
115
|
});
|
|
116
|
+
this.armWatcher(proc);
|
|
63
117
|
return { id, pid, logFile };
|
|
64
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Arm a backing-off, budgeted progress watcher for one background process.
|
|
121
|
+
* Emits at most one latest-only checkpoint per interval, only when the log
|
|
122
|
+
* actually grew, and at most {@link WATCH_MAX_REPORTS} times in total — so a
|
|
123
|
+
* build reports itself early without the agent ever calling `task_output`,
|
|
124
|
+
* while an idle or long-lived process stops costing context.
|
|
125
|
+
*
|
|
126
|
+
* Once the budget is spent the watcher retires completely (no timer, no
|
|
127
|
+
* further injections). The terminal exit notification is unaffected: it is
|
|
128
|
+
* produced by the exit handler, not this watcher, so "it finished" always
|
|
129
|
+
* still reaches the agent.
|
|
130
|
+
*
|
|
131
|
+
* Self-rescheduling rather than `setInterval` because the delay changes; a
|
|
132
|
+
* tick is only scheduled once the previous one has been handled.
|
|
133
|
+
*
|
|
134
|
+
* No-op when no notification queue is wired, so hosts that never drain
|
|
135
|
+
* notifications pay nothing.
|
|
136
|
+
*/
|
|
137
|
+
armWatcher(proc) {
|
|
138
|
+
const queue = this.ops.notifications;
|
|
139
|
+
if (!queue)
|
|
140
|
+
return;
|
|
141
|
+
this.watchedSizes.set(proc.id, 0);
|
|
142
|
+
let delay = WATCH_INTERVAL_MS;
|
|
143
|
+
let reports = 0;
|
|
144
|
+
const schedule = () => {
|
|
145
|
+
const timer = setTimeout(() => {
|
|
146
|
+
// The process may have exited between ticks; the terminal checkpoint
|
|
147
|
+
// owns that case and must not be overwritten by a stale progress line.
|
|
148
|
+
if (proc.exitCode !== null) {
|
|
149
|
+
this.disposeWatcher(proc.id);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
void this.emitProgress(proc).then((emitted) => {
|
|
153
|
+
// Re-check: the process can exit while the tail read is in flight,
|
|
154
|
+
// and disposeWatcher may already have cleared this entry.
|
|
155
|
+
if (proc.exitCode !== null || !this.watchers.has(proc.id))
|
|
156
|
+
return;
|
|
157
|
+
if (emitted && ++reports >= WATCH_MAX_REPORTS) {
|
|
158
|
+
// Budget spent: stop watching for good. `task_output` remains the
|
|
159
|
+
// way to inspect this process, and its exit still notifies.
|
|
160
|
+
this.disposeWatcher(proc.id);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Back off only on an actual report. A process that goes quiet must
|
|
164
|
+
// NOT drift towards the cap while emitting nothing — otherwise a dev
|
|
165
|
+
// server that idles and then fails a recompile is heard about minutes
|
|
166
|
+
// late. Silence is already free; only chattiness needs damping.
|
|
167
|
+
if (emitted)
|
|
168
|
+
delay = Math.min(delay * 2, WATCH_INTERVAL_MAX_MS);
|
|
169
|
+
schedule();
|
|
170
|
+
});
|
|
171
|
+
}, delay);
|
|
172
|
+
// Never hold the event loop open for a detached background process.
|
|
173
|
+
timer.unref?.();
|
|
174
|
+
this.watchers.set(proc.id, timer);
|
|
175
|
+
};
|
|
176
|
+
schedule();
|
|
177
|
+
}
|
|
178
|
+
/** Stat the log once and cache its size on the record. Returns 0 if unreadable. */
|
|
179
|
+
async refreshLogSize(proc) {
|
|
180
|
+
try {
|
|
181
|
+
proc.logSize = (await fsp.stat(proc.logFile)).size;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Log may be gone (pruned, or never created); keep the last known size.
|
|
185
|
+
}
|
|
186
|
+
return proc.logSize;
|
|
187
|
+
}
|
|
188
|
+
/** Emit one progress checkpoint if the log grew. Returns whether it did. */
|
|
189
|
+
async emitProgress(proc) {
|
|
190
|
+
const queue = this.ops.notifications;
|
|
191
|
+
if (!queue)
|
|
192
|
+
return false;
|
|
193
|
+
const size = await this.refreshLogSize(proc);
|
|
194
|
+
const previous = this.watchedSizes.get(proc.id) ?? 0;
|
|
195
|
+
if (size <= previous)
|
|
196
|
+
return false;
|
|
197
|
+
this.watchedSizes.set(proc.id, size);
|
|
198
|
+
if (proc.exitCode !== null)
|
|
199
|
+
return false;
|
|
200
|
+
const tail = await this.readTail(proc.logFile, size);
|
|
201
|
+
queue.enqueue("process", proc.id, `Background process ${proc.id} (${proc.command}) is still running after ` +
|
|
202
|
+
`${formatElapsed(Date.now() - proc.startedAt)}, ${size} bytes logged` +
|
|
203
|
+
`${tail ? `. Latest: ${tail}` : ""}`);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
notifyExit(proc) {
|
|
207
|
+
const queue = this.ops.notifications;
|
|
208
|
+
if (!queue)
|
|
209
|
+
return;
|
|
210
|
+
void (async () => {
|
|
211
|
+
const size = proc.logSize;
|
|
212
|
+
const tail = size > 0 ? await this.readTail(proc.logFile, size) : "";
|
|
213
|
+
queue.enqueue("process", proc.id, `Background process ${proc.id} (${proc.command}) exited with code ${proc.exitCode} ` +
|
|
214
|
+
`after ${formatElapsed(Date.now() - proc.startedAt)}` +
|
|
215
|
+
`${tail ? `. Last output: ${tail}` : ""}. ` +
|
|
216
|
+
`Read it with task_output id="${proc.id}".`, { terminal: true });
|
|
217
|
+
})();
|
|
218
|
+
}
|
|
219
|
+
/** Read the trailing bytes of a log without loading the whole file. */
|
|
220
|
+
async readTail(logFile, size) {
|
|
221
|
+
const start = Math.max(0, size - CHECKPOINT_TAIL_CHARS * 4);
|
|
222
|
+
try {
|
|
223
|
+
const fh = await fsp.open(logFile, "r");
|
|
224
|
+
try {
|
|
225
|
+
const buf = Buffer.alloc(size - start);
|
|
226
|
+
const { bytesRead } = await fh.read(buf, 0, buf.length, start);
|
|
227
|
+
return tailDigest(buf.subarray(0, bytesRead).toString("utf-8"));
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
await fh.close();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return "";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Stop and forget a process's watcher. A finished process keeps no timer. */
|
|
238
|
+
disposeWatcher(id) {
|
|
239
|
+
const timer = this.watchers.get(id);
|
|
240
|
+
if (timer)
|
|
241
|
+
clearTimeout(timer);
|
|
242
|
+
this.watchers.delete(id);
|
|
243
|
+
this.watchedSizes.delete(id);
|
|
244
|
+
}
|
|
245
|
+
/** Live watcher ids. Exposed for leak assertions in tests. */
|
|
246
|
+
activeWatchers() {
|
|
247
|
+
return [...this.watchers.keys()];
|
|
248
|
+
}
|
|
65
249
|
async readOutput(id, fromStart) {
|
|
66
250
|
const proc = this.processes.get(id);
|
|
67
251
|
if (!proc) {
|
|
@@ -76,6 +260,7 @@ export class ProcessManager {
|
|
|
76
260
|
let output = "";
|
|
77
261
|
try {
|
|
78
262
|
const stat = await fsp.stat(proc.logFile);
|
|
263
|
+
proc.logSize = stat.size;
|
|
79
264
|
if (stat.size > offset) {
|
|
80
265
|
const buf = Buffer.alloc(stat.size - offset);
|
|
81
266
|
const fh = await fsp.open(proc.logFile, "r");
|
|
@@ -180,6 +365,7 @@ export class ProcessManager {
|
|
|
180
365
|
for (const [id, proc] of this.processes) {
|
|
181
366
|
if (proc.exitCode !== null && !this.children.has(id) && proc.startedAt < cutoff) {
|
|
182
367
|
this.processes.delete(id);
|
|
368
|
+
this.disposeWatcher(id);
|
|
183
369
|
}
|
|
184
370
|
}
|
|
185
371
|
return Array.from(this.processes.values());
|
|
@@ -191,6 +377,7 @@ export class ProcessManager {
|
|
|
191
377
|
proc.exitCode = proc.exitCode ?? 1;
|
|
192
378
|
this.children.delete(id);
|
|
193
379
|
}
|
|
380
|
+
this.disposeWatcher(id);
|
|
194
381
|
}
|
|
195
382
|
}
|
|
196
383
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"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"}
|