@vellumai/assistant 0.8.5 → 0.8.7
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 +33 -1
- package/ARCHITECTURE.md +1 -1
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/bunfig.toml +6 -1
- package/docker-entrypoint.sh +8 -6
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +67 -31
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +15 -17
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +10 -3
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +5585 -469
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +336 -42
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +21 -33
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +5 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -40
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +5 -11
- package/src/__tests__/approval-routes-http.test.ts +13 -15
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -27
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +10 -14
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +51 -22
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-guardian.test.ts +3 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +170 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +388 -79
- package/src/__tests__/checker.test.ts +12 -12
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +6 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +186 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +14 -16
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +56 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +19 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +4 -2
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +464 -90
- package/src/__tests__/conversation-agent-loop.test.ts +1069 -64
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -3
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -1
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +16 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +132 -157
- package/src/__tests__/conversation-fork-route.test.ts +19 -16
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +4 -2
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -3
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +87 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +30 -7
- package/src/__tests__/conversation-process-callsite.test.ts +28 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +58 -44
- package/src/__tests__/conversation-queue.test.ts +603 -455
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -20
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +35 -10
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -4
- package/src/__tests__/conversation-runtime-assembly.test.ts +98 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- package/src/__tests__/conversation-slash-queue.test.ts +120 -62
- package/src/__tests__/conversation-slash-unknown.test.ts +18 -15
- package/src/__tests__/conversation-speed-override.test.ts +9 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +52 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +13 -32
- package/src/__tests__/conversation-sync-tags.test.ts +128 -12
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +53 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +1 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +53 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +32 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +61 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +119 -36
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +9 -35
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +33 -42
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +3 -2
- package/src/__tests__/first-greeting.test.ts +103 -12
- package/src/__tests__/gateway-flag-listener.test.ts +0 -1
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +375 -26
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +11 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +31 -9
- package/src/__tests__/identity-intro-cache.test.ts +154 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +51 -74
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +4 -18
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +93 -11
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +346 -39
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +9 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +44 -22
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/oauth-commands-routes.test.ts +38 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +13 -2
- package/src/__tests__/openai-provider.test.ts +74 -79
- package/src/__tests__/openai-responses-provider.test.ts +90 -86
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +48 -2
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +154 -27
- package/src/__tests__/persistence-secret-redaction.test.ts +85 -13
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +60 -36
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +51 -64
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +38 -32
- package/src/__tests__/process-message-display-content.test.ts +49 -64
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +215 -8
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +30 -23
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +83 -1
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +7 -3
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +83 -43
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +19 -21
- package/src/__tests__/skill-feature-flags.test.ts +20 -22
- package/src/__tests__/skill-load-feature-flag.test.ts +15 -15
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +13 -5
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +5 -4
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +4 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +92 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +14 -11
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +10 -7
- package/src/__tests__/voice-session-bridge.test.ts +50 -35
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/session-manager.ts +5 -6
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +489 -85
- package/src/api/README.md +126 -2
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +49 -0
- package/src/api/events/assistant-text-delta.ts +30 -0
- package/src/api/events/assistant-turn-start.ts +31 -0
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +44 -0
- package/src/api/events/document-comment-deleted.ts +22 -0
- package/src/api/events/document-comment-reopened.ts +23 -0
- package/src/api/events/document-comment-resolved.ts +25 -0
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +22 -0
- package/src/api/events/generation-handoff.ts +39 -0
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +40 -0
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +28 -0
- package/src/api/events/question-request.ts +67 -0
- package/src/{events → api/events}/relationship-state-updated.ts +6 -8
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +30 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +482 -3
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +41 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/background-wake-routes.test.ts +687 -52
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +2 -2
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +17 -31
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +168 -203
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +6 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +25 -44
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +10 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/call-site-defaults.ts +3 -8
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +42 -26
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -211
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +92 -4
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -227
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +29 -5
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +15 -17
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +11 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +613 -155
- package/src/daemon/conversation-agent-loop.ts +409 -605
- package/src/daemon/conversation-error.ts +40 -12
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +83 -44
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +174 -116
- package/src/daemon/conversation-runtime-assembly.ts +76 -30
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +124 -103
- package/src/daemon/conversation-tool-setup.ts +36 -48
- package/src/daemon/conversation.ts +111 -166
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +7 -4
- package/src/daemon/disk-pressure-guard.ts +54 -50
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +53 -13
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +10 -1
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +40 -67
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +25 -125
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +5 -18
- package/src/daemon/message-types/integrations.ts +4 -13
- package/src/daemon/message-types/messages.ts +47 -377
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +58 -55
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +28 -0
- package/src/daemon/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +21 -1
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +31 -0
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +79 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/feed-writer.ts +146 -7
- package/src/home/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +19 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +59 -20
- package/src/ipc/skill-routes/memory.ts +27 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +39 -88
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +11 -6
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +386 -115
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +12 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +63 -40
- package/src/memory/llm-request-log-source-clickhouse.ts +55 -1
- package/src/memory/llm-request-log-source-local.ts +13 -0
- package/src/memory/llm-request-log-source.ts +21 -6
- package/src/memory/llm-request-log-store.ts +147 -3
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +13 -1
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +9 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +30 -8
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +11 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +16 -46
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +107 -102
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +21 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +10 -10
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +34 -18
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +176 -37
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -7
- package/src/providers/openai/chat-completions-provider.ts +111 -16
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +54 -57
- package/src/providers/openrouter/client.ts +14 -14
- package/src/providers/provider-send-message.ts +23 -14
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -9
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +20 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +132 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +2 -3
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1069
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +70 -5
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +59 -30
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/migrations/vbundle-builder.ts +3 -2
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +26 -72
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +58 -5
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +208 -28
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +201 -23
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +9 -5
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +11 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +292 -0
- package/src/runtime/routes/conversation-list-routes.ts +225 -9
- package/src/runtime/routes/conversation-management-routes.ts +96 -28
- package/src/runtime/routes/conversation-query-routes.ts +148 -51
- package/src/runtime/routes/conversation-routes.ts +259 -158
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +25 -7
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +31 -11
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +32 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +149 -16
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +72 -16
- package/src/runtime/routes/identity-routes.ts +42 -11
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +524 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +72 -27
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +26 -31
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +18 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +283 -259
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +49 -13
- package/src/runtime/routes/notification-routes.ts +80 -2
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +43 -15
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +10 -38
- package/src/runtime/routes/surface-content-routes.ts +21 -6
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +8 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +4 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +17 -3
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +16 -1
- package/src/schedule/scheduler.ts +114 -16
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +10 -16
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +16 -19
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +42 -24
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +295 -289
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +3 -6
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +18 -55
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +215 -57
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +184 -118
- package/src/tools/schedule/create.ts +12 -1
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +86 -33
- package/src/tools/ui-surface/definitions.ts +166 -94
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/types.ts +10 -0
- package/src/util/browser.ts +7 -2
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -344
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -468
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -563
- package/src/memory/v3/__tests__/filter.test.ts +0 -512
- package/src/memory/v3/__tests__/gate.test.ts +0 -574
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -233
- package/src/memory/v3/__tests__/loop.test.ts +0 -530
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -440
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -312
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -469
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -707
- package/src/memory/v3/__tests__/validate.test.ts +0 -245
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -249
- package/src/memory/v3/filter.ts +0 -281
- package/src/memory/v3/gate.ts +0 -334
- package/src/memory/v3/index-composition.ts +0 -113
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -382
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -420
- package/src/memory/v3/shadow-middleware.ts +0 -305
- package/src/memory/v3/traversal.ts +0 -206
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -351
- package/src/memory/v3/validate.ts +0 -300
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -127
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
parseInterfaceId,
|
|
19
19
|
supportsHostProxy,
|
|
20
20
|
} from "../../channels/types.js";
|
|
21
|
+
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
21
22
|
import { isHttpAuthDisabled } from "../../config/env.js";
|
|
22
23
|
import { getConfig } from "../../config/loader.js";
|
|
23
24
|
import {
|
|
@@ -26,6 +27,7 @@ import {
|
|
|
26
27
|
} from "../../conversations/message-consolidation.js";
|
|
27
28
|
import { createApprovalConversationGenerator } from "../../daemon/approval-generators.js";
|
|
28
29
|
import type { Conversation } from "../../daemon/conversation.js";
|
|
30
|
+
import { persistQueuedMessageBody } from "../../daemon/conversation-messaging.js";
|
|
29
31
|
import {
|
|
30
32
|
buildModelInfoEvent,
|
|
31
33
|
formatCleanResult,
|
|
@@ -40,6 +42,7 @@ import { getOrCreateConversation as getOrCreateConversationInstance } from "../.
|
|
|
40
42
|
import { canonicalizeTimeZone } from "../../daemon/date-context.js";
|
|
41
43
|
import {
|
|
42
44
|
buildScanFirstMessage,
|
|
45
|
+
buildSelfIntroMessage,
|
|
43
46
|
getCannedFirstGreeting,
|
|
44
47
|
isWakeUpGreeting,
|
|
45
48
|
} from "../../daemon/first-greeting.js";
|
|
@@ -75,6 +78,7 @@ import {
|
|
|
75
78
|
} from "../../memory/canonical-guardian-store.js";
|
|
76
79
|
import {
|
|
77
80
|
addMessage,
|
|
81
|
+
extractImageSourcePaths,
|
|
78
82
|
getConversation,
|
|
79
83
|
getMessages,
|
|
80
84
|
getMessagesPaginated,
|
|
@@ -82,8 +86,6 @@ import {
|
|
|
82
86
|
type MessageRow,
|
|
83
87
|
provenanceFromTrustContext,
|
|
84
88
|
setConversationInferenceProfile,
|
|
85
|
-
setConversationOriginChannelIfUnset,
|
|
86
|
-
setConversationOriginInterfaceIfUnset,
|
|
87
89
|
} from "../../memory/conversation-crud.js";
|
|
88
90
|
import {
|
|
89
91
|
getConversationByKey,
|
|
@@ -107,6 +109,7 @@ import { getWorkspacePromptPath } from "../../util/platform.js";
|
|
|
107
109
|
import { silentlyWithLog } from "../../util/silently.js";
|
|
108
110
|
import { assistantEventHub, broadcastMessage } from "../assistant-event-hub.js";
|
|
109
111
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
112
|
+
import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
|
|
110
113
|
import { routeGuardianReply } from "../guardian-reply-router.js";
|
|
111
114
|
import { healGuardianBindingDrift } from "../guardian-vellum-migration.js";
|
|
112
115
|
import type {
|
|
@@ -140,6 +143,9 @@ const log = getLogger("conversation-routes");
|
|
|
140
143
|
const NO_RESPONSE_INLINE_RE = /<no_response\s*\/?>/g;
|
|
141
144
|
const ATTACHMENT_ENTRY_RE = /^attachment:(\d+)$/;
|
|
142
145
|
|
|
146
|
+
/** Feature flag gating the self-intro first message (see first-greeting.ts). */
|
|
147
|
+
const SELF_INTRO_GREETING_FLAG = "self-intro-greeting" as const;
|
|
148
|
+
|
|
143
149
|
const SUGGESTION_CACHE_MAX = 100;
|
|
144
150
|
const VALID_RISK_THRESHOLDS = ["none", "low", "medium", "high"] as const;
|
|
145
151
|
type RiskThreshold = (typeof VALID_RISK_THRESHOLDS)[number];
|
|
@@ -395,23 +401,10 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
395
401
|
// is not re-processed as a new user turn.
|
|
396
402
|
let messageId: string | undefined;
|
|
397
403
|
try {
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
guardianImageSourcePaths[`${i}:${a.filename}`] = a.filePath;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
const channelMeta = {
|
|
406
|
-
userMessageChannel: sourceChannel,
|
|
407
|
-
assistantMessageChannel: sourceChannel,
|
|
408
|
-
userMessageInterface: sourceInterface,
|
|
409
|
-
assistantMessageInterface: sourceInterface,
|
|
410
|
-
provenanceTrustClass: "guardian" as const,
|
|
411
|
-
...(Object.keys(guardianImageSourcePaths).length > 0
|
|
412
|
-
? { imageSourcePaths: guardianImageSourcePaths }
|
|
413
|
-
: {}),
|
|
414
|
-
};
|
|
404
|
+
const channelMeta = buildChannelMetadata(sourceChannel, sourceInterface, {
|
|
405
|
+
provenanceOverride: { provenanceTrustClass: "guardian" },
|
|
406
|
+
attachments,
|
|
407
|
+
});
|
|
415
408
|
|
|
416
409
|
const cleanUserMessage = createUserMessage(content, attachments);
|
|
417
410
|
const llmUserMessage = enrichMessageWithSourcePaths(
|
|
@@ -422,7 +415,7 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
422
415
|
conversationId,
|
|
423
416
|
"user",
|
|
424
417
|
JSON.stringify(cleanUserMessage.content),
|
|
425
|
-
channelMeta,
|
|
418
|
+
{ metadata: channelMeta },
|
|
426
419
|
);
|
|
427
420
|
messageId = persistedUser.id;
|
|
428
421
|
|
|
@@ -436,7 +429,7 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
436
429
|
conversationId,
|
|
437
430
|
"assistant",
|
|
438
431
|
JSON.stringify(assistantMessage.content),
|
|
439
|
-
channelMeta,
|
|
432
|
+
{ metadata: channelMeta },
|
|
440
433
|
);
|
|
441
434
|
|
|
442
435
|
// Avoid mutating in-memory history / emitting stream deltas while a run is active.
|
|
@@ -538,6 +531,10 @@ export function handleListMessages({
|
|
|
538
531
|
|
|
539
532
|
let rawMessages: MessageRow[];
|
|
540
533
|
let hasMore = false;
|
|
534
|
+
// Resume cursor surfaced when the paginated scan stops on its row cap with a
|
|
535
|
+
// (possibly empty) page — lets us still emit an oldest cursor so the client
|
|
536
|
+
// can request the next window instead of stalling.
|
|
537
|
+
let scanResumeCursor: { createdAt: number; id: string } | undefined;
|
|
541
538
|
|
|
542
539
|
// Drop messages flagged as hidden in metadata (e.g. internal scaffolding
|
|
543
540
|
// like retrospective instructions). The LLM-side history loader
|
|
@@ -561,6 +558,7 @@ export function handleListMessages({
|
|
|
561
558
|
);
|
|
562
559
|
rawMessages = result.messages;
|
|
563
560
|
hasMore = result.hasMore;
|
|
561
|
+
scanResumeCursor = result.nextCursor;
|
|
564
562
|
} else {
|
|
565
563
|
rawMessages = getMessages(resolvedConversationId).filter(visibleFilter);
|
|
566
564
|
}
|
|
@@ -708,6 +706,7 @@ export function handleListMessages({
|
|
|
708
706
|
});
|
|
709
707
|
|
|
710
708
|
const messages: RuntimeMessagePayload[] = parsed.map((m) => {
|
|
709
|
+
const mergedMessageIds = m.id ? (mergedIdMap.get(m.id) ?? []) : [];
|
|
711
710
|
let msgAttachments: RuntimeAttachmentMetadata[] = [];
|
|
712
711
|
if (m.id) {
|
|
713
712
|
// Use metadata-only query first to avoid loading large base64
|
|
@@ -755,10 +754,13 @@ export function handleListMessages({
|
|
|
755
754
|
|
|
756
755
|
// Align msgAttachments order with the file-block order captured by
|
|
757
756
|
// renderHistoryContent. When a file block was persisted with
|
|
758
|
-
// `_attachmentId
|
|
759
|
-
// (the `attachment:N` entries in contentOrder index into
|
|
760
|
-
// DB rows without a matching ref go to the tail as orphan
|
|
761
|
-
// unmatched refs drop their contentOrder entry and trigger a remap.
|
|
757
|
+
// `_attachmentId` (user-message uploads), we join on that id to position
|
|
758
|
+
// the chip inline (the `attachment:N` entries in contentOrder index into
|
|
759
|
+
// msgAttachments). DB rows without a matching ref go to the tail as orphan
|
|
760
|
+
// chips; unmatched refs drop their contentOrder entry and trigger a remap.
|
|
761
|
+
// Assistant-authored file blocks carry no `_attachmentId`, so when no ids
|
|
762
|
+
// match we fall back to positional alignment if the ref and row counts
|
|
763
|
+
// agree; otherwise we strip the markers and let chips fall to the tail.
|
|
762
764
|
let alignedContentOrder = m.contentOrder;
|
|
763
765
|
if (
|
|
764
766
|
m.attachmentRefs.length > 0 &&
|
|
@@ -809,14 +811,18 @@ export function handleListMessages({
|
|
|
809
811
|
: undefined;
|
|
810
812
|
})
|
|
811
813
|
.filter((e): e is string => e !== undefined);
|
|
812
|
-
} else {
|
|
813
|
-
// No
|
|
814
|
-
//
|
|
815
|
-
//
|
|
814
|
+
} else if (m.attachmentRefs.length !== msgAttachments.length) {
|
|
815
|
+
// No ref carried an attachmentId we could match and the counts
|
|
816
|
+
// disagree, so positional mapping can't be trusted — strip any
|
|
817
|
+
// attachment:N entries so the client doesn't position attachments
|
|
818
|
+
// inline against a misaligned array (they fall to the tail instead).
|
|
816
819
|
alignedContentOrder = m.contentOrder.filter(
|
|
817
820
|
(entry) => !ATTACHMENT_ENTRY_RE.test(entry),
|
|
818
821
|
);
|
|
819
822
|
}
|
|
823
|
+
// Otherwise no ref matched an id but the counts agree (the
|
|
824
|
+
// assistant-authored case): the Nth marker maps to the Nth row
|
|
825
|
+
// positionally, so the original contentOrder is left untouched.
|
|
820
826
|
} else if (m.attachmentRefs.length > 0 && msgAttachments.length === 0) {
|
|
821
827
|
// Refs were captured but no DB rows came back — drop the
|
|
822
828
|
// contentOrder entries to avoid out-of-bounds renders.
|
|
@@ -834,8 +840,8 @@ export function handleListMessages({
|
|
|
834
840
|
const displayTimestamp = m.sentAt ?? m.timestamp;
|
|
835
841
|
return {
|
|
836
842
|
id: m.id ?? "",
|
|
843
|
+
...(mergedMessageIds.length > 0 ? { mergedMessageIds } : {}),
|
|
837
844
|
role: m.role,
|
|
838
|
-
content: m.text,
|
|
839
845
|
timestamp: new Date(displayTimestamp).toISOString(),
|
|
840
846
|
attachments: msgAttachments,
|
|
841
847
|
...(m.toolCalls.length > 0 ? { toolCalls: m.toolCalls } : {}),
|
|
@@ -855,10 +861,16 @@ export function handleListMessages({
|
|
|
855
861
|
});
|
|
856
862
|
|
|
857
863
|
if (isPaginated) {
|
|
864
|
+
// Prefer the page's oldest visible row (the documented cursor semantic).
|
|
865
|
+
// When a scan-cap-truncated page comes back empty there's no visible row
|
|
866
|
+
// to anchor on, so fall back to the resume cursor so the client still gets
|
|
867
|
+
// a `(timestamp, id)` to continue paginating from instead of stalling.
|
|
858
868
|
const oldestTimestamp =
|
|
859
|
-
rawMessages.length > 0
|
|
869
|
+
rawMessages.length > 0
|
|
870
|
+
? rawMessages[0].createdAt
|
|
871
|
+
: scanResumeCursor?.createdAt;
|
|
860
872
|
const oldestMessageId =
|
|
861
|
-
rawMessages.length > 0 ? rawMessages[0].id :
|
|
873
|
+
rawMessages.length > 0 ? rawMessages[0].id : scanResumeCursor?.id;
|
|
862
874
|
// `page=latest` always emits both metadata fields so the web client has
|
|
863
875
|
// a stable contract; emit `null` when the conversation is empty.
|
|
864
876
|
// The existing `beforeTimestamp` branch keeps its conditional shape to
|
|
@@ -1002,13 +1014,15 @@ export async function handleSendMessage(
|
|
|
1002
1014
|
cohort?: string;
|
|
1003
1015
|
websiteUrl?: string;
|
|
1004
1016
|
contentSourceUrl?: string;
|
|
1017
|
+
bootstrapTemplate?: string;
|
|
1018
|
+
initialMessage?: string;
|
|
1019
|
+
skills?: string[];
|
|
1005
1020
|
};
|
|
1006
1021
|
};
|
|
1007
1022
|
|
|
1008
1023
|
const actorPrincipalId = headers?.["x-vellum-actor-principal-id"];
|
|
1009
1024
|
const principalType = headers?.["x-vellum-principal-type"];
|
|
1010
|
-
const originClientId =
|
|
1011
|
-
headers?.["x-vellum-client-id"]?.trim() || undefined;
|
|
1025
|
+
const originClientId = headers?.["x-vellum-client-id"]?.trim() || undefined;
|
|
1012
1026
|
|
|
1013
1027
|
const { conversationKey, content, attachmentIds } = body;
|
|
1014
1028
|
const inboundConversationId =
|
|
@@ -1149,10 +1163,13 @@ export async function handleSendMessage(
|
|
|
1149
1163
|
// assistant-minted internal id) when the client supplies it — clients
|
|
1150
1164
|
// must obtain this id from a prior daemon response, so a missing row
|
|
1151
1165
|
// is a 404. Otherwise fall through to the external-key path: the
|
|
1152
|
-
// client-supplied `conversationKey` (
|
|
1153
|
-
//
|
|
1154
|
-
// default
|
|
1155
|
-
//
|
|
1166
|
+
// client-supplied `conversationKey` (external-key lookup; materializes
|
|
1167
|
+
// on first use) or, when neither is provided, a channel-dependent
|
|
1168
|
+
// default. The vellum channel mints a fresh conversation on every
|
|
1169
|
+
// empty-handed send so first-message-of-a-new-chat surfaces with a
|
|
1170
|
+
// server-minted id; other channels (phone, slack, …) share a stable
|
|
1171
|
+
// `default:<channel>:<interface>` thread so repeated calls from the
|
|
1172
|
+
// same channel/interface stay co-located.
|
|
1156
1173
|
let mapping: {
|
|
1157
1174
|
conversationId: string;
|
|
1158
1175
|
conversationType: string;
|
|
@@ -1174,7 +1191,9 @@ export async function handleSendMessage(
|
|
|
1174
1191
|
const resolvedConversationKey =
|
|
1175
1192
|
conversationKey && conversationKey.length > 0
|
|
1176
1193
|
? conversationKey
|
|
1177
|
-
:
|
|
1194
|
+
: sourceChannel === "vellum"
|
|
1195
|
+
? crypto.randomUUID()
|
|
1196
|
+
: `default:${sourceChannel}:${sourceInterface}`;
|
|
1178
1197
|
mapping = getOrCreateConversation(resolvedConversationKey, {
|
|
1179
1198
|
conversationType: "standard",
|
|
1180
1199
|
});
|
|
@@ -1318,10 +1337,20 @@ export async function handleSendMessage(
|
|
|
1318
1337
|
}
|
|
1319
1338
|
|
|
1320
1339
|
const isInteractive = isInteractiveInterface(sourceInterface);
|
|
1340
|
+
// Use the JWT-verified requester principal — not guardianPrincipalId,
|
|
1341
|
+
// which is the workspace owner and would let a trusted contact's web
|
|
1342
|
+
// turn match against the guardian's macOS client.
|
|
1343
|
+
const sourceActorPrincipalId = actorPrincipalId ?? undefined;
|
|
1321
1344
|
// Bash/File/Transfer singletons are globally available via isAvailable() —
|
|
1322
1345
|
// no per-conversation gating needed. CU is per-conversation (owns step
|
|
1323
1346
|
// count, AX tree history, loop detection).
|
|
1324
|
-
if (
|
|
1347
|
+
if (
|
|
1348
|
+
shouldAttachHostProxyForCapability(
|
|
1349
|
+
"host_cu",
|
|
1350
|
+
sourceInterface,
|
|
1351
|
+
sourceActorPrincipalId,
|
|
1352
|
+
)
|
|
1353
|
+
) {
|
|
1325
1354
|
if (!conversation.isProcessing() || !conversation.hostCuProxy) {
|
|
1326
1355
|
conversation.setHostCuProxy(new HostCuProxy());
|
|
1327
1356
|
}
|
|
@@ -1334,7 +1363,13 @@ export async function handleSendMessage(
|
|
|
1334
1363
|
// lives in the skill-projection layer (which reads the `feature-flag:
|
|
1335
1364
|
// app-control` declaration in SKILL.md frontmatter), so an attached proxy
|
|
1336
1365
|
// is harmless when the flag resolves to off.
|
|
1337
|
-
if (
|
|
1366
|
+
if (
|
|
1367
|
+
shouldAttachHostProxyForCapability(
|
|
1368
|
+
"host_app_control",
|
|
1369
|
+
sourceInterface,
|
|
1370
|
+
sourceActorPrincipalId,
|
|
1371
|
+
)
|
|
1372
|
+
) {
|
|
1338
1373
|
if (!conversation.isProcessing() || !conversation.hostAppControlProxy) {
|
|
1339
1374
|
conversation.setHostAppControlProxy(
|
|
1340
1375
|
new HostAppControlProxy(mapping.conversationId),
|
|
@@ -1347,7 +1382,11 @@ export async function handleSendMessage(
|
|
|
1347
1382
|
// this message will be queued and preactivation is deferred to dequeue
|
|
1348
1383
|
// time in drainQueueImpl to avoid mutating in-flight turn state.
|
|
1349
1384
|
if (!conversation.isProcessing()) {
|
|
1350
|
-
preactivateHostProxySkills(
|
|
1385
|
+
preactivateHostProxySkills(
|
|
1386
|
+
conversation,
|
|
1387
|
+
sourceInterface,
|
|
1388
|
+
sourceActorPrincipalId,
|
|
1389
|
+
);
|
|
1351
1390
|
}
|
|
1352
1391
|
// Wire sendToClient to the SSE hub so all subsystems can reach the HTTP client.
|
|
1353
1392
|
// hasNoClient must remain `!isInteractive` so downstream tool gating
|
|
@@ -1380,6 +1419,16 @@ export async function handleSendMessage(
|
|
|
1380
1419
|
conversation.getMessages().length,
|
|
1381
1420
|
);
|
|
1382
1421
|
const isScanPath = !!scanUrl && isWakeUp;
|
|
1422
|
+
// Self-intro path: when we know a name, send a natural introduction on the
|
|
1423
|
+
// user's behalf instead of the canned greeting, so the assistant generates a
|
|
1424
|
+
// real first response. Gated behind the `self-intro-greeting` flag (default
|
|
1425
|
+
// off); `undefined` (flag off or no names) falls back to the canned path.
|
|
1426
|
+
const selfIntroGreetingEnabled =
|
|
1427
|
+
isWakeUp &&
|
|
1428
|
+
isAssistantFeatureFlagEnabled(SELF_INTRO_GREETING_FLAG, getConfig());
|
|
1429
|
+
const selfIntro = selfIntroGreetingEnabled
|
|
1430
|
+
? buildSelfIntroMessage(body.onboarding ?? undefined)
|
|
1431
|
+
: undefined;
|
|
1383
1432
|
|
|
1384
1433
|
let effectiveContent: string | undefined;
|
|
1385
1434
|
if (isScanPath) {
|
|
@@ -1388,55 +1437,46 @@ export async function handleSendMessage(
|
|
|
1388
1437
|
: ("content-source" as const);
|
|
1389
1438
|
effectiveContent = buildScanFirstMessage(scanUrl, scanVariant);
|
|
1390
1439
|
// Fall through to normal inference path below
|
|
1391
|
-
} else if (
|
|
1392
|
-
effectiveContent =
|
|
1393
|
-
|
|
1394
|
-
//
|
|
1440
|
+
} else if (selfIntroGreetingEnabled && body.onboarding?.initialMessage) {
|
|
1441
|
+
effectiveContent = body.onboarding.initialMessage;
|
|
1442
|
+
} else if (isWakeUp && selfIntro) {
|
|
1443
|
+
// Rewrite to the self-introduction and fall through to real inference
|
|
1444
|
+
// (mirrors the scan path above).
|
|
1445
|
+
effectiveContent = selfIntro;
|
|
1395
1446
|
} else if (isWakeUp) {
|
|
1396
1447
|
const cannedGreeting = getCannedFirstGreeting(body.onboarding ?? undefined);
|
|
1397
1448
|
|
|
1398
1449
|
conversation.processing = true;
|
|
1399
1450
|
let cleanupDeferred = false;
|
|
1400
1451
|
try {
|
|
1401
|
-
const
|
|
1402
|
-
const
|
|
1403
|
-
|
|
1452
|
+
const rawContent = content ?? "";
|
|
1453
|
+
const attachments = hasAttachments
|
|
1454
|
+
? smDeps.resolveAttachments(attachmentIds)
|
|
1455
|
+
: [];
|
|
1456
|
+
const greetingMeta = {
|
|
1404
1457
|
userMessageChannel: sourceChannel,
|
|
1405
1458
|
assistantMessageChannel: sourceChannel,
|
|
1406
1459
|
userMessageInterface: sourceInterface,
|
|
1407
1460
|
assistantMessageInterface: sourceInterface,
|
|
1408
1461
|
};
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
:
|
|
1414
|
-
|
|
1415
|
-
const persisted = await addMessage(
|
|
1416
|
-
mapping.conversationId,
|
|
1417
|
-
"user",
|
|
1418
|
-
JSON.stringify(userMsg.content),
|
|
1419
|
-
channelMeta,
|
|
1420
|
-
);
|
|
1421
|
-
conversation.getMessages().push(userMsg);
|
|
1422
|
-
|
|
1423
|
-
setConversationOriginChannelIfUnset(
|
|
1424
|
-
mapping.conversationId,
|
|
1425
|
-
sourceChannel,
|
|
1426
|
-
);
|
|
1427
|
-
setConversationOriginInterfaceIfUnset(
|
|
1428
|
-
mapping.conversationId,
|
|
1429
|
-
sourceInterface,
|
|
1430
|
-
);
|
|
1462
|
+
const persisted = await persistQueuedMessageBody(conversation, {
|
|
1463
|
+
content: rawContent,
|
|
1464
|
+
attachments,
|
|
1465
|
+
requestId: crypto.randomUUID(),
|
|
1466
|
+
metadata: greetingMeta,
|
|
1467
|
+
});
|
|
1431
1468
|
|
|
1432
1469
|
const conversationId = mapping.conversationId;
|
|
1470
|
+
const channelMeta = buildChannelMetadata(sourceChannel, sourceInterface, {
|
|
1471
|
+
trustContext: conversation.trustContext,
|
|
1472
|
+
});
|
|
1433
1473
|
|
|
1434
1474
|
const assistantMsg = createAssistantMessage(cannedGreeting);
|
|
1435
1475
|
const persistedAssistant = await addMessage(
|
|
1436
1476
|
mapping.conversationId,
|
|
1437
1477
|
"assistant",
|
|
1438
1478
|
JSON.stringify(assistantMsg.content),
|
|
1439
|
-
channelMeta,
|
|
1479
|
+
{ metadata: channelMeta },
|
|
1440
1480
|
);
|
|
1441
1481
|
conversation.getMessages().push(assistantMsg);
|
|
1442
1482
|
|
|
@@ -1580,25 +1620,22 @@ export async function handleSendMessage(
|
|
|
1580
1620
|
if (conversation.isProcessing()) {
|
|
1581
1621
|
// Queue the message so it's processed when the current turn completes
|
|
1582
1622
|
const requestId = crypto.randomUUID();
|
|
1583
|
-
const enqueueResult = conversation.enqueueMessage(
|
|
1584
|
-
contentAfterScan,
|
|
1623
|
+
const enqueueResult = conversation.enqueueMessage({
|
|
1624
|
+
content: contentAfterScan,
|
|
1585
1625
|
attachments,
|
|
1586
|
-
broadcastMessage,
|
|
1626
|
+
onEvent: broadcastMessage,
|
|
1587
1627
|
requestId,
|
|
1588
|
-
|
|
1589
|
-
undefined, // currentPage
|
|
1590
|
-
{
|
|
1628
|
+
metadata: {
|
|
1591
1629
|
userMessageChannel: sourceChannel,
|
|
1592
1630
|
assistantMessageChannel: sourceChannel,
|
|
1593
1631
|
userMessageInterface: sourceInterface,
|
|
1594
1632
|
assistantMessageInterface: sourceInterface,
|
|
1595
1633
|
...(body.automated === true ? { automated: true } : {}),
|
|
1596
1634
|
},
|
|
1597
|
-
|
|
1598
|
-
undefined, // displayContent
|
|
1635
|
+
isInteractive,
|
|
1599
1636
|
transport,
|
|
1600
1637
|
clientMessageId,
|
|
1601
|
-
);
|
|
1638
|
+
});
|
|
1602
1639
|
if (enqueueResult.rejected) {
|
|
1603
1640
|
return new RouteResponse(
|
|
1604
1641
|
JSON.stringify({ accepted: false, error: "queue_full" }),
|
|
@@ -1718,53 +1755,40 @@ export async function handleSendMessage(
|
|
|
1718
1755
|
conversation.processing = true;
|
|
1719
1756
|
let cleanupDeferred = false;
|
|
1720
1757
|
try {
|
|
1721
|
-
const
|
|
1722
|
-
const imageSourcePaths: Record<string, string> = {};
|
|
1723
|
-
for (let i = 0; i < attachments.length; i++) {
|
|
1724
|
-
const a = attachments[i];
|
|
1725
|
-
if (a.filePath && a.mimeType.toLowerCase().startsWith("image/")) {
|
|
1726
|
-
imageSourcePaths[`${i}:${a.filename}`] = a.filePath;
|
|
1727
|
-
}
|
|
1728
|
-
}
|
|
1729
|
-
const channelMeta = {
|
|
1730
|
-
...provenance,
|
|
1758
|
+
const slashMeta = {
|
|
1731
1759
|
userMessageChannel: sourceChannel,
|
|
1732
1760
|
assistantMessageChannel: sourceChannel,
|
|
1733
1761
|
userMessageInterface: sourceInterface,
|
|
1734
1762
|
assistantMessageInterface: sourceInterface,
|
|
1735
1763
|
...(body.automated === true ? { automated: true } : {}),
|
|
1736
|
-
...(Object.keys(imageSourcePaths).length > 0
|
|
1737
|
-
? { imageSourcePaths }
|
|
1738
|
-
: {}),
|
|
1739
1764
|
};
|
|
1740
|
-
const
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
)
|
|
1748
|
-
|
|
1765
|
+
const persisted = await persistQueuedMessageBody(conversation, {
|
|
1766
|
+
content: rawContent,
|
|
1767
|
+
attachments,
|
|
1768
|
+
requestId: crypto.randomUUID(),
|
|
1769
|
+
metadata: slashMeta,
|
|
1770
|
+
clientMessageId,
|
|
1771
|
+
});
|
|
1772
|
+
if (persisted.deduplicated) {
|
|
1773
|
+
return {
|
|
1774
|
+
accepted: true,
|
|
1775
|
+
messageId: persisted.id,
|
|
1776
|
+
conversationId: mapping.conversationId,
|
|
1777
|
+
};
|
|
1778
|
+
}
|
|
1749
1779
|
|
|
1780
|
+
const channelMeta = buildChannelMetadata(sourceChannel, sourceInterface, {
|
|
1781
|
+
trustContext: conversation.trustContext,
|
|
1782
|
+
});
|
|
1750
1783
|
const assistantMsg = createAssistantMessage(slashResult.message);
|
|
1751
1784
|
const persistedAssistant = await addMessage(
|
|
1752
1785
|
mapping.conversationId,
|
|
1753
1786
|
"assistant",
|
|
1754
1787
|
JSON.stringify(assistantMsg.content),
|
|
1755
|
-
channelMeta,
|
|
1788
|
+
{ metadata: channelMeta },
|
|
1756
1789
|
);
|
|
1757
1790
|
conversation.getMessages().push(assistantMsg);
|
|
1758
1791
|
|
|
1759
|
-
setConversationOriginChannelIfUnset(
|
|
1760
|
-
mapping.conversationId,
|
|
1761
|
-
sourceChannel,
|
|
1762
|
-
);
|
|
1763
|
-
setConversationOriginInterfaceIfUnset(
|
|
1764
|
-
mapping.conversationId,
|
|
1765
|
-
sourceInterface,
|
|
1766
|
-
);
|
|
1767
|
-
|
|
1768
1792
|
// Snapshot model info now so the deferred callback cannot observe
|
|
1769
1793
|
// a config change from a concurrent request.
|
|
1770
1794
|
const modelInfoEvent = isModelSlashCommand(rawContent)
|
|
@@ -1827,23 +1851,21 @@ export async function handleSendMessage(
|
|
|
1827
1851
|
|
|
1828
1852
|
if (slashResult.kind === "compact") {
|
|
1829
1853
|
conversation.processing = true;
|
|
1830
|
-
const
|
|
1831
|
-
const channelMeta = {
|
|
1832
|
-
...provenance,
|
|
1854
|
+
const slashMeta = {
|
|
1833
1855
|
userMessageChannel: sourceChannel,
|
|
1834
1856
|
assistantMessageChannel: sourceChannel,
|
|
1835
1857
|
userMessageInterface: sourceInterface,
|
|
1836
1858
|
assistantMessageInterface: sourceInterface,
|
|
1837
1859
|
};
|
|
1838
|
-
|
|
1839
|
-
let persisted: Awaited<ReturnType<typeof addMessage>>;
|
|
1860
|
+
let persisted: Awaited<ReturnType<typeof persistQueuedMessageBody>>;
|
|
1840
1861
|
try {
|
|
1841
|
-
persisted = await
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1862
|
+
persisted = await persistQueuedMessageBody(conversation, {
|
|
1863
|
+
content: rawContent,
|
|
1864
|
+
attachments,
|
|
1865
|
+
requestId: crypto.randomUUID(),
|
|
1866
|
+
metadata: slashMeta,
|
|
1867
|
+
clientMessageId,
|
|
1868
|
+
});
|
|
1847
1869
|
} catch (err) {
|
|
1848
1870
|
// The fire-and-forget compaction below owns clearing `processing`, but a
|
|
1849
1871
|
// throw from this initial persist never reaches it — reset here so the
|
|
@@ -1852,9 +1874,20 @@ export async function handleSendMessage(
|
|
|
1852
1874
|
silentlyWithLog(conversation.drainQueue(), "compact-command queue drain");
|
|
1853
1875
|
throw err;
|
|
1854
1876
|
}
|
|
1855
|
-
|
|
1877
|
+
if (persisted.deduplicated) {
|
|
1878
|
+
conversation.processing = false;
|
|
1879
|
+
silentlyWithLog(conversation.drainQueue(), "compact-dedup queue drain");
|
|
1880
|
+
return {
|
|
1881
|
+
accepted: true,
|
|
1882
|
+
messageId: persisted.id,
|
|
1883
|
+
conversationId: mapping.conversationId,
|
|
1884
|
+
};
|
|
1885
|
+
}
|
|
1856
1886
|
|
|
1857
1887
|
const conversationId = mapping.conversationId;
|
|
1888
|
+
const channelMeta = buildChannelMetadata(sourceChannel, sourceInterface, {
|
|
1889
|
+
trustContext: conversation.trustContext,
|
|
1890
|
+
});
|
|
1858
1891
|
|
|
1859
1892
|
// Fire-and-forget: return 202 immediately, run compaction async.
|
|
1860
1893
|
// forceCompact() makes an LLM call that can exceed the client's
|
|
@@ -1870,11 +1903,7 @@ export async function handleSendMessage(
|
|
|
1870
1903
|
clientMessageId,
|
|
1871
1904
|
});
|
|
1872
1905
|
publishConversationMessagesChanged(conversationId, originClientId);
|
|
1873
|
-
conversation.emitActivityState(
|
|
1874
|
-
"thinking",
|
|
1875
|
-
"context_compacting",
|
|
1876
|
-
"assistant_turn",
|
|
1877
|
-
);
|
|
1906
|
+
conversation.emitActivityState("thinking", "context_compacting");
|
|
1878
1907
|
const result = await conversation.forceCompact({
|
|
1879
1908
|
targetInputTokensOverride: slashResult.targetInputTokensOverride,
|
|
1880
1909
|
});
|
|
@@ -1885,7 +1914,7 @@ export async function handleSendMessage(
|
|
|
1885
1914
|
conversationId,
|
|
1886
1915
|
"assistant",
|
|
1887
1916
|
JSON.stringify(assistantMsg.content),
|
|
1888
|
-
channelMeta,
|
|
1917
|
+
{ metadata: channelMeta },
|
|
1889
1918
|
);
|
|
1890
1919
|
assistantMessagePersisted = true;
|
|
1891
1920
|
conversation.getMessages().push(assistantMsg);
|
|
@@ -1937,23 +1966,30 @@ export async function handleSendMessage(
|
|
|
1937
1966
|
// initial user-message persist below, which would otherwise leave the
|
|
1938
1967
|
// conversation stuck in queued mode indefinitely.
|
|
1939
1968
|
try {
|
|
1940
|
-
const
|
|
1941
|
-
const channelMeta = {
|
|
1942
|
-
...provenance,
|
|
1969
|
+
const slashMeta = {
|
|
1943
1970
|
userMessageChannel: sourceChannel,
|
|
1944
1971
|
assistantMessageChannel: sourceChannel,
|
|
1945
1972
|
userMessageInterface: sourceInterface,
|
|
1946
1973
|
assistantMessageInterface: sourceInterface,
|
|
1947
1974
|
};
|
|
1948
|
-
const
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
);
|
|
1955
|
-
|
|
1975
|
+
const persisted = await persistQueuedMessageBody(conversation, {
|
|
1976
|
+
content: rawContent,
|
|
1977
|
+
attachments,
|
|
1978
|
+
requestId: crypto.randomUUID(),
|
|
1979
|
+
metadata: slashMeta,
|
|
1980
|
+
clientMessageId,
|
|
1981
|
+
});
|
|
1982
|
+
if (persisted.deduplicated) {
|
|
1983
|
+
return {
|
|
1984
|
+
accepted: true,
|
|
1985
|
+
messageId: persisted.id,
|
|
1986
|
+
conversationId,
|
|
1987
|
+
};
|
|
1988
|
+
}
|
|
1956
1989
|
|
|
1990
|
+
const channelMeta = buildChannelMetadata(sourceChannel, sourceInterface, {
|
|
1991
|
+
trustContext: conversation.trustContext,
|
|
1992
|
+
});
|
|
1957
1993
|
let assistantMessagePersisted = false;
|
|
1958
1994
|
try {
|
|
1959
1995
|
broadcastMessage({
|
|
@@ -1973,7 +2009,7 @@ export async function handleSendMessage(
|
|
|
1973
2009
|
conversationId,
|
|
1974
2010
|
"assistant",
|
|
1975
2011
|
JSON.stringify(assistantMsg.content),
|
|
1976
|
-
channelMeta,
|
|
2012
|
+
{ metadata: channelMeta },
|
|
1977
2013
|
);
|
|
1978
2014
|
assistantMessagePersisted = true;
|
|
1979
2015
|
conversation.getMessages().push(assistantMsg);
|
|
@@ -2017,16 +2053,22 @@ export async function handleSendMessage(
|
|
|
2017
2053
|
const resolvedContent = slashResult.content;
|
|
2018
2054
|
|
|
2019
2055
|
const requestId = crypto.randomUUID();
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2056
|
+
const persistResult = await conversation.persistUserMessage({
|
|
2057
|
+
content: resolvedContent,
|
|
2058
|
+
attachments,
|
|
2059
|
+
requestId,
|
|
2060
|
+
metadata: body.automated === true ? { automated: true } : undefined,
|
|
2061
|
+
clientMessageId,
|
|
2062
|
+
});
|
|
2063
|
+
|
|
2064
|
+
const messageId = persistResult.id;
|
|
2065
|
+
|
|
2066
|
+
if (persistResult.deduplicated) {
|
|
2067
|
+
return {
|
|
2068
|
+
accepted: true,
|
|
2069
|
+
messageId,
|
|
2070
|
+
conversationId: mapping.conversationId,
|
|
2071
|
+
};
|
|
2030
2072
|
}
|
|
2031
2073
|
|
|
2032
2074
|
broadcastMessage({
|
|
@@ -2041,7 +2083,8 @@ export async function handleSendMessage(
|
|
|
2041
2083
|
|
|
2042
2084
|
// Fire-and-forget the agent loop; events flow to the hub via broadcastMessage.
|
|
2043
2085
|
conversation
|
|
2044
|
-
.runAgentLoop(resolvedContent, messageId,
|
|
2086
|
+
.runAgentLoop(resolvedContent, messageId, {
|
|
2087
|
+
onEvent: broadcastMessage,
|
|
2045
2088
|
isInteractive,
|
|
2046
2089
|
isUserMessage: true,
|
|
2047
2090
|
})
|
|
@@ -2088,8 +2131,8 @@ async function generateLlmSuggestion(
|
|
|
2088
2131
|
"",
|
|
2089
2132
|
"CRITICAL — write from the USER'S perspective only, NEVER from the assistant's:",
|
|
2090
2133
|
"- The suggestion is what the USER will type into the chat input",
|
|
2091
|
-
|
|
2092
|
-
|
|
2134
|
+
'- Use first-person "I" only if the user has used it in their prior messages',
|
|
2135
|
+
'- NEVER start with phrases like "I can help", "Here\'s what", "Let me", "I\'d suggest" — those are assistant-voice',
|
|
2093
2136
|
"- Think: if you were the user reading the assistant's reply, what question or follow-up would you ask next?",
|
|
2094
2137
|
"",
|
|
2095
2138
|
"Output only the reply text inside the requested tags — no preamble, no commentary.",
|
|
@@ -2119,9 +2162,10 @@ async function generateLlmSuggestion(
|
|
|
2119
2162
|
// tokens here would be wasteful.
|
|
2120
2163
|
const response = await provider.sendMessage(
|
|
2121
2164
|
[{ role: "user", content: [{ type: "text", text: userPrompt }] }],
|
|
2122
|
-
[], // no tools
|
|
2123
|
-
systemPrompt,
|
|
2124
2165
|
{
|
|
2166
|
+
tools: [],
|
|
2167
|
+
// no tools
|
|
2168
|
+
systemPrompt,
|
|
2125
2169
|
config: {
|
|
2126
2170
|
callSite: "replySuggestion",
|
|
2127
2171
|
max_tokens: 60,
|
|
@@ -2342,6 +2386,47 @@ function handleSearchConversations({
|
|
|
2342
2386
|
return { query, results };
|
|
2343
2387
|
}
|
|
2344
2388
|
|
|
2389
|
+
// ---------------------------------------------------------------------------
|
|
2390
|
+
// Metadata helpers
|
|
2391
|
+
// ---------------------------------------------------------------------------
|
|
2392
|
+
|
|
2393
|
+
/**
|
|
2394
|
+
* Assemble the standard channel metadata object for message persistence.
|
|
2395
|
+
*
|
|
2396
|
+
* Combines provenance (trust context), channel/interface routing, and
|
|
2397
|
+
* optional per-message fields (automated flag, image source paths) into the
|
|
2398
|
+
* Record that `addMessage` stores in the `metadata` column.
|
|
2399
|
+
*/
|
|
2400
|
+
function buildChannelMetadata(
|
|
2401
|
+
sourceChannel: string,
|
|
2402
|
+
sourceInterface: string,
|
|
2403
|
+
opts?: {
|
|
2404
|
+
trustContext?: Parameters<typeof provenanceFromTrustContext>[0];
|
|
2405
|
+
provenanceOverride?: Record<string, unknown>;
|
|
2406
|
+
automated?: boolean;
|
|
2407
|
+
attachments?: ReadonlyArray<{
|
|
2408
|
+
filename: string;
|
|
2409
|
+
mimeType: string;
|
|
2410
|
+
filePath?: string;
|
|
2411
|
+
}>;
|
|
2412
|
+
},
|
|
2413
|
+
): Record<string, unknown> {
|
|
2414
|
+
const provenance =
|
|
2415
|
+
opts?.provenanceOverride ?? provenanceFromTrustContext(opts?.trustContext);
|
|
2416
|
+
const imageSourcePaths = opts?.attachments
|
|
2417
|
+
? extractImageSourcePaths(opts.attachments)
|
|
2418
|
+
: undefined;
|
|
2419
|
+
return {
|
|
2420
|
+
...provenance,
|
|
2421
|
+
userMessageChannel: sourceChannel,
|
|
2422
|
+
assistantMessageChannel: sourceChannel,
|
|
2423
|
+
userMessageInterface: sourceInterface,
|
|
2424
|
+
assistantMessageInterface: sourceInterface,
|
|
2425
|
+
...(opts?.automated ? { automated: true } : {}),
|
|
2426
|
+
...(imageSourcePaths ? { imageSourcePaths } : {}),
|
|
2427
|
+
};
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2345
2430
|
// ---------------------------------------------------------------------------
|
|
2346
2431
|
// Module-level state
|
|
2347
2432
|
// ---------------------------------------------------------------------------
|
|
@@ -2372,6 +2457,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
2372
2457
|
operationId: "messages_get",
|
|
2373
2458
|
endpoint: "messages",
|
|
2374
2459
|
method: "GET",
|
|
2460
|
+
policy: {
|
|
2461
|
+
requiredScopes: ["chat.read"],
|
|
2462
|
+
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
2463
|
+
},
|
|
2375
2464
|
summary: "List messages",
|
|
2376
2465
|
description:
|
|
2377
2466
|
"Return messages for a conversation, including attachments and interface file metadata.",
|
|
@@ -2401,6 +2490,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
2401
2490
|
operationId: "messages_post",
|
|
2402
2491
|
endpoint: "messages",
|
|
2403
2492
|
method: "POST",
|
|
2493
|
+
policy: {
|
|
2494
|
+
requiredScopes: ["chat.write"],
|
|
2495
|
+
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
2496
|
+
},
|
|
2404
2497
|
summary: "Send a message",
|
|
2405
2498
|
description:
|
|
2406
2499
|
"Send a user message to a conversation and trigger the assistant response.",
|
|
@@ -2433,6 +2526,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
2433
2526
|
operationId: "search_get",
|
|
2434
2527
|
endpoint: "search",
|
|
2435
2528
|
method: "GET",
|
|
2529
|
+
policy: {
|
|
2530
|
+
requiredScopes: ["chat.read"],
|
|
2531
|
+
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
2532
|
+
},
|
|
2436
2533
|
summary: "Search conversations",
|
|
2437
2534
|
description: "Full-text search across all conversations.",
|
|
2438
2535
|
tags: ["conversations"],
|
|
@@ -2446,6 +2543,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
2446
2543
|
operationId: "suggestion_get",
|
|
2447
2544
|
endpoint: "suggestion",
|
|
2448
2545
|
method: "GET",
|
|
2546
|
+
policy: {
|
|
2547
|
+
requiredScopes: ["chat.read"],
|
|
2548
|
+
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
2549
|
+
},
|
|
2449
2550
|
summary: "Get reply suggestion",
|
|
2450
2551
|
description:
|
|
2451
2552
|
"Return an LLM-generated follow-up suggestion for the most recent assistant message.",
|