@vellumai/assistant 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +13 -19
- package/Dockerfile +75 -1
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +17 -0
- package/docker-init-apt-root.sh +167 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +642 -5
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +83 -10
- package/scripts/sync-llm-catalog.ts +2 -2
- package/scripts/sync-web-search-catalog.ts +47 -25
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-exit-reason.test.ts +272 -0
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +195 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +45 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/compactor-tail-resolution.test.ts +147 -0
- package/src/__tests__/config-get-vision-flag.test.ts +136 -0
- package/src/__tests__/config-loader-backfill.test.ts +115 -18
- package/src/__tests__/config-schema.test.ts +21 -0
- package/src/__tests__/config-set-route.test.ts +80 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/context-search-conversations-source.test.ts +117 -2
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +31 -65
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +92 -92
- package/src/__tests__/conversation-agent-loop.test.ts +59 -1
- package/src/__tests__/conversation-error.test.ts +42 -3
- package/src/__tests__/conversation-fork-crud.test.ts +82 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
- package/src/__tests__/conversation-lifecycle.test.ts +173 -0
- package/src/__tests__/conversation-media-retry.test.ts +19 -8
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-callsite.test.ts +4 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +102 -13
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +3 -2
- package/src/__tests__/date-context.test.ts +45 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +151 -55
- package/src/__tests__/filing-service.test.ts +140 -0
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
- package/src/__tests__/heartbeat-service.test.ts +24 -164
- package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +73 -0
- package/src/__tests__/host-app-control-proxy.test.ts +507 -10
- package/src/__tests__/host-proxy-preactivation.test.ts +200 -13
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +1 -1
- package/src/__tests__/inference-profile-reaper.test.ts +4 -2
- package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
- package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
- package/src/__tests__/injector-background-turn.test.ts +153 -0
- package/src/__tests__/injector-chain.test.ts +15 -8
- package/src/__tests__/install-skill-routing.test.ts +155 -37
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +99 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +25 -0
- package/src/__tests__/llm-catalog-parity.test.ts +58 -13
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +116 -0
- package/src/__tests__/llm-request-log-error-payload.test.ts +138 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +36 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
- package/src/__tests__/llm-resolver.test.ts +255 -2
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +41 -29
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-decision-fallback.test.ts +0 -91
- package/src/__tests__/notification-decision-strategy.test.ts +14 -31
- package/src/__tests__/notification-deep-link.test.ts +15 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -2
- package/src/__tests__/notification-platform-adapter.test.ts +5 -4
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -0
- package/src/__tests__/notification-vellum-adapter.test.ts +113 -0
- package/src/__tests__/oauth-commands-routes.test.ts +168 -16
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/openai-provider.test.ts +242 -3
- package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
- package/src/__tests__/openrouter-provider-only.test.ts +51 -3
- package/src/__tests__/openrouter-token-estimation.test.ts +34 -25
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +7 -2
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +10 -36
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +0 -1
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
- package/src/__tests__/plugin-types.test.ts +3 -13
- package/src/__tests__/process-message-background-slack.test.ts +8 -1
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +158 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +33 -31
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-routes.test.ts +50 -3
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +1 -1
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
- package/src/__tests__/skill-load-tool.test.ts +27 -89
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/system-prompt.test.ts +670 -63
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/user-plugin-loader.test.ts +0 -7
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +228 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/a2a/__tests__/agent-card.test.ts +98 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +597 -0
- package/src/a2a/__tests__/protocol-helpers.test.ts +113 -0
- package/src/a2a/__tests__/task-store.test.ts +246 -0
- package/src/a2a/agent-card.ts +58 -0
- package/src/a2a/feature-gate.ts +8 -0
- package/src/a2a/protocol-constants.ts +21 -0
- package/src/a2a/protocol-errors.ts +50 -0
- package/src/a2a/protocol-types.ts +162 -0
- package/src/a2a/task-store.ts +168 -0
- package/src/acp/resolve-agent.ts +1 -1
- package/src/agent/image-optimize.ts +13 -5
- package/src/agent/loop.ts +167 -18
- package/src/calls/voice-session-bridge.ts +61 -42
- package/src/channels/config.ts +9 -0
- package/src/channels/types.ts +122 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/changelog.test.ts +304 -319
- package/src/cli/{__tests__ → commands/__tests__}/notifications.test.ts +201 -28
- package/src/cli/commands/__tests__/schedules.test.ts +960 -0
- package/src/cli/commands/changelog.ts +106 -42
- package/src/cli/commands/conversations.ts +102 -17
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/notifications.ts +388 -346
- package/src/cli/commands/plugins.ts +252 -0
- package/src/cli/commands/schedules.ts +683 -0
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +261 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/install-from-github.ts +303 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/search-plugins.ts +163 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +52 -2
- package/src/config/assistant-feature-flags.ts +24 -54
- package/src/config/bundled-skills/app-builder/SKILL.md +140 -22
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -0
- package/src/config/call-site-defaults.ts +105 -0
- package/src/config/feature-flag-registry.json +41 -9
- package/src/config/llm-resolver.ts +52 -1
- package/src/config/loader.ts +64 -38
- package/src/config/schema.ts +9 -10
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +3 -3
- package/src/config/schemas/channels.ts +17 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/conversations.ts +10 -0
- package/src/config/schemas/heartbeat.ts +23 -0
- package/src/config/schemas/llm-request-logs.ts +31 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +1 -1
- package/src/config/schemas/memory-v2.ts +4 -4
- package/src/config/schemas/memory.ts +3 -1
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +99 -29
- package/src/config/skills.ts +3 -96
- package/src/context/compactor.ts +1107 -0
- package/src/context/token-estimator.ts +34 -36
- package/src/context/window-manager.ts +197 -1520
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +33 -18
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
- package/src/daemon/approval-generators.ts +8 -6
- package/src/daemon/config-watcher.ts +94 -31
- package/src/daemon/conversation-agent-loop-handlers.ts +78 -0
- package/src/daemon/conversation-agent-loop.ts +198 -11
- package/src/daemon/conversation-error.ts +171 -37
- package/src/daemon/conversation-lifecycle.ts +53 -40
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +49 -12
- package/src/daemon/conversation-runtime-assembly.ts +25 -1
- package/src/daemon/conversation-slash.ts +12 -5
- package/src/daemon/conversation-store.ts +11 -4
- package/src/daemon/conversation-tool-setup.ts +39 -7
- package/src/daemon/conversation.ts +33 -8
- package/src/daemon/date-context.ts +40 -0
- package/src/daemon/external-plugins-bootstrap.ts +217 -181
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +1 -125
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +248 -0
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +154 -0
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +133 -0
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +95 -0
- package/src/daemon/handlers/config-a2a.ts +289 -0
- package/src/daemon/handlers/config-model.ts +6 -5
- package/src/daemon/handlers/config-slack-channel.ts +15 -3
- package/src/daemon/handlers/conversations.ts +1 -0
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +111 -108
- package/src/daemon/history-repair.ts +28 -1
- package/src/daemon/host-app-control-proxy.ts +153 -27
- package/src/daemon/host-proxy-preactivation.ts +85 -18
- package/src/daemon/lifecycle.ts +89 -91
- package/src/daemon/meet-host-supervisor.ts +5 -4
- package/src/daemon/memory-v2-startup.ts +85 -0
- package/src/daemon/message-protocol.ts +1 -0
- package/src/daemon/message-types/conversations.ts +25 -0
- package/src/daemon/message-types/messages.ts +61 -0
- package/src/daemon/message-types/notifications.ts +21 -0
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pkb-reminder-builder.test.ts +11 -54
- package/src/daemon/pkb-reminder-builder.ts +5 -20
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +24 -3
- package/src/daemon/server.ts +11 -2
- package/src/daemon/skill-memory-refresh.ts +33 -0
- package/src/daemon/wake-target-adapter.ts +2 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/__tests__/transcript-formatter.test.ts +121 -0
- package/src/export/transcript-formatter.ts +54 -20
- package/src/filing/filing-service.ts +39 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +135 -6
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +73 -189
- package/src/home/__tests__/feed-types.test.ts +80 -0
- package/src/home/feed-types.ts +36 -2
- package/src/home/post-connect-feed.ts +1 -0
- package/src/index.ts +18 -1
- package/src/ipc/cli-client.ts +147 -45
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
- package/src/memory/__tests__/conversation-queries.test.ts +483 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +2 -50
- package/src/memory/__tests__/memory-retrospective-job.test.ts +87 -4
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +42 -10
- package/src/memory/context-search/sources/conversations.ts +62 -2
- package/src/memory/context-search/sources/workspace.ts +4 -0
- package/src/memory/conversation-crud.ts +63 -19
- package/src/memory/conversation-queries.ts +197 -11
- package/src/memory/conversation-title-service.ts +26 -4
- package/src/memory/db-init.ts +12 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +4 -4
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +150 -12
- package/src/memory/graph/conversation-graph-memory.ts +49 -21
- package/src/memory/graph/tools.ts +9 -40
- package/src/memory/indexer.ts +34 -29
- package/src/memory/invite-store.ts +53 -0
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
- package/src/memory/jobs/embed-concept-page.ts +20 -11
- package/src/memory/jobs-worker.ts +6 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +24 -12
- package/src/memory/llm-request-log-source.ts +19 -52
- package/src/memory/llm-request-log-store.ts +92 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-enqueue.ts +1 -20
- package/src/memory/memory-retrospective-job.ts +33 -6
- package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
- package/src/memory/message-content.ts +1 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +7 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/250-provider-connection-base-url-and-models.ts +28 -0
- package/src/memory/migrations/251-a2a-tasks.ts +49 -0
- package/src/memory/migrations/252-llm-request-log-agent-loop-exit-reason.ts +32 -0
- package/src/memory/migrations/index.ts +9 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/schema/a2a.ts +15 -0
- package/src/memory/schema/bookmarks.ts +0 -2
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/inference.ts +3 -3
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/activation-store.test.ts +25 -23
- package/src/memory/v2/__tests__/activation.test.ts +0 -8
- package/src/memory/v2/__tests__/cli-command-store.test.ts +404 -0
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +25 -4
- package/src/memory/v2/__tests__/injection.test.ts +288 -11
- package/src/memory/v2/__tests__/migration.test.ts +87 -0
- package/src/memory/v2/__tests__/page-index.test.ts +83 -0
- package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
- package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
- package/src/memory/v2/__tests__/router.test.ts +15 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
- package/src/memory/v2/__tests__/static-context.test.ts +12 -1
- package/src/memory/v2/activation-store.ts +14 -16
- package/src/memory/v2/cli-command-content.ts +19 -0
- package/src/memory/v2/cli-command-store.ts +304 -0
- package/src/memory/v2/frontmatter-sweep.ts +7 -1
- package/src/memory/v2/injection.ts +81 -26
- package/src/memory/v2/migration.ts +49 -19
- package/src/memory/v2/page-index.ts +63 -8
- package/src/memory/v2/prompts/router.ts +11 -8
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +135 -7
- package/src/memory/v2/router.ts +9 -8
- package/src/memory/v2/skill-store.ts +120 -35
- package/src/memory/v2/static-context.ts +4 -4
- package/src/memory/v2/types.ts +23 -0
- package/src/messaging/providers/a2a/__tests__/deliver.test.ts +274 -0
- package/src/messaging/providers/a2a/deliver.ts +156 -0
- package/src/messaging/providers/gmail/client.ts +9 -2
- package/src/messaging/providers/index.ts +11 -2
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/broadcaster.test.ts +203 -0
- package/src/notifications/__tests__/decision-engine.test.ts +283 -0
- package/src/notifications/__tests__/deterministic-checks.test.ts +286 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +430 -7
- package/src/notifications/adapters/macos.ts +12 -2
- package/src/notifications/broadcaster.ts +29 -4
- package/src/notifications/conversation-pairing.ts +2 -1
- package/src/notifications/copy-composer.ts +17 -64
- package/src/notifications/decision-engine.ts +113 -45
- package/src/notifications/deterministic-checks.ts +96 -0
- package/src/notifications/emit-signal.ts +21 -1
- package/src/notifications/home-feed-side-effect.ts +138 -5
- package/src/notifications/signal.ts +3 -5
- package/src/notifications/types.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.test.ts +43 -3
- package/src/oauth/platform-connection.ts +19 -6
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +2 -0
- package/src/permissions/ipc-risk-types.ts +1 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +34 -1
- package/src/plugin-api/types.ts +104 -22
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +74 -22
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +187 -42
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +40 -26
- package/src/plugins/user-loader.ts +21 -2
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +37 -5
- package/src/prompts/__tests__/system-prompt.test.ts +10 -43
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +95 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +63 -174
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +164 -0
- package/src/providers/__tests__/inference.test.ts +24 -7
- package/src/providers/anthropic/client.ts +28 -28
- package/src/providers/call-site-routing.ts +24 -6
- package/src/providers/connection-resolution.ts +68 -11
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +74 -0
- package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +175 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +15 -0
- package/src/providers/inference/adapter-factory.ts +32 -6
- package/src/providers/inference/auth.ts +12 -0
- package/src/providers/inference/backfill.ts +14 -1
- package/src/providers/inference/connections.ts +159 -34
- package/src/providers/inference/resolve-auth.ts +14 -4
- package/src/providers/model-catalog.ts +249 -12
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +235 -0
- package/src/providers/openai/chat-completions-provider.ts +169 -8
- package/src/providers/openrouter/client.ts +49 -4
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -2
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +38 -0
- package/src/providers/provider-send-message.ts +27 -12
- package/src/providers/registry.ts +52 -15
- package/src/providers/retry.ts +47 -1
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/agent-wake.ts +103 -15
- package/src/runtime/auth/route-policy.ts +21 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/http-server.ts +7 -16
- package/src/runtime/http-types.ts +19 -47
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +258 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +172 -23
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +275 -44
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +12 -0
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +5 -3
- package/src/runtime/routes/auth-routes.ts +1 -1
- package/src/runtime/routes/bookmark-routes.ts +5 -3
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +126 -0
- package/src/runtime/routes/consolidation-routes.ts +100 -0
- package/src/runtime/routes/conversation-cli-routes.ts +44 -3
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +17 -42
- package/src/runtime/routes/conversation-query-routes.ts +99 -35
- package/src/runtime/routes/conversation-routes.ts +97 -11
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +111 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
- package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +199 -22
- package/src/runtime/routes/integrations/a2a.ts +235 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +6 -13
- package/src/runtime/routes/llm-call-sites-routes.ts +11 -1
- package/src/runtime/routes/notification-routes.ts +1 -1
- package/src/runtime/routes/oauth-commands-routes.ts +105 -15
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +4 -7
- package/src/runtime/routes/subagents-routes.ts +98 -18
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +27 -2
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +93 -1
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +9 -1
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +17 -7
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/browser-execution.ts +15 -11
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.ts +1 -9
- package/src/tools/permission-checker.ts +1 -1
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +107 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/watcher/__tests__/engine.test.ts +22 -0
- package/src/watcher/engine.ts +6 -2
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/087-memory-router-balanced-profile.ts +91 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/migrations/runner.ts +39 -9
- package/src/workspace/migrations/types.ts +4 -0
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-window-manager.test.ts +0 -2481
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -441
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/memory/graph/__tests__/remember-description.test.ts +0 -55
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- package/src/runtime/guardian-action-conversation-turn.ts +0 -99
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -20,6 +20,7 @@ import type { AssistantConfig } from "../config/schema.js";
|
|
|
20
20
|
import { seedInferenceProfiles } from "../config/seed-inference-profiles.js";
|
|
21
21
|
import type { CesClient } from "../credential-execution/client.js";
|
|
22
22
|
import { createCesClient } from "../credential-execution/client.js";
|
|
23
|
+
import { refreshManagedConnectionCache } from "../credential-execution/managed-catalog.js";
|
|
23
24
|
import {
|
|
24
25
|
type CesProcessManager,
|
|
25
26
|
CesUnavailableError,
|
|
@@ -48,17 +49,19 @@ import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
|
|
|
48
49
|
import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
|
|
49
50
|
import { QdrantManager } from "../memory/qdrant-manager.js";
|
|
50
51
|
import { rotateToolInvocations } from "../memory/tool-usage-store.js";
|
|
52
|
+
import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
|
|
51
53
|
import {
|
|
52
54
|
emitNotificationSignal,
|
|
53
55
|
registerBroadcastFn,
|
|
54
56
|
} from "../notifications/emit-signal.js";
|
|
55
57
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
56
58
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
59
|
+
import { installPluginRuntime } from "../plugins/external-api.js";
|
|
57
60
|
import { loadUserPlugins } from "../plugins/user-loader.js";
|
|
58
61
|
import { backfillGuardIfNeeded } from "../proactive-artifact/index.js";
|
|
59
62
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
60
63
|
import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
|
|
61
|
-
import { resolveManagedProxyContext } from "../providers/
|
|
64
|
+
import { resolveManagedProxyContext } from "../providers/platform-proxy/context.js";
|
|
62
65
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
63
66
|
import {
|
|
64
67
|
initAuthSigningKey,
|
|
@@ -74,7 +77,10 @@ import {
|
|
|
74
77
|
setCesClient,
|
|
75
78
|
setCesReconnect,
|
|
76
79
|
} from "../security/secure-keys.js";
|
|
77
|
-
import {
|
|
80
|
+
import {
|
|
81
|
+
setUsageTelemetryReporter,
|
|
82
|
+
UsageTelemetryReporter,
|
|
83
|
+
} from "../telemetry/usage-telemetry-reporter.js";
|
|
78
84
|
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
79
85
|
import { getDeviceId } from "../util/device-id.js";
|
|
80
86
|
import { getLogger, initLogger } from "../util/logger.js";
|
|
@@ -91,10 +97,6 @@ import {
|
|
|
91
97
|
import { WorkspaceHeartbeatService } from "../workspace/heartbeat-service.js";
|
|
92
98
|
import { WORKSPACE_MIGRATIONS } from "../workspace/migrations/registry.js";
|
|
93
99
|
import { runWorkspaceMigrations } from "../workspace/migrations/runner.js";
|
|
94
|
-
import {
|
|
95
|
-
createApprovalConversationGenerator,
|
|
96
|
-
createApprovalCopyGenerator,
|
|
97
|
-
} from "./approval-generators.js";
|
|
98
100
|
import {
|
|
99
101
|
cleanupPidFile,
|
|
100
102
|
cleanupPidFileIfOwner,
|
|
@@ -106,15 +108,11 @@ import {
|
|
|
106
108
|
stopDiskPressureGuard,
|
|
107
109
|
} from "./disk-pressure-guard.js";
|
|
108
110
|
import { bootstrapPlugins } from "./external-plugins-bootstrap.js";
|
|
109
|
-
import {
|
|
110
|
-
createGuardianActionCopyGenerator,
|
|
111
|
-
createGuardianFollowUpConversationGenerator,
|
|
112
|
-
} from "./guardian-action-generators.js";
|
|
113
111
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
114
112
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
115
113
|
import {
|
|
116
114
|
maybeRebuildMemoryV2Concepts,
|
|
117
|
-
|
|
115
|
+
rebuildBm25CorpusStatsAndReseedSkills,
|
|
118
116
|
} from "./memory-v2-startup.js";
|
|
119
117
|
import { processMessage } from "./process-message.js";
|
|
120
118
|
import { runProfilerSweep } from "./profiler-run-store.js";
|
|
@@ -126,6 +124,7 @@ import {
|
|
|
126
124
|
import { seedInterfaceFiles } from "./seed-files.js";
|
|
127
125
|
import { DaemonServer } from "./server.js";
|
|
128
126
|
import { installShutdownHandlers } from "./shutdown-handlers.js";
|
|
127
|
+
import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
129
128
|
|
|
130
129
|
const log = getLogger("lifecycle");
|
|
131
130
|
let diskPressureStartupSampleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
@@ -316,6 +315,35 @@ export async function runDaemon(): Promise<void> {
|
|
|
316
315
|
const signingKey = resolveSigningKey();
|
|
317
316
|
initAuthSigningKey(signingKey);
|
|
318
317
|
|
|
318
|
+
// Start the runtime HTTP server early so /healthz answers ASAP.
|
|
319
|
+
let runtimeHttp: RuntimeHttpServer | null = null;
|
|
320
|
+
const httpPort = getRuntimeHttpPort();
|
|
321
|
+
const httpHostname = getRuntimeHttpHost();
|
|
322
|
+
log.info({ httpPort }, "Daemon startup: starting runtime HTTP server");
|
|
323
|
+
|
|
324
|
+
runtimeHttp = new RuntimeHttpServer({
|
|
325
|
+
port: httpPort,
|
|
326
|
+
hostname: httpHostname,
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// Isolated try/catch around start() — a bind failure (port in use,
|
|
330
|
+
// permission denied, fd exhaustion) must not tear down the rest of
|
|
331
|
+
// daemon startup. The daemon falls back to IPC-only operation when
|
|
332
|
+
// runtimeHttp is null.
|
|
333
|
+
try {
|
|
334
|
+
await runtimeHttp.start();
|
|
335
|
+
log.info(
|
|
336
|
+
{ port: httpPort, hostname: httpHostname },
|
|
337
|
+
"Daemon startup: runtime HTTP server listening",
|
|
338
|
+
);
|
|
339
|
+
} catch (err) {
|
|
340
|
+
log.warn(
|
|
341
|
+
{ err, port: httpPort },
|
|
342
|
+
"Failed to start runtime HTTP server, continuing without it",
|
|
343
|
+
);
|
|
344
|
+
runtimeHttp = null;
|
|
345
|
+
}
|
|
346
|
+
|
|
319
347
|
// Pre-populate feature flag overrides so subsequent sync
|
|
320
348
|
// isAssistantFeatureFlagEnabled() calls have data. Fired non-blocking
|
|
321
349
|
// so a slow or unreachable gateway doesn't delay daemon startup (the
|
|
@@ -504,6 +532,25 @@ export async function runDaemon(): Promise<void> {
|
|
|
504
532
|
}
|
|
505
533
|
} // end if (dbReady)
|
|
506
534
|
|
|
535
|
+
// Populate the managed-connection cache so buildIntegrationSection()
|
|
536
|
+
// can include platform-managed OAuth connections (e.g. Twitter) in the
|
|
537
|
+
// system prompt's "Connected Services" section from the first turn.
|
|
538
|
+
// This is an HTTP-only call with no DB dependency, so it runs regardless
|
|
539
|
+
// of dbReady. A periodic refresh keeps the cache current when users
|
|
540
|
+
// connect/disconnect managed providers while the assistant is running.
|
|
541
|
+
void refreshManagedConnectionCache().catch((err) =>
|
|
542
|
+
log.warn(
|
|
543
|
+
{ err },
|
|
544
|
+
"Managed connection cache refresh failed — continuing startup",
|
|
545
|
+
),
|
|
546
|
+
);
|
|
547
|
+
const MANAGED_CONNECTION_REFRESH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
548
|
+
setInterval(() => {
|
|
549
|
+
void refreshManagedConnectionCache().catch((err) =>
|
|
550
|
+
log.warn({ err }, "Periodic managed connection cache refresh failed"),
|
|
551
|
+
);
|
|
552
|
+
}, MANAGED_CONNECTION_REFRESH_INTERVAL_MS);
|
|
553
|
+
|
|
507
554
|
// Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
|
|
508
555
|
// into the workspace config file before profile seeding and the first
|
|
509
556
|
// loadConfig() call so onboarding/platform preferences are visible to the
|
|
@@ -565,6 +612,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
565
612
|
let telemetryReporter: UsageTelemetryReporter | null = null;
|
|
566
613
|
if (collectUsageData) {
|
|
567
614
|
telemetryReporter = new UsageTelemetryReporter();
|
|
615
|
+
setUsageTelemetryReporter(telemetryReporter);
|
|
568
616
|
telemetryReporter.start();
|
|
569
617
|
log.info("Usage telemetry reporter started");
|
|
570
618
|
}
|
|
@@ -648,6 +696,12 @@ export async function runDaemon(): Promise<void> {
|
|
|
648
696
|
});
|
|
649
697
|
}
|
|
650
698
|
|
|
699
|
+
// Install the `globalThis.__vellumPluginRuntime` bridge before scanning
|
|
700
|
+
// for user plugins. Plugins that touch the bridge from their module body
|
|
701
|
+
// would throw without this — see `plugins/external-api.ts` for the
|
|
702
|
+
// rationale (compiled-binary module identity).
|
|
703
|
+
installPluginRuntime();
|
|
704
|
+
|
|
651
705
|
// Populate the registry with user plugins from `<workspaceDir>/plugins/*`
|
|
652
706
|
// AFTER first-party plugins have already registered via their static
|
|
653
707
|
// side-effect imports. User plugins may fail to load individually; a
|
|
@@ -829,46 +883,16 @@ export async function runDaemon(): Promise<void> {
|
|
|
829
883
|
})();
|
|
830
884
|
}
|
|
831
885
|
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
await import("../memory/v2/sparse-bm25.js");
|
|
843
|
-
await rebuildConceptPageCorpusStats(getWorkspaceDir());
|
|
844
|
-
log.info("Memory v2 BM25 corpus stats built");
|
|
845
|
-
} catch (err) {
|
|
846
|
-
log.warn(
|
|
847
|
-
{ err },
|
|
848
|
-
"BM25 corpus-stats rebuild failed — sparse channel will fall back to TF-only until next rebuild",
|
|
849
|
-
);
|
|
850
|
-
}
|
|
851
|
-
})();
|
|
852
|
-
|
|
853
|
-
// Validate every concept page's frontmatter against the strict
|
|
854
|
-
// schema and emit a `warn` per offender. Surfaces schema drift
|
|
855
|
-
// (unknown keys, type mismatches) at boot time instead of waiting
|
|
856
|
-
// for the failure to manifest as a silent V2 retrieval no-op when
|
|
857
|
-
// a bad page first lands in a conversation's top-K. Fire-and-forget
|
|
858
|
-
// and the sweep itself never throws — defense in depth via the
|
|
859
|
-
// outer try/catch.
|
|
860
|
-
void (async () => {
|
|
861
|
-
try {
|
|
862
|
-
const { sweepConceptPageFrontmatter } =
|
|
863
|
-
await import("../memory/v2/frontmatter-sweep.js");
|
|
864
|
-
await sweepConceptPageFrontmatter(getWorkspaceDir());
|
|
865
|
-
} catch (err) {
|
|
866
|
-
log.warn(
|
|
867
|
-
{ err },
|
|
868
|
-
"Concept page frontmatter sweep threw — continuing startup",
|
|
869
|
-
);
|
|
870
|
-
}
|
|
871
|
-
})();
|
|
886
|
+
void rebuildBm25CorpusStatsAndReseedSkills(config);
|
|
887
|
+
|
|
888
|
+
try {
|
|
889
|
+
await sweepConceptPageFrontmatter(config, getWorkspaceDir());
|
|
890
|
+
} catch (err) {
|
|
891
|
+
log.warn(
|
|
892
|
+
{ err },
|
|
893
|
+
"Concept page frontmatter sweep threw — continuing startup",
|
|
894
|
+
);
|
|
895
|
+
}
|
|
872
896
|
}
|
|
873
897
|
|
|
874
898
|
log.info("Daemon startup: starting memory worker");
|
|
@@ -876,20 +900,10 @@ export async function runDaemon(): Promise<void> {
|
|
|
876
900
|
|
|
877
901
|
// Seed capability graph nodes (new memory graph system)
|
|
878
902
|
try {
|
|
879
|
-
const {
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
seedUninstalledCatalogSkillMemories,
|
|
883
|
-
} = await import("../memory/graph/capability-seed.js");
|
|
884
|
-
seedSkillGraphNodes();
|
|
885
|
-
maybeSeedMemoryV2Skills(config);
|
|
903
|
+
const { seedCliGraphNodes } =
|
|
904
|
+
await import("../memory/graph/capability-seed.js");
|
|
905
|
+
refreshSkillCapabilityMemories(config);
|
|
886
906
|
await seedCliGraphNodes();
|
|
887
|
-
void seedUninstalledCatalogSkillMemories().catch((err) =>
|
|
888
|
-
log.warn(
|
|
889
|
-
{ err },
|
|
890
|
-
"Uninstalled catalog skill memory seeding failed — continuing",
|
|
891
|
-
),
|
|
892
|
-
);
|
|
893
907
|
} catch (err) {
|
|
894
908
|
log.warn({ err }, "Graph capability seeding failed — continuing");
|
|
895
909
|
}
|
|
@@ -999,24 +1013,12 @@ export async function runDaemon(): Promise<void> {
|
|
|
999
1013
|
},
|
|
1000
1014
|
);
|
|
1001
1015
|
|
|
1002
|
-
//
|
|
1003
|
-
//
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
const hostname = getRuntimeHttpHost();
|
|
1009
|
-
|
|
1010
|
-
runtimeHttp = new RuntimeHttpServer({
|
|
1011
|
-
port: httpPort,
|
|
1012
|
-
hostname,
|
|
1013
|
-
approvalCopyGenerator: createApprovalCopyGenerator(),
|
|
1014
|
-
approvalConversationGenerator: createApprovalConversationGenerator(),
|
|
1015
|
-
guardianActionCopyGenerator: createGuardianActionCopyGenerator(),
|
|
1016
|
-
guardianFollowUpConversationGenerator:
|
|
1017
|
-
createGuardianFollowUpConversationGenerator(),
|
|
1018
|
-
});
|
|
1019
|
-
|
|
1016
|
+
// Wire up the runtime HTTP server's deferred dependencies. The server
|
|
1017
|
+
// itself was bound early in runDaemon (right after the auth signing key
|
|
1018
|
+
// was loaded) so /healthz and /readyz already answer 200 OK; these
|
|
1019
|
+
// registrations attach the live DaemonServer / CES / relay handlers to
|
|
1020
|
+
// the running routes. They're module-level state, so they're effective
|
|
1021
|
+
// even when the HTTP server failed to bind (IPC clients still work).
|
|
1020
1022
|
registerSecretsDeps({
|
|
1021
1023
|
getCesClient: () => server.getCesClient(),
|
|
1022
1024
|
onProviderCredentialsChanged: () =>
|
|
@@ -1033,8 +1035,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
1033
1035
|
log.warn({ err }, "Background Qdrant init failed"),
|
|
1034
1036
|
);
|
|
1035
1037
|
|
|
1036
|
-
// Inject voice bridge deps
|
|
1037
|
-
//
|
|
1038
|
+
// Inject voice bridge deps so route handlers + the relay pipeline can
|
|
1039
|
+
// resolve a conversation by ID once a call lands. Module-level state,
|
|
1040
|
+
// so available even when the HTTP server failed to bind.
|
|
1038
1041
|
setVoiceBridgeDeps({
|
|
1039
1042
|
getOrCreateConversation: (conversationId, _transport) =>
|
|
1040
1043
|
server.getConversationForMessages(conversationId),
|
|
@@ -1053,7 +1056,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
1053
1056
|
},
|
|
1054
1057
|
});
|
|
1055
1058
|
try {
|
|
1056
|
-
await runtimeHttp.start();
|
|
1057
1059
|
setRelayBroadcast((msg) => broadcastMessage(msg));
|
|
1058
1060
|
setPointerMessageProcessor(
|
|
1059
1061
|
async (conversationId, instruction, requiredFacts) => {
|
|
@@ -1191,14 +1193,10 @@ export async function runDaemon(): Promise<void> {
|
|
|
1191
1193
|
},
|
|
1192
1194
|
);
|
|
1193
1195
|
server.broadcastStatus();
|
|
1194
|
-
log.info(
|
|
1195
|
-
{ port: httpPort, hostname },
|
|
1196
|
-
"Daemon startup: runtime HTTP server listening",
|
|
1197
|
-
);
|
|
1198
1196
|
} catch (err) {
|
|
1199
1197
|
log.warn(
|
|
1200
|
-
{ err
|
|
1201
|
-
"Failed to
|
|
1198
|
+
{ err },
|
|
1199
|
+
"Failed to wire runtime HTTP server deps, continuing without them",
|
|
1202
1200
|
);
|
|
1203
1201
|
runtimeHttp = null;
|
|
1204
1202
|
}
|
|
@@ -254,10 +254,11 @@ export class MeetHostSupervisor {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
/**
|
|
257
|
-
* Ensure the meet-host child is spawned
|
|
258
|
-
* received
|
|
259
|
-
*
|
|
260
|
-
*
|
|
257
|
+
* Ensure the meet-host child is spawned and the IPC handshake has
|
|
258
|
+
* been received. Idempotent: a second call while the child is
|
|
259
|
+
* already running is a no-op; a second call during an in-flight
|
|
260
|
+
* spawn awaits the same promise. Manifest hash validation is
|
|
261
|
+
* currently dormant (see {@link notifyHandshake}).
|
|
261
262
|
*/
|
|
262
263
|
ensureRunning(): Promise<void> {
|
|
263
264
|
if (this.shuttingDown) {
|
|
@@ -35,6 +35,91 @@ export function maybeSeedMemoryV2Skills(config: AssistantConfig): void {
|
|
|
35
35
|
);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Fire-and-forget seed of the v2 CLI-subcommand entries (indexed alongside
|
|
40
|
+
* concept pages and skills in `memory_v2_concept_pages` under the
|
|
41
|
+
* `cli-commands/<name>` slug prefix). Dynamic import keeps v2 code out of the
|
|
42
|
+
* startup graph when the gate is off. Never awaits — startup must not block.
|
|
43
|
+
*/
|
|
44
|
+
export function maybeSeedMemoryV2CliCommands(config: AssistantConfig): void {
|
|
45
|
+
if (!config.memory.v2.enabled) return;
|
|
46
|
+
void import("../memory/v2/cli-command-store.js")
|
|
47
|
+
.then(({ seedV2CliCommandEntries }) => seedV2CliCommandEntries())
|
|
48
|
+
.catch((err) => log.warn({ err }, "Failed to seed v2 CLI-command entries"));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Build the v2 BM25 corpus stats (per-token document frequencies + avg doc
|
|
53
|
+
* length), then re-seed the v2 skill entries so any skills written during
|
|
54
|
+
* cold start with the legacy TF encoder get rewritten with stemmed BM25
|
|
55
|
+
* vectors. The cold-start window exists because the very first
|
|
56
|
+
* `maybeSeedMemoryV2Skills` call can race ahead of the corpus-stats build —
|
|
57
|
+
* `skill-store.runSeedOnce` falls back to `generateSparseEmbedding` while
|
|
58
|
+
* `getConceptPageCorpusStats()` is still `null`, leaving stored skill
|
|
59
|
+
* sparse vectors in a different hash space than the BM25 query vectors
|
|
60
|
+
* callers issue (see `simBatch`, `activation.selectCandidates`). Reseeding
|
|
61
|
+
* here closes that gap without operator intervention.
|
|
62
|
+
*
|
|
63
|
+
* Fire-and-forget by design — startup must not block on either step. The
|
|
64
|
+
* reseed depends on the corpus-stats build, so a corpus-stats failure
|
|
65
|
+
* short-circuits and skips the reseed (the BM25 vectors it would produce
|
|
66
|
+
* would be wrong without fresh stats). Both steps log and swallow their own
|
|
67
|
+
* errors so neither blocks startup.
|
|
68
|
+
*/
|
|
69
|
+
export async function rebuildBm25CorpusStatsAndReseedSkills(
|
|
70
|
+
config: AssistantConfig,
|
|
71
|
+
): Promise<void> {
|
|
72
|
+
if (!config.memory.v2.enabled) return;
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const { rebuildConceptPageCorpusStats } =
|
|
76
|
+
await import("../memory/v2/sparse-bm25.js");
|
|
77
|
+
await rebuildConceptPageCorpusStats(getWorkspaceDir());
|
|
78
|
+
log.info("Memory v2 BM25 corpus stats built");
|
|
79
|
+
} catch (err) {
|
|
80
|
+
log.warn(
|
|
81
|
+
{ err },
|
|
82
|
+
"BM25 corpus-stats rebuild failed — sparse channel will fall back to TF-only until next rebuild",
|
|
83
|
+
);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Skills and CLI commands share the unified collection but are independent
|
|
88
|
+
// catalogs — reseed in parallel so the second one isn't gated on the first.
|
|
89
|
+
await Promise.all([
|
|
90
|
+
(async () => {
|
|
91
|
+
try {
|
|
92
|
+
const { seedV2SkillEntries } =
|
|
93
|
+
await import("../memory/v2/skill-store.js");
|
|
94
|
+
await seedV2SkillEntries({ throwOnError: true });
|
|
95
|
+
log.info(
|
|
96
|
+
"Memory v2 skill embeddings re-seeded with BM25 vectors after corpus-stats build",
|
|
97
|
+
);
|
|
98
|
+
} catch (err) {
|
|
99
|
+
log.warn(
|
|
100
|
+
{ err },
|
|
101
|
+
"Failed to re-seed v2 skill entries after BM25 corpus-stats build — skills seeded during cold start may keep TF-only sparse vectors until next reseed",
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
})(),
|
|
105
|
+
(async () => {
|
|
106
|
+
try {
|
|
107
|
+
const { seedV2CliCommandEntries } =
|
|
108
|
+
await import("../memory/v2/cli-command-store.js");
|
|
109
|
+
await seedV2CliCommandEntries({ throwOnError: true });
|
|
110
|
+
log.info(
|
|
111
|
+
"Memory v2 CLI-command embeddings re-seeded with BM25 vectors after corpus-stats build",
|
|
112
|
+
);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
log.warn(
|
|
115
|
+
{ err },
|
|
116
|
+
"Failed to re-seed v2 CLI-command entries after BM25 corpus-stats build — entries seeded during cold start may keep TF-only sparse vectors until next reseed",
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
})(),
|
|
120
|
+
]);
|
|
121
|
+
}
|
|
122
|
+
|
|
38
123
|
/**
|
|
39
124
|
* Reconcile the v2 concept-page Qdrant collection with the expected schema
|
|
40
125
|
* and enqueue `memory_v2_reembed` when the collection is missing data.
|
|
@@ -224,9 +224,18 @@ export interface ConversationTitleUpdated {
|
|
|
224
224
|
interface ChannelBinding {
|
|
225
225
|
sourceChannel: ChannelId;
|
|
226
226
|
externalChatId: string;
|
|
227
|
+
externalThreadId?: string | null;
|
|
227
228
|
externalUserId?: string | null;
|
|
228
229
|
displayName?: string | null;
|
|
229
230
|
username?: string | null;
|
|
231
|
+
slackThread?: {
|
|
232
|
+
channelId: string;
|
|
233
|
+
threadTs: string;
|
|
234
|
+
link?: {
|
|
235
|
+
appUrl?: string;
|
|
236
|
+
webUrl?: string;
|
|
237
|
+
};
|
|
238
|
+
};
|
|
230
239
|
}
|
|
231
240
|
|
|
232
241
|
/** Attention state metadata for a conversation's latest assistant message. */
|
|
@@ -411,6 +420,7 @@ export interface HistoryResponse {
|
|
|
411
420
|
status: "running" | "completed" | "failed" | "aborted";
|
|
412
421
|
error?: string;
|
|
413
422
|
conversationId?: string;
|
|
423
|
+
objective?: string;
|
|
414
424
|
};
|
|
415
425
|
/** True when text or tool result content was truncated due to maxTextChars/maxToolResultChars. */
|
|
416
426
|
wasTruncated?: boolean;
|
|
@@ -535,6 +545,7 @@ export type ConversationErrorCode =
|
|
|
535
545
|
| "PROVIDER_ORDERING"
|
|
536
546
|
| "PROVIDER_WEB_SEARCH"
|
|
537
547
|
| "PROVIDER_NOT_CONFIGURED"
|
|
548
|
+
| "PROVIDER_INVALID_KEY"
|
|
538
549
|
| "MANAGED_KEY_INVALID"
|
|
539
550
|
| "CONTEXT_TOO_LARGE"
|
|
540
551
|
| "CONVERSATION_ABORTED"
|
|
@@ -552,6 +563,20 @@ export interface ConversationErrorMessage {
|
|
|
552
563
|
debugDetails?: string;
|
|
553
564
|
/** Machine-readable error category for log report metadata and triage. */
|
|
554
565
|
errorCategory?: string;
|
|
566
|
+
/**
|
|
567
|
+
* Name of the `provider_connections` row in play when the error occurred.
|
|
568
|
+
* Surfaced by the macOS chat banner so users know which connection to fix
|
|
569
|
+
* (e.g. an invalid API key on `my-anthropic`). Optional because some
|
|
570
|
+
* errors fire before a connection is resolved.
|
|
571
|
+
*/
|
|
572
|
+
connectionName?: string;
|
|
573
|
+
/**
|
|
574
|
+
* Name of the resolved profile (`llm.activeProfile` or per-call override)
|
|
575
|
+
* in play when the error occurred. Lets the macOS chat banner point
|
|
576
|
+
* users at the right profile even when the connection name is generic.
|
|
577
|
+
* Optional because some errors fire before a profile is resolved.
|
|
578
|
+
*/
|
|
579
|
+
profileName?: string;
|
|
555
580
|
}
|
|
556
581
|
|
|
557
582
|
/** Reason the conversation list was invalidated. */
|
|
@@ -235,6 +235,66 @@ export interface SecretRequest {
|
|
|
235
235
|
allowOneTimeSend?: boolean;
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
export interface QuestionOption {
|
|
239
|
+
id: string;
|
|
240
|
+
label: string;
|
|
241
|
+
description?: string;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* One entry in a batched ask-question request.
|
|
246
|
+
*
|
|
247
|
+
* `id` is daemon-assigned (e.g. `q1`, `q2`...) — the LLM neither sees nor
|
|
248
|
+
* supplies it. It exists so the client has a stable handle to post the
|
|
249
|
+
* user's answer back against. See `QuestionRequest` for the batching
|
|
250
|
+
* contract.
|
|
251
|
+
*/
|
|
252
|
+
export interface QuestionEntry {
|
|
253
|
+
id: string;
|
|
254
|
+
question: string;
|
|
255
|
+
description?: string;
|
|
256
|
+
/** LLM-supplied options, capped at 4. The client always renders a fixed
|
|
257
|
+
* 5th "Type something else" slot wired to a free-text response — so this
|
|
258
|
+
* array never represents the full choice set the user sees. */
|
|
259
|
+
options: QuestionOption[];
|
|
260
|
+
/** Optional placeholder shown in the free-text input. */
|
|
261
|
+
freeTextPlaceholder?: string;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* A single broadcast that carries either one or a small batch (≤5) of
|
|
266
|
+
* clarifying questions. The whole batch is one card lifecycle on the client:
|
|
267
|
+
* one render, one state machine, one response submission.
|
|
268
|
+
*
|
|
269
|
+
* Wire-compat plan: both shapes are populated on every broadcast.
|
|
270
|
+
* - `questions[]` is the canonical shape new clients should consume.
|
|
271
|
+
* - The flat `question` / `description` / `options` / `freeTextPlaceholder`
|
|
272
|
+
* fields mirror `questions[0]` for backwards compat with the existing
|
|
273
|
+
* web client, which keys off the flat fields. Once that client adopts
|
|
274
|
+
* `questions[]`, the flat fields can be dropped (separate cleanup).
|
|
275
|
+
*
|
|
276
|
+
* Daemon callers that don't supply a batch get a one-element `questions`
|
|
277
|
+
* array synthesized from the flat fields.
|
|
278
|
+
*/
|
|
279
|
+
export interface QuestionRequest {
|
|
280
|
+
type: "question_request";
|
|
281
|
+
requestId: string;
|
|
282
|
+
/** Batched-question payload. Always populated (single questions are sent
|
|
283
|
+
* as a one-element array). Each entry's `id` is daemon-assigned. */
|
|
284
|
+
questions: QuestionEntry[];
|
|
285
|
+
/** Legacy: mirrors `questions[0].question`. Kept populated for clients
|
|
286
|
+
* that haven't adopted the batched `questions[]` shape yet. */
|
|
287
|
+
question: string;
|
|
288
|
+
/** Legacy: mirrors `questions[0].description`. */
|
|
289
|
+
description?: string;
|
|
290
|
+
/** Legacy: mirrors `questions[0].options`. */
|
|
291
|
+
options: QuestionOption[];
|
|
292
|
+
/** Legacy: mirrors `questions[0].freeTextPlaceholder`. */
|
|
293
|
+
freeTextPlaceholder?: string;
|
|
294
|
+
conversationId?: string;
|
|
295
|
+
toolUseId?: string;
|
|
296
|
+
}
|
|
297
|
+
|
|
238
298
|
export interface MessageComplete {
|
|
239
299
|
type: "message_complete";
|
|
240
300
|
conversationId?: string;
|
|
@@ -430,6 +490,7 @@ export type _MessagesServerMessages =
|
|
|
430
490
|
| ToolResult
|
|
431
491
|
| ConfirmationRequest
|
|
432
492
|
| SecretRequest
|
|
493
|
+
| QuestionRequest
|
|
433
494
|
| MessageComplete
|
|
434
495
|
| ErrorMessage
|
|
435
496
|
| MessageQueued
|
|
@@ -14,6 +14,20 @@ export interface NotificationIntent {
|
|
|
14
14
|
* Clients not bound to this guardian should ignore the notification.
|
|
15
15
|
*/
|
|
16
16
|
targetGuardianPrincipalId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* When true, the client must NOT post this intent to the OS notification
|
|
19
|
+
* surface (`UNUserNotificationCenter` on macOS). Non-banner side effects
|
|
20
|
+
* (guardian filtering, fallback dedup, mark-unseen + history catch-up on
|
|
21
|
+
* the paired conversation) still run. The home-feed inbox entry is
|
|
22
|
+
* written independently by `home-feed-side-effect.ts` and is unaffected
|
|
23
|
+
* by this flag.
|
|
24
|
+
*
|
|
25
|
+
* Set by the server based on `attentionHints.urgency`: true for
|
|
26
|
+
* `low`/`medium`, false for `high`/`critical`. The notification center
|
|
27
|
+
* is the always-on canonical inbox; the OS banner is reserved for
|
|
28
|
+
* signals the user opted into push for (urgency >= high).
|
|
29
|
+
*/
|
|
30
|
+
silent?: boolean;
|
|
17
31
|
}
|
|
18
32
|
|
|
19
33
|
/** Server push — broadcast when a notification creates a new vellum conversation. */
|
|
@@ -39,6 +53,13 @@ export interface NotificationConversationCreated {
|
|
|
39
53
|
* conversation is attributed correctly.
|
|
40
54
|
*/
|
|
41
55
|
source?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Mirrors `NotificationIntent.silent`. When true the client must not
|
|
58
|
+
* post a fallback OS banner for this conversation — the sidebar entry
|
|
59
|
+
* still appears, but the always-on inbox is the only surfaced channel.
|
|
60
|
+
* Derived from the originating signal's `attentionHints.urgency`.
|
|
61
|
+
*/
|
|
62
|
+
silent?: boolean;
|
|
42
63
|
}
|
|
43
64
|
|
|
44
65
|
/** Client ack sent after UNUserNotificationCenter.add() completes (or fails). */
|
|
@@ -5,6 +5,7 @@ export const SYNC_TAGS = {
|
|
|
5
5
|
assistantIdentity: "assistant:self:identity",
|
|
6
6
|
assistantConfig: "assistant:self:config",
|
|
7
7
|
assistantSounds: "assistant:self:sounds",
|
|
8
|
+
assistantSchedules: "assistant:self:schedules",
|
|
8
9
|
conversationsList: "conversations:list",
|
|
9
10
|
} as const;
|
|
10
11
|
|