@vellumai/assistant 0.7.1 → 0.7.3
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/ARCHITECTURE.md +48 -50
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/memory.md +5 -2
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +1020 -40
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +384 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-scheduler.ts +18 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +10 -16
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
|
@@ -33,6 +33,8 @@ export interface ScheduleJob {
|
|
|
33
33
|
lastRunAt: number | null;
|
|
34
34
|
lastStatus: string | null;
|
|
35
35
|
retryCount: number;
|
|
36
|
+
maxRetries: number;
|
|
37
|
+
retryBackoffMs: number;
|
|
36
38
|
createdBy: string;
|
|
37
39
|
mode: ScheduleMode;
|
|
38
40
|
routingIntent: RoutingIntent;
|
|
@@ -83,6 +85,8 @@ export function createSchedule(params: {
|
|
|
83
85
|
routingHints?: Record<string, unknown>;
|
|
84
86
|
quiet?: boolean;
|
|
85
87
|
reuseConversation?: boolean;
|
|
88
|
+
maxRetries?: number;
|
|
89
|
+
retryBackoffMs?: number;
|
|
86
90
|
}): ScheduleJob {
|
|
87
91
|
const expression = params.expression ?? params.cronExpression ?? null;
|
|
88
92
|
const isOneShot = expression == null;
|
|
@@ -116,6 +120,8 @@ export function createSchedule(params: {
|
|
|
116
120
|
const routingHints = params.routingHints ?? {};
|
|
117
121
|
const quiet = params.quiet ?? false;
|
|
118
122
|
const reuseConversation = params.reuseConversation ?? false;
|
|
123
|
+
const maxRetries = params.maxRetries ?? 3;
|
|
124
|
+
const retryBackoffMs = params.retryBackoffMs ?? 60000;
|
|
119
125
|
|
|
120
126
|
let nextRunAt: number;
|
|
121
127
|
if (isOneShot) {
|
|
@@ -140,6 +146,8 @@ export function createSchedule(params: {
|
|
|
140
146
|
lastRunAt: null as number | null,
|
|
141
147
|
lastStatus: null as string | null,
|
|
142
148
|
retryCount: 0,
|
|
149
|
+
maxRetries,
|
|
150
|
+
retryBackoffMs,
|
|
143
151
|
createdBy: params.createdBy ?? "agent",
|
|
144
152
|
mode,
|
|
145
153
|
routingIntent,
|
|
@@ -235,6 +243,8 @@ export function updateSchedule(
|
|
|
235
243
|
quiet?: boolean;
|
|
236
244
|
reuseConversation?: boolean;
|
|
237
245
|
wakeConversationId?: string | null;
|
|
246
|
+
maxRetries?: number;
|
|
247
|
+
retryBackoffMs?: number;
|
|
238
248
|
},
|
|
239
249
|
): ScheduleJob | null {
|
|
240
250
|
const db = getDb();
|
|
@@ -257,12 +267,13 @@ export function updateSchedule(
|
|
|
257
267
|
|
|
258
268
|
const isOneShot = newExpr == null;
|
|
259
269
|
|
|
260
|
-
// Validate if expression or
|
|
270
|
+
// Validate if expression, syntax, or timezone changed (only for recurring schedules)
|
|
261
271
|
if (
|
|
262
272
|
!isOneShot &&
|
|
263
273
|
(updates.expression !== undefined ||
|
|
264
274
|
updates.cronExpression !== undefined ||
|
|
265
|
-
updates.syntax !== undefined
|
|
275
|
+
updates.syntax !== undefined ||
|
|
276
|
+
updates.timezone !== undefined)
|
|
266
277
|
) {
|
|
267
278
|
const spec = {
|
|
268
279
|
syntax: newSyntax,
|
|
@@ -295,6 +306,9 @@ export function updateSchedule(
|
|
|
295
306
|
set.reuseConversation = updates.reuseConversation;
|
|
296
307
|
if (updates.wakeConversationId !== undefined)
|
|
297
308
|
set.wakeConversationId = updates.wakeConversationId;
|
|
309
|
+
if (updates.maxRetries !== undefined) set.maxRetries = updates.maxRetries;
|
|
310
|
+
if (updates.retryBackoffMs !== undefined)
|
|
311
|
+
set.retryBackoffMs = updates.retryBackoffMs;
|
|
298
312
|
|
|
299
313
|
// Recompute nextRunAt if schedule timing may have changed (only for recurring)
|
|
300
314
|
if (
|
|
@@ -817,6 +831,94 @@ export function describeCronExpression(expr: string | null): string {
|
|
|
817
831
|
}
|
|
818
832
|
}
|
|
819
833
|
|
|
834
|
+
/**
|
|
835
|
+
* Set the next retry time for a schedule and revert one-shot status from
|
|
836
|
+
* "firing" to "active" so the scheduler will claim it again when nextRetryAt
|
|
837
|
+
* arrives. No-op for recurring schedules (they stay in their current status).
|
|
838
|
+
*/
|
|
839
|
+
export function scheduleRetry(id: string, nextRetryAt: number): void {
|
|
840
|
+
const db = getDb();
|
|
841
|
+
const now = Date.now();
|
|
842
|
+
db.update(scheduleJobs)
|
|
843
|
+
.set({ nextRunAt: nextRetryAt, updatedAt: now })
|
|
844
|
+
.where(eq(scheduleJobs.id, id))
|
|
845
|
+
.run();
|
|
846
|
+
// Revert one-shot status from "firing" to "active" so the scheduler
|
|
847
|
+
// will claim it again when nextRetryAt arrives. No-op for recurring.
|
|
848
|
+
db.update(scheduleJobs)
|
|
849
|
+
.set({ status: "active", updatedAt: now })
|
|
850
|
+
.where(and(eq(scheduleJobs.id, id), eq(scheduleJobs.status, "firing")))
|
|
851
|
+
.run();
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Reset the retry count for a schedule back to zero (e.g. after a successful run).
|
|
856
|
+
*/
|
|
857
|
+
export function resetRetryCount(id: string): void {
|
|
858
|
+
const db = getDb();
|
|
859
|
+
db.update(scheduleJobs)
|
|
860
|
+
.set({ retryCount: 0, updatedAt: Date.now() })
|
|
861
|
+
.where(eq(scheduleJobs.id, id))
|
|
862
|
+
.run();
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/**
|
|
866
|
+
* Find schedules stuck in an in-flight state (one-shots in "firing",
|
|
867
|
+
* cron runs in "running"). Used at daemon startup to recover from
|
|
868
|
+
* a prior process crash.
|
|
869
|
+
*
|
|
870
|
+
* @param staleThresholdMs If >0, only consider rows whose lastRunAt
|
|
871
|
+
* (for one-shots) or startedAt (for runs) is older than `now - staleThresholdMs`.
|
|
872
|
+
* Pass 0 at startup (the previous process is definitely dead).
|
|
873
|
+
*/
|
|
874
|
+
export function findStaleInFlightJobs(staleThresholdMs: number = 0): Array<{
|
|
875
|
+
jobId: string;
|
|
876
|
+
staleRunId: string | null;
|
|
877
|
+
}> {
|
|
878
|
+
const db = getDb();
|
|
879
|
+
const cutoff = Date.now() - staleThresholdMs;
|
|
880
|
+
|
|
881
|
+
// One-shots stuck in "firing" where lastRunAt is older than cutoff
|
|
882
|
+
const staleOneShots = db
|
|
883
|
+
.select({ id: scheduleJobs.id })
|
|
884
|
+
.from(scheduleJobs)
|
|
885
|
+
.where(
|
|
886
|
+
and(
|
|
887
|
+
isNull(scheduleJobs.cronExpression),
|
|
888
|
+
eq(scheduleJobs.status, "firing"),
|
|
889
|
+
eq(scheduleJobs.enabled, true),
|
|
890
|
+
staleThresholdMs > 0 ? lte(scheduleJobs.lastRunAt, cutoff) : undefined,
|
|
891
|
+
),
|
|
892
|
+
)
|
|
893
|
+
.all();
|
|
894
|
+
|
|
895
|
+
// Cron runs stuck in "running" where startedAt is older than cutoff
|
|
896
|
+
const staleRuns = db
|
|
897
|
+
.select({ id: scheduleRuns.id, jobId: scheduleRuns.jobId })
|
|
898
|
+
.from(scheduleRuns)
|
|
899
|
+
.where(
|
|
900
|
+
and(
|
|
901
|
+
eq(scheduleRuns.status, "running"),
|
|
902
|
+
staleThresholdMs > 0 ? lte(scheduleRuns.startedAt, cutoff) : undefined,
|
|
903
|
+
),
|
|
904
|
+
)
|
|
905
|
+
.all();
|
|
906
|
+
|
|
907
|
+
const result: Array<{ jobId: string; staleRunId: string | null }> = [];
|
|
908
|
+
const seenJobIds = new Set<string>();
|
|
909
|
+
|
|
910
|
+
for (const run of staleRuns) {
|
|
911
|
+
result.push({ jobId: run.jobId, staleRunId: run.id });
|
|
912
|
+
seenJobIds.add(run.jobId);
|
|
913
|
+
}
|
|
914
|
+
for (const job of staleOneShots) {
|
|
915
|
+
if (!seenJobIds.has(job.id)) {
|
|
916
|
+
result.push({ jobId: job.id, staleRunId: null });
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
return result;
|
|
920
|
+
}
|
|
921
|
+
|
|
820
922
|
function parseJobRow(row: typeof scheduleJobs.$inferSelect): ScheduleJob {
|
|
821
923
|
return {
|
|
822
924
|
id: row.id,
|
|
@@ -833,6 +935,8 @@ function parseJobRow(row: typeof scheduleJobs.$inferSelect): ScheduleJob {
|
|
|
833
935
|
lastRunAt: row.lastRunAt,
|
|
834
936
|
lastStatus: row.lastStatus,
|
|
835
937
|
retryCount: row.retryCount,
|
|
938
|
+
maxRetries: row.maxRetries ?? 3,
|
|
939
|
+
retryBackoffMs: row.retryBackoffMs ?? 60000,
|
|
836
940
|
createdBy: row.createdBy,
|
|
837
941
|
mode: (row.mode ?? "execute") as ScheduleMode,
|
|
838
942
|
routingIntent: (row.routingIntent ?? "all_channels") as RoutingIntent,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types extracted from scheduler.ts to break the scheduler ↔ engine cycle.
|
|
3
|
+
* `sequence/engine.ts` needs `ScheduleMessageProcessor` but scheduler.ts
|
|
4
|
+
* imports from engine — extracting the type here breaks the back-edge.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
8
|
+
|
|
9
|
+
export interface ScheduleMessageOptions {
|
|
10
|
+
trustClass?: "guardian" | "trusted_contact" | "unknown";
|
|
11
|
+
taskRunId?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Optional LLM call-site identifier propagated to the per-call provider
|
|
14
|
+
* config. Schedule and sequence callers will start passing their own call-site
|
|
15
|
+
* (e.g. for a future scheduled-agent profile) once PRs 7-11 migrate them off
|
|
16
|
+
* the default `mainAgent` route.
|
|
17
|
+
*/
|
|
18
|
+
callSite?: LLMCallSite;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type ScheduleMessageProcessor = (
|
|
22
|
+
conversationId: string,
|
|
23
|
+
message: string,
|
|
24
|
+
options?: ScheduleMessageOptions,
|
|
25
|
+
) => Promise<unknown>;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
checkDiskPressureBackgroundGate,
|
|
3
|
+
diskPressureBackgroundSkipLogFields,
|
|
4
|
+
shouldLogDiskPressureBackgroundSkip,
|
|
5
|
+
} from "../daemon/disk-pressure-background-gate.js";
|
|
2
6
|
import { emitFeedEvent } from "../home/emit-feed-event.js";
|
|
3
7
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
4
8
|
import { getConversation } from "../memory/conversation-crud.js";
|
|
@@ -12,40 +16,26 @@ import {
|
|
|
12
16
|
type WatcherNotifier,
|
|
13
17
|
} from "../watcher/engine.js";
|
|
14
18
|
import { hasSetConstructs } from "./recurrence-engine.js";
|
|
19
|
+
import { applyRetryDecision, decideRetry } from "./retry-policy.js";
|
|
15
20
|
import { runScript, type ScriptResult } from "./run-script.js";
|
|
16
21
|
import {
|
|
17
22
|
claimDueSchedules,
|
|
18
23
|
completeOneShot,
|
|
19
24
|
completeScheduleRun,
|
|
20
25
|
createScheduleRun,
|
|
21
|
-
failOneShot,
|
|
22
26
|
failOneShotPermanently,
|
|
23
27
|
getLastScheduleConversationId,
|
|
28
|
+
resetRetryCount,
|
|
24
29
|
retryOneShot,
|
|
25
30
|
type RoutingIntent,
|
|
31
|
+
type ScheduleJob,
|
|
32
|
+
scheduleRetry,
|
|
26
33
|
} from "./schedule-store.js";
|
|
27
34
|
|
|
28
35
|
const log = getLogger("scheduler");
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
taskRunId?: string;
|
|
33
|
-
/**
|
|
34
|
-
* Optional LLM call-site identifier propagated to the per-call provider
|
|
35
|
-
* config. Schedule and sequence callers will start passing their own call-site
|
|
36
|
-
* (e.g. for a future scheduled-agent profile) once PRs 7-11 migrate them off
|
|
37
|
-
* the default `mainAgent` route.
|
|
38
|
-
*/
|
|
39
|
-
callSite?: LLMCallSite;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type ScheduleMessageProcessor = (
|
|
43
|
-
conversationId: string,
|
|
44
|
-
message: string,
|
|
45
|
-
options?: ScheduleMessageOptions,
|
|
46
|
-
) => Promise<unknown>;
|
|
47
|
-
|
|
48
|
-
export type ScheduleNotifyModeNotifier = (payload: {
|
|
37
|
+
import type { ScheduleMessageProcessor } from "./scheduler-types.js";
|
|
38
|
+
type ScheduleNotifyModeNotifier = (payload: {
|
|
49
39
|
id: string;
|
|
50
40
|
label: string;
|
|
51
41
|
message: string;
|
|
@@ -53,7 +43,7 @@ export type ScheduleNotifyModeNotifier = (payload: {
|
|
|
53
43
|
routingHints: Record<string, unknown>;
|
|
54
44
|
}) => void | Promise<void>;
|
|
55
45
|
|
|
56
|
-
|
|
46
|
+
type ScheduleConversationCreatedNotifier = (info: {
|
|
57
47
|
conversationId: string;
|
|
58
48
|
scheduleJobId: string;
|
|
59
49
|
title: string;
|
|
@@ -73,6 +63,26 @@ const TICK_INTERVAL_MS = 15_000;
|
|
|
73
63
|
*/
|
|
74
64
|
const WAKE_MAX_RETRIES = 20;
|
|
75
65
|
|
|
66
|
+
function handleExecutionFailure(params: {
|
|
67
|
+
job: ScheduleJob;
|
|
68
|
+
errorMsg: string;
|
|
69
|
+
isOneShot: boolean;
|
|
70
|
+
}): void {
|
|
71
|
+
const decision = decideRetry(params.job);
|
|
72
|
+
applyRetryDecision({
|
|
73
|
+
job: params.job,
|
|
74
|
+
isOneShot: params.isOneShot,
|
|
75
|
+
errorMsg: params.errorMsg,
|
|
76
|
+
decision,
|
|
77
|
+
scheduleRetry,
|
|
78
|
+
failOneShotPermanently,
|
|
79
|
+
resetRetryCount,
|
|
80
|
+
emitAlert: (title, summary, dedupKey) =>
|
|
81
|
+
emitScheduleFeedEvent({ title, summary, dedupKey }),
|
|
82
|
+
log,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
76
86
|
export function startScheduler(
|
|
77
87
|
processMessage: ScheduleMessageProcessor,
|
|
78
88
|
notifyScheduleOneShot: ScheduleNotifyModeNotifier,
|
|
@@ -124,7 +134,7 @@ export function startScheduler(
|
|
|
124
134
|
};
|
|
125
135
|
}
|
|
126
136
|
|
|
127
|
-
async function runScheduleOnce(
|
|
137
|
+
export async function runScheduleOnce(
|
|
128
138
|
processMessage: ScheduleMessageProcessor,
|
|
129
139
|
notifyScheduleOneShot: ScheduleNotifyModeNotifier,
|
|
130
140
|
watcherNotifier?: WatcherNotifier,
|
|
@@ -134,6 +144,20 @@ async function runScheduleOnce(
|
|
|
134
144
|
const now = Date.now();
|
|
135
145
|
let processed = 0;
|
|
136
146
|
|
|
147
|
+
const diskPressureGate = checkDiskPressureBackgroundGate("background-work");
|
|
148
|
+
if (diskPressureGate.action === "skip") {
|
|
149
|
+
if (shouldLogDiskPressureBackgroundSkip("scheduler")) {
|
|
150
|
+
log.warn(
|
|
151
|
+
{
|
|
152
|
+
source: "schedule",
|
|
153
|
+
...diskPressureBackgroundSkipLogFields(diskPressureGate),
|
|
154
|
+
},
|
|
155
|
+
"Schedule tick skipped during disk pressure cleanup mode",
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
|
|
137
161
|
// ── Schedules (recurring cron/RRULE + one-shot) ─────────────────────
|
|
138
162
|
const jobs = claimDueSchedules(now);
|
|
139
163
|
for (const job of jobs) {
|
|
@@ -154,6 +178,8 @@ async function runScheduleOnce(
|
|
|
154
178
|
routingHints: job.routingHints,
|
|
155
179
|
});
|
|
156
180
|
if (isOneShot) {
|
|
181
|
+
const successRunId = createScheduleRun(job.id, `notify-ok:${job.id}`);
|
|
182
|
+
completeScheduleRun(successRunId, { status: "ok" });
|
|
157
183
|
completeOneShot(job.id);
|
|
158
184
|
emitScheduleFeedEvent({
|
|
159
185
|
title: job.name,
|
|
@@ -176,15 +202,10 @@ async function runScheduleOnce(
|
|
|
176
202
|
{ err, jobId: job.id, name: job.name, isOneShot },
|
|
177
203
|
"Schedule notification failed",
|
|
178
204
|
);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// occurrence isn't silently lost and lastStatus/retryCount update.
|
|
184
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
185
|
-
const runId = createScheduleRun(job.id, `notify-error:${job.id}`);
|
|
186
|
-
completeScheduleRun(runId, { status: "error", error: errorMsg });
|
|
187
|
-
}
|
|
205
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
206
|
+
const errorRunId = createScheduleRun(job.id, `notify-error:${job.id}`);
|
|
207
|
+
completeScheduleRun(errorRunId, { status: "error", error: errorMsg });
|
|
208
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
188
209
|
}
|
|
189
210
|
processed += 1;
|
|
190
211
|
continue;
|
|
@@ -222,7 +243,9 @@ async function runScheduleOnce(
|
|
|
222
243
|
}
|
|
223
244
|
if (isOneShot) completeOneShot(job.id);
|
|
224
245
|
} else {
|
|
225
|
-
|
|
246
|
+
const errorMsg =
|
|
247
|
+
result.stderr || "Script exited with non-zero status";
|
|
248
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
226
249
|
}
|
|
227
250
|
} catch (err) {
|
|
228
251
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
@@ -231,7 +254,7 @@ async function runScheduleOnce(
|
|
|
231
254
|
"Script schedule execution failed",
|
|
232
255
|
);
|
|
233
256
|
completeScheduleRun(runId, { status: "error", error: errorMsg });
|
|
234
|
-
|
|
257
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
235
258
|
}
|
|
236
259
|
processed += 1;
|
|
237
260
|
continue;
|
|
@@ -309,7 +332,11 @@ async function runScheduleOnce(
|
|
|
309
332
|
continue;
|
|
310
333
|
}
|
|
311
334
|
|
|
312
|
-
if (isOneShot)
|
|
335
|
+
if (isOneShot) {
|
|
336
|
+
const successRunId = createScheduleRun(job.id, `wake-ok:${job.id}`);
|
|
337
|
+
completeScheduleRun(successRunId, { status: "ok" });
|
|
338
|
+
completeOneShot(job.id);
|
|
339
|
+
}
|
|
313
340
|
if (!job.quiet) {
|
|
314
341
|
emitScheduleFeedEvent({
|
|
315
342
|
title: job.name,
|
|
@@ -322,7 +349,16 @@ async function runScheduleOnce(
|
|
|
322
349
|
{ err, jobId: job.id, name: job.name, wakeConversationId, isOneShot },
|
|
323
350
|
"Wake schedule execution failed",
|
|
324
351
|
);
|
|
325
|
-
|
|
352
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
353
|
+
const wakeErrorRunId = createScheduleRun(
|
|
354
|
+
job.id,
|
|
355
|
+
`wake-error:${job.id}`,
|
|
356
|
+
);
|
|
357
|
+
completeScheduleRun(wakeErrorRunId, {
|
|
358
|
+
status: "error",
|
|
359
|
+
error: errorMsg,
|
|
360
|
+
});
|
|
361
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
326
362
|
}
|
|
327
363
|
processed += 1;
|
|
328
364
|
continue;
|
|
@@ -380,7 +416,11 @@ async function runScheduleOnce(
|
|
|
380
416
|
status: "error",
|
|
381
417
|
error: result.error ?? "Task run failed",
|
|
382
418
|
});
|
|
383
|
-
|
|
419
|
+
handleExecutionFailure({
|
|
420
|
+
job,
|
|
421
|
+
errorMsg: result.error ?? "Task run failed",
|
|
422
|
+
isOneShot,
|
|
423
|
+
});
|
|
384
424
|
} else {
|
|
385
425
|
completeScheduleRun(runId, { status: "ok" });
|
|
386
426
|
if (!job.quiet) {
|
|
@@ -424,7 +464,11 @@ async function runScheduleOnce(
|
|
|
424
464
|
});
|
|
425
465
|
const runId = createScheduleRun(job.id, fallbackConversation.id);
|
|
426
466
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
427
|
-
|
|
467
|
+
handleExecutionFailure({
|
|
468
|
+
job,
|
|
469
|
+
errorMsg: message,
|
|
470
|
+
isOneShot,
|
|
471
|
+
});
|
|
428
472
|
}
|
|
429
473
|
continue;
|
|
430
474
|
}
|
|
@@ -507,7 +551,7 @@ async function runScheduleOnce(
|
|
|
507
551
|
: "Schedule execution failed",
|
|
508
552
|
);
|
|
509
553
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
510
|
-
|
|
554
|
+
handleExecutionFailure({ job, errorMsg: message, isOneShot });
|
|
511
555
|
|
|
512
556
|
// Only skip invalidation when the conversation was *actually* reused,
|
|
513
557
|
// i.e. it contains prior successful context worth preserving. When
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
* back to the runtime code that initiated the OAuth handshake.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Sibling: `assistant/src/mcp/mcp-auth-state.ts`. The MCP auth state map sits
|
|
9
|
+
* one layer up from this registry — it tracks polling-visible status per
|
|
10
|
+
* MCP server, while this registry resolves the OAuth code-arrival promise
|
|
11
|
+
* keyed by OAuth `state`. The callback registry is shared by all
|
|
12
|
+
* gateway-transport OAuth flows (MCP and otherwise); the MCP state map is
|
|
13
|
+
* MCP-specific.
|
|
14
|
+
*/
|
|
7
15
|
interface PendingCallback {
|
|
8
16
|
resolve: (code: string) => void;
|
|
9
17
|
reject: (error: Error) => void;
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
21
23
|
|
|
22
24
|
import type {
|
|
23
25
|
SecureKeyBackend,
|
|
@@ -28,6 +30,7 @@ import { getIsContainerized } from "../config/env-registry.js";
|
|
|
28
30
|
import type { CesClient } from "../credential-execution/client.js";
|
|
29
31
|
import { getAnyProviderEnvVar } from "../providers/provider-env-vars.js";
|
|
30
32
|
import { getLogger } from "../util/logger.js";
|
|
33
|
+
import { getProtectedDir } from "../util/platform.js";
|
|
31
34
|
import { createCesCredentialBackend } from "./ces-credential-client.js";
|
|
32
35
|
import { CesRpcCredentialBackend } from "./ces-rpc-credential-backend.js";
|
|
33
36
|
import type {
|
|
@@ -584,6 +587,58 @@ export function getActiveBackendName(): string {
|
|
|
584
587
|
return _resolvedBackend?.name ?? "none";
|
|
585
588
|
}
|
|
586
589
|
|
|
590
|
+
// ---------------------------------------------------------------------------
|
|
591
|
+
// Backend introspection
|
|
592
|
+
// ---------------------------------------------------------------------------
|
|
593
|
+
|
|
594
|
+
export type BackendInfo =
|
|
595
|
+
| {
|
|
596
|
+
backend: "encrypted-store";
|
|
597
|
+
storePath: string;
|
|
598
|
+
storeKeyPath: string;
|
|
599
|
+
storeExists: boolean;
|
|
600
|
+
storeKeyExists: boolean;
|
|
601
|
+
}
|
|
602
|
+
| { backend: "ces-rpc"; ready: boolean }
|
|
603
|
+
| { backend: "ces-http"; url: string }
|
|
604
|
+
| { backend: "none" };
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Resolve the active credential backend (triggering resolution if not yet
|
|
608
|
+
* done) and return introspection details specific to that backend.
|
|
609
|
+
*
|
|
610
|
+
* Useful for `credentials status` — shows which store this process is talking
|
|
611
|
+
* to, so path/socket mismatches between the CLI and daemon are immediately
|
|
612
|
+
* visible.
|
|
613
|
+
*/
|
|
614
|
+
export function getActiveBackendInfoAsync(): Promise<BackendInfo> {
|
|
615
|
+
return withCredentialTimeout(async () => {
|
|
616
|
+
const backend = await resolveBackendAsync();
|
|
617
|
+
if (backend.name === "encrypted-store") {
|
|
618
|
+
const protectedDir = getProtectedDir();
|
|
619
|
+
const storePath = join(protectedDir, "keys.enc");
|
|
620
|
+
const storeKeyPath = join(protectedDir, "store.key");
|
|
621
|
+
return {
|
|
622
|
+
backend: "encrypted-store" as const,
|
|
623
|
+
storePath,
|
|
624
|
+
storeKeyPath,
|
|
625
|
+
storeExists: existsSync(storePath),
|
|
626
|
+
storeKeyExists: existsSync(storeKeyPath),
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
if (backend.name === "ces-rpc") {
|
|
630
|
+
return { backend: "ces-rpc" as const, ready: backend.isAvailable() };
|
|
631
|
+
}
|
|
632
|
+
if (backend.name === "ces-http") {
|
|
633
|
+
return {
|
|
634
|
+
backend: "ces-http" as const,
|
|
635
|
+
url: process.env.CES_CREDENTIAL_URL ?? "",
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
return { backend: "none" as const };
|
|
639
|
+
}, { backend: "none" as const });
|
|
640
|
+
}
|
|
641
|
+
|
|
587
642
|
/** @internal Test-only: reset the cached backends so they're re-created. */
|
|
588
643
|
export function _resetBackend(): void {
|
|
589
644
|
_cesClient = undefined;
|
|
@@ -15,7 +15,7 @@ import type { Sequence } from "./types.js";
|
|
|
15
15
|
|
|
16
16
|
// ── Event tracking ──────────────────────────────────────────────────
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
type SequenceEventType =
|
|
19
19
|
| "send"
|
|
20
20
|
| "reply"
|
|
21
21
|
| "complete"
|
|
@@ -24,7 +24,7 @@ export type SequenceEventType =
|
|
|
24
24
|
| "pause"
|
|
25
25
|
| "resume";
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
interface SequenceEvent {
|
|
28
28
|
id: string;
|
|
29
29
|
sequenceId: string;
|
|
30
30
|
enrollmentId: string;
|
|
@@ -74,7 +74,7 @@ function getRecentEvents(limit = 20): SequenceEvent[] {
|
|
|
74
74
|
|
|
75
75
|
// ── Metrics ─────────────────────────────────────────────────────────
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
interface SequenceMetrics {
|
|
78
78
|
sequenceId: string;
|
|
79
79
|
sequenceName: string;
|
|
80
80
|
status: string;
|
|
@@ -90,7 +90,7 @@ export interface SequenceMetrics {
|
|
|
90
90
|
avgTimeToReplyMs: number | null;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
interface StepMetrics {
|
|
94
94
|
stepIndex: number;
|
|
95
95
|
subject: string;
|
|
96
96
|
sends: number;
|
|
@@ -98,7 +98,7 @@ export interface StepMetrics {
|
|
|
98
98
|
dropOff: number;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
interface DashboardData {
|
|
102
102
|
summary: {
|
|
103
103
|
totalSequences: number;
|
|
104
104
|
activeSequences: number;
|
package/src/sequence/engine.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { emitFeedEvent } from "../home/emit-feed-event.js";
|
|
10
10
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
11
11
|
import { getMessages } from "../memory/conversation-crud.js";
|
|
12
|
-
import type { ScheduleMessageProcessor } from "../schedule/scheduler.js";
|
|
12
|
+
import type { ScheduleMessageProcessor } from "../schedule/scheduler-types.js";
|
|
13
13
|
import { getLogger } from "../util/logger.js";
|
|
14
14
|
import { recordEvent } from "./analytics.js";
|
|
15
15
|
import { checkAllPreSend, recordSend } from "./guardrails.js";
|
|
@@ -64,14 +64,8 @@ function classifyByName(name: string): boolean {
|
|
|
64
64
|
* depends on `catalog-cache.ts`, which would otherwise be reachable via
|
|
65
65
|
* the handler module.
|
|
66
66
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
name: string; // basename
|
|
70
|
-
size: number;
|
|
71
|
-
mimeType: string;
|
|
72
|
-
isBinary: boolean;
|
|
73
|
-
content: string | null; // inline text if ≤ 2 MB and text MIME, else null
|
|
74
|
-
}
|
|
67
|
+
import type { SkillFileEntry } from "./skill-file-types.js";
|
|
68
|
+
export type { SkillFileEntry } from "./skill-file-types.js";
|
|
75
69
|
|
|
76
70
|
// ─── Platform response contracts ─────────────────────────────────────────────
|
|
77
71
|
//
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SkillSummary } from "../config/skills.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
interface IncludeGraphResult {
|
|
4
4
|
/** Ordered list of all skill IDs visited during traversal (including the root). */
|
|
5
5
|
visited: string[];
|
|
6
6
|
}
|
|
@@ -37,12 +37,12 @@ export function getImmediateChildren(
|
|
|
37
37
|
return children;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
interface IncludeValidationSuccess {
|
|
41
41
|
ok: true;
|
|
42
42
|
visited: string[];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
interface IncludeValidationError {
|
|
46
46
|
ok: false;
|
|
47
47
|
error: "missing";
|
|
48
48
|
missingChildId: string;
|
|
@@ -50,13 +50,13 @@ export interface IncludeValidationError {
|
|
|
50
50
|
path: string[]; // full path from root to the parent that referenced the missing child
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
interface IncludeValidationCycleError {
|
|
54
54
|
ok: false;
|
|
55
55
|
error: "cycle";
|
|
56
56
|
cyclePath: string[]; // the IDs forming the cycle, e.g. ['a', 'b', 'c', 'a']
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
type IncludeValidationResult =
|
|
60
60
|
| IncludeValidationSuccess
|
|
61
61
|
| IncludeValidationError
|
|
62
62
|
| IncludeValidationCycleError;
|