@vellumai/assistant 0.7.3 → 0.8.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/AGENTS.md +11 -0
- package/ARCHITECTURE.md +29 -28
- package/Dockerfile +6 -4
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
- package/bun.lock +3 -0
- package/docker-entrypoint.sh +16 -0
- 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/knip.json +3 -1
- package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
- package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
- package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4126 -959
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +52 -4
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +107 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/annotate-risk-options.test.ts +291 -0
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/approval-cascade.test.ts +8 -16
- package/src/__tests__/approval-routes-http.test.ts +6 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +12 -25
- 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__/call-constants.test.ts +10 -1
- package/src/__tests__/call-controller.test.ts +127 -0
- 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-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +88 -30
- 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__/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 +345 -8
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +14 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +198 -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 +42 -16
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-source.test.ts +3 -26
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-window-manager.test.ts +389 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +3 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +38 -0
- package/src/__tests__/conversation-fork-crud.test.ts +241 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +124 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +22 -7
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -6
- package/src/__tests__/conversation-runtime-assembly.test.ts +19 -10
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +73 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +59 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -7
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- 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__/external-plugin-loader.test.ts +458 -0
- package/src/__tests__/filing-service.test.ts +25 -22
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +10 -34
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/history-repair.test.ts +89 -0
- package/src/__tests__/host-app-control-proxy.test.ts +109 -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__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +154 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
- package/src/__tests__/injector-chain.test.ts +24 -16
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +2 -2
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +169 -67
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +146 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/managed-profile-guard.test.ts +131 -2
- 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__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/notification-decision-fallback.test.ts +91 -0
- package/src/__tests__/notification-decision-strategy.test.ts +22 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -1888
- package/src/__tests__/oauth-commands-routes.test.ts +711 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/plugin-bootstrap.test.ts +31 -2
- package/src/__tests__/plugin-route-contribution.test.ts +31 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
- package/src/__tests__/plugin-types.test.ts +13 -11
- package/src/__tests__/process-message-background-slack.test.ts +46 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
- 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 +164 -2
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +104 -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 +161 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +7 -5
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
- package/src/__tests__/secret-response-routing.test.ts +7 -5
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/server-history-render.test.ts +82 -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-include-graph.test.ts +31 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +42 -16
- package/src/__tests__/skills.test.ts +39 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -42
- package/src/__tests__/tool-executor.test.ts +155 -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 +145 -0
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +3 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +86 -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 +58 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +153 -0
- package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -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-safe-storage-limits-release.test.ts +15 -27
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -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/loop.ts +11 -0
- package/src/approvals/guardian-decision-primitive.ts +0 -13
- package/src/approvals/guardian-request-resolvers.ts +19 -102
- package/src/calls/call-constants.ts +5 -8
- package/src/calls/call-controller.ts +130 -67
- package/src/calls/relay-server.ts +42 -1
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +24 -5
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +1 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -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 +593 -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__/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 +414 -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 +346 -436
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- 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 +163 -517
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +182 -345
- 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/routes.ts +153 -336
- 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/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__/register-command.test.ts +85 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- 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/program.ts +2 -4
- 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 +1 -3
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- 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/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-tool-registry.ts +0 -2
- package/src/config/feature-flag-registry.json +17 -17
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +148 -33
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +4 -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/llm-request-logs.ts +57 -0
- package/src/config/schemas/llm.ts +52 -2
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +33 -2
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/window-manager.ts +191 -5
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +111 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +23 -29
- package/src/daemon/config-watcher.ts +2 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +56 -0
- package/src/daemon/conversation-agent-loop.ts +140 -107
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +68 -13
- package/src/daemon/conversation-process.ts +36 -19
- package/src/daemon/conversation-runtime-assembly.ts +14 -5
- package/src/daemon/conversation-slash.ts +175 -23
- package/src/daemon/conversation-store.ts +17 -10
- package/src/daemon/conversation-surfaces.ts +92 -26
- package/src/daemon/conversation-tool-setup.ts +33 -19
- package/src/daemon/conversation.ts +49 -10
- package/src/daemon/external-plugins-bootstrap.ts +18 -8
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +8 -126
- package/src/daemon/handlers/config-slack-channel.ts +10 -7
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +26 -0
- package/src/daemon/handlers/skills.ts +84 -5
- package/src/daemon/history-repair.ts +33 -6
- package/src/daemon/host-app-control-proxy.ts +44 -19
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +97 -36
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/host-file-proxy.ts +1 -1
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/host-transfer-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +128 -114
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +62 -14
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +12 -9
- package/src/daemon/message-types/messages.ts +28 -2
- package/src/daemon/message-types/sync.ts +60 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/process-message.ts +56 -23
- package/src/daemon/server.ts +23 -18
- package/src/daemon/shutdown-handlers.ts +0 -2
- 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 +35 -1
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +42 -56
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +149 -128
- package/src/home/__tests__/feed-types.test.ts +63 -131
- 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 +19 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +1 -3
- 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 +148 -42
- 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/ipc/skill-server.ts +99 -42
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -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/memory/__tests__/bookmark-crud.test.ts +258 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -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-schedule.test.ts +10 -57
- 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 +213 -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/bookmark-crud.ts +179 -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 +18 -6
- package/src/memory/context-search/sources/memory-v2.ts +40 -31
- package/src/memory/context-search/sources/memory.ts +9 -2
- package/src/memory/context-search/sources/workspace.ts +13 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +312 -10
- package/src/memory/conversation-queries.ts +9 -5
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +2 -1
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +104 -61
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +108 -14
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/graph-search.test.ts +6 -5
- package/src/memory/graph/graph-search.ts +3 -4
- package/src/memory/graph/retriever.test.ts +12 -7
- package/src/memory/graph/retriever.ts +4 -5
- package/src/memory/graph/tool-handlers.ts +20 -11
- package/src/memory/graph/tools.ts +48 -9
- package/src/memory/indexer.ts +18 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +120 -6
- package/src/memory/jobs/embed-concept-page.ts +261 -89
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +60 -7
- package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +97 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- 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 +108 -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/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 +70 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +12 -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/__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 +7 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -5
- package/src/memory/pkb/pkb-search.ts +4 -5
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/qdrant-client.ts +3 -0
- package/src/memory/schema/bookmarks.ts +38 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +29 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +5 -9
- 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 +46 -9
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +140 -163
- 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 +768 -33
- package/src/memory/v2/__tests__/migration.test.ts +7 -3
- package/src/memory/v2/__tests__/page-index.test.ts +277 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +382 -9
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +516 -0
- package/src/memory/v2/__tests__/sim.test.ts +163 -8
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +8 -35
- package/src/memory/v2/__tests__/sweep-job.test.ts +114 -33
- 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 +92 -86
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -115
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +42 -0
- package/src/memory/v2/prompts/consolidation.ts +14 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +307 -133
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +88 -34
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +20 -17
- package/src/memory/v2/sweep-job.ts +127 -102
- package/src/memory/v2/types.ts +16 -5
- package/src/memory/validation.ts +13 -0
- 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 +2 -2
- package/src/notifications/copy-composer.ts +61 -12
- package/src/notifications/decision-engine.ts +46 -0
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +28 -1
- package/src/notifications/home-feed-side-effect.ts +111 -0
- package/src/notifications/signal.ts +5 -0
- package/src/permissions/checker.ts +12 -0
- package/src/permissions/gateway-threshold-reader.ts +116 -8
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/permissions/prompter.ts +86 -96
- package/src/permissions/secret-prompter.ts +31 -31
- package/src/plugin-api/index.ts +13 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +62 -0
- package/src/plugins/defaults/injectors.ts +20 -5
- package/src/plugins/external-plugin-loader.ts +294 -0
- package/src/plugins/types.ts +46 -30
- package/src/plugins/user-loader.ts +64 -41
- package/src/proactive-artifact/job.test.ts +63 -8
- package/src/proactive-artifact/job.ts +20 -2
- package/src/proactive-artifact/message-copy.ts +18 -1
- 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 +105 -0
- package/src/prompts/system-prompt.ts +22 -1
- package/src/prompts/templates/SOUL.md +13 -28
- 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 +288 -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 +95 -26
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +163 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +173 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +356 -0
- package/src/providers/inference/resolve-auth.ts +65 -0
- package/src/providers/model-catalog.ts +104 -6
- package/src/providers/openai/responses-provider.ts +4 -2
- 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 +143 -159
- package/src/providers/retry.ts +18 -10
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- 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 +35 -6
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +304 -8
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +1 -0
- package/src/runtime/channel-approvals.ts +3 -2
- package/src/runtime/guardian-reply-router.ts +0 -10
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/pending-interactions.ts +19 -15
- 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 +251 -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 +315 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
- 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 +147 -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 +6 -2
- package/src/runtime/routes/acp-routes.ts +10 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +7 -21
- 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 +154 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/consolidation-routes.ts +8 -9
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +192 -0
- package/src/runtime/routes/conversation-management-routes.ts +30 -43
- package/src/runtime/routes/conversation-query-routes.ts +373 -82
- package/src/runtime/routes/conversation-routes.ts +31 -10
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-bash-routes.ts +2 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- 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/filing-routes.ts +2 -3
- 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-stages/background-dispatch.test.ts +137 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -7
- package/src/runtime/routes/index.ts +36 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/twilio.ts +1 -0
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-item-routes.test.ts +3 -9
- package/src/runtime/routes/memory-item-routes.ts +5 -6
- package/src/runtime/routes/memory-v2-routes.ts +105 -404
- package/src/runtime/routes/notification-routes.ts +2 -0
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- 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/schedule-routes.ts +82 -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/surface-action-routes.ts +43 -7
- package/src/runtime/routes/tts-routes.ts +67 -0
- 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/sync/resource-sync-events.ts +25 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/scheduler.ts +200 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/secret-patterns.ts +3 -0
- package/src/sequence/engine.ts +38 -40
- package/src/skills/include-graph.ts +35 -13
- package/src/subagent/manager.ts +20 -15
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +15 -4
- 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/document/document-tool.ts +20 -0
- package/src/tools/executor.ts +18 -2
- package/src/tools/memory/register.test.ts +10 -8
- 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 +28 -5
- package/src/tools/skills/load.ts +24 -20
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-name-aliases.ts +19 -0
- package/src/tools/types.ts +19 -1
- package/src/usage/attribution.ts +3 -2
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +301 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +90 -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 +28 -4
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +4 -62
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +34 -0
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
- package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -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/registry.ts +28 -0
- package/src/workspace/migrations/runner.ts +13 -2
- package/src/workspace/migrations/types.ts +13 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -492
- 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 -1201
- 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/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 -477
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { getConfiguredProvider } from "../providers/provider-send-message.js";
|
|
2
|
-
import { getLogger } from "../util/logger.js";
|
|
3
|
-
|
|
4
|
-
const log = getLogger("feed-title-rewriter");
|
|
5
|
-
const REWRITE_TIMEOUT_MS = 3000;
|
|
6
|
-
const REWRITE_MAX_TOKENS = 60;
|
|
7
|
-
|
|
8
|
-
const SYSTEM_PROMPT = `You rewrite raw conversation titles into friendly, human-readable feed item titles.
|
|
9
|
-
Output ONLY the rewritten title — no quotes, no explanation, no preamble.
|
|
10
|
-
Keep it under 10 words. Use plain language.
|
|
11
|
-
If the input is already user-friendly, return it unchanged.
|
|
12
|
-
Examples:
|
|
13
|
-
- "Filing" → "Filed documents to knowledge base"
|
|
14
|
-
- "Heartbeat" → "Ran periodic check-in"
|
|
15
|
-
- "Runtime: process_user_message" → "Processed a message"
|
|
16
|
-
- "Background task" → "Completed a background task"
|
|
17
|
-
- "Scheduled: daily_digest" → "Ran your daily digest"`;
|
|
18
|
-
|
|
19
|
-
export async function rewriteFeedTitle(
|
|
20
|
-
rawTitle: string,
|
|
21
|
-
): Promise<string | null> {
|
|
22
|
-
try {
|
|
23
|
-
const provider = await getConfiguredProvider("feedEventCopy");
|
|
24
|
-
if (!provider) return null;
|
|
25
|
-
|
|
26
|
-
const response = await provider.sendMessage(
|
|
27
|
-
[
|
|
28
|
-
{
|
|
29
|
-
role: "user",
|
|
30
|
-
content: [{ type: "text", text: rawTitle }],
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
[],
|
|
34
|
-
SYSTEM_PROMPT,
|
|
35
|
-
{
|
|
36
|
-
config: {
|
|
37
|
-
max_tokens: REWRITE_MAX_TOKENS,
|
|
38
|
-
callSite: "feedEventCopy",
|
|
39
|
-
},
|
|
40
|
-
signal: AbortSignal.timeout(REWRITE_TIMEOUT_MS),
|
|
41
|
-
},
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const block = response.content.find((entry) => entry.type === "text");
|
|
45
|
-
const text =
|
|
46
|
-
block && "text" in block ? (block as { text: string }).text.trim() : "";
|
|
47
|
-
if (!text) return null;
|
|
48
|
-
return (
|
|
49
|
-
text
|
|
50
|
-
.replace(/^["'`]+/, "")
|
|
51
|
-
.replace(/["'`]+$/, "")
|
|
52
|
-
.trim() || null
|
|
53
|
-
);
|
|
54
|
-
} catch (err) {
|
|
55
|
-
log.warn({ err, rawTitle }, "Feed title rewrite failed");
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Activity-log roll-up producer for the home feed.
|
|
3
|
-
*
|
|
4
|
-
* On a tick, reads the recent `action` items that background jobs have
|
|
5
|
-
* deposited in the feed (via `emit-feed-event.ts`) and asks the
|
|
6
|
-
* configured inference provider "consolidate these raw actions into a
|
|
7
|
-
* small set of digests or threads." This is the replacement for the
|
|
8
|
-
* old "reflect from nothing" producer: the roll-up starts from real
|
|
9
|
-
* side effects instead of prompting the model to hallucinate signal
|
|
10
|
-
* from relationship state alone.
|
|
11
|
-
*
|
|
12
|
-
* Mirrors the background-inference pattern established in
|
|
13
|
-
* `approval-generators.ts`: resolve the provider from config, call
|
|
14
|
-
* `provider.sendMessage` with a `tool_use`-shaped structured output
|
|
15
|
-
* schema, validate each returned block, and hand the validated
|
|
16
|
-
* shapes to `writeAssistantFeedItem`.
|
|
17
|
-
*
|
|
18
|
-
* Budget notes:
|
|
19
|
-
*
|
|
20
|
-
* - Hard cap: {@link MAX_ITEMS_PER_ROLLUP} items per tick so a
|
|
21
|
-
* single run can never flood the feed.
|
|
22
|
-
* - Timeout: {@link ROLLUP_TIMEOUT_MS} so a stalled provider can't
|
|
23
|
-
* stall the tick loop.
|
|
24
|
-
* - Token budget: {@link ROLLUP_MAX_TOKENS} — tight, because the
|
|
25
|
-
* output is a list of short feed items, not a long essay.
|
|
26
|
-
* - Input cap: at most {@link MAX_ACTIONS_IN_PROMPT} recent action
|
|
27
|
-
* items are serialized into the user prompt. Callers' volume is
|
|
28
|
-
* already bounded by the writer's per-source action cap, but
|
|
29
|
-
* this second cap protects against pathological inputs.
|
|
30
|
-
*
|
|
31
|
-
* Failure modes degrade gracefully: an unavailable provider, a
|
|
32
|
-
* malformed tool_use block, a schema-rejected item, or an exception
|
|
33
|
-
* in the inner loop all return a {@link RollupResult} with the
|
|
34
|
-
* appropriate `skippedReason`. The scheduler logs these but never
|
|
35
|
-
* surfaces them to the user.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
import { loadConfig } from "../config/loader.js";
|
|
39
|
-
import { getProvider, listProviders } from "../providers/registry.js";
|
|
40
|
-
import type { Provider } from "../providers/types.js";
|
|
41
|
-
import { getLogger } from "../util/logger.js";
|
|
42
|
-
import {
|
|
43
|
-
writeAssistantFeedItem,
|
|
44
|
-
type WriteAssistantFeedItemParams,
|
|
45
|
-
} from "./assistant-feed-authoring.js";
|
|
46
|
-
import type { FeedItem } from "./feed-types.js";
|
|
47
|
-
import { readHomeFeed } from "./feed-writer.js";
|
|
48
|
-
import { computeRelationshipState } from "./relationship-state-writer.js";
|
|
49
|
-
|
|
50
|
-
const log = getLogger("home-feed-rollup");
|
|
51
|
-
|
|
52
|
-
const ROLLUP_TIMEOUT_MS = 30_000;
|
|
53
|
-
const ROLLUP_MAX_TOKENS = 800;
|
|
54
|
-
const MAX_ITEMS_PER_ROLLUP = 3;
|
|
55
|
-
const MAX_ACTIONS_IN_PROMPT = 30;
|
|
56
|
-
|
|
57
|
-
const ROLLUP_TOOL_NAME = "write_feed_items";
|
|
58
|
-
|
|
59
|
-
const ROLLUP_SYSTEM_PROMPT = [
|
|
60
|
-
"You are a roll-up loop for a personal assistant's home activity feed.",
|
|
61
|
-
"Raw `action` items land in the feed as a deterministic side effect of background jobs.",
|
|
62
|
-
"Your job is to CONSOLIDATE those raw actions into higher-signal summary rows — never to invent signal from nothing.",
|
|
63
|
-
"",
|
|
64
|
-
"Rules:",
|
|
65
|
-
"- Emit only `digest` or `thread` items. Do NOT emit `action` items — those come from the background jobs themselves.",
|
|
66
|
-
"- A `digest` collapses several related raw actions into one summary row (e.g. '3 scheduled jobs ran this morning').",
|
|
67
|
-
"- A `thread` tracks an ongoing multi-action situation worth surfacing (e.g. 'Outreach to Alice — 2 emails sent, awaiting reply').",
|
|
68
|
-
"- Each digest/thread must be grounded in specific action items from the list below. Do not invent events.",
|
|
69
|
-
"- Never duplicate a consolidation that already describes the same set of actions — the writer's one-per-source replacement for digests will collapse repeats but you shouldn't rely on it.",
|
|
70
|
-
"- Prefer 0 items over low-signal filler. An empty activity log should always produce 0 items.",
|
|
71
|
-
"- You may emit up to 3 items total.",
|
|
72
|
-
"",
|
|
73
|
-
"Use the `write_feed_items` tool to emit items. If nothing is worth rolling up, call the tool with an empty `items` array.",
|
|
74
|
-
].join("\n");
|
|
75
|
-
|
|
76
|
-
const ROLLUP_TOOL_SCHEMA = {
|
|
77
|
-
name: ROLLUP_TOOL_NAME,
|
|
78
|
-
description:
|
|
79
|
-
"Record the set of roll-up feed items (digests or threads) that consolidate recent activity-log actions. " +
|
|
80
|
-
"Pass an empty `items` array if nothing is worth rolling up right now.",
|
|
81
|
-
input_schema: {
|
|
82
|
-
type: "object" as const,
|
|
83
|
-
properties: {
|
|
84
|
-
items: {
|
|
85
|
-
type: "array",
|
|
86
|
-
maxItems: MAX_ITEMS_PER_ROLLUP,
|
|
87
|
-
items: {
|
|
88
|
-
type: "object",
|
|
89
|
-
properties: {
|
|
90
|
-
type: {
|
|
91
|
-
type: "string",
|
|
92
|
-
enum: ["digest", "thread"],
|
|
93
|
-
description:
|
|
94
|
-
"`digest` collapses multiple related actions into one summary row; `thread` tracks an ongoing multi-action situation.",
|
|
95
|
-
},
|
|
96
|
-
source: {
|
|
97
|
-
type: "string",
|
|
98
|
-
enum: ["gmail", "slack", "calendar", "assistant"],
|
|
99
|
-
description:
|
|
100
|
-
"Origin hint used for the icon. Use `assistant` for cross-source roll-ups of assistant-driven work.",
|
|
101
|
-
},
|
|
102
|
-
title: {
|
|
103
|
-
type: "string",
|
|
104
|
-
description:
|
|
105
|
-
"Short headline, 4–10 words. Lowercase-sentence-case, no period.",
|
|
106
|
-
},
|
|
107
|
-
summary: {
|
|
108
|
-
type: "string",
|
|
109
|
-
description:
|
|
110
|
-
"One-sentence body copy explaining the roll-up. 1–25 words. Must reference specific actions from the activity log.",
|
|
111
|
-
},
|
|
112
|
-
priority: {
|
|
113
|
-
type: "integer",
|
|
114
|
-
minimum: 0,
|
|
115
|
-
maximum: 100,
|
|
116
|
-
description:
|
|
117
|
-
"Relative importance (higher = more prominent). Use 70 for digests, 55 for background threads.",
|
|
118
|
-
},
|
|
119
|
-
minTimeAway: {
|
|
120
|
-
type: "integer",
|
|
121
|
-
minimum: 0,
|
|
122
|
-
description:
|
|
123
|
-
"Seconds the user must be away before this item appears. Use 0 for a roll-up the user should see immediately.",
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
required: ["type", "title", "summary"],
|
|
127
|
-
additionalProperties: false,
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
required: ["items"],
|
|
132
|
-
additionalProperties: false,
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
export interface RollupResult {
|
|
137
|
-
/** Number of items actually written to the feed. */
|
|
138
|
-
wroteCount: number;
|
|
139
|
-
/**
|
|
140
|
-
* When non-null, indicates the producer short-circuited and no LLM
|
|
141
|
-
* call was made (or the call's result was unusable). The scheduler
|
|
142
|
-
* logs this but does not treat it as an error.
|
|
143
|
-
*
|
|
144
|
-
* `no_actions` means there was nothing to roll up — a quiet but
|
|
145
|
-
* normal outcome that does not advance the cooldown gate (no point
|
|
146
|
-
* re-running until new actions land).
|
|
147
|
-
*
|
|
148
|
-
* `in_flight` means another caller is already running the producer.
|
|
149
|
-
* The second call short-circuits without entering the body so we
|
|
150
|
-
* never fire two concurrent LLM requests — this guards against the
|
|
151
|
-
* scheduler tick and an on-visit refresh trigger racing each other.
|
|
152
|
-
*/
|
|
153
|
-
skippedReason:
|
|
154
|
-
| "no_provider"
|
|
155
|
-
| "no_actions"
|
|
156
|
-
| "in_flight"
|
|
157
|
-
| "empty_items"
|
|
158
|
-
| "provider_error"
|
|
159
|
-
| "malformed_output"
|
|
160
|
-
| null;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Dependency seams exposed for tests. Production callers pass
|
|
165
|
-
* `undefined` so the producer uses the real helpers. Tests pass
|
|
166
|
-
* stubs to avoid `mock.module`, which leaks across files in Bun's
|
|
167
|
-
* test runner and causes cross-file isolation bugs.
|
|
168
|
-
*/
|
|
169
|
-
export interface RollupProducerDeps {
|
|
170
|
-
writeItem?: (params: WriteAssistantFeedItemParams) => Promise<unknown>;
|
|
171
|
-
loadRelationshipState?: () => Promise<
|
|
172
|
-
Awaited<ReturnType<typeof computeRelationshipState>>
|
|
173
|
-
>;
|
|
174
|
-
loadRecentActions?: () => FeedItem[];
|
|
175
|
-
resolveProvider?: () => Provider | null;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Module-level in-flight guard. Prevents two callers (e.g. the
|
|
180
|
-
* scheduler tick and an on-visit refresh trigger) from launching two
|
|
181
|
-
* concurrent LLM requests. A second caller short-circuits with
|
|
182
|
-
* `skippedReason: "in_flight"` without entering the body. The lock
|
|
183
|
-
* is released in the `finally` so a thrown exception can't strand
|
|
184
|
-
* it in the `true` state.
|
|
185
|
-
*/
|
|
186
|
-
let producerInFlight = false;
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Run one roll-up pass. Loads recent action items from the feed plus
|
|
190
|
-
* relationship state, builds a user prompt around them, asks the
|
|
191
|
-
* provider for a `write_feed_items` tool call, and invokes
|
|
192
|
-
* {@link writeAssistantFeedItem} for each item in the returned array.
|
|
193
|
-
*/
|
|
194
|
-
export async function runRollupProducer(
|
|
195
|
-
now: Date = new Date(),
|
|
196
|
-
deps: RollupProducerDeps = {},
|
|
197
|
-
): Promise<RollupResult> {
|
|
198
|
-
if (producerInFlight) {
|
|
199
|
-
return { wroteCount: 0, skippedReason: "in_flight" };
|
|
200
|
-
}
|
|
201
|
-
producerInFlight = true;
|
|
202
|
-
try {
|
|
203
|
-
return await runRollupProducerInner(now, deps);
|
|
204
|
-
} finally {
|
|
205
|
-
producerInFlight = false;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
async function runRollupProducerInner(
|
|
210
|
-
now: Date,
|
|
211
|
-
deps: RollupProducerDeps,
|
|
212
|
-
): Promise<RollupResult> {
|
|
213
|
-
const writeItem = deps.writeItem ?? writeAssistantFeedItem;
|
|
214
|
-
const loadRelationshipState =
|
|
215
|
-
deps.loadRelationshipState ?? computeRelationshipState;
|
|
216
|
-
const loadRecentActions = deps.loadRecentActions ?? defaultLoadRecentActions;
|
|
217
|
-
|
|
218
|
-
const provider = deps.resolveProvider
|
|
219
|
-
? deps.resolveProvider()
|
|
220
|
-
: resolveDefaultProvider();
|
|
221
|
-
if (!provider) {
|
|
222
|
-
return { wroteCount: 0, skippedReason: "no_provider" };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const actions = loadRecentActions();
|
|
226
|
-
if (actions.length === 0) {
|
|
227
|
-
return { wroteCount: 0, skippedReason: "no_actions" };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
const state = await loadRelationshipState();
|
|
231
|
-
const userPrompt = buildUserPrompt(actions, state, now);
|
|
232
|
-
|
|
233
|
-
let response;
|
|
234
|
-
try {
|
|
235
|
-
response = await provider.sendMessage(
|
|
236
|
-
[{ role: "user", content: [{ type: "text", text: userPrompt }] }],
|
|
237
|
-
[ROLLUP_TOOL_SCHEMA],
|
|
238
|
-
ROLLUP_SYSTEM_PROMPT,
|
|
239
|
-
{
|
|
240
|
-
config: { max_tokens: ROLLUP_MAX_TOKENS },
|
|
241
|
-
signal: AbortSignal.timeout(ROLLUP_TIMEOUT_MS),
|
|
242
|
-
},
|
|
243
|
-
);
|
|
244
|
-
} catch (err) {
|
|
245
|
-
log.warn({ err }, "Rollup provider.sendMessage failed");
|
|
246
|
-
return { wroteCount: 0, skippedReason: "provider_error" };
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const toolUse = response.content.find(
|
|
250
|
-
(block) => block.type === "tool_use" && block.name === ROLLUP_TOOL_NAME,
|
|
251
|
-
);
|
|
252
|
-
if (!toolUse || toolUse.type !== "tool_use") {
|
|
253
|
-
return { wroteCount: 0, skippedReason: "malformed_output" };
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const input = toolUse.input as Record<string, unknown>;
|
|
257
|
-
const rawItems = Array.isArray(input.items) ? input.items : null;
|
|
258
|
-
if (!rawItems || rawItems.length === 0) {
|
|
259
|
-
return { wroteCount: 0, skippedReason: "empty_items" };
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const validSources = new Set(actions.map((a) => a.source).filter(Boolean));
|
|
263
|
-
|
|
264
|
-
const capped = rawItems.slice(0, MAX_ITEMS_PER_ROLLUP);
|
|
265
|
-
const accepted: WriteAssistantFeedItemParams[] = [];
|
|
266
|
-
for (let i = 0; i < capped.length; i++) {
|
|
267
|
-
const params = coerceRollupItem(capped[i], validSources, i);
|
|
268
|
-
if (params) accepted.push(params);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// If the model returned items but every single one failed coercion,
|
|
272
|
-
// that's a schema-drift signal we want loud in production logs — a
|
|
273
|
-
// silent "wroteCount: 0, skippedReason: null" would look like a
|
|
274
|
-
// normal quiet tick and bury the bug. Report it as malformed_output.
|
|
275
|
-
if (accepted.length === 0) {
|
|
276
|
-
return { wroteCount: 0, skippedReason: "malformed_output" };
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
let wroteCount = 0;
|
|
280
|
-
for (const params of accepted) {
|
|
281
|
-
try {
|
|
282
|
-
await writeItem(params);
|
|
283
|
-
wroteCount += 1;
|
|
284
|
-
} catch (err) {
|
|
285
|
-
// Schema rejection is a model-output bug, not a regression in the
|
|
286
|
-
// writer — log and keep going so a single malformed item doesn't
|
|
287
|
-
// block the rest of the batch.
|
|
288
|
-
log.warn({ err, params }, "Failed to write rollup item");
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
return { wroteCount, skippedReason: null };
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
function resolveDefaultProvider(): ReturnType<typeof getProvider> | null {
|
|
296
|
-
const config = loadConfig();
|
|
297
|
-
if (!listProviders().includes(config.llm.default.provider)) {
|
|
298
|
-
return null;
|
|
299
|
-
}
|
|
300
|
-
return getProvider(config.llm.default.provider);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Default recent-actions loader. Reads the TTL-filtered home feed,
|
|
305
|
-
* keeps only `action` items, and returns them sorted by `createdAt`
|
|
306
|
-
* descending so the most recent signals land at the top of the
|
|
307
|
-
* prompt. Non-action items (digests, threads, nudges) are excluded
|
|
308
|
-
* — the roll-up's input is the raw activity log, not the existing
|
|
309
|
-
* consolidations.
|
|
310
|
-
*/
|
|
311
|
-
function defaultLoadRecentActions(): FeedItem[] {
|
|
312
|
-
const feed = readHomeFeed();
|
|
313
|
-
return feed.items
|
|
314
|
-
.filter((i) => i.type === "action")
|
|
315
|
-
.sort((a, b) => {
|
|
316
|
-
const am = Date.parse(a.createdAt);
|
|
317
|
-
const bm = Date.parse(b.createdAt);
|
|
318
|
-
if (Number.isNaN(am) && Number.isNaN(bm)) return 0;
|
|
319
|
-
if (Number.isNaN(am)) return 1;
|
|
320
|
-
if (Number.isNaN(bm)) return -1;
|
|
321
|
-
return bm - am;
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Build the user-prompt context for one roll-up pass. Keeps the
|
|
327
|
-
* relationship-state block small and bounds the action list at
|
|
328
|
-
* {@link MAX_ACTIONS_IN_PROMPT} so a pathological input can't blow
|
|
329
|
-
* the token budget.
|
|
330
|
-
*/
|
|
331
|
-
function buildUserPrompt(
|
|
332
|
-
actions: FeedItem[],
|
|
333
|
-
state: Awaited<ReturnType<typeof computeRelationshipState>>,
|
|
334
|
-
now: Date,
|
|
335
|
-
): string {
|
|
336
|
-
const actionLines = actions
|
|
337
|
-
.slice(0, MAX_ACTIONS_IN_PROMPT)
|
|
338
|
-
.map((a) => {
|
|
339
|
-
const src = a.source ? `[${a.source}]` : "[-]";
|
|
340
|
-
return ` - ${a.createdAt} ${src} ${a.title} — ${a.summary}`;
|
|
341
|
-
})
|
|
342
|
-
.join("\n");
|
|
343
|
-
|
|
344
|
-
const factLines = state.facts
|
|
345
|
-
.slice(0, 10)
|
|
346
|
-
.map((f) => ` - ${f.category}: ${f.text}`)
|
|
347
|
-
.join("\n");
|
|
348
|
-
|
|
349
|
-
return [
|
|
350
|
-
`Current time: ${now.toISOString()}`,
|
|
351
|
-
`Assistant name: ${state.assistantName}`,
|
|
352
|
-
state.userName ? `User name: ${state.userName}` : "User name: (unknown)",
|
|
353
|
-
`Relationship tier: ${state.tier} / 4`,
|
|
354
|
-
"",
|
|
355
|
-
`Recent activity log entries (most recent first, up to ${MAX_ACTIONS_IN_PROMPT}):`,
|
|
356
|
-
actionLines.length > 0 ? actionLines : " (none)",
|
|
357
|
-
"",
|
|
358
|
-
"Known facts about the user (for context only — do NOT invent roll-ups from these):",
|
|
359
|
-
factLines.length > 0 ? factLines : " (none yet)",
|
|
360
|
-
"",
|
|
361
|
-
`Sources present in the activity log: ${[...new Set(actions.map((a) => a.source).filter(Boolean))].join(", ") || "(none)"}`,
|
|
362
|
-
"IMPORTANT: Only use sources that appear in the list above. Do NOT reference services (Gmail, Slack, etc.) that have no activity log entries.",
|
|
363
|
-
"",
|
|
364
|
-
"Consolidate the activity log above into a small set of `digest` or `thread` roll-up items. Remember: prefer 0 items over filler, and only roll up when several related actions cluster into a coherent story. Use the `write_feed_items` tool.",
|
|
365
|
-
].join("\n");
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Coerce a raw tool_use item into
|
|
370
|
-
* {@link WriteAssistantFeedItemParams}, returning null if the shape is
|
|
371
|
-
* unrecoverable. The schema on the provider side enforces most of
|
|
372
|
-
* this, but the runtime check guards against model drift — including
|
|
373
|
-
* the `type` narrowing to digest/thread (actions and nudges are
|
|
374
|
-
* rejected here even if the model ignores the tool schema).
|
|
375
|
-
*/
|
|
376
|
-
function coerceRollupItem(
|
|
377
|
-
raw: unknown,
|
|
378
|
-
validSources: Set<string | undefined>,
|
|
379
|
-
index: number,
|
|
380
|
-
): WriteAssistantFeedItemParams | null {
|
|
381
|
-
if (!raw || typeof raw !== "object") return null;
|
|
382
|
-
const obj = raw as Record<string, unknown>;
|
|
383
|
-
|
|
384
|
-
const type = obj.type;
|
|
385
|
-
if (type !== "digest" && type !== "thread") {
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const title = typeof obj.title === "string" ? obj.title.trim() : "";
|
|
390
|
-
const summary = typeof obj.summary === "string" ? obj.summary.trim() : "";
|
|
391
|
-
if (!title || !summary) return null;
|
|
392
|
-
|
|
393
|
-
const source = obj.source;
|
|
394
|
-
let coercedSource: WriteAssistantFeedItemParams["source"];
|
|
395
|
-
if (
|
|
396
|
-
source === "gmail" ||
|
|
397
|
-
source === "slack" ||
|
|
398
|
-
source === "calendar" ||
|
|
399
|
-
source === "assistant"
|
|
400
|
-
) {
|
|
401
|
-
if (!validSources.has(source)) return null;
|
|
402
|
-
coercedSource = source;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
const priority =
|
|
406
|
-
typeof obj.priority === "number" && Number.isInteger(obj.priority)
|
|
407
|
-
? Math.max(0, Math.min(100, obj.priority))
|
|
408
|
-
: undefined;
|
|
409
|
-
|
|
410
|
-
const minTimeAway =
|
|
411
|
-
typeof obj.minTimeAway === "number" && Number.isInteger(obj.minTimeAway)
|
|
412
|
-
? Math.max(0, obj.minTimeAway)
|
|
413
|
-
: undefined;
|
|
414
|
-
|
|
415
|
-
const id = `rollup:${type}:${coercedSource ?? "none"}:${index}`;
|
|
416
|
-
|
|
417
|
-
return {
|
|
418
|
-
id,
|
|
419
|
-
type,
|
|
420
|
-
source: coercedSource,
|
|
421
|
-
title,
|
|
422
|
-
summary,
|
|
423
|
-
priority,
|
|
424
|
-
minTimeAway,
|
|
425
|
-
};
|
|
426
|
-
}
|