@vellumai/assistant 0.5.5 → 0.5.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/.env.example +16 -2
- package/ARCHITECTURE.md +6 -75
- package/Dockerfile +4 -5
- package/README.md +0 -2
- package/bun.lock +0 -414
- package/docs/architecture/keychain-broker.md +45 -240
- package/docs/architecture/security.md +0 -17
- package/docs/credential-execution-service.md +2 -2
- package/node_modules/@vellumai/ces-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +119 -0
- package/node_modules/@vellumai/credential-storage/package.json +1 -0
- package/node_modules/@vellumai/egress-proxy/package.json +1 -0
- package/package.json +2 -3
- package/src/__tests__/actor-token-service.test.ts +1 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
- package/src/__tests__/browser-skill-endstate.test.ts +6 -5
- package/src/__tests__/btw-routes.test.ts +0 -39
- package/src/__tests__/call-domain.test.ts +0 -128
- package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -5
- package/src/__tests__/channel-readiness-service.test.ts +1 -60
- package/src/__tests__/checker.test.ts +4 -2
- package/src/__tests__/cli-command-risk-guard.test.ts +112 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +3 -3
- package/src/__tests__/context-window-manager.test.ts +78 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-skill-tools.test.ts +0 -54
- package/src/__tests__/conversation-title-service.test.ts +117 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +28 -14
- package/src/__tests__/credential-execution-managed-contract.test.ts +33 -18
- package/src/__tests__/credential-security-e2e.test.ts +0 -66
- package/src/__tests__/credential-security-invariants.test.ts +4 -45
- package/src/__tests__/credentials-cli.test.ts +78 -0
- package/src/__tests__/db-migration-rollback.test.ts +2015 -1
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +98 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
- package/src/__tests__/guardian-routing-state.test.ts +0 -5
- package/src/__tests__/host-shell-tool.test.ts +6 -7
- package/src/__tests__/http-user-message-parity.test.ts +3 -103
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -4
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -8
- package/src/__tests__/intent-routing.test.ts +0 -13
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +178 -0
- package/src/__tests__/keychain-broker-client.test.ts +161 -22
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
- package/src/__tests__/memory-regressions.test.ts +8 -30
- package/src/__tests__/migration-export-http.test.ts +2 -2
- package/src/__tests__/migration-import-commit-http.test.ts +2 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +2 -2
- package/src/__tests__/migration-validate-http.test.ts +2 -2
- package/src/__tests__/non-member-access-request.test.ts +0 -5
- package/src/__tests__/notification-decision-fallback.test.ts +4 -0
- package/src/__tests__/notification-decision-identity.test.ts +4 -0
- package/src/__tests__/permission-types.test.ts +1 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
- package/src/__tests__/qdrant-manager.test.ts +28 -2
- package/src/__tests__/registry.test.ts +0 -6
- package/src/__tests__/require-fresh-approval.test.ts +4 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
- package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
- package/src/__tests__/secure-keys.test.ts +83 -263
- package/src/__tests__/shell-identity.test.ts +96 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +22 -14
- package/src/__tests__/skill-feature-flags.test.ts +46 -45
- package/src/__tests__/skill-load-feature-flag.test.ts +7 -10
- package/src/__tests__/skill-load-inline-command.test.ts +8 -12
- package/src/__tests__/skill-load-inline-includes.test.ts +6 -10
- package/src/__tests__/skill-load-tool.test.ts +0 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +33 -29
- package/src/__tests__/skills.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +0 -4
- package/src/__tests__/suggestion-routes.test.ts +1 -32
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -0
- package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
- package/src/__tests__/tool-executor.test.ts +4 -0
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
- package/src/__tests__/update-bulletin.test.ts +0 -2
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +6 -9
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -6
- package/src/__tests__/workspace-migration-015-migrate-credentials-to-keychain.test.ts +252 -0
- package/src/__tests__/workspace-migration-016-migrate-credentials-from-keychain.test.ts +218 -0
- package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
- package/src/calls/audio-store.test.ts +97 -0
- package/src/calls/audio-store.ts +205 -0
- package/src/calls/call-controller.ts +85 -7
- package/src/calls/call-domain.ts +3 -0
- package/src/calls/call-store.ts +10 -3
- package/src/calls/fish-audio-client.ts +117 -0
- package/src/calls/relay-server.ts +27 -0
- package/src/calls/twilio-routes.ts +2 -1
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-ingress-preflight.ts +0 -42
- package/src/calls/voice-quality.ts +26 -5
- package/src/calls/voice-session-bridge.ts +6 -12
- package/src/cli/commands/config.ts +1 -4
- package/src/cli/commands/conversations.ts +0 -18
- package/src/cli/commands/credentials.ts +34 -4
- package/src/cli/commands/oauth/index.ts +7 -0
- package/src/cli/commands/oauth/platform.ts +179 -0
- package/src/cli/commands/platform.ts +3 -3
- package/src/config/assistant-feature-flags.ts +186 -5
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
- package/src/config/bundled-tool-registry.ts +1 -11
- package/src/config/env-registry.ts +1 -1
- package/src/config/env.ts +16 -16
- package/src/config/feature-flag-registry.json +48 -16
- package/src/config/loader.ts +98 -31
- package/src/config/schema.ts +4 -25
- package/src/config/schemas/calls.ts +13 -0
- package/src/config/schemas/fish-audio.ts +39 -0
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/platform.ts +1 -1
- package/src/config/schemas/security.ts +4 -4
- package/src/config/types.ts +0 -1
- package/src/contacts/contact-store.ts +39 -0
- package/src/contacts/types.ts +2 -0
- package/src/context/window-manager.ts +53 -2
- package/src/credential-execution/approval-bridge.ts +1 -0
- package/src/credential-execution/executable-discovery.ts +28 -4
- package/src/credential-execution/feature-gates.ts +16 -0
- package/src/credential-execution/process-manager.ts +38 -0
- package/src/daemon/assistant-attachments.ts +9 -0
- package/src/daemon/config-watcher.ts +6 -4
- package/src/daemon/conversation-agent-loop.ts +0 -60
- package/src/daemon/conversation-memory.ts +0 -117
- package/src/daemon/conversation-runtime-assembly.ts +0 -2
- package/src/daemon/conversation-tool-setup.ts +0 -105
- package/src/daemon/conversation.ts +10 -1
- package/src/daemon/handlers/config-vercel.ts +92 -0
- package/src/daemon/handlers/conversations.ts +0 -11
- package/src/daemon/handlers/skills.ts +2 -15
- package/src/daemon/install-symlink.ts +195 -0
- package/src/daemon/lifecycle.ts +229 -96
- package/src/daemon/message-types/conversations.ts +3 -4
- package/src/daemon/message-types/diagnostics.ts +3 -22
- package/src/daemon/message-types/messages.ts +0 -2
- package/src/daemon/message-types/upgrades.ts +8 -0
- package/src/daemon/server.ts +30 -92
- package/src/events/domain-events.ts +2 -1
- package/src/followups/followup-store.ts +5 -2
- package/src/inbound/platform-callback-registration.ts +3 -3
- package/src/instrument.ts +8 -5
- package/src/memory/conversation-crud.ts +0 -236
- package/src/memory/conversation-title-service.ts +76 -11
- package/src/memory/db-init.ts +15 -11
- package/src/memory/indexer.ts +15 -106
- package/src/memory/items-extractor.ts +15 -1
- package/src/memory/job-handlers/conversation-starters.ts +4 -1
- package/src/memory/job-handlers/embedding.ts +0 -79
- package/src/memory/job-utils.ts +1 -1
- package/src/memory/jobs-store.ts +30 -13
- package/src/memory/jobs-worker.ts +31 -27
- package/src/memory/migrations/001-job-deferrals.ts +19 -0
- package/src/memory/migrations/004-entity-relation-dedup.ts +10 -0
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +76 -0
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +50 -0
- package/src/memory/migrations/007-assistant-id-to-self.ts +10 -0
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +34 -0
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +26 -0
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +10 -0
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -0
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +12 -0
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +121 -0
- package/src/memory/migrations/024-embedding-vector-blob.ts +74 -0
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +82 -0
- package/src/memory/migrations/036-normalize-phone-identities.ts +11 -0
- package/src/memory/migrations/116-messages-fts.ts +106 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +52 -0
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +77 -0
- package/src/memory/migrations/134-contacts-notes-column.ts +13 -0
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +20 -0
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +13 -0
- package/src/memory/migrations/141-rename-verification-table.ts +54 -0
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +25 -0
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +35 -0
- package/src/memory/migrations/144-rename-voice-to-phone.ts +136 -0
- package/src/memory/migrations/145-drop-accounts-table.ts +32 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +14 -1
- package/src/memory/migrations/148-drop-reminders-table.ts +35 -1
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +69 -1
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +290 -0
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +51 -1
- package/src/memory/migrations/174-rename-thread-starters-table.ts +47 -1
- package/src/memory/migrations/176-drop-capability-card-state.ts +13 -0
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +16 -0
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +28 -1
- package/src/memory/migrations/189-drop-simplified-memory.ts +42 -0
- package/src/memory/migrations/190-call-session-skip-disclosure.ts +15 -0
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +64 -0
- package/src/memory/migrations/192-contacts-user-file-column.ts +15 -0
- package/src/memory/migrations/index.ts +5 -3
- package/src/memory/migrations/registry.ts +90 -0
- package/src/memory/migrations/validate-migration-state.ts +137 -11
- package/src/memory/qdrant-circuit-breaker.ts +9 -0
- package/src/memory/qdrant-client.ts +4 -6
- package/src/memory/qdrant-manager.ts +64 -7
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/contacts.ts +1 -0
- package/src/memory/schema/conversations.ts +0 -3
- package/src/memory/schema/index.ts +0 -2
- package/src/messaging/draft-store.ts +2 -2
- package/src/notifications/decision-engine.ts +4 -1
- package/src/oauth/connection-resolver.ts +6 -4
- package/src/permissions/checker.ts +0 -38
- package/src/permissions/defaults.ts +3 -3
- package/src/permissions/shell-identity.ts +76 -22
- package/src/permissions/trust-client.ts +2 -13
- package/src/permissions/trust-store.ts +8 -3
- package/src/permissions/types.ts +4 -2
- package/src/platform/client.ts +35 -7
- package/src/prompts/persona-resolver.ts +138 -0
- package/src/prompts/system-prompt.ts +36 -4
- package/src/prompts/templates/users/default.md +1 -0
- package/src/providers/registry.ts +27 -40
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/external-assistant-id.test.ts +13 -68
- package/src/runtime/auth/external-assistant-id.ts +13 -59
- package/src/runtime/auth/route-policy.ts +29 -1
- package/src/runtime/auth/token-service.ts +53 -15
- package/src/runtime/channel-readiness-service.ts +1 -16
- package/src/runtime/http-server.ts +29 -2
- package/src/runtime/middleware/error-handler.ts +1 -9
- package/src/runtime/routes/audio-routes.ts +40 -0
- package/src/runtime/routes/btw-routes.ts +0 -17
- package/src/runtime/routes/conversation-management-routes.ts +0 -36
- package/src/runtime/routes/conversation-query-routes.ts +106 -2
- package/src/runtime/routes/conversation-routes.ts +4 -43
- package/src/runtime/routes/diagnostics-routes.ts +1 -477
- package/src/runtime/routes/identity-routes.ts +18 -29
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/integrations/vercel.ts +89 -0
- package/src/runtime/routes/log-export-routes.ts +5 -0
- package/src/runtime/routes/memory-item-routes.test.ts +221 -3
- package/src/runtime/routes/memory-item-routes.ts +144 -4
- package/src/runtime/routes/migration-rollback-routes.ts +209 -0
- package/src/runtime/routes/migration-routes.ts +17 -1
- package/src/runtime/routes/notification-routes.ts +58 -0
- package/src/runtime/routes/schedule-routes.ts +65 -0
- package/src/runtime/routes/settings-routes.ts +41 -1
- package/src/runtime/routes/tts-routes.ts +86 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +175 -0
- package/src/runtime/routes/workspace-commit-routes.ts +62 -0
- package/src/runtime/routes/workspace-routes.test.ts +22 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +86 -2
- package/src/schedule/schedule-store.ts +0 -21
- package/src/security/ces-credential-client.ts +59 -22
- package/src/security/ces-rpc-credential-backend.ts +85 -0
- package/src/security/credential-backend.ts +12 -88
- package/src/security/keychain-broker-client.ts +10 -2
- package/src/security/secure-keys.ts +94 -113
- package/src/skills/catalog-install.ts +13 -7
- package/src/skills/inline-command-render.ts +5 -1
- package/src/skills/inline-command-runner.ts +30 -2
- package/src/telemetry/usage-telemetry-reporter.ts +4 -2
- package/src/tools/calls/call-start.ts +1 -0
- package/src/tools/executor.ts +0 -4
- package/src/tools/memory/handlers.ts +1 -129
- package/src/tools/network/script-proxy/session-manager.ts +19 -4
- package/src/tools/network/web-fetch.ts +3 -1
- package/src/tools/permission-checker.ts +18 -0
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/load.ts +9 -2
- package/src/tools/types.ts +0 -8
- package/src/util/errors.ts +0 -12
- package/src/util/platform.ts +8 -55
- package/src/util/xml.ts +8 -0
- package/src/workspace/git-service.ts +5 -2
- package/src/workspace/heartbeat-service.ts +5 -24
- package/src/workspace/migrations/001-avatar-rename.ts +15 -0
- package/src/workspace/migrations/003-seed-device-id.ts +17 -1
- package/src/workspace/migrations/004-extract-collect-usage-data.ts +33 -0
- package/src/workspace/migrations/005-add-send-diagnostics.ts +3 -0
- package/src/workspace/migrations/006-services-config.ts +49 -0
- package/src/workspace/migrations/007-web-search-provider-rename.ts +27 -0
- package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +3 -0
- package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +4 -0
- package/src/workspace/migrations/010-app-dir-rename.ts +78 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +11 -0
- package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +44 -0
- package/src/workspace/migrations/013-repair-conversation-disk-view.ts +5 -0
- package/src/workspace/migrations/015-migrate-credentials-to-keychain.ts +153 -0
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +156 -0
- package/src/workspace/migrations/016-migrate-credentials-from-keychain.ts +150 -0
- package/src/workspace/migrations/017-seed-persona-dirs.ts +95 -0
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +23 -1
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/runner.ts +106 -2
- package/src/workspace/migrations/types.ts +4 -0
- package/src/__tests__/archive-recall.test.ts +0 -560
- package/src/__tests__/claude-code-skill-regression.test.ts +0 -206
- package/src/__tests__/claude-code-tool-profiles.test.ts +0 -99
- package/src/__tests__/conversation-memory-dirty-tail.test.ts +0 -150
- package/src/__tests__/conversation-switch-memory-reduction.test.ts +0 -474
- package/src/__tests__/db-memory-archive-migration.test.ts +0 -372
- package/src/__tests__/db-memory-brief-state-migration.test.ts +0 -213
- package/src/__tests__/db-memory-reducer-checkpoints.test.ts +0 -273
- package/src/__tests__/diagnostics-export.test.ts +0 -288
- package/src/__tests__/local-gateway-health.test.ts +0 -209
- package/src/__tests__/memory-brief-open-loops.test.ts +0 -530
- package/src/__tests__/memory-brief-time.test.ts +0 -285
- package/src/__tests__/memory-brief-wrapper.test.ts +0 -311
- package/src/__tests__/memory-chunk-archive.test.ts +0 -400
- package/src/__tests__/memory-chunk-dual-write.test.ts +0 -453
- package/src/__tests__/memory-episode-archive.test.ts +0 -370
- package/src/__tests__/memory-episode-dual-write.test.ts +0 -626
- package/src/__tests__/memory-observation-archive.test.ts +0 -375
- package/src/__tests__/memory-observation-dual-write.test.ts +0 -318
- package/src/__tests__/memory-reducer-job.test.ts +0 -538
- package/src/__tests__/memory-reducer-scheduling.test.ts +0 -473
- package/src/__tests__/memory-reducer-store.test.ts +0 -728
- package/src/__tests__/memory-reducer-types.test.ts +0 -707
- package/src/__tests__/memory-reducer.test.ts +0 -704
- package/src/__tests__/memory-simplified-config.test.ts +0 -281
- package/src/__tests__/secret-ingress-handler.test.ts +0 -120
- package/src/__tests__/simplified-memory-e2e.test.ts +0 -666
- package/src/__tests__/simplified-memory-runtime.test.ts +0 -616
- package/src/__tests__/swarm-conversation-integration.test.ts +0 -358
- package/src/__tests__/swarm-dag-pathological.test.ts +0 -547
- package/src/__tests__/swarm-orchestrator.test.ts +0 -463
- package/src/__tests__/swarm-plan-validator.test.ts +0 -384
- package/src/__tests__/swarm-recursion.test.ts +0 -197
- package/src/__tests__/swarm-router-planner.test.ts +0 -234
- package/src/__tests__/swarm-tool.test.ts +0 -185
- package/src/__tests__/swarm-worker-backend.test.ts +0 -144
- package/src/__tests__/swarm-worker-runner.test.ts +0 -288
- package/src/commands/__tests__/cc-command-registry.test.ts +0 -396
- package/src/commands/cc-command-registry.ts +0 -248
- package/src/config/bundled-skills/claude-code/SKILL.md +0 -53
- package/src/config/bundled-skills/claude-code/TOOLS.json +0 -47
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -12
- package/src/config/bundled-skills/orchestration/SKILL.md +0 -33
- package/src/config/bundled-skills/orchestration/TOOLS.json +0 -35
- package/src/config/bundled-skills/orchestration/tools/swarm-delegate.ts +0 -12
- package/src/config/schemas/memory-simplified.ts +0 -101
- package/src/config/schemas/swarm.ts +0 -82
- package/src/logfire.ts +0 -135
- package/src/memory/archive-recall.ts +0 -516
- package/src/memory/archive-store.ts +0 -400
- package/src/memory/brief-formatting.ts +0 -33
- package/src/memory/brief-open-loops.ts +0 -266
- package/src/memory/brief-time.ts +0 -162
- package/src/memory/brief.ts +0 -75
- package/src/memory/job-handlers/backfill-simplified-memory.ts +0 -462
- package/src/memory/job-handlers/reduce-conversation-memory.ts +0 -229
- package/src/memory/migrations/185-memory-brief-state.ts +0 -52
- package/src/memory/migrations/186-memory-archive.ts +0 -109
- package/src/memory/migrations/187-memory-reducer-checkpoints.ts +0 -19
- package/src/memory/reducer-scheduler.ts +0 -242
- package/src/memory/reducer-store.ts +0 -271
- package/src/memory/reducer-types.ts +0 -106
- package/src/memory/reducer.ts +0 -467
- package/src/memory/schema/memory-archive.ts +0 -121
- package/src/memory/schema/memory-brief.ts +0 -55
- package/src/runtime/local-gateway-health.ts +0 -275
- package/src/security/secret-ingress.ts +0 -68
- package/src/swarm/backend-claude-code.ts +0 -225
- package/src/swarm/checkpoint.ts +0 -137
- package/src/swarm/graph-utils.ts +0 -53
- package/src/swarm/index.ts +0 -55
- package/src/swarm/limits.ts +0 -66
- package/src/swarm/orchestrator.ts +0 -424
- package/src/swarm/plan-validator.ts +0 -117
- package/src/swarm/router-planner.ts +0 -162
- package/src/swarm/router-prompts.ts +0 -39
- package/src/swarm/synthesizer.ts +0 -81
- package/src/swarm/types.ts +0 -72
- package/src/swarm/worker-backend.ts +0 -131
- package/src/swarm/worker-prompts.ts +0 -80
- package/src/swarm/worker-runner.ts +0 -170
- package/src/tools/claude-code/claude-code.ts +0 -610
- package/src/tools/swarm/delegate.ts +0 -205
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reducer store — transactional application of reducer results to brief-state
|
|
3
|
-
* tables (time_contexts, open_loops) and conversation reducer checkpoints.
|
|
4
|
-
*
|
|
5
|
-
* The `applyReducerResult` helper is the single entry point for persisting
|
|
6
|
-
* reducer output. It runs all upserts, resolves, and checkpoint advances
|
|
7
|
-
* inside a single SQLite transaction so the DB is never left in a
|
|
8
|
-
* partially-applied state.
|
|
9
|
-
*
|
|
10
|
-
* Archive writes are intentionally out of scope — they have their own
|
|
11
|
-
* lifecycle and can be tested independently.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { and, eq, gt } from "drizzle-orm";
|
|
15
|
-
import { v4 as uuid } from "uuid";
|
|
16
|
-
|
|
17
|
-
import { getLogger } from "../util/logger.js";
|
|
18
|
-
import { getDb } from "./db.js";
|
|
19
|
-
import type { ReducerResult } from "./reducer-types.js";
|
|
20
|
-
import { conversations, messages, openLoops, timeContexts } from "./schema.js";
|
|
21
|
-
|
|
22
|
-
const log = getLogger("reducer-store");
|
|
23
|
-
|
|
24
|
-
// ── Read helpers ─────────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Return all active (non-expired) time contexts for a memory scope.
|
|
28
|
-
* "Active" means `activeUntil` is in the future relative to `now`.
|
|
29
|
-
*/
|
|
30
|
-
export function getActiveTimeContexts(
|
|
31
|
-
scopeId: string,
|
|
32
|
-
now: number = Date.now(),
|
|
33
|
-
): Array<{
|
|
34
|
-
id: string;
|
|
35
|
-
summary: string;
|
|
36
|
-
activeFrom: number;
|
|
37
|
-
activeUntil: number;
|
|
38
|
-
}> {
|
|
39
|
-
const db = getDb();
|
|
40
|
-
return db
|
|
41
|
-
.select({
|
|
42
|
-
id: timeContexts.id,
|
|
43
|
-
summary: timeContexts.summary,
|
|
44
|
-
activeFrom: timeContexts.activeFrom,
|
|
45
|
-
activeUntil: timeContexts.activeUntil,
|
|
46
|
-
})
|
|
47
|
-
.from(timeContexts)
|
|
48
|
-
.where(
|
|
49
|
-
and(eq(timeContexts.scopeId, scopeId), gt(timeContexts.activeUntil, now)),
|
|
50
|
-
)
|
|
51
|
-
.all();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Return all open loops for a memory scope.
|
|
56
|
-
*/
|
|
57
|
-
export function getActiveOpenLoops(
|
|
58
|
-
scopeId: string,
|
|
59
|
-
): Array<{ id: string; summary: string; status: string }> {
|
|
60
|
-
const db = getDb();
|
|
61
|
-
return db
|
|
62
|
-
.select({
|
|
63
|
-
id: openLoops.id,
|
|
64
|
-
summary: openLoops.summary,
|
|
65
|
-
status: openLoops.status,
|
|
66
|
-
})
|
|
67
|
-
.from(openLoops)
|
|
68
|
-
.where(and(eq(openLoops.scopeId, scopeId), eq(openLoops.status, "open")))
|
|
69
|
-
.all();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// ── Brief-compiler helper ────────────────────────────────────────────
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Update the `surfaced_at` timestamp on a single open loop.
|
|
76
|
-
*
|
|
77
|
-
* Called by the brief compiler after resurfacing a low-salience loop
|
|
78
|
-
* so it is not immediately resurfaced again on the next turn.
|
|
79
|
-
*/
|
|
80
|
-
export function updateLastSurfacedAt(loopId: string, surfacedAt: number): void {
|
|
81
|
-
const db = getDb();
|
|
82
|
-
db.update(openLoops)
|
|
83
|
-
.set({ surfacedAt, updatedAt: surfacedAt })
|
|
84
|
-
.where(eq(openLoops.id, loopId))
|
|
85
|
-
.run();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// ── Transactional apply ──────────────────────────────────────────────
|
|
89
|
-
|
|
90
|
-
export interface ApplyReducerResultParams {
|
|
91
|
-
/** The validated reducer result to persist. */
|
|
92
|
-
result: ReducerResult;
|
|
93
|
-
/** Conversation that was reduced. */
|
|
94
|
-
conversationId: string;
|
|
95
|
-
/** Memory scope for new rows (e.g. assistant instance ID). */
|
|
96
|
-
scopeId: string;
|
|
97
|
-
/** ID of the last message that was included in this reducer run. */
|
|
98
|
-
reducedThroughMessageId: string;
|
|
99
|
-
/** Current timestamp in epoch ms (injectable for testing). */
|
|
100
|
-
now?: number;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Atomically apply a reducer result to the database.
|
|
105
|
-
*
|
|
106
|
-
* Within a single transaction this function:
|
|
107
|
-
* 1. Upserts time_contexts (create / update / resolve)
|
|
108
|
-
* 2. Upserts open_loops (create / update / resolve)
|
|
109
|
-
* 3. Advances the conversation's reducer checkpoint columns
|
|
110
|
-
* 4. Clears `memoryDirtyTailSinceMessageId` when the conversation is
|
|
111
|
-
* fully caught up (no messages exist after `reducedThroughMessageId`)
|
|
112
|
-
*
|
|
113
|
-
* Archive candidates in the result are intentionally ignored — they are
|
|
114
|
-
* handled by a separate pipeline.
|
|
115
|
-
*
|
|
116
|
-
* The function is idempotent: applying the same result twice leaves the
|
|
117
|
-
* database in the same state. Create operations use deterministic IDs
|
|
118
|
-
* derived from the reducer output position so re-application produces
|
|
119
|
-
* the same rows.
|
|
120
|
-
*/
|
|
121
|
-
export function applyReducerResult(params: ApplyReducerResultParams): void {
|
|
122
|
-
const {
|
|
123
|
-
result,
|
|
124
|
-
conversationId,
|
|
125
|
-
scopeId,
|
|
126
|
-
reducedThroughMessageId,
|
|
127
|
-
now = Date.now(),
|
|
128
|
-
} = params;
|
|
129
|
-
|
|
130
|
-
const db = getDb();
|
|
131
|
-
|
|
132
|
-
db.transaction((tx) => {
|
|
133
|
-
// ── 1. Time contexts ───────────────────────────────────────────
|
|
134
|
-
for (let i = 0; i < result.timeContexts.length; i++) {
|
|
135
|
-
const op = result.timeContexts[i];
|
|
136
|
-
|
|
137
|
-
if (op.action === "create") {
|
|
138
|
-
const id = uuid();
|
|
139
|
-
tx.insert(timeContexts)
|
|
140
|
-
.values({
|
|
141
|
-
id,
|
|
142
|
-
scopeId,
|
|
143
|
-
summary: op.summary,
|
|
144
|
-
source: op.source,
|
|
145
|
-
activeFrom: op.activeFrom,
|
|
146
|
-
activeUntil: op.activeUntil,
|
|
147
|
-
createdAt: now,
|
|
148
|
-
updatedAt: now,
|
|
149
|
-
})
|
|
150
|
-
.run();
|
|
151
|
-
} else if (op.action === "update") {
|
|
152
|
-
const setFields: Record<string, unknown> = { updatedAt: now };
|
|
153
|
-
if (op.summary !== undefined) setFields.summary = op.summary;
|
|
154
|
-
if (op.activeFrom !== undefined) setFields.activeFrom = op.activeFrom;
|
|
155
|
-
if (op.activeUntil !== undefined)
|
|
156
|
-
setFields.activeUntil = op.activeUntil;
|
|
157
|
-
|
|
158
|
-
tx.update(timeContexts)
|
|
159
|
-
.set(setFields)
|
|
160
|
-
.where(eq(timeContexts.id, op.id))
|
|
161
|
-
.run();
|
|
162
|
-
} else {
|
|
163
|
-
// resolve — delete the row (resolved time contexts are no longer relevant)
|
|
164
|
-
tx.delete(timeContexts).where(eq(timeContexts.id, op.id)).run();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ── 2. Open loops ──────────────────────────────────────────────
|
|
169
|
-
for (let i = 0; i < result.openLoops.length; i++) {
|
|
170
|
-
const op = result.openLoops[i];
|
|
171
|
-
|
|
172
|
-
if (op.action === "create") {
|
|
173
|
-
const id = uuid();
|
|
174
|
-
tx.insert(openLoops)
|
|
175
|
-
.values({
|
|
176
|
-
id,
|
|
177
|
-
scopeId,
|
|
178
|
-
summary: op.summary,
|
|
179
|
-
source: op.source,
|
|
180
|
-
status: "open",
|
|
181
|
-
dueAt: op.dueAt ?? null,
|
|
182
|
-
createdAt: now,
|
|
183
|
-
updatedAt: now,
|
|
184
|
-
})
|
|
185
|
-
.run();
|
|
186
|
-
} else if (op.action === "update") {
|
|
187
|
-
const setFields: Record<string, unknown> = { updatedAt: now };
|
|
188
|
-
if (op.summary !== undefined) setFields.summary = op.summary;
|
|
189
|
-
if (op.dueAt !== undefined) setFields.dueAt = op.dueAt;
|
|
190
|
-
|
|
191
|
-
tx.update(openLoops)
|
|
192
|
-
.set(setFields)
|
|
193
|
-
.where(eq(openLoops.id, op.id))
|
|
194
|
-
.run();
|
|
195
|
-
} else {
|
|
196
|
-
// resolve — mark status (resolved | expired)
|
|
197
|
-
tx.update(openLoops)
|
|
198
|
-
.set({ status: op.status, updatedAt: now })
|
|
199
|
-
.where(eq(openLoops.id, op.id))
|
|
200
|
-
.run();
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// ── 3. Advance reducer checkpoint ──────────────────────────────
|
|
205
|
-
//
|
|
206
|
-
// Check whether the conversation is fully caught up: no messages
|
|
207
|
-
// exist after the one we just reduced through. If caught up, clear
|
|
208
|
-
// the dirty tail marker so the reducer knows there's nothing left
|
|
209
|
-
// to process.
|
|
210
|
-
const laterMessage = tx
|
|
211
|
-
.select({ id: messages.id })
|
|
212
|
-
.from(messages)
|
|
213
|
-
.where(
|
|
214
|
-
and(
|
|
215
|
-
eq(messages.conversationId, conversationId),
|
|
216
|
-
gt(
|
|
217
|
-
messages.createdAt,
|
|
218
|
-
getMessageCreatedAt(tx, reducedThroughMessageId),
|
|
219
|
-
),
|
|
220
|
-
),
|
|
221
|
-
)
|
|
222
|
-
.limit(1)
|
|
223
|
-
.get();
|
|
224
|
-
|
|
225
|
-
const isCaughtUp = !laterMessage;
|
|
226
|
-
|
|
227
|
-
const checkpointUpdate: Record<string, unknown> = {
|
|
228
|
-
memoryReducedThroughMessageId: reducedThroughMessageId,
|
|
229
|
-
memoryLastReducedAt: now,
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
if (isCaughtUp) {
|
|
233
|
-
checkpointUpdate.memoryDirtyTailSinceMessageId = null;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
tx.update(conversations)
|
|
237
|
-
.set(checkpointUpdate)
|
|
238
|
-
.where(eq(conversations.id, conversationId))
|
|
239
|
-
.run();
|
|
240
|
-
|
|
241
|
-
log.debug(
|
|
242
|
-
{
|
|
243
|
-
conversationId,
|
|
244
|
-
reducedThroughMessageId,
|
|
245
|
-
timeContextOps: result.timeContexts.length,
|
|
246
|
-
openLoopOps: result.openLoops.length,
|
|
247
|
-
isCaughtUp,
|
|
248
|
-
},
|
|
249
|
-
"Applied reducer result",
|
|
250
|
-
);
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// ── Internal helpers ─────────────────────────────────────────────────
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Get the createdAt timestamp for a message by ID.
|
|
258
|
-
* Returns 0 if the message doesn't exist (which means the gt() comparison
|
|
259
|
-
* will match all messages — safe fallback that prevents clearing dirty tail).
|
|
260
|
-
*/
|
|
261
|
-
function getMessageCreatedAt(
|
|
262
|
-
tx: Parameters<Parameters<ReturnType<typeof getDb>["transaction"]>[0]>[0],
|
|
263
|
-
messageId: string,
|
|
264
|
-
): number {
|
|
265
|
-
const row = tx
|
|
266
|
-
.select({ createdAt: messages.createdAt })
|
|
267
|
-
.from(messages)
|
|
268
|
-
.where(eq(messages.id, messageId))
|
|
269
|
-
.get();
|
|
270
|
-
return row?.createdAt ?? 0;
|
|
271
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Structured result types for the simplified memory reducer.
|
|
3
|
-
*
|
|
4
|
-
* The reducer processes conversation turns and produces CRUD operations for
|
|
5
|
-
* two brief-state tables (time_contexts, open_loops) and optional archive
|
|
6
|
-
* candidates (observations, episodes).
|
|
7
|
-
*
|
|
8
|
-
* These types are consumed by the reducer parser/validator and eventually by
|
|
9
|
-
* the DB-write layer that applies them atomically.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// ── Time-context CRUD ──────────────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
export interface TimeContextCreate {
|
|
15
|
-
action: "create";
|
|
16
|
-
summary: string;
|
|
17
|
-
source: string;
|
|
18
|
-
activeFrom: number; // epoch ms
|
|
19
|
-
activeUntil: number; // epoch ms
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface TimeContextUpdate {
|
|
23
|
-
action: "update";
|
|
24
|
-
id: string;
|
|
25
|
-
summary?: string;
|
|
26
|
-
activeFrom?: number;
|
|
27
|
-
activeUntil?: number;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface TimeContextResolve {
|
|
31
|
-
action: "resolve";
|
|
32
|
-
id: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export type TimeContextOp =
|
|
36
|
-
| TimeContextCreate
|
|
37
|
-
| TimeContextUpdate
|
|
38
|
-
| TimeContextResolve;
|
|
39
|
-
|
|
40
|
-
// ── Open-loop CRUD ─────────────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
export interface OpenLoopCreate {
|
|
43
|
-
action: "create";
|
|
44
|
-
summary: string;
|
|
45
|
-
source: string;
|
|
46
|
-
dueAt?: number; // epoch ms, optional deadline
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface OpenLoopUpdate {
|
|
50
|
-
action: "update";
|
|
51
|
-
id: string;
|
|
52
|
-
summary?: string;
|
|
53
|
-
dueAt?: number;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface OpenLoopResolve {
|
|
57
|
-
action: "resolve";
|
|
58
|
-
id: string;
|
|
59
|
-
status: "resolved" | "expired";
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export type OpenLoopOp = OpenLoopCreate | OpenLoopUpdate | OpenLoopResolve;
|
|
63
|
-
|
|
64
|
-
// ── Archive candidates ─────────────────────────────────────────────────
|
|
65
|
-
|
|
66
|
-
export interface ArchiveObservationCandidate {
|
|
67
|
-
content: string;
|
|
68
|
-
role: string;
|
|
69
|
-
modality?: string;
|
|
70
|
-
source?: string;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export interface ArchiveEpisodeCandidate {
|
|
74
|
-
title: string;
|
|
75
|
-
summary: string;
|
|
76
|
-
source?: string;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// ── Top-level reducer result ───────────────────────────────────────────
|
|
80
|
-
|
|
81
|
-
export interface ReducerResult {
|
|
82
|
-
timeContexts: TimeContextOp[];
|
|
83
|
-
openLoops: OpenLoopOp[];
|
|
84
|
-
archiveObservations: ArchiveObservationCandidate[];
|
|
85
|
-
archiveEpisodes: ArchiveEpisodeCandidate[];
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Sentinel empty result returned when the reducer output is **unparseable**
|
|
90
|
-
* (not valid JSON, not a JSON object, provider failure, etc.).
|
|
91
|
-
*
|
|
92
|
-
* Callers use identity comparison (`=== EMPTY_REDUCER_RESULT`) to detect
|
|
93
|
-
* true parse failures and skip checkpoint advancement so the job can retry.
|
|
94
|
-
*
|
|
95
|
-
* A valid-but-empty model response (e.g. `{}`) returns a normal
|
|
96
|
-
* `ReducerResult` with all empty arrays — NOT this sentinel — so the
|
|
97
|
-
* checkpoint advances and the dirty tail is cleared.
|
|
98
|
-
*/
|
|
99
|
-
export const EMPTY_REDUCER_RESULT: Readonly<ReducerResult> = Object.freeze({
|
|
100
|
-
timeContexts: Object.freeze([]) as unknown as TimeContextOp[],
|
|
101
|
-
openLoops: Object.freeze([]) as unknown as OpenLoopOp[],
|
|
102
|
-
archiveObservations: Object.freeze(
|
|
103
|
-
[],
|
|
104
|
-
) as unknown as ArchiveObservationCandidate[],
|
|
105
|
-
archiveEpisodes: Object.freeze([]) as unknown as ArchiveEpisodeCandidate[],
|
|
106
|
-
});
|