@alan-ai-hq/agent-manager 0.1.113 → 0.1.115
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/LICENSE +88 -0
- package/dist/__tests__/binding-switch-git.test.d.ts +2 -0
- package/dist/__tests__/binding-switch-git.test.d.ts.map +1 -0
- package/dist/__tests__/binding-switch-git.test.js +555 -0
- package/dist/__tests__/binding-switch-git.test.js.map +1 -0
- package/dist/__tests__/cli-ensure-install.test.d.ts +2 -0
- package/dist/__tests__/cli-ensure-install.test.d.ts.map +1 -0
- package/dist/__tests__/cli-ensure-install.test.js +177 -0
- package/dist/__tests__/cli-ensure-install.test.js.map +1 -0
- package/dist/__tests__/cli-executable.test.d.ts +2 -0
- package/dist/__tests__/cli-executable.test.d.ts.map +1 -0
- package/dist/__tests__/cli-executable.test.js +155 -0
- package/dist/__tests__/cli-executable.test.js.map +1 -0
- package/dist/__tests__/cli-executable.windows.test.d.ts +2 -0
- package/dist/__tests__/cli-executable.windows.test.d.ts.map +1 -0
- package/dist/__tests__/cli-executable.windows.test.js +123 -0
- package/dist/__tests__/cli-executable.windows.test.js.map +1 -0
- package/dist/__tests__/cli-help.test.d.ts +2 -0
- package/dist/__tests__/cli-help.test.d.ts.map +1 -0
- package/dist/__tests__/cli-help.test.js +47 -0
- package/dist/__tests__/cli-help.test.js.map +1 -0
- package/dist/__tests__/computer-readiness.test.d.ts +2 -0
- package/dist/__tests__/computer-readiness.test.d.ts.map +1 -0
- package/dist/__tests__/computer-readiness.test.js +63 -0
- package/dist/__tests__/computer-readiness.test.js.map +1 -0
- package/dist/__tests__/core-agent-provider-auth-env.test.d.ts +2 -0
- package/dist/__tests__/core-agent-provider-auth-env.test.d.ts.map +1 -0
- package/dist/__tests__/core-agent-provider-auth-env.test.js +93 -0
- package/dist/__tests__/core-agent-provider-auth-env.test.js.map +1 -0
- package/dist/__tests__/core-agent-workflow-context.test.d.ts +2 -0
- package/dist/__tests__/core-agent-workflow-context.test.d.ts.map +1 -0
- package/dist/__tests__/core-agent-workflow-context.test.js +139 -0
- package/dist/__tests__/core-agent-workflow-context.test.js.map +1 -0
- package/dist/__tests__/daemon-native-hooks.test.d.ts +2 -0
- package/dist/__tests__/daemon-native-hooks.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-native-hooks.test.js +94 -0
- package/dist/__tests__/daemon-native-hooks.test.js.map +1 -0
- package/dist/__tests__/daemon-reconcile-ask.test.d.ts +2 -0
- package/dist/__tests__/daemon-reconcile-ask.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-reconcile-ask.test.js +100 -0
- package/dist/__tests__/daemon-reconcile-ask.test.js.map +1 -0
- package/dist/__tests__/daemon-runner-status.test.d.ts +2 -0
- package/dist/__tests__/daemon-runner-status.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-runner-status.test.js +102 -0
- package/dist/__tests__/daemon-runner-status.test.js.map +1 -0
- package/dist/__tests__/daemon-socket.integration.test.d.ts +2 -0
- package/dist/__tests__/daemon-socket.integration.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-socket.integration.test.js +435 -0
- package/dist/__tests__/daemon-socket.integration.test.js.map +1 -0
- package/dist/__tests__/daemon.test.d.ts +2 -0
- package/dist/__tests__/daemon.test.d.ts.map +1 -0
- package/dist/__tests__/daemon.test.js +4884 -0
- package/dist/__tests__/daemon.test.js.map +1 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.d.ts +2 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.d.ts.map +1 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.js +129 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.js.map +1 -0
- package/dist/__tests__/event-journal-stress.test.d.ts +2 -0
- package/dist/__tests__/event-journal-stress.test.d.ts.map +1 -0
- package/dist/__tests__/event-journal-stress.test.js +124 -0
- package/dist/__tests__/event-journal-stress.test.js.map +1 -0
- package/dist/__tests__/event-journal.test.d.ts +2 -0
- package/dist/__tests__/event-journal.test.d.ts.map +1 -0
- package/dist/__tests__/event-journal.test.js +264 -0
- package/dist/__tests__/event-journal.test.js.map +1 -0
- package/dist/__tests__/event-outbox-persist-failure.test.d.ts +2 -0
- package/dist/__tests__/event-outbox-persist-failure.test.d.ts.map +1 -0
- package/dist/__tests__/event-outbox-persist-failure.test.js +143 -0
- package/dist/__tests__/event-outbox-persist-failure.test.js.map +1 -0
- package/dist/__tests__/event-outbox.test.d.ts +2 -0
- package/dist/__tests__/event-outbox.test.d.ts.map +1 -0
- package/dist/__tests__/event-outbox.test.js +602 -0
- package/dist/__tests__/event-outbox.test.js.map +1 -0
- package/dist/__tests__/execution-activity-tracker.test.d.ts +2 -0
- package/dist/__tests__/execution-activity-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/execution-activity-tracker.test.js +64 -0
- package/dist/__tests__/execution-activity-tracker.test.js.map +1 -0
- package/dist/__tests__/execution-lease-client.test.d.ts +2 -0
- package/dist/__tests__/execution-lease-client.test.d.ts.map +1 -0
- package/dist/__tests__/execution-lease-client.test.js +274 -0
- package/dist/__tests__/execution-lease-client.test.js.map +1 -0
- package/dist/__tests__/fake-provider-cli.test.d.ts +2 -0
- package/dist/__tests__/fake-provider-cli.test.d.ts.map +1 -0
- package/dist/__tests__/fake-provider-cli.test.js +46 -0
- package/dist/__tests__/fake-provider-cli.test.js.map +1 -0
- package/dist/__tests__/generated-images.test.d.ts +2 -0
- package/dist/__tests__/generated-images.test.d.ts.map +1 -0
- package/dist/__tests__/generated-images.test.js +132 -0
- package/dist/__tests__/generated-images.test.js.map +1 -0
- package/dist/__tests__/helpers/sandbox-outbox.d.ts +3 -0
- package/dist/__tests__/helpers/sandbox-outbox.d.ts.map +1 -0
- package/dist/__tests__/helpers/sandbox-outbox.js +23 -0
- package/dist/__tests__/helpers/sandbox-outbox.js.map +1 -0
- package/dist/__tests__/install-command.test.d.ts +2 -0
- package/dist/__tests__/install-command.test.d.ts.map +1 -0
- package/dist/__tests__/install-command.test.js +185 -0
- package/dist/__tests__/install-command.test.js.map +1 -0
- package/dist/__tests__/integration-cli.test.d.ts +2 -0
- package/dist/__tests__/integration-cli.test.d.ts.map +1 -0
- package/dist/__tests__/integration-cli.test.js +150 -0
- package/dist/__tests__/integration-cli.test.js.map +1 -0
- package/dist/__tests__/lifecycle-contracts.test.d.ts +2 -0
- package/dist/__tests__/lifecycle-contracts.test.d.ts.map +1 -0
- package/dist/__tests__/lifecycle-contracts.test.js +66 -0
- package/dist/__tests__/lifecycle-contracts.test.js.map +1 -0
- package/dist/__tests__/lifecycle-logger.test.d.ts +2 -0
- package/dist/__tests__/lifecycle-logger.test.d.ts.map +1 -0
- package/dist/__tests__/lifecycle-logger.test.js +49 -0
- package/dist/__tests__/lifecycle-logger.test.js.map +1 -0
- package/dist/__tests__/local-daemon-lifecycle.test.d.ts +2 -0
- package/dist/__tests__/local-daemon-lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/local-daemon-lifecycle.test.js +594 -0
- package/dist/__tests__/local-daemon-lifecycle.test.js.map +1 -0
- package/dist/__tests__/local-git-status.test.d.ts +2 -0
- package/dist/__tests__/local-git-status.test.d.ts.map +1 -0
- package/dist/__tests__/local-git-status.test.js +31 -0
- package/dist/__tests__/local-git-status.test.js.map +1 -0
- package/dist/__tests__/mcp-config-adapters-files.test.d.ts +2 -0
- package/dist/__tests__/mcp-config-adapters-files.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-config-adapters-files.test.js +486 -0
- package/dist/__tests__/mcp-config-adapters-files.test.js.map +1 -0
- package/dist/__tests__/mcp-config-adapters.test.d.ts +2 -0
- package/dist/__tests__/mcp-config-adapters.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-config-adapters.test.js +492 -0
- package/dist/__tests__/mcp-config-adapters.test.js.map +1 -0
- package/dist/__tests__/mcp-sync.test.d.ts +2 -0
- package/dist/__tests__/mcp-sync.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-sync.test.js +21 -0
- package/dist/__tests__/mcp-sync.test.js.map +1 -0
- package/dist/__tests__/model-scan-runner.test.d.ts +2 -0
- package/dist/__tests__/model-scan-runner.test.d.ts.map +1 -0
- package/dist/__tests__/model-scan-runner.test.js +80 -0
- package/dist/__tests__/model-scan-runner.test.js.map +1 -0
- package/dist/__tests__/native-hook-command.test.d.ts +2 -0
- package/dist/__tests__/native-hook-command.test.d.ts.map +1 -0
- package/dist/__tests__/native-hook-command.test.js +386 -0
- package/dist/__tests__/native-hook-command.test.js.map +1 -0
- package/dist/__tests__/native-hook-config.test.d.ts +2 -0
- package/dist/__tests__/native-hook-config.test.d.ts.map +1 -0
- package/dist/__tests__/native-hook-config.test.js +374 -0
- package/dist/__tests__/native-hook-config.test.js.map +1 -0
- package/dist/__tests__/native-hook-drain.test.d.ts +2 -0
- package/dist/__tests__/native-hook-drain.test.d.ts.map +1 -0
- package/dist/__tests__/native-hook-drain.test.js +197 -0
- package/dist/__tests__/native-hook-drain.test.js.map +1 -0
- package/dist/__tests__/native-hook-inbox.test.d.ts +2 -0
- package/dist/__tests__/native-hook-inbox.test.d.ts.map +1 -0
- package/dist/__tests__/native-hook-inbox.test.js +139 -0
- package/dist/__tests__/native-hook-inbox.test.js.map +1 -0
- package/dist/__tests__/native-session.test.d.ts +2 -0
- package/dist/__tests__/native-session.test.d.ts.map +1 -0
- package/dist/__tests__/native-session.test.js +41 -0
- package/dist/__tests__/native-session.test.js.map +1 -0
- package/dist/__tests__/native-stream-outbox.test.d.ts +2 -0
- package/dist/__tests__/native-stream-outbox.test.d.ts.map +1 -0
- package/dist/__tests__/native-stream-outbox.test.js +231 -0
- package/dist/__tests__/native-stream-outbox.test.js.map +1 -0
- package/dist/__tests__/native-stream-platform.test.d.ts +2 -0
- package/dist/__tests__/native-stream-platform.test.d.ts.map +1 -0
- package/dist/__tests__/native-stream-platform.test.js +20 -0
- package/dist/__tests__/native-stream-platform.test.js.map +1 -0
- package/dist/__tests__/native-transcript-cursor.test.d.ts +2 -0
- package/dist/__tests__/native-transcript-cursor.test.d.ts.map +1 -0
- package/dist/__tests__/native-transcript-cursor.test.js +60 -0
- package/dist/__tests__/native-transcript-cursor.test.js.map +1 -0
- package/dist/__tests__/native-transcript-stream.test.d.ts +2 -0
- package/dist/__tests__/native-transcript-stream.test.d.ts.map +1 -0
- package/dist/__tests__/native-transcript-stream.test.js +378 -0
- package/dist/__tests__/native-transcript-stream.test.js.map +1 -0
- package/dist/__tests__/network-diagnostics.test.d.ts +2 -0
- package/dist/__tests__/network-diagnostics.test.d.ts.map +1 -0
- package/dist/__tests__/network-diagnostics.test.js +26 -0
- package/dist/__tests__/network-diagnostics.test.js.map +1 -0
- package/dist/__tests__/observable-map.test.d.ts +2 -0
- package/dist/__tests__/observable-map.test.d.ts.map +1 -0
- package/dist/__tests__/observable-map.test.js +54 -0
- package/dist/__tests__/observable-map.test.js.map +1 -0
- package/dist/__tests__/outbox-baseline.bench.test.d.ts +2 -0
- package/dist/__tests__/outbox-baseline.bench.test.d.ts.map +1 -0
- package/dist/__tests__/outbox-baseline.bench.test.js +108 -0
- package/dist/__tests__/outbox-baseline.bench.test.js.map +1 -0
- package/dist/__tests__/provider-auth-preflight.test.d.ts +2 -0
- package/dist/__tests__/provider-auth-preflight.test.d.ts.map +1 -0
- package/dist/__tests__/provider-auth-preflight.test.js +123 -0
- package/dist/__tests__/provider-auth-preflight.test.js.map +1 -0
- package/dist/__tests__/provider-model-discovery.test.d.ts +2 -0
- package/dist/__tests__/provider-model-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/provider-model-discovery.test.js +1071 -0
- package/dist/__tests__/provider-model-discovery.test.js.map +1 -0
- package/dist/__tests__/resource-diagnostics.test.d.ts +2 -0
- package/dist/__tests__/resource-diagnostics.test.d.ts.map +1 -0
- package/dist/__tests__/resource-diagnostics.test.js +138 -0
- package/dist/__tests__/resource-diagnostics.test.js.map +1 -0
- package/dist/__tests__/resume-fallback-env.test.d.ts +2 -0
- package/dist/__tests__/resume-fallback-env.test.d.ts.map +1 -0
- package/dist/__tests__/resume-fallback-env.test.js +28 -0
- package/dist/__tests__/resume-fallback-env.test.js.map +1 -0
- package/dist/__tests__/run-journal.test.d.ts +2 -0
- package/dist/__tests__/run-journal.test.d.ts.map +1 -0
- package/dist/__tests__/run-journal.test.js +121 -0
- package/dist/__tests__/run-journal.test.js.map +1 -0
- package/dist/__tests__/run-start-gate.test.d.ts +2 -0
- package/dist/__tests__/run-start-gate.test.d.ts.map +1 -0
- package/dist/__tests__/run-start-gate.test.js +18 -0
- package/dist/__tests__/run-start-gate.test.js.map +1 -0
- package/dist/__tests__/runtime-capabilities-sync.test.d.ts +2 -0
- package/dist/__tests__/runtime-capabilities-sync.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-capabilities-sync.test.js +66 -0
- package/dist/__tests__/runtime-capabilities-sync.test.js.map +1 -0
- package/dist/__tests__/runtime-config.test.d.ts +2 -0
- package/dist/__tests__/runtime-config.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-config.test.js +137 -0
- package/dist/__tests__/runtime-config.test.js.map +1 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.d.ts +2 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.js +253 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.js.map +1 -0
- package/dist/__tests__/runtime-registration.test.d.ts +2 -0
- package/dist/__tests__/runtime-registration.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-registration.test.js +109 -0
- package/dist/__tests__/runtime-registration.test.js.map +1 -0
- package/dist/__tests__/sandbox-outbox-storage.test.d.ts +2 -0
- package/dist/__tests__/sandbox-outbox-storage.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox-outbox-storage.test.js +81 -0
- package/dist/__tests__/sandbox-outbox-storage.test.js.map +1 -0
- package/dist/__tests__/sandbox-outbox.test.d.ts +2 -0
- package/dist/__tests__/sandbox-outbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox-outbox.test.js +300 -0
- package/dist/__tests__/sandbox-outbox.test.js.map +1 -0
- package/dist/__tests__/sandbox-workflow-context.test.d.ts +2 -0
- package/dist/__tests__/sandbox-workflow-context.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox-workflow-context.test.js +600 -0
- package/dist/__tests__/sandbox-workflow-context.test.js.map +1 -0
- package/dist/__tests__/service-manager-deadline.test.d.ts +2 -0
- package/dist/__tests__/service-manager-deadline.test.d.ts.map +1 -0
- package/dist/__tests__/service-manager-deadline.test.js +36 -0
- package/dist/__tests__/service-manager-deadline.test.js.map +1 -0
- package/dist/__tests__/service-manager.test.d.ts +2 -0
- package/dist/__tests__/service-manager.test.d.ts.map +1 -0
- package/dist/__tests__/service-manager.test.js +769 -0
- package/dist/__tests__/service-manager.test.js.map +1 -0
- package/dist/__tests__/service-stop-ownership.test.d.ts +2 -0
- package/dist/__tests__/service-stop-ownership.test.d.ts.map +1 -0
- package/dist/__tests__/service-stop-ownership.test.js +89 -0
- package/dist/__tests__/service-stop-ownership.test.js.map +1 -0
- package/dist/__tests__/skill-invocation.test.d.ts +2 -0
- package/dist/__tests__/skill-invocation.test.d.ts.map +1 -0
- package/dist/__tests__/skill-invocation.test.js +40 -0
- package/dist/__tests__/skill-invocation.test.js.map +1 -0
- package/dist/__tests__/sleep-inhibitor-real.test.d.ts +2 -0
- package/dist/__tests__/sleep-inhibitor-real.test.d.ts.map +1 -0
- package/dist/__tests__/sleep-inhibitor-real.test.js +68 -0
- package/dist/__tests__/sleep-inhibitor-real.test.js.map +1 -0
- package/dist/__tests__/sleep-inhibitor.test.d.ts +2 -0
- package/dist/__tests__/sleep-inhibitor.test.d.ts.map +1 -0
- package/dist/__tests__/sleep-inhibitor.test.js +236 -0
- package/dist/__tests__/sleep-inhibitor.test.js.map +1 -0
- package/dist/__tests__/status-local-workspace.test.d.ts +2 -0
- package/dist/__tests__/status-local-workspace.test.d.ts.map +1 -0
- package/dist/__tests__/status-local-workspace.test.js +121 -0
- package/dist/__tests__/status-local-workspace.test.js.map +1 -0
- package/dist/__tests__/suspension-detector.test.d.ts +2 -0
- package/dist/__tests__/suspension-detector.test.d.ts.map +1 -0
- package/dist/__tests__/suspension-detector.test.js +112 -0
- package/dist/__tests__/suspension-detector.test.js.map +1 -0
- package/dist/__tests__/web-presenter-parent-events.test.d.ts +2 -0
- package/dist/__tests__/web-presenter-parent-events.test.d.ts.map +1 -0
- package/dist/__tests__/web-presenter-parent-events.test.js +168 -0
- package/dist/__tests__/web-presenter-parent-events.test.js.map +1 -0
- package/dist/__tests__/workspace-probe-concurrency.test.d.ts +2 -0
- package/dist/__tests__/workspace-probe-concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-probe-concurrency.test.js +54 -0
- package/dist/__tests__/workspace-probe-concurrency.test.js.map +1 -0
- package/dist/__tests__/workspace-relocation.test.d.ts +2 -0
- package/dist/__tests__/workspace-relocation.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-relocation.test.js +66 -0
- package/dist/__tests__/workspace-relocation.test.js.map +1 -0
- package/dist/__tests__/workspace-rpc.test.d.ts +2 -0
- package/dist/__tests__/workspace-rpc.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-rpc.test.js +90 -0
- package/dist/__tests__/workspace-rpc.test.js.map +1 -0
- package/dist/__tests__/workspace-run-lease.test.d.ts +2 -0
- package/dist/__tests__/workspace-run-lease.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-run-lease.test.js +331 -0
- package/dist/__tests__/workspace-run-lease.test.js.map +1 -0
- package/dist/__tests__/ws-client-connection.test.d.ts +2 -0
- package/dist/__tests__/ws-client-connection.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-connection.test.js +295 -0
- package/dist/__tests__/ws-client-connection.test.js.map +1 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.d.ts +2 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.js +63 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.js.map +1 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.d.ts +2 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.js +236 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.js.map +1 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.d.ts +2 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.js +211 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.js.map +1 -0
- package/dist/antigravity-api-key-config.d.ts +2 -0
- package/dist/antigravity-api-key-config.d.ts.map +1 -0
- package/dist/antigravity-api-key-config.js +79 -0
- package/dist/antigravity-api-key-config.js.map +1 -0
- package/dist/binding-switch-git.d.ts +26 -0
- package/dist/binding-switch-git.d.ts.map +1 -0
- package/dist/binding-switch-git.js +871 -0
- package/dist/binding-switch-git.js.map +1 -0
- package/dist/cli-ensure-install.d.ts +34 -0
- package/dist/cli-ensure-install.d.ts.map +1 -0
- package/dist/cli-ensure-install.js +154 -0
- package/dist/cli-ensure-install.js.map +1 -0
- package/dist/cli-executable.d.ts +44 -0
- package/dist/cli-executable.d.ts.map +1 -0
- package/dist/cli-executable.js +435 -0
- package/dist/cli-executable.js.map +1 -0
- package/dist/cli-help.d.ts +11 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +65 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/computer-readiness.d.ts +41 -0
- package/dist/computer-readiness.d.ts.map +1 -0
- package/dist/computer-readiness.js +191 -0
- package/dist/computer-readiness.js.map +1 -0
- package/dist/core-agent.d.ts +32 -0
- package/dist/core-agent.d.ts.map +1 -0
- package/dist/core-agent.js +331 -0
- package/dist/core-agent.js.map +1 -0
- package/dist/daemon-execute.d.ts +42 -0
- package/dist/daemon-execute.d.ts.map +1 -0
- package/dist/daemon-execute.js +666 -0
- package/dist/daemon-execute.js.map +1 -0
- package/dist/daemon-helpers.d.ts +150 -0
- package/dist/daemon-helpers.d.ts.map +1 -0
- package/dist/daemon-helpers.js +157 -0
- package/dist/daemon-helpers.js.map +1 -0
- package/dist/daemon-local-control.d.ts +208 -0
- package/dist/daemon-local-control.d.ts.map +1 -0
- package/dist/daemon-local-control.js +826 -0
- package/dist/daemon-local-control.js.map +1 -0
- package/dist/daemon-local-http.d.ts +57 -0
- package/dist/daemon-local-http.d.ts.map +1 -0
- package/dist/daemon-local-http.js +375 -0
- package/dist/daemon-local-http.js.map +1 -0
- package/dist/daemon-native-hooks.d.ts +17 -0
- package/dist/daemon-native-hooks.d.ts.map +1 -0
- package/dist/daemon-native-hooks.js +54 -0
- package/dist/daemon-native-hooks.js.map +1 -0
- package/dist/daemon-provider-scan.d.ts +33 -0
- package/dist/daemon-provider-scan.d.ts.map +1 -0
- package/dist/daemon-provider-scan.js +187 -0
- package/dist/daemon-provider-scan.js.map +1 -0
- package/dist/daemon-runner-status.d.ts +164 -0
- package/dist/daemon-runner-status.d.ts.map +1 -0
- package/dist/daemon-runner-status.js +424 -0
- package/dist/daemon-runner-status.js.map +1 -0
- package/dist/daemon-start.d.ts +5 -0
- package/dist/daemon-start.d.ts.map +1 -0
- package/dist/daemon-start.js +1313 -0
- package/dist/daemon-start.js.map +1 -0
- package/dist/daemon-workspace.d.ts +36 -0
- package/dist/daemon-workspace.d.ts.map +1 -0
- package/dist/daemon-workspace.js +154 -0
- package/dist/daemon-workspace.js.map +1 -0
- package/dist/daemon.d.ts +59 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +681 -0
- package/dist/daemon.js.map +1 -0
- package/dist/event-journal-crypto.d.ts +14 -0
- package/dist/event-journal-crypto.d.ts.map +1 -0
- package/dist/event-journal-crypto.js +89 -0
- package/dist/event-journal-crypto.js.map +1 -0
- package/dist/event-journal-paths.d.ts +10 -0
- package/dist/event-journal-paths.d.ts.map +1 -0
- package/dist/event-journal-paths.js +29 -0
- package/dist/event-journal-paths.js.map +1 -0
- package/dist/event-journal-recovery.d.ts +83 -0
- package/dist/event-journal-recovery.d.ts.map +1 -0
- package/dist/event-journal-recovery.js +333 -0
- package/dist/event-journal-recovery.js.map +1 -0
- package/dist/event-journal-types.d.ts +54 -0
- package/dist/event-journal-types.d.ts.map +1 -0
- package/dist/event-journal-types.js +10 -0
- package/dist/event-journal-types.js.map +1 -0
- package/dist/event-journal-writer.d.ts +44 -0
- package/dist/event-journal-writer.d.ts.map +1 -0
- package/dist/event-journal-writer.js +182 -0
- package/dist/event-journal-writer.js.map +1 -0
- package/dist/event-outbox.d.ts +113 -0
- package/dist/event-outbox.d.ts.map +1 -0
- package/dist/event-outbox.js +707 -0
- package/dist/event-outbox.js.map +1 -0
- package/dist/execution-activity-tracker.d.ts +43 -0
- package/dist/execution-activity-tracker.d.ts.map +1 -0
- package/dist/execution-activity-tracker.js +116 -0
- package/dist/execution-activity-tracker.js.map +1 -0
- package/dist/execution-lease-client.d.ts +62 -0
- package/dist/execution-lease-client.d.ts.map +1 -0
- package/dist/execution-lease-client.js +271 -0
- package/dist/execution-lease-client.js.map +1 -0
- package/dist/fake-provider-cli.d.ts +13 -0
- package/dist/fake-provider-cli.d.ts.map +1 -0
- package/dist/fake-provider-cli.js +53 -0
- package/dist/fake-provider-cli.js.map +1 -0
- package/dist/generated-images.d.ts +2 -0
- package/dist/generated-images.d.ts.map +1 -0
- package/dist/generated-images.js +2 -0
- package/dist/generated-images.js.map +1 -0
- package/dist/index.cjs +47033 -45514
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +224 -0
- package/dist/index.js.map +1 -0
- package/dist/install-command.d.ts +2 -0
- package/dist/install-command.d.ts.map +1 -0
- package/dist/install-command.js +96 -0
- package/dist/install-command.js.map +1 -0
- package/dist/integration-cli.d.ts +14 -0
- package/dist/integration-cli.d.ts.map +1 -0
- package/dist/integration-cli.js +80 -0
- package/dist/integration-cli.js.map +1 -0
- package/dist/lifecycle-logger.d.ts +25 -0
- package/dist/lifecycle-logger.d.ts.map +1 -0
- package/dist/lifecycle-logger.js +73 -0
- package/dist/lifecycle-logger.js.map +1 -0
- package/dist/local-daemon-lifecycle.d.ts +112 -0
- package/dist/local-daemon-lifecycle.d.ts.map +1 -0
- package/dist/local-daemon-lifecycle.js +433 -0
- package/dist/local-daemon-lifecycle.js.map +1 -0
- package/dist/local-git-status.d.ts +14 -0
- package/dist/local-git-status.d.ts.map +1 -0
- package/dist/local-git-status.js +43 -0
- package/dist/local-git-status.js.map +1 -0
- package/dist/managed-mcp.d.ts +7 -0
- package/dist/managed-mcp.d.ts.map +1 -0
- package/dist/managed-mcp.js +16 -0
- package/dist/managed-mcp.js.map +1 -0
- package/dist/mcp-config-adapters.d.ts +57 -0
- package/dist/mcp-config-adapters.d.ts.map +1 -0
- package/dist/mcp-config-adapters.js +929 -0
- package/dist/mcp-config-adapters.js.map +1 -0
- package/dist/mcp-sync.d.ts +44 -0
- package/dist/mcp-sync.d.ts.map +1 -0
- package/dist/mcp-sync.js +68 -0
- package/dist/mcp-sync.js.map +1 -0
- package/dist/model-scan-runner.d.ts +15 -0
- package/dist/model-scan-runner.d.ts.map +1 -0
- package/dist/model-scan-runner.js +56 -0
- package/dist/model-scan-runner.js.map +1 -0
- package/dist/native-hook-command.d.ts +31 -0
- package/dist/native-hook-command.d.ts.map +1 -0
- package/dist/native-hook-command.js +289 -0
- package/dist/native-hook-command.js.map +1 -0
- package/dist/native-hook-config.d.ts +43 -0
- package/dist/native-hook-config.d.ts.map +1 -0
- package/dist/native-hook-config.js +601 -0
- package/dist/native-hook-config.js.map +1 -0
- package/dist/native-hook-drain.d.ts +34 -0
- package/dist/native-hook-drain.d.ts.map +1 -0
- package/dist/native-hook-drain.js +83 -0
- package/dist/native-hook-drain.js.map +1 -0
- package/dist/native-hook-inbox.d.ts +40 -0
- package/dist/native-hook-inbox.d.ts.map +1 -0
- package/dist/native-hook-inbox.js +217 -0
- package/dist/native-hook-inbox.js.map +1 -0
- package/dist/native-project-config.d.ts +11 -0
- package/dist/native-project-config.d.ts.map +1 -0
- package/dist/native-project-config.js +49 -0
- package/dist/native-project-config.js.map +1 -0
- package/dist/native-session.d.ts +20 -0
- package/dist/native-session.d.ts.map +1 -0
- package/dist/native-session.js +213 -0
- package/dist/native-session.js.map +1 -0
- package/dist/native-stream-journal.d.ts +22 -0
- package/dist/native-stream-journal.d.ts.map +1 -0
- package/dist/native-stream-journal.js +98 -0
- package/dist/native-stream-journal.js.map +1 -0
- package/dist/native-stream-outbox.d.ts +40 -0
- package/dist/native-stream-outbox.d.ts.map +1 -0
- package/dist/native-stream-outbox.js +358 -0
- package/dist/native-stream-outbox.js.map +1 -0
- package/dist/native-stream-platform.d.ts +4 -0
- package/dist/native-stream-platform.d.ts.map +1 -0
- package/dist/native-stream-platform.js +11 -0
- package/dist/native-stream-platform.js.map +1 -0
- package/dist/native-transcript-cursor.d.ts +33 -0
- package/dist/native-transcript-cursor.d.ts.map +1 -0
- package/dist/native-transcript-cursor.js +108 -0
- package/dist/native-transcript-cursor.js.map +1 -0
- package/dist/native-transcript-stream.d.ts +20 -0
- package/dist/native-transcript-stream.d.ts.map +1 -0
- package/dist/native-transcript-stream.js +438 -0
- package/dist/native-transcript-stream.js.map +1 -0
- package/dist/network-diagnostics.d.ts +8 -0
- package/dist/network-diagnostics.d.ts.map +1 -0
- package/dist/network-diagnostics.js +56 -0
- package/dist/network-diagnostics.js.map +1 -0
- package/dist/observable-map.d.ts +13 -0
- package/dist/observable-map.d.ts.map +1 -0
- package/dist/observable-map.js +30 -0
- package/dist/observable-map.js.map +1 -0
- package/dist/provider-auth-preflight.d.ts +19 -0
- package/dist/provider-auth-preflight.d.ts.map +1 -0
- package/dist/provider-auth-preflight.js +107 -0
- package/dist/provider-auth-preflight.js.map +1 -0
- package/dist/provider-model-discovery.d.ts +33 -0
- package/dist/provider-model-discovery.d.ts.map +1 -0
- package/dist/provider-model-discovery.js +731 -0
- package/dist/provider-model-discovery.js.map +1 -0
- package/dist/resource-diagnostics.d.ts +21 -0
- package/dist/resource-diagnostics.d.ts.map +1 -0
- package/dist/resource-diagnostics.js +161 -0
- package/dist/resource-diagnostics.js.map +1 -0
- package/dist/resume-fallback-env.d.ts +3 -0
- package/dist/resume-fallback-env.d.ts.map +1 -0
- package/dist/resume-fallback-env.js +14 -0
- package/dist/resume-fallback-env.js.map +1 -0
- package/dist/run-journal.d.ts +51 -0
- package/dist/run-journal.d.ts.map +1 -0
- package/dist/run-journal.js +193 -0
- package/dist/run-journal.js.map +1 -0
- package/dist/runtime-backends.d.ts +2 -0
- package/dist/runtime-backends.d.ts.map +1 -0
- package/dist/runtime-backends.js +2 -0
- package/dist/runtime-backends.js.map +1 -0
- package/dist/runtime-capabilities-sync.d.ts +40 -0
- package/dist/runtime-capabilities-sync.d.ts.map +1 -0
- package/dist/runtime-capabilities-sync.js +56 -0
- package/dist/runtime-capabilities-sync.js.map +1 -0
- package/dist/runtime-config.d.ts +26 -0
- package/dist/runtime-config.d.ts.map +1 -0
- package/dist/runtime-config.js +170 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/runtime-presenter.d.ts +81 -0
- package/dist/runtime-presenter.d.ts.map +1 -0
- package/dist/runtime-presenter.js +422 -0
- package/dist/runtime-presenter.js.map +1 -0
- package/dist/runtime-registration.d.ts +40 -0
- package/dist/runtime-registration.d.ts.map +1 -0
- package/dist/runtime-registration.js +143 -0
- package/dist/runtime-registration.js.map +1 -0
- package/dist/sandbox-outbox-storage.d.ts +13 -0
- package/dist/sandbox-outbox-storage.d.ts.map +1 -0
- package/dist/sandbox-outbox-storage.js +98 -0
- package/dist/sandbox-outbox-storage.js.map +1 -0
- package/dist/sandbox-outbox.d.ts +115 -0
- package/dist/sandbox-outbox.d.ts.map +1 -0
- package/dist/sandbox-outbox.js +213 -0
- package/dist/sandbox-outbox.js.map +1 -0
- package/dist/sandbox.d.ts +34 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +469 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/service-manager.d.ts +113 -0
- package/dist/service-manager.d.ts.map +1 -0
- package/dist/service-manager.js +1065 -0
- package/dist/service-manager.js.map +1 -0
- package/dist/skills/__tests__/local-skill-source.test.d.ts +2 -0
- package/dist/skills/__tests__/local-skill-source.test.d.ts.map +1 -0
- package/dist/skills/__tests__/local-skill-source.test.js +373 -0
- package/dist/skills/__tests__/local-skill-source.test.js.map +1 -0
- package/dist/skills/__tests__/managed-skill-store.test.d.ts +2 -0
- package/dist/skills/__tests__/managed-skill-store.test.d.ts.map +1 -0
- package/dist/skills/__tests__/managed-skill-store.test.js +114 -0
- package/dist/skills/__tests__/managed-skill-store.test.js.map +1 -0
- package/dist/skills/__tests__/runtime-skill-coordinator.test.d.ts +2 -0
- package/dist/skills/__tests__/runtime-skill-coordinator.test.d.ts.map +1 -0
- package/dist/skills/__tests__/runtime-skill-coordinator.test.js +251 -0
- package/dist/skills/__tests__/runtime-skill-coordinator.test.js.map +1 -0
- package/dist/skills/__tests__/runtime-skill-manager.test.d.ts +2 -0
- package/dist/skills/__tests__/runtime-skill-manager.test.d.ts.map +1 -0
- package/dist/skills/__tests__/runtime-skill-manager.test.js +664 -0
- package/dist/skills/__tests__/runtime-skill-manager.test.js.map +1 -0
- package/dist/skills/__tests__/skill-bundle.test.d.ts +2 -0
- package/dist/skills/__tests__/skill-bundle.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill-bundle.test.js +42 -0
- package/dist/skills/__tests__/skill-bundle.test.js.map +1 -0
- package/dist/skills/__tests__/skill-control-client.test.d.ts +2 -0
- package/dist/skills/__tests__/skill-control-client.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill-control-client.test.js +49 -0
- package/dist/skills/__tests__/skill-control-client.test.js.map +1 -0
- package/dist/skills/__tests__/skill-source-config.test.d.ts +2 -0
- package/dist/skills/__tests__/skill-source-config.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill-source-config.test.js +295 -0
- package/dist/skills/__tests__/skill-source-config.test.js.map +1 -0
- package/dist/skills/local-skill-source.d.ts +77 -0
- package/dist/skills/local-skill-source.d.ts.map +1 -0
- package/dist/skills/local-skill-source.js +660 -0
- package/dist/skills/local-skill-source.js.map +1 -0
- package/dist/skills/managed-skill-store.d.ts +44 -0
- package/dist/skills/managed-skill-store.d.ts.map +1 -0
- package/dist/skills/managed-skill-store.js +160 -0
- package/dist/skills/managed-skill-store.js.map +1 -0
- package/dist/skills/runtime-skill-coordinator.d.ts +35 -0
- package/dist/skills/runtime-skill-coordinator.d.ts.map +1 -0
- package/dist/skills/runtime-skill-coordinator.js +166 -0
- package/dist/skills/runtime-skill-coordinator.js.map +1 -0
- package/dist/skills/runtime-skill-manager.d.ts +89 -0
- package/dist/skills/runtime-skill-manager.d.ts.map +1 -0
- package/dist/skills/runtime-skill-manager.js +934 -0
- package/dist/skills/runtime-skill-manager.js.map +1 -0
- package/dist/skills/skill-bundle.d.ts +2 -0
- package/dist/skills/skill-bundle.d.ts.map +1 -0
- package/dist/skills/skill-bundle.js +2 -0
- package/dist/skills/skill-bundle.js.map +1 -0
- package/dist/skills/skill-cli.d.ts +2 -0
- package/dist/skills/skill-cli.d.ts.map +1 -0
- package/dist/skills/skill-cli.js +81 -0
- package/dist/skills/skill-cli.js.map +1 -0
- package/dist/skills/skill-control-client.d.ts +20 -0
- package/dist/skills/skill-control-client.d.ts.map +1 -0
- package/dist/skills/skill-control-client.js +56 -0
- package/dist/skills/skill-control-client.js.map +1 -0
- package/dist/skills/skill-invocation.d.ts +10 -0
- package/dist/skills/skill-invocation.d.ts.map +1 -0
- package/dist/skills/skill-invocation.js +24 -0
- package/dist/skills/skill-invocation.js.map +1 -0
- package/dist/sleep-inhibitor.d.ts +32 -0
- package/dist/sleep-inhibitor.d.ts.map +1 -0
- package/dist/sleep-inhibitor.js +297 -0
- package/dist/sleep-inhibitor.js.map +1 -0
- package/dist/suspension-detector.d.ts +24 -0
- package/dist/suspension-detector.d.ts.map +1 -0
- package/dist/suspension-detector.js +59 -0
- package/dist/suspension-detector.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/web-presenter.d.ts +52 -0
- package/dist/web-presenter.d.ts.map +1 -0
- package/dist/web-presenter.js +264 -0
- package/dist/web-presenter.js.map +1 -0
- package/dist/workspace-relocation.d.ts +22 -0
- package/dist/workspace-relocation.d.ts.map +1 -0
- package/dist/workspace-relocation.js +90 -0
- package/dist/workspace-relocation.js.map +1 -0
- package/dist/workspace-rpc.d.ts +2 -0
- package/dist/workspace-rpc.d.ts.map +1 -0
- package/dist/workspace-rpc.js +15 -0
- package/dist/workspace-rpc.js.map +1 -0
- package/dist/workspace-run-lease.d.ts +116 -0
- package/dist/workspace-run-lease.d.ts.map +1 -0
- package/dist/workspace-run-lease.js +320 -0
- package/dist/workspace-run-lease.js.map +1 -0
- package/dist/ws-client.d.ts +168 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +440 -0
- package/dist/ws-client.js.map +1 -0
- package/package.json +4 -3
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,681 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
// Desktop registers Electron powerSaveBlocker via registerSleepInhibitorBackend.
|
|
4
|
+
export { registerSleepInhibitorBackend, SLEEP_PREVENTION_DISABLED_ENV, } from "./sleep-inhibitor.js";
|
|
5
|
+
import { AGENT_VERSION } from "./version.js";
|
|
6
|
+
export { AGENT_VERSION };
|
|
7
|
+
export { ensureSharedCheckoutBranch, resolveRuntimeCwd, resolveSharedCheckoutTargets, statusLocalWorkspace, } from "./daemon-workspace.js";
|
|
8
|
+
export async function runLocalDaemonRecoveryLadder(input) {
|
|
9
|
+
const healthy = (status) => status.connected === true && !status.recovering && !status.restartRecommended;
|
|
10
|
+
const waitForRecovery = async () => {
|
|
11
|
+
const timeoutMs = input.options?.connectTimeoutMs ?? 12_000;
|
|
12
|
+
const pollMs = input.options?.pollMs ?? 500;
|
|
13
|
+
const deadline = Date.now() + timeoutMs;
|
|
14
|
+
let status = await input.getStatus();
|
|
15
|
+
while (Date.now() < deadline) {
|
|
16
|
+
if (healthy(status) || input.stopWaiting?.(status))
|
|
17
|
+
return status;
|
|
18
|
+
await sleep(pollMs);
|
|
19
|
+
status = await input.getStatus();
|
|
20
|
+
}
|
|
21
|
+
return status;
|
|
22
|
+
};
|
|
23
|
+
const needsRestartBusy = (status) => {
|
|
24
|
+
const count = input.blockingRunCount(status);
|
|
25
|
+
return {
|
|
26
|
+
...status,
|
|
27
|
+
activeRunCount: count,
|
|
28
|
+
recoveryCode: "needs_restart_busy",
|
|
29
|
+
error: `Connection is broken and fixing it will interrupt ${count} active run${count === 1 ? "" : "s"}`,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
let status = input.initialStatus;
|
|
33
|
+
if (healthy(status) || input.stopWaiting?.(status))
|
|
34
|
+
return status;
|
|
35
|
+
if (await input.redial().catch(() => false)) {
|
|
36
|
+
status = await waitForRecovery();
|
|
37
|
+
if (healthy(status) || input.stopWaiting?.(status))
|
|
38
|
+
return status;
|
|
39
|
+
}
|
|
40
|
+
if (input.blockingRunCount(status) > 0)
|
|
41
|
+
return needsRestartBusy(status);
|
|
42
|
+
try {
|
|
43
|
+
status = await input.restart();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
...status,
|
|
48
|
+
recoveryCode: "daemon_recovery_failed",
|
|
49
|
+
error: error instanceof Error ? error.message : "Local daemon restart failed",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (healthy(status) || input.stopWaiting?.(status))
|
|
53
|
+
return status;
|
|
54
|
+
if (input.blockingRunCount(status) > 0)
|
|
55
|
+
return needsRestartBusy(status);
|
|
56
|
+
status = await waitForRecovery();
|
|
57
|
+
if (healthy(status) || input.stopWaiting?.(status))
|
|
58
|
+
return status;
|
|
59
|
+
if (input.blockingRunCount(status) > 0)
|
|
60
|
+
return needsRestartBusy(status);
|
|
61
|
+
return {
|
|
62
|
+
...status,
|
|
63
|
+
recoveryCode: "daemon_recovery_failed",
|
|
64
|
+
error: "The local daemon exhausted its reconnect and safe-restart recovery budget.",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export { acquireDeviceAuthorizationOperation, acquireLocalDaemonMaintenanceLease, acquireLocalDaemonOwnerLease, adoptConfiguredLocalDaemon, adoptLocalDaemonControl, assertDeviceAuthorizationOperationOwner, bindConfigPath, clearPendingDeviceAuthorization, clearPendingSetupIntent, describeOccupiedLocalDaemon, deviceAuthorizationOperationPath, equalHexDigest, extendDeviceAuthorizationOperation, getConfigPath, getEndpointDefaultsPath, getLocalApiPort, getOrCreateSetupAttemptId, inspectLocalDaemonRunJournal, isLocalDaemonListening, isNativeTaskLinkingEnabled, LOCAL_SERVICE_CHALLENGE_TTL_MS, LOCAL_SERVICE_OWNER_VERSION, localServiceOwnerPayload, observeLocalDaemonEndpoint, parseLocalServiceOwner, probeLocalDaemon, probeLocalDaemonEndpoint, readConfig, readConfigForRegistration, readEndpointDefaults, readLocalDaemonMaintenanceLease, readLocalDaemonOwnerLease, readPendingDeviceAuthorization, releaseLocalDaemonMaintenanceLease, releaseLocalDaemonOwnerLease, releaseOwnedJsonFile, removeAlanOwnedLocalArtifacts, signLocalServiceAdoption, signLocalServiceOwner, updateLocalDaemonOwnerEndpoint, writeConfig, writePendingDeviceAuthorization, } from "./daemon-local-control.js";
|
|
68
|
+
import { acquireDeviceAuthorizationOperation, adoptConfiguredLocalDaemon, assertDeviceAuthorizationOperationOwner, bindConfigPath, clearPendingDeviceAuthorization, clearPendingSetupIntent, deviceAuthorizationOperationPath, extendDeviceAuthorizationOperation, getConfigPath, getLocalApiPort, probeLocalDaemon, probeLocalDaemonEndpoint, readConfig, readConfigForRegistration, readLocalDaemonOwnerLease, readPendingDeviceAuthorization, releaseOwnedJsonFile, removeAlanOwnedLocalArtifacts, requestLocalDaemonShutdown, writeConfig, writePendingDeviceAuthorization, } from "./daemon-local-control.js";
|
|
69
|
+
export { argValue, checkStoredEndpointConsistency, correlationLogFields, isLocalEndpoint, LOCAL_API_URL, LOCAL_WS_URL, PRODUCTION_API_URL, PRODUCTION_WS_URL, resolveEndpointProfile, resolveEndpoints, resolveWorkspaceRunLeaseTargets, STAGING_API_URL, STAGING_WS_URL, scheduleRuntimeModelScan, sleep, } from "./daemon-helpers.js";
|
|
70
|
+
import { argValue, isLocalEndpoint, resolveEndpoints, sleep } from "./daemon-helpers.js";
|
|
71
|
+
export { startDaemon } from "./daemon-start.js";
|
|
72
|
+
export { addSkillSource } from "./skills/local-skill-source.js";
|
|
73
|
+
import { startDaemon } from "./daemon-start.js";
|
|
74
|
+
export { discoverCapabilities, normalizeBackendKind, printScanModels, refreshProviderAuthStates, refreshProviderModels, refreshProviderVersions, scanAgentCapabilities, VERSION_REFRESH_INTERVAL_MS, } from "./daemon-provider-scan.js";
|
|
75
|
+
import { discoverCapabilities } from "./daemon-provider-scan.js";
|
|
76
|
+
export { abortActiveAgent, buildAbortResult, buildActiveRunSlots, buildRunnerStatusPayload, collectRuntimeMetadata, collectRuntimeMetadataWithProviderLimits, DurablePendingRunStarts, flushPendingDeliveryLostEvents, isProviderProcessAlive, PENDING_RUN_START_TTL_MS, RUNNER_RECOVERY_GRACE_MS_LOCAL, reconcileActiveRuns, resolveRuntimeMaxActiveRuns, summarizeRunnerStatus, } from "./daemon-runner-status.js";
|
|
77
|
+
export { EVENT_JOURNAL_ORDINARY_BATCH_MS, EVENT_JOURNAL_SEGMENT_BYTES, EVENT_JOURNAL_VERSION, } from "./event-journal-types.js";
|
|
78
|
+
export { createLocalDaemonLifecycle, endpointObservationPresentation, hostAllowsReplacementConsideration, identitiesMatch, identityFromObservation, } from "./local-daemon-lifecycle.js";
|
|
79
|
+
import { collectRuntimeMetadataWithProviderLimits } from "./daemon-runner-status.js";
|
|
80
|
+
import { createRuntimeSetupGrant, exchangeRuntimeSetupGrant, handoffRuntimeSetupGrant, RuntimeSetupGrantExpiredError, } from "./runtime-registration.js";
|
|
81
|
+
export { buildApplicationRunFailure, DELIVERY_LOST_ERROR, RuntimePresenter, } from "./runtime-presenter.js";
|
|
82
|
+
function writeRegisteredRuntimeConfig(args, previousConfig, registered) {
|
|
83
|
+
writeConfig({
|
|
84
|
+
...registered,
|
|
85
|
+
localApiPort: getLocalApiPort(args, {}),
|
|
86
|
+
localApiToken: previousConfig.localApiToken ?? randomBytes(24).toString("hex"),
|
|
87
|
+
localServiceId: previousConfig.localServiceId ?? randomUUID(),
|
|
88
|
+
localServiceSecret: previousConfig.localServiceSecret ?? randomBytes(32).toString("base64url"),
|
|
89
|
+
eventSpoolKey: previousConfig.eventSpoolKey ?? randomBytes(32).toString("base64url"),
|
|
90
|
+
daemonEpoch: previousConfig.daemonEpoch,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export async function setupDaemon(args, options = {}) {
|
|
94
|
+
const { signal } = options;
|
|
95
|
+
signal?.throwIfAborted();
|
|
96
|
+
bindConfigPath(args);
|
|
97
|
+
const previousConfig = readConfigForRegistration();
|
|
98
|
+
const { apiUrl, wsUrl, endpointProfile } = resolveEndpoints(args);
|
|
99
|
+
const teamId = argValue(args, "--team") ?? process.env.ALAN_TEAM_ID;
|
|
100
|
+
const setupToken = argValue(args, "--setup-token") ?? process.env.ALAN_RUNTIME_SETUP_TOKEN;
|
|
101
|
+
const token = argValue(args, "--token") ?? process.env.ALAN_SETUP_TOKEN;
|
|
102
|
+
const displayName = argValue(args, "--name") ?? hostname();
|
|
103
|
+
const scope = argValue(args, "--scope") ?? process.env.ALAN_RUNTIME_SCOPE ?? (setupToken ? "team" : "user");
|
|
104
|
+
const installationId = argValue(args, "--installation-id") ?? previousConfig.installationId ?? randomUUID();
|
|
105
|
+
if (scope !== "team" && scope !== "user") {
|
|
106
|
+
throw new Error("setup --scope must be either 'team' or 'user'");
|
|
107
|
+
}
|
|
108
|
+
if (!setupToken && !token) {
|
|
109
|
+
throw new Error("setup requires --setup-token <token> or --token <Alan access token>.\n" +
|
|
110
|
+
"For normal setup, copy the setup token from Alan and run: alan-agent setup --setup-token <token>\n" +
|
|
111
|
+
"For browser authorization, run: alan-agent login");
|
|
112
|
+
}
|
|
113
|
+
const registrationGrant = setupToken ??
|
|
114
|
+
(await createRuntimeSetupGrant({
|
|
115
|
+
apiUrl,
|
|
116
|
+
accessToken: token,
|
|
117
|
+
scope: scope,
|
|
118
|
+
teamId,
|
|
119
|
+
}, signal));
|
|
120
|
+
const setup = {
|
|
121
|
+
apiUrl,
|
|
122
|
+
wsUrl,
|
|
123
|
+
endpointProfile,
|
|
124
|
+
setupToken: registrationGrant,
|
|
125
|
+
teamId,
|
|
126
|
+
displayName,
|
|
127
|
+
installationId,
|
|
128
|
+
};
|
|
129
|
+
signal?.throwIfAborted();
|
|
130
|
+
let liveConfig = previousConfig;
|
|
131
|
+
const localApiPort = getLocalApiPort(args, liveConfig);
|
|
132
|
+
let live = liveConfig.localApiToken
|
|
133
|
+
? await probeLocalDaemon(localApiPort, liveConfig.localApiToken)
|
|
134
|
+
: null;
|
|
135
|
+
signal?.throwIfAborted();
|
|
136
|
+
if (!live && liveConfig.localServiceId && liveConfig.localServiceSecret) {
|
|
137
|
+
live = await adoptConfiguredLocalDaemon(args);
|
|
138
|
+
liveConfig = readConfigForRegistration();
|
|
139
|
+
}
|
|
140
|
+
signal?.throwIfAborted();
|
|
141
|
+
if (live) {
|
|
142
|
+
if (!liveConfig.localApiToken) {
|
|
143
|
+
throw new Error("running daemon could not be authenticated for credential setup");
|
|
144
|
+
}
|
|
145
|
+
// Endpoint flags bootstrap a fresh machine. An already-running daemon keeps
|
|
146
|
+
// its bound endpoints so a public setup URL cannot redirect a local desktop.
|
|
147
|
+
const liveSetup = {
|
|
148
|
+
...setup,
|
|
149
|
+
apiUrl: liveConfig.apiUrl ?? setup.apiUrl,
|
|
150
|
+
wsUrl: liveConfig.wsUrl ?? setup.wsUrl,
|
|
151
|
+
endpointProfile: liveConfig.endpointProfile ?? setup.endpointProfile,
|
|
152
|
+
};
|
|
153
|
+
const body = await handoffRuntimeSetupGrant({
|
|
154
|
+
port: localApiPort,
|
|
155
|
+
localApiToken: liveConfig.localApiToken,
|
|
156
|
+
setup: liveSetup,
|
|
157
|
+
signal,
|
|
158
|
+
});
|
|
159
|
+
signal?.throwIfAborted();
|
|
160
|
+
console.info("[alan-agent] Runtime credentials adopted by running daemon", {
|
|
161
|
+
runtimeId: body.runtimeId,
|
|
162
|
+
credentialGeneration: body.credentialGeneration,
|
|
163
|
+
configPath: getConfigPath(),
|
|
164
|
+
});
|
|
165
|
+
return body.runtimeId !== liveConfig.runtimeId;
|
|
166
|
+
}
|
|
167
|
+
if (readLocalDaemonOwnerLease(getConfigPath())) {
|
|
168
|
+
throw new Error("the daemon still owns this runtime configuration, but its authenticated local API is unreachable; recover or stop the daemon before running setup again");
|
|
169
|
+
}
|
|
170
|
+
let body;
|
|
171
|
+
try {
|
|
172
|
+
body = await exchangeRuntimeSetupGrant(setup, signal);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
signal?.throwIfAborted();
|
|
176
|
+
if (setupToken && error instanceof RuntimeSetupGrantExpiredError) {
|
|
177
|
+
if (signal) {
|
|
178
|
+
throw new Error("Setup link expired. Run alan-agent login to authorize in your browser.");
|
|
179
|
+
}
|
|
180
|
+
console.info("[alan-agent] Setup link expired; continuing with browser authorization");
|
|
181
|
+
await loginWithDeviceCode(args);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
signal?.throwIfAborted();
|
|
187
|
+
writeRegisteredRuntimeConfig(args, previousConfig, {
|
|
188
|
+
apiUrl,
|
|
189
|
+
wsUrl,
|
|
190
|
+
endpointProfile,
|
|
191
|
+
runtimeId: body.runtimeId,
|
|
192
|
+
runtimeToken: body.runtimeToken,
|
|
193
|
+
runtimeRenewalToken: body.runtimeRenewalToken,
|
|
194
|
+
runtimeTokenExpiresAt: body.runtimeTokenExpiresAt,
|
|
195
|
+
displayName: body.displayName,
|
|
196
|
+
installationId,
|
|
197
|
+
});
|
|
198
|
+
clearPendingSetupIntent();
|
|
199
|
+
console.info("[alan-agent] Runtime registered", {
|
|
200
|
+
runtimeId: body.runtimeId,
|
|
201
|
+
configPath: getConfigPath(),
|
|
202
|
+
});
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
export async function loginWithDeviceCode(args) {
|
|
206
|
+
bindConfigPath(args);
|
|
207
|
+
const operation = acquireDeviceAuthorizationOperation();
|
|
208
|
+
if (!operation) {
|
|
209
|
+
throw new Error("browser authorization is already in progress in another Alan process; finish or cancel it first");
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
if (args.includes("--cancel")) {
|
|
213
|
+
clearPendingDeviceAuthorization();
|
|
214
|
+
console.info("[alan-agent] Browser authorization canceled");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const previousConfig = readConfigForRegistration();
|
|
218
|
+
const { apiUrl, wsUrl, endpointProfile } = resolveEndpoints(args);
|
|
219
|
+
const displayName = argValue(args, "--name") ?? hostname();
|
|
220
|
+
const maxPolls = Number.parseInt(argValue(args, "--max-polls") ?? "300", 10);
|
|
221
|
+
const resumed = readPendingDeviceAuthorization(apiUrl);
|
|
222
|
+
const installationId = resumed?.installationId ?? previousConfig.installationId ?? randomUUID();
|
|
223
|
+
let authorization = resumed
|
|
224
|
+
? { ...resumed, operationId: operation.id }
|
|
225
|
+
: null;
|
|
226
|
+
if (!authorization) {
|
|
227
|
+
// This process owns the operation lease, so an invalid/expired abandoned
|
|
228
|
+
// sidecar can be removed before starting a replacement authorization.
|
|
229
|
+
clearPendingDeviceAuthorization();
|
|
230
|
+
const start = await fetch(`${apiUrl}/public/runtimes/device-authorizations`, {
|
|
231
|
+
method: "POST",
|
|
232
|
+
headers: { "content-type": "application/json" },
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
displayName,
|
|
235
|
+
hostname: hostname(),
|
|
236
|
+
capabilities: discoverCapabilities(),
|
|
237
|
+
metadata: {
|
|
238
|
+
...(await collectRuntimeMetadataWithProviderLimits()),
|
|
239
|
+
installationId,
|
|
240
|
+
},
|
|
241
|
+
}),
|
|
242
|
+
signal: AbortSignal.timeout(30_000),
|
|
243
|
+
});
|
|
244
|
+
if (!start.ok) {
|
|
245
|
+
throw new Error(`device authorization failed: ${start.status} ${await start.text()}`);
|
|
246
|
+
}
|
|
247
|
+
const started = (await start.json());
|
|
248
|
+
authorization = {
|
|
249
|
+
...started,
|
|
250
|
+
apiUrl,
|
|
251
|
+
installationId,
|
|
252
|
+
operationId: operation.id,
|
|
253
|
+
intervalSeconds: Math.max(0, started.intervalSeconds ?? 2),
|
|
254
|
+
};
|
|
255
|
+
if (!Number.isFinite(Date.parse(authorization.expiresAt))) {
|
|
256
|
+
throw new Error("device authorization returned an invalid expiry");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.info("[alan-agent] Resuming browser authorization");
|
|
261
|
+
}
|
|
262
|
+
// Keep exclusive ownership through the authorization's complete lifetime,
|
|
263
|
+
// including a grace window for the final token exchange and config write.
|
|
264
|
+
extendDeviceAuthorizationOperation(operation.id, Date.parse(authorization.expiresAt) + 60_000);
|
|
265
|
+
writePendingDeviceAuthorization(authorization);
|
|
266
|
+
const intervalMs = authorization.intervalSeconds * 1000;
|
|
267
|
+
console.info(`[alan-agent] Open ${authorization.verificationUri}`);
|
|
268
|
+
console.info(`[alan-agent] Enter code ${authorization.userCode}`);
|
|
269
|
+
for (let attempt = 0; attempt < maxPolls; attempt += 1) {
|
|
270
|
+
if (attempt > 0)
|
|
271
|
+
await sleep(intervalMs);
|
|
272
|
+
if (Date.parse(authorization.expiresAt) <= Date.now()) {
|
|
273
|
+
clearPendingDeviceAuthorization(operation.id);
|
|
274
|
+
throw new Error("device authorization expired before approval; run alan-agent login again");
|
|
275
|
+
}
|
|
276
|
+
assertDeviceAuthorizationOperationOwner(operation.id);
|
|
277
|
+
const token = await fetch(`${apiUrl}/public/runtimes/device-authorizations/token`, {
|
|
278
|
+
method: "POST",
|
|
279
|
+
headers: { "content-type": "application/json" },
|
|
280
|
+
body: JSON.stringify({ deviceCode: authorization.deviceCode }),
|
|
281
|
+
signal: AbortSignal.timeout(30_000),
|
|
282
|
+
});
|
|
283
|
+
if (token.status === 428)
|
|
284
|
+
continue;
|
|
285
|
+
if (!token.ok) {
|
|
286
|
+
if (token.status === 400 || token.status === 401) {
|
|
287
|
+
clearPendingDeviceAuthorization(operation.id);
|
|
288
|
+
}
|
|
289
|
+
throw new Error(`device authorization token exchange failed: ${token.status} ${await token.text()}`);
|
|
290
|
+
}
|
|
291
|
+
const body = (await token.json());
|
|
292
|
+
assertDeviceAuthorizationOperationOwner(operation.id);
|
|
293
|
+
const ownedPending = readPendingDeviceAuthorization(apiUrl);
|
|
294
|
+
if (ownedPending?.operationId !== operation.id) {
|
|
295
|
+
throw new Error("browser authorization sidecar ownership was lost before finalization");
|
|
296
|
+
}
|
|
297
|
+
writeRegisteredRuntimeConfig(args, previousConfig, {
|
|
298
|
+
apiUrl,
|
|
299
|
+
wsUrl,
|
|
300
|
+
endpointProfile,
|
|
301
|
+
runtimeId: body.runtime.id,
|
|
302
|
+
runtimeToken: body.runtimeToken,
|
|
303
|
+
runtimeRenewalToken: body.runtimeRenewalToken,
|
|
304
|
+
runtimeTokenExpiresAt: body.runtimeTokenExpiresAt,
|
|
305
|
+
displayName: body.runtime.displayName ?? displayName,
|
|
306
|
+
installationId,
|
|
307
|
+
});
|
|
308
|
+
clearPendingDeviceAuthorization(operation.id);
|
|
309
|
+
console.info("[alan-agent] Runtime registered", {
|
|
310
|
+
runtimeId: body.runtime.id,
|
|
311
|
+
configPath: getConfigPath(),
|
|
312
|
+
});
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
throw new Error("device authorization timed out before approval");
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
releaseOwnedJsonFile(deviceAuthorizationOperationPath(), operation.id);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
export async function stopDaemon(args) {
|
|
322
|
+
bindConfigPath(args);
|
|
323
|
+
const stored = readConfig();
|
|
324
|
+
const localApiPort = getLocalApiPort(args, stored);
|
|
325
|
+
let localApiToken = stored.localApiToken;
|
|
326
|
+
let probe = localApiToken
|
|
327
|
+
? await probeLocalDaemonEndpoint(localApiPort, localApiToken)
|
|
328
|
+
: { state: "listening_unauthorized" };
|
|
329
|
+
if (!localApiToken || probe.state === "listening_unauthorized") {
|
|
330
|
+
const adopted = await adoptConfiguredLocalDaemon(args);
|
|
331
|
+
if (adopted) {
|
|
332
|
+
localApiToken = readConfig().localApiToken;
|
|
333
|
+
probe = { state: "running", status: adopted };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (!localApiToken)
|
|
337
|
+
throw new Error("No local API token in config. Run setup or login first.");
|
|
338
|
+
if (probe.state === "listening_unauthorized") {
|
|
339
|
+
throw new Error(`Daemon is listening on port ${localApiPort} but rejected this config token. ` +
|
|
340
|
+
"Quit Alan desktop or rerun setup/login to refresh config.");
|
|
341
|
+
}
|
|
342
|
+
if (probe.state === "absent") {
|
|
343
|
+
console.info("[alan-agent] No daemon listening", { port: localApiPort });
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const response = await requestLocalDaemonShutdown(localApiPort, localApiToken);
|
|
347
|
+
if (!response.ok) {
|
|
348
|
+
throw new Error(`Failed to stop daemon: HTTP ${response.status}`);
|
|
349
|
+
}
|
|
350
|
+
console.info("[alan-agent] Daemon stopped", {
|
|
351
|
+
port: localApiPort,
|
|
352
|
+
runtimeId: probe.status.runtimeId,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
export async function runDaemon(args) {
|
|
356
|
+
bindConfigPath(args);
|
|
357
|
+
const stored = readConfig();
|
|
358
|
+
const localApiPort = getLocalApiPort(args, stored);
|
|
359
|
+
const localApiToken = stored.localApiToken;
|
|
360
|
+
const existingProbe = await probeLocalDaemonEndpoint(localApiPort, localApiToken);
|
|
361
|
+
if (existingProbe.state === "running") {
|
|
362
|
+
console.info("[alan-agent] Daemon already running", {
|
|
363
|
+
port: localApiPort,
|
|
364
|
+
runtimeId: existingProbe.status.runtimeId,
|
|
365
|
+
connected: existingProbe.status.connected,
|
|
366
|
+
hint: "If Alan desktop is open, it manages the daemon automatically.",
|
|
367
|
+
});
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (existingProbe.state === "listening_unauthorized") {
|
|
371
|
+
const adopted = await adoptConfiguredLocalDaemon(args);
|
|
372
|
+
if (adopted) {
|
|
373
|
+
console.info("[alan-agent] Daemon already running", {
|
|
374
|
+
port: localApiPort,
|
|
375
|
+
runtimeId: adopted.runtimeId,
|
|
376
|
+
connected: adopted.connected,
|
|
377
|
+
adopted: true,
|
|
378
|
+
});
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
console.info("[alan-agent] Daemon already running", {
|
|
382
|
+
port: localApiPort,
|
|
383
|
+
hint: `Alan desktop is using a different local API token than ${getConfigPath()}. Quit the desktop app or rerun setup if you need a fresh daemon.`,
|
|
384
|
+
});
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const controller = await startDaemon(args);
|
|
388
|
+
const shutdown = (reason) => {
|
|
389
|
+
void controller.stop().then(() => process.exit(daemonExternalStopExitCode(reason)), (error) => {
|
|
390
|
+
console.error("[alan-agent] Shutdown failed; retaining daemon ownership", error);
|
|
391
|
+
process.exitCode = 1;
|
|
392
|
+
});
|
|
393
|
+
};
|
|
394
|
+
controller.whenExternallyStopped = shutdown;
|
|
395
|
+
process.on("SIGINT", shutdown);
|
|
396
|
+
process.on("SIGTERM", shutdown);
|
|
397
|
+
if (process.send) {
|
|
398
|
+
process.once("disconnect", shutdown);
|
|
399
|
+
process.on("message", (message) => {
|
|
400
|
+
if (message &&
|
|
401
|
+
typeof message === "object" &&
|
|
402
|
+
"type" in message &&
|
|
403
|
+
message.type === "alan-daemon-stop")
|
|
404
|
+
shutdown();
|
|
405
|
+
});
|
|
406
|
+
if (!process.connected)
|
|
407
|
+
shutdown();
|
|
408
|
+
else
|
|
409
|
+
process.send({
|
|
410
|
+
type: "alan-daemon-ready",
|
|
411
|
+
runtimeId: controller.runtimeId,
|
|
412
|
+
wsUrl: controller.wsUrl,
|
|
413
|
+
localApiPort: controller.localApiPort,
|
|
414
|
+
localApiToken: controller.localApiToken,
|
|
415
|
+
}, (error) => {
|
|
416
|
+
if (error)
|
|
417
|
+
shutdown();
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
await new Promise(() => { });
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Native service plans restart failed processes, but a regular shutdown is
|
|
424
|
+
* intentional. An identity handoff needs the former so the replacement reads
|
|
425
|
+
* the newly committed credentials without requiring a manual restart.
|
|
426
|
+
*/
|
|
427
|
+
export function daemonExternalStopExitCode(reason) {
|
|
428
|
+
return reason === "runtime_identity_changed" ? 1 : 0;
|
|
429
|
+
}
|
|
430
|
+
export async function recoverDaemonConnection(args = [], options) {
|
|
431
|
+
bindConfigPath(args);
|
|
432
|
+
const getStatus = async () => {
|
|
433
|
+
const config = readConfig();
|
|
434
|
+
const localApiPort = getLocalApiPort(args, config);
|
|
435
|
+
let live = config.localApiToken
|
|
436
|
+
? await probeLocalDaemon(localApiPort, config.localApiToken)
|
|
437
|
+
: null;
|
|
438
|
+
if (!live && config.localServiceId && config.localServiceSecret) {
|
|
439
|
+
live = await adoptConfiguredLocalDaemon(args);
|
|
440
|
+
}
|
|
441
|
+
if (live)
|
|
442
|
+
return { ...live, running: true };
|
|
443
|
+
return {
|
|
444
|
+
configured: Boolean(config.runtimeId && config.runtimeToken && config.wsUrl),
|
|
445
|
+
running: false,
|
|
446
|
+
connected: false,
|
|
447
|
+
activeRunCount: 0,
|
|
448
|
+
activeRunIds: [],
|
|
449
|
+
staleRunCount: 0,
|
|
450
|
+
};
|
|
451
|
+
};
|
|
452
|
+
const initialStatus = await getStatus();
|
|
453
|
+
const recovered = await runLocalDaemonRecoveryLadder({
|
|
454
|
+
initialStatus,
|
|
455
|
+
getStatus,
|
|
456
|
+
redial: async () => {
|
|
457
|
+
const config = readConfig();
|
|
458
|
+
if (!config.localApiToken)
|
|
459
|
+
return false;
|
|
460
|
+
const localApiPort = getLocalApiPort(args, config);
|
|
461
|
+
const response = await fetch(`http://127.0.0.1:${localApiPort}/reconnect`, {
|
|
462
|
+
method: "POST",
|
|
463
|
+
headers: { authorization: `Bearer ${config.localApiToken}` },
|
|
464
|
+
signal: AbortSignal.timeout(5000),
|
|
465
|
+
});
|
|
466
|
+
return response.ok;
|
|
467
|
+
},
|
|
468
|
+
restart: async () => {
|
|
469
|
+
const beforeRestart = await getStatus();
|
|
470
|
+
const blockingRunCount = beforeRestart.activeRunCount ??
|
|
471
|
+
Math.max(0, (beforeRestart.activeRunIds?.length ?? 0) - (beforeRestart.staleRunCount ?? 0));
|
|
472
|
+
if (blockingRunCount > 0)
|
|
473
|
+
return beforeRestart;
|
|
474
|
+
if (beforeRestart.running) {
|
|
475
|
+
await stopDaemon(args);
|
|
476
|
+
for (let attempt = 0; attempt < 50; attempt += 1) {
|
|
477
|
+
await sleep(50);
|
|
478
|
+
if (!(await getStatus()).running)
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
if ((await getStatus()).running) {
|
|
482
|
+
throw new Error("The existing local daemon did not stop within the recovery budget.");
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
await startDaemon(args);
|
|
486
|
+
return getStatus();
|
|
487
|
+
},
|
|
488
|
+
blockingRunCount: (status) => status.activeRunCount ??
|
|
489
|
+
Math.max(0, (status.activeRunIds?.length ?? 0) - (status.staleRunCount ?? 0)),
|
|
490
|
+
options,
|
|
491
|
+
});
|
|
492
|
+
console.info(JSON.stringify({ recovery: recovered }, null, 2));
|
|
493
|
+
return recovered;
|
|
494
|
+
}
|
|
495
|
+
async function drainAndStopLocalDaemonBeforeCredentialCleanup(args, stored) {
|
|
496
|
+
const localApiPort = getLocalApiPort(args, stored);
|
|
497
|
+
let localApiToken = stored.localApiToken;
|
|
498
|
+
let probe = await probeLocalDaemonEndpoint(localApiPort, localApiToken);
|
|
499
|
+
if (probe.state === "listening_unauthorized") {
|
|
500
|
+
const adopted = await adoptConfiguredLocalDaemon(args);
|
|
501
|
+
if (adopted) {
|
|
502
|
+
localApiToken = readConfig().localApiToken;
|
|
503
|
+
probe = { state: "running", status: adopted };
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (probe.state === "absent")
|
|
507
|
+
return;
|
|
508
|
+
if (probe.state === "listening_unauthorized" || !localApiToken) {
|
|
509
|
+
throw new Error(`Logout cannot verify the local daemon on port ${localApiPort}. Stop the local service before removing credentials.`);
|
|
510
|
+
}
|
|
511
|
+
const prepare = await fetch(`http://127.0.0.1:${localApiPort}/prepare_logout`, {
|
|
512
|
+
method: "POST",
|
|
513
|
+
headers: { authorization: `Bearer ${localApiToken}` },
|
|
514
|
+
signal: AbortSignal.timeout(5000),
|
|
515
|
+
});
|
|
516
|
+
if (prepare.status === 409) {
|
|
517
|
+
const body = (await prepare.json().catch(() => ({})));
|
|
518
|
+
const activeRunCount = typeof body.activeRunCount === "number" && Number.isSafeInteger(body.activeRunCount)
|
|
519
|
+
? Math.max(1, body.activeRunCount)
|
|
520
|
+
: 1;
|
|
521
|
+
throw new Error(`Logout is deferred while ${activeRunCount} active run${activeRunCount === 1 ? "" : "s"} finish. New runs are paused; retry logout afterward.`);
|
|
522
|
+
}
|
|
523
|
+
if (!prepare.ok) {
|
|
524
|
+
throw new Error(`Logout could not safely drain the local daemon (HTTP ${prepare.status}). Stop or update the local service before removing credentials.`);
|
|
525
|
+
}
|
|
526
|
+
const shutdown = await requestLocalDaemonShutdown(localApiPort, localApiToken);
|
|
527
|
+
if (!shutdown.ok) {
|
|
528
|
+
throw new Error(`Logout could not stop the local daemon (HTTP ${shutdown.status}).`);
|
|
529
|
+
}
|
|
530
|
+
for (let attempt = 0; attempt < 50; attempt += 1) {
|
|
531
|
+
await sleep(50);
|
|
532
|
+
if ((await probeLocalDaemonEndpoint(localApiPort, localApiToken, 250)).state === "absent") {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
throw new Error("Logout could not confirm that the local daemon stopped; credentials were kept.");
|
|
537
|
+
}
|
|
538
|
+
export async function rotateRuntimeToken(args) {
|
|
539
|
+
bindConfigPath(args);
|
|
540
|
+
const stored = readConfig();
|
|
541
|
+
const apiUrl = argValue(args, "--api-url") ?? process.env.ALAN_API_URL ?? stored.apiUrl;
|
|
542
|
+
const runtimeId = argValue(args, "--runtime-id") ?? process.env.ALAN_RUNTIME_ID ?? stored.runtimeId;
|
|
543
|
+
const token = argValue(args, "--token") ?? process.env.ALAN_SETUP_TOKEN;
|
|
544
|
+
if (!apiUrl || !runtimeId || !token) {
|
|
545
|
+
throw new Error("token rotate requires configured api/runtime plus --token <alan PAT>");
|
|
546
|
+
}
|
|
547
|
+
const response = await fetch(`${apiUrl}/public/runtimes/${runtimeId}/tokens/rotate`, {
|
|
548
|
+
method: "POST",
|
|
549
|
+
headers: { authorization: `Bearer ${token}` },
|
|
550
|
+
});
|
|
551
|
+
if (!response.ok) {
|
|
552
|
+
throw new Error(`runtime token rotation failed: HTTP ${response.status}`);
|
|
553
|
+
}
|
|
554
|
+
const body = (await response.json());
|
|
555
|
+
writeConfig({
|
|
556
|
+
...stored,
|
|
557
|
+
apiUrl,
|
|
558
|
+
runtimeId,
|
|
559
|
+
runtimeToken: body.runtimeToken,
|
|
560
|
+
runtimeRenewalToken: body.runtimeRenewalToken,
|
|
561
|
+
runtimeTokenExpiresAt: body.runtimeTokenExpiresAt,
|
|
562
|
+
});
|
|
563
|
+
console.info("[alan-agent] Runtime token rotated", { runtimeId });
|
|
564
|
+
}
|
|
565
|
+
export async function revokeRuntimeToken(args) {
|
|
566
|
+
bindConfigPath(args);
|
|
567
|
+
const stored = readConfig();
|
|
568
|
+
const apiUrl = argValue(args, "--api-url") ?? process.env.ALAN_API_URL ?? stored.apiUrl;
|
|
569
|
+
const runtimeId = argValue(args, "--runtime-id") ?? process.env.ALAN_RUNTIME_ID ?? stored.runtimeId;
|
|
570
|
+
const token = argValue(args, "--token") ?? process.env.ALAN_SETUP_TOKEN;
|
|
571
|
+
if (!apiUrl || !runtimeId || !token) {
|
|
572
|
+
throw new Error("token revoke requires configured api/runtime plus --token <alan PAT>");
|
|
573
|
+
}
|
|
574
|
+
await drainAndStopLocalDaemonBeforeCredentialCleanup(args, stored);
|
|
575
|
+
const response = await fetch(`${apiUrl}/public/runtimes/${runtimeId}/tokens/revoke`, {
|
|
576
|
+
method: "POST",
|
|
577
|
+
headers: { authorization: `Bearer ${token}` },
|
|
578
|
+
});
|
|
579
|
+
if (!response.ok) {
|
|
580
|
+
throw new Error(`runtime token revoke failed: HTTP ${response.status}`);
|
|
581
|
+
}
|
|
582
|
+
removeAlanOwnedLocalArtifacts();
|
|
583
|
+
console.info("[alan-agent] Runtime token revoked", { runtimeId });
|
|
584
|
+
}
|
|
585
|
+
export async function logoutDaemon(args = []) {
|
|
586
|
+
bindConfigPath(args);
|
|
587
|
+
const stored = readConfig();
|
|
588
|
+
await drainAndStopLocalDaemonBeforeCredentialCleanup(args, stored);
|
|
589
|
+
removeAlanOwnedLocalArtifacts();
|
|
590
|
+
console.info("[alan-agent] Runtime config removed", { configPath: getConfigPath() });
|
|
591
|
+
}
|
|
592
|
+
export async function printStatus(args = []) {
|
|
593
|
+
bindConfigPath(args);
|
|
594
|
+
const config = readConfig();
|
|
595
|
+
const configured = Boolean(config.runtimeId && config.runtimeToken && config.wsUrl);
|
|
596
|
+
const warnings = [];
|
|
597
|
+
if ((isLocalEndpoint(config.apiUrl) || isLocalEndpoint(config.wsUrl)) &&
|
|
598
|
+
config.endpointProfile !== "local") {
|
|
599
|
+
warnings.push("Configured endpoint points at localhost. Use --profile local only for local development.");
|
|
600
|
+
}
|
|
601
|
+
const localApiPort = config.localApiPort && config.localApiPort > 0
|
|
602
|
+
? config.localApiPort
|
|
603
|
+
: getLocalApiPort([], config);
|
|
604
|
+
let localDaemonProbe = config.localApiToken
|
|
605
|
+
? await probeLocalDaemonEndpoint(localApiPort, config.localApiToken)
|
|
606
|
+
: { state: "absent" };
|
|
607
|
+
if (localDaemonProbe.state !== "running" && config.localServiceId && config.localServiceSecret) {
|
|
608
|
+
const adopted = await adoptConfiguredLocalDaemon(args);
|
|
609
|
+
if (adopted)
|
|
610
|
+
localDaemonProbe = { state: "running", status: adopted };
|
|
611
|
+
}
|
|
612
|
+
const localDaemonRunning = localDaemonProbe.state === "running";
|
|
613
|
+
console.info(JSON.stringify({
|
|
614
|
+
mode: "runtime",
|
|
615
|
+
configured,
|
|
616
|
+
runtimeId: config.runtimeId ?? null,
|
|
617
|
+
apiUrl: config.apiUrl ?? null,
|
|
618
|
+
wsUrl: config.wsUrl ?? null,
|
|
619
|
+
endpointProfile: config.endpointProfile ?? null,
|
|
620
|
+
localApiPort: config.localApiPort ?? null,
|
|
621
|
+
localDaemonRunning,
|
|
622
|
+
hasLocalApiToken: Boolean(config.localApiToken),
|
|
623
|
+
configPath: getConfigPath(),
|
|
624
|
+
note: configured
|
|
625
|
+
? localDaemonRunning
|
|
626
|
+
? "Local daemon is running. Stop it with: alan-agent stop"
|
|
627
|
+
: "Durable runtime config is present. Start it with: alan-agent daemon"
|
|
628
|
+
: "No durable runtime configured. Cloud sandbox sessions are launched by Alan with session env vars and do not appear in this local config.",
|
|
629
|
+
warnings,
|
|
630
|
+
}, null, 2));
|
|
631
|
+
}
|
|
632
|
+
export async function printDoctor(args = []) {
|
|
633
|
+
bindConfigPath(args);
|
|
634
|
+
const config = readConfig();
|
|
635
|
+
const capabilities = discoverCapabilities();
|
|
636
|
+
let synced = false;
|
|
637
|
+
let syncError = null;
|
|
638
|
+
if (args.includes("--sync")) {
|
|
639
|
+
if (!config.apiUrl || !config.runtimeId || !config.runtimeToken) {
|
|
640
|
+
throw new Error("doctor --sync requires configured apiUrl, runtimeId, and runtimeToken. Run setup first.");
|
|
641
|
+
}
|
|
642
|
+
const response = await fetch(`${config.apiUrl}/public/runtimes/${config.runtimeId}/capabilities/self`, {
|
|
643
|
+
method: "PATCH",
|
|
644
|
+
headers: {
|
|
645
|
+
authorization: `Bearer ${config.runtimeToken}`,
|
|
646
|
+
"content-type": "application/json",
|
|
647
|
+
},
|
|
648
|
+
body: JSON.stringify({
|
|
649
|
+
capabilities,
|
|
650
|
+
metadata: {
|
|
651
|
+
...(await collectRuntimeMetadataWithProviderLimits()),
|
|
652
|
+
...(config.installationId ? { installationId: config.installationId } : {}),
|
|
653
|
+
},
|
|
654
|
+
}),
|
|
655
|
+
});
|
|
656
|
+
if (!response.ok) {
|
|
657
|
+
syncError = `${response.status} ${await response.text()}`;
|
|
658
|
+
throw new Error(`doctor sync failed: ${syncError}`);
|
|
659
|
+
}
|
|
660
|
+
synced = true;
|
|
661
|
+
}
|
|
662
|
+
console.info(JSON.stringify({
|
|
663
|
+
version: AGENT_VERSION,
|
|
664
|
+
configPath: getConfigPath(),
|
|
665
|
+
configured: Boolean(config.runtimeId && config.runtimeToken && config.wsUrl),
|
|
666
|
+
runtimeId: config.runtimeId ?? null,
|
|
667
|
+
apiUrl: config.apiUrl ?? null,
|
|
668
|
+
wsUrl: config.wsUrl ?? null,
|
|
669
|
+
endpointProfile: config.endpointProfile ?? null,
|
|
670
|
+
warnings: (isLocalEndpoint(config.apiUrl) || isLocalEndpoint(config.wsUrl)) &&
|
|
671
|
+
config.endpointProfile !== "local"
|
|
672
|
+
? [
|
|
673
|
+
"Configured endpoint points at localhost. Use --profile local only for local development.",
|
|
674
|
+
]
|
|
675
|
+
: [],
|
|
676
|
+
synced,
|
|
677
|
+
syncError,
|
|
678
|
+
capabilities,
|
|
679
|
+
}, null, 2));
|
|
680
|
+
}
|
|
681
|
+
//# sourceMappingURL=daemon.js.map
|