@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
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
composeFallbackCopy,
|
|
36
36
|
hasAccessRequestInstructions,
|
|
37
37
|
hasInviteFlowDirective,
|
|
38
|
+
looksLikeIntermediaryInstruction,
|
|
38
39
|
} from "./copy-composer.js";
|
|
39
40
|
import { createDecision } from "./decisions-store.js";
|
|
40
41
|
import {
|
|
@@ -127,11 +128,13 @@ function buildSystemPrompt(
|
|
|
127
128
|
``,
|
|
128
129
|
`Copy guidelines (three distinct outputs):`,
|
|
129
130
|
`- \`title\` and \`body\` are for native notification popups (e.g. vellum desktop/mobile) — keep them short and glanceable (title ≤ 8 words, body ≤ 2 sentences).`,
|
|
131
|
+
` - Write popup copy as final copy for the guardian or recipient. Do not write instructions for the assistant or another intermediary.`,
|
|
130
132
|
`- \`deliveryText\` is the channel-native message for chat channels (e.g. telegram). It must read naturally as a standalone message.`,
|
|
131
133
|
` - Do not prepend mechanical labels like "Conversation:".`,
|
|
132
134
|
` - Do not mention channel or transport names (e.g. Telegram, Slack, email) unless the event context explicitly requires it.`,
|
|
133
135
|
` - Do not repeat title/body verbatim unless that repetition is truly necessary.`,
|
|
134
136
|
` - Avoid meta-send phrasing (e.g. "I'd like to send a notification", "May I go ahead with that?"). Write the recipient-facing message directly.`,
|
|
137
|
+
` - Avoid intermediary-instruction phrasing like "consider telling the guardian", "ask the recipient to", or "the assistant should remind them". Rewrite it as final copy the recipient can act on directly.`,
|
|
135
138
|
` - For telegram: 1-2 concise sentences.`,
|
|
136
139
|
`- \`conversationSeedMessage\` is the opening message in the internal notification conversation — it can be richer and more contextual.`,
|
|
137
140
|
` - For vellum (desktop): 2-4 short sentences with useful context and clear next step if action is required.`,
|
|
@@ -664,6 +667,47 @@ function enforceAccessRequestInstructions(
|
|
|
664
667
|
};
|
|
665
668
|
}
|
|
666
669
|
|
|
670
|
+
function enforceHeartbeatAlertCopy(
|
|
671
|
+
decision: NotificationDecision,
|
|
672
|
+
signal: NotificationSignal,
|
|
673
|
+
): NotificationDecision {
|
|
674
|
+
if (signal.sourceEventName !== "heartbeat.alert") return decision;
|
|
675
|
+
if (!decision.shouldNotify || decision.selectedChannels.length === 0)
|
|
676
|
+
return decision;
|
|
677
|
+
|
|
678
|
+
const fallbackCopy = composeFallbackCopy(signal, decision.selectedChannels);
|
|
679
|
+
const nextCopy: Partial<Record<NotificationChannel, RenderedChannelCopy>> = {
|
|
680
|
+
...decision.renderedCopy,
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
for (const channel of decision.selectedChannels) {
|
|
684
|
+
const currentCopy = nextCopy[channel];
|
|
685
|
+
if (
|
|
686
|
+
currentCopy &&
|
|
687
|
+
!heartbeatCopyLooksLikeIntermediaryInstruction(currentCopy)
|
|
688
|
+
) {
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
const safeCopy = fallbackCopy[channel];
|
|
692
|
+
if (!safeCopy) continue;
|
|
693
|
+
nextCopy[channel] = safeCopy;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
return {
|
|
697
|
+
...decision,
|
|
698
|
+
renderedCopy: nextCopy,
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
function heartbeatCopyLooksLikeIntermediaryInstruction(
|
|
703
|
+
copy: RenderedChannelCopy,
|
|
704
|
+
): boolean {
|
|
705
|
+
return [copy.title, copy.body, copy.deliveryText].some(
|
|
706
|
+
(value) =>
|
|
707
|
+
typeof value === "string" && looksLikeIntermediaryInstruction(value),
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
|
|
667
711
|
function ensureAccessRequestInstructionsInCopy(
|
|
668
712
|
copy: RenderedChannelCopy,
|
|
669
713
|
requestCode: string,
|
|
@@ -754,6 +798,7 @@ export async function evaluateSignal(
|
|
|
754
798
|
let decision = buildFallbackDecision(signal, availableChannels);
|
|
755
799
|
decision = enforceGuardianRequestCode(decision, signal);
|
|
756
800
|
decision = enforceAccessRequestInstructions(decision, signal);
|
|
801
|
+
decision = enforceHeartbeatAlertCopy(decision, signal);
|
|
757
802
|
decision = enforceGuardianCallConversationAffinity(decision, signal);
|
|
758
803
|
decision = enforceConversationAffinity(
|
|
759
804
|
decision,
|
|
@@ -783,6 +828,7 @@ export async function evaluateSignal(
|
|
|
783
828
|
|
|
784
829
|
decision = enforceGuardianRequestCode(decision, signal);
|
|
785
830
|
decision = enforceAccessRequestInstructions(decision, signal);
|
|
831
|
+
decision = enforceHeartbeatAlertCopy(decision, signal);
|
|
786
832
|
decision = enforceGuardianCallConversationAffinity(decision, signal);
|
|
787
833
|
decision = enforceConversationAffinity(
|
|
788
834
|
decision,
|
|
@@ -126,6 +126,27 @@ export function resolveDestinations(
|
|
|
126
126
|
);
|
|
127
127
|
break;
|
|
128
128
|
}
|
|
129
|
+
case "platform": {
|
|
130
|
+
// Platform delivery goes through the daemon's VellumPlatformClient —
|
|
131
|
+
// no external binding needed. Include guardianPrincipalId so the
|
|
132
|
+
// adapter can scope guardian-sensitive notifications.
|
|
133
|
+
const platformGuardian = findGuardianForChannel("vellum");
|
|
134
|
+
const platformMeta: Record<string, unknown> = {};
|
|
135
|
+
if (platformGuardian) {
|
|
136
|
+
platformMeta.guardianPrincipalId =
|
|
137
|
+
platformGuardian.contact.principalId;
|
|
138
|
+
}
|
|
139
|
+
result.set("platform", {
|
|
140
|
+
channel: "platform",
|
|
141
|
+
metadata:
|
|
142
|
+
Object.keys(platformMeta).length > 0 ? platformMeta : undefined,
|
|
143
|
+
});
|
|
144
|
+
log.debug(
|
|
145
|
+
{ channel: "platform", source: "contacts", hasEndpoint: false },
|
|
146
|
+
"destination resolved",
|
|
147
|
+
);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
129
150
|
default: {
|
|
130
151
|
// Future deliverable channels without a resolver — skip silently.
|
|
131
152
|
break;
|
|
@@ -15,6 +15,7 @@ import { getDeliverableChannels } from "../channels/config.js";
|
|
|
15
15
|
import { findGuardianForChannel } from "../contacts/contact-store.js";
|
|
16
16
|
import { getLogger } from "../util/logger.js";
|
|
17
17
|
import { type BroadcastFn, VellumAdapter } from "./adapters/macos.js";
|
|
18
|
+
import { PlatformPushAdapter } from "./adapters/platform.js";
|
|
18
19
|
import { SlackAdapter } from "./adapters/slack.js";
|
|
19
20
|
import { TelegramAdapter } from "./adapters/telegram.js";
|
|
20
21
|
import {
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
runDeterministicChecks,
|
|
29
30
|
} from "./deterministic-checks.js";
|
|
30
31
|
import { createEvent, updateEventDedupeKey } from "./events-store.js";
|
|
32
|
+
import { writeHomeFeedItemForSignal } from "./home-feed-side-effect.js";
|
|
31
33
|
import { dispatchDecision } from "./runtime-dispatch.js";
|
|
32
34
|
import type {
|
|
33
35
|
AttentionHints,
|
|
@@ -61,7 +63,11 @@ export function registerBroadcastFn(fn: BroadcastFn): void {
|
|
|
61
63
|
|
|
62
64
|
function getBroadcaster(): NotificationBroadcaster {
|
|
63
65
|
if (!broadcasterInstance) {
|
|
64
|
-
const adapters = [
|
|
66
|
+
const adapters = [
|
|
67
|
+
new TelegramAdapter(),
|
|
68
|
+
new SlackAdapter(),
|
|
69
|
+
new PlatformPushAdapter(),
|
|
70
|
+
];
|
|
65
71
|
if (registeredBroadcastFn) {
|
|
66
72
|
adapters.unshift(new VellumAdapter(registeredBroadcastFn));
|
|
67
73
|
}
|
|
@@ -110,6 +116,16 @@ function getConnectedChannels(): NotificationChannel[] {
|
|
|
110
116
|
// always available when the daemon is running).
|
|
111
117
|
channels.push(channel);
|
|
112
118
|
break;
|
|
119
|
+
case "platform":
|
|
120
|
+
// Platform push is connected when the daemon has a registered
|
|
121
|
+
// broadcast function — i.e., full daemon mode where platform
|
|
122
|
+
// credentials are also available. Mirrors the vellum gate so
|
|
123
|
+
// the decision engine doesn't route to platform in standalone
|
|
124
|
+
// CLI contexts where VellumPlatformClient.create() returns null.
|
|
125
|
+
if (registeredBroadcastFn) {
|
|
126
|
+
channels.push(channel);
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
113
129
|
case "telegram": {
|
|
114
130
|
// A binding-based channel is connected when the guardian has an
|
|
115
131
|
// active channel entry with a valid delivery endpoint. The
|
|
@@ -349,6 +365,17 @@ export async function emitNotificationSignal<TEventName extends string>(
|
|
|
349
365
|
: undefined,
|
|
350
366
|
);
|
|
351
367
|
|
|
368
|
+
// Step 5: Mirror background-origin signals into the home activity feed.
|
|
369
|
+
// The helper itself decides whether to write (background filter); we
|
|
370
|
+
// catch and log so a feed-write failure cannot poison the dispatch result.
|
|
371
|
+
await writeHomeFeedItemForSignal(
|
|
372
|
+
signal,
|
|
373
|
+
decision,
|
|
374
|
+
dispatchResult.deliveryResults,
|
|
375
|
+
).catch((err) => {
|
|
376
|
+
log.warn({ err, signalId }, "writeHomeFeedItemForSignal threw");
|
|
377
|
+
});
|
|
378
|
+
|
|
352
379
|
log.info(
|
|
353
380
|
{
|
|
354
381
|
signalId,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Home-feed side effect for the notification pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Writes a `FeedItem` into the home activity feed when a notification
|
|
5
|
+
* signal originates from a non-interactive (background or scheduled)
|
|
6
|
+
* conversation, or carries the `isAsyncBackground` attention hint.
|
|
7
|
+
*
|
|
8
|
+
* Producer flows like the scheduler, watchers, and background activity
|
|
9
|
+
* jobs already emit through `emitNotificationSignal()` — this helper
|
|
10
|
+
* mirrors the high-signal subset of that traffic into the home feed so
|
|
11
|
+
* the macOS Home page surfaces them alongside other activity.
|
|
12
|
+
*/
|
|
13
|
+
import {
|
|
14
|
+
type FeedItem,
|
|
15
|
+
feedItemSchema,
|
|
16
|
+
type FeedItemUrgency,
|
|
17
|
+
} from "../home/feed-types.js";
|
|
18
|
+
import { appendFeedItem } from "../home/feed-writer.js";
|
|
19
|
+
import { getConversation } from "../memory/conversation-crud.js";
|
|
20
|
+
import { isBackgroundConversationType } from "../memory/conversation-types.js";
|
|
21
|
+
import { getLogger } from "../util/logger.js";
|
|
22
|
+
import type { NotificationSignal } from "./signal.js";
|
|
23
|
+
import type {
|
|
24
|
+
NotificationDecision,
|
|
25
|
+
NotificationDeliveryResult,
|
|
26
|
+
} from "./types.js";
|
|
27
|
+
|
|
28
|
+
const log = getLogger("home-feed-side-effect");
|
|
29
|
+
|
|
30
|
+
const FEED_ITEM_URGENCIES: ReadonlySet<string> = new Set<FeedItemUrgency>([
|
|
31
|
+
"low",
|
|
32
|
+
"medium",
|
|
33
|
+
"high",
|
|
34
|
+
"critical",
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Append a `FeedItem` for the given notification signal when the
|
|
39
|
+
* filter criteria pass.
|
|
40
|
+
*
|
|
41
|
+
* Returns the persisted `FeedItem`, or `null` if the signal does not
|
|
42
|
+
* qualify for home-feed mirroring (non-background origin AND no
|
|
43
|
+
* `isAsyncBackground` hint) or if schema validation fails.
|
|
44
|
+
*/
|
|
45
|
+
export async function writeHomeFeedItemForSignal(
|
|
46
|
+
signal: NotificationSignal,
|
|
47
|
+
decision: NotificationDecision,
|
|
48
|
+
deliveryResults: NotificationDeliveryResult[],
|
|
49
|
+
): Promise<FeedItem | null> {
|
|
50
|
+
if (!shouldMirrorToHomeFeed(signal)) return null;
|
|
51
|
+
|
|
52
|
+
const renderedCopy = decision.renderedCopy.vellum;
|
|
53
|
+
const payloadTitle = readPayloadString(signal.contextPayload, "title");
|
|
54
|
+
const payloadBody = readPayloadString(signal.contextPayload, "body");
|
|
55
|
+
|
|
56
|
+
const conversationId = deliveryResults.find(
|
|
57
|
+
(r) => r.channel === "vellum",
|
|
58
|
+
)?.conversationId;
|
|
59
|
+
const urgency = FEED_ITEM_URGENCIES.has(signal.attentionHints.urgency)
|
|
60
|
+
? (signal.attentionHints.urgency as FeedItemUrgency)
|
|
61
|
+
: undefined;
|
|
62
|
+
const now = new Date().toISOString();
|
|
63
|
+
|
|
64
|
+
const item: FeedItem = {
|
|
65
|
+
id: `notif:${signal.signalId}`,
|
|
66
|
+
type: "notification",
|
|
67
|
+
priority: 50,
|
|
68
|
+
title: renderedCopy?.title ?? payloadTitle ?? signal.sourceEventName,
|
|
69
|
+
summary: renderedCopy?.body ?? payloadBody ?? signal.sourceEventName,
|
|
70
|
+
timestamp: now,
|
|
71
|
+
createdAt: now,
|
|
72
|
+
status: "new",
|
|
73
|
+
...(urgency ? { urgency } : {}),
|
|
74
|
+
...(conversationId ? { conversationId } : {}),
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
feedItemSchema.parse(item);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
log.warn(
|
|
81
|
+
{ err, signalId: signal.signalId },
|
|
82
|
+
"FeedItem failed schema validation; skipping home-feed write",
|
|
83
|
+
);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await appendFeedItem(item);
|
|
88
|
+
return item;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* `sourceContextId` is best-effort — it may not be a conversation id
|
|
93
|
+
* (e.g. scheduler job id, watcher event id), so a lookup failure
|
|
94
|
+
* falls through to "not a background conversation" rather than throwing.
|
|
95
|
+
*/
|
|
96
|
+
function shouldMirrorToHomeFeed(signal: NotificationSignal): boolean {
|
|
97
|
+
if (signal.attentionHints.isAsyncBackground) return true;
|
|
98
|
+
if (!signal.sourceContextId) return false;
|
|
99
|
+
try {
|
|
100
|
+
const row = getConversation(signal.sourceContextId);
|
|
101
|
+
return isBackgroundConversationType(row?.conversationType);
|
|
102
|
+
} catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function readPayloadString(payload: unknown, key: string): string | undefined {
|
|
108
|
+
if (!payload || typeof payload !== "object") return undefined;
|
|
109
|
+
const value = (payload as Record<string, unknown>)[key];
|
|
110
|
+
return typeof value === "string" ? value : undefined;
|
|
111
|
+
}
|
|
@@ -88,6 +88,11 @@ export const NOTIFICATION_SOURCE_EVENT_NAMES = [
|
|
|
88
88
|
description: "Tool requires user confirmation before executing",
|
|
89
89
|
},
|
|
90
90
|
{ id: "activity.complete", description: "Background activity finished" },
|
|
91
|
+
{
|
|
92
|
+
id: "activity.failed",
|
|
93
|
+
description:
|
|
94
|
+
"Background job execution failed (model_provider, exception, or timeout)",
|
|
95
|
+
},
|
|
91
96
|
{
|
|
92
97
|
id: "quick_chat.response_ready",
|
|
93
98
|
description: "Quick chat response ready for review",
|
|
@@ -289,6 +289,17 @@ function buildClassifyRiskParams(
|
|
|
289
289
|
): ClassifyRiskParams {
|
|
290
290
|
// ── Bash/host_bash ──
|
|
291
291
|
if (toolName === "bash" || toolName === "host_bash") {
|
|
292
|
+
// Count credential references attached to this invocation.
|
|
293
|
+
let credentialRefCount: number | undefined;
|
|
294
|
+
if (Array.isArray(input.credential_ids)) {
|
|
295
|
+
const validIds = (input.credential_ids as unknown[]).filter(
|
|
296
|
+
(id) => typeof id === "string" && id.length > 0,
|
|
297
|
+
);
|
|
298
|
+
if (validIds.length > 0) {
|
|
299
|
+
credentialRefCount = validIds.length;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
292
303
|
return {
|
|
293
304
|
tool: toolName,
|
|
294
305
|
command: getStringField(input, "command"),
|
|
@@ -297,6 +308,7 @@ function buildClassifyRiskParams(
|
|
|
297
308
|
isContainerized: getIsContainerized(),
|
|
298
309
|
networkMode:
|
|
299
310
|
typeof input.network_mode === "string" ? input.network_mode : undefined,
|
|
311
|
+
credentialRefCount,
|
|
300
312
|
};
|
|
301
313
|
}
|
|
302
314
|
|
|
@@ -44,6 +44,106 @@ const conversationThresholdCache = new Map<
|
|
|
44
44
|
>();
|
|
45
45
|
const CONVERSATION_CACHE_TTL_MS = 5_000;
|
|
46
46
|
|
|
47
|
+
// ── Failure-coalescing log helper ────────────────────────────────────────────
|
|
48
|
+
// When the gateway IPC socket is broken (e.g. the path was unlinked from
|
|
49
|
+
// disk), every threshold lookup fails with ENOENT on the hot path. Without
|
|
50
|
+
// coalescing the per-call WARN drowns the actual signal ("Strict-when-
|
|
51
|
+
// Relaxed because the gateway lost its socket") in its own log spam.
|
|
52
|
+
//
|
|
53
|
+
// Each `op` (e.g. "conversation_threshold", "global_thresholds") emits at
|
|
54
|
+
// most one WARN per {@link DEFAULT_FAILURE_WARN_INTERVAL_MS} window. The
|
|
55
|
+
// first failure in a streak WARNs immediately so failures aren't lost. When
|
|
56
|
+
// the IPC starts working again, an INFO records the streak duration and
|
|
57
|
+
// how many calls were swallowed — that's the cue dashboards should alert
|
|
58
|
+
// on.
|
|
59
|
+
|
|
60
|
+
interface FailureState {
|
|
61
|
+
consecutiveFailures: number;
|
|
62
|
+
firstFailureAt: number;
|
|
63
|
+
lastWarnAt: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const DEFAULT_FAILURE_WARN_INTERVAL_MS = 30_000;
|
|
67
|
+
let failureWarnIntervalMs = DEFAULT_FAILURE_WARN_INTERVAL_MS;
|
|
68
|
+
const failureStateByOp = new Map<string, FailureState>();
|
|
69
|
+
|
|
70
|
+
function noteFailure(
|
|
71
|
+
op: string,
|
|
72
|
+
fields: Record<string, unknown>,
|
|
73
|
+
message: string,
|
|
74
|
+
): void {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const state = failureStateByOp.get(op);
|
|
77
|
+
if (!state) {
|
|
78
|
+
failureStateByOp.set(op, {
|
|
79
|
+
consecutiveFailures: 1,
|
|
80
|
+
firstFailureAt: now,
|
|
81
|
+
lastWarnAt: now,
|
|
82
|
+
});
|
|
83
|
+
log.warn(
|
|
84
|
+
{
|
|
85
|
+
...fields,
|
|
86
|
+
op,
|
|
87
|
+
consecutiveFailures: 1,
|
|
88
|
+
event: "ipc_threshold_failure",
|
|
89
|
+
},
|
|
90
|
+
message,
|
|
91
|
+
);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
state.consecutiveFailures += 1;
|
|
95
|
+
if (now - state.lastWarnAt >= failureWarnIntervalMs) {
|
|
96
|
+
log.warn(
|
|
97
|
+
{
|
|
98
|
+
...fields,
|
|
99
|
+
op,
|
|
100
|
+
consecutiveFailures: state.consecutiveFailures,
|
|
101
|
+
streakDurationMs: now - state.firstFailureAt,
|
|
102
|
+
event: "ipc_threshold_failure",
|
|
103
|
+
},
|
|
104
|
+
message,
|
|
105
|
+
);
|
|
106
|
+
state.lastWarnAt = now;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function noteSuccess(op: string): void {
|
|
111
|
+
const state = failureStateByOp.get(op);
|
|
112
|
+
if (!state) return;
|
|
113
|
+
log.info(
|
|
114
|
+
{
|
|
115
|
+
op,
|
|
116
|
+
swallowedFailures: state.consecutiveFailures,
|
|
117
|
+
streakDurationMs: Date.now() - state.firstFailureAt,
|
|
118
|
+
event: "ipc_threshold_recovered",
|
|
119
|
+
},
|
|
120
|
+
"Gateway IPC threshold call recovered after failure streak",
|
|
121
|
+
);
|
|
122
|
+
failureStateByOp.delete(op);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Test-only: clear the failure-coalescing state. */
|
|
126
|
+
export function _resetFailureCoalesceForTesting(): void {
|
|
127
|
+
failureStateByOp.clear();
|
|
128
|
+
failureWarnIntervalMs = DEFAULT_FAILURE_WARN_INTERVAL_MS;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Test-only: read a snapshot of the failure-coalescing state for a given
|
|
133
|
+
* op. Returns `undefined` when no streak is in progress.
|
|
134
|
+
*/
|
|
135
|
+
export function _getFailureStateForTesting(
|
|
136
|
+
op: string,
|
|
137
|
+
): Readonly<FailureState> | undefined {
|
|
138
|
+
const state = failureStateByOp.get(op);
|
|
139
|
+
return state ? { ...state } : undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Test-only: override the WARN cadence. Pass {@link DEFAULT_FAILURE_WARN_INTERVAL_MS} to reset. */
|
|
143
|
+
export function _setFailureWarnIntervalForTesting(intervalMs: number): void {
|
|
144
|
+
failureWarnIntervalMs = intervalMs;
|
|
145
|
+
}
|
|
146
|
+
|
|
47
147
|
/**
|
|
48
148
|
* Clear the global threshold cache. Exported for testing.
|
|
49
149
|
*/
|
|
@@ -112,18 +212,24 @@ export async function getAutoApproveThreshold(
|
|
|
112
212
|
})) as ConversationThreshold | null | undefined;
|
|
113
213
|
|
|
114
214
|
if (result === undefined) {
|
|
115
|
-
|
|
215
|
+
noteFailure(
|
|
216
|
+
"conversation_threshold",
|
|
116
217
|
{ conversationId },
|
|
117
218
|
"IPC call failed for conversation threshold override, falling through to global",
|
|
118
219
|
);
|
|
119
220
|
// Fall through to global threshold fetch below.
|
|
120
|
-
} else if (result && isValidThreshold(result.threshold)) {
|
|
121
|
-
conversationThresholdCache.set(conversationId, {
|
|
122
|
-
threshold: result.threshold,
|
|
123
|
-
timestamp: Date.now(),
|
|
124
|
-
});
|
|
125
|
-
return result.threshold;
|
|
126
221
|
} else {
|
|
222
|
+
// Any defined response (including a null "no override") is a
|
|
223
|
+
// successful round-trip — clear any in-progress failure streak so
|
|
224
|
+
// dashboards see the recovery.
|
|
225
|
+
noteSuccess("conversation_threshold");
|
|
226
|
+
if (result && isValidThreshold(result.threshold)) {
|
|
227
|
+
conversationThresholdCache.set(conversationId, {
|
|
228
|
+
threshold: result.threshold,
|
|
229
|
+
timestamp: Date.now(),
|
|
230
|
+
});
|
|
231
|
+
return result.threshold;
|
|
232
|
+
}
|
|
127
233
|
// result === null (or an unexpected shape) — cache the negative result
|
|
128
234
|
// and fall through to global defaults.
|
|
129
235
|
conversationThresholdCache.set(conversationId, {
|
|
@@ -151,7 +257,8 @@ export async function getAutoApproveThreshold(
|
|
|
151
257
|
} catch (err) {
|
|
152
258
|
// Gateway unreachable — default to "none" (Strict) so no tools are
|
|
153
259
|
// silently auto-approved when the gateway is down.
|
|
154
|
-
|
|
260
|
+
noteFailure(
|
|
261
|
+
"global_thresholds",
|
|
155
262
|
{ error: String(err) },
|
|
156
263
|
"Failed to fetch global thresholds, defaulting to none",
|
|
157
264
|
);
|
|
@@ -176,6 +283,7 @@ async function fetchGlobalThresholds(): Promise<GlobalThresholds> {
|
|
|
176
283
|
throw new Error("Gateway IPC returned no result for global thresholds");
|
|
177
284
|
}
|
|
178
285
|
|
|
286
|
+
noteSuccess("global_thresholds");
|
|
179
287
|
cachedGlobalThresholds = result;
|
|
180
288
|
cachedGlobalTimestamp = Date.now();
|
|
181
289
|
return result;
|
|
@@ -92,4 +92,6 @@ export interface ClassifyRiskParams {
|
|
|
92
92
|
skillMetadata?: SkillMetadata;
|
|
93
93
|
/** Tool registry default risk level for unknown tools. */
|
|
94
94
|
registryDefaultRisk?: string;
|
|
95
|
+
/** Number of credential references attached to this tool invocation. */
|
|
96
|
+
credentialRefCount?: number;
|
|
95
97
|
}
|