@hyperdrive.bot/fleet-server 0.3.99
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/.env.example +31 -0
- package/README.md +111 -0
- package/dist/scripts/dev-runner.js +37 -0
- package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
- package/dist/scripts/supervisor-entrypoint.js +156 -0
- package/dist/scripts/supervisor-log-config.js +31 -0
- package/dist/scripts/supervisor.js +345 -0
- package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
- package/dist/server/executable-resolution/executable-resolution.js +118 -0
- package/dist/server/executable-resolution/windows.d.ts +18 -0
- package/dist/server/executable-resolution/windows.js +65 -0
- package/dist/server/extensions/daemon-backend.d.ts +11 -0
- package/dist/server/extensions/daemon-backend.js +146 -0
- package/dist/server/extensions/extension-host-manager.d.ts +48 -0
- package/dist/server/extensions/extension-host-manager.js +141 -0
- package/dist/server/extensions/extension-loader.d.ts +11 -0
- package/dist/server/extensions/extension-loader.js +47 -0
- package/dist/server/extensions/extension-service.d.ts +17 -0
- package/dist/server/extensions/extension-service.js +76 -0
- package/dist/server/server/agent/activity-curator.d.ts +28 -0
- package/dist/server/server/agent/activity-curator.js +227 -0
- package/dist/server/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-list-filter.d.ts +76 -0
- package/dist/server/server/agent/agent-list-filter.js +184 -0
- package/dist/server/server/agent/agent-loading.d.ts +12 -0
- package/dist/server/server/agent/agent-loading.js +76 -0
- package/dist/server/server/agent/agent-manager.d.ts +628 -0
- package/dist/server/server/agent/agent-manager.js +3370 -0
- package/dist/server/server/agent/agent-projections.d.ts +65 -0
- package/dist/server/server/agent/agent-projections.js +548 -0
- package/dist/server/server/agent/agent-prompt.d.ts +65 -0
- package/dist/server/server/agent/agent-prompt.js +271 -0
- package/dist/server/server/agent/agent-response-loop.d.ts +67 -0
- package/dist/server/server/agent/agent-response-loop.js +326 -0
- package/dist/server/server/agent/agent-routes.d.ts +18 -0
- package/dist/server/server/agent/agent-routes.js +107 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +809 -0
- package/dist/server/server/agent/agent-sdk-types.js +22 -0
- package/dist/server/server/agent/agent-storage.d.ts +209 -0
- package/dist/server/server/agent/agent-storage.js +365 -0
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
- package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
- package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
- package/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
- package/dist/server/server/agent/agent-timeline-store.js +277 -0
- package/dist/server/server/agent/audio-utils.d.ts +3 -0
- package/dist/server/server/agent/audio-utils.js +19 -0
- package/dist/server/server/agent/authorship-ledger.d.ts +139 -0
- package/dist/server/server/agent/authorship-ledger.js +207 -0
- package/dist/server/server/agent/authorship-markup.d.ts +198 -0
- package/dist/server/server/agent/authorship-markup.js +288 -0
- package/dist/server/server/agent/blocker-log.d.ts +81 -0
- package/dist/server/server/agent/blocker-log.js +113 -0
- package/dist/server/server/agent/card-move-log.d.ts +66 -0
- package/dist/server/server/agent/card-move-log.js +113 -0
- package/dist/server/server/agent/create-agent/create.d.ts +126 -0
- package/dist/server/server/agent/create-agent/create.js +378 -0
- package/dist/server/server/agent/create-agent/routine.d.ts +45 -0
- package/dist/server/server/agent/create-agent/routine.js +53 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
- package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
- package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
- package/dist/server/server/agent/create-agent-mode.js +62 -0
- package/dist/server/server/agent/create-agent-title.d.ts +10 -0
- package/dist/server/server/agent/create-agent-title.js +34 -0
- package/dist/server/server/agent/dictation-debug.d.ts +13 -0
- package/dist/server/server/agent/dictation-debug.js +50 -0
- package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
- package/dist/server/server/agent/foreground-run-state.js +160 -0
- package/dist/server/server/agent/import-sessions.d.ts +52 -0
- package/dist/server/server/agent/import-sessions.js +170 -0
- package/dist/server/server/agent/jarvis-judge.d.ts +157 -0
- package/dist/server/server/agent/jarvis-judge.js +289 -0
- package/dist/server/server/agent/judge-relay-gate.d.ts +70 -0
- package/dist/server/server/agent/judge-relay-gate.js +92 -0
- package/dist/server/server/agent/lifecycle-command.d.ts +75 -0
- package/dist/server/server/agent/lifecycle-command.js +97 -0
- package/dist/server/server/agent/mcp-server.d.ts +22 -0
- package/dist/server/server/agent/mcp-server.js +653 -0
- package/dist/server/server/agent/mcp-shared.d.ts +239 -0
- package/dist/server/server/agent/mcp-shared.js +200 -0
- package/dist/server/server/agent/output-language.d.ts +16 -0
- package/dist/server/server/agent/output-language.js +62 -0
- package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
- package/dist/server/server/agent/pcm16-resampler.js +63 -0
- package/dist/server/server/agent/permission-response.d.ts +15 -0
- package/dist/server/server/agent/permission-response.js +14 -0
- package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
- package/dist/server/server/agent/prompt-attachments.js +90 -0
- package/dist/server/server/agent/provider-config-reload.d.ts +27 -0
- package/dist/server/server/agent/provider-config-reload.js +65 -0
- package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
- package/dist/server/server/agent/provider-history-timestamps.js +16 -0
- package/dist/server/server/agent/provider-launch-config.d.ts +51 -0
- package/dist/server/server/agent/provider-launch-config.js +183 -0
- package/dist/server/server/agent/provider-notices.d.ts +3 -0
- package/dist/server/server/agent/provider-notices.js +5 -0
- package/dist/server/server/agent/provider-registry-contract.d.ts +40 -0
- package/dist/server/server/agent/provider-registry-contract.js +28 -0
- package/dist/server/server/agent/provider-registry.d.ts +97 -0
- package/dist/server/server/agent/provider-registry.js +686 -0
- package/dist/server/server/agent/provider-session-import.d.ts +10 -0
- package/dist/server/server/agent/provider-session-import.js +49 -0
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +166 -0
- package/dist/server/server/agent/provider-snapshot-manager.js +760 -0
- package/dist/server/server/agent/providers/acp-agent.d.ts +354 -0
- package/dist/server/server/agent/providers/acp-agent.js +2438 -0
- package/dist/server/server/agent/providers/claude/agent.d.ts +491 -0
- package/dist/server/server/agent/providers/claude/agent.js +5128 -0
- package/dist/server/server/agent/providers/claude/background-shell-kill-keys.d.ts +32 -0
- package/dist/server/server/agent/providers/claude/background-shell-kill-keys.js +34 -0
- package/dist/server/server/agent/providers/claude/background-task-tracker.d.ts +217 -0
- package/dist/server/server/agent/providers/claude/background-task-tracker.js +511 -0
- package/dist/server/server/agent/providers/claude/background-work-kinds.d.ts +124 -0
- package/dist/server/server/agent/providers/claude/background-work-kinds.js +96 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
- package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
- package/dist/server/server/agent/providers/claude/hook-handler.d.ts +37 -0
- package/dist/server/server/agent/providers/claude/hook-handler.js +193 -0
- package/dist/server/server/agent/providers/claude/hooks/event-translator.d.ts +49 -0
- package/dist/server/server/agent/providers/claude/hooks/event-translator.js +151 -0
- package/dist/server/server/agent/providers/claude/image-compression.d.ts +10 -0
- package/dist/server/server/agent/providers/claude/image-compression.js +32 -0
- package/dist/server/server/agent/providers/claude/model-manifest.d.ts +116 -0
- package/dist/server/server/agent/providers/claude/model-manifest.js +279 -0
- package/dist/server/server/agent/providers/claude/models.d.ts +11 -0
- package/dist/server/server/agent/providers/claude/models.js +97 -0
- package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
- package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
- package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
- package/dist/server/server/agent/providers/claude/pty-session-launcher.d.ts +62 -0
- package/dist/server/server/agent/providers/claude/pty-session-launcher.js +175 -0
- package/dist/server/server/agent/providers/claude/resume-source.d.ts +11 -0
- package/dist/server/server/agent/providers/claude/resume-source.js +37 -0
- package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
- package/dist/server/server/agent/providers/claude/rewind.js +30 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
- package/dist/server/server/agent/providers/claude/spawn-config-writer.d.ts +70 -0
- package/dist/server/server/agent/providers/claude/spawn-config-writer.js +229 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +47 -0
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +292 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
- package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist-guard.d.ts +41 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist-guard.js +95 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist.d.ts +68 -0
- package/dist/server/server/agent/providers/claude/tool-allowlist.js +133 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
- package/dist/server/server/agent/providers/claude/transport/claude-paths.d.ts +31 -0
- package/dist/server/server/agent/providers/claude/transport/claude-paths.js +63 -0
- package/dist/server/server/agent/providers/claude/transport/continue-flag.d.ts +31 -0
- package/dist/server/server/agent/providers/claude/transport/continue-flag.js +42 -0
- package/dist/server/server/agent/providers/claude/transport/pty-query.d.ts +493 -0
- package/dist/server/server/agent/providers/claude/transport/pty-query.js +2075 -0
- package/dist/server/server/agent/providers/claude/transport/pty.d.ts +153 -0
- package/dist/server/server/agent/providers/claude/transport/pty.js +367 -0
- package/dist/server/server/agent/providers/claude/transport/redact.d.ts +8 -0
- package/dist/server/server/agent/providers/claude/transport/redact.js +33 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.d.ts +65 -0
- package/dist/server/server/agent/providers/claude/transport/sdk.js +219 -0
- package/dist/server/server/agent/providers/claude/transport/tmux.d.ts +141 -0
- package/dist/server/server/agent/providers/claude/transport/tmux.js +218 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.d.ts +53 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +243 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-tailer.d.ts +28 -0
- package/dist/server/server/agent/providers/claude/transport/transcript-tailer.js +166 -0
- package/dist/server/server/agent/providers/claude/transport/truncate-session.d.ts +50 -0
- package/dist/server/server/agent/providers/claude/transport/truncate-session.js +121 -0
- package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.d.ts +36 -0
- package/dist/server/server/agent/providers/claude/transport/turn-id-reconciler.js +75 -0
- package/dist/server/server/agent/providers/claude/transport/types.d.ts +61 -0
- package/dist/server/server/agent/providers/claude/transport/types.js +2 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
- package/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
- package/dist/server/server/agent/providers/codex/rewind.js +46 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +36 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +217 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +830 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +308 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.js +4515 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
- package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
- package/dist/server/server/agent/providers/copilot-acp-agent.js +187 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +15 -0
- package/dist/server/server/agent/providers/cursor-acp-agent.js +18 -0
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +42 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +161 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
- package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +85 -0
- package/dist/server/server/agent/providers/mock-load-test-agent.js +1010 -0
- package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
- package/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +91 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +425 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +25 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +39 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +92 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +268 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +293 -0
- package/dist/server/server/agent/providers/opencode-agent.js +2908 -0
- package/dist/server/server/agent/providers/pi/agent.d.ts +137 -0
- package/dist/server/server/agent/providers/pi/agent.js +1651 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
- package/dist/server/server/agent/providers/pi/cli-runtime.js +233 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
- package/dist/server/server/agent/providers/pi/history-mapper.js +140 -0
- package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
- package/dist/server/server/agent/providers/pi/rewind.js +8 -0
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +208 -0
- package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
- package/dist/server/server/agent/providers/pi/runtime.d.ts +57 -0
- package/dist/server/server/agent/providers/pi/runtime.js +56 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
- package/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +83 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +184 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
- package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
- package/dist/server/server/agent/providers/provider-image-output.js +111 -0
- package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
- package/dist/server/server/agent/providers/provider-runner.js +81 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
- package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
- package/dist/server/server/agent/recordings-debug.d.ts +3 -0
- package/dist/server/server/agent/recordings-debug.js +19 -0
- package/dist/server/server/agent/render-file-attachment.d.ts +29 -0
- package/dist/server/server/agent/render-file-attachment.js +41 -0
- package/dist/server/server/agent/resolve-resume-cwd.d.ts +14 -0
- package/dist/server/server/agent/resolve-resume-cwd.js +49 -0
- package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
- package/dist/server/server/agent/rewind/rewind.js +29 -0
- package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
- package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
- package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
- package/dist/server/server/agent/runtime-mcp-config.js +53 -0
- package/dist/server/server/agent/session-digest-generator.d.ts +64 -0
- package/dist/server/server/agent/session-digest-generator.js +306 -0
- package/dist/server/server/agent/session-digest.d.ts +81 -0
- package/dist/server/server/agent/session-digest.js +226 -0
- package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
- package/dist/server/server/agent/structured-generation-providers.js +236 -0
- package/dist/server/server/agent/stt-debug.d.ts +10 -0
- package/dist/server/server/agent/stt-debug.js +33 -0
- package/dist/server/server/agent/stt-manager.d.ts +47 -0
- package/dist/server/server/agent/stt-manager.js +263 -0
- package/dist/server/server/agent/system-prompt.d.ts +2 -0
- package/dist/server/server/agent/system-prompt.js +8 -0
- package/dist/server/server/agent/timeline-append.d.ts +10 -0
- package/dist/server/server/agent/timeline-append.js +27 -0
- package/dist/server/server/agent/timeline-projection.d.ts +71 -0
- package/dist/server/server/agent/timeline-projection.js +373 -0
- package/dist/server/server/agent/tools/paseo-tools.d.ts +66 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2616 -0
- package/dist/server/server/agent/tools/read-only-surface.d.ts +53 -0
- package/dist/server/server/agent/tools/read-only-surface.js +69 -0
- package/dist/server/server/agent/tools/types.d.ts +41 -0
- package/dist/server/server/agent/tools/types.js +2 -0
- package/dist/server/server/agent/tts-debug.d.ts +8 -0
- package/dist/server/server/agent/tts-debug.js +24 -0
- package/dist/server/server/agent/tts-manager.d.ts +41 -0
- package/dist/server/server/agent/tts-manager.js +375 -0
- package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
- package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
- package/dist/server/server/agent-attention-policy.d.ts +29 -0
- package/dist/server/server/agent-attention-policy.js +36 -0
- package/dist/server/server/atomic-file.d.ts +3 -0
- package/dist/server/server/atomic-file.js +19 -0
- package/dist/server/server/auth.d.ts +68 -0
- package/dist/server/server/auth.js +207 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
- package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
- package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
- package/dist/server/server/auto-archive-on-merge/index.js +15 -0
- package/dist/server/server/bootstrap.d.ts +163 -0
- package/dist/server/server/bootstrap.js +1597 -0
- package/dist/server/server/browser-tools/broker.d.ts +45 -0
- package/dist/server/server/browser-tools/broker.js +390 -0
- package/dist/server/server/browser-tools/errors.d.ts +22 -0
- package/dist/server/server/browser-tools/errors.js +27 -0
- package/dist/server/server/browser-tools/policy.d.ts +10 -0
- package/dist/server/server/browser-tools/policy.js +16 -0
- package/dist/server/server/browser-tools/tools.d.ts +16 -0
- package/dist/server/server/browser-tools/tools.js +845 -0
- package/dist/server/server/chat/chat-mentions.d.ts +47 -0
- package/dist/server/server/chat/chat-mentions.js +113 -0
- package/dist/server/server/chat/chat-service.d.ts +78 -0
- package/dist/server/server/chat/chat-service.js +337 -0
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.js +102 -0
- package/dist/server/server/checkout-diff-manager.d.ts +41 -0
- package/dist/server/server/checkout-diff-manager.js +189 -0
- package/dist/server/server/checkout-git-utils.d.ts +11 -0
- package/dist/server/server/checkout-git-utils.js +34 -0
- package/dist/server/server/client-message-id.d.ts +3 -0
- package/dist/server/server/client-message-id.js +12 -0
- package/dist/server/server/config.d.ts +20 -0
- package/dist/server/server/config.js +427 -0
- package/dist/server/server/connection-offer.d.ts +20 -0
- package/dist/server/server/connection-offer.js +59 -0
- package/dist/server/server/daemon-config-store.d.ts +78 -0
- package/dist/server/server/daemon-config-store.js +320 -0
- package/dist/server/server/daemon-keypair.d.ts +8 -0
- package/dist/server/server/daemon-keypair.js +42 -0
- package/dist/server/server/daemon-version.d.ts +5 -0
- package/dist/server/server/daemon-version.js +22 -0
- package/dist/server/server/daemon-worker.d.ts +2 -0
- package/dist/server/server/daemon-worker.js +251 -0
- package/dist/server/server/dictation/dictation-stream-manager.d.ts +95 -0
- package/dist/server/server/dictation/dictation-stream-manager.js +581 -0
- package/dist/server/server/editor-targets.d.ts +18 -0
- package/dist/server/server/editor-targets.js +109 -0
- package/dist/server/server/ensure-workspace-for-create.d.ts +30 -0
- package/dist/server/server/ensure-workspace-for-create.js +20 -0
- package/dist/server/server/exports.d.ts +28 -0
- package/dist/server/server/exports.js +31 -0
- package/dist/server/server/file-download/token-store.d.ts +24 -0
- package/dist/server/server/file-download/token-store.js +40 -0
- package/dist/server/server/file-explorer/file-download-frames.d.ts +27 -0
- package/dist/server/server/file-explorer/file-download-frames.js +47 -0
- package/dist/server/server/file-explorer/mime-types.d.ts +58 -0
- package/dist/server/server/file-explorer/mime-types.js +212 -0
- package/dist/server/server/file-explorer/service.d.ts +97 -0
- package/dist/server/server/file-explorer/service.js +362 -0
- package/dist/server/server/file-upload/index.d.ts +27 -0
- package/dist/server/server/file-upload/index.js +158 -0
- package/dist/server/server/fleet/decision-service.d.ts +47 -0
- package/dist/server/server/fleet/decision-service.js +156 -0
- package/dist/server/server/fleet/fleet-controls.d.ts +77 -0
- package/dist/server/server/fleet/fleet-controls.js +217 -0
- package/dist/server/server/fleet/fleet-reader.d.ts +106 -0
- package/dist/server/server/fleet/fleet-reader.js +470 -0
- package/dist/server/server/fleet/fleet-scaffold.d.ts +26 -0
- package/dist/server/server/fleet/fleet-scaffold.js +48 -0
- package/dist/server/server/fleet/fleet-scheduler.d.ts +75 -0
- package/dist/server/server/fleet/fleet-scheduler.js +186 -0
- package/dist/server/server/fleet/fleet-service.d.ts +75 -0
- package/dist/server/server/fleet/fleet-service.js +134 -0
- package/dist/server/server/hostnames.d.ts +13 -0
- package/dist/server/server/hostnames.js +94 -0
- package/dist/server/server/ingestion/adapters.d.ts +21 -0
- package/dist/server/server/ingestion/adapters.js +27 -0
- package/dist/server/server/ingestion/apply.d.ts +220 -0
- package/dist/server/server/ingestion/apply.js +345 -0
- package/dist/server/server/ingestion/backfill.d.ts +123 -0
- package/dist/server/server/ingestion/backfill.js +160 -0
- package/dist/server/server/ingestion/cap-limiter.d.ts +148 -0
- package/dist/server/server/ingestion/cap-limiter.js +264 -0
- package/dist/server/server/ingestion/cohort-recorder-memory.d.ts +25 -0
- package/dist/server/server/ingestion/cohort-recorder-memory.js +78 -0
- package/dist/server/server/ingestion/cohort-recorder-store.d.ts +12 -0
- package/dist/server/server/ingestion/cohort-recorder-store.js +99 -0
- package/dist/server/server/ingestion/cohort-resume.d.ts +22 -0
- package/dist/server/server/ingestion/cohort-resume.js +171 -0
- package/dist/server/server/ingestion/cohort-store.d.ts +227 -0
- package/dist/server/server/ingestion/cohort-store.js +462 -0
- package/dist/server/server/ingestion/composio/gateway.d.ts +8 -0
- package/dist/server/server/ingestion/composio/gateway.js +469 -0
- package/dist/server/server/ingestion/dry-run.d.ts +70 -0
- package/dist/server/server/ingestion/dry-run.js +142 -0
- package/dist/server/server/ingestion/errors.d.ts +48 -0
- package/dist/server/server/ingestion/errors.js +63 -0
- package/dist/server/server/ingestion/external-user-id.d.ts +24 -0
- package/dist/server/server/ingestion/external-user-id.js +35 -0
- package/dist/server/server/ingestion/filters/store.d.ts +28 -0
- package/dist/server/server/ingestion/filters/store.js +74 -0
- package/dist/server/server/ingestion/fingerprint.d.ts +13 -0
- package/dist/server/server/ingestion/fingerprint.js +31 -0
- package/dist/server/server/ingestion/grouping.d.ts +26 -0
- package/dist/server/server/ingestion/grouping.js +116 -0
- package/dist/server/server/ingestion/hard-failure.d.ts +73 -0
- package/dist/server/server/ingestion/hard-failure.js +125 -0
- package/dist/server/server/ingestion/health.d.ts +38 -0
- package/dist/server/server/ingestion/health.js +90 -0
- package/dist/server/server/ingestion/ledger-schema.d.ts +99 -0
- package/dist/server/server/ingestion/ledger-schema.js +359 -0
- package/dist/server/server/ingestion/ledger.d.ts +562 -0
- package/dist/server/server/ingestion/ledger.js +881 -0
- package/dist/server/server/ingestion/match.d.ts +57 -0
- package/dist/server/server/ingestion/match.js +102 -0
- package/dist/server/server/ingestion/pipedream/gateway.d.ts +8 -0
- package/dist/server/server/ingestion/pipedream/gateway.js +282 -0
- package/dist/server/server/ingestion/presets.d.ts +57 -0
- package/dist/server/server/ingestion/presets.js +57 -0
- package/dist/server/server/ingestion/reconcile/artifact-kind.d.ts +19 -0
- package/dist/server/server/ingestion/reconcile/artifact-kind.js +65 -0
- package/dist/server/server/ingestion/reconcile/calendar.d.ts +19 -0
- package/dist/server/server/ingestion/reconcile/calendar.js +110 -0
- package/dist/server/server/ingestion/reconcile/constants.d.ts +60 -0
- package/dist/server/server/ingestion/reconcile/constants.js +62 -0
- package/dist/server/server/ingestion/reconcile/github.d.ts +21 -0
- package/dist/server/server/ingestion/reconcile/github.js +83 -0
- package/dist/server/server/ingestion/reconcile/gitlab.d.ts +23 -0
- package/dist/server/server/ingestion/reconcile/gitlab.js +94 -0
- package/dist/server/server/ingestion/reconcile/gmail.d.ts +9 -0
- package/dist/server/server/ingestion/reconcile/gmail.js +141 -0
- package/dist/server/server/ingestion/reconcile/jira.d.ts +17 -0
- package/dist/server/server/ingestion/reconcile/jira.js +76 -0
- package/dist/server/server/ingestion/reconcile/kinds.d.ts +16 -0
- package/dist/server/server/ingestion/reconcile/kinds.js +59 -0
- package/dist/server/server/ingestion/reconcile/mcp-call.d.ts +18 -0
- package/dist/server/server/ingestion/reconcile/mcp-call.js +105 -0
- package/dist/server/server/ingestion/reconcile/payload.d.ts +38 -0
- package/dist/server/server/ingestion/reconcile/payload.js +82 -0
- package/dist/server/server/ingestion/reconcile/registry.d.ts +40 -0
- package/dist/server/server/ingestion/reconcile/registry.js +72 -0
- package/dist/server/server/ingestion/reconcile/runner.d.ts +43 -0
- package/dist/server/server/ingestion/reconcile/runner.js +91 -0
- package/dist/server/server/ingestion/reconcile/sentry.d.ts +20 -0
- package/dist/server/server/ingestion/reconcile/sentry.js +85 -0
- package/dist/server/server/ingestion/reconcile/service.d.ts +134 -0
- package/dist/server/server/ingestion/reconcile/service.js +409 -0
- package/dist/server/server/ingestion/reconcile/signature-guard.d.ts +30 -0
- package/dist/server/server/ingestion/reconcile/signature-guard.js +82 -0
- package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.d.ts +68 -0
- package/dist/server/server/ingestion/reconcile/testing/fake-mcp-server.js +158 -0
- package/dist/server/server/ingestion/reconcile/types.d.ts +65 -0
- package/dist/server/server/ingestion/reconcile/types.js +11 -0
- package/dist/server/server/ingestion/reconcile/verdict-mapping.d.ts +54 -0
- package/dist/server/server/ingestion/reconcile/verdict-mapping.js +82 -0
- package/dist/server/server/ingestion/resolve-items.d.ts +23 -0
- package/dist/server/server/ingestion/resolve-items.js +54 -0
- package/dist/server/server/ingestion/run-projection.d.ts +35 -0
- package/dist/server/server/ingestion/run-projection.js +76 -0
- package/dist/server/server/ingestion/service.d.ts +147 -0
- package/dist/server/server/ingestion/service.js +364 -0
- package/dist/server/server/ingestion/sources/store.d.ts +27 -0
- package/dist/server/server/ingestion/sources/store.js +71 -0
- package/dist/server/server/ingestion/testing/claim-and-hang.d.ts +2 -0
- package/dist/server/server/ingestion/testing/claim-and-hang.js +21 -0
- package/dist/server/server/ingestion/testing/cohort-crash.d.ts +2 -0
- package/dist/server/server/ingestion/testing/cohort-crash.js +89 -0
- package/dist/server/server/ingestion/types.d.ts +226 -0
- package/dist/server/server/ingestion/types.js +18 -0
- package/dist/server/server/ingestion/utc-day.d.ts +27 -0
- package/dist/server/server/ingestion/utc-day.js +44 -0
- package/dist/server/server/json-utils.d.ts +11 -0
- package/dist/server/server/json-utils.js +45 -0
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/logger.d.ts +29 -0
- package/dist/server/server/logger.js +125 -0
- package/dist/server/server/loop-service.d.ts +234 -0
- package/dist/server/server/loop-service.js +769 -0
- package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
- package/dist/server/server/managed-processes/managed-processes.js +326 -0
- package/dist/server/server/meetings/capture-http.d.ts +3 -0
- package/dist/server/server/meetings/capture-http.js +71 -0
- package/dist/server/server/meetings/capture-orchestrator.d.ts +123 -0
- package/dist/server/server/meetings/capture-orchestrator.js +531 -0
- package/dist/server/server/meetings/capture-stream-ws.d.ts +42 -0
- package/dist/server/server/meetings/capture-stream-ws.js +68 -0
- package/dist/server/server/meetings/live-transcription.d.ts +57 -0
- package/dist/server/server/meetings/live-transcription.js +280 -0
- package/dist/server/server/meetings/meetings-http.d.ts +42 -0
- package/dist/server/server/meetings/meetings-http.js +266 -0
- package/dist/server/server/messages.d.ts +9 -0
- package/dist/server/server/messages.js +29 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
- package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
- package/dist/server/server/monitoring/telemetry.d.ts +13 -0
- package/dist/server/server/monitoring/telemetry.js +21 -0
- package/dist/server/server/package-version.d.ts +19 -0
- package/dist/server/server/package-version.js +60 -0
- package/dist/server/server/pagination/cursor.d.ts +16 -0
- package/dist/server/server/pagination/cursor.js +62 -0
- package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
- package/dist/server/server/pagination/sortable-pager.js +68 -0
- package/dist/server/server/pairing-offer.d.ts +18 -0
- package/dist/server/server/pairing-offer.js +47 -0
- package/dist/server/server/pairing-qr.d.ts +7 -0
- package/dist/server/server/pairing-qr.js +45 -0
- package/dist/server/server/paseo-env.d.ts +13 -0
- package/dist/server/server/paseo-env.js +53 -0
- package/dist/server/server/paseo-home.d.ts +2 -0
- package/dist/server/server/paseo-home.js +19 -0
- package/dist/server/server/paseo-worktree-service.d.ts +52 -0
- package/dist/server/server/paseo-worktree-service.js +294 -0
- package/dist/server/server/path-utils.d.ts +5 -0
- package/dist/server/server/path-utils.js +34 -0
- package/dist/server/server/persisted-config.d.ts +390 -0
- package/dist/server/server/persisted-config.js +424 -0
- package/dist/server/server/persistence-hooks.d.ts +32 -0
- package/dist/server/server/persistence-hooks.js +99 -0
- package/dist/server/server/pid-lock.d.ts +32 -0
- package/dist/server/server/pid-lock.js +170 -0
- package/dist/server/server/private-files.d.ts +6 -0
- package/dist/server/server/private-files.js +37 -0
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/push/categories.d.ts +35 -0
- package/dist/server/server/push/categories.js +40 -0
- package/dist/server/server/push/expo-worker.d.ts +51 -0
- package/dist/server/server/push/expo-worker.js +188 -0
- package/dist/server/server/push/index.d.ts +39 -0
- package/dist/server/server/push/index.js +45 -0
- package/dist/server/server/push/notifications.d.ts +9 -0
- package/dist/server/server/push/notifications.js +15 -0
- package/dist/server/server/push/push-service.d.ts +20 -0
- package/dist/server/server/push/push-service.js +66 -0
- package/dist/server/server/push/routes.d.ts +28 -0
- package/dist/server/server/push/routes.js +74 -0
- package/dist/server/server/push/subscriptions.d.ts +42 -0
- package/dist/server/server/push/subscriptions.js +112 -0
- package/dist/server/server/push/token-store.d.ts +29 -0
- package/dist/server/server/push/token-store.js +78 -0
- package/dist/server/server/push/triggers.d.ts +68 -0
- package/dist/server/server/push/triggers.js +103 -0
- package/dist/server/server/push/vapid-keys.d.ts +15 -0
- package/dist/server/server/push/vapid-keys.js +52 -0
- package/dist/server/server/push/web-worker.d.ts +44 -0
- package/dist/server/server/push/web-worker.js +99 -0
- package/dist/server/server/reference-enricher.d.ts +41 -0
- package/dist/server/server/reference-enricher.js +392 -0
- package/dist/server/server/relay-transport.d.ts +31 -0
- package/dist/server/server/relay-transport.js +545 -0
- package/dist/server/server/resolve-workspace-id-for-path.d.ts +4 -0
- package/dist/server/server/resolve-workspace-id-for-path.js +71 -0
- package/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +121 -0
- package/dist/server/server/restart-manifest.d.ts +83 -0
- package/dist/server/server/restart-manifest.js +122 -0
- package/dist/server/server/resume-after-restart.d.ts +50 -0
- package/dist/server/server/resume-after-restart.js +108 -0
- package/dist/server/server/schedule/create-cadence.d.ts +22 -0
- package/dist/server/server/schedule/create-cadence.js +70 -0
- package/dist/server/server/schedule/cron.d.ts +8 -0
- package/dist/server/server/schedule/cron.js +114 -0
- package/dist/server/server/schedule/service.d.ts +207 -0
- package/dist/server/server/schedule/service.js +867 -0
- package/dist/server/server/schedule/source-prompt.d.ts +42 -0
- package/dist/server/server/schedule/source-prompt.js +87 -0
- package/dist/server/server/schedule/store.d.ts +13 -0
- package/dist/server/server/schedule/store.js +57 -0
- package/dist/server/server/script-health-monitor.d.ts +39 -0
- package/dist/server/server/script-health-monitor.js +159 -0
- package/dist/server/server/script-proxy.d.ts +3 -0
- package/dist/server/server/script-proxy.js +2 -0
- package/dist/server/server/script-route-branch-handler.d.ts +10 -0
- package/dist/server/server/script-route-branch-handler.js +11 -0
- package/dist/server/server/script-status-projection.d.ts +36 -0
- package/dist/server/server/script-status-projection.js +200 -0
- package/dist/server/server/search/extract.d.ts +53 -0
- package/dist/server/server/search/extract.js +222 -0
- package/dist/server/server/search/index-store.d.ts +83 -0
- package/dist/server/server/search/index-store.js +241 -0
- package/dist/server/server/search/indexer.d.ts +69 -0
- package/dist/server/server/search/indexer.js +362 -0
- package/dist/server/server/search/resolve-cwd.d.ts +40 -0
- package/dist/server/server/search/resolve-cwd.js +109 -0
- package/dist/server/server/search/session-search-service.d.ts +59 -0
- package/dist/server/server/search/session-search-service.js +171 -0
- package/dist/server/server/server-id.d.ts +17 -0
- package/dist/server/server/server-id.js +68 -0
- package/dist/server/server/service-proxy.d.ts +237 -0
- package/dist/server/server/service-proxy.js +714 -0
- package/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
- package/dist/server/server/session/agent-config/agent-config-session.js +98 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
- package/dist/server/server/session/chat/chat-ingestion-session.d.ts +285 -0
- package/dist/server/server/session/chat/chat-ingestion-session.js +504 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +175 -0
- package/dist/server/server/session/chat/chat-schedule-loop-session.js +720 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +140 -0
- package/dist/server/server/session/checkout/checkout-session.js +927 -0
- package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
- package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +89 -0
- package/dist/server/server/session/daemon/daemon-session.js +179 -0
- package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
- package/dist/server/server/session/daemon/diagnostics.js +431 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/files/workspace-files-session.d.ts +53 -0
- package/dist/server/server/session/files/workspace-files-session.js +245 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
- package/dist/server/server/session/ingestion/source-session.d.ts +78 -0
- package/dist/server/server/session/ingestion/source-session.js +191 -0
- package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
- package/dist/server/server/session/project-config/project-config-session.js +125 -0
- package/dist/server/server/session/provider/provider-catalog-session.d.ts +105 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +364 -0
- package/dist/server/server/session/session-rename-route.d.ts +4 -0
- package/dist/server/server/session/session-rename-route.js +71 -0
- package/dist/server/server/session/session-rename-service.d.ts +25 -0
- package/dist/server/server/session/session-rename-service.js +76 -0
- package/dist/server/server/session/voice/voice-session.d.ts +166 -0
- package/dist/server/server/session/voice/voice-session.js +899 -0
- package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +46 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +214 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
- package/dist/server/server/session.d.ts +677 -0
- package/dist/server/server/session.js +6531 -0
- package/dist/server/server/speech/audio.d.ts +10 -0
- package/dist/server/server/speech/audio.js +101 -0
- package/dist/server/server/speech/provider-resolver.d.ts +3 -0
- package/dist/server/server/speech/provider-resolver.js +7 -0
- package/dist/server/server/speech/providers/local/config.d.ts +30 -0
- package/dist/server/server/speech/providers/local/config.js +134 -0
- package/dist/server/server/speech/providers/local/models.d.ts +11 -0
- package/dist/server/server/speech/providers/local/models.js +17 -0
- package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
- package/dist/server/server/speech/providers/local/runtime.js +135 -0
- package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +142 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +101 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
- package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
- package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
- package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
- package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
- package/dist/server/server/speech/providers/local/worker-client.js +611 -0
- package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
- package/dist/server/server/speech/providers/local/worker-process.js +270 -0
- package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
- package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
- package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
- package/dist/server/server/speech/providers/openai/config.js +148 -0
- package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
- package/dist/server/server/speech/providers/openai/runtime.js +102 -0
- package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
- package/dist/server/server/speech/providers/openai/stt.js +209 -0
- package/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
- package/dist/server/server/speech/providers/openai/tts.js +48 -0
- package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
- package/dist/server/server/speech/speech-config-resolver.js +132 -0
- package/dist/server/server/speech/speech-provider.d.ts +59 -0
- package/dist/server/server/speech/speech-provider.js +2 -0
- package/dist/server/server/speech/speech-runtime.d.ts +45 -0
- package/dist/server/server/speech/speech-runtime.js +562 -0
- package/dist/server/server/speech/speech-types.d.ts +22 -0
- package/dist/server/server/speech/speech-types.js +8 -0
- package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
- package/dist/server/server/speech/turn-detection-provider.js +2 -0
- package/dist/server/server/tenant-token-verifier.d.ts +43 -0
- package/dist/server/server/tenant-token-verifier.js +79 -0
- package/dist/server/server/update/installer.d.ts +70 -0
- package/dist/server/server/update/installer.js +181 -0
- package/dist/server/server/update/registry.d.ts +47 -0
- package/dist/server/server/update/registry.js +95 -0
- package/dist/server/server/update/slots.d.ts +45 -0
- package/dist/server/server/update/slots.js +97 -0
- package/dist/server/server/update/state.d.ts +41 -0
- package/dist/server/server/update/state.js +65 -0
- package/dist/server/server/uploads/file-attachment-validation.d.ts +61 -0
- package/dist/server/server/uploads/file-attachment-validation.js +56 -0
- package/dist/server/server/uploads/staging-service.d.ts +91 -0
- package/dist/server/server/uploads/staging-service.js +144 -0
- package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
- package/dist/server/server/utils/diff-highlighter.js +279 -0
- package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
- package/dist/server/server/voice/voice-turn-controller.js +393 -0
- package/dist/server/server/voice-config.d.ts +15 -0
- package/dist/server/server/voice-config.js +54 -0
- package/dist/server/server/voice-permission-policy.d.ts +4 -0
- package/dist/server/server/voice-permission-policy.js +13 -0
- package/dist/server/server/voice-types.d.ts +12 -0
- package/dist/server/server/voice-types.js +2 -0
- package/dist/server/server/watch/composer-dictate.d.ts +42 -0
- package/dist/server/server/watch/composer-dictate.js +37 -0
- package/dist/server/server/watch/notification-action.d.ts +38 -0
- package/dist/server/server/watch/notification-action.js +54 -0
- package/dist/server/server/watch/notification-registry.d.ts +16 -0
- package/dist/server/server/watch/notification-registry.js +2 -0
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +247 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket-server.d.ts +231 -0
- package/dist/server/server/websocket-server.js +1853 -0
- package/dist/server/server/whatsapp-bridge.d.ts +74 -0
- package/dist/server/server/whatsapp-bridge.js +142 -0
- package/dist/server/server/workflow/workflow-agent-resolution.d.ts +82 -0
- package/dist/server/server/workflow/workflow-agent-resolution.js +105 -0
- package/dist/server/server/workflow/workflow-feature.d.ts +2 -0
- package/dist/server/server/workflow/workflow-feature.js +8 -0
- package/dist/server/server/workflow/workflow-http-routes.d.ts +27 -0
- package/dist/server/server/workflow/workflow-http-routes.js +97 -0
- package/dist/server/server/workflow/workflow-manager.d.ts +363 -0
- package/dist/server/server/workflow/workflow-manager.js +852 -0
- package/dist/server/server/workflow/workflow-progress.d.ts +148 -0
- package/dist/server/server/workflow/workflow-progress.js +274 -0
- package/dist/server/server/workflow/workflow-storage.d.ts +36 -0
- package/dist/server/server/workflow/workflow-storage.js +143 -0
- package/dist/server/server/workspace/all-sessions-route.d.ts +32 -0
- package/dist/server/server/workspace/all-sessions-route.js +218 -0
- package/dist/server/server/workspace/recall-search-feature.d.ts +2 -0
- package/dist/server/server/workspace/recall-search-feature.js +31 -0
- package/dist/server/server/workspace/session-openable.d.ts +16 -0
- package/dist/server/server/workspace/session-openable.js +48 -0
- package/dist/server/server/workspace/sessions-route.d.ts +15 -0
- package/dist/server/server/workspace/sessions-route.js +108 -0
- package/dist/server/server/workspace/sessions-search-route.d.ts +40 -0
- package/dist/server/server/workspace/sessions-search-route.js +74 -0
- package/dist/server/server/workspace-archive-service.d.ts +65 -0
- package/dist/server/server/workspace-archive-service.js +229 -0
- package/dist/server/server/workspace-auto-name.d.ts +55 -0
- package/dist/server/server/workspace-auto-name.js +128 -0
- package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
- package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
- package/dist/server/server/workspace-directory.d.ts +93 -0
- package/dist/server/server/workspace-directory.js +440 -0
- package/dist/server/server/workspace-git-metadata.d.ts +24 -0
- package/dist/server/server/workspace-git-metadata.js +55 -0
- package/dist/server/server/workspace-git-service.d.ts +257 -0
- package/dist/server/server/workspace-git-service.js +1386 -0
- package/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
- package/dist/server/server/workspace-reconciliation-service.js +278 -0
- package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
- package/dist/server/server/workspace-registry-bootstrap.js +121 -0
- package/dist/server/server/workspace-registry-model.d.ts +55 -0
- package/dist/server/server/workspace-registry-model.js +190 -0
- package/dist/server/server/workspace-registry.d.ts +117 -0
- package/dist/server/server/workspace-registry.js +194 -0
- package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
- package/dist/server/server/workspace-script-runtime-store.js +78 -0
- package/dist/server/server/workspace-service-env.d.ts +18 -0
- package/dist/server/server/workspace-service-env.js +85 -0
- package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
- package/dist/server/server/workspace-service-port-registry.js +59 -0
- package/dist/server/server/worktree/commands.d.ts +55 -0
- package/dist/server/server/worktree/commands.js +107 -0
- package/dist/server/server/worktree-bootstrap.d.ts +76 -0
- package/dist/server/server/worktree-bootstrap.js +720 -0
- package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
- package/dist/server/server/worktree-branch-name-generator.js +91 -0
- package/dist/server/server/worktree-core.d.ts +31 -0
- package/dist/server/server/worktree-core.js +105 -0
- package/dist/server/server/worktree-errors.d.ts +12 -0
- package/dist/server/server/worktree-errors.js +28 -0
- package/dist/server/server/worktree-session.d.ts +152 -0
- package/dist/server/server/worktree-session.js +466 -0
- package/dist/server/services/github-service.d.ts +337 -0
- package/dist/server/services/github-service.js +2101 -0
- package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
- package/dist/server/services/quota-fetcher/manifest.js +52 -0
- package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
- package/dist/server/services/quota-fetcher/provider.js +2 -0
- package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
- package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
- package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
- package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
- package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
- package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
- package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
- package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
- package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
- package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
- package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
- package/dist/server/services/quota-fetcher/service.d.ts +28 -0
- package/dist/server/services/quota-fetcher/service.js +58 -0
- package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
- package/dist/server/services/quota-fetcher/usage.js +49 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
- package/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
- package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
- package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
- package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
- package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
- package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
- package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
- package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
- package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/server/terminal/terminal-capture.d.ts +12 -0
- package/dist/server/terminal/terminal-capture.js +43 -0
- package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
- package/dist/server/terminal/terminal-manager-factory.js +5 -0
- package/dist/server/terminal/terminal-manager.d.ts +78 -0
- package/dist/server/terminal/terminal-manager.js +319 -0
- package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
- package/dist/server/terminal/terminal-output-coalescer.js +73 -0
- package/dist/server/terminal/terminal-restore.d.ts +18 -0
- package/dist/server/terminal/terminal-restore.js +52 -0
- package/dist/server/terminal/terminal-session-controller.d.ts +85 -0
- package/dist/server/terminal/terminal-session-controller.js +819 -0
- package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
- package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
- package/dist/server/terminal/terminal-worker-process.js +304 -0
- package/dist/server/terminal/terminal-worker-protocol.d.ts +119 -0
- package/dist/server/terminal/terminal-worker-protocol.js +2 -0
- package/dist/server/terminal/terminal.d.ts +151 -0
- package/dist/server/terminal/terminal.js +1161 -0
- package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
- package/dist/server/terminal/worker-terminal-manager.js +688 -0
- package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
- package/dist/server/utils/build-metadata-prompt.js +29 -0
- package/dist/server/utils/checkout-git.d.ts +253 -0
- package/dist/server/utils/checkout-git.js +2238 -0
- package/dist/server/utils/directory-suggestions.d.ts +26 -0
- package/dist/server/utils/directory-suggestions.js +860 -0
- package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
- package/dist/server/utils/git-rev-parse-path.js +21 -0
- package/dist/server/utils/github-remote.d.ts +9 -0
- package/dist/server/utils/github-remote.js +62 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/path.d.ts +18 -0
- package/dist/server/utils/path.js +123 -0
- package/dist/server/utils/project-icon.d.ts +39 -0
- package/dist/server/utils/project-icon.js +364 -0
- package/dist/server/utils/promise-timeout.d.ts +9 -0
- package/dist/server/utils/promise-timeout.js +25 -0
- package/dist/server/utils/run-git-command.d.ts +37 -0
- package/dist/server/utils/run-git-command.js +232 -0
- package/dist/server/utils/spawn.d.ts +33 -0
- package/dist/server/utils/spawn.js +71 -0
- package/dist/server/utils/string-command-shell.d.ts +10 -0
- package/dist/server/utils/string-command-shell.js +21 -0
- package/dist/server/utils/tree-kill.d.ts +18 -0
- package/dist/server/utils/tree-kill.js +77 -0
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.js +41 -0
- package/dist/server/utils/worktree-metadata.d.ts +39 -0
- package/dist/server/utils/worktree-metadata.js +174 -0
- package/dist/server/utils/worktree.d.ts +205 -0
- package/dist/server/utils/worktree.js +1119 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-67f19cbfce758da6aa23c38c2dbd6a33.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6888615a6b700f975c1f78501ad8577c.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js +16683 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-dc1e81e7cbad84d30a01c48dcc9a5a3e.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-991ae7fd00f9fed45084fbb39160e8b8.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js +5 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-fdb4d787a259ce350f76280ca0e2bfa2.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js +11 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-9502a8e721925a6353ec45f7613f537e.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js +60 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-4ed5094aa059a0fc724f5ae70dd2f693.js.map.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +196 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/server/web-ui/service-worker.js +87 -0
- package/dist/server/web-ui/service-worker.js.br +0 -0
- package/dist/server/web-ui/service-worker.js.gz +0 -0
- package/dist/src/executable-resolution/executable-resolution.js +118 -0
- package/dist/src/executable-resolution/windows.js +65 -0
- package/dist/src/server/agent/provider-launch-config.js +183 -0
- package/dist/src/server/paseo-env.js +53 -0
- package/dist/src/server/paseo-home.js +19 -0
- package/dist/src/server/persisted-config.js +424 -0
- package/dist/src/server/pid-lock.js +170 -0
- package/dist/src/server/private-files.js +37 -0
- package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
- package/dist/src/server/update/slots.js +97 -0
- package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
- package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
- package/dist/src/utils/spawn.js +71 -0
- package/dist/src/utils/windows-command.js +41 -0
- package/package.json +146 -0
|
@@ -0,0 +1,881 @@
|
|
|
1
|
+
// THE INGESTION LEDGER - the daemon's durable memory of what it has already
|
|
2
|
+
// dispatched, so an unattended overnight run does not re-fire the same item
|
|
3
|
+
// every tick.
|
|
4
|
+
//
|
|
5
|
+
// It answers exactly one question, `isFresh()`, and that question is keyed on
|
|
6
|
+
// the item's CONTENT, not its id: an item whose content has not changed is
|
|
7
|
+
// never dispatched twice, while an item whose content DID change re-fires
|
|
8
|
+
// exactly once. Keying on the id instead would permanently silence an item
|
|
9
|
+
// after its first sighting, which is the bug this table exists to prevent.
|
|
10
|
+
//
|
|
11
|
+
// Semantics ported from `~/super-repo/tooling/loops/lib/ledger.mjs`:
|
|
12
|
+
// contentChanged :38, touch :42, inBackoff :73.
|
|
13
|
+
//
|
|
14
|
+
// SCOPE: `touch()` writes first_seen_at / last_seen_at / content_hash / meta
|
|
15
|
+
// only. `handled_at` and `outcome` are written by `mark()` and by nothing else,
|
|
16
|
+
// because pre-writing them anywhere earlier would record INTENT as fact - it
|
|
17
|
+
// would mark an item handled before anything actually handled it, silently
|
|
18
|
+
// defeating the "mark only after success" guarantee this ledger exists for.
|
|
19
|
+
//
|
|
20
|
+
// The claim/mark pair (Story 3.2) is what makes a crash survivable: `claim()`
|
|
21
|
+
// runs at dispatch, `mark()` only once the action reported success, and
|
|
22
|
+
// `releaseStaleClaims()` at daemon boot turns whatever was left claimed-but-
|
|
23
|
+
// unmarked back into an eligible item - exactly once, not once per boot.
|
|
24
|
+
import { createRequire } from "node:module";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
import { ReconcileVerdictSchema, } from "@hyperdrive.bot/fleet-protocol/ingestion/run-view";
|
|
27
|
+
import { FAIL_SIG_MAX_LENGTH, isHardFailureSig } from "./hard-failure.js";
|
|
28
|
+
import { assertSafeSignature } from "./reconcile/signature-guard.js";
|
|
29
|
+
import { mapVerdict } from "./reconcile/verdict-mapping.js";
|
|
30
|
+
import { BACKOFF_COOLDOWN_MS, BACKOFF_THRESHOLD, ensureSchema, LEDGER_PRUNE_DAYS, } from "./ledger-schema.js";
|
|
31
|
+
import { utcDateKey } from "./utc-day.js";
|
|
32
|
+
/**
|
|
33
|
+
* The ledger file's basename inside the injected home directory.
|
|
34
|
+
*
|
|
35
|
+
* This module deliberately holds NO knowledge of where that directory is: the
|
|
36
|
+
* OS home dir and the env var that overrides it are the caller's business, and
|
|
37
|
+
* a test asserts this file never mentions either. That is what keeps a test run
|
|
38
|
+
* from ever writing into a developer's real home.
|
|
39
|
+
*/
|
|
40
|
+
const LEDGER_FILENAME = "paseo.sqlite";
|
|
41
|
+
/**
|
|
42
|
+
* The ledger could not be opened: `node:sqlite` is missing from this runtime,
|
|
43
|
+
* or the database file itself refused to open.
|
|
44
|
+
*
|
|
45
|
+
* This is thrown, never swallowed (epic decision D1). A ledger that degrades to
|
|
46
|
+
* a no-op is strictly worse than no ledger at all: every item would read as
|
|
47
|
+
* fresh forever, so an armed filter would re-dispatch its whole backlog on
|
|
48
|
+
* every single tick, unattended, with nothing in the logs saying why.
|
|
49
|
+
*
|
|
50
|
+
* Follows `ScheduleTargetGoneError` in `schedule/service.ts`.
|
|
51
|
+
*/
|
|
52
|
+
export class IngestionLedgerUnavailableError extends Error {
|
|
53
|
+
constructor(dbPath, options) {
|
|
54
|
+
super(`Ingestion ledger could not open ${dbPath}. The daemon has no durable dedupe memory, so an armed filter would re-dispatch every item on every tick.`, options);
|
|
55
|
+
this.name = "IngestionLedgerUnavailableError";
|
|
56
|
+
this.dbPath = dbPath;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const META_ALLOWED_KEYS = ["sourceId", "subject", "url", "groupKey", "receivedAt"];
|
|
60
|
+
/**
|
|
61
|
+
* `fail_sig` stamped on a claim that a daemon restart released.
|
|
62
|
+
*
|
|
63
|
+
* Decision D2: a crash is not an action failure in principle, but it is one for
|
|
64
|
+
* the purpose of not repeating it. An item that wedges the daemon
|
|
65
|
+
* `BACKOFF_THRESHOLD` times lands in the ordinary backoff window instead of
|
|
66
|
+
* crash-looping the daemon on every boot.
|
|
67
|
+
*/
|
|
68
|
+
export const DAEMON_RESTART_FAIL_SIG = "daemon-restart";
|
|
69
|
+
/** Shared empty default so `releaseStaleClaims()` allocates nothing on the common path. */
|
|
70
|
+
const NO_RUNS_IN_FLIGHT = new Set();
|
|
71
|
+
/** Milliseconds in a day, for `prune()`'s cutoff arithmetic. */
|
|
72
|
+
const MS_PER_DAY = 86400000;
|
|
73
|
+
/**
|
|
74
|
+
* Resolve `node:sqlite` LAZILY.
|
|
75
|
+
*
|
|
76
|
+
* A static top-level `import { DatabaseSync } from "node:sqlite"` (the
|
|
77
|
+
* `search/index-store.ts` style) would be uncatchable on a runtime that lacks
|
|
78
|
+
* the module - importing this file would crash the daemon at load. `createRequire`
|
|
79
|
+
* moves that failure inside a `try`, so importing the module is always safe and
|
|
80
|
+
* CONSTRUCTING the ledger is what fails.
|
|
81
|
+
*
|
|
82
|
+
* Unlike `meetings-http.ts:getDatabaseSyncCtor()`, nothing is cached and a
|
|
83
|
+
* failure is not memoized as `null`: there is no degrade path here to memoize.
|
|
84
|
+
*/
|
|
85
|
+
function loadDatabaseSyncCtor() {
|
|
86
|
+
const req = createRequire(import.meta.url);
|
|
87
|
+
return req("node:sqlite").DatabaseSync;
|
|
88
|
+
}
|
|
89
|
+
function asString(value) {
|
|
90
|
+
return typeof value === "string" ? value : null;
|
|
91
|
+
}
|
|
92
|
+
function asNumber(value) {
|
|
93
|
+
return typeof value === "number" ? value : null;
|
|
94
|
+
}
|
|
95
|
+
/** Narrow one sqlite row. Kept flat: `no-explicit-any` is error-level here. */
|
|
96
|
+
function toEntry(row) {
|
|
97
|
+
return {
|
|
98
|
+
filterId: asString(row.filter_id) ?? "",
|
|
99
|
+
itemKey: asString(row.item_key) ?? "",
|
|
100
|
+
contentHash: asString(row.content_hash),
|
|
101
|
+
firstSeenAt: asNumber(row.first_seen_at) ?? 0,
|
|
102
|
+
lastSeenAt: asNumber(row.last_seen_at) ?? 0,
|
|
103
|
+
handledAt: asNumber(row.handled_at),
|
|
104
|
+
outcome: asString(row.outcome),
|
|
105
|
+
failCount: asNumber(row.fail_count) ?? 0,
|
|
106
|
+
lastFailAt: asNumber(row.last_fail_at),
|
|
107
|
+
failSig: asString(row.fail_sig),
|
|
108
|
+
alertedOn: asString(row.alerted_on),
|
|
109
|
+
claimedAt: asNumber(row.claimed_at),
|
|
110
|
+
claimRunId: asString(row.claim_run_id),
|
|
111
|
+
agentId: asString(row.agent_id),
|
|
112
|
+
meta: asString(row.meta),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* CONTENT strategy, ported from `ledger.mjs:38`. An unknown key is always
|
|
117
|
+
* changed, which is what makes a never-before-seen item fresh.
|
|
118
|
+
*
|
|
119
|
+
* Exported for testing. Production callers go through `isFresh`.
|
|
120
|
+
*/
|
|
121
|
+
export function contentChanged(entry, contentHash) {
|
|
122
|
+
return !entry || entry.contentHash !== contentHash;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Retry-storm guard, ported from `ledger.mjs:73`. An item that has failed
|
|
126
|
+
* `BACKOFF_THRESHOLD` times in a row is parked until `BACKOFF_COOLDOWN_MS` has
|
|
127
|
+
* elapsed since its last failure, then gets ONE retry; if that fails,
|
|
128
|
+
* `last_fail_at` resets and it parks again - roughly one attempt per window
|
|
129
|
+
* instead of one per tick.
|
|
130
|
+
*
|
|
131
|
+
* `fail_count` is written by `recordFailure()` and by `releaseStaleClaims()`,
|
|
132
|
+
* and cleared by `mark()`. Those three are its only writers.
|
|
133
|
+
*
|
|
134
|
+
* Exported for testing. Production callers go through `isFresh`.
|
|
135
|
+
*/
|
|
136
|
+
export function inBackoff(entry, now) {
|
|
137
|
+
if (!entry || entry.failCount < BACKOFF_THRESHOLD)
|
|
138
|
+
return false;
|
|
139
|
+
return now - (entry.lastFailAt ?? 0) < BACKOFF_COOLDOWN_MS;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Epoch ms this entry's backoff window expires, or null when not parked.
|
|
143
|
+
* Derived, never stored.
|
|
144
|
+
*
|
|
145
|
+
* The ONE place the window is computed. `listForFilter` renders it onto the
|
|
146
|
+
* wire and `recordFailure` returns it; neither re-derives
|
|
147
|
+
* `lastFailAt + BACKOFF_COOLDOWN_MS` locally, so the wire value and the
|
|
148
|
+
* suppression decision can never disagree about when an item wakes up.
|
|
149
|
+
*
|
|
150
|
+
* Exported for testing. Production callers read it off the wire shape or off
|
|
151
|
+
* `FailureOutcome`.
|
|
152
|
+
*/
|
|
153
|
+
/**
|
|
154
|
+
* A zero-valued `LedgerEntry` so `listRunViewRows` can call `backoffUntil` with
|
|
155
|
+
* only the two fields it reads, instead of re-deriving the window locally.
|
|
156
|
+
*
|
|
157
|
+
* Spreading over this rather than casting keeps `no-explicit-any` satisfied and,
|
|
158
|
+
* more usefully, means a field ADDED to `LedgerEntry` fails to compile here
|
|
159
|
+
* until somebody decides what its neutral value is.
|
|
160
|
+
*/
|
|
161
|
+
const EMPTY_ENTRY = {
|
|
162
|
+
filterId: "",
|
|
163
|
+
itemKey: "",
|
|
164
|
+
contentHash: null,
|
|
165
|
+
firstSeenAt: 0,
|
|
166
|
+
lastSeenAt: 0,
|
|
167
|
+
handledAt: null,
|
|
168
|
+
outcome: null,
|
|
169
|
+
failCount: 0,
|
|
170
|
+
lastFailAt: null,
|
|
171
|
+
failSig: null,
|
|
172
|
+
alertedOn: null,
|
|
173
|
+
claimedAt: null,
|
|
174
|
+
claimRunId: null,
|
|
175
|
+
agentId: null,
|
|
176
|
+
meta: null,
|
|
177
|
+
};
|
|
178
|
+
export function backoffUntil(entry) {
|
|
179
|
+
if (entry.failCount < BACKOFF_THRESHOLD || entry.lastFailAt === null)
|
|
180
|
+
return null;
|
|
181
|
+
return entry.lastFailAt + BACKOFF_COOLDOWN_MS;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clamp a caller-supplied signature to what this table will store.
|
|
185
|
+
*
|
|
186
|
+
* Two jobs, both at the WRITE boundary rather than only in `hardFailureSig`,
|
|
187
|
+
* because a caller can pass a signature this module did not produce:
|
|
188
|
+
* - a falsy signature becomes SQL NULL, which `COALESCE` then reads as
|
|
189
|
+
* "leave the stored one alone" (`ledger.mjs:66`)
|
|
190
|
+
* - a long one is truncated at 64 characters
|
|
191
|
+
*
|
|
192
|
+
* Be precise about what the cap is: a BLAST-RADIUS limit, not a sanitizer. It
|
|
193
|
+
* bounds how much of a mistaken input can land in the column; it cannot make a
|
|
194
|
+
* 64-character prefix of a raw log safe. The actual control is upstream and is
|
|
195
|
+
* a closed set: `fail_sig` is only ever `hardFailureSig()`'s output (eight
|
|
196
|
+
* literal phrases) or `DAEMON_RESTART_FAIL_SIG`. Passing a raw log line here is
|
|
197
|
+
* a call-site bug, and the cap only limits what it costs.
|
|
198
|
+
*/
|
|
199
|
+
function normalizeFailSig(sig) {
|
|
200
|
+
if (!sig)
|
|
201
|
+
return null;
|
|
202
|
+
return sig.slice(0, FAIL_SIG_MAX_LENGTH);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Copy only the allow-listed keys, dropping undefined ones so the stored JSON
|
|
206
|
+
* stays small. Returns null when nothing survives, so the column reads as SQL
|
|
207
|
+
* NULL rather than the string `"{}"`.
|
|
208
|
+
*/
|
|
209
|
+
function serializeMeta(meta) {
|
|
210
|
+
if (!meta)
|
|
211
|
+
return null;
|
|
212
|
+
const safe = {};
|
|
213
|
+
for (const key of META_ALLOWED_KEYS) {
|
|
214
|
+
const value = meta[key];
|
|
215
|
+
if (typeof value === "string")
|
|
216
|
+
safe[key] = value;
|
|
217
|
+
}
|
|
218
|
+
return Object.keys(safe).length > 0 ? JSON.stringify(safe) : null;
|
|
219
|
+
}
|
|
220
|
+
export class IngestionLedger {
|
|
221
|
+
constructor(options) {
|
|
222
|
+
/** Values already complained about, so a corrupted column is loud once, not once per row. */
|
|
223
|
+
this.warnedVerdicts = new Set();
|
|
224
|
+
// Prepared once and reused, following `SessionIndexStore`. The ingestion pass
|
|
225
|
+
// calls get/touch once per item per tick, so re-preparing would re-plan the
|
|
226
|
+
// same two statements thousands of times a night.
|
|
227
|
+
this.getStmt = null;
|
|
228
|
+
this.touchStmt = null;
|
|
229
|
+
this.listStmt = null;
|
|
230
|
+
this.claimInsertStmt = null;
|
|
231
|
+
this.claimUpdateStmt = null;
|
|
232
|
+
this.markInsertStmt = null;
|
|
233
|
+
this.markUpdateStmt = null;
|
|
234
|
+
this.recordFailureStmt = null;
|
|
235
|
+
this.alertClaimedStmt = null;
|
|
236
|
+
this.claimAlertStmt = null;
|
|
237
|
+
this.selectClaimedStmt = null;
|
|
238
|
+
this.releaseClaimStmt = null;
|
|
239
|
+
this.pruneStmt = null;
|
|
240
|
+
this.pruneBudgetStmt = null;
|
|
241
|
+
this.readBudgetStmt = null;
|
|
242
|
+
this.reserveBudgetStmt = null;
|
|
243
|
+
this.releaseBudgetStmt = null;
|
|
244
|
+
/** `pending`: stamps, resets the counter, and never names `verified_signature`. */
|
|
245
|
+
this.stampVerificationStmt = null;
|
|
246
|
+
/** The two CLOSING verdicts: the only statement that names `verified_signature`. */
|
|
247
|
+
this.closeVerificationStmt = null;
|
|
248
|
+
/** `unreachable`: names neither `verified_at` nor `verified_verdict`, by construction. */
|
|
249
|
+
this.unreachableVerificationStmt = null;
|
|
250
|
+
this.getVerificationStmt = null;
|
|
251
|
+
this.runViewStmt = null;
|
|
252
|
+
this.now = options.now ?? (() => new Date());
|
|
253
|
+
this.warn = options.warn ?? ((message) => console.warn(message));
|
|
254
|
+
this.dbPath = join(options.paseoHome, LEDGER_FILENAME);
|
|
255
|
+
let db;
|
|
256
|
+
try {
|
|
257
|
+
const DatabaseSyncCtor = loadDatabaseSyncCtor();
|
|
258
|
+
db = new DatabaseSyncCtor(this.dbPath);
|
|
259
|
+
ensureSchema(db);
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
throw new IngestionLedgerUnavailableError(this.dbPath, { cause: error });
|
|
263
|
+
}
|
|
264
|
+
this.db = db;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* THE one database handle, for collaborators that must write to the same file.
|
|
268
|
+
*
|
|
269
|
+
* Exposed for Story 5.4's `CohortStore`, and read-only on purpose: a caller
|
|
270
|
+
* gets the handle, never the right to replace it. The alternative - having the
|
|
271
|
+
* cohort store open its own `DatabaseSync` on the same path - would put two
|
|
272
|
+
* connections and two WAL readers on a file this daemon deliberately keeps to
|
|
273
|
+
* one, and would make a cohort write invisible to a ledger read inside the
|
|
274
|
+
* same transaction.
|
|
275
|
+
*
|
|
276
|
+
* `close()` stays this class's job. Nothing that borrows the handle may close it.
|
|
277
|
+
*/
|
|
278
|
+
get database() {
|
|
279
|
+
return this.db;
|
|
280
|
+
}
|
|
281
|
+
/** One row, or undefined when this (filter, item) has never been seen. */
|
|
282
|
+
get(filterId, itemKey) {
|
|
283
|
+
this.getStmt ?? (this.getStmt = this.db.prepare("SELECT * FROM ingestion_items WHERE filter_id = ? AND item_key = ?"));
|
|
284
|
+
const row = this.getStmt.get(filterId, itemKey);
|
|
285
|
+
return row ? toEntry(row) : undefined;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* THE question, and the only place it is answered.
|
|
289
|
+
*
|
|
290
|
+
* `actionable && contentChanged && !inBackoff` - one expression, one place.
|
|
291
|
+
* No other module re-derives freshness from these parts; `contentChanged` and
|
|
292
|
+
* `inBackoff` are exported for their own tests, not for callers to recombine.
|
|
293
|
+
*/
|
|
294
|
+
isFresh(entry, input) {
|
|
295
|
+
// A live claim short-circuits EVERYTHING, ahead of actionable, contentChanged
|
|
296
|
+
// and inBackoff: an item somebody is already acting on is not eligible, even
|
|
297
|
+
// if its content changed since the claim was taken.
|
|
298
|
+
//
|
|
299
|
+
// Decision D4 - there is deliberately NO claim TTL. A claim is cleared by
|
|
300
|
+
// exactly one mechanism, `releaseStaleClaims()` at daemon boot, so an orphan
|
|
301
|
+
// claim cannot outlive a daemon lifetime. A TTL would be a second, competing
|
|
302
|
+
// reaper that fires while the run is still going and re-dispatches a live
|
|
303
|
+
// item, which is the precise duplicate-artifact failure this ledger exists to
|
|
304
|
+
// prevent. Do not add one "for safety".
|
|
305
|
+
if (entry && entry.claimedAt !== null)
|
|
306
|
+
return false;
|
|
307
|
+
return (input.actionable &&
|
|
308
|
+
contentChanged(entry, input.contentHash) &&
|
|
309
|
+
!inBackoff(entry, this.now().getTime()));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Record that an item was SEEN this pass. Deliberately suppresses nothing:
|
|
313
|
+
* `isFresh` returns the same verdict before and after any number of `touch`
|
|
314
|
+
* calls. Only a content hash written by a successful handling (Story 3.2)
|
|
315
|
+
* suppresses an item.
|
|
316
|
+
*
|
|
317
|
+
* On a known key this updates `last_seen_at` and `meta` ONLY - `first_seen_at`,
|
|
318
|
+
* `content_hash`, `handled_at` and `outcome` are left exactly as they were.
|
|
319
|
+
*/
|
|
320
|
+
touch(filterId, itemKey, meta) {
|
|
321
|
+
this.touchStmt ?? (this.touchStmt = this.db.prepare(`INSERT INTO ingestion_items (filter_id, item_key, first_seen_at, last_seen_at, fail_count, meta)
|
|
322
|
+
VALUES (?, ?, ?, ?, 0, ?)
|
|
323
|
+
ON CONFLICT(filter_id, item_key) DO UPDATE SET
|
|
324
|
+
last_seen_at = excluded.last_seen_at,
|
|
325
|
+
meta = COALESCE(excluded.meta, ingestion_items.meta)`));
|
|
326
|
+
// STRICT table: bind an integer, never a Date and never a float.
|
|
327
|
+
const timestamp = this.now().getTime();
|
|
328
|
+
this.touchStmt.run(filterId, itemKey, timestamp, timestamp, serializeMeta(meta));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Recent items for one filter, newest first - the ordering that lets this
|
|
332
|
+
* ride `idx_ingestion_items_filter_seen` instead of sorting a scan.
|
|
333
|
+
*/
|
|
334
|
+
listForFilter(filterId, limit) {
|
|
335
|
+
this.listStmt ?? (this.listStmt = this.db.prepare(`SELECT * FROM ingestion_items
|
|
336
|
+
WHERE filter_id = ?
|
|
337
|
+
ORDER BY last_seen_at DESC
|
|
338
|
+
LIMIT ?`));
|
|
339
|
+
return this.listStmt.all(filterId, limit).map((row) => {
|
|
340
|
+
const entry = toEntry(row);
|
|
341
|
+
return {
|
|
342
|
+
itemKey: entry.itemKey,
|
|
343
|
+
contentHash: entry.contentHash,
|
|
344
|
+
outcome: entry.outcome,
|
|
345
|
+
failCount: entry.failCount,
|
|
346
|
+
backoffUntil: backoffUntil(entry),
|
|
347
|
+
failSig: entry.failSig,
|
|
348
|
+
agentId: entry.agentId,
|
|
349
|
+
};
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* CLAIM one item for one dispatch. Compare-and-set, not a blind write.
|
|
354
|
+
*
|
|
355
|
+
* Upserts the row if this (filter, item) has never been seen, then takes the
|
|
356
|
+
* claim ONLY where `claimed_at IS NULL`. Returns `true` when this dispatch won
|
|
357
|
+
* the claim; `false` when another dispatch already holds it, in which case the
|
|
358
|
+
* caller must skip the item rather than act on it.
|
|
359
|
+
*
|
|
360
|
+
* The compare-and-set (decision D3) is a strict superset of a blind
|
|
361
|
+
* `UPDATE ... SET claimed_at = ?`: two dispatch paths evaluating freshness in
|
|
362
|
+
* the same millisecond would both write a claim, the second silently
|
|
363
|
+
* overwriting the first's `claim_run_id`, and `releaseStaleClaims()` would then
|
|
364
|
+
* strand one run forever. The CAS makes the loser observable.
|
|
365
|
+
*
|
|
366
|
+
* This is ITEM-level dedupe and is NOT a substitute for
|
|
367
|
+
* `ScheduleService.runningScheduleIds` or `agentManager.hasInFlightRun` - those
|
|
368
|
+
* remain the process-level single-flight and are untouched by this file.
|
|
369
|
+
*
|
|
370
|
+
* Both statements run inside one transaction, so a crash between them cannot
|
|
371
|
+
* leave a seeded row that nobody ever claimed or released.
|
|
372
|
+
*/
|
|
373
|
+
claim(filterId, itemKey, options) {
|
|
374
|
+
this.claimInsertStmt ?? (this.claimInsertStmt = this.db.prepare(`INSERT OR IGNORE INTO ingestion_items (filter_id, item_key, first_seen_at, last_seen_at, fail_count)
|
|
375
|
+
VALUES (?, ?, ?, ?, 0)`));
|
|
376
|
+
this.claimUpdateStmt ?? (this.claimUpdateStmt = this.db.prepare(
|
|
377
|
+
// `last_run_id` is written from the SAME `options.runId` in the SAME
|
|
378
|
+
// statement as `claim_run_id`, so the two can never disagree about which
|
|
379
|
+
// run this was. They differ only in lifetime: `mark()` and
|
|
380
|
+
// `releaseStaleClaims()` clear the claim, and neither touches this one.
|
|
381
|
+
`UPDATE ingestion_items
|
|
382
|
+
SET claimed_at = ?, claim_run_id = ?, last_run_id = ?, agent_id = ?, last_seen_at = ?
|
|
383
|
+
WHERE filter_id = ? AND item_key = ? AND claimed_at IS NULL`));
|
|
384
|
+
// STRICT table: bind an integer, never a Date and never a float.
|
|
385
|
+
const timestamp = this.now().getTime();
|
|
386
|
+
this.db.exec("BEGIN");
|
|
387
|
+
try {
|
|
388
|
+
this.claimInsertStmt.run(filterId, itemKey, timestamp, timestamp);
|
|
389
|
+
const result = this.claimUpdateStmt.run(timestamp, options.runId, options.runId, options.agentId ?? null, timestamp, filterId, itemKey);
|
|
390
|
+
this.db.exec("COMMIT");
|
|
391
|
+
return result.changes === 1;
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
this.db.exec("ROLLBACK");
|
|
395
|
+
throw error;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* MARK one item handled. Called ONLY after the action reported success -
|
|
400
|
+
* never at dispatch, which is the whole reason `claim()` and `mark()` are two
|
|
401
|
+
* methods and not one.
|
|
402
|
+
*
|
|
403
|
+
* A terminal outcome means the item succeeded, so the same single `UPDATE`
|
|
404
|
+
* clears every failure and backoff column alongside the claim
|
|
405
|
+
* (`ledger.mjs:53-54`). `alerted_on` is this table's name for `ledger.mjs`'s
|
|
406
|
+
* `alertedAt`, and holds a `YYYY-MM-DD` UTC string rather than an epoch.
|
|
407
|
+
*
|
|
408
|
+
* `contentHash: undefined` PRESERVES the stored hash via `COALESCE`, exactly
|
|
409
|
+
* as `ledger.mjs:52` does with `if (contentHash != null)`; the same is true of
|
|
410
|
+
* `agentId`. Passing an explicit value overwrites.
|
|
411
|
+
*
|
|
412
|
+
* `MarkOptions` carries no `meta` field, and must not grow one "for symmetry
|
|
413
|
+
* with `touch()`": its absence is what keeps an aggregator payload from
|
|
414
|
+
* smuggling a credential into `ingestion_items.meta` through this path.
|
|
415
|
+
*/
|
|
416
|
+
mark(filterId, itemKey, options) {
|
|
417
|
+
this.markInsertStmt ?? (this.markInsertStmt = this.db.prepare(`INSERT OR IGNORE INTO ingestion_items (filter_id, item_key, first_seen_at, last_seen_at, fail_count)
|
|
418
|
+
VALUES (?, ?, ?, ?, 0)`));
|
|
419
|
+
this.markUpdateStmt ?? (this.markUpdateStmt = this.db.prepare(`UPDATE ingestion_items
|
|
420
|
+
SET handled_at = ?,
|
|
421
|
+
outcome = ?,
|
|
422
|
+
last_seen_at = ?,
|
|
423
|
+
content_hash = COALESCE(?, content_hash),
|
|
424
|
+
agent_id = COALESCE(?, agent_id),
|
|
425
|
+
fail_count = 0,
|
|
426
|
+
last_fail_at = NULL,
|
|
427
|
+
fail_sig = NULL,
|
|
428
|
+
alerted_on = NULL,
|
|
429
|
+
claimed_at = NULL,
|
|
430
|
+
claim_run_id = NULL
|
|
431
|
+
WHERE filter_id = ? AND item_key = ?`));
|
|
432
|
+
const timestamp = this.now().getTime();
|
|
433
|
+
this.db.exec("BEGIN");
|
|
434
|
+
try {
|
|
435
|
+
this.markInsertStmt.run(filterId, itemKey, timestamp, timestamp);
|
|
436
|
+
this.markUpdateStmt.run(timestamp, options.outcome, timestamp, options.contentHash ?? null, options.agentId ?? null, filterId, itemKey);
|
|
437
|
+
this.db.exec("COMMIT");
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
this.db.exec("ROLLBACK");
|
|
441
|
+
throw error;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Has nothing alerted yet TODAY for this `(filterId, sig)` pair?
|
|
446
|
+
*
|
|
447
|
+
* Keyed on the FILTER and the signature, never on the item. One dead
|
|
448
|
+
* credential fails every item of a filter; keying on the item would turn one
|
|
449
|
+
* expired key into one alert per item, which is the retry-storm this whole
|
|
450
|
+
* mechanism exists to end, merely relocated to the notification channel.
|
|
451
|
+
*
|
|
452
|
+
* Names exactly what it silences - the `(filter_id, fail_sig, alerted_on)`
|
|
453
|
+
* triple - rather than listing signatures it is willing to report. A
|
|
454
|
+
* signature nobody anticipated therefore comes out noisy, not invisible.
|
|
455
|
+
*
|
|
456
|
+
* Pure read: it reports whether the day is claimed, it does NOT claim it.
|
|
457
|
+
* `recordFailure` does the claiming, and only then reports `shouldAlert`.
|
|
458
|
+
*/
|
|
459
|
+
shouldAlertToday(filterId, sig, now) {
|
|
460
|
+
this.alertClaimedStmt ?? (this.alertClaimedStmt = this.db.prepare(`SELECT 1 AS claimed FROM ingestion_items
|
|
461
|
+
WHERE filter_id = ? AND fail_sig = ? AND alerted_on = ?
|
|
462
|
+
LIMIT 1`));
|
|
463
|
+
return this.alertClaimedStmt.get(filterId, sig, utcDateKey(now)) === undefined;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Record that acting on an item FAILED. The write half of the retry-storm
|
|
467
|
+
* guard, ported from `ledger.mjs:62`.
|
|
468
|
+
*
|
|
469
|
+
* One upsert does both cases: an unknown `(filter, item)` is created with
|
|
470
|
+
* `fail_count = 1`, a known one is incremented. `fail_sig` goes through
|
|
471
|
+
* `COALESCE`, so a failure that carries no signature leaves an earlier one
|
|
472
|
+
* standing instead of erasing it.
|
|
473
|
+
*
|
|
474
|
+
* Failures 1 and 2 leave the item eligible on the very next tick. Failure 3
|
|
475
|
+
* parks it for `BACKOFF_COOLDOWN_MS`; the retry that the expired window
|
|
476
|
+
* admits, if it fails, lands back here, re-stamps `last_fail_at` and parks it
|
|
477
|
+
* again - so the steady state is at most one attempt per 6h window, never one
|
|
478
|
+
* per tick.
|
|
479
|
+
*
|
|
480
|
+
* Everything runs in ONE transaction, and the ordering inside it is
|
|
481
|
+
* load-bearing. The upsert comes first, which takes the write lock, so the
|
|
482
|
+
* read-then-claim of today's alert that follows cannot interleave with
|
|
483
|
+
* another caller doing the same: two concurrent hard failures cannot both
|
|
484
|
+
* come away believing they alerted. `shouldAlert` is returned only after the
|
|
485
|
+
* day was actually claimed in the database - never on the strength of having
|
|
486
|
+
* intended to claim it.
|
|
487
|
+
*
|
|
488
|
+
* Note there is no `try/catch` around the query itself. A `SELECT` that fails
|
|
489
|
+
* must surface, not degrade into "no alert today": an empty result and a
|
|
490
|
+
* broken database would otherwise look identical, and the broken one would
|
|
491
|
+
* stay silent forever.
|
|
492
|
+
*/
|
|
493
|
+
recordFailure(filterId, itemKey, options = {}) {
|
|
494
|
+
this.recordFailureStmt ?? (this.recordFailureStmt = this.db.prepare(
|
|
495
|
+
// `excluded.*` rather than re-binding the same two values, matching
|
|
496
|
+
// `touch()` above; identical semantics, half the binds.
|
|
497
|
+
`INSERT INTO ingestion_items (filter_id, item_key, first_seen_at, last_seen_at, fail_count, last_fail_at, fail_sig)
|
|
498
|
+
VALUES (?, ?, ?, ?, 1, ?, ?)
|
|
499
|
+
ON CONFLICT(filter_id, item_key) DO UPDATE SET
|
|
500
|
+
fail_count = fail_count + 1,
|
|
501
|
+
last_fail_at = excluded.last_fail_at,
|
|
502
|
+
fail_sig = COALESCE(excluded.fail_sig, ingestion_items.fail_sig)`));
|
|
503
|
+
this.claimAlertStmt ?? (this.claimAlertStmt = this.db.prepare("UPDATE ingestion_items SET alerted_on = ? WHERE filter_id = ? AND item_key = ?"));
|
|
504
|
+
const nowDate = this.now();
|
|
505
|
+
// STRICT table: bind an integer, never a Date and never a float.
|
|
506
|
+
const timestamp = nowDate.getTime();
|
|
507
|
+
const sig = normalizeFailSig(options.sig);
|
|
508
|
+
// Derived from THIS failure's signature, not from the row's stored one. A
|
|
509
|
+
// plain error following an earlier `rate-limit` leaves `rate-limit` in the
|
|
510
|
+
// column via COALESCE, and must not inherit its abort: the shell aborts on
|
|
511
|
+
// `$SIG` from the run it just made, not on history.
|
|
512
|
+
const hardFailure = isHardFailureSig(sig);
|
|
513
|
+
this.db.exec("BEGIN");
|
|
514
|
+
try {
|
|
515
|
+
this.recordFailureStmt.run(filterId, itemKey, timestamp, timestamp, timestamp, sig);
|
|
516
|
+
let shouldAlert = false;
|
|
517
|
+
if (hardFailure && sig !== null && this.shouldAlertToday(filterId, sig, nowDate)) {
|
|
518
|
+
this.claimAlertStmt.run(utcDateKey(nowDate), filterId, itemKey);
|
|
519
|
+
shouldAlert = true;
|
|
520
|
+
}
|
|
521
|
+
const entry = this.get(filterId, itemKey);
|
|
522
|
+
this.db.exec("COMMIT");
|
|
523
|
+
return {
|
|
524
|
+
failCount: entry?.failCount ?? 1,
|
|
525
|
+
lastFailAt: entry?.lastFailAt ?? timestamp,
|
|
526
|
+
failSig: entry?.failSig ?? null,
|
|
527
|
+
backoffUntil: entry ? backoffUntil(entry) : null,
|
|
528
|
+
hardFailure,
|
|
529
|
+
shouldAlert,
|
|
530
|
+
// Not `shouldAlert && hardFailure`. See `FailureOutcome.abortTick`.
|
|
531
|
+
abortTick: hardFailure,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
this.db.exec("ROLLBACK");
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Release every claim whose run is not still in flight, and record one failure
|
|
541
|
+
* against each. Called once at daemon boot, where nothing is in flight by
|
|
542
|
+
* definition, which is why `inFlightRunIds` defaults to empty.
|
|
543
|
+
*
|
|
544
|
+
* The select names what it SILENCES (`inFlightRunIds`), not what it wants: it
|
|
545
|
+
* takes every `claimed_at IS NOT NULL` row and then skips the one set it is
|
|
546
|
+
* told to spare, so a claim in a state nobody anticipated comes out noisy
|
|
547
|
+
* rather than invisible.
|
|
548
|
+
*
|
|
549
|
+
* Decision D2 - the `fail_count + 1` is deliberate. A crash is not an action
|
|
550
|
+
* failure in principle, but it is one for the purpose of not repeating it: an
|
|
551
|
+
* item that wedges the daemon `BACKOFF_THRESHOLD` times enters the ordinary
|
|
552
|
+
* backoff window instead of crash-looping the daemon on every boot. The
|
|
553
|
+
* increment happens once per release, not once per boot - a second call with
|
|
554
|
+
* nothing claimed releases nothing and increments nothing.
|
|
555
|
+
*
|
|
556
|
+
* Returns the number of rows released. All releases share one transaction.
|
|
557
|
+
*/
|
|
558
|
+
releaseStaleClaims(options) {
|
|
559
|
+
const inFlightRunIds = options?.inFlightRunIds ?? NO_RUNS_IN_FLIGHT;
|
|
560
|
+
this.selectClaimedStmt ?? (this.selectClaimedStmt = this.db.prepare("SELECT filter_id, item_key, claim_run_id FROM ingestion_items WHERE claimed_at IS NOT NULL"));
|
|
561
|
+
this.releaseClaimStmt ?? (this.releaseClaimStmt = this.db.prepare(`UPDATE ingestion_items
|
|
562
|
+
SET claimed_at = NULL,
|
|
563
|
+
claim_run_id = NULL,
|
|
564
|
+
fail_count = fail_count + 1,
|
|
565
|
+
last_fail_at = ?,
|
|
566
|
+
fail_sig = ?
|
|
567
|
+
WHERE filter_id = ? AND item_key = ? AND claimed_at IS NOT NULL`));
|
|
568
|
+
const claimed = this.selectClaimedStmt.all();
|
|
569
|
+
const stale = claimed.filter((row) => {
|
|
570
|
+
const runId = asString(row.claim_run_id);
|
|
571
|
+
return runId === null || !inFlightRunIds.has(runId);
|
|
572
|
+
});
|
|
573
|
+
if (stale.length === 0)
|
|
574
|
+
return 0;
|
|
575
|
+
const timestamp = this.now().getTime();
|
|
576
|
+
this.db.exec("BEGIN");
|
|
577
|
+
try {
|
|
578
|
+
let released = 0;
|
|
579
|
+
for (const row of stale) {
|
|
580
|
+
const result = this.releaseClaimStmt.run(timestamp, DAEMON_RESTART_FAIL_SIG, asString(row.filter_id) ?? "", asString(row.item_key) ?? "");
|
|
581
|
+
released += result.changes;
|
|
582
|
+
}
|
|
583
|
+
this.db.exec("COMMIT");
|
|
584
|
+
return released;
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
this.db.exec("ROLLBACK");
|
|
588
|
+
throw error;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Drop rows nothing has touched in `days`, returning how many were deleted.
|
|
593
|
+
*
|
|
594
|
+
* Two details are load-bearing:
|
|
595
|
+
*
|
|
596
|
+
* 1. `max(a, b, c)` with more than one argument is sqlite's SCALAR max, not
|
|
597
|
+
* the aggregate, so this compares the NEWEST of the three timestamps. That
|
|
598
|
+
* is a deliberate refinement over `ledger.mjs:81`'s first-truthy
|
|
599
|
+
* `handledAt || lastSeen || firstSeen` chain (decision D5): a row handled 40
|
|
600
|
+
* days ago but seen yesterday is live, and the first-truthy version would
|
|
601
|
+
* prune it. Do not "fix" this back.
|
|
602
|
+
* 2. `claimed_at IS NULL` never deletes a live claim. At boot this is defence
|
|
603
|
+
* in depth - `releaseStaleClaims()` already ran one line earlier - but it
|
|
604
|
+
* keeps `prune()` correct if the two calls are ever reordered, or if a
|
|
605
|
+
* future caller invokes it mid-run with claims outstanding.
|
|
606
|
+
*/
|
|
607
|
+
prune(days = LEDGER_PRUNE_DAYS) {
|
|
608
|
+
this.pruneStmt ?? (this.pruneStmt = this.db.prepare(`DELETE FROM ingestion_items
|
|
609
|
+
WHERE claimed_at IS NULL
|
|
610
|
+
AND max(coalesce(handled_at, 0), coalesce(last_seen_at, 0), coalesce(first_seen_at, 0)) < ?`));
|
|
611
|
+
this.pruneBudgetStmt ?? (this.pruneBudgetStmt = this.db.prepare("DELETE FROM ingestion_dispatch_budget WHERE day < ?"));
|
|
612
|
+
const now = this.now().getTime();
|
|
613
|
+
const cutoff = now - days * MS_PER_DAY;
|
|
614
|
+
// The budget cutoff is a `YYYY-MM-DD` STRING compared with `<`, which is
|
|
615
|
+
// only correct because the key is zero-padded ISO - lexicographic order
|
|
616
|
+
// equals chronological order for that format and for no other. See the DDL
|
|
617
|
+
// comment in `ledger-schema.ts`.
|
|
618
|
+
const budgetCutoffDay = utcDateKey(new Date(cutoff));
|
|
619
|
+
this.db.exec("BEGIN");
|
|
620
|
+
try {
|
|
621
|
+
const deletedItems = this.pruneStmt.run(cutoff).changes;
|
|
622
|
+
this.pruneBudgetStmt.run(budgetCutoffDay);
|
|
623
|
+
this.db.exec("COMMIT");
|
|
624
|
+
// Deliberately ITEM rows only. Story 3.2's callers and tests pin this
|
|
625
|
+
// number; a budget count silently folded in would make "pruned 4" mean
|
|
626
|
+
// two different things depending on which day it was read.
|
|
627
|
+
return deletedItems;
|
|
628
|
+
}
|
|
629
|
+
catch (error) {
|
|
630
|
+
this.db.exec("ROLLBACK");
|
|
631
|
+
throw error;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
// ---- CapBudgetStore (Story 3.4) -----------------------------------------
|
|
635
|
+
//
|
|
636
|
+
// The budget is a COUNT OF ATTEMPTS, held in its own table. It is never
|
|
637
|
+
// inferred from `ingestion_items`: that table is keyed per item, so counting
|
|
638
|
+
// it would count distinct items instead of dispatches and let a cap of 10
|
|
639
|
+
// mint up to 70 sessions across a day of retries (decision D-3.4-A).
|
|
640
|
+
/**
|
|
641
|
+
* How many dispatches `filterId` has been granted on `day`. `0` when the
|
|
642
|
+
* filter has no row for that day - which is indistinguishable from a row
|
|
643
|
+
* holding `0`, on purpose, since `reserveDispatches` never writes one.
|
|
644
|
+
*
|
|
645
|
+
* Returns `0` only after a SUCCESSFUL query. An open failure throws out of the
|
|
646
|
+
* constructor (epic D1); it never degrades into a zero here.
|
|
647
|
+
*/
|
|
648
|
+
readDispatched(filterId, day) {
|
|
649
|
+
this.readBudgetStmt ?? (this.readBudgetStmt = this.db.prepare("SELECT dispatched FROM ingestion_dispatch_budget WHERE filter_id = ? AND day = ?"));
|
|
650
|
+
const row = this.readBudgetStmt.get(filterId, day);
|
|
651
|
+
if (row === undefined)
|
|
652
|
+
return 0;
|
|
653
|
+
return asNumber(row.dispatched) ?? 0;
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Spend up to `requested` of the day's remaining budget and return how much
|
|
657
|
+
* was actually granted.
|
|
658
|
+
*
|
|
659
|
+
* The clamp lives INSIDE the transaction, not in `CapLimiter`. `node:sqlite`
|
|
660
|
+
* is synchronous and Node is single-threaded, so a same-process read-then-write
|
|
661
|
+
* race is not reachable today - but the e2e spec opens a second connection to
|
|
662
|
+
* the same file, and "correct only because of a runtime property nobody wrote
|
|
663
|
+
* down" is how the next reader gets bitten. `BEGIN IMMEDIATE` takes the write
|
|
664
|
+
* lock at the read, so two writers serialize instead of both seeing the same
|
|
665
|
+
* `dispatched` and both granting.
|
|
666
|
+
*
|
|
667
|
+
* When `granted === 0` it commits without writing, so a filter that asked at a
|
|
668
|
+
* full cap does not leave behind a row that a later reader could mistake for
|
|
669
|
+
* spend (AC #7).
|
|
670
|
+
*/
|
|
671
|
+
reserveDispatches(filterId, day, requested, capPerDay) {
|
|
672
|
+
this.reserveBudgetStmt ?? (this.reserveBudgetStmt = this.db.prepare(`INSERT INTO ingestion_dispatch_budget (filter_id, day, dispatched)
|
|
673
|
+
VALUES (?, ?, ?)
|
|
674
|
+
ON CONFLICT(filter_id, day) DO UPDATE SET
|
|
675
|
+
dispatched = dispatched + excluded.dispatched`));
|
|
676
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
677
|
+
try {
|
|
678
|
+
const used = this.readDispatched(filterId, day);
|
|
679
|
+
const granted = Math.max(0, Math.min(Math.trunc(requested), Math.trunc(capPerDay) - used));
|
|
680
|
+
if (granted > 0) {
|
|
681
|
+
// STRICT table: bind an integer, never a float. `Math.trunc` above is
|
|
682
|
+
// the boundary guard; `CapLimiter` has already rejected a fractional
|
|
683
|
+
// `capPerDay` outright (AC #13).
|
|
684
|
+
this.reserveBudgetStmt.run(filterId, day, granted);
|
|
685
|
+
}
|
|
686
|
+
this.db.exec("COMMIT");
|
|
687
|
+
return granted;
|
|
688
|
+
}
|
|
689
|
+
catch (error) {
|
|
690
|
+
this.db.exec("ROLLBACK");
|
|
691
|
+
throw error;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Hand `count` of the day's spend back, clamped at zero.
|
|
696
|
+
*
|
|
697
|
+
* `UPDATE` and never `INSERT`: releasing against a filter with no row today is
|
|
698
|
+
* a no-op, because a refund of budget that was never reserved is a caller bug,
|
|
699
|
+
* and materializing a `dispatched = 0` row to record it would make the absent
|
|
700
|
+
* row and the zero row distinguishable to a later reader for no gain.
|
|
701
|
+
*/
|
|
702
|
+
releaseDispatches(filterId, day, count) {
|
|
703
|
+
if (!Number.isFinite(count) || count <= 0)
|
|
704
|
+
return;
|
|
705
|
+
this.releaseBudgetStmt ?? (this.releaseBudgetStmt = this.db.prepare(`UPDATE ingestion_dispatch_budget
|
|
706
|
+
SET dispatched = max(0, dispatched - ?)
|
|
707
|
+
WHERE filter_id = ? AND day = ?`));
|
|
708
|
+
this.releaseBudgetStmt.run(Math.trunc(count), filterId, day);
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Record what a source read found, on the ONE row that already exists.
|
|
712
|
+
*
|
|
713
|
+
* THREE prepared statements, and which one runs is decided by `mapVerdict`
|
|
714
|
+
* rather than by a `switch` written here. That indirection is the point:
|
|
715
|
+
* `verdict-mapping.ts` is the single place that says what a verdict may do to
|
|
716
|
+
* a row, and a second opinion expressed as a `case` in this file is exactly
|
|
717
|
+
* how the two would come to disagree - quietly, in the direction of closing
|
|
718
|
+
* something nobody handled.
|
|
719
|
+
*
|
|
720
|
+
* The split across three statements is a safety property rather than an
|
|
721
|
+
* optimisation, because each statement's SQL TEXT enforces one invariant:
|
|
722
|
+
*
|
|
723
|
+
* - `pending` names `verified_at`, `verified_verdict`,
|
|
724
|
+
* `reconcile_attempted_at` and `reconcile_fail_count = 0`. It does NOT
|
|
725
|
+
* name `verified_signature`, so a successful read that found the artifact
|
|
726
|
+
* still open cannot blank the evidence of an earlier close. There is no
|
|
727
|
+
* signature to write: nothing happened.
|
|
728
|
+
* - the CLOSING statement (`handled-elsewhere`, `artifact-gone`) is the only
|
|
729
|
+
* one that names `verified_signature`, because a close is the only outcome
|
|
730
|
+
* that carries evidence.
|
|
731
|
+
* - the `unreachable` statement names ONLY `reconcile_attempted_at` and
|
|
732
|
+
* `reconcile_fail_count`. It cannot advance `verified_at` because
|
|
733
|
+
* `verified_at` is not in its SQL. That is epic D4's "leaves untouched"
|
|
734
|
+
* enforced by construction, not by a test remembering to check, and not by
|
|
735
|
+
* a runtime branch somebody can later reorder.
|
|
736
|
+
*
|
|
737
|
+
* Why the last one matters: `unreachable` means paseo could not look. Letting
|
|
738
|
+
* a failed read refresh the verification stamp would let a source that has
|
|
739
|
+
* been down for a week read as freshly verified, and the staleness gate would
|
|
740
|
+
* then stop retrying it. A failed read must age, not reset.
|
|
741
|
+
*
|
|
742
|
+
* `reconcile_fail_count = reconcile_fail_count + 1` in SQL rather than a
|
|
743
|
+
* read-modify-write in TypeScript, so two concurrent unreachable reads for the
|
|
744
|
+
* same item cannot lose an increment. The service's single-flight map makes
|
|
745
|
+
* that unlikely; the SQL makes it impossible.
|
|
746
|
+
*
|
|
747
|
+
* No statement touches `fail_count`, `last_fail_at` or `fail_sig` - Epic 3's
|
|
748
|
+
* DISPATCH counters. A source paseo cannot read is not an item that failed to
|
|
749
|
+
* dispatch, and burning the dispatch backoff on a network condition would park
|
|
750
|
+
* a perfectly good item (epic D5).
|
|
751
|
+
*
|
|
752
|
+
* An unknown `(filterId, itemKey)` updates ZERO rows and does not insert.
|
|
753
|
+
* Verification decorates an item the ledger already ingested; minting a row
|
|
754
|
+
* here would create an item nobody ever saw.
|
|
755
|
+
*/
|
|
756
|
+
recordVerification(filterId, itemKey, input) {
|
|
757
|
+
// Before anything is bound. A credential-shaped signature must never reach
|
|
758
|
+
// the driver, let alone the file.
|
|
759
|
+
assertSafeSignature(input.signature);
|
|
760
|
+
// STRICT table: bind an integer, never a Date and never a float.
|
|
761
|
+
const now = this.now().getTime();
|
|
762
|
+
const policy = mapVerdict(input.verdict);
|
|
763
|
+
if (policy.incrementsReconcileFailCount) {
|
|
764
|
+
this.unreachableVerificationStmt ?? (this.unreachableVerificationStmt = this.db.prepare(`UPDATE ingestion_items
|
|
765
|
+
SET reconcile_attempted_at = ?,
|
|
766
|
+
reconcile_fail_count = reconcile_fail_count + 1
|
|
767
|
+
WHERE filter_id = ? AND item_key = ?`));
|
|
768
|
+
this.unreachableVerificationStmt.run(now, filterId, itemKey);
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
if (policy.writesSignature) {
|
|
772
|
+
this.closeVerificationStmt ?? (this.closeVerificationStmt = this.db.prepare(`UPDATE ingestion_items
|
|
773
|
+
SET verified_at = ?,
|
|
774
|
+
verified_verdict = ?,
|
|
775
|
+
verified_signature = ?,
|
|
776
|
+
reconcile_attempted_at = ?
|
|
777
|
+
WHERE filter_id = ? AND item_key = ?`));
|
|
778
|
+
this.closeVerificationStmt.run(now, input.verdict, input.signature, now, filterId, itemKey);
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
this.stampVerificationStmt ?? (this.stampVerificationStmt = this.db.prepare(`UPDATE ingestion_items
|
|
782
|
+
SET verified_at = ?,
|
|
783
|
+
verified_verdict = ?,
|
|
784
|
+
reconcile_attempted_at = ?,
|
|
785
|
+
reconcile_fail_count = 0
|
|
786
|
+
WHERE filter_id = ? AND item_key = ?`));
|
|
787
|
+
this.stampVerificationStmt.run(now, input.verdict, now, filterId, itemKey);
|
|
788
|
+
}
|
|
789
|
+
/** The five verification columns for one item, or undefined when the row is absent. */
|
|
790
|
+
getVerification(filterId, itemKey) {
|
|
791
|
+
this.getVerificationStmt ?? (this.getVerificationStmt = this.db.prepare(`SELECT verified_at, verified_verdict, verified_signature,
|
|
792
|
+
reconcile_attempted_at, reconcile_fail_count
|
|
793
|
+
FROM ingestion_items
|
|
794
|
+
WHERE filter_id = ? AND item_key = ?`));
|
|
795
|
+
const row = this.getVerificationStmt.get(filterId, itemKey);
|
|
796
|
+
return row ? this.toVerificationState(row) : undefined;
|
|
797
|
+
}
|
|
798
|
+
/**
|
|
799
|
+
* Recent rows for one filter with their verification state, newest first.
|
|
800
|
+
*
|
|
801
|
+
* Same `ORDER BY last_seen_at DESC` as `listForFilter` and for the same
|
|
802
|
+
* reason: it rides `idx_ingestion_items_filter_seen` instead of sorting a
|
|
803
|
+
* scan. This is the read half of the `ingestion/runs` RPC; the join against
|
|
804
|
+
* `ScheduleRun` happens in `run-projection.ts`, which is pure.
|
|
805
|
+
*/
|
|
806
|
+
listRunViewRows(filterId, limit) {
|
|
807
|
+
this.runViewStmt ?? (this.runViewStmt = this.db.prepare(`SELECT item_key, last_run_id, agent_id, fail_count, last_fail_at,
|
|
808
|
+
verified_at, verified_verdict, verified_signature,
|
|
809
|
+
reconcile_attempted_at, reconcile_fail_count
|
|
810
|
+
FROM ingestion_items
|
|
811
|
+
WHERE filter_id = ?
|
|
812
|
+
ORDER BY last_seen_at DESC
|
|
813
|
+
LIMIT ?`));
|
|
814
|
+
const rows = [];
|
|
815
|
+
for (const row of this.runViewStmt.all(filterId, limit)) {
|
|
816
|
+
const failCount = asNumber(row.fail_count) ?? 0;
|
|
817
|
+
const lastFailAt = asNumber(row.last_fail_at);
|
|
818
|
+
const verification = this.toVerificationState(row);
|
|
819
|
+
rows.push({
|
|
820
|
+
verifiedAt: verification.verifiedAt,
|
|
821
|
+
verdict: verification.verdict,
|
|
822
|
+
verifiedSignature: verification.verifiedSignature,
|
|
823
|
+
reconcileAttemptedAt: verification.reconcileAttemptedAt,
|
|
824
|
+
reconcileFailCount: verification.reconcileFailCount,
|
|
825
|
+
itemKey: asString(row.item_key) ?? "",
|
|
826
|
+
lastRunId: asString(row.last_run_id),
|
|
827
|
+
agentId: asString(row.agent_id),
|
|
828
|
+
failCount,
|
|
829
|
+
// Through the ONE helper, never a second derivation. `backoffUntil`
|
|
830
|
+
// needs a full LedgerEntry, so the two fields it actually reads are
|
|
831
|
+
// handed to it on a minimal object rather than re-implementing
|
|
832
|
+
// `lastFailAt + BACKOFF_COOLDOWN_MS` here, where it could drift.
|
|
833
|
+
backoffUntil: backoffUntil({ ...EMPTY_ENTRY, failCount, lastFailAt }),
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
return rows;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Narrow one row's verification columns.
|
|
840
|
+
*
|
|
841
|
+
* `verified_verdict` is re-validated against the protocol enum on the way OUT
|
|
842
|
+
* of the database, not just on the way in. A hand-edited file, a restored
|
|
843
|
+
* backup, or a database written by a FUTURE paseo that added a fifth verdict
|
|
844
|
+
* would otherwise put an unknown string on the wire and fail the client's own
|
|
845
|
+
* parse - turning a stale row into a blank screen. An unparseable value reads
|
|
846
|
+
* as `null` ("nobody has looked") and says so once at `warn`.
|
|
847
|
+
*/
|
|
848
|
+
toVerificationState(row) {
|
|
849
|
+
const raw = asString(row.verified_verdict);
|
|
850
|
+
let verdict = null;
|
|
851
|
+
if (raw !== null) {
|
|
852
|
+
const parsed = ReconcileVerdictSchema.safeParse(raw);
|
|
853
|
+
if (parsed.success) {
|
|
854
|
+
verdict = parsed.data;
|
|
855
|
+
}
|
|
856
|
+
else {
|
|
857
|
+
// Loud once per process per value, quiet after: a corrupted column would
|
|
858
|
+
// otherwise emit one line per row per render.
|
|
859
|
+
this.warnUnknownVerdictOnce(raw);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
return {
|
|
863
|
+
verifiedAt: asNumber(row.verified_at),
|
|
864
|
+
verdict,
|
|
865
|
+
verifiedSignature: asString(row.verified_signature),
|
|
866
|
+
reconcileAttemptedAt: asNumber(row.reconcile_attempted_at),
|
|
867
|
+
reconcileFailCount: asNumber(row.reconcile_fail_count) ?? 0,
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
warnUnknownVerdictOnce(raw) {
|
|
871
|
+
if (this.warnedVerdicts.has(raw))
|
|
872
|
+
return;
|
|
873
|
+
this.warnedVerdicts.add(raw);
|
|
874
|
+
this.warn(`[ingestion-ledger] ${this.dbPath} holds an unrecognised verified_verdict; reading it as null.`);
|
|
875
|
+
}
|
|
876
|
+
/** Close the connection so WAL sidecars are checkpointed away. */
|
|
877
|
+
close() {
|
|
878
|
+
this.db.close();
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
//# sourceMappingURL=ledger.js.map
|