@vellumai/assistant 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +6 -7
- package/Dockerfile +1 -0
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
- package/bun.lock +3 -0
- package/docs/architecture/security.md +18 -16
- package/knip.json +1 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/openapi.yaml +294 -107
- package/package.json +4 -2
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +6 -17
- package/src/__tests__/assistant-event-hub.test.ts +126 -77
- package/src/__tests__/assistant-event.test.ts +0 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
- package/src/__tests__/background-shell-host-bash.test.ts +34 -43
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/checker.test.ts +20 -34
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-watcher.test.ts +12 -0
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-lifecycle.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
- package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -4
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/cu-unified-flow.test.ts +33 -16
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +4 -1
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +289 -7
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-bash-proxy.test.ts +46 -122
- package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
- package/src/__tests__/host-browser-proxy.test.ts +111 -185
- package/src/__tests__/host-browser-routes.test.ts +45 -75
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
- package/src/__tests__/host-cu-proxy.test.ts +56 -111
- package/src/__tests__/host-file-proxy.test.ts +44 -98
- package/src/__tests__/host-file-read-tool.test.ts +42 -21
- package/src/__tests__/host-shell-tool.test.ts +33 -68
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy.test.ts +43 -53
- package/src/__tests__/http-user-message-parity.test.ts +0 -6
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -66
- package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +66 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
- package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +331 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -22
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +3 -12
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +0 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +9 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt.test.ts +115 -13
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor.test.ts +12 -19
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/backup-worker.test.ts +36 -8
- package/src/backup/__tests__/paths.test.ts +2 -2
- package/src/backup/__tests__/restore.test.ts +45 -28
- package/src/backup/backup-worker.ts +36 -2
- package/src/backup/paths.ts +9 -6
- package/src/browser-session/events.ts +0 -9
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +0 -24
- package/src/calls/twilio-rest.ts +0 -38
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +1 -36
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/backup.ts +4 -4
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +63 -5
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +231 -76
- package/src/cli/commands/keys.ts +4 -1
- package/src/cli/commands/memory-v2.ts +24 -52
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +14 -0
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
- package/src/config/env-registry.ts +12 -2
- package/src/config/env.ts +3 -14
- package/src/config/feature-flag-registry.json +30 -30
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +3 -3
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -5
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +31 -3
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +9 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +6 -6
- package/src/config/schemas/skills.ts +5 -5
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -17
- package/src/contacts/contacts-write.ts +1 -105
- package/src/context/window-manager.ts +44 -5
- package/src/credential-execution/process-manager.ts +34 -10
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
- package/src/daemon/conversation-agent-loop.ts +277 -36
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +83 -163
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +22 -28
- package/src/daemon/conversation-tool-setup.ts +3 -33
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +117 -233
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +23 -71
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-bash-proxy.ts +67 -45
- package/src/daemon/host-browser-proxy.ts +65 -27
- package/src/daemon/host-cu-proxy.ts +40 -39
- package/src/daemon/host-file-proxy.ts +58 -37
- package/src/daemon/host-transfer-proxy.ts +84 -46
- package/src/daemon/lifecycle.ts +49 -15
- package/src/daemon/message-types/conversations.ts +7 -0
- package/src/daemon/message-types/host-bash.ts +1 -0
- package/src/daemon/message-types/host-cu.ts +1 -0
- package/src/daemon/message-types/host-file.ts +1 -0
- package/src/daemon/message-types/host-transfer.ts +1 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +102 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -2
- package/src/daemon/tool-side-effects.ts +125 -107
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +3 -1
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
- package/src/heartbeat/heartbeat-service.ts +23 -5
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/relationship-state-writer.ts +16 -3
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +3 -10
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/manager.ts +0 -5
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/context-search/sources/memory-v2.ts +578 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +29 -4
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +3 -21
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
- package/src/memory/graph/conversation-graph-memory.ts +35 -13
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs-store.ts +0 -1
- package/src/memory/jobs-worker.ts +2 -16
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +24 -0
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +25 -0
- package/src/memory/search/semantic.ts +5 -16
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +289 -90
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +384 -15
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/static-context.test.ts +153 -0
- package/src/memory/v2/activation.ts +168 -97
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +14 -12
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +182 -58
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +118 -42
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/skill-store.ts +55 -7
- package/src/memory/v2/static-context.ts +62 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +122 -21
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +97 -0
- package/src/oauth/manual-token-connection.ts +30 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/config.ts +0 -74
- package/src/outbound-proxy/health.ts +0 -44
- package/src/outbound-proxy/index.ts +0 -22
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.ts +4 -1
- package/src/permissions/gateway-threshold-reader.ts +4 -1
- package/src/permissions/prompter.ts +9 -2
- package/src/permissions/secret-prompter.ts +21 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/system-prompt.ts +34 -70
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +541 -45
- package/src/runtime/assistant-event.ts +1 -6
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/route-policy.ts +11 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +22 -82
- package/src/runtime/http-types.ts +5 -0
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
- package/src/runtime/migrations/migration-transport.ts +46 -13
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +133 -79
- package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
- package/src/runtime/migrations/vbundle-importer.ts +7 -7
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
- package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
- package/src/runtime/migrations/vbundle-validator.ts +214 -41
- package/src/runtime/pending-interactions.ts +13 -4
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +45 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +120 -8
- package/src/runtime/routes/conversation-routes.ts +44 -528
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/documents-routes.ts +53 -18
- package/src/runtime/routes/events-routes.ts +59 -91
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/host-bash-routes.ts +3 -2
- package/src/runtime/routes/host-browser-routes.ts +9 -33
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +3 -2
- package/src/runtime/routes/host-transfer-routes.ts +11 -15
- package/src/runtime/routes/identity-routes.ts +78 -6
- package/src/runtime/routes/inbound-message-handler.ts +580 -137
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/index.ts +4 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/memory-v2-routes.ts +10 -15
- package/src/runtime/routes/migration-routes.ts +188 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +3 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/schedule/schedule-store.ts +0 -16
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +6 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
- package/src/telemetry/usage-telemetry-reporter.ts +3 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
- package/src/tools/browser/cdp-client/factory.ts +48 -76
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/executor.ts +44 -31
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +4 -3
- package/src/tools/host-filesystem/write.ts +3 -2
- package/src/tools/host-terminal/host-shell.ts +4 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/types.ts +12 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
// Memory v2 — Skill catalog → embedded skill entries
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
-
// Mirrors v1's `seedSkillGraphNodes`
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// Mirrors v1's `seedSkillGraphNodes` + `seedUninstalledCatalogSkillMemories`
|
|
6
|
+
// (capability-seed.ts) for the v2 pipeline: enumerate the enabled-skill
|
|
7
|
+
// catalog AND uninstalled catalog skills, render each skill's prose statement
|
|
8
|
+
// via `buildSkillContent`, embed dense + sparse, upsert into the dedicated
|
|
8
9
|
// `memory_v2_skills` Qdrant collection, and prune stale points from prior
|
|
9
|
-
// catalog state.
|
|
10
|
+
// catalog state. Including uninstalled catalog skills ensures their activation
|
|
11
|
+
// hints are discoverable by intent so the model can auto-install them.
|
|
10
12
|
//
|
|
11
13
|
// Unlike v1, skill entries are kept in a small in-process cache so the render
|
|
12
14
|
// path can fetch a `SkillEntry` synchronously by id without round-tripping to
|
|
@@ -17,7 +19,11 @@ import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-fl
|
|
|
17
19
|
import { getConfig } from "../../config/loader.js";
|
|
18
20
|
import { resolveSkillStates } from "../../config/skill-state.js";
|
|
19
21
|
import { loadSkillCatalog } from "../../config/skills.js";
|
|
20
|
-
import {
|
|
22
|
+
import { getCatalog } from "../../skills/catalog-cache.js";
|
|
23
|
+
import {
|
|
24
|
+
fromCatalogSkill,
|
|
25
|
+
fromSkillSummary,
|
|
26
|
+
} from "../../skills/skill-memory.js";
|
|
21
27
|
import { getLogger } from "../../util/logger.js";
|
|
22
28
|
import {
|
|
23
29
|
embedWithBackend,
|
|
@@ -55,6 +61,9 @@ let entries: Map<string, SkillEntry> | null = null;
|
|
|
55
61
|
* already enforces this, but we mirror v1's enforcement point so the v2
|
|
56
62
|
* collection never holds an embedding for a flag-gated skill if the two
|
|
57
63
|
* ever drift.
|
|
64
|
+
* 3b. Fetch the full remote catalog and seed any uninstalled skills so their
|
|
65
|
+
* activation hints are discoverable by semantic search. Best-effort: if
|
|
66
|
+
* the catalog fetch fails, only installed skills are seeded.
|
|
58
67
|
* 4. Embed all `content` strings in a single dense `embedWithBackend` call,
|
|
59
68
|
* and a per-skill synchronous `generateSparseEmbedding`.
|
|
60
69
|
* 5. Upsert one Qdrant point per skill via `upsertSkillEmbedding` (keyed
|
|
@@ -70,6 +79,13 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
70
79
|
const resolved = resolveSkillStates(catalog, config);
|
|
71
80
|
const enabled = resolved.filter((r) => r.state === "enabled");
|
|
72
81
|
|
|
82
|
+
// Track every locally-installed skill id (regardless of enabled/disabled
|
|
83
|
+
// state) so the catalog-seeding loop below treats them all as "installed"
|
|
84
|
+
// and never re-seeds a disabled skill from `getCatalog()` as if it were
|
|
85
|
+
// uninstalled. Mirrors v1's `seedUninstalledCatalogSkillMemories`, which
|
|
86
|
+
// keys off `loadSkillCatalog()` (the installed set) for the same reason.
|
|
87
|
+
const installedIds = new Set<string>(catalog.map((s) => s.id));
|
|
88
|
+
|
|
73
89
|
// Build the input list, applying the mcp-setup description augmentation
|
|
74
90
|
// and the defense-in-depth feature-flag filter.
|
|
75
91
|
const seeds: SkillEntry[] = [];
|
|
@@ -82,6 +98,28 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
82
98
|
seeds.push({ id: summary.id, content });
|
|
83
99
|
}
|
|
84
100
|
|
|
101
|
+
// Seed uninstalled catalog skills so their activation hints are
|
|
102
|
+
// discoverable by intent (mirrors v1's seedUninstalledCatalogSkillMemories).
|
|
103
|
+
// Track whether the catalog was available so we can guard pruning below.
|
|
104
|
+
let catalogAvailable = false;
|
|
105
|
+
try {
|
|
106
|
+
const fullCatalog = await getCatalog();
|
|
107
|
+
catalogAvailable = fullCatalog.length > 0;
|
|
108
|
+
for (const entry of fullCatalog) {
|
|
109
|
+
if (installedIds.has(entry.id)) continue;
|
|
110
|
+
const flagKey = entry.metadata?.vellum?.["feature-flag"];
|
|
111
|
+
if (flagKey && !isAssistantFeatureFlagEnabled(flagKey, config))
|
|
112
|
+
continue;
|
|
113
|
+
const content = buildSkillContent(fromCatalogSkill(entry));
|
|
114
|
+
seeds.push({ id: entry.id, content });
|
|
115
|
+
}
|
|
116
|
+
} catch (err) {
|
|
117
|
+
log.warn(
|
|
118
|
+
{ err },
|
|
119
|
+
"Failed to fetch catalog for uninstalled skill seeding — continuing with installed skills only",
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
85
123
|
// Embed all content strings in one batched call. Sparse vectors are
|
|
86
124
|
// computed in-process (no network).
|
|
87
125
|
const { vectors: denseVectors } = await embedWithBackend(
|
|
@@ -102,8 +140,18 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
102
140
|
nextEntries.set(seed.id, seed);
|
|
103
141
|
}
|
|
104
142
|
|
|
105
|
-
// Prune
|
|
106
|
-
|
|
143
|
+
// Prune stale points. When the catalog is unavailable (empty array from
|
|
144
|
+
// network failure or cold cache), we cannot enumerate which uninstalled
|
|
145
|
+
// catalog skills should exist, so skip pruning entirely to avoid
|
|
146
|
+
// aggressively removing previously-seeded catalog skill embeddings.
|
|
147
|
+
// Mirrors v1's safeguard in capability-seed.ts (lines 124–143).
|
|
148
|
+
if (catalogAvailable) {
|
|
149
|
+
await pruneSkillsExcept(seeds.map((s) => s.id));
|
|
150
|
+
} else {
|
|
151
|
+
log.info(
|
|
152
|
+
"Catalog unavailable — skipping skill pruning to preserve prior catalog embeddings",
|
|
153
|
+
);
|
|
154
|
+
}
|
|
107
155
|
|
|
108
156
|
// Atomically replace the cache only after every step above succeeds.
|
|
109
157
|
entries = nextEntries;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Memory v2 — Static context loader for user-message auto-injection
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
//
|
|
5
|
+
// Reads the four top-level memory files (essentials/threads/recent/buffer)
|
|
6
|
+
// and returns a concatenated, header-wrapped block ready to splice into the
|
|
7
|
+
// current user message via the injector chain.
|
|
8
|
+
//
|
|
9
|
+
// Pairs with the v2 per-turn activation block (`prependMemoryV2Block` in
|
|
10
|
+
// `conversation-graph-memory.ts`) — that block carries activated concept
|
|
11
|
+
// pages selected by the activation pipeline; this static block carries the
|
|
12
|
+
// always-relevant aggregate views written by consolidation and the user.
|
|
13
|
+
// Both land on the user message so the system prompt stays cache-stable.
|
|
14
|
+
//
|
|
15
|
+
// Refresh cadence is owned by the caller: the agent loop only passes the
|
|
16
|
+
// content through when `mode === "full"` (first turn / post-compaction),
|
|
17
|
+
// matching the existing PKB auto-inject pattern.
|
|
18
|
+
|
|
19
|
+
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
20
|
+
import { loadConfig } from "../../config/loader.js";
|
|
21
|
+
import { readPromptFile } from "../../prompts/system-prompt.js";
|
|
22
|
+
import { getWorkspacePromptPath } from "../../util/platform.js";
|
|
23
|
+
|
|
24
|
+
interface MemoryV2StaticBlock {
|
|
25
|
+
heading: string;
|
|
26
|
+
file: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const MEMORY_V2_STATIC_BLOCKS: readonly MemoryV2StaticBlock[] = [
|
|
30
|
+
{ heading: "## Essentials", file: "memory/essentials.md" },
|
|
31
|
+
{ heading: "## Threads", file: "memory/threads.md" },
|
|
32
|
+
{ heading: "## Recent", file: "memory/recent.md" },
|
|
33
|
+
{ heading: "## Buffer", file: "memory/buffer.md" },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Build the v2 static memory block, gated on `memory-v2-enabled` +
|
|
38
|
+
* `config.memory.v2.enabled`. Empty/missing files are skipped; returns
|
|
39
|
+
* `null` when the gate is off or every file is empty.
|
|
40
|
+
*/
|
|
41
|
+
export function readMemoryV2StaticContent(): string | null {
|
|
42
|
+
let config;
|
|
43
|
+
try {
|
|
44
|
+
config = loadConfig();
|
|
45
|
+
} catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
if (
|
|
49
|
+
!isAssistantFeatureFlagEnabled("memory-v2-enabled", config) ||
|
|
50
|
+
!config.memory.v2.enabled
|
|
51
|
+
) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sections: string[] = [];
|
|
56
|
+
for (const { heading, file } of MEMORY_V2_STATIC_BLOCKS) {
|
|
57
|
+
const content = readPromptFile(getWorkspacePromptPath(file));
|
|
58
|
+
if (!content) continue;
|
|
59
|
+
sections.push(`${heading}\n\n${content}`);
|
|
60
|
+
}
|
|
61
|
+
return sections.length > 0 ? sections.join("\n\n") : null;
|
|
62
|
+
}
|
package/src/memory/v2/types.ts
CHANGED
|
@@ -20,9 +20,12 @@ import { z } from "zod";
|
|
|
20
20
|
/**
|
|
21
21
|
* YAML frontmatter at the top of a concept page (`memory/concepts/<slug>.md`).
|
|
22
22
|
*
|
|
23
|
-
* `edges` is
|
|
24
|
-
* the
|
|
25
|
-
*
|
|
23
|
+
* `edges` is the canonical list of *outgoing* directed edges from this page.
|
|
24
|
+
* Each entry is the slug of another concept page; an entry of `B` in A's
|
|
25
|
+
* `edges:` means "activating A pulls in B" — activation flows A → B but not
|
|
26
|
+
* B → A. The full graph is the union of every page's `edges:` list — there
|
|
27
|
+
* is no separate edges-index file. `ref_files` lists paths to attached media
|
|
28
|
+
* (images, audio, etc.).
|
|
26
29
|
*/
|
|
27
30
|
export const ConceptPageFrontmatterSchema = z.object({
|
|
28
31
|
edges: z.array(z.string()).default([]),
|
|
@@ -34,8 +37,10 @@ export type ConceptPageFrontmatter = z.infer<
|
|
|
34
37
|
>;
|
|
35
38
|
|
|
36
39
|
/**
|
|
37
|
-
* A single concept page on disk. The slug is the
|
|
38
|
-
*
|
|
40
|
+
* A single concept page on disk. The slug is the relative path from
|
|
41
|
+
* `memory/concepts/` minus `.md`, using forward slashes — so `alice` and
|
|
42
|
+
* `people/alice` are both valid slugs. The slug is the stable identity used
|
|
43
|
+
* in edges and activation state.
|
|
39
44
|
*/
|
|
40
45
|
export const ConceptPageSchema = z.object({
|
|
41
46
|
slug: z.string(),
|
|
@@ -45,21 +50,6 @@ export const ConceptPageSchema = z.object({
|
|
|
45
50
|
|
|
46
51
|
export type ConceptPage = z.infer<typeof ConceptPageSchema>;
|
|
47
52
|
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// Edges index (`memory/edges.json`)
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Source of truth for v2 graph topology. Edges are unweighted, undirected,
|
|
54
|
-
* and stored as canonicalized 2-tuples (alphabetical-first slug first).
|
|
55
|
-
*/
|
|
56
|
-
export const EdgesIndexSchema = z.object({
|
|
57
|
-
version: z.literal(1),
|
|
58
|
-
edges: z.array(z.tuple([z.string(), z.string()])),
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
export type EdgesIndex = z.infer<typeof EdgesIndexSchema>;
|
|
62
|
-
|
|
63
53
|
// ---------------------------------------------------------------------------
|
|
64
54
|
// Activation state (per-conversation, persisted in SQLite)
|
|
65
55
|
// ---------------------------------------------------------------------------
|
package/src/memory/validation.ts
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* Unit interval [0, 1] — used for confidence and importance fields on memory items.
|
|
5
3
|
* Coerces out-of-range numbers to the nearest bound rather than rejecting,
|
|
6
4
|
* since LLM-generated values occasionally exceed the range.
|
|
7
5
|
*/
|
|
8
|
-
const unitInterval = z
|
|
9
|
-
.number()
|
|
10
|
-
.transform((v) => Math.min(1, Math.max(0, v)));
|
|
11
|
-
|
|
12
|
-
/** Zod schema for validating confidence/importance values on memory items. */
|
|
13
|
-
export const memoryItemScores = z.object({
|
|
14
|
-
confidence: unitInterval,
|
|
15
|
-
importance: unitInterval,
|
|
16
|
-
});
|
|
17
6
|
|
|
18
7
|
/** Clamp a numeric value to [0, 1]. */
|
|
19
8
|
export function clampUnitInterval(value: number): number {
|
|
@@ -62,12 +62,6 @@ export function createDraft(opts: {
|
|
|
62
62
|
return draft;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
export function getDraft(platform: string, id: string): Draft | null {
|
|
66
|
-
const path = getDraftPath(platform, id);
|
|
67
|
-
if (!pathExists(path)) return null;
|
|
68
|
-
return JSON.parse(readFileSync(path, "utf-8")) as Draft;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
65
|
export function listDrafts(platform: string): Draft[] {
|
|
72
66
|
const dir = getDraftsDir(platform);
|
|
73
67
|
const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
@@ -41,6 +41,12 @@ export interface SearchResult {
|
|
|
41
41
|
nextCursor?: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
export interface HistoryPageResult {
|
|
45
|
+
messages: Message[];
|
|
46
|
+
hasMore: boolean;
|
|
47
|
+
nextCursor?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
44
50
|
export interface SendResult {
|
|
45
51
|
id: string;
|
|
46
52
|
timestamp: number;
|
|
@@ -66,6 +72,8 @@ export interface HistoryOptions {
|
|
|
66
72
|
limit?: number;
|
|
67
73
|
before?: string;
|
|
68
74
|
after?: string;
|
|
75
|
+
cursor?: string;
|
|
76
|
+
inclusive?: boolean;
|
|
69
77
|
}
|
|
70
78
|
|
|
71
79
|
export interface SearchOptions {
|
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
ConnectionInfo,
|
|
12
12
|
Conversation,
|
|
13
13
|
HistoryOptions,
|
|
14
|
+
HistoryPageResult,
|
|
14
15
|
ListOptions,
|
|
15
16
|
Message,
|
|
16
17
|
SearchOptions,
|
|
@@ -60,6 +61,12 @@ export interface MessagingProvider {
|
|
|
60
61
|
threadId: string,
|
|
61
62
|
options?: HistoryOptions,
|
|
62
63
|
): Promise<Message[]>;
|
|
64
|
+
getThreadRepliesPage?(
|
|
65
|
+
connection: OAuthConnection | undefined,
|
|
66
|
+
conversationId: string,
|
|
67
|
+
threadId: string,
|
|
68
|
+
options?: HistoryOptions,
|
|
69
|
+
): Promise<HistoryPageResult>;
|
|
63
70
|
markRead?(
|
|
64
71
|
connection: OAuthConnection | undefined,
|
|
65
72
|
conversationId: string,
|
|
@@ -3,12 +3,7 @@ import type {
|
|
|
3
3
|
OAuthConnectionResponse,
|
|
4
4
|
} from "../../../oauth/connection.js";
|
|
5
5
|
import type {
|
|
6
|
-
GmailAttachment,
|
|
7
6
|
GmailDraft,
|
|
8
|
-
GmailFilter,
|
|
9
|
-
GmailFilterAction,
|
|
10
|
-
GmailFilterCriteria,
|
|
11
|
-
GmailFiltersListResponse,
|
|
12
7
|
GmailLabel,
|
|
13
8
|
GmailLabelsListResponse,
|
|
14
9
|
GmailMessage,
|
|
@@ -17,7 +12,6 @@ import type {
|
|
|
17
12
|
GmailModifyRequest,
|
|
18
13
|
GmailProfile,
|
|
19
14
|
GmailThread,
|
|
20
|
-
GmailVacationSettings,
|
|
21
15
|
} from "./types.js";
|
|
22
16
|
|
|
23
17
|
const GMAIL_BATCH_URL = "https://www.googleapis.com/batch/gmail/v1";
|
|
@@ -237,7 +231,7 @@ export async function listMessages(
|
|
|
237
231
|
}
|
|
238
232
|
|
|
239
233
|
/** Get a single message by ID. */
|
|
240
|
-
|
|
234
|
+
async function getMessage(
|
|
241
235
|
connection: OAuthConnection,
|
|
242
236
|
messageId: string,
|
|
243
237
|
format: GmailMessageFormat = "full",
|
|
@@ -591,17 +585,6 @@ export async function batchModifyMessages(
|
|
|
591
585
|
});
|
|
592
586
|
}
|
|
593
587
|
|
|
594
|
-
/** Move a message to trash. */
|
|
595
|
-
export async function trashMessage(
|
|
596
|
-
connection: OAuthConnection,
|
|
597
|
-
messageId: string,
|
|
598
|
-
): Promise<GmailMessage> {
|
|
599
|
-
return request<GmailMessage>(connection, `/messages/${messageId}/trash`, {
|
|
600
|
-
method: "POST",
|
|
601
|
-
retryable: true,
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
|
|
605
588
|
/** List all labels. */
|
|
606
589
|
export async function listLabels(
|
|
607
590
|
connection: OAuthConnection,
|
|
@@ -659,17 +642,6 @@ export async function createDraftRaw(
|
|
|
659
642
|
});
|
|
660
643
|
}
|
|
661
644
|
|
|
662
|
-
/** Send an existing draft by ID. */
|
|
663
|
-
export async function sendDraft(
|
|
664
|
-
connection: OAuthConnection,
|
|
665
|
-
draftId: string,
|
|
666
|
-
): Promise<GmailMessage> {
|
|
667
|
-
return request<GmailMessage>(connection, "/drafts/send", {
|
|
668
|
-
method: "POST",
|
|
669
|
-
body: JSON.stringify({ id: draftId }),
|
|
670
|
-
});
|
|
671
|
-
}
|
|
672
|
-
|
|
673
645
|
/** Send an email. */
|
|
674
646
|
export async function sendMessage(
|
|
675
647
|
connection: OAuthConnection,
|
|
@@ -707,95 +679,3 @@ export async function getProfile(
|
|
|
707
679
|
): Promise<GmailProfile> {
|
|
708
680
|
return request<GmailProfile>(connection, "/profile");
|
|
709
681
|
}
|
|
710
|
-
|
|
711
|
-
/** Get attachment data for a message. */
|
|
712
|
-
export async function getAttachment(
|
|
713
|
-
connection: OAuthConnection,
|
|
714
|
-
messageId: string,
|
|
715
|
-
attachmentId: string,
|
|
716
|
-
): Promise<GmailAttachment> {
|
|
717
|
-
return request<GmailAttachment>(
|
|
718
|
-
connection,
|
|
719
|
-
`/messages/${messageId}/attachments/${attachmentId}`,
|
|
720
|
-
);
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/** Send an email with a pre-built raw MIME payload (for multipart/attachments). */
|
|
724
|
-
export async function sendMessageRaw(
|
|
725
|
-
connection: OAuthConnection,
|
|
726
|
-
raw: string,
|
|
727
|
-
threadId?: string,
|
|
728
|
-
): Promise<GmailMessage> {
|
|
729
|
-
const payload: Record<string, unknown> = { raw };
|
|
730
|
-
if (threadId) payload.threadId = threadId;
|
|
731
|
-
return request<GmailMessage>(connection, "/messages/send", {
|
|
732
|
-
method: "POST",
|
|
733
|
-
body: JSON.stringify(payload),
|
|
734
|
-
});
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
/** Create a user label. */
|
|
738
|
-
export async function createLabel(
|
|
739
|
-
connection: OAuthConnection,
|
|
740
|
-
name: string,
|
|
741
|
-
opts?: {
|
|
742
|
-
messageListVisibility?: "show" | "hide";
|
|
743
|
-
labelListVisibility?: "labelShow" | "labelShowIfUnread" | "labelHide";
|
|
744
|
-
},
|
|
745
|
-
): Promise<GmailLabel> {
|
|
746
|
-
return request<GmailLabel>(connection, "/labels", {
|
|
747
|
-
method: "POST",
|
|
748
|
-
body: JSON.stringify({ name, ...opts }),
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
/** List all Gmail filters. */
|
|
753
|
-
export async function listFilters(
|
|
754
|
-
connection: OAuthConnection,
|
|
755
|
-
): Promise<GmailFilter[]> {
|
|
756
|
-
const resp = await request<GmailFiltersListResponse>(
|
|
757
|
-
connection,
|
|
758
|
-
"/settings/filters",
|
|
759
|
-
);
|
|
760
|
-
return resp.filter ?? [];
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
/** Create a Gmail filter. */
|
|
764
|
-
export async function createFilter(
|
|
765
|
-
connection: OAuthConnection,
|
|
766
|
-
criteria: GmailFilterCriteria,
|
|
767
|
-
action: GmailFilterAction,
|
|
768
|
-
): Promise<GmailFilter> {
|
|
769
|
-
return request<GmailFilter>(connection, "/settings/filters", {
|
|
770
|
-
method: "POST",
|
|
771
|
-
body: JSON.stringify({ criteria, action }),
|
|
772
|
-
});
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
/** Delete a Gmail filter. */
|
|
776
|
-
export async function deleteFilter(
|
|
777
|
-
connection: OAuthConnection,
|
|
778
|
-
filterId: string,
|
|
779
|
-
): Promise<void> {
|
|
780
|
-
await request<void>(connection, `/settings/filters/${filterId}`, {
|
|
781
|
-
method: "DELETE",
|
|
782
|
-
});
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
/** Get vacation auto-reply settings. */
|
|
786
|
-
export async function getVacation(
|
|
787
|
-
connection: OAuthConnection,
|
|
788
|
-
): Promise<GmailVacationSettings> {
|
|
789
|
-
return request<GmailVacationSettings>(connection, "/settings/vacation");
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
/** Update vacation auto-reply settings. */
|
|
793
|
-
export async function updateVacation(
|
|
794
|
-
connection: OAuthConnection,
|
|
795
|
-
settings: GmailVacationSettings,
|
|
796
|
-
): Promise<GmailVacationSettings> {
|
|
797
|
-
return request<GmailVacationSettings>(connection, "/settings/vacation", {
|
|
798
|
-
method: "PUT",
|
|
799
|
-
body: JSON.stringify(settings),
|
|
800
|
-
});
|
|
801
|
-
}
|
|
@@ -162,23 +162,6 @@ export async function listMessages(
|
|
|
162
162
|
);
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
-
/** Get a single message by ID. */
|
|
166
|
-
export async function getMessage(
|
|
167
|
-
connection: OAuthConnection,
|
|
168
|
-
messageId: string,
|
|
169
|
-
select?: string,
|
|
170
|
-
): Promise<OutlookMessage> {
|
|
171
|
-
const query: Record<string, string> = {};
|
|
172
|
-
if (select) query["$select"] = select;
|
|
173
|
-
|
|
174
|
-
return request<OutlookMessage>(
|
|
175
|
-
connection,
|
|
176
|
-
`/v1.0/me/messages/${encodeURIComponent(messageId)}`,
|
|
177
|
-
undefined,
|
|
178
|
-
Object.keys(query).length > 0 ? query : undefined,
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
165
|
/** Search messages using Microsoft Graph KQL syntax. */
|
|
183
166
|
export async function searchMessages(
|
|
184
167
|
connection: OAuthConnection,
|
|
@@ -278,38 +261,6 @@ export async function markMessageRead(
|
|
|
278
261
|
);
|
|
279
262
|
}
|
|
280
263
|
|
|
281
|
-
/** Patch arbitrary fields on a message (e.g. to update recipients on a draft). */
|
|
282
|
-
export async function patchMessage(
|
|
283
|
-
connection: OAuthConnection,
|
|
284
|
-
messageId: string,
|
|
285
|
-
fields: Record<string, unknown>,
|
|
286
|
-
): Promise<OutlookMessage> {
|
|
287
|
-
return request<OutlookMessage>(
|
|
288
|
-
connection,
|
|
289
|
-
`/v1.0/me/messages/${encodeURIComponent(messageId)}`,
|
|
290
|
-
{
|
|
291
|
-
method: "PATCH",
|
|
292
|
-
body: JSON.stringify(fields),
|
|
293
|
-
},
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/** Move a message to a different folder (e.g. for archiving). */
|
|
298
|
-
export async function moveMessage(
|
|
299
|
-
connection: OAuthConnection,
|
|
300
|
-
messageId: string,
|
|
301
|
-
destinationFolderId: string,
|
|
302
|
-
): Promise<OutlookMessage> {
|
|
303
|
-
return request<OutlookMessage>(
|
|
304
|
-
connection,
|
|
305
|
-
`/v1.0/me/messages/${encodeURIComponent(messageId)}/move`,
|
|
306
|
-
{
|
|
307
|
-
method: "POST",
|
|
308
|
-
body: JSON.stringify({ destinationId: destinationFolderId }),
|
|
309
|
-
},
|
|
310
|
-
);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
264
|
/** Create a draft message in the user's Drafts folder. */
|
|
314
265
|
export async function createDraft(
|
|
315
266
|
connection: OAuthConnection,
|
|
@@ -389,30 +340,6 @@ export async function createForwardDraft(
|
|
|
389
340
|
}
|
|
390
341
|
|
|
391
342
|
/** Max concurrent individual getMessage requests for batch fetching. */
|
|
392
|
-
const BATCH_CONCURRENCY = 5;
|
|
393
|
-
|
|
394
|
-
/** Fetch multiple messages with concurrency limiting. */
|
|
395
|
-
export async function batchGetMessages(
|
|
396
|
-
connection: OAuthConnection,
|
|
397
|
-
messageIds: string[],
|
|
398
|
-
select?: string,
|
|
399
|
-
): Promise<OutlookMessage[]> {
|
|
400
|
-
if (messageIds.length === 0) return [];
|
|
401
|
-
|
|
402
|
-
if (messageIds.length === 1) {
|
|
403
|
-
return [await getMessage(connection, messageIds[0], select)];
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
const results: OutlookMessage[] = [];
|
|
407
|
-
for (let i = 0; i < messageIds.length; i += BATCH_CONCURRENCY) {
|
|
408
|
-
const wave = messageIds.slice(i, i + BATCH_CONCURRENCY);
|
|
409
|
-
const waveResults = await Promise.all(
|
|
410
|
-
wave.map((id) => getMessage(connection, id, select)),
|
|
411
|
-
);
|
|
412
|
-
results.push(...waveResults);
|
|
413
|
-
}
|
|
414
|
-
return results;
|
|
415
|
-
}
|
|
416
343
|
|
|
417
344
|
/** List attachments on a message. */
|
|
418
345
|
export async function listAttachments(
|