@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
|
@@ -538,12 +538,12 @@ export class ContextWindowManager {
|
|
|
538
538
|
}
|
|
539
539
|
|
|
540
540
|
const keepTurns = lo;
|
|
541
|
-
const
|
|
541
|
+
const rawKeepFromIndex =
|
|
542
542
|
keepTurns === 0
|
|
543
543
|
? messages.length
|
|
544
544
|
: (userTurnStarts[userTurnStarts.length - keepTurns] ??
|
|
545
545
|
messages.length);
|
|
546
|
-
|
|
546
|
+
const keepFromIndex = adjustForToolPairs(messages, rawKeepFromIndex);
|
|
547
547
|
return { keepFromIndex, keepTurns };
|
|
548
548
|
}
|
|
549
549
|
|
|
@@ -703,6 +703,57 @@ function isToolResultOnly(message: Message): boolean {
|
|
|
703
703
|
);
|
|
704
704
|
}
|
|
705
705
|
|
|
706
|
+
/**
|
|
707
|
+
* Walk the keep boundary backward to ensure tool_use/tool_result pairs are
|
|
708
|
+
* never split across the compaction boundary. If the first kept message is
|
|
709
|
+
* a user message containing tool_result blocks whose matching tool_use blocks
|
|
710
|
+
* live in the preceding (compacted-away) assistant message, include that
|
|
711
|
+
* assistant message in the kept set.
|
|
712
|
+
*/
|
|
713
|
+
function adjustForToolPairs(
|
|
714
|
+
messages: Message[],
|
|
715
|
+
keepFromIndex: number,
|
|
716
|
+
): number {
|
|
717
|
+
let idx = keepFromIndex;
|
|
718
|
+
while (idx > 0) {
|
|
719
|
+
const msg = messages[idx];
|
|
720
|
+
if (!msg || msg.role !== "user") break;
|
|
721
|
+
|
|
722
|
+
// Collect tool_use_ids referenced by tool_results in this user message
|
|
723
|
+
const referencedIds = new Set<string>();
|
|
724
|
+
for (const block of msg.content) {
|
|
725
|
+
if ((block.type === "tool_result" || block.type === "web_search_tool_result") && "tool_use_id" in block) {
|
|
726
|
+
referencedIds.add((block as { tool_use_id: string }).tool_use_id);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (referencedIds.size === 0) break;
|
|
730
|
+
|
|
731
|
+
// Check if the preceding assistant message contains matching tool_uses
|
|
732
|
+
const prev = messages[idx - 1];
|
|
733
|
+
if (!prev || prev.role !== "assistant") break;
|
|
734
|
+
|
|
735
|
+
const hasOrphanedPair = prev.content.some(
|
|
736
|
+
(block) =>
|
|
737
|
+
(block.type === "tool_use" || block.type === "server_tool_use") &&
|
|
738
|
+
"id" in block &&
|
|
739
|
+
referencedIds.has((block as { id: string }).id),
|
|
740
|
+
);
|
|
741
|
+
if (!hasOrphanedPair) break;
|
|
742
|
+
|
|
743
|
+
// Include the assistant message
|
|
744
|
+
idx--;
|
|
745
|
+
|
|
746
|
+
// The assistant message may itself be preceded by a tool_result user
|
|
747
|
+
// message that pairs with an even earlier assistant — continue the check
|
|
748
|
+
if (idx > 0 && messages[idx - 1]?.role === "user") {
|
|
749
|
+
idx--;
|
|
750
|
+
} else {
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
return idx;
|
|
755
|
+
}
|
|
756
|
+
|
|
706
757
|
export function getSummaryFromContextMessage(
|
|
707
758
|
message: Message | undefined,
|
|
708
759
|
): string | null {
|
|
@@ -79,6 +79,11 @@ export interface LocalDiscoverySuccess {
|
|
|
79
79
|
executablePath: string;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
export interface LocalSourceDiscoverySuccess {
|
|
83
|
+
mode: "local-source";
|
|
84
|
+
sourcePath: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
82
87
|
export interface ManagedDiscoverySuccess {
|
|
83
88
|
mode: "managed";
|
|
84
89
|
socketPath: string;
|
|
@@ -91,6 +96,7 @@ export interface DiscoveryFailure {
|
|
|
91
96
|
|
|
92
97
|
export type DiscoveryResult =
|
|
93
98
|
| LocalDiscoverySuccess
|
|
99
|
+
| LocalSourceDiscoverySuccess
|
|
94
100
|
| ManagedDiscoverySuccess
|
|
95
101
|
| DiscoveryFailure;
|
|
96
102
|
|
|
@@ -101,11 +107,16 @@ export type DiscoveryResult =
|
|
|
101
107
|
/**
|
|
102
108
|
* Discover the local CES executable.
|
|
103
109
|
*
|
|
104
|
-
* Searches well-known paths for the `credential-executor` binary.
|
|
105
|
-
*
|
|
110
|
+
* Searches well-known paths for the `credential-executor` binary. If the
|
|
111
|
+
* compiled binary is not found, falls back to the TypeScript source entry
|
|
112
|
+
* point in the monorepo. Returns a structured result — never throws. If
|
|
113
|
+
* neither the binary nor the source entry point is found, returns
|
|
106
114
|
* `{ mode: "unavailable" }` so the caller can fail closed.
|
|
107
115
|
*/
|
|
108
|
-
export function discoverLocalCes():
|
|
116
|
+
export function discoverLocalCes():
|
|
117
|
+
| LocalDiscoverySuccess
|
|
118
|
+
| LocalSourceDiscoverySuccess
|
|
119
|
+
| DiscoveryFailure {
|
|
109
120
|
const searchPaths = getLocalBinarySearchPaths();
|
|
110
121
|
|
|
111
122
|
for (const candidate of searchPaths) {
|
|
@@ -115,7 +126,20 @@ export function discoverLocalCes(): LocalDiscoverySuccess | DiscoveryFailure {
|
|
|
115
126
|
}
|
|
116
127
|
}
|
|
117
128
|
|
|
118
|
-
|
|
129
|
+
// Fallback: check for source entry point in the monorepo
|
|
130
|
+
const monorepoRoot = join(import.meta.dir, "..", "..", "..", "..");
|
|
131
|
+
const sourceEntry = join(
|
|
132
|
+
monorepoRoot,
|
|
133
|
+
"credential-executor",
|
|
134
|
+
"src",
|
|
135
|
+
"main.ts",
|
|
136
|
+
);
|
|
137
|
+
if (existsSync(sourceEntry)) {
|
|
138
|
+
log.info({ path: sourceEntry }, "Found local CES source entry point");
|
|
139
|
+
return { mode: "local-source", sourcePath: sourceEntry };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const reason = `CES executable not found. Searched: ${searchPaths.join(", ")}; also checked source at ${sourceEntry}`;
|
|
119
143
|
log.warn(reason);
|
|
120
144
|
return { mode: "unavailable", reason };
|
|
121
145
|
}
|
|
@@ -35,6 +35,10 @@ export const CES_GRANT_AUDIT_FLAG_KEY =
|
|
|
35
35
|
export const CES_MANAGED_SIDECAR_FLAG_KEY =
|
|
36
36
|
"feature_flags.ces-managed-sidecar.enabled" as const;
|
|
37
37
|
|
|
38
|
+
/** Gate for routing credential reads/writes through the CES process. */
|
|
39
|
+
export const CES_CREDENTIAL_BACKEND_FLAG_KEY =
|
|
40
|
+
"feature_flags.ces-credential-backend.enabled" as const;
|
|
41
|
+
|
|
38
42
|
// ---------------------------------------------------------------------------
|
|
39
43
|
// Public API — predicate functions
|
|
40
44
|
// ---------------------------------------------------------------------------
|
|
@@ -73,3 +77,15 @@ export function isCesGrantAuditEnabled(config: AssistantConfig): boolean {
|
|
|
73
77
|
export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
|
|
74
78
|
return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
|
|
75
79
|
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Whether credential reads and writes should be routed through the CES process.
|
|
83
|
+
*/
|
|
84
|
+
export function isCesCredentialBackendEnabled(
|
|
85
|
+
config: AssistantConfig,
|
|
86
|
+
): boolean {
|
|
87
|
+
return isAssistantFeatureFlagEnabled(
|
|
88
|
+
CES_CREDENTIAL_BACKEND_FLAG_KEY,
|
|
89
|
+
config,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
discoverLocalCes,
|
|
39
39
|
type DiscoveryResult,
|
|
40
40
|
type LocalDiscoverySuccess,
|
|
41
|
+
type LocalSourceDiscoverySuccess,
|
|
41
42
|
type ManagedDiscoverySuccess,
|
|
42
43
|
} from "./executable-discovery.js";
|
|
43
44
|
import { isCesManagedSidecarEnabled } from "./feature-gates.js";
|
|
@@ -156,6 +157,12 @@ export function createCesProcessManager(
|
|
|
156
157
|
return transport;
|
|
157
158
|
}
|
|
158
159
|
|
|
160
|
+
if (discoveryResult.mode === "local-source") {
|
|
161
|
+
const transport = await startLocalSourceProcess(discoveryResult);
|
|
162
|
+
running = true;
|
|
163
|
+
return transport;
|
|
164
|
+
}
|
|
165
|
+
|
|
159
166
|
// managed mode
|
|
160
167
|
const transport = await connectManagedSocket(discoveryResult);
|
|
161
168
|
running = true;
|
|
@@ -235,6 +242,37 @@ export function createCesProcessManager(
|
|
|
235
242
|
return createStdioTransport(proc);
|
|
236
243
|
}
|
|
237
244
|
|
|
245
|
+
// -------------------------------------------------------------------------
|
|
246
|
+
// Local source mode — child process over stdio (bun run)
|
|
247
|
+
// -------------------------------------------------------------------------
|
|
248
|
+
|
|
249
|
+
async function startLocalSourceProcess(
|
|
250
|
+
discovery: LocalSourceDiscoverySuccess,
|
|
251
|
+
): Promise<CesTransport> {
|
|
252
|
+
log.info(
|
|
253
|
+
{ sourcePath: discovery.sourcePath },
|
|
254
|
+
"Spawning CES child process from source",
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const proc = Bun.spawn({
|
|
258
|
+
cmd: ["bun", "run", discovery.sourcePath],
|
|
259
|
+
stdin: "pipe",
|
|
260
|
+
stdout: "pipe",
|
|
261
|
+
stderr: "ignore",
|
|
262
|
+
env: {
|
|
263
|
+
...process.env,
|
|
264
|
+
// Signal to CES that it was launched by the assistant
|
|
265
|
+
CES_LAUNCHED_BY: "assistant",
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
childProcess = proc;
|
|
270
|
+
|
|
271
|
+
log.info({ pid: proc.pid }, "CES child process started (from source)");
|
|
272
|
+
|
|
273
|
+
return createStdioTransport(proc);
|
|
274
|
+
}
|
|
275
|
+
|
|
238
276
|
// -------------------------------------------------------------------------
|
|
239
277
|
// Managed mode — Unix socket connection
|
|
240
278
|
// -------------------------------------------------------------------------
|
|
@@ -76,6 +76,15 @@ const EXTENSION_MIME_MAP: Record<string, string> = {
|
|
|
76
76
|
js: "text/javascript",
|
|
77
77
|
ts: "text/typescript",
|
|
78
78
|
|
|
79
|
+
// Audio
|
|
80
|
+
mp3: "audio/mpeg",
|
|
81
|
+
wav: "audio/wav",
|
|
82
|
+
ogg: "audio/ogg",
|
|
83
|
+
flac: "audio/flac",
|
|
84
|
+
aac: "audio/aac",
|
|
85
|
+
m4a: "audio/x-m4a",
|
|
86
|
+
opus: "audio/opus",
|
|
87
|
+
|
|
79
88
|
// Video
|
|
80
89
|
mp4: "video/mp4",
|
|
81
90
|
webm: "video/webm",
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "node:fs";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { clearFeatureFlagOverridesCache } from "../config/assistant-feature-flags.js";
|
|
16
16
|
import { getConfig, invalidateConfigCache } from "../config/loader.js";
|
|
17
17
|
import { clearEmbeddingBackendCache } from "../memory/embedding-backend.js";
|
|
18
18
|
import { clearCache as clearTrustCache } from "../permissions/trust-store.js";
|
|
@@ -154,6 +154,10 @@ export class ConfigWatcher {
|
|
|
154
154
|
"trust.json": () => {
|
|
155
155
|
clearTrustCache();
|
|
156
156
|
},
|
|
157
|
+
"feature-flags.json": () => {
|
|
158
|
+
clearFeatureFlagOverridesCache();
|
|
159
|
+
onConversationEvict();
|
|
160
|
+
},
|
|
157
161
|
"secret-allowlist.json": () => {
|
|
158
162
|
resetAllowlist();
|
|
159
163
|
try {
|
|
@@ -210,9 +214,7 @@ export class ConfigWatcher {
|
|
|
210
214
|
);
|
|
211
215
|
}
|
|
212
216
|
|
|
213
|
-
|
|
214
|
-
this.startSignalsWatcher();
|
|
215
|
-
}
|
|
217
|
+
this.startSignalsWatcher();
|
|
216
218
|
this.startSkillsWatchers(onConversationEvict);
|
|
217
219
|
}
|
|
218
220
|
|
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
} from "../instrument.js";
|
|
34
34
|
import { commitAppTurnChanges } from "../memory/app-git-service.js";
|
|
35
35
|
import { getApp, listAppFiles, resolveAppDir } from "../memory/app-store.js";
|
|
36
|
-
import { insertCompactionEpisode } from "../memory/archive-store.js";
|
|
37
36
|
import {
|
|
38
37
|
addMessage,
|
|
39
38
|
deleteMessageById,
|
|
@@ -514,12 +513,6 @@ export async function runAgentLoopImpl(
|
|
|
514
513
|
compacted.summaryText,
|
|
515
514
|
ctx.contextCompactedMessageCount,
|
|
516
515
|
);
|
|
517
|
-
dualWriteCompactionEpisode(
|
|
518
|
-
ctx.conversationId,
|
|
519
|
-
ctx.memoryPolicy.scopeId,
|
|
520
|
-
compacted.summaryText,
|
|
521
|
-
compacted.summaryOutputTokens,
|
|
522
|
-
);
|
|
523
516
|
onEvent({
|
|
524
517
|
type: "context_compacted",
|
|
525
518
|
previousEstimatedInputTokens: compacted.previousEstimatedInputTokens,
|
|
@@ -787,12 +780,6 @@ export async function runAgentLoopImpl(
|
|
|
787
780
|
step.compactionResult.summaryText,
|
|
788
781
|
ctx.contextCompactedMessageCount,
|
|
789
782
|
);
|
|
790
|
-
dualWriteCompactionEpisode(
|
|
791
|
-
ctx.conversationId,
|
|
792
|
-
ctx.memoryPolicy.scopeId,
|
|
793
|
-
step.compactionResult.summaryText,
|
|
794
|
-
step.compactionResult.summaryOutputTokens,
|
|
795
|
-
);
|
|
796
783
|
onEvent({
|
|
797
784
|
type: "context_compacted",
|
|
798
785
|
previousEstimatedInputTokens:
|
|
@@ -977,12 +964,6 @@ export async function runAgentLoopImpl(
|
|
|
977
964
|
midLoopCompact.summaryText,
|
|
978
965
|
ctx.contextCompactedMessageCount,
|
|
979
966
|
);
|
|
980
|
-
dualWriteCompactionEpisode(
|
|
981
|
-
ctx.conversationId,
|
|
982
|
-
ctx.memoryPolicy.scopeId,
|
|
983
|
-
midLoopCompact.summaryText,
|
|
984
|
-
midLoopCompact.summaryOutputTokens,
|
|
985
|
-
);
|
|
986
967
|
onEvent({
|
|
987
968
|
type: "context_compacted",
|
|
988
969
|
previousEstimatedInputTokens:
|
|
@@ -1179,12 +1160,6 @@ export async function runAgentLoopImpl(
|
|
|
1179
1160
|
step.compactionResult.summaryText,
|
|
1180
1161
|
ctx.contextCompactedMessageCount,
|
|
1181
1162
|
);
|
|
1182
|
-
dualWriteCompactionEpisode(
|
|
1183
|
-
ctx.conversationId,
|
|
1184
|
-
ctx.memoryPolicy.scopeId,
|
|
1185
|
-
step.compactionResult.summaryText,
|
|
1186
|
-
step.compactionResult.summaryOutputTokens,
|
|
1187
|
-
);
|
|
1188
1163
|
onEvent({
|
|
1189
1164
|
type: "context_compacted",
|
|
1190
1165
|
previousEstimatedInputTokens:
|
|
@@ -1292,12 +1267,6 @@ export async function runAgentLoopImpl(
|
|
|
1292
1267
|
emergencyCompact.summaryText,
|
|
1293
1268
|
ctx.contextCompactedMessageCount,
|
|
1294
1269
|
);
|
|
1295
|
-
dualWriteCompactionEpisode(
|
|
1296
|
-
ctx.conversationId,
|
|
1297
|
-
ctx.memoryPolicy.scopeId,
|
|
1298
|
-
emergencyCompact.summaryText,
|
|
1299
|
-
emergencyCompact.summaryOutputTokens,
|
|
1300
|
-
);
|
|
1301
1270
|
onEvent({
|
|
1302
1271
|
type: "context_compacted",
|
|
1303
1272
|
previousEstimatedInputTokens:
|
|
@@ -1402,12 +1371,6 @@ export async function runAgentLoopImpl(
|
|
|
1402
1371
|
emergencyCompact.summaryText,
|
|
1403
1372
|
ctx.contextCompactedMessageCount,
|
|
1404
1373
|
);
|
|
1405
|
-
dualWriteCompactionEpisode(
|
|
1406
|
-
ctx.conversationId,
|
|
1407
|
-
ctx.memoryPolicy.scopeId,
|
|
1408
|
-
emergencyCompact.summaryText,
|
|
1409
|
-
emergencyCompact.summaryOutputTokens,
|
|
1410
|
-
);
|
|
1411
1374
|
onEvent({
|
|
1412
1375
|
type: "context_compacted",
|
|
1413
1376
|
previousEstimatedInputTokens:
|
|
@@ -1873,26 +1836,3 @@ function collapseRawResponses(rawResponses?: unknown[]): unknown | undefined {
|
|
|
1873
1836
|
if (!rawResponses || rawResponses.length === 0) return undefined;
|
|
1874
1837
|
return rawResponses.length === 1 ? rawResponses[0] : rawResponses;
|
|
1875
1838
|
}
|
|
1876
|
-
|
|
1877
|
-
/**
|
|
1878
|
-
* Dual-write a compaction summary as an archive episode so it becomes
|
|
1879
|
-
* searchable via vector recall. Called after each successful compaction
|
|
1880
|
-
* that produces a new summary.
|
|
1881
|
-
*/
|
|
1882
|
-
function dualWriteCompactionEpisode(
|
|
1883
|
-
conversationId: string,
|
|
1884
|
-
scopeId: string,
|
|
1885
|
-
summaryText: string,
|
|
1886
|
-
summaryOutputTokens: number,
|
|
1887
|
-
): void {
|
|
1888
|
-
const now = Date.now();
|
|
1889
|
-
insertCompactionEpisode({
|
|
1890
|
-
conversationId,
|
|
1891
|
-
scopeId,
|
|
1892
|
-
title: truncate(summaryText, 120, ""),
|
|
1893
|
-
summary: summaryText,
|
|
1894
|
-
tokenEstimate: summaryOutputTokens,
|
|
1895
|
-
startAt: now,
|
|
1896
|
-
endAt: now,
|
|
1897
|
-
});
|
|
1898
|
-
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { getConfig } from "../config/loader.js";
|
|
2
2
|
import { estimatePromptTokens } from "../context/token-estimator.js";
|
|
3
|
-
import { buildArchiveRecall } from "../memory/archive-recall.js";
|
|
4
|
-
import { compileMemoryBrief } from "../memory/brief.js";
|
|
5
|
-
import { getDb } from "../memory/db.js";
|
|
6
3
|
import { buildMemoryQuery } from "../memory/query-builder.js";
|
|
7
4
|
import { computeRecallBudget } from "../memory/retrieval-budget.js";
|
|
8
5
|
import {
|
|
@@ -12,11 +9,8 @@ import {
|
|
|
12
9
|
import type { ScopePolicyOverride } from "../memory/search/types.js";
|
|
13
10
|
import type { Message } from "../providers/types.js";
|
|
14
11
|
import type { Provider } from "../providers/types.js";
|
|
15
|
-
import { getLogger } from "../util/logger.js";
|
|
16
12
|
import type { ServerMessage } from "./message-protocol.js";
|
|
17
13
|
|
|
18
|
-
const log = getLogger("conversation-memory");
|
|
19
|
-
|
|
20
14
|
export interface MemoryRecallResult {
|
|
21
15
|
runMessages: Message[];
|
|
22
16
|
recall: Awaited<ReturnType<typeof buildMemoryRecall>>;
|
|
@@ -121,14 +115,6 @@ export async function prepareMemoryContext(
|
|
|
121
115
|
|
|
122
116
|
const runtimeConfig = getConfig();
|
|
123
117
|
|
|
124
|
-
// ── Simplified memory path ──────────────────────────────────────────
|
|
125
|
-
// When `memory.simplified.enabled` is true, inject the brief and
|
|
126
|
-
// optional archive recall instead of the legacy hybrid pipeline.
|
|
127
|
-
if (runtimeConfig.memory?.simplified?.enabled) {
|
|
128
|
-
return prepareSimplifiedMemoryContext(ctx, content, userMessageId, onEvent);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ── Legacy memory path (fallback) ──────────────────────────────────
|
|
132
118
|
// Memory recall via the V2 hybrid pipeline
|
|
133
119
|
const recallQuery = buildMemoryQuery(content, ctx.messages);
|
|
134
120
|
const dynamicBudgetConfig = runtimeConfig.memory?.retrieval?.dynamicBudget;
|
|
@@ -221,106 +207,3 @@ export async function prepareMemoryContext(
|
|
|
221
207
|
recall,
|
|
222
208
|
};
|
|
223
209
|
}
|
|
224
|
-
|
|
225
|
-
// ── Simplified memory injection ─────────────────────────────────────────
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Build simplified memory context for a turn: compiles the `<memory_brief>`
|
|
229
|
-
* block and conditionally appends `<supporting_recall>` from the archive.
|
|
230
|
-
*
|
|
231
|
-
* Non-empty blocks are injected as text content blocks prepended to the
|
|
232
|
-
* last user message, following the same injection pattern as the legacy
|
|
233
|
-
* pipeline. Stripping is handled by `RUNTIME_INJECTION_PREFIXES` which
|
|
234
|
-
* already includes `<memory_brief>`.
|
|
235
|
-
*/
|
|
236
|
-
function prepareSimplifiedMemoryContext(
|
|
237
|
-
ctx: MemoryPrepareContext,
|
|
238
|
-
content: string,
|
|
239
|
-
userMessageId: string,
|
|
240
|
-
onEvent: (msg: ServerMessage) => void,
|
|
241
|
-
): MemoryRecallResult {
|
|
242
|
-
const start = Date.now();
|
|
243
|
-
|
|
244
|
-
// Build a no-op recall result matching the legacy shape.
|
|
245
|
-
const noopRecall = (): Awaited<ReturnType<typeof buildMemoryRecall>> =>
|
|
246
|
-
({
|
|
247
|
-
enabled: true,
|
|
248
|
-
degraded: false,
|
|
249
|
-
injectedText: "",
|
|
250
|
-
semanticHits: 0,
|
|
251
|
-
recencyHits: 0,
|
|
252
|
-
mergedCount: 0,
|
|
253
|
-
selectedCount: 0,
|
|
254
|
-
injectedTokens: 0,
|
|
255
|
-
latencyMs: 0,
|
|
256
|
-
topCandidates: [],
|
|
257
|
-
tier1Count: 0,
|
|
258
|
-
tier2Count: 0,
|
|
259
|
-
}) as Awaited<ReturnType<typeof buildMemoryRecall>>;
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
const db = getDb();
|
|
263
|
-
|
|
264
|
-
// Step 1: Build the memory brief
|
|
265
|
-
const briefResult = compileMemoryBrief(db, ctx.scopeId, userMessageId);
|
|
266
|
-
|
|
267
|
-
// Step 2: Conditionally build supporting recall from the archive
|
|
268
|
-
const archiveResult = buildArchiveRecall(ctx.scopeId, content);
|
|
269
|
-
|
|
270
|
-
// Step 3: Assemble the injection blocks (non-empty only)
|
|
271
|
-
const blocks: string[] = [];
|
|
272
|
-
if (briefResult.text.length > 0) {
|
|
273
|
-
blocks.push(briefResult.text);
|
|
274
|
-
}
|
|
275
|
-
if (archiveResult.text.length > 0) {
|
|
276
|
-
blocks.push(archiveResult.text);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
const latencyMs = Date.now() - start;
|
|
280
|
-
|
|
281
|
-
// Emit memory status for the simplified path
|
|
282
|
-
onEvent({
|
|
283
|
-
type: "memory_status",
|
|
284
|
-
enabled: true,
|
|
285
|
-
degraded: false,
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
// Inject non-empty blocks into the last user message
|
|
289
|
-
let runMessages = ctx.messages;
|
|
290
|
-
if (blocks.length > 0) {
|
|
291
|
-
const injectedText = blocks.join("\n\n");
|
|
292
|
-
const userTail = ctx.messages[ctx.messages.length - 1];
|
|
293
|
-
if (userTail && userTail.role === "user") {
|
|
294
|
-
runMessages = injectMemoryRecallAsUserBlock(ctx.messages, injectedText);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
log.debug(
|
|
298
|
-
{
|
|
299
|
-
briefLength: briefResult.text.length,
|
|
300
|
-
recallTrigger: archiveResult.trigger,
|
|
301
|
-
recallBullets: archiveResult.bullets.length,
|
|
302
|
-
latencyMs,
|
|
303
|
-
},
|
|
304
|
-
"Simplified memory injection completed",
|
|
305
|
-
);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
return {
|
|
309
|
-
runMessages,
|
|
310
|
-
recall: {
|
|
311
|
-
...noopRecall(),
|
|
312
|
-
injectedText: blocks.length > 0 ? blocks.join("\n\n") : "",
|
|
313
|
-
latencyMs,
|
|
314
|
-
},
|
|
315
|
-
};
|
|
316
|
-
} catch (err) {
|
|
317
|
-
log.warn({ err }, "Simplified memory injection failed, returning no-op");
|
|
318
|
-
return {
|
|
319
|
-
runMessages: ctx.messages,
|
|
320
|
-
recall: {
|
|
321
|
-
...noopRecall(),
|
|
322
|
-
latencyMs: Date.now() - start,
|
|
323
|
-
},
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
}
|
|
@@ -961,8 +961,6 @@ const RUNTIME_INJECTION_PREFIXES = [
|
|
|
961
961
|
"<inbound_actor_context>",
|
|
962
962
|
"<interface_turn_context>",
|
|
963
963
|
"<turn_context>",
|
|
964
|
-
"<memory_brief>",
|
|
965
|
-
"<supporting_recall>",
|
|
966
964
|
"<memory_context __injected>",
|
|
967
965
|
"<memory_context>", // backward-compat: strip legacy blocks from pre-__injected history
|
|
968
966
|
"<voice_call_control>",
|
|
@@ -23,7 +23,6 @@ import {
|
|
|
23
23
|
import { isAllowDecision } from "../permissions/types.js";
|
|
24
24
|
import type { Message, ToolDefinition } from "../providers/types.js";
|
|
25
25
|
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
26
|
-
import { getEffectiveMode } from "../runtime/conversation-approval-overrides.js";
|
|
27
26
|
import { coreAppProxyTools } from "../tools/apps/definitions.js";
|
|
28
27
|
import { registerConversationSender } from "../tools/browser/browser-screencast.js";
|
|
29
28
|
import type { ToolExecutor } from "../tools/executor.js";
|
|
@@ -234,110 +233,6 @@ export function createToolExecutor(
|
|
|
234
233
|
params.allowedDomains,
|
|
235
234
|
);
|
|
236
235
|
},
|
|
237
|
-
requestConfirmation: async (req) => {
|
|
238
|
-
// Check trust store before prompting
|
|
239
|
-
const existingRule = findHighestPriorityRule(
|
|
240
|
-
"cc:" + req.toolName,
|
|
241
|
-
[req.toolName, `cc:${req.toolName}`, "cc:*"],
|
|
242
|
-
ctx.workingDir,
|
|
243
|
-
);
|
|
244
|
-
if (existingRule && existingRule.decision !== "ask") {
|
|
245
|
-
return {
|
|
246
|
-
decision:
|
|
247
|
-
existingRule.decision === "allow"
|
|
248
|
-
? ("allow" as const)
|
|
249
|
-
: ("deny" as const),
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
// Auto-approve sub-tool confirmations when a temporary approval
|
|
253
|
-
// override is active for this conversation (guardian only).
|
|
254
|
-
const guardianTrust = ctx.trustContext?.trustClass ?? "unknown";
|
|
255
|
-
if (
|
|
256
|
-
guardianTrust === "guardian" &&
|
|
257
|
-
getEffectiveMode(ctx.conversationId) !== undefined
|
|
258
|
-
) {
|
|
259
|
-
return { decision: "allow" as const };
|
|
260
|
-
}
|
|
261
|
-
const allowlistOptions = [
|
|
262
|
-
{
|
|
263
|
-
label: `cc:${req.toolName}`,
|
|
264
|
-
description: `Claude Code ${req.toolName}`,
|
|
265
|
-
pattern: `cc:${req.toolName}`,
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
label: "cc:*",
|
|
269
|
-
description: "All Claude Code sub-tools",
|
|
270
|
-
pattern: "cc:*",
|
|
271
|
-
},
|
|
272
|
-
];
|
|
273
|
-
const scopeOptions = generateScopeOptions(ctx.workingDir);
|
|
274
|
-
const response = await prompter.prompt(
|
|
275
|
-
`cc:${req.toolName}`,
|
|
276
|
-
req.input,
|
|
277
|
-
req.riskLevel,
|
|
278
|
-
allowlistOptions,
|
|
279
|
-
scopeOptions,
|
|
280
|
-
undefined,
|
|
281
|
-
undefined,
|
|
282
|
-
ctx.conversationId,
|
|
283
|
-
req.executionTarget,
|
|
284
|
-
undefined,
|
|
285
|
-
undefined,
|
|
286
|
-
undefined,
|
|
287
|
-
toolUseId,
|
|
288
|
-
);
|
|
289
|
-
if (
|
|
290
|
-
(response.decision === "always_allow" ||
|
|
291
|
-
response.decision === "always_allow_high_risk") &&
|
|
292
|
-
response.selectedPattern &&
|
|
293
|
-
response.selectedScope
|
|
294
|
-
) {
|
|
295
|
-
log.info(
|
|
296
|
-
{
|
|
297
|
-
toolName: "cc:" + req.toolName,
|
|
298
|
-
pattern: response.selectedPattern,
|
|
299
|
-
scope: response.selectedScope,
|
|
300
|
-
highRisk: response.decision === "always_allow_high_risk",
|
|
301
|
-
},
|
|
302
|
-
"Persisting always-allow trust rule",
|
|
303
|
-
);
|
|
304
|
-
addRule(
|
|
305
|
-
"cc:" + req.toolName,
|
|
306
|
-
response.selectedPattern,
|
|
307
|
-
response.selectedScope,
|
|
308
|
-
"allow",
|
|
309
|
-
100,
|
|
310
|
-
response.decision === "always_allow_high_risk"
|
|
311
|
-
? { allowHighRisk: true }
|
|
312
|
-
: undefined,
|
|
313
|
-
);
|
|
314
|
-
}
|
|
315
|
-
if (
|
|
316
|
-
response.decision === "always_deny" &&
|
|
317
|
-
response.selectedPattern &&
|
|
318
|
-
response.selectedScope
|
|
319
|
-
) {
|
|
320
|
-
log.info(
|
|
321
|
-
{
|
|
322
|
-
toolName: "cc:" + req.toolName,
|
|
323
|
-
pattern: response.selectedPattern,
|
|
324
|
-
scope: response.selectedScope,
|
|
325
|
-
},
|
|
326
|
-
"Persisting always-deny trust rule",
|
|
327
|
-
);
|
|
328
|
-
addRule(
|
|
329
|
-
"cc:" + req.toolName,
|
|
330
|
-
response.selectedPattern,
|
|
331
|
-
response.selectedScope,
|
|
332
|
-
"deny",
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
return {
|
|
336
|
-
decision: isAllowDecision(response.decision)
|
|
337
|
-
? ("allow" as const)
|
|
338
|
-
: ("deny" as const),
|
|
339
|
-
};
|
|
340
|
-
},
|
|
341
236
|
};
|
|
342
237
|
|
|
343
238
|
// Intercept skill_execute: extract the real tool name and input, then
|
|
@@ -42,6 +42,7 @@ import { PermissionPrompter } from "../permissions/prompter.js";
|
|
|
42
42
|
import { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
43
43
|
import { patternMatchesCandidate } from "../permissions/trust-store.js";
|
|
44
44
|
import type { UserDecision } from "../permissions/types.js";
|
|
45
|
+
import { resolvePersonaContext } from "../prompts/persona-resolver.js";
|
|
45
46
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
46
47
|
import type { Message } from "../providers/types.js";
|
|
47
48
|
import type { Provider } from "../providers/types.js";
|
|
@@ -353,10 +354,18 @@ export class Conversation {
|
|
|
353
354
|
const resolveSystemPromptCallback = (
|
|
354
355
|
_history: import("../providers/types.js").Message[],
|
|
355
356
|
): ResolvedSystemPrompt => {
|
|
357
|
+
const persona = resolvePersonaContext(
|
|
358
|
+
this.trustContext,
|
|
359
|
+
this.channelCapabilities,
|
|
360
|
+
);
|
|
356
361
|
const resolved = {
|
|
357
362
|
systemPrompt: hasSystemPromptOverride
|
|
358
363
|
? systemPrompt
|
|
359
|
-
: buildSystemPrompt({
|
|
364
|
+
: buildSystemPrompt({
|
|
365
|
+
hasNoClient: this.hasNoClient,
|
|
366
|
+
userPersona: persona.userPersona,
|
|
367
|
+
channelPersona: persona.channelPersona,
|
|
368
|
+
}),
|
|
360
369
|
maxTokens: configuredMaxTokens,
|
|
361
370
|
};
|
|
362
371
|
return resolved;
|