@vellumai/assistant 0.8.0 → 0.8.2
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/AGENTS.md +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -34,7 +34,9 @@ import {
|
|
|
34
34
|
embedWithBackend,
|
|
35
35
|
generateSparseEmbedding,
|
|
36
36
|
} from "../embedding-backend.js";
|
|
37
|
+
import { invalidatePageIndex } from "./page-index.js";
|
|
37
38
|
import {
|
|
39
|
+
backfillKindOnPointsWithPrefix,
|
|
38
40
|
pruneSlugsWithPrefixExcept,
|
|
39
41
|
upsertConceptPageEmbedding,
|
|
40
42
|
} from "./qdrant.js";
|
|
@@ -42,6 +44,10 @@ import {
|
|
|
42
44
|
augmentMcpSetupDescription,
|
|
43
45
|
buildSkillContent,
|
|
44
46
|
} from "./skill-content.js";
|
|
47
|
+
import {
|
|
48
|
+
generateBm25DocEmbedding,
|
|
49
|
+
getConceptPageCorpusStats,
|
|
50
|
+
} from "./sparse-bm25.js";
|
|
45
51
|
import type { SkillEntry } from "./types.js";
|
|
46
52
|
|
|
47
53
|
const log = getLogger("memory-v2-skill-store");
|
|
@@ -54,6 +60,14 @@ const log = getLogger("memory-v2-skill-store");
|
|
|
54
60
|
*/
|
|
55
61
|
export const SKILL_SLUG_PREFIX = "skills/";
|
|
56
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Payload discriminator written on every skill-seeded Qdrant point. Keeps
|
|
65
|
+
* skill rows distinguishable from user-authored concept pages that happen to
|
|
66
|
+
* be slugged under `skills/...`, so prefix pruning never deletes a hand-
|
|
67
|
+
* authored page sitting in the same namespace.
|
|
68
|
+
*/
|
|
69
|
+
const SKILL_PAYLOAD_KIND = "skill";
|
|
70
|
+
|
|
57
71
|
/** Compose the unified-collection slug for a skill id. */
|
|
58
72
|
export function skillSlugFor(id: string): string {
|
|
59
73
|
return `${SKILL_SLUG_PREFIX}${id}`;
|
|
@@ -65,13 +79,34 @@ export function skillSlugFor(id: string): string {
|
|
|
65
79
|
* successful re-seed so callers always see a consistent snapshot.
|
|
66
80
|
*/
|
|
67
81
|
let entries: Map<string, SkillEntry> | null = null;
|
|
82
|
+
let requestedSeedGeneration = 0;
|
|
83
|
+
let processedSeedGeneration = 0;
|
|
84
|
+
let activeSeedDrain: Promise<void> | null = null;
|
|
85
|
+
let lastSeedError: unknown = null;
|
|
86
|
+
const seedWaiters: Array<{ generation: number; resolve: () => void }> = [];
|
|
68
87
|
|
|
69
88
|
/**
|
|
70
89
|
* Seed (or re-seed) skill embeddings into the unified concept-page collection.
|
|
71
|
-
* Idempotent
|
|
72
|
-
*
|
|
90
|
+
* Idempotent. Defaults to best-effort (errors are logged but swallowed) for
|
|
91
|
+
* background callers like daemon startup; pass `{ throwOnError: true }` from
|
|
92
|
+
* synchronous CLI-driven paths that need to surface failures to the operator.
|
|
73
93
|
*
|
|
74
|
-
*
|
|
94
|
+
* Single-flight + coalesced: at most one seed runs at a time. Requests made
|
|
95
|
+
* while a seed is in flight advance the requested generation; stale in-flight
|
|
96
|
+
* snapshots are skipped before they write embeddings or replace the cache,
|
|
97
|
+
* then the drain loop immediately processes the latest generation. Strict
|
|
98
|
+
* callers observe the awaited generation's latest outcome via `lastSeedError`.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* In-process latch for the legacy `kind` backfill (see
|
|
103
|
+
* {@link backfillKindOnPointsWithPrefix}). New upserts always write `kind`,
|
|
104
|
+
* so once the latch is set there is no follow-up work to do this process.
|
|
105
|
+
*/
|
|
106
|
+
let legacyKindBackfillDone = false;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Steps (per run):
|
|
75
110
|
* 1. Enumerate the local skill catalog and resolve each skill's enabled
|
|
76
111
|
* state (`resolveSkillStates`).
|
|
77
112
|
* 2. Build a `SkillEntry` per enabled skill, applying the mcp-setup
|
|
@@ -90,7 +125,49 @@ let entries: Map<string, SkillEntry> | null = null;
|
|
|
90
125
|
* stale points from prior catalog state (e.g. uninstalled skills).
|
|
91
126
|
* 7. Replace the module-level `entries` cache with the freshly built map.
|
|
92
127
|
*/
|
|
93
|
-
export async function seedV2SkillEntries(
|
|
128
|
+
export async function seedV2SkillEntries(
|
|
129
|
+
opts: { throwOnError?: boolean } = {},
|
|
130
|
+
): Promise<void> {
|
|
131
|
+
const generation = ++requestedSeedGeneration;
|
|
132
|
+
const waiter = new Promise<void>((resolve) => {
|
|
133
|
+
seedWaiters.push({ generation, resolve });
|
|
134
|
+
});
|
|
135
|
+
startSeedDrainIfNeeded();
|
|
136
|
+
await waiter;
|
|
137
|
+
if (opts.throwOnError && lastSeedError) {
|
|
138
|
+
throw lastSeedError;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function startSeedDrainIfNeeded(): void {
|
|
143
|
+
if (activeSeedDrain) return;
|
|
144
|
+
if (processedSeedGeneration >= requestedSeedGeneration) return;
|
|
145
|
+
|
|
146
|
+
activeSeedDrain = drainSeedQueue().finally(() => {
|
|
147
|
+
activeSeedDrain = null;
|
|
148
|
+
startSeedDrainIfNeeded();
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function drainSeedQueue(): Promise<void> {
|
|
153
|
+
while (processedSeedGeneration < requestedSeedGeneration) {
|
|
154
|
+
const generationToProcess = requestedSeedGeneration;
|
|
155
|
+
await runSeedV2SkillEntries(generationToProcess);
|
|
156
|
+
processedSeedGeneration = generationToProcess;
|
|
157
|
+
resolveSeedWaiters();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function resolveSeedWaiters(): void {
|
|
162
|
+
for (let i = seedWaiters.length - 1; i >= 0; i -= 1) {
|
|
163
|
+
const waiter = seedWaiters[i]!;
|
|
164
|
+
if (waiter.generation > processedSeedGeneration) continue;
|
|
165
|
+
seedWaiters.splice(i, 1);
|
|
166
|
+
waiter.resolve();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function runSeedV2SkillEntries(generation: number): Promise<void> {
|
|
94
171
|
try {
|
|
95
172
|
const config = getConfig();
|
|
96
173
|
const catalog = loadSkillCatalog();
|
|
@@ -118,11 +195,19 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
118
195
|
// Seed uninstalled catalog skills so their activation hints are
|
|
119
196
|
// discoverable by intent. Track whether the catalog was available so we
|
|
120
197
|
// can guard pruning below.
|
|
198
|
+
//
|
|
199
|
+
// Build the legacy-backfill allowlist in parallel: every locally
|
|
200
|
+
// installed skill id (regardless of enabled state) plus every remote
|
|
201
|
+
// catalog id. Restricting the backfill to this set keeps user-authored
|
|
202
|
+
// concept pages that happen to live under `skills/<slug>` from being
|
|
203
|
+
// mis-tagged and then pruned. See `backfillKindOnPointsWithPrefix`.
|
|
204
|
+
const knownSkillIds = new Set<string>(installedIds);
|
|
121
205
|
let catalogAvailable = false;
|
|
122
206
|
try {
|
|
123
207
|
const fullCatalog = await getCatalog();
|
|
124
208
|
catalogAvailable = fullCatalog.length > 0;
|
|
125
209
|
for (const entry of fullCatalog) {
|
|
210
|
+
knownSkillIds.add(entry.id);
|
|
126
211
|
if (installedIds.has(entry.id)) continue;
|
|
127
212
|
const flagKey = entry.metadata?.vellum?.["feature-flag"];
|
|
128
213
|
if (flagKey && !isAssistantFeatureFlagEnabled(flagKey, config))
|
|
@@ -137,32 +222,68 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
137
222
|
);
|
|
138
223
|
}
|
|
139
224
|
|
|
140
|
-
// Embed all content strings in one batched call
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
seeds.map((s) => s.content),
|
|
145
|
-
);
|
|
146
|
-
const denseVectors = await Promise.all(
|
|
147
|
-
embedded.vectors.map((v) =>
|
|
148
|
-
applyCorrectionIfCalibrated(v, embedded.provider, embedded.model),
|
|
149
|
-
),
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
const now = Date.now();
|
|
225
|
+
// Embed all content strings in one batched call when there is anything to
|
|
226
|
+
// embed. Skipping the call when `seeds` is empty avoids throwing on an
|
|
227
|
+
// unavailable embedding backend in the all-disabled case, so pruning and
|
|
228
|
+
// cache replacement still run and clear stale state.
|
|
153
229
|
const nextEntries = new Map<string, SkillEntry>();
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
230
|
+
let denseVectors: number[][] = [];
|
|
231
|
+
let encodeSparse: (
|
|
232
|
+
input: string,
|
|
233
|
+
) => ReturnType<typeof generateSparseEmbedding> = generateSparseEmbedding;
|
|
234
|
+
if (seeds.length > 0) {
|
|
235
|
+
const embedded = await embedWithBackend(
|
|
236
|
+
config,
|
|
237
|
+
seeds.map((s) => s.content),
|
|
238
|
+
);
|
|
239
|
+
denseVectors = await Promise.all(
|
|
240
|
+
embedded.vectors.map((v) =>
|
|
241
|
+
applyCorrectionIfCalibrated(v, embedded.provider, embedded.model),
|
|
242
|
+
),
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
// Skills share the concept-page Qdrant collection, so the sparse vector
|
|
246
|
+
// must use the same stemmed BM25 encoding the concept-page documents
|
|
247
|
+
// carry — otherwise the stemmed BM25 query vectors used by callers (see
|
|
248
|
+
// `simBatch`, `activation.selectCandidates`, recall) hash to different
|
|
249
|
+
// buckets than the stored skill vectors and skip the sparse channel
|
|
250
|
+
// entirely. Fall back to the legacy TF encoder only during the cold-start
|
|
251
|
+
// window before corpus stats finish building.
|
|
252
|
+
const corpusStats = getConceptPageCorpusStats();
|
|
253
|
+
encodeSparse = (input: string) =>
|
|
254
|
+
corpusStats
|
|
255
|
+
? generateBm25DocEmbedding(input, corpusStats, {
|
|
256
|
+
k1: config.memory.v2.bm25_k1,
|
|
257
|
+
b: config.memory.v2.bm25_b,
|
|
258
|
+
})
|
|
259
|
+
: generateSparseEmbedding(input);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (generation !== requestedSeedGeneration) {
|
|
263
|
+
log.info(
|
|
264
|
+
{ generation, latestGeneration: requestedSeedGeneration },
|
|
265
|
+
"Skipping stale v2 skill seed result",
|
|
266
|
+
);
|
|
267
|
+
lastSeedError = null;
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (seeds.length > 0) {
|
|
272
|
+
const now = Date.now();
|
|
273
|
+
await Promise.all(
|
|
274
|
+
seeds.map((seed, i) =>
|
|
275
|
+
upsertConceptPageEmbedding({
|
|
276
|
+
slug: skillSlugFor(seed.id),
|
|
277
|
+
dense: denseVectors[i],
|
|
278
|
+
sparse: encodeSparse(seed.content),
|
|
279
|
+
updatedAt: now,
|
|
280
|
+
kind: SKILL_PAYLOAD_KIND,
|
|
281
|
+
}),
|
|
282
|
+
),
|
|
283
|
+
);
|
|
284
|
+
for (const seed of seeds) {
|
|
285
|
+
nextEntries.set(seed.id, seed);
|
|
286
|
+
}
|
|
166
287
|
}
|
|
167
288
|
|
|
168
289
|
// Prune stale skill slugs. When the catalog is unavailable (empty array
|
|
@@ -170,9 +291,29 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
170
291
|
// uninstalled catalog skills should exist, so skip pruning entirely to
|
|
171
292
|
// avoid aggressively removing previously-seeded catalog skill embeddings.
|
|
172
293
|
if (catalogAvailable) {
|
|
294
|
+
// Tag legacy skill points missing `payload.kind` before pruning so the
|
|
295
|
+
// kind-scoped prune can see them. Once-per-process; the backfill is
|
|
296
|
+
// idempotent (server-side `is_empty` filter), so a partial failure
|
|
297
|
+
// converges on retry.
|
|
298
|
+
if (!legacyKindBackfillDone) {
|
|
299
|
+
try {
|
|
300
|
+
await backfillKindOnPointsWithPrefix(
|
|
301
|
+
SKILL_SLUG_PREFIX,
|
|
302
|
+
SKILL_PAYLOAD_KIND,
|
|
303
|
+
knownSkillIds,
|
|
304
|
+
);
|
|
305
|
+
legacyKindBackfillDone = true;
|
|
306
|
+
} catch (err) {
|
|
307
|
+
log.warn(
|
|
308
|
+
{ err },
|
|
309
|
+
"Failed to backfill kind on legacy skill points — pruning may leave orphans this run",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
173
313
|
await pruneSlugsWithPrefixExcept(
|
|
174
314
|
SKILL_SLUG_PREFIX,
|
|
175
315
|
seeds.map((s) => s.id),
|
|
316
|
+
{ kind: SKILL_PAYLOAD_KIND },
|
|
176
317
|
);
|
|
177
318
|
} else {
|
|
178
319
|
log.info(
|
|
@@ -182,7 +323,13 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
182
323
|
|
|
183
324
|
// Atomically replace the cache only after every step above succeeds.
|
|
184
325
|
entries = nextEntries;
|
|
326
|
+
// Drop the page-index cache so the next router invocation observes the
|
|
327
|
+
// freshly seeded skill set (skill entries share the unified concept-page
|
|
328
|
+
// collection and surface in the same index).
|
|
329
|
+
invalidatePageIndex();
|
|
330
|
+
lastSeedError = null;
|
|
185
331
|
} catch (err) {
|
|
332
|
+
lastSeedError = err;
|
|
186
333
|
log.warn({ err }, "Failed to seed v2 skill entries");
|
|
187
334
|
}
|
|
188
335
|
}
|
|
@@ -195,12 +342,16 @@ export async function seedV2SkillEntries(): Promise<void> {
|
|
|
195
342
|
* Accepts either a bare skill id (`example-skill`) or its unified-collection
|
|
196
343
|
* slug (`skills/example-skill`) so render-side callers can pass through what
|
|
197
344
|
* they have without a manual prefix strip.
|
|
345
|
+
*
|
|
346
|
+
* Returns a frozen copy so callers cannot mutate the underlying cache entry
|
|
347
|
+
* — matches the defensive-copy contract of `listSkillEntries`.
|
|
198
348
|
*/
|
|
199
349
|
export function getSkillCapability(idOrSlug: string): SkillEntry | null {
|
|
200
350
|
const id = idOrSlug.startsWith(SKILL_SLUG_PREFIX)
|
|
201
351
|
? idOrSlug.slice(SKILL_SLUG_PREFIX.length)
|
|
202
352
|
: idOrSlug;
|
|
203
|
-
|
|
353
|
+
const entry = entries?.get(id);
|
|
354
|
+
return entry ? Object.freeze({ ...entry }) : null;
|
|
204
355
|
}
|
|
205
356
|
|
|
206
357
|
/** True iff the slug refers to a skill entry in the unified collection. */
|
|
@@ -208,7 +359,30 @@ export function isSkillSlug(slug: string): boolean {
|
|
|
208
359
|
return slug.startsWith(SKILL_SLUG_PREFIX);
|
|
209
360
|
}
|
|
210
361
|
|
|
362
|
+
/**
|
|
363
|
+
* Snapshot of the in-process skill cache, sorted by skill id (ASCII order)
|
|
364
|
+
* for determinism. Returns a freshly allocated array of frozen entry copies
|
|
365
|
+
* on each call, so callers cannot mutate the underlying cache — neither by
|
|
366
|
+
* reassigning the array nor by writing through entry fields.
|
|
367
|
+
*
|
|
368
|
+
* The cache is replaced atomically by `seedV2SkillEntries`, so a snapshot
|
|
369
|
+
* may be stale once a subsequent seed run completes. Callers that need
|
|
370
|
+
* up-to-the-moment state must re-call this after awaiting the seed.
|
|
371
|
+
*/
|
|
372
|
+
export function listSkillEntries(): SkillEntry[] {
|
|
373
|
+
if (!entries) return [];
|
|
374
|
+
return [...entries.values()]
|
|
375
|
+
.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
|
|
376
|
+
.map((entry) => Object.freeze({ ...entry }));
|
|
377
|
+
}
|
|
378
|
+
|
|
211
379
|
/** @internal Test-only: clear the module-level cache. */
|
|
212
380
|
export function _resetSkillStoreForTests(): void {
|
|
213
381
|
entries = null;
|
|
382
|
+
requestedSeedGeneration = 0;
|
|
383
|
+
processedSeedGeneration = 0;
|
|
384
|
+
activeSeedDrain = null;
|
|
385
|
+
seedWaiters.splice(0, seedWaiters.length);
|
|
386
|
+
lastSeedError = null;
|
|
387
|
+
legacyKindBackfillDone = false;
|
|
214
388
|
}
|
|
@@ -60,19 +60,26 @@ export function readMemoryV2StaticContent(): string | null {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
-
*
|
|
64
|
-
* (essentials/threads/recent/buffer)
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
63
|
+
* Trust-class predicate for personal-memory injection. Personal memory
|
|
64
|
+
* spans v2 static blocks (essentials/threads/recent/buffer), the PKB
|
|
65
|
+
* context, and NOW.md — all of which can hold private user content. Block
|
|
66
|
+
* injection when a non-guardian actor reaches the assistant over a remote
|
|
67
|
+
* channel — otherwise the model can be prompt-injected into reciting
|
|
68
|
+
* private memory. Internal flows (`sourceChannel: "vellum"`) and turns
|
|
69
|
+
* with no trust context pass through unchanged; this gate exists only to
|
|
70
|
+
* keep remote untrusted actors out.
|
|
71
|
+
*
|
|
72
|
+
* This is the trust-only gate. Cadence (first-turn / post-compaction) is
|
|
73
|
+
* applied separately by the caller so that the freshest content remains
|
|
74
|
+
* available for re-injection after a mid-turn reducer-triggered compaction
|
|
75
|
+
* — the initial-injection turn may not have been a `shouldInjectNowAndPkb`
|
|
76
|
+
* turn, but compaction strips the existing personal-memory blocks and we
|
|
77
|
+
* still need the freshest content to re-inject.
|
|
69
78
|
*/
|
|
70
|
-
export function
|
|
71
|
-
shouldInjectNowAndPkb: boolean;
|
|
79
|
+
export function shouldExposePersonalMemory(args: {
|
|
72
80
|
sourceChannel: ChannelId | undefined;
|
|
73
81
|
isTrustedActor: boolean;
|
|
74
82
|
}): boolean {
|
|
75
|
-
if (!args.shouldInjectNowAndPkb) return false;
|
|
76
83
|
const isRemoteUntrustedActor =
|
|
77
84
|
args.sourceChannel !== undefined &&
|
|
78
85
|
args.sourceChannel !== "vellum" &&
|
|
@@ -22,11 +22,15 @@
|
|
|
22
22
|
import { readFileSync } from "node:fs";
|
|
23
23
|
import { join } from "node:path";
|
|
24
24
|
|
|
25
|
-
import { desc, gt } from "drizzle-orm";
|
|
25
|
+
import { and, desc, eq, gt, notInArray } from "drizzle-orm";
|
|
26
26
|
import { z } from "zod";
|
|
27
27
|
|
|
28
28
|
import type { AssistantConfig } from "../../config/types.js";
|
|
29
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
getAssistantName,
|
|
31
|
+
resolveUserName,
|
|
32
|
+
} from "../../daemon/identity-helpers.js";
|
|
33
|
+
import { emitNotificationSignal } from "../../notifications/emit-signal.js";
|
|
30
34
|
import {
|
|
31
35
|
extractToolUse,
|
|
32
36
|
getConfiguredProvider,
|
|
@@ -41,11 +45,15 @@ import {
|
|
|
41
45
|
formatRememberEntry,
|
|
42
46
|
} from "../graph/tool-handlers.js";
|
|
43
47
|
import type { MemoryJob } from "../jobs-store.js";
|
|
44
|
-
import {
|
|
48
|
+
import { stringifyMessageContent } from "../message-content.js";
|
|
49
|
+
import { conversations, messages } from "../schema.js";
|
|
45
50
|
import { renderSweepPrompt } from "./prompts/sweep.js";
|
|
46
51
|
|
|
47
52
|
const log = getLogger("memory-v2-sweep");
|
|
48
53
|
|
|
54
|
+
/** Stable job identifier surfaced in `activity.failed` notifications. */
|
|
55
|
+
const JOB_NAME = "memory.v2.sweep";
|
|
56
|
+
|
|
49
57
|
/** Window of conversation history the sweep inspects on each run. */
|
|
50
58
|
const RECENT_MESSAGES_WINDOW_MS = 30 * 60 * 1000;
|
|
51
59
|
|
|
@@ -100,7 +108,7 @@ const SweepResultSchema = z.object({
|
|
|
100
108
|
* progress without inspecting the filesystem.
|
|
101
109
|
*/
|
|
102
110
|
export async function memoryV2SweepJob(
|
|
103
|
-
|
|
111
|
+
job: MemoryJob,
|
|
104
112
|
config: AssistantConfig,
|
|
105
113
|
): Promise<number> {
|
|
106
114
|
if (!config.memory?.v2?.enabled) {
|
|
@@ -115,59 +123,116 @@ export async function memoryV2SweepJob(
|
|
|
115
123
|
|
|
116
124
|
const workspaceDir = getWorkspaceDir();
|
|
117
125
|
const memoryDir = join(workspaceDir, "memory");
|
|
118
|
-
const recentText = loadRecentMessagesText(Date.now());
|
|
119
|
-
if (!recentText) {
|
|
120
|
-
log.debug("No recent messages in window; sweep skipped");
|
|
121
|
-
return 0;
|
|
122
|
-
}
|
|
123
126
|
|
|
124
|
-
|
|
127
|
+
// Once we're committed to running (past the flag/feature gates), any
|
|
128
|
+
// unexpected error is surfaced via an `activity.failed` notification —
|
|
129
|
+
// mirrors v1 filing's post-migration treatment, but hand-rolled because
|
|
130
|
+
// the sweep makes a single forced-tool `provider.sendMessage` call rather
|
|
131
|
+
// than driving a conversation through `runBackgroundJob`. The function
|
|
132
|
+
// continues to return 0 on caught failures (preserving the existing
|
|
133
|
+
// silent-failure contract); only the notification side-effect is new.
|
|
134
|
+
try {
|
|
135
|
+
const recentText = loadRecentMessagesText(Date.now());
|
|
136
|
+
if (!recentText) {
|
|
137
|
+
log.debug("No recent messages in window; sweep skipped");
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const existingBuffer = readBufferText(memoryDir);
|
|
125
142
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
143
|
+
const provider = await getConfiguredProvider("memoryV2Sweep");
|
|
144
|
+
if (!provider) {
|
|
145
|
+
log.warn("memoryV2Sweep provider unavailable; sweep skipped");
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
131
148
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
149
|
+
const systemPrompt = renderSweepPrompt({
|
|
150
|
+
assistantName: getAssistantName(),
|
|
151
|
+
userName: resolveUserName(workspaceDir),
|
|
152
|
+
});
|
|
153
|
+
const userText =
|
|
154
|
+
`## existingBuffer\n\n${existingBuffer || "(empty)"}\n\n` +
|
|
155
|
+
`## recentMessages\n\n${recentText}`;
|
|
139
156
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
157
|
+
const response = await provider.sendMessage(
|
|
158
|
+
[userMessage(userText)],
|
|
159
|
+
[SWEEP_TOOL],
|
|
160
|
+
systemPrompt,
|
|
161
|
+
{
|
|
162
|
+
config: {
|
|
163
|
+
callSite: "memoryV2Sweep" as const,
|
|
164
|
+
tool_choice: { type: "tool" as const, name: SWEEP_TOOL_NAME },
|
|
165
|
+
},
|
|
148
166
|
},
|
|
149
|
-
|
|
150
|
-
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const toolBlock = extractToolUse(response);
|
|
170
|
+
if (!toolBlock || toolBlock.name !== SWEEP_TOOL_NAME) {
|
|
171
|
+
log.debug("Sweep model returned no tool_use block");
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
const parsed = SweepResultSchema.safeParse(toolBlock.input);
|
|
175
|
+
if (!parsed.success) {
|
|
176
|
+
log.warn(
|
|
177
|
+
{ error: parsed.error.message },
|
|
178
|
+
"Sweep tool input did not match schema",
|
|
179
|
+
);
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
151
182
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
183
|
+
const written = appendEntries(memoryDir, parsed.data.entries);
|
|
184
|
+
if (written > 0) {
|
|
185
|
+
log.info({ written }, "Memory v2 sweep wrote new buffer entries");
|
|
186
|
+
}
|
|
187
|
+
return written;
|
|
188
|
+
} catch (err) {
|
|
189
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
190
|
+
log.error({ err }, "memory v2 sweep failed");
|
|
191
|
+
emitSweepActivityFailed({
|
|
192
|
+
jobId: job.id,
|
|
193
|
+
errorMessage,
|
|
194
|
+
});
|
|
155
195
|
return 0;
|
|
156
196
|
}
|
|
157
|
-
|
|
158
|
-
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Emit an `activity.failed` notification for a failed sweep run. Mirrors
|
|
201
|
+
* the shape `runBackgroundJob` produces for its own failures so the home
|
|
202
|
+
* feed and native notifications stay consistent regardless of which code
|
|
203
|
+
* path executed the work. Fire-and-forget — a notification failure must
|
|
204
|
+
* never break sweep operation.
|
|
205
|
+
*/
|
|
206
|
+
function emitSweepActivityFailed(args: {
|
|
207
|
+
jobId: string;
|
|
208
|
+
errorMessage: string;
|
|
209
|
+
}): void {
|
|
210
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
211
|
+
emitNotificationSignal({
|
|
212
|
+
sourceChannel: "scheduler",
|
|
213
|
+
sourceContextId: args.jobId,
|
|
214
|
+
sourceEventName: "activity.failed",
|
|
215
|
+
dedupeKey: `activity-failed:${JOB_NAME}:${day}`,
|
|
216
|
+
contextPayload: {
|
|
217
|
+
jobName: JOB_NAME,
|
|
218
|
+
errorMessage: args.errorMessage,
|
|
219
|
+
errorKind: "exception",
|
|
220
|
+
},
|
|
221
|
+
attentionHints: {
|
|
222
|
+
requiresAction: false,
|
|
223
|
+
urgency: "medium",
|
|
224
|
+
isAsyncBackground: true,
|
|
225
|
+
visibleInSourceNow: false,
|
|
226
|
+
},
|
|
227
|
+
}).catch((emitErr) => {
|
|
159
228
|
log.warn(
|
|
160
|
-
{
|
|
161
|
-
|
|
229
|
+
{
|
|
230
|
+
err: emitErr instanceof Error ? emitErr.message : String(emitErr),
|
|
231
|
+
jobId: args.jobId,
|
|
232
|
+
},
|
|
233
|
+
"Failed to emit activity.failed notification for memory v2 sweep",
|
|
162
234
|
);
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const written = appendEntries(memoryDir, parsed.data.entries);
|
|
167
|
-
if (written > 0) {
|
|
168
|
-
log.info({ written }, "Memory v2 sweep wrote new buffer entries");
|
|
169
|
-
}
|
|
170
|
-
return written;
|
|
235
|
+
});
|
|
171
236
|
}
|
|
172
237
|
|
|
173
238
|
/**
|
|
@@ -219,14 +284,22 @@ function loadRecentMessagesText(nowMs: number): string {
|
|
|
219
284
|
const db = getDb();
|
|
220
285
|
// Pull newest-first then reverse for chronological output. Bounding the
|
|
221
286
|
// initial limit (1000) defends against pathological busy windows where a
|
|
222
|
-
// naive scan would touch every recent message.
|
|
287
|
+
// naive scan would touch every recent message. Joining conversations and
|
|
288
|
+
// excluding background/scheduled types keeps automation chatter
|
|
289
|
+
// (heartbeats, filing, update bulletins, scheduled jobs) out of buffer.md.
|
|
223
290
|
const rows = db
|
|
224
291
|
.select({
|
|
225
292
|
role: messages.role,
|
|
226
293
|
content: messages.content,
|
|
227
294
|
})
|
|
228
295
|
.from(messages)
|
|
229
|
-
.
|
|
296
|
+
.innerJoin(conversations, eq(messages.conversationId, conversations.id))
|
|
297
|
+
.where(
|
|
298
|
+
and(
|
|
299
|
+
gt(messages.createdAt, cutoff),
|
|
300
|
+
notInArray(conversations.conversationType, ["background", "scheduled"]),
|
|
301
|
+
),
|
|
302
|
+
)
|
|
230
303
|
.orderBy(desc(messages.createdAt))
|
|
231
304
|
.limit(1000)
|
|
232
305
|
.all();
|
|
@@ -248,50 +321,3 @@ function loadRecentMessagesText(nowMs: number): string {
|
|
|
248
321
|
}
|
|
249
322
|
return joined;
|
|
250
323
|
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Coerce stored message content (JSON-serialized `ContentBlock[]` *or* plain
|
|
254
|
-
* string in legacy rows) into a single text string. Image / tool blocks are
|
|
255
|
-
* dropped — the sweep model only needs the spoken context.
|
|
256
|
-
*/
|
|
257
|
-
function stringifyMessageContent(stored: string): string {
|
|
258
|
-
let parsed: unknown;
|
|
259
|
-
try {
|
|
260
|
-
parsed = JSON.parse(stored);
|
|
261
|
-
} catch {
|
|
262
|
-
return stored.trim();
|
|
263
|
-
}
|
|
264
|
-
if (typeof parsed === "string") return parsed.trim();
|
|
265
|
-
if (!Array.isArray(parsed)) return "";
|
|
266
|
-
const parts: string[] = [];
|
|
267
|
-
for (const block of parsed) {
|
|
268
|
-
if (
|
|
269
|
-
block &&
|
|
270
|
-
typeof block === "object" &&
|
|
271
|
-
(block as { type?: string }).type === "text" &&
|
|
272
|
-
typeof (block as { text?: unknown }).text === "string"
|
|
273
|
-
) {
|
|
274
|
-
parts.push((block as { text: string }).text);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
return parts.join("\n").trim();
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Read the guardian's display name from `users/default.md`. We look for the
|
|
282
|
-
* markdown-bold "Name" label (matching the IDENTITY.md convention) and fall
|
|
283
|
-
* back to `null` on any miss; the prompt template substitutes a generic
|
|
284
|
-
* label.
|
|
285
|
-
*/
|
|
286
|
-
function resolveUserName(workspaceDir: string): string | null {
|
|
287
|
-
try {
|
|
288
|
-
const content = readFileSync(
|
|
289
|
-
join(workspaceDir, "users", "default.md"),
|
|
290
|
-
"utf-8",
|
|
291
|
-
);
|
|
292
|
-
const match = content.match(/\*\*Name:\*\*\s*(.+)/);
|
|
293
|
-
return match?.[1]?.trim() || null;
|
|
294
|
-
} catch {
|
|
295
|
-
return null;
|
|
296
|
-
}
|
|
297
|
-
}
|
package/src/memory/v2/types.ts
CHANGED
|
@@ -25,7 +25,8 @@ import { z } from "zod";
|
|
|
25
25
|
* `edges:` means "activating A pulls in B" — activation flows A → B but not
|
|
26
26
|
* B → A. The full graph is the union of every page's `edges:` list — there
|
|
27
27
|
* is no separate edges-index file. `ref_files` lists paths to attached media
|
|
28
|
-
* (images, audio, etc.).
|
|
28
|
+
* (images, audio, etc.). `ref_urls` lists external URL references (e.g.
|
|
29
|
+
* citations, source links).
|
|
29
30
|
*
|
|
30
31
|
* `summary` is a 1-4 sentence prose description of the page. When present,
|
|
31
32
|
* retrieval injects the path + summary instead of the full page so the agent
|
|
@@ -33,11 +34,14 @@ import { z } from "zod";
|
|
|
33
34
|
* the summary field still parse — those fall back to full-page injection and
|
|
34
35
|
* full-page-only similarity.
|
|
35
36
|
*/
|
|
36
|
-
export const ConceptPageFrontmatterSchema = z
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
export const ConceptPageFrontmatterSchema = z
|
|
38
|
+
.object({
|
|
39
|
+
edges: z.array(z.string()).default([]),
|
|
40
|
+
ref_files: z.array(z.string()).default([]),
|
|
41
|
+
ref_urls: z.array(z.string().url()).default([]),
|
|
42
|
+
summary: z.string().optional(),
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
41
45
|
|
|
42
46
|
export type ConceptPageFrontmatter = z.infer<
|
|
43
47
|
typeof ConceptPageFrontmatterSchema
|