@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
package/src/home/feed-types.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Home activity feed data contract.
|
|
3
3
|
*
|
|
4
4
|
* Defines the shape of `FeedItem`s shown in the macOS Home page feed
|
|
5
|
-
* section
|
|
6
|
-
*
|
|
7
|
-
* daemon HTTP route (PR 6).
|
|
5
|
+
* section plus the on-disk file format written by the daemon feed
|
|
6
|
+
* writer (PR 5) and served by the daemon HTTP route (PR 6).
|
|
8
7
|
*
|
|
9
8
|
* The TDD contract field originally named `ttl` is renamed internally
|
|
10
9
|
* to `expiresAt` — it is an absolute ISO-8601 timestamp, not a
|
|
@@ -14,6 +13,15 @@
|
|
|
14
13
|
* a translation layer at the route boundary; within the daemon, all
|
|
15
14
|
* internal types use `expiresAt`.
|
|
16
15
|
*
|
|
16
|
+
* **v2 schema collapse** — feed items now have a single `notification`
|
|
17
|
+
* type. The legacy `nudge | digest | action | thread` distinctions
|
|
18
|
+
* (and the `source` / `author` / `minTimeAway` fields that supported
|
|
19
|
+
* them) have been removed; everything that lands in the home feed is
|
|
20
|
+
* a notification, with the writer's only merge rule being "same `id`
|
|
21
|
+
* replaces in place, otherwise append". Workspace migration
|
|
22
|
+
* `061-home-feed-notification-only` rewrites pre-v2 files on first
|
|
23
|
+
* boot.
|
|
24
|
+
*
|
|
17
25
|
* A structurally compatible Swift mirror lives at
|
|
18
26
|
* `clients/shared/Network/FeedItem.swift` (PR 3). Any change here
|
|
19
27
|
* must be mirrored there.
|
|
@@ -22,35 +30,11 @@
|
|
|
22
30
|
import { z } from "zod";
|
|
23
31
|
|
|
24
32
|
/** High-level kind of feed item — drives which Swift view renders it. */
|
|
25
|
-
export type FeedItemType = "
|
|
33
|
+
export type FeedItemType = "notification";
|
|
26
34
|
|
|
27
35
|
/** User-facing lifecycle of a feed item. */
|
|
28
36
|
export type FeedItemStatus = "new" | "seen" | "acted_on" | "dismissed";
|
|
29
37
|
|
|
30
|
-
/**
|
|
31
|
-
* Origin of the underlying event.
|
|
32
|
-
*
|
|
33
|
-
* In v1 this is constrained to a closed set so the Swift icon mapping
|
|
34
|
-
* stays exhaustive. Future sources will be added explicitly rather
|
|
35
|
-
* than letting arbitrary strings slip through.
|
|
36
|
-
*/
|
|
37
|
-
export type FeedItemSource =
|
|
38
|
-
| "gmail"
|
|
39
|
-
| "slack"
|
|
40
|
-
| "calendar"
|
|
41
|
-
| "assistant"
|
|
42
|
-
| "telegram";
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Internal field used by the hybrid authoring resolver (PR 5 writer).
|
|
46
|
-
*
|
|
47
|
-
* Not part of the TDD public interface — it distinguishes items the
|
|
48
|
-
* assistant produced on its own from items the platform baseline
|
|
49
|
-
* generators (e.g. Gmail digest in PR 12) produced, so assistant
|
|
50
|
-
* overrides can win over platform defaults for the same source.
|
|
51
|
-
*/
|
|
52
|
-
export type FeedItemAuthor = "assistant" | "platform";
|
|
53
|
-
|
|
54
38
|
/** Visual urgency treatment — controls badge color independently of sort priority. */
|
|
55
39
|
export type FeedItemUrgency = "low" | "medium" | "high" | "critical";
|
|
56
40
|
|
|
@@ -84,8 +68,7 @@ export interface FeedItemDetailPanel {
|
|
|
84
68
|
/**
|
|
85
69
|
* A single item rendered in the Home feed.
|
|
86
70
|
*
|
|
87
|
-
* Mirrors the TDD contract plus
|
|
88
|
-
* - `author` — hybrid-authoring resolver discriminator
|
|
71
|
+
* Mirrors the TDD contract plus one internal-only field:
|
|
89
72
|
* - `createdAt` — when the writer recorded the item (distinct from
|
|
90
73
|
* `timestamp`, which is the event time). Used for
|
|
91
74
|
* TTL sweeps and stable ordering.
|
|
@@ -100,16 +83,12 @@ export interface FeedItem {
|
|
|
100
83
|
priority: number;
|
|
101
84
|
title: string;
|
|
102
85
|
summary: string;
|
|
103
|
-
/** Optional; when present must be one of the v1 sources. */
|
|
104
|
-
source?: FeedItemSource;
|
|
105
86
|
/** Event time (ISO-8601). */
|
|
106
87
|
timestamp: string;
|
|
107
88
|
/** Defaults to `"new"` at parse time. */
|
|
108
89
|
status: FeedItemStatus;
|
|
109
90
|
/** Absolute ISO-8601 expiry timestamp (renamed from TDD `ttl`). */
|
|
110
91
|
expiresAt?: string;
|
|
111
|
-
/** Minimum seconds the user must be away before the item is shown. */
|
|
112
|
-
minTimeAway?: number;
|
|
113
92
|
actions?: FeedAction[];
|
|
114
93
|
/** Visual urgency treatment — controls badge color independently of sort priority. */
|
|
115
94
|
urgency?: FeedItemUrgency;
|
|
@@ -117,31 +96,20 @@ export interface FeedItem {
|
|
|
117
96
|
conversationId?: string;
|
|
118
97
|
/** Server-driven detail panel descriptor; when present, the client opens this panel kind. */
|
|
119
98
|
detailPanel?: FeedItemDetailPanel;
|
|
120
|
-
/** Internal: who authored this item. */
|
|
121
|
-
author: FeedItemAuthor;
|
|
122
99
|
/** Internal: ISO-8601 writer-record time, used for ordering + TTL. */
|
|
123
100
|
createdAt: string;
|
|
124
101
|
}
|
|
125
102
|
|
|
126
|
-
/**
|
|
127
|
-
* Summary of low-priority items that were collapsed out of the main
|
|
128
|
-
* feed list. The client renders this as a single "N low priority
|
|
129
|
-
* updates" line instead of showing each item individually.
|
|
130
|
-
*/
|
|
131
|
-
export interface LowPriorityCollapsed {
|
|
132
|
-
count: number;
|
|
133
|
-
itemIds: string[];
|
|
134
|
-
}
|
|
135
|
-
|
|
136
103
|
/**
|
|
137
104
|
* On-disk file format for `~/.vellum/workspace/data/home-feed.json`.
|
|
138
105
|
*
|
|
139
106
|
* Written by the PR 5 writer, read by the PR 6 HTTP route and
|
|
140
|
-
* `parseFeedFile` below. `version` is pinned to `
|
|
141
|
-
*
|
|
107
|
+
* `parseFeedFile` below. `version` is pinned to `2` (collapsed schema);
|
|
108
|
+
* pre-v2 files are rewritten by workspace migration
|
|
109
|
+
* `061-home-feed-notification-only`.
|
|
142
110
|
*/
|
|
143
111
|
export interface HomeFeedFile {
|
|
144
|
-
version:
|
|
112
|
+
version: 2;
|
|
145
113
|
items: FeedItem[];
|
|
146
114
|
updatedAt: string;
|
|
147
115
|
}
|
|
@@ -171,20 +139,10 @@ export interface SuggestedPrompt {
|
|
|
171
139
|
// Zod schemas
|
|
172
140
|
// ---------------------------------------------------------------------------
|
|
173
141
|
|
|
174
|
-
const feedItemTypeSchema = z.
|
|
142
|
+
const feedItemTypeSchema = z.literal("notification");
|
|
175
143
|
|
|
176
144
|
const feedItemStatusSchema = z.enum(["new", "seen", "acted_on", "dismissed"]);
|
|
177
145
|
|
|
178
|
-
const feedItemSourceSchema = z.enum([
|
|
179
|
-
"gmail",
|
|
180
|
-
"slack",
|
|
181
|
-
"calendar",
|
|
182
|
-
"assistant",
|
|
183
|
-
"telegram",
|
|
184
|
-
]);
|
|
185
|
-
|
|
186
|
-
const feedItemAuthorSchema = z.enum(["assistant", "platform"]);
|
|
187
|
-
|
|
188
146
|
const feedItemUrgencySchema = z.enum(["low", "medium", "high", "critical"]);
|
|
189
147
|
|
|
190
148
|
const feedActionSchema = z.object({
|
|
@@ -215,10 +173,6 @@ const feedItemDetailPanelSchema = z.object({
|
|
|
215
173
|
* silent coercion tends to mask writer bugs.
|
|
216
174
|
* - `status` defaults to `"new"` so the writer does not need to
|
|
217
175
|
* set it on every append.
|
|
218
|
-
* - `source` is optional but, when present, must be one of the
|
|
219
|
-
* four v1 sources — unknown values (e.g. `"facebook"`) are
|
|
220
|
-
* rejected rather than silently passed through.
|
|
221
|
-
* - `minTimeAway` is a non-negative integer number of seconds.
|
|
222
176
|
*/
|
|
223
177
|
export const feedItemSchema = z.object({
|
|
224
178
|
id: z.string(),
|
|
@@ -226,16 +180,13 @@ export const feedItemSchema = z.object({
|
|
|
226
180
|
priority: z.number().int().min(0).max(100),
|
|
227
181
|
title: z.string(),
|
|
228
182
|
summary: z.string(),
|
|
229
|
-
source: feedItemSourceSchema.optional(),
|
|
230
183
|
timestamp: z.string(),
|
|
231
184
|
status: feedItemStatusSchema.default("new"),
|
|
232
185
|
expiresAt: z.string().optional(),
|
|
233
|
-
minTimeAway: z.number().int().min(0).optional(),
|
|
234
186
|
actions: z.array(feedActionSchema).optional(),
|
|
235
187
|
urgency: feedItemUrgencySchema.optional(),
|
|
236
188
|
conversationId: z.string().optional(),
|
|
237
189
|
detailPanel: feedItemDetailPanelSchema.optional(),
|
|
238
|
-
author: feedItemAuthorSchema,
|
|
239
190
|
createdAt: z.string(),
|
|
240
191
|
});
|
|
241
192
|
|
|
@@ -249,14 +200,9 @@ export const suggestedPromptSchema = z.object({
|
|
|
249
200
|
source: suggestedPromptSourceSchema,
|
|
250
201
|
});
|
|
251
202
|
|
|
252
|
-
export const lowPriorityCollapsedSchema = z.object({
|
|
253
|
-
count: z.number().int().min(0),
|
|
254
|
-
itemIds: z.array(z.string()),
|
|
255
|
-
});
|
|
256
|
-
|
|
257
203
|
/** Schema for the on-disk `home-feed.json` file. */
|
|
258
204
|
const homeFeedFileSchema = z.object({
|
|
259
|
-
version: z.literal(
|
|
205
|
+
version: z.literal(2),
|
|
260
206
|
items: z.array(feedItemSchema),
|
|
261
207
|
updatedAt: z.string(),
|
|
262
208
|
});
|
package/src/home/feed-writer.ts
CHANGED
|
@@ -2,41 +2,26 @@
|
|
|
2
2
|
* Home activity feed writer.
|
|
3
3
|
*
|
|
4
4
|
* Owns `<workspace>/data/home-feed.json`, the daemon-side source of
|
|
5
|
-
* truth for the macOS Home page activity feed.
|
|
6
|
-
* semantics defined by the TDD / plan:
|
|
5
|
+
* truth for the macOS Home page activity feed.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* **v2 merge semantics** — the schema collapse to a single
|
|
8
|
+
* `notification` type also collapses the writer's merge rules to a
|
|
9
|
+
* single rule:
|
|
10
|
+
*
|
|
11
|
+
* - **Same `id` replaces in place**: if an incoming item shares its
|
|
12
12
|
* `id` with an existing item, replace that item while preserving
|
|
13
13
|
* its array position so the UI does not jitter on updates.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* -
|
|
21
|
-
* activity log and never merge by `(type, source)` — each append
|
|
22
|
-
* becomes a distinct entry so successive background-job events
|
|
23
|
-
* don't collapse onto each other. A same-`id` action is the one
|
|
24
|
-
* exception: it performs an in-place update (same semantics as
|
|
25
|
-
* threads) so callers using a deterministic dedup id via
|
|
26
|
-
* `emit-feed-event.ts` can refresh an entry without appending a
|
|
27
|
-
* duplicate. Callers that want to auto-expire an action item
|
|
28
|
-
* must set `expiresAt` explicitly; the writer does NOT fill in
|
|
29
|
-
* a default expiry.
|
|
30
|
-
* - Per-source action cap: after merge, each source keeps at most
|
|
31
|
-
* {@link MAX_ACTIONS_PER_SOURCE} action items (most recent by
|
|
32
|
-
* `createdAt`). Older actions for that source are dropped so the
|
|
33
|
-
* on-disk file can't balloon as background jobs emit events.
|
|
34
|
-
* Action items without a `source` are unbounded and passed
|
|
35
|
-
* through untouched.
|
|
36
|
-
* - TTL filter on read: `readHomeFeed` drops any item whose
|
|
14
|
+
* Otherwise, append. The pre-v2 type-specific branches (digest
|
|
15
|
+
* replacement by source, thread same-id update, action
|
|
16
|
+
* append-without-replace, hybrid-author resolution, per-source
|
|
17
|
+
* action cap) are gone — they were holdovers from a multi-type
|
|
18
|
+
* vocabulary that no longer exists.
|
|
19
|
+
*
|
|
20
|
+
* - **TTL filter on read**: `readHomeFeed` drops any item whose
|
|
37
21
|
* `expiresAt` is in the past. This is a stateless sweep — the
|
|
38
22
|
* writer does not rewrite the file on read, so concurrent reads
|
|
39
|
-
* never race the writer.
|
|
23
|
+
* never race the writer. Callers that want auto-expiry must set
|
|
24
|
+
* `expiresAt` explicitly; the writer does NOT fill in a default.
|
|
40
25
|
*
|
|
41
26
|
* Concurrent writers are coalesced with the exact same "latest wins"
|
|
42
27
|
* pattern as `relationship-state-writer.ts`: at most one compute+write
|
|
@@ -69,16 +54,7 @@ const log = getLogger("home-feed-writer");
|
|
|
69
54
|
export const HOME_FEED_FILENAME = "home-feed.json";
|
|
70
55
|
|
|
71
56
|
/** On-disk file-format version. Bump + migrate if the shape changes. */
|
|
72
|
-
export const HOME_FEED_VERSION =
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Per-source volume cap for `action` items. When the post-merge item
|
|
76
|
-
* list has more than this many action items for a single source, the
|
|
77
|
-
* oldest (by `createdAt`) are dropped until the count is back within
|
|
78
|
-
* the cap. Other item types are unaffected, and action items without
|
|
79
|
-
* a `source` are also unaffected.
|
|
80
|
-
*/
|
|
81
|
-
export const MAX_ACTIONS_PER_SOURCE = 20;
|
|
57
|
+
export const HOME_FEED_VERSION = 2;
|
|
82
58
|
|
|
83
59
|
/**
|
|
84
60
|
* Canonical path to the home-feed snapshot
|
|
@@ -238,8 +214,6 @@ async function runWrite(): Promise<void> {
|
|
|
238
214
|
items = mergeIncoming(items, incoming);
|
|
239
215
|
}
|
|
240
216
|
|
|
241
|
-
items = pruneActionsPerSource(items);
|
|
242
|
-
|
|
243
217
|
// Track the per-patch result so callers can distinguish an update
|
|
244
218
|
// from an unknown-id no-op. We collect resolvers first and fire them
|
|
245
219
|
// after the write lands so the resolved `FeedItem` matches on-disk
|
|
@@ -298,128 +272,23 @@ async function runWrite(): Promise<void> {
|
|
|
298
272
|
}
|
|
299
273
|
|
|
300
274
|
/**
|
|
301
|
-
* Apply the merge
|
|
275
|
+
* Apply the v2 merge rule for a single incoming item against the
|
|
302
276
|
* current item list and return a new list. Pure function — the input
|
|
303
277
|
* array is not mutated.
|
|
278
|
+
*
|
|
279
|
+
* Same-`id` replaces in place (preserving array position so the UI
|
|
280
|
+
* does not jitter); otherwise the item is appended.
|
|
304
281
|
*/
|
|
305
282
|
function mergeIncoming(items: FeedItem[], incoming: FeedItem): FeedItem[] {
|
|
306
|
-
|
|
307
|
-
if (
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
filtered.push(incoming);
|
|
312
|
-
return filtered;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Thread in-place update: same id wins, preserve position.
|
|
316
|
-
if (incoming.type === "thread") {
|
|
317
|
-
const idx = items.findIndex(
|
|
318
|
-
(i) => i.type === "thread" && i.id === incoming.id,
|
|
319
|
-
);
|
|
320
|
-
if (idx !== -1) {
|
|
321
|
-
const copy = items.slice();
|
|
322
|
-
copy[idx] = incoming;
|
|
323
|
-
return copy;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Action append-without-replace: each action item is a distinct
|
|
328
|
-
// activity-log entry and must NOT collapse onto an existing action
|
|
329
|
-
// for the same (type, source) pair. The per-source volume cap in
|
|
330
|
-
// `pruneActionsPerSource` keeps the log from growing unbounded.
|
|
331
|
-
//
|
|
332
|
-
// Exception: same-id in-place update. Callers that want
|
|
333
|
-
// deterministic dedup (e.g. via `emit-feed-event.ts`'s `dedupKey`)
|
|
334
|
-
// produce a stable id per logical event; a second emit with the
|
|
335
|
-
// same id refreshes the existing entry in place rather than
|
|
336
|
-
// appending a duplicate.
|
|
337
|
-
if (incoming.type === "action") {
|
|
338
|
-
const idx = items.findIndex(
|
|
339
|
-
(i) => i.type === "action" && i.id === incoming.id,
|
|
340
|
-
);
|
|
341
|
-
if (idx !== -1) {
|
|
342
|
-
const copy = items.slice();
|
|
343
|
-
copy[idx] = incoming;
|
|
344
|
-
return copy;
|
|
345
|
-
}
|
|
346
|
-
return [...items, incoming];
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// Author resolution: for matching (type, source) pairs, assistant
|
|
350
|
-
// beats platform. A platform-authored incoming item against an
|
|
351
|
-
// existing assistant item is a no-op. Applies to nudges (actions
|
|
352
|
-
// short-circuit above).
|
|
353
|
-
if (incoming.source) {
|
|
354
|
-
const existingIdx = items.findIndex(
|
|
355
|
-
(i) => i.type === incoming.type && i.source === incoming.source,
|
|
356
|
-
);
|
|
357
|
-
if (existingIdx !== -1) {
|
|
358
|
-
const existing = items[existingIdx]!;
|
|
359
|
-
if (existing.author === "assistant" && incoming.author === "platform") {
|
|
360
|
-
// Platform can't overwrite assistant — no-op.
|
|
361
|
-
return items;
|
|
362
|
-
}
|
|
363
|
-
if (existing.author === "platform" && incoming.author === "assistant") {
|
|
364
|
-
const copy = items.slice();
|
|
365
|
-
copy[existingIdx] = incoming;
|
|
366
|
-
return copy;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
283
|
+
const idx = items.findIndex((i) => i.id === incoming.id);
|
|
284
|
+
if (idx !== -1) {
|
|
285
|
+
const copy = items.slice();
|
|
286
|
+
copy[idx] = incoming;
|
|
287
|
+
return copy;
|
|
369
288
|
}
|
|
370
|
-
|
|
371
289
|
return [...items, incoming];
|
|
372
290
|
}
|
|
373
291
|
|
|
374
|
-
/**
|
|
375
|
-
* Enforce the per-source volume cap on `action` items. For each
|
|
376
|
-
* source that has more than {@link MAX_ACTIONS_PER_SOURCE} actions in
|
|
377
|
-
* the post-merge list, keep the most recent by `createdAt` and drop
|
|
378
|
-
* the rest. Other item types and action items without a `source` are
|
|
379
|
-
* passed through untouched. Stable with respect to non-affected items.
|
|
380
|
-
*/
|
|
381
|
-
function pruneActionsPerSource(items: FeedItem[]): FeedItem[] {
|
|
382
|
-
const actionsBySource = new Map<string, FeedItem[]>();
|
|
383
|
-
for (const item of items) {
|
|
384
|
-
if (item.type !== "action" || !item.source) continue;
|
|
385
|
-
const bucket = actionsBySource.get(item.source);
|
|
386
|
-
if (bucket) {
|
|
387
|
-
bucket.push(item);
|
|
388
|
-
} else {
|
|
389
|
-
actionsBySource.set(item.source, [item]);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
const overflowing: string[] = [];
|
|
394
|
-
for (const [source, bucket] of actionsBySource) {
|
|
395
|
-
if (bucket.length > MAX_ACTIONS_PER_SOURCE) overflowing.push(source);
|
|
396
|
-
}
|
|
397
|
-
if (overflowing.length === 0) return items;
|
|
398
|
-
|
|
399
|
-
const keepIds = new Set<string>();
|
|
400
|
-
for (const source of overflowing) {
|
|
401
|
-
const bucket = actionsBySource.get(source)!.slice();
|
|
402
|
-
bucket.sort((a, b) => {
|
|
403
|
-
const am = Date.parse(a.createdAt);
|
|
404
|
-
const bm = Date.parse(b.createdAt);
|
|
405
|
-
if (Number.isNaN(am) && Number.isNaN(bm)) return 0;
|
|
406
|
-
if (Number.isNaN(am)) return 1;
|
|
407
|
-
if (Number.isNaN(bm)) return -1;
|
|
408
|
-
return bm - am;
|
|
409
|
-
});
|
|
410
|
-
for (const item of bucket.slice(0, MAX_ACTIONS_PER_SOURCE)) {
|
|
411
|
-
keepIds.add(item.id);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return items.filter((item) => {
|
|
416
|
-
if (item.type !== "action") return true;
|
|
417
|
-
if (!item.source) return true;
|
|
418
|
-
if (!overflowing.includes(item.source)) return true;
|
|
419
|
-
return keepIds.has(item.id);
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
|
|
423
292
|
/**
|
|
424
293
|
* Return `true` when the item has an `expiresAt` timestamp that is in
|
|
425
294
|
* the past relative to the supplied `nowMs`. Items without
|
|
@@ -37,16 +37,14 @@ export async function emitPostConnectNudge(service: string): Promise<void> {
|
|
|
37
37
|
|
|
38
38
|
const item: FeedItem = {
|
|
39
39
|
id: `connect-nudge:${service}`,
|
|
40
|
-
type: "
|
|
40
|
+
type: "notification",
|
|
41
41
|
priority: 70,
|
|
42
42
|
title: "Gmail connected — want ongoing help?",
|
|
43
43
|
summary:
|
|
44
44
|
"I can triage your inbox, summarize new emails, or draft replies to important threads.",
|
|
45
|
-
source: "gmail",
|
|
46
45
|
timestamp: now.toISOString(),
|
|
47
46
|
status: "new",
|
|
48
47
|
expiresAt,
|
|
49
|
-
author: "platform",
|
|
50
48
|
createdAt: now.toISOString(),
|
|
51
49
|
actions: [
|
|
52
50
|
{
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
import { afterEach, describe, expect, mock, test } from "bun:test";
|
|
10
10
|
|
|
11
|
+
delete process.env.ASSISTANT_IPC_SOCKET_DIR;
|
|
12
|
+
|
|
11
13
|
import { runAssistantCommandFull } from "../../cli/__tests__/run-assistant-command.js";
|
|
12
14
|
import { AssistantIpcServer } from "../assistant-server.js";
|
|
13
15
|
|