@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,14 +2,10 @@
|
|
|
2
2
|
// Memory v2 — Backfill job handlers
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// Three operator-triggered backfills, all wired through the same job queue so
|
|
6
6
|
// they can be enqueued from the IPC route, the CLI, or recovery paths:
|
|
7
7
|
//
|
|
8
8
|
// - `memory_v2_migrate` — one-shot v1→v2 synthesis (PR 16).
|
|
9
|
-
// - `memory_v2_rebuild_edges` — regenerate every page's `edges:`
|
|
10
|
-
// frontmatter from `memory/edges.json` (the source of truth for graph
|
|
11
|
-
// topology). Defensive against drift, hand-edits, and consolidation
|
|
12
|
-
// leaving stale frontmatter behind.
|
|
13
9
|
// - `memory_v2_reembed` — fan out an `embed_concept_page` job
|
|
14
10
|
// per slug, plus four reserved-slug jobs for the meta files
|
|
15
11
|
// (`__essentials__`, `__threads__`, `__recent__`, `__buffer__`).
|
|
@@ -18,10 +14,10 @@
|
|
|
18
14
|
// replaces or deletes pages that other conversations still reference.
|
|
19
15
|
//
|
|
20
16
|
// Each handler is intentionally small — heavy lifting lives in the modules
|
|
21
|
-
// they delegate to (`migration.ts`, `
|
|
22
|
-
// `
|
|
23
|
-
// the
|
|
24
|
-
//
|
|
17
|
+
// they delegate to (`migration.ts`, `page-store.ts`, `embed-concept-page.ts`,
|
|
18
|
+
// `activation.ts`, `activation-store.ts`). Keeping the wrappers thin means
|
|
19
|
+
// the same code paths exercised by tests of those modules run unchanged when
|
|
20
|
+
// a backfill kicks them off.
|
|
25
21
|
|
|
26
22
|
import { readFile } from "node:fs/promises";
|
|
27
23
|
import { join } from "node:path";
|
|
@@ -40,12 +36,12 @@ import {
|
|
|
40
36
|
spreadActivation,
|
|
41
37
|
} from "./activation.js";
|
|
42
38
|
import { hydrate, save } from "./activation-store.js";
|
|
43
|
-
import {
|
|
39
|
+
import { getEdgeIndex } from "./edge-index.js";
|
|
44
40
|
import {
|
|
45
41
|
MigrationAlreadyAppliedError,
|
|
46
42
|
runMemoryV2Migration,
|
|
47
43
|
} from "./migration.js";
|
|
48
|
-
import { listPages
|
|
44
|
+
import { listPages } from "./page-store.js";
|
|
49
45
|
|
|
50
46
|
const log = getLogger("memory-v2-backfill");
|
|
51
47
|
|
|
@@ -109,87 +105,6 @@ export async function memoryV2MigrateJob(
|
|
|
109
105
|
}
|
|
110
106
|
}
|
|
111
107
|
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
// memory_v2_rebuild_edges — recompute every page's edges: frontmatter
|
|
114
|
-
// ---------------------------------------------------------------------------
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Job handler: walk every concept page on disk, recompute its `edges:`
|
|
118
|
-
* frontmatter from `memory/edges.json`, and write back via `writePage` so
|
|
119
|
-
* the YAML block reflects the current topology.
|
|
120
|
-
*
|
|
121
|
-
* `memory/edges.json` is the source of truth for graph topology — frontmatter
|
|
122
|
-
* is a derived view that downstream readers (LLM during consolidation,
|
|
123
|
-
* humans inspecting pages) consume but never mutate. The rebuild is
|
|
124
|
-
* defensive against three failure modes:
|
|
125
|
-
* 1. A consolidation pass replaced a page's body but didn't update its
|
|
126
|
-
* `edges:` list (missed write).
|
|
127
|
-
* 2. A user hand-edited a page and replaced or removed the `edges:` list.
|
|
128
|
-
* 3. An older v2 build wrote frontmatter without canonical ordering.
|
|
129
|
-
*
|
|
130
|
-
* Other frontmatter fields (`ref_files`) are preserved as-is — the page
|
|
131
|
-
* remains the only source of truth for everything beyond `edges`. Pages
|
|
132
|
-
* that fail to read are logged and skipped so one corrupt page doesn't
|
|
133
|
-
* block the rest of the rebuild.
|
|
134
|
-
*/
|
|
135
|
-
export async function memoryV2RebuildEdgesJob(
|
|
136
|
-
_job: MemoryJob,
|
|
137
|
-
_config: AssistantConfig,
|
|
138
|
-
): Promise<void> {
|
|
139
|
-
const workspaceDir = getWorkspaceDir();
|
|
140
|
-
const idx = await readEdges(workspaceDir);
|
|
141
|
-
|
|
142
|
-
// Build slug → sorted neighbor list once, then look up per page. Sets
|
|
143
|
-
// dedup automatically; sorting at materialization time keeps the
|
|
144
|
-
// rendered YAML stable across runs.
|
|
145
|
-
const neighborsBySlug = new Map<string, Set<string>>();
|
|
146
|
-
const ensureSet = (slug: string): Set<string> => {
|
|
147
|
-
let set = neighborsBySlug.get(slug);
|
|
148
|
-
if (!set) {
|
|
149
|
-
set = new Set<string>();
|
|
150
|
-
neighborsBySlug.set(slug, set);
|
|
151
|
-
}
|
|
152
|
-
return set;
|
|
153
|
-
};
|
|
154
|
-
for (const [a, b] of idx.edges) {
|
|
155
|
-
if (a === b) continue;
|
|
156
|
-
ensureSet(a).add(b);
|
|
157
|
-
ensureSet(b).add(a);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const slugs = await listPages(workspaceDir);
|
|
161
|
-
let rewritten = 0;
|
|
162
|
-
for (const slug of slugs) {
|
|
163
|
-
let page;
|
|
164
|
-
try {
|
|
165
|
-
page = await readPage(workspaceDir, slug);
|
|
166
|
-
} catch (err) {
|
|
167
|
-
log.warn({ err, slug }, "Skipping page with unreadable frontmatter");
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
if (!page) continue;
|
|
171
|
-
|
|
172
|
-
const desired = [...(neighborsBySlug.get(slug) ?? [])].sort();
|
|
173
|
-
if (
|
|
174
|
-
page.frontmatter.edges.length === desired.length &&
|
|
175
|
-
page.frontmatter.edges.every((e, i) => e === desired[i])
|
|
176
|
-
) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
await writePage(workspaceDir, {
|
|
181
|
-
...page,
|
|
182
|
-
frontmatter: { ...page.frontmatter, edges: desired },
|
|
183
|
-
});
|
|
184
|
-
rewritten += 1;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
log.info(
|
|
188
|
-
{ slugCount: slugs.length, rewritten },
|
|
189
|
-
"Memory v2 rebuild-edges complete",
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
108
|
// ---------------------------------------------------------------------------
|
|
194
109
|
// memory_v2_reembed — fan out embed jobs for every page + meta file
|
|
195
110
|
// ---------------------------------------------------------------------------
|
|
@@ -260,7 +175,7 @@ export async function memoryV2ActivationRecomputeJob(
|
|
|
260
175
|
const conversations = listConversations(
|
|
261
176
|
ACTIVATION_RECOMPUTE_CONVERSATION_LIMIT,
|
|
262
177
|
);
|
|
263
|
-
const
|
|
178
|
+
const edgeIndex = await getEdgeIndex(workspaceDir);
|
|
264
179
|
const nowText = await loadNowText(workspaceDir);
|
|
265
180
|
|
|
266
181
|
let updated = 0;
|
|
@@ -273,7 +188,7 @@ export async function memoryV2ActivationRecomputeJob(
|
|
|
273
188
|
nextState = await recomputeForConversation({
|
|
274
189
|
conversationId: conv.id,
|
|
275
190
|
priorState,
|
|
276
|
-
|
|
191
|
+
edgeIndex,
|
|
277
192
|
nowText,
|
|
278
193
|
config,
|
|
279
194
|
});
|
|
@@ -300,7 +215,7 @@ export async function memoryV2ActivationRecomputeJob(
|
|
|
300
215
|
interface RecomputeForConversationParams {
|
|
301
216
|
conversationId: string;
|
|
302
217
|
priorState: NonNullable<Awaited<ReturnType<typeof hydrate>>>;
|
|
303
|
-
|
|
218
|
+
edgeIndex: Awaited<ReturnType<typeof getEdgeIndex>>;
|
|
304
219
|
nowText: string;
|
|
305
220
|
config: AssistantConfig;
|
|
306
221
|
}
|
|
@@ -316,19 +231,19 @@ interface RecomputeForConversationParams {
|
|
|
316
231
|
async function recomputeForConversation(
|
|
317
232
|
params: RecomputeForConversationParams,
|
|
318
233
|
): Promise<Awaited<ReturnType<typeof hydrate>> | null> {
|
|
319
|
-
const { conversationId, priorState,
|
|
234
|
+
const { conversationId, priorState, edgeIndex, nowText, config } = params;
|
|
320
235
|
|
|
321
236
|
const { userText, assistantText } = lastExchangeTexts(conversationId);
|
|
322
237
|
if (!userText && !assistantText) return null;
|
|
323
238
|
|
|
324
|
-
const candidates = await selectCandidates({
|
|
239
|
+
const { candidates } = await selectCandidates({
|
|
325
240
|
priorState,
|
|
326
241
|
userText,
|
|
327
242
|
assistantText,
|
|
328
243
|
nowText,
|
|
329
244
|
config,
|
|
330
245
|
});
|
|
331
|
-
const ownActivation = await computeOwnActivation({
|
|
246
|
+
const { activation: ownActivation } = await computeOwnActivation({
|
|
332
247
|
candidates,
|
|
333
248
|
priorState,
|
|
334
249
|
userText,
|
|
@@ -336,9 +251,9 @@ async function recomputeForConversation(
|
|
|
336
251
|
nowText,
|
|
337
252
|
config,
|
|
338
253
|
});
|
|
339
|
-
const spread = spreadActivation(
|
|
254
|
+
const { final: spread } = spreadActivation(
|
|
340
255
|
ownActivation,
|
|
341
|
-
|
|
256
|
+
edgeIndex,
|
|
342
257
|
config.memory.v2.k,
|
|
343
258
|
config.memory.v2.hops,
|
|
344
259
|
);
|
|
@@ -29,13 +29,12 @@
|
|
|
29
29
|
* 5. Bootstrap a background conversation (mirrors `runUpdateBulletinJobIfNeeded`)
|
|
30
30
|
* and call `wakeAgentForOpportunity()` with the templated hint. The wake
|
|
31
31
|
* reuses the assistant's full system prompt + tools.
|
|
32
|
-
* 6. On wake success, enqueue `
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* there's nothing to regenerate or re-embed.
|
|
32
|
+
* 6. On wake success, enqueue `memory_v2_reembed` to re-index any pages the
|
|
33
|
+
* agent touched. Tracking touched pages via mtime would be more precise
|
|
34
|
+
* but is fragile across filesystems; the embedder's content-hash cache
|
|
35
|
+
* makes a conservative full-reembed effectively free. On wake failure
|
|
36
|
+
* no follow-ups are enqueued — the agent didn't run, so there's nothing
|
|
37
|
+
* to re-embed.
|
|
39
38
|
* 7. Release the lock.
|
|
40
39
|
*
|
|
41
40
|
* The handler never propagates a wake exception: it logs, cleans up the
|
|
@@ -56,6 +55,7 @@ import { dirname, join } from "node:path";
|
|
|
56
55
|
|
|
57
56
|
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
58
57
|
import type { AssistantConfig } from "../../config/types.js";
|
|
58
|
+
import { INTERNAL_GUARDIAN_TRUST_CONTEXT } from "../../daemon/trust-context.js";
|
|
59
59
|
import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
|
|
60
60
|
import { getLogger } from "../../util/logger.js";
|
|
61
61
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
type MemoryJob,
|
|
67
67
|
type MemoryJobType,
|
|
68
68
|
} from "../jobs-store.js";
|
|
69
|
-
import {
|
|
69
|
+
import { resolveConsolidationPrompt } from "./prompts/consolidation.js";
|
|
70
70
|
|
|
71
71
|
const log = getLogger("memory-v2-consolidate");
|
|
72
72
|
|
|
@@ -74,15 +74,13 @@ const log = getLogger("memory-v2-consolidate");
|
|
|
74
74
|
const WAKE_SOURCE = "memory_v2_consolidation";
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
|
-
* Follow-up jobs to fan out after a successful consolidation.
|
|
78
|
-
* from PR 6 today; PR 21 will replace them with real handlers.
|
|
77
|
+
* Follow-up jobs to fan out after a successful consolidation.
|
|
79
78
|
*
|
|
80
79
|
* Conservatively re-embeds every page rather than tracking which pages the
|
|
81
80
|
* agent touched: mtime-diffing is fragile across filesystems, and the
|
|
82
81
|
* embedder's content-hash cache makes unchanged pages effectively free.
|
|
83
82
|
*/
|
|
84
83
|
const FOLLOW_UP_JOB_TYPES: readonly MemoryJobType[] = [
|
|
85
|
-
"memory_v2_rebuild_edges",
|
|
86
84
|
"memory_v2_reembed",
|
|
87
85
|
] as const;
|
|
88
86
|
|
|
@@ -157,8 +155,12 @@ export async function memoryV2ConsolidateJob(
|
|
|
157
155
|
try {
|
|
158
156
|
const result = await wakeAgentForOpportunity({
|
|
159
157
|
conversationId: conversation.id,
|
|
160
|
-
hint:
|
|
158
|
+
hint: resolveConsolidationPrompt(
|
|
159
|
+
config.memory.v2.consolidation_prompt_path,
|
|
160
|
+
cutoff,
|
|
161
|
+
),
|
|
161
162
|
source: WAKE_SOURCE,
|
|
163
|
+
trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
|
|
162
164
|
});
|
|
163
165
|
wakeInvoked = result.invoked;
|
|
164
166
|
failureReason = result.reason;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory v2 — In-memory directed edge index, derived from concept-page
|
|
3
|
+
* frontmatter.
|
|
4
|
+
*
|
|
5
|
+
* Each concept page's `edges:` frontmatter list is the canonical source of
|
|
6
|
+
* truth for that page's *outgoing* edges. Edges are directed: an entry of
|
|
7
|
+
* `B` in A's `edges:` means "activating A pulls in B" — activation flows
|
|
8
|
+
* A → B but not B → A. The full graph is the union of every page's
|
|
9
|
+
* outgoing edges.
|
|
10
|
+
*
|
|
11
|
+
* `getEdgeIndex` builds an in-memory snapshot by walking pages and caches it
|
|
12
|
+
* module-locally for fast per-turn reads. Page mutations invalidate the cache:
|
|
13
|
+
* - `page-store.ts` calls `invalidateEdgeIndex` from `writePage` / `deletePage`
|
|
14
|
+
* for programmatic writes (migration, future tools).
|
|
15
|
+
* - `daemon/tool-side-effects.ts` invalidates after any LLM-driven file
|
|
16
|
+
* mutation under `memory/concepts/`.
|
|
17
|
+
*
|
|
18
|
+
* Self-loops are dropped silently when the index is built — concept-page
|
|
19
|
+
* graphs are simple graphs.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { listPages, readPage } from "./page-store.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Snapshot of the v2 graph as outgoing + incoming adjacency maps.
|
|
26
|
+
*
|
|
27
|
+
* Both maps are derived from the same set of page-frontmatter `edges:` lists.
|
|
28
|
+
* The asymmetry between them is intentional: callers walking outgoing
|
|
29
|
+
* (`outgoing[slug]`) see what `slug` points at; callers walking incoming
|
|
30
|
+
* (`incoming[slug]`) see who points at `slug`.
|
|
31
|
+
*/
|
|
32
|
+
export interface EdgeIndex {
|
|
33
|
+
/** `from → Set<to>` — what each page points at. */
|
|
34
|
+
outgoing: Map<string, Set<string>>;
|
|
35
|
+
/** `to → Set<from>` — who points at each page. */
|
|
36
|
+
incoming: Map<string, Set<string>>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface CachedIndex {
|
|
40
|
+
workspaceDir: string;
|
|
41
|
+
index: EdgeIndex;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let cache: CachedIndex | null = null;
|
|
45
|
+
|
|
46
|
+
function ensureSet(map: Map<string, Set<string>>, key: string): Set<string> {
|
|
47
|
+
let set = map.get(key);
|
|
48
|
+
if (!set) {
|
|
49
|
+
set = new Set<string>();
|
|
50
|
+
map.set(key, set);
|
|
51
|
+
}
|
|
52
|
+
return set;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Return an `EdgeIndex` for `workspaceDir`. Cached module-locally; the cache is
|
|
57
|
+
* invalidated by `invalidateEdgeIndex` (called from `writePage` / `deletePage`
|
|
58
|
+
* and the file-tool post-execution hook).
|
|
59
|
+
*
|
|
60
|
+
* Cold builds walk every concept page in parallel and read its frontmatter.
|
|
61
|
+
* Pages that fail to read are dropped silently — a single broken page
|
|
62
|
+
* shouldn't block the rest of the index.
|
|
63
|
+
*/
|
|
64
|
+
export async function getEdgeIndex(workspaceDir: string): Promise<EdgeIndex> {
|
|
65
|
+
if (cache && cache.workspaceDir === workspaceDir) {
|
|
66
|
+
return cache.index;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const slugs = await listPages(workspaceDir);
|
|
70
|
+
const outgoing = new Map<string, Set<string>>();
|
|
71
|
+
const incoming = new Map<string, Set<string>>();
|
|
72
|
+
|
|
73
|
+
await Promise.all(
|
|
74
|
+
slugs.map(async (slug) => {
|
|
75
|
+
let page;
|
|
76
|
+
try {
|
|
77
|
+
page = await readPage(workspaceDir, slug);
|
|
78
|
+
} catch {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!page) return;
|
|
82
|
+
const out = new Set<string>();
|
|
83
|
+
for (const target of page.frontmatter.edges) {
|
|
84
|
+
if (target === slug) continue;
|
|
85
|
+
out.add(target);
|
|
86
|
+
}
|
|
87
|
+
if (out.size > 0) outgoing.set(slug, out);
|
|
88
|
+
for (const target of out) {
|
|
89
|
+
ensureSet(incoming, target).add(slug);
|
|
90
|
+
}
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const index: EdgeIndex = { outgoing, incoming };
|
|
95
|
+
cache = { workspaceDir, index };
|
|
96
|
+
return index;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Clear the cached index. Pass a `workspaceDir` to scope the invalidation to
|
|
101
|
+
* a specific cache entry (relevant when tests cycle through multiple
|
|
102
|
+
* workspaces); omit it to clear unconditionally.
|
|
103
|
+
*/
|
|
104
|
+
export function invalidateEdgeIndex(workspaceDir?: string): void {
|
|
105
|
+
if (!cache) return;
|
|
106
|
+
if (workspaceDir === undefined || cache.workspaceDir === workspaceDir) {
|
|
107
|
+
cache = null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export type EdgeDirection = "out" | "in";
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Iterative BFS returning every slug reachable from `slug` within `hops`
|
|
115
|
+
* directed edges, walking either outgoing or incoming adjacency. The start
|
|
116
|
+
* slug is excluded from the result; orphan nodes return the empty set.
|
|
117
|
+
*
|
|
118
|
+
* `hops` is clamped at 0 — non-positive values collapse to an empty result so
|
|
119
|
+
* callers don't need to special-case it.
|
|
120
|
+
*/
|
|
121
|
+
export function getReachable(
|
|
122
|
+
index: EdgeIndex,
|
|
123
|
+
slug: string,
|
|
124
|
+
hops: number,
|
|
125
|
+
direction: EdgeDirection,
|
|
126
|
+
): Set<string> {
|
|
127
|
+
const result = new Set<string>();
|
|
128
|
+
if (hops <= 0) return result;
|
|
129
|
+
|
|
130
|
+
const adjacency = direction === "out" ? index.outgoing : index.incoming;
|
|
131
|
+
const visited = new Set<string>([slug]);
|
|
132
|
+
let frontier: string[] = [slug];
|
|
133
|
+
|
|
134
|
+
for (let depth = 0; depth < hops && frontier.length > 0; depth++) {
|
|
135
|
+
const next: string[] = [];
|
|
136
|
+
for (const node of frontier) {
|
|
137
|
+
const neighbors = adjacency.get(node);
|
|
138
|
+
if (!neighbors) continue;
|
|
139
|
+
for (const neighbor of neighbors) {
|
|
140
|
+
if (visited.has(neighbor)) continue;
|
|
141
|
+
visited.add(neighbor);
|
|
142
|
+
result.add(neighbor);
|
|
143
|
+
next.push(neighbor);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
frontier = next;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface EdgeValidationResult {
|
|
153
|
+
ok: boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Outgoing-edge targets that don't correspond to any known slug. Sorted by
|
|
156
|
+
* `(from, to)` for deterministic output.
|
|
157
|
+
*/
|
|
158
|
+
missing: Array<{ from: string; to: string }>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Validate every outgoing edge target against `knownSlugs`. Returns a sorted
|
|
163
|
+
* list of `(from, to)` pairs whose `to` slug has no corresponding concept
|
|
164
|
+
* page on disk.
|
|
165
|
+
*/
|
|
166
|
+
export function validateEdgeTargets(
|
|
167
|
+
index: EdgeIndex,
|
|
168
|
+
knownSlugs: ReadonlySet<string>,
|
|
169
|
+
): EdgeValidationResult {
|
|
170
|
+
const missing: Array<{ from: string; to: string }> = [];
|
|
171
|
+
const sources = [...index.outgoing.keys()].sort();
|
|
172
|
+
for (const from of sources) {
|
|
173
|
+
const targets = [...(index.outgoing.get(from) ?? [])].sort();
|
|
174
|
+
for (const to of targets) {
|
|
175
|
+
if (!knownSlugs.has(to)) missing.push({ from, to });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { ok: missing.length === 0, missing };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Total count of directed edges in the index — i.e. the sum of every page's
|
|
183
|
+
* outgoing-edge fanout. Each (from, to) pair counts once.
|
|
184
|
+
*/
|
|
185
|
+
export function totalEdgeCount(index: EdgeIndex): number {
|
|
186
|
+
let n = 0;
|
|
187
|
+
for (const targets of index.outgoing.values()) {
|
|
188
|
+
n += targets.size;
|
|
189
|
+
}
|
|
190
|
+
return n;
|
|
191
|
+
}
|