@vellumai/assistant 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/eslint.config.mjs +31 -0
- package/package.json +1 -1
- package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
- package/scripts/ipc/generate-swift.ts +18 -2
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +338 -1
- package/src/__tests__/approval-conversation-turn.test.ts +214 -0
- package/src/__tests__/browser-manager.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +130 -0
- package/src/__tests__/call-orchestrator.test.ts +752 -271
- package/src/__tests__/call-pointer-messages.test.ts +148 -0
- package/src/__tests__/call-recovery.test.ts +3 -0
- package/src/__tests__/call-routes-http.test.ts +5 -0
- package/src/__tests__/call-store.test.ts +3 -0
- package/src/__tests__/channel-approval-routes.test.ts +1260 -85
- package/src/__tests__/channel-approval.test.ts +37 -0
- package/src/__tests__/channel-approvals.test.ts +4 -65
- package/src/__tests__/channel-guardian.test.ts +556 -0
- package/src/__tests__/channel-readiness-service.test.ts +74 -7
- package/src/__tests__/checker.test.ts +14 -7
- package/src/__tests__/clarification-resolver.test.ts +44 -24
- package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
- package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
- package/src/__tests__/config-schema.test.ts +12 -7
- package/src/__tests__/context-window-manager.test.ts +30 -2
- package/src/__tests__/contradiction-checker.test.ts +20 -5
- package/src/__tests__/credential-security-invariants.test.ts +6 -2
- package/src/__tests__/db-migration-rollback.test.ts +752 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
- package/src/__tests__/fuzzy-match-property.test.ts +5 -5
- package/src/__tests__/guardian-action-store.test.ts +123 -0
- package/src/__tests__/guardian-action-sweep.test.ts +277 -0
- package/src/__tests__/guardian-dispatch.test.ts +389 -0
- package/src/__tests__/guardian-question-copy.test.ts +47 -0
- package/src/__tests__/handlers-telegram-config.test.ts +4 -2
- package/src/__tests__/handlers-twilio-config.test.ts +126 -0
- package/src/__tests__/intent-routing.test.ts +2 -0
- package/src/__tests__/ipc-snapshot.test.ts +228 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
- package/src/__tests__/model-intents.test.ts +96 -0
- package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
- package/src/__tests__/provider-error-scenarios.test.ts +621 -0
- package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
- package/src/__tests__/qdrant-manager.test.ts +27 -20
- package/src/__tests__/relay-server.test.ts +779 -40
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +2 -0
- package/src/__tests__/run-orchestrator.test.ts +20 -4
- package/src/__tests__/runtime-runs-http.test.ts +17 -1
- package/src/__tests__/runtime-runs.test.ts +16 -0
- package/src/__tests__/schedule-store.test.ts +18 -4
- package/src/__tests__/scheduler-recurrence.test.ts +13 -4
- package/src/__tests__/session-abort-tool-results.test.ts +6 -0
- package/src/__tests__/session-agent-loop.test.ts +857 -0
- package/src/__tests__/session-conflict-gate.test.ts +6 -0
- package/src/__tests__/session-pre-run-repair.test.ts +6 -0
- package/src/__tests__/session-profile-injection.test.ts +6 -0
- package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/session-queue.test.ts +6 -0
- package/src/__tests__/session-runtime-assembly.test.ts +237 -13
- package/src/__tests__/session-slash-known.test.ts +6 -0
- package/src/__tests__/session-slash-queue.test.ts +6 -0
- package/src/__tests__/session-slash-unknown.test.ts +6 -0
- package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
- package/src/__tests__/session-workspace-injection.test.ts +6 -0
- package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/skills.test.ts +2 -0
- package/src/__tests__/sms-messaging-provider.test.ts +2 -1
- package/src/__tests__/starter-task-flow.test.ts +2 -0
- package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
- package/src/__tests__/system-prompt.test.ts +2 -0
- package/src/__tests__/task-management-tools.test.ts +2 -2
- package/src/__tests__/task-runner.test.ts +14 -4
- package/src/__tests__/terminal-tools.test.ts +25 -19
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
- package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
- package/src/__tests__/tool-executor.test.ts +23 -24
- package/src/__tests__/trust-store.test.ts +3 -3
- package/src/__tests__/twilio-rest.test.ts +29 -0
- package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
- package/src/__tests__/twilio-routes.test.ts +141 -21
- package/src/__tests__/user-reference.test.ts +2 -0
- package/src/__tests__/voice-quality.test.ts +222 -0
- package/src/__tests__/web-search.test.ts +45 -29
- package/src/agent/loop.ts +1 -1
- package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
- package/src/amazon/client.ts +1418 -0
- package/src/amazon/request-extractor.ts +135 -0
- package/src/amazon/session.ts +109 -0
- package/src/autonomy/autonomy-store.ts +5 -5
- package/src/browser-extension-relay/client.ts +124 -0
- package/src/browser-extension-relay/protocol.ts +63 -0
- package/src/browser-extension-relay/server.ts +177 -0
- package/src/bundler/app-bundler.ts +3 -3
- package/src/bundler/bundle-signer.ts +1 -1
- package/src/bundler/signature-verifier.ts +1 -1
- package/src/calls/call-conversation-messages.ts +33 -0
- package/src/calls/call-domain.ts +106 -5
- package/src/calls/call-orchestrator.ts +252 -54
- package/src/calls/call-pointer-messages.ts +53 -0
- package/src/calls/call-recovery.ts +3 -8
- package/src/calls/call-store.ts +69 -87
- package/src/calls/elevenlabs-config.ts +3 -2
- package/src/calls/guardian-action-sweep.ts +105 -0
- package/src/calls/guardian-dispatch.ts +203 -0
- package/src/calls/guardian-question-copy.ts +133 -0
- package/src/calls/relay-server.ts +466 -8
- package/src/calls/speaker-identification.ts +1 -1
- package/src/calls/twilio-config.ts +7 -5
- package/src/calls/twilio-provider.ts +6 -4
- package/src/calls/twilio-rest.ts +40 -15
- package/src/calls/twilio-routes.ts +60 -45
- package/src/calls/types.ts +3 -1
- package/src/channels/types.ts +25 -0
- package/src/cli/amazon.ts +815 -0
- package/src/cli/config-commands.ts +2 -2
- package/src/cli/core-commands.ts +4 -3
- package/src/cli/influencer.ts +244 -0
- package/src/cli/map.ts +89 -6
- package/src/cli.ts +1 -1
- package/src/config/agent-schema.ts +171 -0
- package/src/config/bundled-skills/amazon/SKILL.md +127 -0
- package/src/config/bundled-skills/amazon/icon.svg +13 -0
- package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
- package/src/config/bundled-skills/browser/SKILL.md +1 -0
- package/src/config/bundled-skills/browser/TOOLS.json +17 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
- package/src/config/bundled-skills/doordash/SKILL.md +51 -51
- package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
- package/src/config/bundled-skills/influencer/SKILL.md +144 -0
- package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +72 -95
- package/src/config/bundled-skills/media-processing/TOOLS.json +57 -147
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +7 -9
- package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +88 -253
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +22 -153
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +28 -51
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +35 -270
- package/src/config/bundled-skills/messaging/SKILL.md +12 -2
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +86 -21
- package/src/config/bundled-skills/twitter/icon.svg +14 -0
- package/src/config/bundled-tool-registry.ts +310 -0
- package/src/config/calls-schema.ts +181 -0
- package/src/config/core-schema.ts +309 -0
- package/src/config/defaults.ts +27 -3
- package/src/config/env-registry.ts +169 -0
- package/src/config/env.ts +175 -0
- package/src/config/loader.ts +6 -6
- package/src/config/memory-schema.ts +528 -0
- package/src/config/sandbox-schema.ts +55 -0
- package/src/config/schema.ts +157 -1138
- package/src/config/skill-state.ts +1 -1
- package/src/config/skills-schema.ts +32 -0
- package/src/config/skills.ts +35 -24
- package/src/config/system-prompt.ts +107 -56
- package/src/config/templates/SOUL.md +1 -1
- package/src/config/types.ts +1 -0
- package/src/config/user-reference.ts +4 -9
- package/src/config/vellum-skills/catalog.json +0 -7
- package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +1 -0
- package/src/config/vellum-skills/sms-setup/SKILL.md +112 -14
- package/src/context/window-manager.ts +27 -7
- package/src/daemon/approval-generators.ts +186 -0
- package/src/daemon/approved-devices-store.ts +140 -0
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/classifier.ts +35 -32
- package/src/daemon/config-watcher.ts +1 -1
- package/src/daemon/daemon-control.ts +254 -0
- package/src/daemon/handlers/apps.ts +2 -3
- package/src/daemon/handlers/config-channels.ts +158 -0
- package/src/daemon/handlers/config-inbox.ts +540 -0
- package/src/daemon/handlers/config-ingress.ts +231 -0
- package/src/daemon/handlers/config-integrations.ts +258 -0
- package/src/daemon/handlers/config-model.ts +143 -0
- package/src/daemon/handlers/config-parental.ts +163 -0
- package/src/daemon/handlers/config-scheduling.ts +172 -0
- package/src/daemon/handlers/config-slack.ts +92 -0
- package/src/daemon/handlers/config-telegram.ts +301 -0
- package/src/daemon/handlers/config-tools.ts +177 -0
- package/src/daemon/handlers/config-trust.ts +104 -0
- package/src/daemon/handlers/config-twilio.ts +1080 -0
- package/src/daemon/handlers/config.ts +53 -2463
- package/src/daemon/handlers/diagnostics.ts +1 -1
- package/src/daemon/handlers/dictation.ts +4 -6
- package/src/daemon/handlers/documents.ts +18 -32
- package/src/daemon/handlers/index.ts +9 -0
- package/src/daemon/handlers/misc.ts +3 -5
- package/src/daemon/handlers/pairing.ts +98 -0
- package/src/daemon/handlers/sessions.ts +74 -5
- package/src/daemon/handlers/shared.ts +3 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/handlers/twitter-auth.ts +2 -0
- package/src/daemon/handlers/work-items.ts +2 -2
- package/src/daemon/handlers/workspace-files.ts +4 -3
- package/src/daemon/install-cli-launchers.ts +113 -0
- package/src/daemon/ipc-contract/apps.ts +356 -0
- package/src/daemon/ipc-contract/browser.ts +74 -0
- package/src/daemon/ipc-contract/computer-use.ts +151 -0
- package/src/daemon/ipc-contract/diagnostics.ts +56 -0
- package/src/daemon/ipc-contract/documents.ts +74 -0
- package/src/daemon/ipc-contract/inbox.ts +209 -0
- package/src/daemon/ipc-contract/integrations.ts +284 -0
- package/src/daemon/ipc-contract/memory.ts +48 -0
- package/src/daemon/ipc-contract/messages.ts +211 -0
- package/src/daemon/ipc-contract/pairing.ts +45 -0
- package/src/daemon/ipc-contract/parental-control.ts +95 -0
- package/src/daemon/ipc-contract/schedules.ts +97 -0
- package/src/daemon/ipc-contract/sessions.ts +321 -0
- package/src/daemon/ipc-contract/shared.ts +42 -0
- package/src/daemon/ipc-contract/skills.ts +120 -0
- package/src/daemon/ipc-contract/subagents.ts +58 -0
- package/src/daemon/ipc-contract/surfaces.ts +250 -0
- package/src/daemon/ipc-contract/trust.ts +60 -0
- package/src/daemon/ipc-contract/work-items.ts +225 -0
- package/src/daemon/ipc-contract/workspace.ts +113 -0
- package/src/daemon/ipc-contract-inventory.json +62 -0
- package/src/daemon/ipc-contract-inventory.ts +55 -29
- package/src/daemon/ipc-contract.ts +227 -2527
- package/src/daemon/ipc-protocol.ts +1 -1
- package/src/daemon/ipc-validate.ts +7 -0
- package/src/daemon/lifecycle.ts +97 -379
- package/src/daemon/pairing-store.ts +177 -0
- package/src/daemon/providers-setup.ts +43 -0
- package/src/daemon/ride-shotgun-handler.ts +67 -2
- package/src/daemon/server.ts +60 -44
- package/src/daemon/session-agent-loop-handlers.ts +421 -0
- package/src/daemon/session-agent-loop.ts +113 -275
- package/src/daemon/session-dynamic-profile.ts +1 -1
- package/src/daemon/session-history.ts +1 -1
- package/src/daemon/session-media-retry.ts +1 -1
- package/src/daemon/session-messaging.ts +37 -2
- package/src/daemon/session-notifiers.ts +5 -25
- package/src/daemon/session-process.ts +99 -59
- package/src/daemon/session-queue-manager.ts +98 -4
- package/src/daemon/session-runtime-assembly.ts +149 -15
- package/src/daemon/session-surfaces.ts +26 -4
- package/src/daemon/session-tool-setup.ts +28 -30
- package/src/daemon/session-workspace.ts +1 -1
- package/src/daemon/session.ts +24 -1
- package/src/daemon/shutdown-handlers.ts +122 -0
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/watch-handler.ts +36 -33
- package/src/doordash/cart-queries.ts +787 -0
- package/src/doordash/client.ts +144 -127
- package/src/doordash/order-queries.ts +85 -0
- package/src/doordash/queries.ts +10 -1308
- package/src/doordash/search-queries.ts +203 -0
- package/src/doordash/session.ts +3 -2
- package/src/doordash/store-queries.ts +246 -0
- package/src/doordash/types.ts +367 -0
- package/src/email/providers/agentmail.ts +2 -1
- package/src/email/providers/index.ts +3 -2
- package/src/email/service.ts +3 -2
- package/src/errors.ts +43 -0
- package/src/home-base/prebuilt/seed.ts +1 -1
- package/src/hooks/cli.ts +6 -5
- package/src/hooks/config.ts +6 -8
- package/src/hooks/discovery.ts +6 -5
- package/src/hooks/manager.ts +4 -3
- package/src/hooks/runner.ts +2 -2
- package/src/hooks/templates.ts +5 -5
- package/src/inbound/public-ingress-urls.ts +3 -1
- package/src/index.ts +4 -2
- package/src/influencer/client.ts +1104 -0
- package/src/instrument.ts +4 -3
- package/src/logfire.ts +4 -3
- package/src/memory/admin.ts +25 -35
- package/src/memory/attachments-store.ts +4 -7
- package/src/memory/channel-delivery-store.ts +30 -1
- package/src/memory/channel-guardian-store.ts +200 -1
- package/src/memory/clarification-resolver.ts +37 -33
- package/src/memory/conflict-store.ts +67 -61
- package/src/memory/contradiction-checker.ts +141 -117
- package/src/memory/conversation-store.ts +335 -51
- package/src/memory/db-connection.ts +27 -4
- package/src/memory/db-init.ts +121 -4
- package/src/memory/db.ts +14 -1
- package/src/memory/embedding-backend.ts +27 -5
- package/src/memory/embedding-ollama.ts +2 -1
- package/src/memory/entity-extractor.ts +38 -35
- package/src/memory/guardian-action-store.ts +430 -0
- package/src/memory/inbox-escalation-projection.ts +59 -0
- package/src/memory/inbox-thread-store.ts +218 -0
- package/src/memory/ingress-invite-store.ts +338 -0
- package/src/memory/ingress-member-store.ts +350 -0
- package/src/memory/items-extractor.ts +91 -97
- package/src/memory/job-handlers/index-maintenance.ts +3 -3
- package/src/memory/job-handlers/media-processing.ts +11 -42
- package/src/memory/job-handlers/summarization.ts +32 -26
- package/src/memory/job-utils.ts +3 -10
- package/src/memory/jobs-store.ts +6 -9
- package/src/memory/jobs-worker.ts +51 -36
- package/src/memory/migrations/001-job-deferrals.ts +45 -0
- package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
- package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
- package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
- package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
- package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
- package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
- package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
- package/src/memory/migrations/017-memory-items-indexes.ts +12 -0
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
- package/src/memory/migrations/index.ts +24 -0
- package/src/memory/migrations/registry.ts +79 -0
- package/src/memory/migrations/validate-migration-state.ts +69 -0
- package/src/memory/qdrant-manager.ts +49 -8
- package/src/memory/query-builder.ts +1 -1
- package/src/memory/raw-query.ts +119 -0
- package/src/memory/recall-cache.ts +4 -1
- package/src/memory/retriever.ts +163 -47
- package/src/memory/schema-migration.ts +25 -984
- package/src/memory/schema.ts +130 -7
- package/src/memory/search/entity.ts +10 -19
- package/src/memory/search/lexical.ts +81 -52
- package/src/memory/search/ranking.ts +21 -22
- package/src/memory/search/semantic.ts +157 -19
- package/src/memory/shared-app-links-store.ts +4 -5
- package/src/memory/validation.ts +19 -0
- package/src/messaging/draft-store.ts +5 -6
- package/src/messaging/providers/sms/adapter.ts +3 -6
- package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
- package/src/messaging/providers/whatsapp/adapter.ts +136 -0
- package/src/messaging/providers/whatsapp/client.ts +67 -0
- package/src/messaging/style-analyzer.ts +5 -4
- package/src/messaging/thread-summarizer.ts +61 -69
- package/src/messaging/triage-engine.ts +62 -71
- package/src/migrations/config-merge.ts +53 -0
- package/src/migrations/data-layout.ts +68 -0
- package/src/migrations/data-merge.ts +33 -0
- package/src/migrations/hooks-merge.ts +90 -0
- package/src/migrations/index.ts +6 -0
- package/src/migrations/log.ts +23 -0
- package/src/migrations/skills-merge.ts +33 -0
- package/src/migrations/workspace-layout.ts +79 -0
- package/src/permissions/checker.ts +126 -11
- package/src/permissions/prompter.ts +14 -0
- package/src/permissions/shell-identity.ts +31 -1
- package/src/permissions/trust-store.ts +21 -1
- package/src/providers/anthropic/client.ts +4 -4
- package/src/providers/failover.ts +2 -2
- package/src/providers/model-intents.ts +70 -0
- package/src/providers/ollama/client.ts +2 -1
- package/src/providers/provider-send-message.ts +176 -0
- package/src/providers/registry.ts +71 -30
- package/src/providers/retry.ts +35 -1
- package/src/providers/types.ts +12 -1
- package/src/runtime/approval-conversation-turn.ts +97 -0
- package/src/runtime/approval-message-composer.ts +115 -5
- package/src/runtime/assistant-event-hub.ts +3 -1
- package/src/runtime/channel-approval-parser.ts +36 -2
- package/src/runtime/channel-approvals.ts +0 -21
- package/src/runtime/channel-guardian-service.ts +48 -7
- package/src/runtime/channel-readiness-service.ts +160 -34
- package/src/runtime/channel-readiness-types.ts +10 -4
- package/src/runtime/channel-retry-sweep.ts +184 -0
- package/src/runtime/guardian-context-resolver.ts +108 -0
- package/src/runtime/http-server.ts +289 -745
- package/src/runtime/http-types.ts +56 -3
- package/src/runtime/middleware/auth.ts +116 -0
- package/src/runtime/middleware/error-handler.ts +33 -0
- package/src/runtime/middleware/twilio-validation.ts +127 -0
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/call-routes.ts +49 -6
- package/src/runtime/routes/channel-delivery-routes.ts +170 -0
- package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
- package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
- package/src/runtime/routes/channel-route-shared.ts +144 -0
- package/src/runtime/routes/channel-routes.ts +32 -1634
- package/src/runtime/routes/conversation-routes.ts +50 -7
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +126 -0
- package/src/runtime/routes/pairing-routes.ts +144 -0
- package/src/runtime/routes/run-routes.ts +15 -1
- package/src/runtime/run-orchestrator.ts +52 -34
- package/src/schedule/schedule-store.ts +36 -32
- package/src/schedule/scheduler.ts +3 -3
- package/src/security/encrypted-store.ts +5 -7
- package/src/security/oauth2.ts +45 -15
- package/src/security/parental-control-store.ts +183 -0
- package/src/security/secret-allowlist.ts +4 -3
- package/src/security/secret-scanner.ts +5 -5
- package/src/security/secure-keys.ts +1 -1
- package/src/security/token-manager.ts +3 -2
- package/src/services/vercel-deploy.ts +6 -2
- package/src/skills/tool-manifest.ts +3 -3
- package/src/skills/vellum-catalog-remote.ts +75 -16
- package/src/slack/slack-webhook.ts +2 -1
- package/src/swarm/orchestrator.ts +92 -1
- package/src/swarm/router-planner.ts +6 -9
- package/src/swarm/worker-prompts.ts +9 -12
- package/src/tasks/task-compiler.ts +19 -28
- package/src/tasks/task-runner.ts +1 -1
- package/src/tools/assets/search.ts +15 -14
- package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
- package/src/tools/browser/auto-navigate.ts +1 -0
- package/src/tools/browser/browser-execution.ts +13 -1
- package/src/tools/browser/browser-manager.ts +119 -4
- package/src/tools/browser/network-recorder.ts +5 -0
- package/src/tools/credentials/broker.ts +11 -2
- package/src/tools/credentials/metadata-store.ts +18 -14
- package/src/tools/credentials/post-connect-hooks.ts +61 -0
- package/src/tools/credentials/vault.ts +49 -23
- package/src/tools/executor.ts +80 -18
- package/src/tools/host-terminal/cli-discover.ts +1 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
- package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
- package/src/tools/network/script-proxy/server.ts +1 -1
- package/src/tools/network/script-proxy/session-manager.ts +6 -5
- package/src/tools/network/web-fetch.ts +18 -2
- package/src/tools/network/web-search.ts +7 -3
- package/src/tools/reminder/reminder-store.ts +14 -15
- package/src/tools/schedule/create.ts +1 -0
- package/src/tools/schedule/list.ts +2 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
- package/src/tools/skills/skill-script-runner.ts +24 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -0
- package/src/tools/tasks/work-item-enqueue.ts +2 -2
- package/src/tools/terminal/evaluate-typescript.ts +21 -12
- package/src/tools/terminal/parser.ts +50 -0
- package/src/tools/watcher/delete.ts +6 -0
- package/src/tools/weather/service.ts +1 -1
- package/src/twitter/client.ts +190 -24
- package/src/twitter/session.ts +4 -3
- package/src/util/clipboard.ts +1 -1
- package/src/util/errors.ts +65 -8
- package/src/util/fs.ts +40 -0
- package/src/util/json.ts +10 -0
- package/src/util/log-redact.ts +189 -0
- package/src/util/logger.ts +25 -18
- package/src/util/object.ts +3 -0
- package/src/util/platform.ts +72 -365
- package/src/util/pricing.ts +1 -1
- package/src/util/promise-guard.ts +1 -1
- package/src/util/retry.ts +19 -0
- package/src/util/row-mapper.ts +79 -0
- package/src/util/silently.ts +21 -0
- package/src/watcher/engine.ts +5 -1
- package/src/watcher/provider-types.ts +20 -0
- package/src/watcher/providers/github.ts +156 -0
- package/src/watcher/providers/gmail.ts +1 -0
- package/src/watcher/providers/google-calendar.ts +1 -0
- package/src/watcher/providers/linear.ts +460 -0
- package/src/watcher/providers/slack.ts +1 -0
- package/src/work-items/work-item-runner.ts +1 -1
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/provider-commit-message-generator.ts +51 -22
- package/src/__tests__/call-bridge.test.ts +0 -517
- package/src/__tests__/session-process-bridge.test.ts +0 -244
- package/src/calls/call-bridge.ts +0 -168
- package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
- package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
- package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
- package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
- package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
- package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
- package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
- package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
- package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
- package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
const VALID_MEMORY_EMBEDDING_PROVIDERS = ['auto', 'local', 'openai', 'gemini', 'ollama'] as const;
|
|
4
|
+
const VALID_MEMORY_ITEM_KINDS = [
|
|
5
|
+
'preference', 'profile', 'project', 'decision', 'todo',
|
|
6
|
+
'fact', 'constraint', 'relationship', 'event', 'opinion', 'instruction', 'style',
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
9
|
+
const DEFAULT_CONFLICTABLE_KINDS = [
|
|
10
|
+
'preference', 'profile', 'constraint', 'instruction', 'style',
|
|
11
|
+
] as const;
|
|
12
|
+
|
|
13
|
+
const VALID_QDRANT_QUANTIZATION = ['scalar', 'none'] as const;
|
|
14
|
+
|
|
15
|
+
export const MemoryEmbeddingsConfigSchema = z.object({
|
|
16
|
+
required: z
|
|
17
|
+
.boolean({ error: 'memory.embeddings.required must be a boolean' })
|
|
18
|
+
.default(true),
|
|
19
|
+
provider: z
|
|
20
|
+
.enum(VALID_MEMORY_EMBEDDING_PROVIDERS, {
|
|
21
|
+
error: `memory.embeddings.provider must be one of: ${VALID_MEMORY_EMBEDDING_PROVIDERS.join(', ')}`,
|
|
22
|
+
})
|
|
23
|
+
.default('auto'),
|
|
24
|
+
localModel: z
|
|
25
|
+
.string({ error: 'memory.embeddings.localModel must be a string' })
|
|
26
|
+
.default('Xenova/bge-small-en-v1.5'),
|
|
27
|
+
openaiModel: z
|
|
28
|
+
.string({ error: 'memory.embeddings.openaiModel must be a string' })
|
|
29
|
+
.default('text-embedding-3-small'),
|
|
30
|
+
geminiModel: z
|
|
31
|
+
.string({ error: 'memory.embeddings.geminiModel must be a string' })
|
|
32
|
+
.default('gemini-embedding-001'),
|
|
33
|
+
ollamaModel: z
|
|
34
|
+
.string({ error: 'memory.embeddings.ollamaModel must be a string' })
|
|
35
|
+
.default('nomic-embed-text'),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export const QdrantConfigSchema = z.object({
|
|
39
|
+
url: z
|
|
40
|
+
.string({ error: 'memory.qdrant.url must be a string' })
|
|
41
|
+
.default('http://127.0.0.1:6333'),
|
|
42
|
+
collection: z
|
|
43
|
+
.string({ error: 'memory.qdrant.collection must be a string' })
|
|
44
|
+
.default('memory'),
|
|
45
|
+
vectorSize: z
|
|
46
|
+
.number({ error: 'memory.qdrant.vectorSize must be a number' })
|
|
47
|
+
.int('memory.qdrant.vectorSize must be an integer')
|
|
48
|
+
.positive('memory.qdrant.vectorSize must be a positive integer')
|
|
49
|
+
.default(384),
|
|
50
|
+
onDisk: z
|
|
51
|
+
.boolean({ error: 'memory.qdrant.onDisk must be a boolean' })
|
|
52
|
+
.default(true),
|
|
53
|
+
quantization: z
|
|
54
|
+
.enum(VALID_QDRANT_QUANTIZATION, {
|
|
55
|
+
error: `memory.qdrant.quantization must be one of: ${VALID_QDRANT_QUANTIZATION.join(', ')}`,
|
|
56
|
+
})
|
|
57
|
+
.default('scalar'),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export const MemoryRerankingConfigSchema = z.object({
|
|
61
|
+
enabled: z
|
|
62
|
+
.boolean({ error: 'memory.retrieval.reranking.enabled must be a boolean' })
|
|
63
|
+
.default(false),
|
|
64
|
+
model: z
|
|
65
|
+
.string({ error: 'memory.retrieval.reranking.model must be a string' })
|
|
66
|
+
.default('claude-haiku-4-5-20251001'),
|
|
67
|
+
topK: z
|
|
68
|
+
.number({ error: 'memory.retrieval.reranking.topK must be a number' })
|
|
69
|
+
.int('memory.retrieval.reranking.topK must be an integer')
|
|
70
|
+
.positive('memory.retrieval.reranking.topK must be a positive integer')
|
|
71
|
+
.default(20),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const MemoryDynamicBudgetConfigSchema = z.object({
|
|
75
|
+
enabled: z
|
|
76
|
+
.boolean({ error: 'memory.retrieval.dynamicBudget.enabled must be a boolean' })
|
|
77
|
+
.default(true),
|
|
78
|
+
minInjectTokens: z
|
|
79
|
+
.number({ error: 'memory.retrieval.dynamicBudget.minInjectTokens must be a number' })
|
|
80
|
+
.int('memory.retrieval.dynamicBudget.minInjectTokens must be an integer')
|
|
81
|
+
.positive('memory.retrieval.dynamicBudget.minInjectTokens must be a positive integer')
|
|
82
|
+
.default(1200),
|
|
83
|
+
maxInjectTokens: z
|
|
84
|
+
.number({ error: 'memory.retrieval.dynamicBudget.maxInjectTokens must be a number' })
|
|
85
|
+
.int('memory.retrieval.dynamicBudget.maxInjectTokens must be an integer')
|
|
86
|
+
.positive('memory.retrieval.dynamicBudget.maxInjectTokens must be a positive integer')
|
|
87
|
+
.default(10000),
|
|
88
|
+
targetHeadroomTokens: z
|
|
89
|
+
.number({ error: 'memory.retrieval.dynamicBudget.targetHeadroomTokens must be a number' })
|
|
90
|
+
.int('memory.retrieval.dynamicBudget.targetHeadroomTokens must be an integer')
|
|
91
|
+
.positive('memory.retrieval.dynamicBudget.targetHeadroomTokens must be a positive integer')
|
|
92
|
+
.default(10000),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export const MemoryEarlyTerminationConfigSchema = z.object({
|
|
96
|
+
enabled: z
|
|
97
|
+
.boolean({ error: 'memory.retrieval.earlyTermination.enabled must be a boolean' })
|
|
98
|
+
.default(true),
|
|
99
|
+
minCandidates: z
|
|
100
|
+
.number({ error: 'memory.retrieval.earlyTermination.minCandidates must be a number' })
|
|
101
|
+
.int('memory.retrieval.earlyTermination.minCandidates must be an integer')
|
|
102
|
+
.positive('memory.retrieval.earlyTermination.minCandidates must be a positive integer')
|
|
103
|
+
.default(20),
|
|
104
|
+
minHighConfidence: z
|
|
105
|
+
.number({ error: 'memory.retrieval.earlyTermination.minHighConfidence must be a number' })
|
|
106
|
+
.int('memory.retrieval.earlyTermination.minHighConfidence must be an integer')
|
|
107
|
+
.positive('memory.retrieval.earlyTermination.minHighConfidence must be a positive integer')
|
|
108
|
+
.default(10),
|
|
109
|
+
confidenceThreshold: z
|
|
110
|
+
.number({ error: 'memory.retrieval.earlyTermination.confidenceThreshold must be a number' })
|
|
111
|
+
.min(0, 'memory.retrieval.earlyTermination.confidenceThreshold must be >= 0')
|
|
112
|
+
.max(1, 'memory.retrieval.earlyTermination.confidenceThreshold must be <= 1')
|
|
113
|
+
.default(0.7),
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Per-kind freshness windows (in days). Items older than their window
|
|
118
|
+
* (based on lastSeenAt) are down-ranked unless recently reinforced.
|
|
119
|
+
* A value of 0 disables freshness decay for that kind.
|
|
120
|
+
*/
|
|
121
|
+
const MemoryFreshnessConfigSchema = z.object({
|
|
122
|
+
enabled: z
|
|
123
|
+
.boolean({ error: 'memory.retrieval.freshness.enabled must be a boolean' })
|
|
124
|
+
.default(true),
|
|
125
|
+
maxAgeDays: z.object({
|
|
126
|
+
fact: z
|
|
127
|
+
.number({ error: 'memory.retrieval.freshness.maxAgeDays.fact must be a number' })
|
|
128
|
+
.nonnegative('memory.retrieval.freshness.maxAgeDays.fact must be non-negative')
|
|
129
|
+
.default(0),
|
|
130
|
+
preference: z
|
|
131
|
+
.number({ error: 'memory.retrieval.freshness.maxAgeDays.preference must be a number' })
|
|
132
|
+
.nonnegative('memory.retrieval.freshness.maxAgeDays.preference must be non-negative')
|
|
133
|
+
.default(0),
|
|
134
|
+
behavior: z
|
|
135
|
+
.number({ error: 'memory.retrieval.freshness.maxAgeDays.behavior must be a number' })
|
|
136
|
+
.nonnegative('memory.retrieval.freshness.maxAgeDays.behavior must be non-negative')
|
|
137
|
+
.default(90),
|
|
138
|
+
event: z
|
|
139
|
+
.number({ error: 'memory.retrieval.freshness.maxAgeDays.event must be a number' })
|
|
140
|
+
.nonnegative('memory.retrieval.freshness.maxAgeDays.event must be non-negative')
|
|
141
|
+
.default(30),
|
|
142
|
+
opinion: z
|
|
143
|
+
.number({ error: 'memory.retrieval.freshness.maxAgeDays.opinion must be a number' })
|
|
144
|
+
.nonnegative('memory.retrieval.freshness.maxAgeDays.opinion must be non-negative')
|
|
145
|
+
.default(60),
|
|
146
|
+
}).default({
|
|
147
|
+
fact: 0,
|
|
148
|
+
preference: 0,
|
|
149
|
+
behavior: 90,
|
|
150
|
+
event: 30,
|
|
151
|
+
opinion: 60,
|
|
152
|
+
}),
|
|
153
|
+
staleDecay: z
|
|
154
|
+
.number({ error: 'memory.retrieval.freshness.staleDecay must be a number' })
|
|
155
|
+
.min(0, 'memory.retrieval.freshness.staleDecay must be >= 0')
|
|
156
|
+
.max(1, 'memory.retrieval.freshness.staleDecay must be <= 1')
|
|
157
|
+
.default(0.5),
|
|
158
|
+
reinforcementShieldDays: z
|
|
159
|
+
.number({ error: 'memory.retrieval.freshness.reinforcementShieldDays must be a number' })
|
|
160
|
+
.nonnegative('memory.retrieval.freshness.reinforcementShieldDays must be non-negative')
|
|
161
|
+
.default(7),
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export const MemoryRetrievalConfigSchema = z.object({
|
|
165
|
+
lexicalTopK: z
|
|
166
|
+
.number({ error: 'memory.retrieval.lexicalTopK must be a number' })
|
|
167
|
+
.int('memory.retrieval.lexicalTopK must be an integer')
|
|
168
|
+
.positive('memory.retrieval.lexicalTopK must be a positive integer')
|
|
169
|
+
.default(80),
|
|
170
|
+
semanticTopK: z
|
|
171
|
+
.number({ error: 'memory.retrieval.semanticTopK must be a number' })
|
|
172
|
+
.int('memory.retrieval.semanticTopK must be an integer')
|
|
173
|
+
.positive('memory.retrieval.semanticTopK must be a positive integer')
|
|
174
|
+
.default(40),
|
|
175
|
+
maxInjectTokens: z
|
|
176
|
+
.number({ error: 'memory.retrieval.maxInjectTokens must be a number' })
|
|
177
|
+
.int('memory.retrieval.maxInjectTokens must be an integer')
|
|
178
|
+
.positive('memory.retrieval.maxInjectTokens must be a positive integer')
|
|
179
|
+
.default(10000),
|
|
180
|
+
injectionFormat: z
|
|
181
|
+
.enum(['markdown', 'structured_v1'], { error: 'memory.retrieval.injectionFormat must be "markdown" or "structured_v1"' })
|
|
182
|
+
.default('markdown'),
|
|
183
|
+
injectionStrategy: z
|
|
184
|
+
.enum(['prepend_user_block', 'separate_context_message'], {
|
|
185
|
+
error: 'memory.retrieval.injectionStrategy must be "prepend_user_block" or "separate_context_message"',
|
|
186
|
+
})
|
|
187
|
+
.default('prepend_user_block'),
|
|
188
|
+
reranking: MemoryRerankingConfigSchema.default({
|
|
189
|
+
enabled: false,
|
|
190
|
+
model: 'claude-haiku-4-5-20251001',
|
|
191
|
+
topK: 20,
|
|
192
|
+
}),
|
|
193
|
+
freshness: MemoryFreshnessConfigSchema.default({
|
|
194
|
+
enabled: true,
|
|
195
|
+
maxAgeDays: {
|
|
196
|
+
fact: 0,
|
|
197
|
+
preference: 0,
|
|
198
|
+
behavior: 90,
|
|
199
|
+
event: 30,
|
|
200
|
+
opinion: 60,
|
|
201
|
+
},
|
|
202
|
+
staleDecay: 0.5,
|
|
203
|
+
reinforcementShieldDays: 7,
|
|
204
|
+
}),
|
|
205
|
+
scopePolicy: z
|
|
206
|
+
.enum(['allow_global_fallback', 'strict'], {
|
|
207
|
+
error: 'memory.retrieval.scopePolicy must be "allow_global_fallback" or "strict"',
|
|
208
|
+
})
|
|
209
|
+
.default('allow_global_fallback'),
|
|
210
|
+
dynamicBudget: MemoryDynamicBudgetConfigSchema.default({
|
|
211
|
+
enabled: true,
|
|
212
|
+
minInjectTokens: 1200,
|
|
213
|
+
maxInjectTokens: 10000,
|
|
214
|
+
targetHeadroomTokens: 10000,
|
|
215
|
+
}),
|
|
216
|
+
earlyTermination: MemoryEarlyTerminationConfigSchema.default({
|
|
217
|
+
enabled: true,
|
|
218
|
+
minCandidates: 20,
|
|
219
|
+
minHighConfidence: 10,
|
|
220
|
+
confidenceThreshold: 0.7,
|
|
221
|
+
}),
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
export const MemorySegmentationConfigSchema = z.object({
|
|
225
|
+
targetTokens: z
|
|
226
|
+
.number({ error: 'memory.segmentation.targetTokens must be a number' })
|
|
227
|
+
.int('memory.segmentation.targetTokens must be an integer')
|
|
228
|
+
.positive('memory.segmentation.targetTokens must be a positive integer')
|
|
229
|
+
.default(450),
|
|
230
|
+
overlapTokens: z
|
|
231
|
+
.number({ error: 'memory.segmentation.overlapTokens must be a number' })
|
|
232
|
+
.int('memory.segmentation.overlapTokens must be an integer')
|
|
233
|
+
.nonnegative('memory.segmentation.overlapTokens must be a non-negative integer')
|
|
234
|
+
.default(60),
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
export const MemoryJobsConfigSchema = z.object({
|
|
238
|
+
workerConcurrency: z
|
|
239
|
+
.number({ error: 'memory.jobs.workerConcurrency must be a number' })
|
|
240
|
+
.int('memory.jobs.workerConcurrency must be an integer')
|
|
241
|
+
.positive('memory.jobs.workerConcurrency must be a positive integer')
|
|
242
|
+
.default(2),
|
|
243
|
+
batchSize: z
|
|
244
|
+
.number({ error: 'memory.jobs.batchSize must be a number' })
|
|
245
|
+
.int('memory.jobs.batchSize must be an integer')
|
|
246
|
+
.positive('memory.jobs.batchSize must be a positive integer')
|
|
247
|
+
.default(10),
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
export const MemoryRetentionConfigSchema = z.object({
|
|
251
|
+
keepRawForever: z
|
|
252
|
+
.boolean({ error: 'memory.retention.keepRawForever must be a boolean' })
|
|
253
|
+
.default(true),
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
export const MemoryCleanupConfigSchema = z.object({
|
|
257
|
+
enabled: z
|
|
258
|
+
.boolean({ error: 'memory.cleanup.enabled must be a boolean' })
|
|
259
|
+
.default(true),
|
|
260
|
+
enqueueIntervalMs: z
|
|
261
|
+
.number({ error: 'memory.cleanup.enqueueIntervalMs must be a number' })
|
|
262
|
+
.int('memory.cleanup.enqueueIntervalMs must be an integer')
|
|
263
|
+
.positive('memory.cleanup.enqueueIntervalMs must be a positive integer')
|
|
264
|
+
.default(6 * 60 * 60 * 1000),
|
|
265
|
+
resolvedConflictRetentionMs: z
|
|
266
|
+
.number({ error: 'memory.cleanup.resolvedConflictRetentionMs must be a number' })
|
|
267
|
+
.int('memory.cleanup.resolvedConflictRetentionMs must be an integer')
|
|
268
|
+
.positive('memory.cleanup.resolvedConflictRetentionMs must be a positive integer')
|
|
269
|
+
.default(30 * 24 * 60 * 60 * 1000),
|
|
270
|
+
supersededItemRetentionMs: z
|
|
271
|
+
.number({ error: 'memory.cleanup.supersededItemRetentionMs must be a number' })
|
|
272
|
+
.int('memory.cleanup.supersededItemRetentionMs must be an integer')
|
|
273
|
+
.positive('memory.cleanup.supersededItemRetentionMs must be a positive integer')
|
|
274
|
+
.default(30 * 24 * 60 * 60 * 1000),
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
export const MemoryExtractionConfigSchema = z.object({
|
|
278
|
+
useLLM: z
|
|
279
|
+
.boolean({ error: 'memory.extraction.useLLM must be a boolean' })
|
|
280
|
+
.default(true),
|
|
281
|
+
model: z
|
|
282
|
+
.string({ error: 'memory.extraction.model must be a string' })
|
|
283
|
+
.default('claude-haiku-4-5-20251001'),
|
|
284
|
+
extractFromAssistant: z
|
|
285
|
+
.boolean({ error: 'memory.extraction.extractFromAssistant must be a boolean' })
|
|
286
|
+
.default(true),
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
export const MemoryEntityConfigSchema = z.object({
|
|
290
|
+
enabled: z
|
|
291
|
+
.boolean({ error: 'memory.entity.enabled must be a boolean' })
|
|
292
|
+
.default(true),
|
|
293
|
+
model: z
|
|
294
|
+
.string({ error: 'memory.entity.model must be a string' })
|
|
295
|
+
.default('claude-haiku-4-5-20251001'),
|
|
296
|
+
extractRelations: z.object({
|
|
297
|
+
enabled: z
|
|
298
|
+
.boolean({ error: 'memory.entity.extractRelations.enabled must be a boolean' })
|
|
299
|
+
.default(true),
|
|
300
|
+
backfillBatchSize: z
|
|
301
|
+
.number({ error: 'memory.entity.extractRelations.backfillBatchSize must be a number' })
|
|
302
|
+
.int('memory.entity.extractRelations.backfillBatchSize must be an integer')
|
|
303
|
+
.positive('memory.entity.extractRelations.backfillBatchSize must be a positive integer')
|
|
304
|
+
.default(200),
|
|
305
|
+
}).default({
|
|
306
|
+
enabled: true,
|
|
307
|
+
backfillBatchSize: 200,
|
|
308
|
+
}),
|
|
309
|
+
relationRetrieval: z.object({
|
|
310
|
+
enabled: z
|
|
311
|
+
.boolean({ error: 'memory.entity.relationRetrieval.enabled must be a boolean' })
|
|
312
|
+
.default(true),
|
|
313
|
+
maxSeedEntities: z
|
|
314
|
+
.number({ error: 'memory.entity.relationRetrieval.maxSeedEntities must be a number' })
|
|
315
|
+
.int('memory.entity.relationRetrieval.maxSeedEntities must be an integer')
|
|
316
|
+
.positive('memory.entity.relationRetrieval.maxSeedEntities must be a positive integer')
|
|
317
|
+
.default(8),
|
|
318
|
+
maxNeighborEntities: z
|
|
319
|
+
.number({ error: 'memory.entity.relationRetrieval.maxNeighborEntities must be a number' })
|
|
320
|
+
.int('memory.entity.relationRetrieval.maxNeighborEntities must be an integer')
|
|
321
|
+
.positive('memory.entity.relationRetrieval.maxNeighborEntities must be a positive integer')
|
|
322
|
+
.default(20),
|
|
323
|
+
maxEdges: z
|
|
324
|
+
.number({ error: 'memory.entity.relationRetrieval.maxEdges must be a number' })
|
|
325
|
+
.int('memory.entity.relationRetrieval.maxEdges must be an integer')
|
|
326
|
+
.positive('memory.entity.relationRetrieval.maxEdges must be a positive integer')
|
|
327
|
+
.default(40),
|
|
328
|
+
neighborScoreMultiplier: z
|
|
329
|
+
.number({ error: 'memory.entity.relationRetrieval.neighborScoreMultiplier must be a number' })
|
|
330
|
+
.gt(0, 'memory.entity.relationRetrieval.neighborScoreMultiplier must be > 0')
|
|
331
|
+
.lte(1, 'memory.entity.relationRetrieval.neighborScoreMultiplier must be <= 1')
|
|
332
|
+
.default(0.7),
|
|
333
|
+
maxDepth: z
|
|
334
|
+
.number({ error: 'memory.entity.relationRetrieval.maxDepth must be a number' })
|
|
335
|
+
.int('memory.entity.relationRetrieval.maxDepth must be an integer')
|
|
336
|
+
.positive('memory.entity.relationRetrieval.maxDepth must be a positive integer')
|
|
337
|
+
.default(3),
|
|
338
|
+
depthDecay: z
|
|
339
|
+
.boolean({ error: 'memory.entity.relationRetrieval.depthDecay must be a boolean' })
|
|
340
|
+
.default(true),
|
|
341
|
+
}).default({
|
|
342
|
+
enabled: true,
|
|
343
|
+
maxSeedEntities: 8,
|
|
344
|
+
maxNeighborEntities: 20,
|
|
345
|
+
maxEdges: 40,
|
|
346
|
+
neighborScoreMultiplier: 0.7,
|
|
347
|
+
maxDepth: 3,
|
|
348
|
+
depthDecay: true,
|
|
349
|
+
}),
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
export const MemoryConflictsConfigSchema = z.object({
|
|
353
|
+
enabled: z
|
|
354
|
+
.boolean({ error: 'memory.conflicts.enabled must be a boolean' })
|
|
355
|
+
.default(true),
|
|
356
|
+
gateMode: z
|
|
357
|
+
.enum(['soft'], { error: 'memory.conflicts.gateMode must be "soft"' })
|
|
358
|
+
.default('soft'),
|
|
359
|
+
reaskCooldownTurns: z
|
|
360
|
+
.number({ error: 'memory.conflicts.reaskCooldownTurns must be a number' })
|
|
361
|
+
.int('memory.conflicts.reaskCooldownTurns must be an integer')
|
|
362
|
+
.positive('memory.conflicts.reaskCooldownTurns must be a positive integer')
|
|
363
|
+
.default(3),
|
|
364
|
+
resolverLlmTimeoutMs: z
|
|
365
|
+
.number({ error: 'memory.conflicts.resolverLlmTimeoutMs must be a number' })
|
|
366
|
+
.int('memory.conflicts.resolverLlmTimeoutMs must be an integer')
|
|
367
|
+
.positive('memory.conflicts.resolverLlmTimeoutMs must be a positive integer')
|
|
368
|
+
.default(12000),
|
|
369
|
+
relevanceThreshold: z
|
|
370
|
+
.number({ error: 'memory.conflicts.relevanceThreshold must be a number' })
|
|
371
|
+
.min(0, 'memory.conflicts.relevanceThreshold must be >= 0')
|
|
372
|
+
.max(1, 'memory.conflicts.relevanceThreshold must be <= 1')
|
|
373
|
+
.default(0.3),
|
|
374
|
+
askOnIrrelevantTurns: z
|
|
375
|
+
.boolean({ error: 'memory.conflicts.askOnIrrelevantTurns must be a boolean' })
|
|
376
|
+
.default(false),
|
|
377
|
+
conflictableKinds: z
|
|
378
|
+
.array(
|
|
379
|
+
z.enum(VALID_MEMORY_ITEM_KINDS, {
|
|
380
|
+
error: `memory.conflicts.conflictableKinds entries must be one of: ${VALID_MEMORY_ITEM_KINDS.join(', ')}`,
|
|
381
|
+
}),
|
|
382
|
+
)
|
|
383
|
+
.nonempty({ message: 'memory.conflicts.conflictableKinds must not be empty' })
|
|
384
|
+
.default([...DEFAULT_CONFLICTABLE_KINDS]),
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
export const MemoryProfileConfigSchema = z.object({
|
|
388
|
+
enabled: z
|
|
389
|
+
.boolean({ error: 'memory.profile.enabled must be a boolean' })
|
|
390
|
+
.default(true),
|
|
391
|
+
maxInjectTokens: z
|
|
392
|
+
.number({ error: 'memory.profile.maxInjectTokens must be a number' })
|
|
393
|
+
.int('memory.profile.maxInjectTokens must be an integer')
|
|
394
|
+
.positive('memory.profile.maxInjectTokens must be a positive integer')
|
|
395
|
+
.default(800),
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
export const MemorySummarizationConfigSchema = z.object({
|
|
399
|
+
useLLM: z
|
|
400
|
+
.boolean({ error: 'memory.summarization.useLLM must be a boolean' })
|
|
401
|
+
.default(true),
|
|
402
|
+
model: z
|
|
403
|
+
.string({ error: 'memory.summarization.model must be a string' })
|
|
404
|
+
.default('claude-haiku-4-5-20251001'),
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
export const MemoryConfigSchema = z.object({
|
|
408
|
+
enabled: z
|
|
409
|
+
.boolean({ error: 'memory.enabled must be a boolean' })
|
|
410
|
+
.default(true),
|
|
411
|
+
embeddings: MemoryEmbeddingsConfigSchema.default({
|
|
412
|
+
required: true,
|
|
413
|
+
provider: 'auto',
|
|
414
|
+
localModel: 'Xenova/bge-small-en-v1.5',
|
|
415
|
+
openaiModel: 'text-embedding-3-small',
|
|
416
|
+
geminiModel: 'gemini-embedding-001',
|
|
417
|
+
ollamaModel: 'nomic-embed-text',
|
|
418
|
+
}),
|
|
419
|
+
qdrant: QdrantConfigSchema.default({
|
|
420
|
+
url: 'http://127.0.0.1:6333',
|
|
421
|
+
collection: 'memory',
|
|
422
|
+
vectorSize: 384,
|
|
423
|
+
onDisk: true,
|
|
424
|
+
quantization: 'scalar',
|
|
425
|
+
}),
|
|
426
|
+
retrieval: MemoryRetrievalConfigSchema.default({
|
|
427
|
+
lexicalTopK: 80,
|
|
428
|
+
semanticTopK: 40,
|
|
429
|
+
maxInjectTokens: 10000,
|
|
430
|
+
injectionFormat: 'markdown',
|
|
431
|
+
injectionStrategy: 'prepend_user_block',
|
|
432
|
+
reranking: {
|
|
433
|
+
enabled: false,
|
|
434
|
+
model: 'claude-haiku-4-5-20251001',
|
|
435
|
+
topK: 20,
|
|
436
|
+
},
|
|
437
|
+
freshness: {
|
|
438
|
+
enabled: true,
|
|
439
|
+
maxAgeDays: { fact: 0, preference: 0, behavior: 90, event: 30, opinion: 60 },
|
|
440
|
+
staleDecay: 0.5,
|
|
441
|
+
reinforcementShieldDays: 7,
|
|
442
|
+
},
|
|
443
|
+
scopePolicy: 'allow_global_fallback',
|
|
444
|
+
dynamicBudget: {
|
|
445
|
+
enabled: true,
|
|
446
|
+
minInjectTokens: 1200,
|
|
447
|
+
maxInjectTokens: 10000,
|
|
448
|
+
targetHeadroomTokens: 10000,
|
|
449
|
+
},
|
|
450
|
+
earlyTermination: {
|
|
451
|
+
enabled: true,
|
|
452
|
+
minCandidates: 20,
|
|
453
|
+
minHighConfidence: 10,
|
|
454
|
+
confidenceThreshold: 0.7,
|
|
455
|
+
},
|
|
456
|
+
}),
|
|
457
|
+
segmentation: MemorySegmentationConfigSchema.default({
|
|
458
|
+
targetTokens: 450,
|
|
459
|
+
overlapTokens: 60,
|
|
460
|
+
}),
|
|
461
|
+
jobs: MemoryJobsConfigSchema.default({
|
|
462
|
+
workerConcurrency: 2,
|
|
463
|
+
batchSize: 10,
|
|
464
|
+
}),
|
|
465
|
+
retention: MemoryRetentionConfigSchema.default({
|
|
466
|
+
keepRawForever: true,
|
|
467
|
+
}),
|
|
468
|
+
cleanup: MemoryCleanupConfigSchema.default({
|
|
469
|
+
enabled: true,
|
|
470
|
+
enqueueIntervalMs: 6 * 60 * 60 * 1000,
|
|
471
|
+
resolvedConflictRetentionMs: 30 * 24 * 60 * 60 * 1000,
|
|
472
|
+
supersededItemRetentionMs: 30 * 24 * 60 * 60 * 1000,
|
|
473
|
+
}),
|
|
474
|
+
extraction: MemoryExtractionConfigSchema.default({
|
|
475
|
+
useLLM: true,
|
|
476
|
+
model: 'claude-haiku-4-5-20251001',
|
|
477
|
+
extractFromAssistant: true,
|
|
478
|
+
}),
|
|
479
|
+
summarization: MemorySummarizationConfigSchema.default({
|
|
480
|
+
useLLM: true,
|
|
481
|
+
model: 'claude-haiku-4-5-20251001',
|
|
482
|
+
}),
|
|
483
|
+
entity: MemoryEntityConfigSchema.default({
|
|
484
|
+
enabled: true,
|
|
485
|
+
model: 'claude-haiku-4-5-20251001',
|
|
486
|
+
extractRelations: {
|
|
487
|
+
enabled: true,
|
|
488
|
+
backfillBatchSize: 200,
|
|
489
|
+
},
|
|
490
|
+
relationRetrieval: {
|
|
491
|
+
enabled: true,
|
|
492
|
+
maxSeedEntities: 8,
|
|
493
|
+
maxNeighborEntities: 20,
|
|
494
|
+
maxEdges: 40,
|
|
495
|
+
neighborScoreMultiplier: 0.7,
|
|
496
|
+
maxDepth: 3,
|
|
497
|
+
depthDecay: true,
|
|
498
|
+
},
|
|
499
|
+
}),
|
|
500
|
+
conflicts: MemoryConflictsConfigSchema.default({
|
|
501
|
+
enabled: true,
|
|
502
|
+
gateMode: 'soft',
|
|
503
|
+
reaskCooldownTurns: 3,
|
|
504
|
+
resolverLlmTimeoutMs: 12000,
|
|
505
|
+
relevanceThreshold: 0.3,
|
|
506
|
+
askOnIrrelevantTurns: false,
|
|
507
|
+
conflictableKinds: ['preference', 'profile', 'constraint', 'instruction', 'style'],
|
|
508
|
+
}),
|
|
509
|
+
profile: MemoryProfileConfigSchema.default({
|
|
510
|
+
enabled: true,
|
|
511
|
+
maxInjectTokens: 800,
|
|
512
|
+
}),
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
export type MemoryEmbeddingsConfig = z.infer<typeof MemoryEmbeddingsConfigSchema>;
|
|
516
|
+
export type MemoryRerankingConfig = z.infer<typeof MemoryRerankingConfigSchema>;
|
|
517
|
+
export type MemoryRetrievalConfig = z.infer<typeof MemoryRetrievalConfigSchema>;
|
|
518
|
+
export type MemorySegmentationConfig = z.infer<typeof MemorySegmentationConfigSchema>;
|
|
519
|
+
export type MemoryJobsConfig = z.infer<typeof MemoryJobsConfigSchema>;
|
|
520
|
+
export type MemoryRetentionConfig = z.infer<typeof MemoryRetentionConfigSchema>;
|
|
521
|
+
export type MemoryCleanupConfig = z.infer<typeof MemoryCleanupConfigSchema>;
|
|
522
|
+
export type MemoryExtractionConfig = z.infer<typeof MemoryExtractionConfigSchema>;
|
|
523
|
+
export type MemorySummarizationConfig = z.infer<typeof MemorySummarizationConfigSchema>;
|
|
524
|
+
export type MemoryEntityConfig = z.infer<typeof MemoryEntityConfigSchema>;
|
|
525
|
+
export type MemoryConflictsConfig = z.infer<typeof MemoryConflictsConfigSchema>;
|
|
526
|
+
export type MemoryProfileConfig = z.infer<typeof MemoryProfileConfigSchema>;
|
|
527
|
+
export type MemoryConfig = z.infer<typeof MemoryConfigSchema>;
|
|
528
|
+
export type QdrantConfig = z.infer<typeof QdrantConfigSchema>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
const VALID_SANDBOX_BACKENDS = ['native', 'docker'] as const;
|
|
4
|
+
const VALID_DOCKER_NETWORKS = ['none', 'bridge'] as const;
|
|
5
|
+
|
|
6
|
+
export const DockerConfigSchema = z.object({
|
|
7
|
+
image: z
|
|
8
|
+
.string({ error: 'sandbox.docker.image must be a string' })
|
|
9
|
+
.default('vellum-sandbox:latest'),
|
|
10
|
+
shell: z
|
|
11
|
+
.string({ error: 'sandbox.docker.shell must be a string' })
|
|
12
|
+
.default('bash'),
|
|
13
|
+
cpus: z
|
|
14
|
+
.number({ error: 'sandbox.docker.cpus must be a number' })
|
|
15
|
+
.finite('sandbox.docker.cpus must be finite')
|
|
16
|
+
.positive('sandbox.docker.cpus must be a positive number')
|
|
17
|
+
.default(1),
|
|
18
|
+
memoryMb: z
|
|
19
|
+
.number({ error: 'sandbox.docker.memoryMb must be a number' })
|
|
20
|
+
.int('sandbox.docker.memoryMb must be an integer')
|
|
21
|
+
.positive('sandbox.docker.memoryMb must be a positive integer')
|
|
22
|
+
.default(512),
|
|
23
|
+
pidsLimit: z
|
|
24
|
+
.number({ error: 'sandbox.docker.pidsLimit must be a number' })
|
|
25
|
+
.int('sandbox.docker.pidsLimit must be an integer')
|
|
26
|
+
.positive('sandbox.docker.pidsLimit must be a positive integer')
|
|
27
|
+
.default(256),
|
|
28
|
+
network: z
|
|
29
|
+
.enum(VALID_DOCKER_NETWORKS, {
|
|
30
|
+
error: `sandbox.docker.network must be one of: ${VALID_DOCKER_NETWORKS.join(', ')}`,
|
|
31
|
+
})
|
|
32
|
+
.default('none'),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export const SandboxConfigSchema = z.object({
|
|
36
|
+
enabled: z
|
|
37
|
+
.boolean({ error: 'sandbox.enabled must be a boolean' })
|
|
38
|
+
.default(true),
|
|
39
|
+
backend: z
|
|
40
|
+
.enum(VALID_SANDBOX_BACKENDS, {
|
|
41
|
+
error: `sandbox.backend must be one of: ${VALID_SANDBOX_BACKENDS.join(', ')}`,
|
|
42
|
+
})
|
|
43
|
+
.default('docker'),
|
|
44
|
+
docker: DockerConfigSchema.default({
|
|
45
|
+
image: 'vellum-sandbox:latest',
|
|
46
|
+
shell: 'bash',
|
|
47
|
+
cpus: 1,
|
|
48
|
+
memoryMb: 512,
|
|
49
|
+
pidsLimit: 256,
|
|
50
|
+
network: 'none',
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export type SandboxConfig = z.infer<typeof SandboxConfigSchema>;
|
|
55
|
+
export type DockerConfig = z.infer<typeof DockerConfigSchema>;
|