@vellumai/assistant 0.11.2 → 0.11.3-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +58 -3
- package/docs/trusted-contact-access.md +9 -5
- package/docs/vellum-doctor.md +195 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +39 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +19 -2
- package/node_modules/@vellumai/environments/package.json +2 -1
- package/node_modules/@vellumai/environments/src/__tests__/cloud-assistant-hub-url.test.ts +38 -0
- package/node_modules/@vellumai/environments/src/__tests__/install-layout.test.ts +98 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +5 -5
- package/node_modules/@vellumai/environments/src/index.ts +17 -6
- package/node_modules/@vellumai/environments/src/install-layout.ts +49 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +29 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +39 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +4 -0
- package/node_modules/@vellumai/gateway-client/src/verification-session-contract.ts +91 -6
- package/node_modules/@vellumai/ipc-server-utils/src/endpoint.test.ts +36 -0
- package/node_modules/@vellumai/ipc-server-utils/src/endpoint.ts +142 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +2 -0
- package/node_modules/@vellumai/ipc-server-utils/src/listen-options.ts +3 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +15 -1
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +17 -2
- package/node_modules/@vellumai/service-contracts/src/channels.ts +39 -0
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +16 -2
- package/openapi.yaml +589 -30
- package/package.json +1 -1
- package/src/__tests__/agent-image-optimize.test.ts +4 -4
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +113 -66
- package/src/__tests__/agent-loop-override-profile.test.ts +38 -48
- package/src/__tests__/agent-loop-subagent-billing-headers.test.ts +166 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/answered-question-persistence.test.ts +240 -0
- package/src/__tests__/anthropic-provider.test.ts +165 -30
- package/src/__tests__/app-control-flow.test.ts +9 -8
- package/src/__tests__/assistant-event-hub.test.ts +48 -0
- package/src/__tests__/attachments-store-heic-normalize.test.ts +16 -12
- package/src/__tests__/attachments-store.test.ts +130 -68
- package/src/__tests__/attachments.test.ts +36 -36
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/call-start-guardian-guard.test.ts +18 -4
- package/src/__tests__/canned-reply-release.test.ts +86 -0
- package/src/__tests__/channel-guardian.test.ts +59 -29
- package/src/__tests__/channel-readiness-telegram-remote.test.ts +154 -0
- package/src/__tests__/channel-setup-panel-ack.test.ts +6 -5
- package/src/__tests__/client-os-metadata-persistence.test.ts +103 -4
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/consult-deadline.test.ts +65 -0
- package/src/__tests__/conversation-agent-loop.test.ts +438 -2
- package/src/__tests__/conversation-disk-view-integration.test.ts +5 -1
- package/src/__tests__/conversation-disk-view.test.ts +4 -4
- package/src/__tests__/conversation-error.test.ts +22 -3
- package/src/__tests__/conversation-fork-crud.test.ts +5 -1
- package/src/__tests__/conversation-fork-referential.test.ts +352 -0
- package/src/__tests__/conversation-fork-retrospective.test.ts +5 -1
- package/src/__tests__/conversation-group-tools.test.ts +32 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +27 -1
- package/src/__tests__/conversation-initial-prompt.test.ts +51 -22
- package/src/__tests__/conversation-key-store-bootstrap-cleanup.test.ts +119 -0
- package/src/__tests__/conversation-key-store-origin.test.ts +105 -0
- package/src/__tests__/conversation-list-recency-ordering.test.ts +104 -0
- package/src/__tests__/conversation-origin-at-creation.test.ts +153 -0
- package/src/__tests__/conversation-origin-channel-filter.test.ts +95 -0
- package/src/__tests__/conversation-placement-promotion.test.ts +172 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +123 -0
- package/src/__tests__/conversation-queue.test.ts +433 -1
- package/src/__tests__/conversation-retry-route.test.ts +3 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +64 -1
- package/src/__tests__/conversation-store-ephemeral.test.ts +4 -0
- package/src/__tests__/conversation-store.test.ts +26 -10
- package/src/__tests__/conversation-summarize-route.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +15 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -5
- package/src/__tests__/conversation-surfaces-app-control.test.ts +12 -11
- package/src/__tests__/conversation-surfaces-app-open.test.ts +11 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +5 -4
- package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +967 -0
- package/src/__tests__/conversation-surfaces-persisted-info.test.ts +312 -0
- package/src/__tests__/conversation-surfaces-queued-emit.test.ts +6 -5
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -8
- package/src/__tests__/conversation-surfaces-standalone.test.ts +21 -11
- package/src/__tests__/conversation-surfaces-state-update.test.ts +7 -11
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -6
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +11 -6
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +9 -6
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +70 -7
- package/src/__tests__/conversation-wait-for-idle.test.ts +6 -11
- package/src/__tests__/credential-prompt-route.test.ts +57 -7
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +89 -28
- package/src/__tests__/custom-group-listing-visibility.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +4 -1
- package/src/__tests__/discord-access-request-privacy.test.ts +366 -0
- package/src/__tests__/discord-requester-notice-privacy.test.ts +87 -0
- package/src/__tests__/disk-pressure-guard.test.ts +55 -55
- package/src/__tests__/disk-pressure-routes.test.ts +10 -10
- package/src/__tests__/disk-pressure-tools.test.ts +2 -2
- package/src/__tests__/disk-usage.test.ts +35 -20
- package/src/__tests__/document-sync-tags.test.ts +379 -0
- package/src/__tests__/document-update-default-surface.test.ts +28 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -4
- package/src/__tests__/ensure-conversation-exists.test.ts +8 -5
- package/src/__tests__/events-dev-bypass-actor.test.ts +183 -1
- package/src/__tests__/evict-conversations-for-reload.test.ts +90 -0
- package/src/__tests__/file-list-tool.test.ts +12 -10
- package/src/__tests__/file-ops-service.test.ts +151 -44
- package/src/__tests__/file-read-container-boundary.test.ts +137 -0
- package/src/__tests__/file-read-tool.test.ts +21 -9
- package/src/__tests__/file-url-path-guard.test.ts +83 -0
- package/src/__tests__/filesystem-tools.test.ts +82 -66
- package/src/__tests__/guardian-outbound-http.test.ts +8 -8
- package/src/__tests__/helpers/gateway-verification-sessions-stub.ts +14 -1
- package/src/__tests__/helpers/hub-clients.ts +42 -0
- package/src/__tests__/helpers/mock-conversation.ts +46 -0
- package/src/__tests__/helpers/verification-sessions-ipc-sim.ts +61 -57
- package/src/__tests__/history-repair.test.ts +112 -12
- package/src/__tests__/host-bash-proxy.test.ts +10 -5
- package/src/__tests__/host-bash-routes.test.ts +67 -0
- package/src/__tests__/host-browser-proxy.test.ts +2 -2
- package/src/__tests__/host-cu-proxy.test.ts +3 -7
- package/src/__tests__/host-file-proxy.test.ts +3 -7
- package/src/__tests__/host-file-read-tool.test.ts +5 -1
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +6 -4
- package/src/__tests__/http-conversation-lineage.test.ts +2 -5
- package/src/__tests__/http-user-message-parity.test.ts +44 -0
- package/src/__tests__/identity-routes.test.ts +13 -13
- package/src/__tests__/image-conversion.test.ts +29 -26
- package/src/__tests__/image-source-path-reinject.test.ts +2 -2
- package/src/__tests__/inference-profile-session-handler.test.ts +95 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +25 -0
- package/src/__tests__/introduction-card-resolver.test.ts +6 -1
- package/src/__tests__/list-messages-attachments.test.ts +56 -32
- package/src/__tests__/list-messages-background-tool-completion.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +2 -2
- package/src/__tests__/list-messages-hidden-metadata.test.ts +16 -16
- package/src/__tests__/list-messages-page-latest.test.ts +61 -61
- package/src/__tests__/list-messages-provider-error.test.ts +6 -6
- package/src/__tests__/list-messages-queued.test.ts +49 -6
- package/src/__tests__/list-messages-system-card.test.ts +4 -4
- package/src/__tests__/list-messages-tool-merge.test.ts +9 -9
- package/src/__tests__/llm-resolver-override-or-default.test.ts +141 -0
- package/src/__tests__/llm-usage-store.test.ts +55 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +45 -0
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +133 -0
- package/src/__tests__/media-stream-server-integration.test.ts +36 -0
- package/src/__tests__/migration-export-http.test.ts +1 -1
- package/src/__tests__/migration-import-commit-http.test.ts +1 -1
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -1
- package/src/__tests__/migration-validate-http.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +65 -3
- package/src/__tests__/notification-platform-adapter.test.ts +104 -0
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +4 -2
- package/src/__tests__/oauth-provider-seed-logos.test.ts +65 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +17 -0
- package/src/__tests__/oauth-providers-routes.test.ts +1 -0
- package/src/__tests__/openai-responses-prompt-cache.test.ts +5 -2
- package/src/__tests__/path-policy.test.ts +164 -1
- package/src/__tests__/persist-media-references.test.ts +2 -2
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +5 -5
- package/src/__tests__/persist-unsendable-image.test.ts +23 -23
- package/src/__tests__/persona-resolver.test.ts +154 -0
- package/src/__tests__/plugin-api-webhook-url.test.ts +170 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +6 -0
- package/src/__tests__/processing-flag-persist-failure.test.ts +15 -10
- package/src/__tests__/profile-availability-incomplete.test.ts +113 -0
- package/src/__tests__/profiler-routes.test.ts +13 -13
- package/src/__tests__/prompt-cache-cross-turn-stability.test.ts +593 -0
- package/src/__tests__/proxy-approval-callback.test.ts +3 -3
- package/src/__tests__/queued-message-cancel-and-steer.test.ts +189 -0
- package/src/__tests__/queued-message-steer-actor-scoping.test.ts +164 -0
- package/src/__tests__/resolve-trust-class.test.ts +20 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +174 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +15 -7
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +166 -0
- package/src/__tests__/schedule-routes.test.ts +730 -8
- package/src/__tests__/schedule-store.test.ts +540 -0
- package/src/__tests__/schedule-tools.test.ts +103 -0
- package/src/__tests__/scheduler-wake.test.ts +5 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +29 -1
- package/src/__tests__/secure-keys.test.ts +91 -0
- package/src/__tests__/server-history-render.test.ts +97 -7
- package/src/__tests__/size-guard.test.ts +8 -8
- package/src/__tests__/skill-docs-sync-guard.test.ts +3 -2
- package/src/__tests__/skill-tool-factory.test.ts +247 -0
- package/src/__tests__/skills-install-staging.test.ts +15 -6
- package/src/__tests__/slack-edit-ordering-characterization.test.ts +103 -0
- package/src/__tests__/slack-inbound-verification.test.ts +4 -1
- package/src/__tests__/slack-mention-binding-invariance.test.ts +103 -0
- package/src/__tests__/slack-mention-provider-leak-audit.test.ts +135 -0
- package/src/__tests__/starter-task-flow.test.ts +5 -4
- package/src/__tests__/steer-on-enqueue-question.test.ts +3 -2
- package/src/__tests__/stt-language-catalog-parity.test.ts +38 -0
- package/src/__tests__/subagent-allowlist-validation.test.ts +26 -4
- package/src/__tests__/subagent-cron-run-attribution.test.ts +301 -0
- package/src/__tests__/subagent-disposal.test.ts +10 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +10 -0
- package/src/__tests__/subagent-fork-prompt-role.test.ts +85 -11
- package/src/__tests__/subagent-fork-spawn.test.ts +15 -7
- package/src/__tests__/subagent-manager-notify.test.ts +148 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/subagent-persistence.test.ts +141 -0
- package/src/__tests__/subagent-role-registry.test.ts +172 -63
- package/src/__tests__/subagent-role-resolution.test.ts +88 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +48 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +111 -10
- package/src/__tests__/subagent-terminal-message.test.ts +88 -1
- package/src/__tests__/subagent-tool-gate-mode.test.ts +225 -10
- package/src/__tests__/subagent-tools.test.ts +1901 -108
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +124 -0
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +298 -0
- package/src/__tests__/system-prompt.test.ts +82 -7
- package/src/__tests__/tool-grant-request-escalation.test.ts +40 -1
- package/src/__tests__/tool-result-spool.test.ts +74 -18
- package/src/__tests__/tool-side-effects-documents.test.ts +174 -0
- package/src/__tests__/tool-side-effects-hook-failures.test.ts +129 -0
- package/src/__tests__/tools-audio-read.test.ts +10 -10
- package/src/__tests__/tools-get-route.test.ts +85 -12
- package/src/__tests__/tools-list-cli.test.ts +171 -0
- package/src/__tests__/top-level-renderer.test.ts +54 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +68 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +4 -1
- package/src/__tests__/turn-tail-chain.test.ts +135 -0
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +6 -4
- package/src/__tests__/ui-visual-surface.test.ts +5 -4
- package/src/__tests__/ui-work-result-surface.test.ts +5 -4
- package/src/__tests__/unified-turn-context-visible-app.test.ts +7 -8
- package/src/__tests__/usage-routes.test.ts +62 -0
- package/src/__tests__/verification-outbound-delivery.test.ts +176 -0
- package/src/__tests__/visible-app-context.test.ts +20 -4
- package/src/__tests__/web-search-history.test.ts +96 -0
- package/src/__tests__/workspace-migration-139-clear-renamed-cost-profile-label.test.ts +6 -6
- package/src/__tests__/workspace-migration-140-repair-seed-pinned-memory-v3-live.test.ts +330 -0
- package/src/acp/failure-error.ts +3 -5
- package/src/agent/attachments.ts +26 -24
- package/src/agent/history-repair/history-repair.ts +27 -26
- package/src/agent/image-optimize.ts +6 -6
- package/src/agent/loop.ts +40 -22
- package/src/agent/message-types.ts +3 -3
- package/src/api/constants/document-tools.ts +55 -0
- package/src/api/events/question-answered.ts +53 -0
- package/src/api/events/tool-result.ts +7 -0
- package/src/api/index.ts +13 -0
- package/src/api/responses/conversation-message.ts +11 -0
- package/src/api/surfaces-oauth-connect.test.ts +96 -0
- package/src/api/surfaces.ts +36 -8
- package/src/approvals/guardian-channel-delivery.ts +83 -0
- package/src/approvals/guardian-expiry-notifier.ts +13 -11
- package/src/approvals/guardian-request-resolvers.ts +222 -135
- package/src/calls/__tests__/voice-session-bridge.test.ts +50 -0
- package/src/calls/media-stream-server.ts +9 -1
- package/src/calls/voice-session-bridge.ts +38 -0
- package/src/channels/__tests__/gateway-verification-sessions.test.ts +3 -3
- package/src/channels/config.ts +7 -2
- package/src/channels/gateway-verification-sessions.ts +7 -2
- package/src/channels/types.ts +7 -1
- package/src/cli/commands/__tests__/cache.test.ts +7 -4
- package/src/cli/commands/__tests__/cli-test-harness.ts +82 -0
- package/src/cli/commands/__tests__/conversations-wake.test.ts +51 -6
- package/src/cli/commands/__tests__/inference-models.test.ts +14 -0
- package/src/cli/commands/__tests__/inference-profiles.test.ts +44 -1
- package/src/cli/commands/__tests__/inference-providers.test.ts +7 -0
- package/src/cli/commands/__tests__/plugins.test.ts +692 -0
- package/src/cli/commands/__tests__/schedules.test.ts +136 -37
- package/src/cli/commands/conversations.ts +7 -3
- package/src/cli/commands/credentials.help.ts +7 -0
- package/src/cli/commands/inference-profiles.ts +9 -3
- package/src/cli/commands/inference.help.ts +16 -2
- package/src/cli/commands/mcp.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +18 -0
- package/src/cli/commands/notifications.ts +3 -6
- package/src/cli/commands/oauth/connect-surface-guidance.test.ts +16 -0
- package/src/cli/commands/oauth/connect-surface-guidance.ts +25 -7
- package/src/cli/commands/oauth/connect.test.ts +26 -1
- package/src/cli/commands/oauth/connect.ts +4 -1
- package/src/cli/commands/oauth/index.help.ts +3 -1
- package/src/cli/commands/oauth/providers.ts +3 -0
- package/src/cli/commands/plugins.help.ts +25 -2
- package/src/cli/commands/plugins.ts +289 -10
- package/src/cli/commands/schedules.help.ts +14 -12
- package/src/cli/commands/schedules.ts +19 -5
- package/src/cli/commands/tools.help.ts +4 -2
- package/src/cli/commands/tools.ts +38 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +1 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +79 -0
- package/src/cli/lib/__tests__/install-from-platform.test.ts +47 -1
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +86 -7
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +122 -0
- package/src/cli/lib/install-from-github.ts +61 -0
- package/src/cli/lib/install-from-platform.ts +13 -2
- package/src/cli/lib/plugin-surfaces.ts +124 -4
- package/src/cli/lib/upgrade-plugin.ts +18 -0
- package/src/cli.ts +1 -1
- package/src/config/__tests__/deployment-context-defaults.test.ts +73 -0
- package/src/config/__tests__/memory-retrospective-schema.test.ts +40 -0
- package/src/config/__tests__/plugin-updates-schema.test.ts +43 -0
- package/src/config/__tests__/profile-tool-support.test.ts +131 -0
- package/src/config/bundled-skills/AGENTS.md +1 -1
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -1
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +3 -3
- package/src/config/bundled-skills/schedule/SKILL.md +5 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +53 -22
- package/src/config/bundled-skills/subagent/TOOLS.json +14 -13
- package/src/config/bundled-skills/visualize/SKILL.md +1 -1
- package/src/config/default-profile-catalog.ts +6 -2
- package/src/config/feature-flag-registry.json +25 -17
- package/src/config/llm-resolver.ts +45 -15
- package/src/config/loader.ts +70 -1
- package/src/config/profile-tool-support.ts +110 -0
- package/src/config/sanitize-for-transfer.ts +11 -0
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/stt.test.ts +20 -5
- package/src/config/schemas/channels.ts +13 -0
- package/src/config/schemas/memory-retrospective.ts +25 -0
- package/src/config/schemas/plugin-updates.ts +55 -0
- package/src/config/schemas/services.ts +8 -4
- package/src/config/schemas/stt.ts +17 -5
- package/src/config/schemas/timeouts.ts +1 -1
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +16 -0
- package/src/contacts/guardian-delivery-reader.ts +29 -2
- package/src/context/compactor.ts +4 -4
- package/src/context/post-turn-tool-result-truncation.ts +32 -16
- package/src/context/strip-injections.ts +42 -0
- package/src/context/tool-result-spool.ts +32 -18
- package/src/credential-execution/ces-runtime.ts +3 -0
- package/src/credential-execution/client.ts +22 -1
- package/src/credential-execution/process-manager.test.ts +99 -0
- package/src/credential-execution/process-manager.ts +62 -16
- package/src/daemon/__tests__/abort-null-controller.test.ts +141 -5
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +8 -12
- package/src/daemon/__tests__/install-assistant-command.test.ts +234 -0
- package/src/daemon/__tests__/turn-tail-assistant-reply-notify.test.ts +2 -4
- package/src/daemon/__tests__/turn-tail-deleted-conversation.test.ts +20 -29
- package/src/daemon/channel-ui-capability.ts +4 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +117 -61
- package/src/daemon/conversation-agent-loop.ts +318 -148
- package/src/daemon/conversation-attachments.ts +1 -1
- package/src/daemon/conversation-error.ts +8 -1
- package/src/daemon/conversation-initial-prompt.ts +16 -38
- package/src/daemon/conversation-lifecycle.ts +154 -32
- package/src/daemon/conversation-messaging.ts +106 -43
- package/src/daemon/conversation-process.ts +131 -33
- package/src/daemon/conversation-queue-manager.ts +10 -0
- package/src/daemon/conversation-runtime-assembly.ts +9 -4
- package/src/daemon/conversation-store.ts +52 -3
- package/src/daemon/conversation-surface-state.ts +9 -0
- package/src/daemon/conversation-surfaces.ts +403 -210
- package/src/daemon/conversation-tool-setup.ts +56 -7
- package/src/daemon/conversation-turn-finalize.ts +134 -89
- package/src/daemon/conversation.ts +111 -27
- package/src/daemon/disk-pressure-guard-lifecycle.ts +2 -2
- package/src/daemon/disk-pressure-guard.ts +3 -3
- package/src/daemon/doordash-steps.ts +5 -5
- package/src/daemon/external-plugins-bootstrap.ts +7 -1
- package/src/daemon/handlers/config-channels.ts +48 -5
- package/src/daemon/handlers/conversation-history.ts +1 -1
- package/src/daemon/handlers/conversations.ts +62 -17
- package/src/daemon/handlers/shared.ts +12 -0
- package/src/daemon/handlers/skills.ts +11 -1
- package/src/daemon/identity-helpers.ts +38 -10
- package/src/daemon/install-assistant-command.ts +322 -0
- package/src/daemon/lifecycle.ts +14 -3
- package/src/daemon/message-types/conversations.ts +6 -7
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/persist-media-references.ts +23 -14
- package/src/daemon/process-message.ts +6 -6
- package/src/daemon/tool-setup-types.ts +19 -122
- package/src/daemon/tool-side-effects.ts +17 -94
- package/src/daemon/trust-context-types.ts +39 -0
- package/src/daemon/trust-context.ts +14 -6
- package/src/daemon/turn-tail-chain.ts +73 -0
- package/src/daemon/web-search-history.ts +47 -33
- package/src/heartbeat/heartbeat-service.ts +6 -6
- package/src/ipc/__tests__/socket-path.test.ts +21 -0
- package/src/ipc/assistant-server.ts +17 -10
- package/src/ipc/cli-client.ts +10 -1
- package/src/ipc/routes/__tests__/documents-sync-ipc-routes.test.ts +56 -0
- package/src/ipc/routes/documents-sync-ipc-routes.ts +42 -0
- package/src/ipc/socket-cleanup.ts +9 -7
- package/src/ipc/socket-path.ts +4 -96
- package/src/live-voice/__tests__/live-voice-archive.test.ts +16 -16
- package/src/live-voice/__tests__/live-voice-attach-image.test.ts +209 -0
- package/src/live-voice/__tests__/live-voice-connection.test.ts +20 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +7 -5
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +265 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +6 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +35 -15
- package/src/live-voice/__tests__/protocol.test.ts +52 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +3 -0
- package/src/live-voice/live-voice-archive.ts +13 -13
- package/src/live-voice/live-voice-connection.ts +7 -1
- package/src/live-voice/live-voice-photo.ts +169 -0
- package/src/live-voice/live-voice-session.ts +108 -4
- package/src/live-voice/protocol.ts +89 -1
- package/src/mcp/client.ts +10 -0
- package/src/messaging/providers/__tests__/callback-routing.test.ts +5 -1
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +66 -4
- package/src/messaging/providers/callback-routing.ts +1 -0
- package/src/messaging/providers/discord/api.ts +312 -0
- package/src/messaging/providers/discord/dm-delivery.test.ts +204 -0
- package/src/messaging/providers/discord/render.test.ts +204 -0
- package/src/messaging/providers/discord/render.ts +195 -0
- package/src/messaging/providers/discord/send.test.ts +179 -0
- package/src/messaging/providers/discord/send.ts +212 -0
- package/src/messaging/providers/discord/transport.ts +81 -0
- package/src/messaging/providers/index.ts +3 -1
- package/src/messaging/providers/retry-policy.test.ts +247 -0
- package/src/messaging/providers/retry-policy.ts +206 -0
- package/src/messaging/providers/slack/mention-source.test.ts +285 -0
- package/src/messaging/providers/slack/mention-source.ts +287 -0
- package/src/messaging/providers/telegram-bot/api.ts +47 -130
- package/src/messaging/providers/whatsapp/api.ts +47 -136
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +4 -1
- package/src/monitoring/__tests__/plugin-auto-update.test.ts +332 -0
- package/src/monitoring/db-integrity-sample.ts +6 -1
- package/src/monitoring/plugin-auto-update.ts +359 -0
- package/src/monitoring/resource-sampler.ts +21 -5
- package/src/monitoring/worker.ts +13 -0
- package/src/notifications/__tests__/assistant-reply-producer.test.ts +375 -2
- package/src/notifications/__tests__/broadcaster.test.ts +37 -1
- package/src/notifications/__tests__/copy-composer.test.ts +165 -0
- package/src/notifications/__tests__/emit-signal-pipeline-failure.test.ts +205 -0
- package/src/notifications/__tests__/notification-utils.test.ts +249 -0
- package/src/notifications/adapters/platform.ts +31 -2
- package/src/notifications/assistant-reply-producer.ts +79 -32
- package/src/notifications/broadcaster.ts +30 -10
- package/src/notifications/copy-composer.ts +69 -0
- package/src/notifications/emit-signal.ts +82 -15
- package/src/notifications/events-store.ts +10 -2
- package/src/notifications/home-feed-side-effect.ts +6 -3
- package/src/notifications/notification-utils.ts +173 -5
- package/src/notifications/signal.ts +12 -0
- package/src/oauth/AGENTS.md +4 -2
- package/src/oauth/byo-connection.ts +6 -1
- package/src/oauth/credential-token-resolver.ts +3 -10
- package/src/oauth/manual-token-connection.ts +29 -64
- package/src/oauth/manual-token-providers.ts +62 -0
- package/src/oauth/provider-serializer.ts +13 -0
- package/src/oauth/seed-providers.ts +62 -11
- package/src/onboarding/onboarding-events-store.ts +91 -1
- package/src/permissions/question-prompter.test.ts +4 -0
- package/src/permissions/question-prompter.ts +21 -4
- package/src/persistence/__tests__/conversation-lineage.test.ts +248 -0
- package/src/persistence/attachments-store.ts +15 -15
- package/src/persistence/conversation-attention-store.ts +30 -10
- package/src/persistence/conversation-bootstrap.ts +17 -0
- package/src/persistence/conversation-crud.ts +363 -97
- package/src/persistence/conversation-group-migration.ts +1 -1
- package/src/persistence/conversation-key-store.ts +38 -10
- package/src/persistence/conversation-lineage.ts +226 -0
- package/src/persistence/conversation-plugin-facade.ts +28 -3
- package/src/persistence/conversation-queries.ts +207 -33
- package/src/persistence/conversation-types.ts +107 -1
- package/src/persistence/jobs-store.ts +32 -8
- package/src/persistence/llm-usage-store.ts +22 -0
- package/src/persistence/migrations/361-normalize-managed-connection-rows.test.ts +168 -0
- package/src/persistence/migrations/361-normalize-managed-connection-rows.ts +76 -0
- package/src/persistence/migrations/362-add-conversation-subagent-kind.test.ts +187 -0
- package/src/persistence/migrations/362-add-conversation-subagent-kind.ts +93 -0
- package/src/persistence/migrations/363-backfill-schedule-inference-profile.test.ts +229 -0
- package/src/persistence/migrations/363-backfill-schedule-inference-profile.ts +127 -0
- package/src/persistence/migrations/364-add-schedule-source-key.test.ts +120 -0
- package/src/persistence/migrations/364-add-schedule-source-key.ts +43 -0
- package/src/persistence/migrations/365-add-conversation-fork-strategy.ts +27 -0
- package/src/persistence/schema/conversations.ts +32 -0
- package/src/persistence/schema/infrastructure.ts +3 -0
- package/src/persistence/steps.ts +30 -0
- package/src/persistence/subagent-store.ts +148 -6
- package/src/platform/managed-speech.test.ts +20 -0
- package/src/platform/managed-speech.ts +9 -0
- package/src/plugin-api/index.ts +8 -0
- package/src/plugin-api/webhook-url.ts +151 -0
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +82 -0
- package/src/plugins/__tests__/source-fingerprint.test.ts +5 -1
- package/src/plugins/collect-source-versions.ts +4 -27
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +5 -5
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +4 -2
- package/src/plugins/defaults/image-recovery/recover.ts +67 -57
- package/src/plugins/defaults/index.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +64 -18
- package/src/plugins/defaults/memory/__tests__/jobs-worker-outcome-contract.test.ts +242 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-retrospective-sweep.test.ts +24 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +48 -3
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +511 -19
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +39 -3
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +493 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-wake-chain.test.ts +5 -4
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +5 -1
- package/src/plugins/defaults/memory/job-handlers.ts +87 -5
- package/src/plugins/defaults/memory/jobs-worker.ts +60 -6
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +11 -0
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +29 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +342 -60
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +23 -3
- package/src/plugins/defaults/memory/substrate/consolidation-lock.ts +9 -4
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +7 -0
- package/src/plugins/defaults/memory/v1/graph/injection.ts +1 -1
- package/src/plugins/defaults/memory/v2/router.ts +8 -0
- package/src/plugins/defaults/turn-context/unified-turn-context.ts +1 -2
- package/src/plugins/external-plugin-loader.ts +17 -8
- package/src/plugins/installed-plugin-dirs.ts +101 -0
- package/src/plugins/mtime-cache.ts +34 -22
- package/src/plugins/types.ts +69 -8
- package/src/prompts/persona-resolver.ts +6 -2
- package/src/prompts/system-prompt.ts +72 -17
- package/src/providers/__tests__/inference.test.ts +40 -0
- package/src/providers/__tests__/preflight-resolved-config.test.ts +58 -1
- package/src/providers/__tests__/retry-callsite.test.ts +67 -0
- package/src/providers/__tests__/vellum-connection-routing.test.ts +42 -11
- package/src/providers/anthropic/client.ts +112 -95
- package/src/providers/connection-resolution.ts +35 -1
- package/src/providers/gemini/client.ts +5 -5
- package/src/providers/inference/adapter-factory.ts +16 -10
- package/src/providers/inference/auth.ts +16 -0
- package/src/providers/inference/connection-availability.ts +164 -12
- package/src/providers/inference/connections.ts +25 -1
- package/src/providers/media-resolve.ts +21 -11
- package/src/providers/model-catalog.ts +15 -0
- package/src/providers/openai/chat-completions-provider.ts +4 -4
- package/src/providers/openai/responses-provider.ts +12 -25
- package/src/providers/registry.ts +9 -4
- package/src/providers/retry.ts +25 -0
- package/src/providers/server-tool-pairing.ts +134 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +187 -6
- package/src/providers/speech-to-text/deepgram.ts +1 -0
- package/src/providers/speech-to-text/resolve.ts +80 -10
- package/src/providers/speech-to-text/vellum-managed.ts +7 -1
- package/src/providers/speech-to-text/vellum-speech-relay-connection.ts +3 -1
- package/src/providers/types.ts +26 -6
- package/src/providers/vellum-model-routing.ts +6 -7
- package/src/runtime/AGENTS.md +2 -0
- package/src/runtime/__tests__/agent-wake.test.ts +16 -16
- package/src/runtime/__tests__/background-job-runner.test.ts +0 -144
- package/src/runtime/__tests__/desktop-presence.test.ts +162 -0
- package/src/runtime/agent-wake.ts +63 -24
- package/src/runtime/assistant-event-hub.ts +87 -12
- package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -0
- package/src/runtime/auth/__tests__/scopes.test.ts +20 -0
- package/src/runtime/auth/same-actor.ts +56 -8
- package/src/runtime/auth/scopes.ts +12 -0
- package/src/runtime/auth/types.ts +2 -0
- package/src/runtime/background-job-runner.ts +5 -27
- package/src/runtime/channel-readiness-service.ts +59 -3
- package/src/runtime/channel-readiness-types.ts +18 -0
- package/src/runtime/desktop-presence.ts +69 -0
- package/src/runtime/http-server.ts +12 -0
- package/src/runtime/local-actor-identity.ts +11 -9
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/client-routes.test.ts +186 -14
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +547 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +162 -7
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +340 -3
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +28 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +173 -1
- package/src/runtime/routes/__tests__/question-routes.test.ts +64 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +20 -0
- package/src/runtime/routes/__tests__/skill-history-route.test.ts +116 -0
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +60 -2
- package/src/runtime/routes/archive-utils.ts +16 -12
- package/src/runtime/routes/attachment-routes.ts +13 -6
- package/src/runtime/routes/canned-reply-release.ts +54 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -27
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +5 -0
- package/src/runtime/routes/client-routes.ts +114 -2
- package/src/runtime/routes/conversation-cli-routes.ts +10 -12
- package/src/runtime/routes/conversation-list-routes.ts +59 -10
- package/src/runtime/routes/conversation-management-routes.ts +47 -18
- package/src/runtime/routes/conversation-query-routes.ts +32 -53
- package/src/runtime/routes/conversation-routes.ts +360 -293
- package/src/runtime/routes/credential-prompt-routes.ts +23 -2
- package/src/runtime/routes/debug-routes.ts +4 -1
- package/src/runtime/routes/default-provider-routes.ts +7 -11
- package/src/runtime/routes/documents-routes.ts +44 -1
- package/src/runtime/routes/events-routes.ts +28 -1
- package/src/runtime/routes/host-app-control-routes.ts +2 -0
- package/src/runtime/routes/host-bash-routes.ts +2 -0
- package/src/runtime/routes/host-browser-routes.ts +2 -0
- package/src/runtime/routes/host-cu-routes.ts +2 -0
- package/src/runtime/routes/host-file-routes.ts +2 -0
- package/src/runtime/routes/host-transfer-routes.ts +4 -0
- package/src/runtime/routes/identity-routes.ts +6 -6
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +7 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +14 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +14 -11
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -17
- package/src/runtime/routes/inference-profile-availability-guard.ts +171 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +26 -2
- package/src/runtime/routes/inference-profile-session-routes.ts +2 -1
- package/src/runtime/routes/inference-profiles-routes.ts +152 -73
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -16
- package/src/runtime/routes/llm-call-sites-routes.ts +13 -0
- package/src/runtime/routes/log-export-routes.ts +1 -1
- package/src/runtime/routes/notification-routes.ts +0 -14
- package/src/runtime/routes/oauth-providers.ts +1 -0
- package/src/runtime/routes/plugins-routes.ts +106 -1
- package/src/runtime/routes/profiler-routes.ts +4 -2
- package/src/runtime/routes/question-routes.ts +28 -10
- package/src/runtime/routes/retrospective-routes.ts +9 -3
- package/src/runtime/routes/schedule-routes.ts +210 -12
- package/src/runtime/routes/secret-routes.ts +40 -23
- package/src/runtime/routes/settings-routes.ts +41 -13
- package/src/runtime/routes/skills-routes.ts +79 -0
- package/src/runtime/routes/ui-snapshot-routes.ts +1 -0
- package/src/runtime/routes/wake-conversation-routes.ts +23 -0
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -0
- package/src/runtime/services/conversation-serializer.ts +24 -9
- package/src/runtime/sync/documents-sidecar-publish.test.ts +101 -0
- package/src/runtime/sync/resource-sync-events.ts +79 -1
- package/src/runtime/sync/worker-daemon-notify.test.ts +34 -0
- package/src/runtime/sync/worker-daemon-notify.ts +44 -6
- package/src/runtime/verification-outbound-actions.ts +250 -222
- package/src/runtime/verification-templates.ts +41 -30
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +614 -0
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1066 -0
- package/src/schedule/inference-profile.ts +64 -3
- package/src/schedule/plugin-schedule-declarations.ts +518 -0
- package/src/schedule/plugin-schedule-reconciler.ts +605 -0
- package/src/schedule/plugin-schedules-gate.ts +23 -0
- package/src/schedule/schedule-store.ts +520 -26
- package/src/schedule/scheduler.ts +38 -0
- package/src/security/credential-backend.ts +51 -4
- package/src/security/encrypted-store.ts +64 -42
- package/src/security/secure-keys.ts +55 -7
- package/src/skills/catalog-install.ts +20 -7
- package/src/skills/inline-command-runner.ts +2 -7
- package/src/skills/skill-history.test.ts +269 -0
- package/src/skills/skill-history.ts +250 -0
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/stt/daemon-batch-transcriber.ts +8 -6
- package/src/subagent/__tests__/consult-prompt.test.ts +25 -0
- package/src/subagent/consult-prompt.ts +3 -1
- package/src/subagent/consult-transcript.ts +1 -1
- package/src/subagent/manager.ts +304 -44
- package/src/subagent/progress-events.ts +35 -0
- package/src/subagent/role-resolution.ts +88 -0
- package/src/subagent/types.ts +302 -67
- package/src/subagent/validate-allowlists.ts +3 -4
- package/src/telegram/__tests__/webhook-health.test.ts +73 -1
- package/src/telegram/webhook-health.ts +101 -3
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +2 -0
- package/src/telemetry/activation-funnel.ts +6 -1
- package/src/telemetry/live-voice-funnel.ts +75 -0
- package/src/telemetry/telemetry-event-sources.ts +6 -0
- package/src/telemetry/telemetry-wire-source.json +1 -1
- package/src/telemetry/telemetry-wire.generated.ts +2 -0
- package/src/telemetry/types.ts +23 -4
- package/src/telemetry/usage-telemetry-reporter.test.ts +4 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +118 -3
- package/src/tools/ask-question/ask-question-tool.ts +56 -2
- package/src/tools/browser/browser-execution.ts +1 -1
- package/src/tools/calls/call-start.ts +8 -5
- package/src/tools/conversation-groups/move_to_group.ts +10 -12
- package/src/tools/document/document-tool.ts +11 -4
- package/src/tools/execution-timeout.ts +9 -2
- package/src/tools/executor.ts +7 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +7 -13
- package/src/tools/filesystem/search.ts +23 -21
- package/src/tools/filesystem/write.ts +4 -1
- package/src/tools/host-filesystem/edit.ts +7 -2
- package/src/tools/host-filesystem/read.ts +21 -8
- package/src/tools/host-filesystem/write.ts +10 -2
- package/src/tools/host-terminal/host-shell.ts +2 -2
- package/src/tools/mcp/mcp-tool-factory.ts +25 -1
- package/src/tools/permission-checker.ts +8 -3
- package/src/tools/schedule/delete.ts +13 -1
- package/src/tools/schedule/list.ts +14 -3
- package/src/tools/schedule/update.ts +56 -33
- package/src/tools/shared/filesystem/audio-read.ts +6 -4
- package/src/tools/shared/filesystem/file-ops-service.ts +176 -116
- package/src/tools/shared/filesystem/image-read.ts +12 -12
- package/src/tools/shared/filesystem/path-policy.ts +70 -5
- package/src/tools/shared/filesystem/size-guard.ts +6 -6
- package/src/tools/shared/input-misuse.ts +72 -0
- package/src/tools/skills/scaffold-managed.ts +82 -0
- package/src/tools/skills/skill-tool-factory.ts +14 -1
- package/src/tools/subagent/consult-deadline.ts +12 -7
- package/src/tools/subagent/message.ts +3 -1
- package/src/tools/subagent/read.ts +66 -4
- package/src/tools/subagent/spawn.ts +500 -78
- package/src/tools/tool-approval-handler.ts +45 -4
- package/src/tools/types.ts +22 -3
- package/src/tools/ui-surface/surface-shape-docs.ts +1 -1
- package/src/tools/ui-surface/visual-validation.ts +2 -0
- package/src/usage/__tests__/subagent-attribution.test.ts +109 -0
- package/src/usage/subagent-attribution.ts +108 -0
- package/src/util/__tests__/sqlite-retry.test.ts +112 -0
- package/src/util/abort-reasons.ts +16 -0
- package/src/util/ansi.ts +44 -0
- package/src/util/disk-usage.ts +17 -13
- package/src/util/image-conversion.ts +20 -13
- package/src/util/schedule-source-key.ts +23 -0
- package/src/util/worker-process.ts +7 -1
- package/src/workspace/git-service.ts +33 -9
- package/src/workspace/migrations/140-repair-seed-pinned-memory-v3-live.ts +260 -0
- package/src/workspace/migrations/141-stt-english-default-to-multilingual.ts +111 -0
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +126 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/workspace/top-level-renderer.ts +15 -2
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -357
- package/src/daemon/install-symlink.ts +0 -207
- package/src/notifications/deferred-emit.ts +0 -147
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
11
11
|
|
|
12
|
-
import type {
|
|
12
|
+
import type { Conversation } from "../daemon/conversation.js";
|
|
13
13
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
14
14
|
import type { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
15
15
|
import type { ToolExecutor } from "../tools/executor.js";
|
|
@@ -65,10 +65,12 @@ mock.module("../persistence/external-conversation-store.js", () => ({
|
|
|
65
65
|
// ---------------------------------------------------------------------------
|
|
66
66
|
|
|
67
67
|
import * as configLoader from "../config/loader.js";
|
|
68
|
+
import { createSurfaceMutex } from "../daemon/conversation-surfaces.js";
|
|
68
69
|
import {
|
|
69
70
|
createToolExecutor,
|
|
70
71
|
resolveConversationAttribution,
|
|
71
72
|
} from "../daemon/conversation-tool-setup.js";
|
|
73
|
+
import { asConversation } from "./helpers/mock-conversation.js";
|
|
72
74
|
import { setConfig } from "./helpers/set-config.js";
|
|
73
75
|
|
|
74
76
|
// ---------------------------------------------------------------------------
|
|
@@ -91,12 +93,13 @@ function makeGetConfigThrow(): ReturnType<typeof spyOn> {
|
|
|
91
93
|
});
|
|
92
94
|
}
|
|
93
95
|
|
|
94
|
-
/** Build a minimal
|
|
95
|
-
function makeCtx(overrides: Partial<
|
|
96
|
-
return {
|
|
96
|
+
/** Build a minimal Conversation stub. */
|
|
97
|
+
function makeCtx(overrides: Partial<Conversation> = {}): Conversation {
|
|
98
|
+
return asConversation({
|
|
97
99
|
conversationId: "conv-test",
|
|
98
100
|
currentRequestId: "req-1",
|
|
99
101
|
workingDir: "/tmp/test",
|
|
102
|
+
getTurnActorPrincipalId: () => undefined,
|
|
100
103
|
abortController: null,
|
|
101
104
|
sendToClient: mock(() => {}),
|
|
102
105
|
pendingSurfaceActions: new Map(),
|
|
@@ -110,9 +113,9 @@ function makeCtx(overrides: Partial<ToolSetupContext> = {}): ToolSetupContext {
|
|
|
110
113
|
enqueueMessage: () => ({ queued: false, requestId: "r" }),
|
|
111
114
|
getQueueDepth: () => 0,
|
|
112
115
|
processMessage: async () => "",
|
|
113
|
-
withSurface:
|
|
116
|
+
withSurface: createSurfaceMutex(),
|
|
114
117
|
...overrides,
|
|
115
|
-
};
|
|
118
|
+
});
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
/** Fake ToolExecutor that captures the context of each execute() call. */
|
|
@@ -138,7 +141,7 @@ const noopSecretPrompter = {
|
|
|
138
141
|
prompt: mock(async () => ({ cancelled: true })),
|
|
139
142
|
} as unknown as SecretPrompter;
|
|
140
143
|
|
|
141
|
-
function makeToolFn(executor: ToolExecutor, ctx:
|
|
144
|
+
function makeToolFn(executor: ToolExecutor, ctx: Conversation) {
|
|
142
145
|
return createToolExecutor(executor, noopPrompter, noopSecretPrompter, ctx);
|
|
143
146
|
}
|
|
144
147
|
|
|
@@ -400,3 +403,63 @@ describe("createToolExecutor channel-permission coordinate threading", () => {
|
|
|
400
403
|
expect(bindingLookups).toEqual([]);
|
|
401
404
|
});
|
|
402
405
|
});
|
|
406
|
+
|
|
407
|
+
describe("createToolExecutor source-actor threading", () => {
|
|
408
|
+
test("submits the turn's actor principal, not the trust context's guardian", async () => {
|
|
409
|
+
// `ToolContext.sourceActorPrincipalId` is compared against the principal a
|
|
410
|
+
// client registered with on its SSE stream, so it has to be the turn's
|
|
411
|
+
// actor. Reading `trustContext.guardianPrincipalId` instead meant any turn
|
|
412
|
+
// whose trust resolution degraded submitted nothing, and the same-actor
|
|
413
|
+
// gate rejected it as a user mismatch.
|
|
414
|
+
const { executor, calls } = makeCapturingExecutor();
|
|
415
|
+
await makeToolFn(
|
|
416
|
+
executor,
|
|
417
|
+
makeCtx({
|
|
418
|
+
getTurnActorPrincipalId: () => "actor-1",
|
|
419
|
+
currentTurnTrustContext: {
|
|
420
|
+
sourceChannel: "vellum",
|
|
421
|
+
trustClass: "guardian",
|
|
422
|
+
guardianPrincipalId: "guardian-1",
|
|
423
|
+
},
|
|
424
|
+
}),
|
|
425
|
+
)("file_read", { path: "/tmp/a" });
|
|
426
|
+
|
|
427
|
+
expect(calls[0].context.sourceActorPrincipalId).toBe("actor-1");
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
test("carries the actor through even when trust resolved without a guardian principal", async () => {
|
|
431
|
+
// The regression: degraded trust resolution (unreachable gateway, binding
|
|
432
|
+
// drift) or a service-principal turn leaves `guardianPrincipalId` unset
|
|
433
|
+
// while the turn's actor is perfectly well known.
|
|
434
|
+
const { executor, calls } = makeCapturingExecutor();
|
|
435
|
+
await makeToolFn(
|
|
436
|
+
executor,
|
|
437
|
+
makeCtx({
|
|
438
|
+
getTurnActorPrincipalId: () => "actor-1",
|
|
439
|
+
currentTurnTrustContext: {
|
|
440
|
+
sourceChannel: "vellum",
|
|
441
|
+
trustClass: "unknown",
|
|
442
|
+
},
|
|
443
|
+
}),
|
|
444
|
+
)("file_read", { path: "/tmp/a" });
|
|
445
|
+
|
|
446
|
+
expect(calls[0].context.sourceActorPrincipalId).toBe("actor-1");
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test("submits nothing when the turn has no actor identity at all", async () => {
|
|
450
|
+
const { executor, calls } = makeCapturingExecutor();
|
|
451
|
+
await makeToolFn(
|
|
452
|
+
executor,
|
|
453
|
+
makeCtx({
|
|
454
|
+
getTurnActorPrincipalId: () => undefined,
|
|
455
|
+
currentTurnTrustContext: {
|
|
456
|
+
sourceChannel: "vellum",
|
|
457
|
+
trustClass: "guardian",
|
|
458
|
+
guardianPrincipalId: "guardian-1",
|
|
459
|
+
},
|
|
460
|
+
}),
|
|
461
|
+
)("file_read", { path: "/tmp/a" });
|
|
462
|
+
|
|
463
|
+
expect(calls[0].context.sourceActorPrincipalId).toBeUndefined();
|
|
464
|
+
});
|
|
465
|
+
});
|
|
@@ -306,25 +306,20 @@ describe("Conversation.waitForIdle", () => {
|
|
|
306
306
|
expect(second.value).toBe(true);
|
|
307
307
|
});
|
|
308
308
|
|
|
309
|
-
test("a clear whose persisted write throws
|
|
309
|
+
test("a clear whose persisted write throws still releases waiters", async () => {
|
|
310
310
|
const conversation = makeConversation();
|
|
311
311
|
conversation.setProcessing(true);
|
|
312
312
|
|
|
313
313
|
const waiter = observe(conversation.waitForIdle({ timeoutMs: 60_000 }));
|
|
314
314
|
|
|
315
315
|
failNextProcessingWrite = true;
|
|
316
|
-
expect(() => conversation.setProcessing(false)).toThrow(
|
|
317
|
-
"database is locked",
|
|
318
|
-
);
|
|
316
|
+
expect(() => conversation.setProcessing(false)).not.toThrow();
|
|
319
317
|
await flushMicrotasks();
|
|
320
|
-
// The write failed, so the flag reverted to processing — the waiter must
|
|
321
|
-
// still be pending.
|
|
322
|
-
expect(conversation.isProcessing()).toBe(true);
|
|
323
|
-
expect(waiter.settled).toBe(false);
|
|
324
318
|
|
|
325
|
-
// The
|
|
326
|
-
|
|
327
|
-
|
|
319
|
+
// The persisted column is advisory and the boot-time stale-processing
|
|
320
|
+
// sweep recovers it; the in-memory flag is the release every waiter (voice
|
|
321
|
+
// barge-in, drain) is parked on, so it has to stick.
|
|
322
|
+
expect(conversation.isProcessing()).toBe(false);
|
|
328
323
|
expect(waiter.value).toBe(true);
|
|
329
324
|
});
|
|
330
325
|
});
|
|
@@ -206,11 +206,12 @@ describe("credentials/prompt route", () => {
|
|
|
206
206
|
expect(capturedMetadata?.usageDescription).toBeUndefined();
|
|
207
207
|
});
|
|
208
208
|
|
|
209
|
-
test("stores a non-slack credential to secure storage
|
|
209
|
+
test("stores a non-slack credential to secure storage and reports the value as received", async () => {
|
|
210
210
|
/**
|
|
211
211
|
* The default delivery persists the value to secure storage and runs the
|
|
212
|
-
* manual-token connection sync
|
|
213
|
-
*
|
|
212
|
+
* manual-token connection sync. The message must name the outcome — the
|
|
213
|
+
* value is in hand — so a bare `ok: true` cannot be misread as "the prompt
|
|
214
|
+
* opened".
|
|
214
215
|
*/
|
|
215
216
|
// GIVEN a standard store-delivery prompt for a non-slack credential
|
|
216
217
|
// WHEN the route handles it
|
|
@@ -227,8 +228,55 @@ describe("credentials/prompt route", () => {
|
|
|
227
228
|
// AND the manual token connection is synced for the service
|
|
228
229
|
expect(syncedServices).toEqual(["stripe"]);
|
|
229
230
|
|
|
230
|
-
// AND
|
|
231
|
-
expect(result.message).
|
|
231
|
+
// AND the message reports the credential as received and stored
|
|
232
|
+
expect(result.message).toContain(
|
|
233
|
+
"Credential received from the user and stored as stripe/api_key.",
|
|
234
|
+
);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("every successful outcome states that the prompt has closed", async () => {
|
|
238
|
+
/**
|
|
239
|
+
* The prompt blocks until answered, so a caller reads the result only after
|
|
240
|
+
* the secure input is gone. Without an explicit close signal a model
|
|
241
|
+
* follows up with "the prompt is open, paste it there" and the user
|
|
242
|
+
* re-submits into a surface that never reappears — the loop reported in
|
|
243
|
+
* the Aug 2026 Claude Code auth feedback. Every success path must say so,
|
|
244
|
+
* not just the plain vault write.
|
|
245
|
+
*/
|
|
246
|
+
const closed =
|
|
247
|
+
"The secure prompt has closed — do not ask the user to enter this value again.";
|
|
248
|
+
|
|
249
|
+
// GIVEN a plain vault write
|
|
250
|
+
const stored = (await promptRoute!.handler({
|
|
251
|
+
body: { service: "stripe", field: "api_key", label: "Stripe API Key" },
|
|
252
|
+
})) as PromptResponse;
|
|
253
|
+
|
|
254
|
+
// THEN it reports the prompt as closed
|
|
255
|
+
expect(stored.message).toContain(closed);
|
|
256
|
+
|
|
257
|
+
// GIVEN a one-time send instead
|
|
258
|
+
secretResult = { value: "secret-value", delivery: "transient_send" };
|
|
259
|
+
const transient = (await promptRoute!.handler({
|
|
260
|
+
body: { service: "stripe", field: "api_key", label: "Stripe API Key" },
|
|
261
|
+
})) as PromptResponse;
|
|
262
|
+
|
|
263
|
+
// THEN it reports the prompt as closed too
|
|
264
|
+
expect(transient.message).toContain(closed);
|
|
265
|
+
|
|
266
|
+
// GIVEN a Slack channel token, whose status line owns the outcome summary
|
|
267
|
+
secretResult = { value: "secret-value", delivery: "store" };
|
|
268
|
+
slackConfigResult = slackResult({ connected: true, teamName: "Acme" });
|
|
269
|
+
const slack = (await promptRoute!.handler({
|
|
270
|
+
body: {
|
|
271
|
+
service: "slack_channel",
|
|
272
|
+
field: "bot_token",
|
|
273
|
+
label: "Slack Bot Token",
|
|
274
|
+
},
|
|
275
|
+
})) as PromptResponse;
|
|
276
|
+
|
|
277
|
+
// THEN the close notice rides along with the connection status
|
|
278
|
+
expect(slack.message).toContain("Slack channel connected to Acme.");
|
|
279
|
+
expect(slack.message).toContain(closed);
|
|
232
280
|
});
|
|
233
281
|
|
|
234
282
|
test("connects the channel when a slack_channel token is provided", async () => {
|
|
@@ -259,7 +307,9 @@ describe("credentials/prompt route", () => {
|
|
|
259
307
|
|
|
260
308
|
// AND the connection status is surfaced as the response message
|
|
261
309
|
expect(result.ok).toBe(true);
|
|
262
|
-
expect(result.message).
|
|
310
|
+
expect(result.message).toContain(
|
|
311
|
+
"Slack channel connected to Acme (@acmebot).",
|
|
312
|
+
);
|
|
263
313
|
});
|
|
264
314
|
|
|
265
315
|
test("surfaces the warning when a slack_channel connection is incomplete", async () => {
|
|
@@ -284,7 +334,7 @@ describe("credentials/prompt route", () => {
|
|
|
284
334
|
|
|
285
335
|
// THEN the warning is surfaced as the response message
|
|
286
336
|
expect(result.ok).toBe(true);
|
|
287
|
-
expect(result.message).
|
|
337
|
+
expect(result.message).toContain(
|
|
288
338
|
"Slack channel connection incomplete; provide the app token.",
|
|
289
339
|
);
|
|
290
340
|
});
|
|
@@ -169,6 +169,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
|
|
|
169
169
|
"messaging/providers/telegram-bot/adapter.ts", // Telegram bot token lookup for connectivity check
|
|
170
170
|
"messaging/providers/slack/api.ts", // Slack Web API client (bot token for direct sends)
|
|
171
171
|
"messaging/providers/telegram-bot/api.ts", // Telegram Bot API client (bot token for direct sends)
|
|
172
|
+
"messaging/providers/discord/api.ts", // Discord REST client (bot token for direct sends)
|
|
172
173
|
"runtime/channel-readiness-service.ts", // channel readiness probes for Telegram connectivity
|
|
173
174
|
"telegram/webhook-health.ts", // Telegram webhook health sweep — reads bot_token to call getWebhookInfo (Bot API authenticates via the token in the URL path) and checks webhook_secret for existence only; neither value is logged, persisted, or returned
|
|
174
175
|
"messaging/providers/whatsapp/adapter.ts", // WhatsApp credential lookup for connectivity check
|
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
import { afterEach, describe, expect, mock, test } from "bun:test";
|
|
9
9
|
|
|
10
|
+
import { asConversation } from "./helpers/mock-conversation.js";
|
|
11
|
+
|
|
10
12
|
const sentMessages: unknown[] = [];
|
|
11
13
|
let mockHasClient = true; // Default to true for CU unified flow tests
|
|
12
14
|
// Default principal id used for both ctx.trustContext and clients in the
|
|
13
15
|
// existing single-user tests. Tests that exercise cross-user behaviour
|
|
14
|
-
// override this on individual clients and on the
|
|
16
|
+
// override this on individual clients and on the Conversation.
|
|
15
17
|
const DEFAULT_PRINCIPAL = "user-1";
|
|
16
18
|
let mockCuClients: Array<{
|
|
17
19
|
clientId: string;
|
|
@@ -48,18 +50,17 @@ mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
|
48
50
|
},
|
|
49
51
|
}));
|
|
50
52
|
|
|
51
|
-
const { surfaceProxyResolver } =
|
|
53
|
+
const { createSurfaceMutex, surfaceProxyResolver } =
|
|
52
54
|
await import("../daemon/conversation-surfaces.js");
|
|
53
55
|
const { HostCuProxy } = await import("../daemon/host-cu-proxy.js");
|
|
54
|
-
type
|
|
55
|
-
import("../daemon/conversation-surfaces.js").SurfaceConversationContext;
|
|
56
|
+
type Conversation = import("../daemon/conversation.js").Conversation;
|
|
56
57
|
|
|
57
58
|
// ---------------------------------------------------------------------------
|
|
58
59
|
// Test helpers
|
|
59
60
|
// ---------------------------------------------------------------------------
|
|
60
61
|
|
|
61
62
|
/**
|
|
62
|
-
* Build a minimal
|
|
63
|
+
* Build a minimal Conversation with optional hostCuProxy.
|
|
63
64
|
* Only the fields required by the CU routing path are populated.
|
|
64
65
|
*
|
|
65
66
|
* `trustContext` defaults to a guardian context owned by `DEFAULT_PRINCIPAL`.
|
|
@@ -70,8 +71,12 @@ function buildMockContext(
|
|
|
70
71
|
hostCuProxy?: InstanceType<typeof HostCuProxy>,
|
|
71
72
|
trustGuardianPrincipalId: string | null = DEFAULT_PRINCIPAL,
|
|
72
73
|
actorPrincipalId: string | null = trustGuardianPrincipalId,
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
// Mirrors `Conversation.ensureHostProxiesForTurn`: attaches a CU proxy when
|
|
75
|
+
// the gate passes. Left undefined to model a conversation that cannot
|
|
76
|
+
// attach one (the gate denies, or the context predates the hook).
|
|
77
|
+
ensureHostProxiesForTurn?: () => void,
|
|
78
|
+
): Conversation {
|
|
79
|
+
const ctx: Conversation = asConversation({
|
|
75
80
|
conversationId: "test-session",
|
|
76
81
|
trustContext:
|
|
77
82
|
trustGuardianPrincipalId != null
|
|
@@ -83,13 +88,13 @@ function buildMockContext(
|
|
|
83
88
|
: undefined,
|
|
84
89
|
authContext:
|
|
85
90
|
actorPrincipalId != null
|
|
86
|
-
? ({ actorPrincipalId } as
|
|
91
|
+
? ({ actorPrincipalId } as Conversation["authContext"])
|
|
87
92
|
: undefined,
|
|
88
93
|
currentTurnAuthContext:
|
|
89
94
|
actorPrincipalId != null
|
|
90
95
|
? ({
|
|
91
96
|
actorPrincipalId,
|
|
92
|
-
} as
|
|
97
|
+
} as Conversation["currentTurnAuthContext"])
|
|
93
98
|
: undefined,
|
|
94
99
|
sendToClient: () => {},
|
|
95
100
|
pendingSurfaceActions: new Map(),
|
|
@@ -100,12 +105,15 @@ function buildMockContext(
|
|
|
100
105
|
surfaceActionRequestIds: new Set(),
|
|
101
106
|
currentTurnSurfaces: [],
|
|
102
107
|
hostCuProxy,
|
|
108
|
+
transportInterface: "web",
|
|
109
|
+
ensureHostProxiesForTurn,
|
|
103
110
|
isProcessing: () => false,
|
|
104
111
|
enqueueMessage: () => ({ queued: false, requestId: "r1" }),
|
|
105
112
|
getQueueDepth: () => 0,
|
|
106
113
|
processMessage: async () => "",
|
|
107
|
-
withSurface:
|
|
108
|
-
};
|
|
114
|
+
withSurface: createSurfaceMutex(),
|
|
115
|
+
});
|
|
116
|
+
return ctx;
|
|
109
117
|
}
|
|
110
118
|
|
|
111
119
|
// ---------------------------------------------------------------------------
|
|
@@ -115,7 +123,7 @@ function buildMockContext(
|
|
|
115
123
|
describe("surfaceProxyResolver — CU tool routing", () => {
|
|
116
124
|
let proxy: InstanceType<typeof HostCuProxy>;
|
|
117
125
|
|
|
118
|
-
function setupProxy(maxSteps?: number):
|
|
126
|
+
function setupProxy(maxSteps?: number): Conversation {
|
|
119
127
|
sentMessages.length = 0;
|
|
120
128
|
mockHasClient = true;
|
|
121
129
|
mockCuClients = [
|
|
@@ -137,21 +145,77 @@ describe("surfaceProxyResolver — CU tool routing", () => {
|
|
|
137
145
|
// No desktop client connected
|
|
138
146
|
// -------------------------------------------------------------------------
|
|
139
147
|
|
|
140
|
-
describe("
|
|
141
|
-
test("
|
|
142
|
-
|
|
143
|
-
|
|
148
|
+
describe("attaching the proxy at tool-call time", () => {
|
|
149
|
+
test("attaches a proxy when the conversation has none and dispatches", async () => {
|
|
150
|
+
// The reported bug: `assistant clients list` showed the desktop
|
|
151
|
+
// connected and usable, while every computer_use_* call answered "no
|
|
152
|
+
// desktop client connected" — because attachment was decided at turn
|
|
153
|
+
// start, before the desktop was reachable, and never revisited.
|
|
154
|
+
sentMessages.length = 0;
|
|
155
|
+
mockHasClient = true;
|
|
156
|
+
mockCuClients = [
|
|
157
|
+
{
|
|
158
|
+
clientId: "mock-client-1",
|
|
159
|
+
capabilities: ["host_cu"],
|
|
160
|
+
actorPrincipalId: DEFAULT_PRINCIPAL,
|
|
161
|
+
},
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
let attachCalls = 0;
|
|
165
|
+
const ctx: Conversation = buildMockContext(
|
|
166
|
+
/* no proxy */ undefined,
|
|
167
|
+
DEFAULT_PRINCIPAL,
|
|
168
|
+
DEFAULT_PRINCIPAL,
|
|
169
|
+
() => {
|
|
170
|
+
attachCalls++;
|
|
171
|
+
proxy = new HostCuProxy();
|
|
172
|
+
(ctx as { hostCuProxy?: unknown }).hostCuProxy = proxy;
|
|
173
|
+
},
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const resultPromise = surfaceProxyResolver(ctx, "computer_use_click", {
|
|
144
177
|
element_id: 42,
|
|
145
178
|
reasoning: "click the button",
|
|
146
179
|
});
|
|
147
180
|
|
|
181
|
+
expect(attachCalls).toBe(1);
|
|
182
|
+
expect(ctx.hostCuProxy).toBeDefined();
|
|
183
|
+
// Dispatched for real: the request reached the wire, not an error result.
|
|
184
|
+
expect(sentMessages).toHaveLength(1);
|
|
185
|
+
const sent = sentMessages[0] as { type?: string; requestId?: string };
|
|
186
|
+
expect(sent.type).toBe("host_cu_request");
|
|
187
|
+
|
|
188
|
+
proxy.processObservation(sent.requestId!, { axTree: "window Safari" });
|
|
189
|
+
const result = await resultPromise;
|
|
190
|
+
expect(result.isError).toBe(false);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("reports the interface, not a missing desktop, when the gate still denies", async () => {
|
|
194
|
+
// The gate ran and refused (e.g. a chrome-extension source, or a
|
|
195
|
+
// desktop signed in as someone else). Saying "no desktop client
|
|
196
|
+
// connected" here contradicts a listing that plainly shows one.
|
|
197
|
+
mockCuClients = [
|
|
198
|
+
{
|
|
199
|
+
clientId: "mock-client-other",
|
|
200
|
+
capabilities: ["host_cu"],
|
|
201
|
+
actorPrincipalId: "someone-else",
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
const ctx = buildMockContext(/* no proxy, no attach hook */);
|
|
205
|
+
const result = await surfaceProxyResolver(
|
|
206
|
+
ctx,
|
|
207
|
+
"computer_use_screenshot",
|
|
208
|
+
{},
|
|
209
|
+
);
|
|
210
|
+
|
|
148
211
|
expect(result.isError).toBe(true);
|
|
149
|
-
expect(result.content).toContain("not available");
|
|
150
|
-
expect(result.content).toContain("no desktop client");
|
|
212
|
+
expect(result.content).toContain("not available for this conversation");
|
|
213
|
+
expect(result.content).not.toContain("no desktop client connected");
|
|
151
214
|
});
|
|
152
215
|
|
|
153
|
-
test("
|
|
154
|
-
|
|
216
|
+
test("reports no connected client when the hub has none", async () => {
|
|
217
|
+
mockCuClients = [];
|
|
218
|
+
const ctx = buildMockContext(/* no proxy */);
|
|
155
219
|
const result = await surfaceProxyResolver(
|
|
156
220
|
ctx,
|
|
157
221
|
"computer_use_screenshot",
|
|
@@ -159,11 +223,12 @@ describe("surfaceProxyResolver — CU tool routing", () => {
|
|
|
159
223
|
);
|
|
160
224
|
|
|
161
225
|
expect(result.isError).toBe(true);
|
|
162
|
-
expect(result.content).toContain("
|
|
226
|
+
expect(result.content).toContain("no desktop client connected");
|
|
163
227
|
});
|
|
164
228
|
|
|
165
229
|
test("returns error when proxy exists but client not connected", async () => {
|
|
166
230
|
mockHasClient = false;
|
|
231
|
+
mockCuClients = [];
|
|
167
232
|
const proxyObj = new HostCuProxy();
|
|
168
233
|
const ctx = buildMockContext(proxyObj);
|
|
169
234
|
const result = await surfaceProxyResolver(ctx, "computer_use_click", {
|
|
@@ -171,7 +236,7 @@ describe("surfaceProxyResolver — CU tool routing", () => {
|
|
|
171
236
|
});
|
|
172
237
|
|
|
173
238
|
expect(result.isError).toBe(true);
|
|
174
|
-
expect(result.content).toContain("
|
|
239
|
+
expect(result.content).toContain("no desktop client connected");
|
|
175
240
|
proxyObj.dispose();
|
|
176
241
|
});
|
|
177
242
|
|
|
@@ -640,9 +705,7 @@ describe("surfaceProxyResolver — CU tool routing", () => {
|
|
|
640
705
|
});
|
|
641
706
|
|
|
642
707
|
expect(result.isError).toBe(true);
|
|
643
|
-
expect(result.content).toContain(
|
|
644
|
-
"Submitting actor does not match the target client's actor",
|
|
645
|
-
);
|
|
708
|
+
expect(result.content).toContain("signed in as a different user");
|
|
646
709
|
// No state mutation, no dispatch.
|
|
647
710
|
expect(proxy.stepCount).toBe(0);
|
|
648
711
|
expect(proxy.actionHistory).toHaveLength(0);
|
|
@@ -669,9 +732,7 @@ describe("surfaceProxyResolver — CU tool routing", () => {
|
|
|
669
732
|
});
|
|
670
733
|
|
|
671
734
|
expect(result.isError).toBe(true);
|
|
672
|
-
expect(result.content).toContain(
|
|
673
|
-
"Submitting actor does not match the target client's actor",
|
|
674
|
-
);
|
|
735
|
+
expect(result.content).toContain("no authenticated actor");
|
|
675
736
|
expect(sentMessages).toHaveLength(0);
|
|
676
737
|
});
|
|
677
738
|
|
|
@@ -33,7 +33,7 @@ describe("custom-group standard-listing visibility", () => {
|
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
function listedIds(): string[] {
|
|
36
|
-
return listConversations(
|
|
36
|
+
return listConversations({ conversationType: "standard" }).map((c) => c.id);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
test("scheduled conversation in a custom group is listed", () => {
|
|
@@ -58,7 +58,10 @@ describe("schedule_syntax column migration", () => {
|
|
|
58
58
|
capabilities_json TEXT,
|
|
59
59
|
description TEXT NOT NULL DEFAULT '',
|
|
60
60
|
created_at INTEGER NOT NULL,
|
|
61
|
-
updated_at INTEGER NOT NULL
|
|
61
|
+
updated_at INTEGER NOT NULL,
|
|
62
|
+
source_key TEXT,
|
|
63
|
+
definition_hash TEXT,
|
|
64
|
+
user_enabled INTEGER
|
|
62
65
|
)
|
|
63
66
|
`);
|
|
64
67
|
|