@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
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installs the `assistant` command onto PATH on every daemon start.
|
|
3
|
+
*
|
|
4
|
+
* Skills and the agent's own bash tool invoke `assistant …` (e.g. `assistant
|
|
5
|
+
* browser navigate`), and the daemon's PATH is inherited from a GUI app launch
|
|
6
|
+
* that carries none of the install's bin directories. Without this the command
|
|
7
|
+
* is simply missing and every such tool call exits 127.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
|
+
import {
|
|
12
|
+
appendFileSync,
|
|
13
|
+
chmodSync,
|
|
14
|
+
existsSync,
|
|
15
|
+
lstatSync,
|
|
16
|
+
mkdirSync,
|
|
17
|
+
readFileSync,
|
|
18
|
+
readlinkSync,
|
|
19
|
+
renameSync,
|
|
20
|
+
symlinkSync,
|
|
21
|
+
unlinkSync,
|
|
22
|
+
writeFileSync,
|
|
23
|
+
} from "node:fs";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { basename, dirname, join, sep } from "node:path";
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
findAssistantCommand,
|
|
29
|
+
isRepoCheckoutPath,
|
|
30
|
+
} from "@vellumai/environments";
|
|
31
|
+
|
|
32
|
+
import { getLogger } from "../util/logger.js";
|
|
33
|
+
|
|
34
|
+
const log = getLogger("install-assistant-command");
|
|
35
|
+
|
|
36
|
+
/** Ownership marker embedded in every wrapper this module writes. */
|
|
37
|
+
const WRAPPER_MARKER = "# vellum-assistant-command v1";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* What to install as `assistant`:
|
|
41
|
+
* - `binary`: a compiled executable, installed as a symlink.
|
|
42
|
+
* - `bun-entry`: a script bun must interpret, installed as a wrapper that
|
|
43
|
+
* pins an absolute bun so the command works from any PATH.
|
|
44
|
+
*/
|
|
45
|
+
export type AssistantCommandTarget =
|
|
46
|
+
| { kind: "binary"; binary: string }
|
|
47
|
+
| { kind: "bun-entry"; bun: string; entry: string };
|
|
48
|
+
|
|
49
|
+
/** Whether `execPath` is a bun runtime rather than a compiled product binary. */
|
|
50
|
+
function isBunRuntime(execPath: string): boolean {
|
|
51
|
+
const base = basename(execPath);
|
|
52
|
+
return base === "bun" || base === "bunx" || base.startsWith("bun-");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The entrypoint bun should run for `assistant` in an npm-installed runtime:
|
|
57
|
+
* the command the install ships, or the assistant package's own CLI
|
|
58
|
+
* entrypoint when the dependency graph omits the package declaring that bin.
|
|
59
|
+
* Null for a repo checkout, where developers manage their own PATH.
|
|
60
|
+
*/
|
|
61
|
+
function resolveInstalledEntry(moduleDir: string): string | null {
|
|
62
|
+
if (isRepoCheckoutPath(moduleDir)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const command = findAssistantCommand(moduleDir);
|
|
67
|
+
if (command !== null) {
|
|
68
|
+
return command;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// `<pkg>/src/daemon` sits one level below `<pkg>/src/index.ts`.
|
|
72
|
+
const packageEntry = join(moduleDir, "..", "index.ts");
|
|
73
|
+
return existsSync(packageEntry) ? packageEntry : null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Resolve what `assistant` should point at, or null when this runtime layout
|
|
78
|
+
* has nothing installable.
|
|
79
|
+
*
|
|
80
|
+
* `execPath` and `moduleDir` are overridable so the layouts can be tested
|
|
81
|
+
* without a real install; both default to this process.
|
|
82
|
+
*/
|
|
83
|
+
export function resolveAssistantCommandTarget(overrides?: {
|
|
84
|
+
execPath?: string;
|
|
85
|
+
moduleDir?: string;
|
|
86
|
+
}): AssistantCommandTarget | null {
|
|
87
|
+
const execPath = overrides?.execPath ?? process.execPath;
|
|
88
|
+
const moduleDir = overrides?.moduleDir ?? dirname(__filename);
|
|
89
|
+
|
|
90
|
+
// Compiled desktop build: the `assistant` binary sits beside the daemon
|
|
91
|
+
// binary inside the app bundle.
|
|
92
|
+
if (execPath.includes(`${sep}Contents${sep}MacOS${sep}`)) {
|
|
93
|
+
const binary = join(dirname(execPath), "vellum-assistant");
|
|
94
|
+
if (existsSync(binary)) {
|
|
95
|
+
return { kind: "binary", binary };
|
|
96
|
+
}
|
|
97
|
+
log.warn(
|
|
98
|
+
{ expected: binary },
|
|
99
|
+
"Bundled vellum-assistant binary not found alongside daemon",
|
|
100
|
+
);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Installed npm runtime, run under bun. The entry needs an interpreter, so
|
|
105
|
+
// the bun running this daemon is what the wrapper pins.
|
|
106
|
+
if (!isBunRuntime(execPath)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const entry = resolveInstalledEntry(moduleDir);
|
|
110
|
+
return entry === null ? null : { kind: "bun-entry", bun: execPath, entry };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Single-quote a value for safe interpolation into a shell script. */
|
|
114
|
+
function shQuote(value: string): string {
|
|
115
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function wrapperScript(bun: string, entry: string): string {
|
|
119
|
+
return [
|
|
120
|
+
"#!/bin/sh",
|
|
121
|
+
WRAPPER_MARKER,
|
|
122
|
+
"# Installed by the Vellum assistant daemon. Safe to delete.",
|
|
123
|
+
`exec ${shQuote(bun)} ${shQuote(entry)} "$@"`,
|
|
124
|
+
"",
|
|
125
|
+
].join("\n");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Atomically write `content` via tmp-file + rename, mode 0755. */
|
|
129
|
+
function writeExecutableAtomic(path: string, content: string): void {
|
|
130
|
+
const tmpPath = `${path}.tmp`;
|
|
131
|
+
writeFileSync(tmpPath, content);
|
|
132
|
+
chmodSync(tmpPath, 0o755);
|
|
133
|
+
renameSync(tmpPath, path);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Whether anything already at `commandPath` may be replaced. A symlink or a
|
|
138
|
+
* wrapper this module wrote is ours; any other real file belongs to someone
|
|
139
|
+
* else (a developer's own build) and is never clobbered.
|
|
140
|
+
*/
|
|
141
|
+
function claimCommandPath(commandPath: string): boolean {
|
|
142
|
+
let stats;
|
|
143
|
+
try {
|
|
144
|
+
stats = lstatSync(commandPath);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
// Nothing there, so this is free to create.
|
|
147
|
+
return (err as NodeJS.ErrnoException)?.code === "ENOENT";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (stats.isSymbolicLink()) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
if (!stats.isFile()) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
return readFileSync(commandPath, "utf-8").includes(WRAPPER_MARKER);
|
|
158
|
+
} catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Install `target` at `commandPath`. Returns true when the command is in
|
|
165
|
+
* place (including when it already was), false when the path is unusable or
|
|
166
|
+
* belongs to someone else.
|
|
167
|
+
*/
|
|
168
|
+
export function installCommandAt(
|
|
169
|
+
commandPath: string,
|
|
170
|
+
target: AssistantCommandTarget,
|
|
171
|
+
): boolean {
|
|
172
|
+
try {
|
|
173
|
+
// Already correct? Leave it alone: this runs on every daemon start.
|
|
174
|
+
try {
|
|
175
|
+
const stats = lstatSync(commandPath);
|
|
176
|
+
if (target.kind === "binary" && stats.isSymbolicLink()) {
|
|
177
|
+
if (readlinkSync(commandPath) === target.binary) {
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
} else if (target.kind === "bun-entry" && stats.isFile()) {
|
|
181
|
+
if (
|
|
182
|
+
readFileSync(commandPath, "utf-8") ===
|
|
183
|
+
wrapperScript(target.bun, target.entry)
|
|
184
|
+
) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
} catch {
|
|
189
|
+
// Missing or unreadable, so fall through to the write below.
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (!claimCommandPath(commandPath)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const dir = dirname(commandPath);
|
|
197
|
+
if (!existsSync(dir)) {
|
|
198
|
+
mkdirSync(dir, { recursive: true });
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (target.kind === "binary") {
|
|
202
|
+
try {
|
|
203
|
+
unlinkSync(commandPath);
|
|
204
|
+
} catch {
|
|
205
|
+
// Nothing to remove.
|
|
206
|
+
}
|
|
207
|
+
symlinkSync(target.binary, commandPath);
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
writeExecutableAtomic(commandPath, wrapperScript(target.bun, target.entry));
|
|
212
|
+
return true;
|
|
213
|
+
} catch {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Ensures ~/.local/bin is present in the user's shell profile so that
|
|
220
|
+
* commands placed there are on PATH in new terminal sessions.
|
|
221
|
+
*/
|
|
222
|
+
function ensureLocalBinInShellProfile(localBinDir: string): void {
|
|
223
|
+
const shell = process.env.SHELL ?? "";
|
|
224
|
+
const home = homedir();
|
|
225
|
+
const profilePath = shell.endsWith("/zsh")
|
|
226
|
+
? join(home, ".zshrc")
|
|
227
|
+
: shell.endsWith("/bash")
|
|
228
|
+
? join(home, ".bash_profile")
|
|
229
|
+
: null;
|
|
230
|
+
if (!profilePath) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
try {
|
|
235
|
+
const contents = existsSync(profilePath)
|
|
236
|
+
? readFileSync(profilePath, "utf-8")
|
|
237
|
+
: "";
|
|
238
|
+
if (contents.includes(localBinDir)) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const line = `\nexport PATH="${localBinDir}:$PATH"\n`;
|
|
242
|
+
appendFileSync(profilePath, line);
|
|
243
|
+
log.info(
|
|
244
|
+
{ profilePath, localBinDir },
|
|
245
|
+
"Added ~/.local/bin to shell profile",
|
|
246
|
+
);
|
|
247
|
+
} catch {
|
|
248
|
+
// Not critical: the user can add it manually
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Checks whether `assistant` already resolves on PATH to something other than
|
|
254
|
+
* our candidate locations. If so, we skip installing to avoid shadowing a
|
|
255
|
+
* developer's local build.
|
|
256
|
+
*/
|
|
257
|
+
function commandResolvesElsewhere(
|
|
258
|
+
commandName: string,
|
|
259
|
+
candidatePaths: Set<string>,
|
|
260
|
+
): boolean {
|
|
261
|
+
try {
|
|
262
|
+
const resolved = execFileSync("/usr/bin/which", [commandName], {
|
|
263
|
+
encoding: "utf-8",
|
|
264
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
265
|
+
}).trim();
|
|
266
|
+
return resolved !== "" && !candidatePaths.has(resolved);
|
|
267
|
+
} catch {
|
|
268
|
+
// `which` exited non-zero: command not found, safe to proceed
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Idempotent: installs (or verifies) the `assistant` command. Called on every
|
|
275
|
+
* daemon startup, best-effort and self-contained: every step swallows its own
|
|
276
|
+
* errors, so a failure never affects startup.
|
|
277
|
+
*
|
|
278
|
+
* Tries `/usr/local/bin/assistant` first, then falls back to
|
|
279
|
+
* `~/.local/bin/assistant` (and patches the shell profile if needed).
|
|
280
|
+
*
|
|
281
|
+
* Skipped when VELLUM_DEV=1 (developers manage their own PATH).
|
|
282
|
+
*/
|
|
283
|
+
export function installAssistantCommand(): void {
|
|
284
|
+
if (process.env.VELLUM_DEV === "1") {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const target = resolveAssistantCommandTarget();
|
|
289
|
+
if (!target) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const localBinDir = join(homedir(), ".local", "bin");
|
|
294
|
+
const candidateDirs = ["/usr/local/bin", localBinDir];
|
|
295
|
+
const candidatePaths = new Set(
|
|
296
|
+
candidateDirs.map((dir) => `${dir}/assistant`),
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
if (commandResolvesElsewhere("assistant", candidatePaths)) {
|
|
300
|
+
log.info(
|
|
301
|
+
"`assistant` already resolves to a non-managed path, skipping install",
|
|
302
|
+
);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
for (const dir of candidateDirs) {
|
|
307
|
+
const commandPath = join(dir, "assistant");
|
|
308
|
+
if (installCommandAt(commandPath, target)) {
|
|
309
|
+
log.info({ commandPath, target }, "Installed assistant command");
|
|
310
|
+
if (dir === localBinDir) {
|
|
311
|
+
ensureLocalBinInShellProfile(localBinDir);
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
log.info(
|
|
316
|
+
{ commandPath },
|
|
317
|
+
"Could not install assistant command at candidate, trying next",
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
log.warn("Could not install assistant command in any candidate directory");
|
|
322
|
+
}
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -49,6 +49,7 @@ import { warmLocalGuardianPrincipalCache } from "../runtime/local-actor-identity
|
|
|
49
49
|
import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
|
|
50
50
|
import { markCurrentProcessAsMainDaemon } from "../runtime/process-role.js";
|
|
51
51
|
import { publishConfigChanged } from "../runtime/sync/resource-sync-events.js";
|
|
52
|
+
import { reconcilePluginSchedules } from "../schedule/plugin-schedule-reconciler.js";
|
|
52
53
|
import { recoverStaleSchedules } from "../schedule/schedule-recovery.js";
|
|
53
54
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
54
55
|
import { getSubagentManager } from "../subagent/index.js";
|
|
@@ -82,7 +83,7 @@ import { startDiskPressureGuardForLifecycle } from "./disk-pressure-guard-lifecy
|
|
|
82
83
|
import { startEventLoopWatchdog } from "./event-loop-watchdog.js";
|
|
83
84
|
import { initializePlugins } from "./external-plugins-bootstrap.js";
|
|
84
85
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
85
|
-
import {
|
|
86
|
+
import { installAssistantCommand } from "./install-assistant-command.js";
|
|
86
87
|
import {
|
|
87
88
|
type InterruptedResumeTarget,
|
|
88
89
|
MAX_RESUME_ATTEMPTS,
|
|
@@ -698,6 +699,16 @@ export async function runDaemon(): Promise<void> {
|
|
|
698
699
|
log.error({ err }, "Schedule recovery failed — continuing startup");
|
|
699
700
|
}
|
|
700
701
|
|
|
702
|
+
// Converge plugin-declared schedules into cron_jobs rows before the
|
|
703
|
+
// scheduler starts claiming. The reconciler contains its own failures and
|
|
704
|
+
// checks DB migration readiness itself; the catch is startup insurance in
|
|
705
|
+
// the same shape as schedule recovery above.
|
|
706
|
+
try {
|
|
707
|
+
await reconcilePluginSchedules();
|
|
708
|
+
} catch (err) {
|
|
709
|
+
log.error({ err }, "Plugin schedule reconcile failed, continuing startup");
|
|
710
|
+
}
|
|
711
|
+
|
|
701
712
|
// Reconcile workflow runs orphaned by a crash: any row still `running` was
|
|
702
713
|
// in flight when the process died (the engine always finishes its row on
|
|
703
714
|
// exit), so flip it to `interrupted` to make it eligible for an explicit
|
|
@@ -774,10 +785,10 @@ export async function runDaemon(): Promise<void> {
|
|
|
774
785
|
|
|
775
786
|
writePid(process.pid);
|
|
776
787
|
|
|
777
|
-
// Install the `assistant` CLI
|
|
788
|
+
// Install the `assistant` CLI command idempotently on every daemon start.
|
|
778
789
|
// Best-effort and self-contained: every step swallows its own errors, so a
|
|
779
790
|
// failure never affects startup.
|
|
780
|
-
|
|
791
|
+
installAssistantCommand();
|
|
781
792
|
|
|
782
793
|
void startEmbeddingRuntimeManager();
|
|
783
794
|
|
|
@@ -29,13 +29,12 @@ interface BaseTransportMetadata {
|
|
|
29
29
|
/** IANA timezone reported by the active client for the current turn. */
|
|
30
30
|
clientTimezone?: string;
|
|
31
31
|
/**
|
|
32
|
-
* The client's operating-system surface
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* inference, which keys off `interfaceId`.
|
|
32
|
+
* The client's operating-system surface, reported independently of
|
|
33
|
+
* {@link interfaceId}. The web bundle ships to browsers, mobile shells, and
|
|
34
|
+
* Electron desktop apps on the same `"web"` transport interface. `clientOs`
|
|
35
|
+
* tells the assistant which OS it is actually talking to, rendered as the
|
|
36
|
+
* `client_os:` line in the per-turn context, without perturbing
|
|
37
|
+
* transport/host-proxy capability inference, which keys off `interfaceId`.
|
|
39
38
|
*/
|
|
40
39
|
clientOs?: string;
|
|
41
40
|
/**
|
|
@@ -15,6 +15,7 @@ export const SYNC_TAGS = {
|
|
|
15
15
|
assistantSchedules: "assistant:self:schedules",
|
|
16
16
|
assistantTheme: "assistant:self:theme",
|
|
17
17
|
appsList: "apps:list",
|
|
18
|
+
documentsList: "documents:list",
|
|
18
19
|
pluginsList: "plugins:list",
|
|
19
20
|
conversationsList: "conversations:list",
|
|
20
21
|
featureFlagsClient: "feature-flags:client",
|
|
@@ -43,11 +43,11 @@ function imageFilename(mediaType: string): string {
|
|
|
43
43
|
* transport-optimized image (`resolveMediaReferences` applies the same
|
|
44
44
|
* optimization at send time), so hint the optimized dimensions.
|
|
45
45
|
*/
|
|
46
|
-
function optimizedImageDimensions(
|
|
46
|
+
async function optimizedImageDimensions(
|
|
47
47
|
dataBase64: string,
|
|
48
48
|
mediaType: string,
|
|
49
|
-
): { width: number; height: number } | null {
|
|
50
|
-
const optimized = optimizeImageForTransport(dataBase64, mediaType);
|
|
49
|
+
): Promise<{ width: number; height: number } | null> {
|
|
50
|
+
const optimized = await optimizeImageForTransport(dataBase64, mediaType);
|
|
51
51
|
return parseImageDimensions(optimized.data, optimized.mediaType);
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -56,13 +56,13 @@ function optimizedImageDimensions(
|
|
|
56
56
|
* `messageId`, returning the block with a `workspace_ref` source — or null when
|
|
57
57
|
* the store write fails (caller keeps the inline base64 block).
|
|
58
58
|
*/
|
|
59
|
-
function referenceMediaBlock(
|
|
59
|
+
async function referenceMediaBlock(
|
|
60
60
|
conversationId: string,
|
|
61
61
|
conversationCreatedAt: number,
|
|
62
62
|
messageId: string,
|
|
63
63
|
block: ImageContent | FileContent,
|
|
64
64
|
position: number,
|
|
65
|
-
): ContentBlock | null {
|
|
65
|
+
): Promise<ContentBlock | null> {
|
|
66
66
|
if (block.source.type !== "base64") {
|
|
67
67
|
return block;
|
|
68
68
|
}
|
|
@@ -73,7 +73,7 @@ function referenceMediaBlock(
|
|
|
73
73
|
|
|
74
74
|
let stored: { id: string; sizeBytes: number };
|
|
75
75
|
try {
|
|
76
|
-
stored = createInlineAttachment(
|
|
76
|
+
stored = await createInlineAttachment(
|
|
77
77
|
conversationId,
|
|
78
78
|
conversationCreatedAt,
|
|
79
79
|
filename,
|
|
@@ -99,7 +99,7 @@ function referenceMediaBlock(
|
|
|
99
99
|
: {}),
|
|
100
100
|
};
|
|
101
101
|
if (block.type === "image") {
|
|
102
|
-
const dims = optimizedImageDimensions(data, media_type);
|
|
102
|
+
const dims = await optimizedImageDimensions(data, media_type);
|
|
103
103
|
if (dims) {
|
|
104
104
|
source.width = dims.width;
|
|
105
105
|
source.height = dims.height;
|
|
@@ -122,34 +122,43 @@ function referenceMediaBlock(
|
|
|
122
122
|
* `workspace_ref`. Blocks that are already references, carry no media, or fail
|
|
123
123
|
* to store are returned unchanged.
|
|
124
124
|
*/
|
|
125
|
-
export function referenceMediaBlocksForPersist(
|
|
125
|
+
export async function referenceMediaBlocksForPersist(
|
|
126
126
|
conversationId: string,
|
|
127
127
|
conversationCreatedAt: number,
|
|
128
128
|
messageId: string,
|
|
129
129
|
blocks: ContentBlock[],
|
|
130
|
-
): ContentBlock[] {
|
|
130
|
+
): Promise<ContentBlock[]> {
|
|
131
131
|
// A single link position counter across all attachments in the message so
|
|
132
132
|
// their `message_attachments` rows keep content order.
|
|
133
133
|
let position = 0;
|
|
134
|
-
const convert = (block: ContentBlock): ContentBlock => {
|
|
134
|
+
const convert = async (block: ContentBlock): Promise<ContentBlock> => {
|
|
135
135
|
if (block.type === "image" || block.type === "file") {
|
|
136
136
|
if (block.source.type !== "base64") {
|
|
137
137
|
return block;
|
|
138
138
|
}
|
|
139
139
|
return (
|
|
140
|
-
referenceMediaBlock(
|
|
140
|
+
(await referenceMediaBlock(
|
|
141
141
|
conversationId,
|
|
142
142
|
conversationCreatedAt,
|
|
143
143
|
messageId,
|
|
144
144
|
block,
|
|
145
145
|
position++,
|
|
146
|
-
) ?? block
|
|
146
|
+
)) ?? block
|
|
147
147
|
);
|
|
148
148
|
}
|
|
149
149
|
if (block.type === "tool_result" && block.contentBlocks?.length) {
|
|
150
|
-
|
|
150
|
+
const contentBlocks: ContentBlock[] = [];
|
|
151
|
+
for (const cb of block.contentBlocks) {
|
|
152
|
+
contentBlocks.push(await convert(cb));
|
|
153
|
+
}
|
|
154
|
+
return { ...block, contentBlocks };
|
|
151
155
|
}
|
|
152
156
|
return block;
|
|
153
157
|
};
|
|
154
|
-
|
|
158
|
+
// Sequential so the shared position counter keeps content order.
|
|
159
|
+
const result: ContentBlock[] = [];
|
|
160
|
+
for (const block of blocks) {
|
|
161
|
+
result.push(await convert(block));
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
155
164
|
}
|
|
@@ -484,12 +484,12 @@ export async function processMessage(
|
|
|
484
484
|
const userMetaWithSlack = slackMeta
|
|
485
485
|
? { ...serverChannelMeta, slackMeta }
|
|
486
486
|
: serverChannelMeta;
|
|
487
|
-
const cleanMsg = createUserMessage(content, attachments);
|
|
487
|
+
const cleanMsg = await createUserMessage(content, attachments);
|
|
488
488
|
const llmMsg = enrichMessageWithSourcePaths(cleanMsg, attachments);
|
|
489
489
|
const persisted = await addMessage(
|
|
490
490
|
conversationId,
|
|
491
491
|
"user",
|
|
492
|
-
serializePersistedUserMessageContent(
|
|
492
|
+
await serializePersistedUserMessageContent(
|
|
493
493
|
content,
|
|
494
494
|
options?.displayContent,
|
|
495
495
|
attachments,
|
|
@@ -578,11 +578,11 @@ export async function processMessage(
|
|
|
578
578
|
const compactUserMeta = slackMeta
|
|
579
579
|
? { ...compactChannelMeta, slackMeta }
|
|
580
580
|
: compactChannelMeta;
|
|
581
|
-
const cleanMsg = createUserMessage(content, attachments);
|
|
581
|
+
const cleanMsg = await createUserMessage(content, attachments);
|
|
582
582
|
const persisted = await addMessage(
|
|
583
583
|
conversationId,
|
|
584
584
|
"user",
|
|
585
|
-
serializePersistedUserMessageContent(
|
|
585
|
+
await serializePersistedUserMessageContent(
|
|
586
586
|
content,
|
|
587
587
|
options?.displayContent,
|
|
588
588
|
attachments,
|
|
@@ -633,11 +633,11 @@ export async function processMessage(
|
|
|
633
633
|
const cleanUserMeta = slackMeta
|
|
634
634
|
? { ...cleanChannelMeta, slackMeta }
|
|
635
635
|
: cleanChannelMeta;
|
|
636
|
-
const cleanMsg = createUserMessage(content, attachments);
|
|
636
|
+
const cleanMsg = await createUserMessage(content, attachments);
|
|
637
637
|
const persisted = await addMessage(
|
|
638
638
|
conversationId,
|
|
639
639
|
"user",
|
|
640
|
-
serializePersistedUserMessageContent(
|
|
640
|
+
await serializePersistedUserMessageContent(
|
|
641
641
|
content,
|
|
642
642
|
options?.displayContent,
|
|
643
643
|
attachments,
|