@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
|
@@ -202,12 +202,12 @@ export function stopDiskPressureGuard(): void {
|
|
|
202
202
|
state.timer = null;
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
205
|
+
export async function evaluateDiskPressureNow(): Promise<DiskPressureStatus> {
|
|
206
206
|
ensureEnabledStatus();
|
|
207
207
|
|
|
208
|
-
let usageInfo: ReturnType<typeof getDiskUsageInfo
|
|
208
|
+
let usageInfo: Awaited<ReturnType<typeof getDiskUsageInfo>>;
|
|
209
209
|
try {
|
|
210
|
-
usageInfo = getDiskUsageInfo();
|
|
210
|
+
usageInfo = await getDiskUsageInfo();
|
|
211
211
|
} catch (error) {
|
|
212
212
|
return replaceStatus(sampleFailureStatus(error));
|
|
213
213
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { isPlainObject } from "../util/object.js";
|
|
9
|
+
import type { Conversation } from "./conversation.js";
|
|
9
10
|
import type { CardSurfaceData } from "./message-protocol.js";
|
|
10
|
-
import type { ToolSetupContext } from "./tool-setup-types.js";
|
|
11
11
|
|
|
12
12
|
interface DoordashStep {
|
|
13
13
|
label: string;
|
|
@@ -102,7 +102,7 @@ function updateDoordashSteps(
|
|
|
102
102
|
|
|
103
103
|
// ── Helpers for reading/writing the task_progress surface ─────────────
|
|
104
104
|
|
|
105
|
-
function getStoredSteps(ctx:
|
|
105
|
+
function getStoredSteps(ctx: Conversation): DoordashStep[] | null {
|
|
106
106
|
const stored = ctx.surfaceState.get(SURFACE_ID);
|
|
107
107
|
if (!stored || stored.surfaceType !== "card") {
|
|
108
108
|
return null;
|
|
@@ -116,7 +116,7 @@ function getStoredSteps(ctx: ToolSetupContext): DoordashStep[] | null {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
function pushStepsUpdate(
|
|
119
|
-
ctx:
|
|
119
|
+
ctx: Conversation,
|
|
120
120
|
updatedSteps: DoordashStep[],
|
|
121
121
|
): void {
|
|
122
122
|
const stored = ctx.surfaceState.get(SURFACE_ID);
|
|
@@ -160,7 +160,7 @@ export function isDoordashCommand(
|
|
|
160
160
|
* before the command runs.
|
|
161
161
|
*/
|
|
162
162
|
export function markDoordashStepInProgress(
|
|
163
|
-
ctx:
|
|
163
|
+
ctx: Conversation,
|
|
164
164
|
input: Record<string, unknown>,
|
|
165
165
|
): void {
|
|
166
166
|
const cmd = input.command as string | undefined;
|
|
@@ -190,7 +190,7 @@ export function markDoordashStepInProgress(
|
|
|
190
190
|
* DoorDash CLI command, then update step statuses based on the result.
|
|
191
191
|
*/
|
|
192
192
|
export function updateDoordashProgress(
|
|
193
|
-
ctx:
|
|
193
|
+
ctx: Conversation,
|
|
194
194
|
input: Record<string, unknown>,
|
|
195
195
|
isError: boolean,
|
|
196
196
|
): void {
|
|
@@ -60,6 +60,7 @@ import {
|
|
|
60
60
|
unregisterPluginInjectors,
|
|
61
61
|
} from "../plugins/injector-registry.js";
|
|
62
62
|
import { registerDeclaredCredentialKeyPatterns } from "../plugins/mtime-cache.js";
|
|
63
|
+
import { runInPluginContext } from "../plugins/plugin-execution-context.js";
|
|
63
64
|
import { getRegisteredPlugins, unregisterPlugin } from "../plugins/registry.js";
|
|
64
65
|
import {
|
|
65
66
|
type Plugin,
|
|
@@ -318,7 +319,12 @@ async function initializePlugin(
|
|
|
318
319
|
|
|
319
320
|
if (plugin.hooks?.[HOOKS.INIT]) {
|
|
320
321
|
try {
|
|
321
|
-
|
|
322
|
+
// Marked in context for the same reason `runPluginPipeline` marks
|
|
323
|
+
// every other hook: host APIs the hook reaches (resolveCredential,
|
|
324
|
+
// resolveWebhookUrl) scope to the calling plugin.
|
|
325
|
+
await runInPluginContext(name, () =>
|
|
326
|
+
plugin.hooks![HOOKS.INIT]!(initContext),
|
|
327
|
+
);
|
|
322
328
|
} catch (err) {
|
|
323
329
|
throw new PluginExecutionError(
|
|
324
330
|
`plugin ${name} init() failed: ${
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
} from "../../runtime/channel-verification-service.js";
|
|
42
42
|
import {
|
|
43
43
|
cancelOutbound,
|
|
44
|
+
deliverVerificationDiscord,
|
|
44
45
|
deliverVerificationSlack,
|
|
45
46
|
deliverVerificationTelegram,
|
|
46
47
|
DESTINATION_RATE_WINDOW_MS,
|
|
@@ -48,8 +49,7 @@ import {
|
|
|
48
49
|
normalizeTelegramDestination,
|
|
49
50
|
} from "../../runtime/verification-outbound-actions.js";
|
|
50
51
|
import {
|
|
51
|
-
|
|
52
|
-
composeVerificationTelegram,
|
|
52
|
+
composeVerificationText,
|
|
53
53
|
GUARDIAN_VERIFY_TEMPLATE_KEYS,
|
|
54
54
|
} from "../../runtime/verification-templates.js";
|
|
55
55
|
import { getTelegramBotUsername } from "../../telegram/bot-username.js";
|
|
@@ -209,7 +209,10 @@ export async function getVerificationStatus(
|
|
|
209
209
|
// restart and detect bootstrap completion.
|
|
210
210
|
const [pendingSession, activeOutboundSession] = await Promise.all([
|
|
211
211
|
getPendingSession(resolvedChannel),
|
|
212
|
-
|
|
212
|
+
// The guardian's own session. A channel can carry one per person
|
|
213
|
+
// verifying, so an unscoped read would report a requester's session as
|
|
214
|
+
// the guardian's pending verification.
|
|
215
|
+
findActiveSession(resolvedChannel, { verificationPurpose: "guardian" }),
|
|
213
216
|
]);
|
|
214
217
|
const hasPendingChallenge = pendingSession != null;
|
|
215
218
|
const outboundFields: Record<string, unknown> = {};
|
|
@@ -327,6 +330,8 @@ function toVerificationChannel(channelType: string): ChannelId | null {
|
|
|
327
330
|
return "telegram";
|
|
328
331
|
case "slack":
|
|
329
332
|
return "slack";
|
|
333
|
+
case "discord":
|
|
334
|
+
return "discord";
|
|
330
335
|
default:
|
|
331
336
|
return null;
|
|
332
337
|
}
|
|
@@ -423,7 +428,7 @@ export async function verifyTrustedContact(
|
|
|
423
428
|
verificationPurpose: "trusted_contact",
|
|
424
429
|
});
|
|
425
430
|
|
|
426
|
-
const telegramBody =
|
|
431
|
+
const telegramBody = composeVerificationText(
|
|
427
432
|
GUARDIAN_VERIFY_TEMPLATE_KEYS.TELEGRAM_CHALLENGE_REQUEST,
|
|
428
433
|
{
|
|
429
434
|
code: sessionResult.secret,
|
|
@@ -507,7 +512,7 @@ export async function verifyTrustedContact(
|
|
|
507
512
|
verificationPurpose: "trusted_contact",
|
|
508
513
|
});
|
|
509
514
|
|
|
510
|
-
const slackBody =
|
|
515
|
+
const slackBody = composeVerificationText(
|
|
511
516
|
GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_CHALLENGE_REQUEST,
|
|
512
517
|
{
|
|
513
518
|
code: sessionResult.secret,
|
|
@@ -529,6 +534,44 @@ export async function verifyTrustedContact(
|
|
|
529
534
|
};
|
|
530
535
|
}
|
|
531
536
|
|
|
537
|
+
// --- Discord verification ---
|
|
538
|
+
if (verificationChannel === "discord") {
|
|
539
|
+
const discordUserId = channel.address;
|
|
540
|
+
|
|
541
|
+
// Only the user snowflake is an identity. A Discord contact's
|
|
542
|
+
// `externalChatId` is set only when the assistant has already seen them in
|
|
543
|
+
// a DM, so it is absent for everyone first met in a guild, and the guild
|
|
544
|
+
// channel is a room rather than a person either way.
|
|
545
|
+
const sessionResult = await createOutboundSession({
|
|
546
|
+
channel: verificationChannel,
|
|
547
|
+
expectedExternalUserId: discordUserId,
|
|
548
|
+
identityBindingStatus: "bound",
|
|
549
|
+
destinationAddress: discordUserId,
|
|
550
|
+
verificationPurpose: "trusted_contact",
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
const discordBody = composeVerificationText(
|
|
554
|
+
GUARDIAN_VERIFY_TEMPLATE_KEYS.DISCORD_TRUSTED_CONTACT_CHALLENGE,
|
|
555
|
+
{
|
|
556
|
+
code: sessionResult.secret,
|
|
557
|
+
expiresInMinutes: Math.floor(SESSION_TTL_SECONDS / 60),
|
|
558
|
+
},
|
|
559
|
+
);
|
|
560
|
+
|
|
561
|
+
const now = Date.now();
|
|
562
|
+
const sendCount = 1;
|
|
563
|
+
await updateSessionDelivery(sessionResult.sessionId, now, sendCount, null);
|
|
564
|
+
deliverVerificationDiscord(discordUserId, discordBody, assistantId);
|
|
565
|
+
|
|
566
|
+
return {
|
|
567
|
+
success: true,
|
|
568
|
+
verificationSessionId: sessionResult.sessionId,
|
|
569
|
+
expiresAt: sessionResult.expiresAt,
|
|
570
|
+
sendCount,
|
|
571
|
+
channel: verificationChannel,
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
|
|
532
575
|
// --- Phone verification ---
|
|
533
576
|
if (verificationChannel === "phone") {
|
|
534
577
|
const normalizedPhone = normalizePhoneNumber(destination);
|
|
@@ -22,7 +22,7 @@ export async function performConversationSearch(
|
|
|
22
22
|
) {
|
|
23
23
|
// Treat "*" as a list-all wildcard — FTS treats it as a literal character.
|
|
24
24
|
if (params.query.trim() === "*") {
|
|
25
|
-
const rows = listConversations(params.limit);
|
|
25
|
+
const rows = listConversations({ limit: params.limit });
|
|
26
26
|
return rows.map((r) => ({
|
|
27
27
|
conversationId: r.id,
|
|
28
28
|
conversationTitle: r.title,
|
|
@@ -3,7 +3,7 @@ import { decideGuardianRequest } from "../../channels/gateway-guardian-requests.
|
|
|
3
3
|
import {
|
|
4
4
|
clearAll,
|
|
5
5
|
getConversation,
|
|
6
|
-
|
|
6
|
+
isSuppressedQueuedMessage,
|
|
7
7
|
} from "../../persistence/conversation-crud.js";
|
|
8
8
|
import { resolveConversationId } from "../../persistence/conversation-key-store.js";
|
|
9
9
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
@@ -13,6 +13,7 @@ import { getSubagentManager } from "../../subagent/index.js";
|
|
|
13
13
|
import { createAbortReason } from "../../util/abort-reasons.js";
|
|
14
14
|
import { UserError } from "../../util/errors.js";
|
|
15
15
|
import { touchConversation } from "../conversation-evictor.js";
|
|
16
|
+
import { forceClearStaleProcessing } from "../conversation-lifecycle.js";
|
|
16
17
|
import {
|
|
17
18
|
buildSlashContext,
|
|
18
19
|
formatCleanResult,
|
|
@@ -242,16 +243,18 @@ export async function resolveMetaSlashCommand(
|
|
|
242
243
|
// ---------------------------------------------------------------------------
|
|
243
244
|
|
|
244
245
|
/**
|
|
245
|
-
* Whether the caller
|
|
246
|
+
* Whether the caller may cancel or steer to this queued message.
|
|
246
247
|
*
|
|
247
248
|
* A queued message records the verified requester that enqueued it
|
|
248
|
-
* (`sourceActorPrincipalId`); the delete
|
|
249
|
-
* identity in the `x-vellum-actor-principal-id` header, which both
|
|
250
|
-
* derive from the auth context rather than from anything the caller
|
|
251
|
-
* both are present they must match: `message_queued` is broadcast
|
|
252
|
-
* subscriber of the assistant, so every requestId in a conversation
|
|
253
|
-
* to every connected client, and without this check one actor
|
|
254
|
-
* cancel another's pending message
|
|
249
|
+
* (`sourceActorPrincipalId`); the delete and steer routes receive the caller's
|
|
250
|
+
* verified identity in the `x-vellum-actor-principal-id` header, which both
|
|
251
|
+
* adapters derive from the auth context rather than from anything the caller
|
|
252
|
+
* sent. When both are present they must match: `message_queued` is broadcast
|
|
253
|
+
* to every subscriber of the assistant, so every requestId in a conversation
|
|
254
|
+
* is visible to every connected client, and without this check one actor
|
|
255
|
+
* principal could cancel another's pending message, or abort the live
|
|
256
|
+
* generation and jump another's message to the head of the queue, just by
|
|
257
|
+
* echoing the id back.
|
|
255
258
|
*
|
|
256
259
|
* Two cases stay open, both deliberately:
|
|
257
260
|
*
|
|
@@ -263,7 +266,7 @@ export async function resolveMetaSlashCommand(
|
|
|
263
266
|
* wake, subagent notifications, surface actions) have no enqueuing actor to
|
|
264
267
|
* compare against, and cancelling one from the queue UI is intended.
|
|
265
268
|
*/
|
|
266
|
-
function
|
|
269
|
+
function mayActOnQueuedMessage(
|
|
267
270
|
queued: QueuedMessage,
|
|
268
271
|
callerActorPrincipalId: string | undefined,
|
|
269
272
|
): boolean {
|
|
@@ -281,7 +284,9 @@ function mayCancelQueuedMessage(
|
|
|
281
284
|
* `message_queued_deleted`. It is the counterpart to the `message_queued` ack
|
|
282
285
|
* and the only signal that closes out a queued row that never runs: without it
|
|
283
286
|
* a client that didn't originate the delete leaves the pending indicator up
|
|
284
|
-
* forever, since no `message_dequeued` is ever coming.
|
|
287
|
+
* forever, since no `message_dequeued` is ever coming. Rows with no
|
|
288
|
+
* client-visible queued counterpart ({@link isSuppressedQueuedMessage} —
|
|
289
|
+
* hidden sends and daemon-injected subagent/ACP/wake notifications) are
|
|
285
290
|
* suppressed for the same reason they get no ack: they have no client row to
|
|
286
291
|
* close.
|
|
287
292
|
*/
|
|
@@ -311,7 +316,7 @@ export function deleteQueuedMessage(
|
|
|
311
316
|
);
|
|
312
317
|
return { removed: false, reason: "message_not_found" };
|
|
313
318
|
}
|
|
314
|
-
if (!
|
|
319
|
+
if (!mayActOnQueuedMessage(queued, options.actorPrincipalId)) {
|
|
315
320
|
log.warn(
|
|
316
321
|
{
|
|
317
322
|
conversationId,
|
|
@@ -323,7 +328,12 @@ export function deleteQueuedMessage(
|
|
|
323
328
|
return { removed: false, reason: "forbidden" };
|
|
324
329
|
}
|
|
325
330
|
conversation.removeQueuedMessage(requestId);
|
|
326
|
-
|
|
331
|
+
// Queue events come in pairs, so an entry that never produced a
|
|
332
|
+
// `message_queued` ack (a suppressed daemon-injected send, or a hidden
|
|
333
|
+
// machine send) must not produce a delete either: clients have no row to
|
|
334
|
+
// retire and an unpaired event would decrement a counter that was never
|
|
335
|
+
// incremented.
|
|
336
|
+
if (!isSuppressedQueuedMessage(queued.metadata)) {
|
|
327
337
|
queued.onEvent({
|
|
328
338
|
type: "message_queued_deleted",
|
|
329
339
|
conversationId,
|
|
@@ -347,11 +357,16 @@ export function deleteQueuedMessage(
|
|
|
347
357
|
export function steerToMessage(
|
|
348
358
|
conversationId: string,
|
|
349
359
|
requestId: string,
|
|
360
|
+
options: { actorPrincipalId?: string } = {},
|
|
350
361
|
):
|
|
351
362
|
| { steered: true }
|
|
352
363
|
| {
|
|
353
364
|
steered: false;
|
|
354
|
-
reason:
|
|
365
|
+
reason:
|
|
366
|
+
| "conversation_not_found"
|
|
367
|
+
| "message_not_found"
|
|
368
|
+
| "not_processing"
|
|
369
|
+
| "forbidden";
|
|
355
370
|
} {
|
|
356
371
|
const conversation = findConversation(conversationId);
|
|
357
372
|
if (!conversation) {
|
|
@@ -370,6 +385,26 @@ export function steerToMessage(
|
|
|
370
385
|
return { steered: false, reason: "not_processing" };
|
|
371
386
|
}
|
|
372
387
|
|
|
388
|
+
const queued = conversation.queue.findByRequestId(requestId);
|
|
389
|
+
if (!queued) {
|
|
390
|
+
log.warn(
|
|
391
|
+
{ conversationId, requestId },
|
|
392
|
+
"Queued message not found for steering",
|
|
393
|
+
);
|
|
394
|
+
return { steered: false, reason: "message_not_found" };
|
|
395
|
+
}
|
|
396
|
+
if (!mayActOnQueuedMessage(queued, options.actorPrincipalId)) {
|
|
397
|
+
log.warn(
|
|
398
|
+
{
|
|
399
|
+
conversationId,
|
|
400
|
+
requestId,
|
|
401
|
+
callerActorPrincipalId: options.actorPrincipalId,
|
|
402
|
+
},
|
|
403
|
+
"Refusing to steer to a queued message enqueued by a different actor principal",
|
|
404
|
+
);
|
|
405
|
+
return { steered: false, reason: "forbidden" };
|
|
406
|
+
}
|
|
407
|
+
|
|
373
408
|
const promoted = conversation.queue.promoteToHead(requestId);
|
|
374
409
|
if (!promoted) {
|
|
375
410
|
log.warn(
|
|
@@ -396,16 +431,26 @@ export function steerToMessage(
|
|
|
396
431
|
"Steering to queued message — aborting current generation",
|
|
397
432
|
);
|
|
398
433
|
|
|
399
|
-
// Abort the in-flight generation. The agent loop's
|
|
434
|
+
// Abort the in-flight generation. The agent loop's release calls
|
|
400
435
|
// drainQueue, which will pick up the promoted message at the head.
|
|
401
436
|
// Unlike abortConversation, we do NOT clear the queue or dispose
|
|
402
|
-
// prompters
|
|
437
|
+
// prompters: we want the queue to drain with the promoted message first.
|
|
403
438
|
const reason = createAbortReason(
|
|
404
439
|
"preempted_by_new_message",
|
|
405
440
|
"steerToMessage",
|
|
406
441
|
conversationId,
|
|
407
442
|
);
|
|
408
|
-
conversation.abortController
|
|
443
|
+
if (conversation.abortController) {
|
|
444
|
+
conversation.abortController.abort(reason);
|
|
445
|
+
} else {
|
|
446
|
+
// Processing is latched with no live turn to abort, so nothing is going to
|
|
447
|
+
// reach a drain on its own and the message promoted above would sit at the
|
|
448
|
+
// head of a queue that never runs. Release the flag and drain here instead.
|
|
449
|
+
// `pendingSteerRepair` stays set: the drain consumes it, repairing any
|
|
450
|
+
// tool_use blocks the dead turn stranded before the promoted head runs.
|
|
451
|
+
forceClearStaleProcessing(conversation, "steerToMessage");
|
|
452
|
+
void conversation.kickDrainQueue("loop_complete", "steer_force_clear");
|
|
453
|
+
}
|
|
409
454
|
// Deny pending confirmations so the abort unblocks immediately.
|
|
410
455
|
conversation.denyAllPendingConfirmations();
|
|
411
456
|
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
} from "@vellumai/service-contracts/redacted-credential";
|
|
5
5
|
import { v4 as uuid } from "uuid";
|
|
6
6
|
|
|
7
|
+
import { AnsweredQuestionSchema } from "../../api/events/question-answered.js";
|
|
7
8
|
import type {
|
|
8
9
|
ConversationContentBlock,
|
|
9
10
|
ConversationMessageAttachment,
|
|
@@ -636,6 +637,17 @@ export function renderHistoryContent(
|
|
|
636
637
|
entry.activityMetadata =
|
|
637
638
|
block._activityMetadata as HistoryToolCall["activityMetadata"];
|
|
638
639
|
}
|
|
640
|
+
// Read back the answered `ask_question` record so the answered card
|
|
641
|
+
// rehydrates from history. Validated (rather than trusted like the
|
|
642
|
+
// sibling riders) because the card renders its contents directly: a
|
|
643
|
+
// malformed rider from a hand-edited or partially-written row must
|
|
644
|
+
// degrade to no card, not to a crashing render.
|
|
645
|
+
const answeredQuestion = AnsweredQuestionSchema.safeParse(
|
|
646
|
+
block._answeredQuestion,
|
|
647
|
+
);
|
|
648
|
+
if (answeredQuestion.success) {
|
|
649
|
+
entry.answeredQuestion = answeredQuestion.data;
|
|
650
|
+
}
|
|
639
651
|
toolCalls.push(entry);
|
|
640
652
|
if (id) {
|
|
641
653
|
pendingToolUses.set(id, entry);
|
|
@@ -646,6 +646,16 @@ function findSkillById(
|
|
|
646
646
|
return { item, summary: r.summary };
|
|
647
647
|
}
|
|
648
648
|
|
|
649
|
+
/**
|
|
650
|
+
* Whether a skill currently resolves locally (bundled, managed, workspace, or
|
|
651
|
+
* extra). Callers that serve data ABOUT a skill use this to keep to the same
|
|
652
|
+
* current-resource boundary as the file routes, so a deleted skill stops
|
|
653
|
+
* answering even when durable artifacts about it survive elsewhere.
|
|
654
|
+
*/
|
|
655
|
+
export function skillExistsLocally(skillId: string): boolean {
|
|
656
|
+
return findSkillById(skillId) !== undefined;
|
|
657
|
+
}
|
|
658
|
+
|
|
649
659
|
export async function getSkill(
|
|
650
660
|
skillId: string,
|
|
651
661
|
): Promise<{ skill: SkillDetailResponse } | { error: string; status: number }> {
|
|
@@ -1340,7 +1350,7 @@ export async function installSkill(spec: {
|
|
|
1340
1350
|
skillId = result.skillId;
|
|
1341
1351
|
|
|
1342
1352
|
const stagedSkillDir = result.skillDir;
|
|
1343
|
-
installSkillDependenciesIfPresent(stagedSkillDir);
|
|
1353
|
+
await installSkillDependenciesIfPresent(stagedSkillDir);
|
|
1344
1354
|
commitStagedSkillInstall(skillId, stagedSkillDir);
|
|
1345
1355
|
} finally {
|
|
1346
1356
|
rmSync(clawhubProjectRoot, { recursive: true, force: true });
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
|
+
import { resolveGuardianPersonaStrict } from "../prompts/persona-resolver.js";
|
|
5
|
+
import { DECLINED_BY_USER_SENTINEL } from "../prompts/user-reference.js";
|
|
4
6
|
import { getWorkspacePromptPath } from "../util/platform.js";
|
|
5
7
|
|
|
6
8
|
/** Read the assistant's name from IDENTITY.md for personalized responses. */
|
|
@@ -19,19 +21,45 @@ export function getAssistantName(): string | null {
|
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
24
|
+
* Extract a display name from persona-file content. Tries the markdown-bold
|
|
25
|
+
* "Name" label (the IDENTITY.md convention), then the onboarding-written
|
|
26
|
+
* "Preferred name" bullet, then the scaffold's "Preferred name/reference"
|
|
27
|
+
* line. Matches only horizontal whitespace after the label so an unfilled
|
|
28
|
+
* scaffold line does not swallow the next line.
|
|
25
29
|
*/
|
|
26
|
-
|
|
30
|
+
function extractPersonaName(content: string): string | null {
|
|
31
|
+
const match =
|
|
32
|
+
content.match(/\*\*Name:\*\*[ \t]*(.+)/) ??
|
|
33
|
+
content.match(/\*\*Preferred name:\*\*[ \t]*(.+)/) ??
|
|
34
|
+
content.match(/Preferred name\/reference:[ \t]*(.+)/);
|
|
35
|
+
return match?.[1]?.trim() || null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function readPersonaName(filePath: string): string | null {
|
|
27
39
|
try {
|
|
28
|
-
|
|
29
|
-
join(workspaceDir, "users", "default.md"),
|
|
30
|
-
"utf-8",
|
|
31
|
-
);
|
|
32
|
-
const match = content.match(/\*\*Name:\*\*\s*(.+)/);
|
|
33
|
-
return match?.[1]?.trim() || null;
|
|
40
|
+
return extractPersonaName(readFileSync(filePath, "utf-8"));
|
|
34
41
|
} catch {
|
|
35
42
|
return null;
|
|
36
43
|
}
|
|
37
44
|
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Read the user's display name from the guardian's persona file
|
|
48
|
+
* (`users/<slug>.md`, resolved via the guardian-delivery binding), falling
|
|
49
|
+
* back to `users/default.md`. Returns `null` on any miss; callers substitute
|
|
50
|
+
* a generic label.
|
|
51
|
+
*
|
|
52
|
+
* The guardian resolution reads the sync in-process guardian-delivery cache;
|
|
53
|
+
* callers in processes that do not otherwise warm it (memory worker) await
|
|
54
|
+
* `getGuardianDelivery` first.
|
|
55
|
+
*/
|
|
56
|
+
export function resolveUserName(workspaceDir: string): string | null {
|
|
57
|
+
const guardianContent = resolveGuardianPersonaStrict();
|
|
58
|
+
if (guardianContent) {
|
|
59
|
+
const name = extractPersonaName(guardianContent);
|
|
60
|
+
if (name && name !== DECLINED_BY_USER_SENTINEL) {
|
|
61
|
+
return name;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return readPersonaName(join(workspaceDir, "users", "default.md"));
|
|
65
|
+
}
|