@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
|
@@ -455,22 +455,6 @@ async function handleUpdateConnection({
|
|
|
455
455
|
`Invalid label: must be a non-blank string or null`,
|
|
456
456
|
);
|
|
457
457
|
}
|
|
458
|
-
// Managed connections: lock auth to `{type:"platform"}`. The boot upsert in
|
|
459
|
-
// `seedCanonicalConnections` would revert any other value on next restart;
|
|
460
|
-
// reject the write here so the surprise loop never happens. Label remains
|
|
461
|
-
// user-editable (the boot upsert leaves it alone). Gated on the row for the
|
|
462
|
-
// same reason as deletion: a user-owned row under the canonical name is not
|
|
463
|
-
// re-upserted by boot seeding, so its own auth stays editable.
|
|
464
|
-
if (
|
|
465
|
-
MANAGED_CONNECTION_NAMES.has(name) &&
|
|
466
|
-
isVellumManagedConnection(existing) &&
|
|
467
|
-
authResult.data.type !== "platform"
|
|
468
|
-
) {
|
|
469
|
-
throw new BadRequestError(
|
|
470
|
-
`Cannot change auth on managed connection "${name}". Auth is locked to platform.`,
|
|
471
|
-
);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
458
|
const customFields = await parseCustomProviderFields(body, existing.provider);
|
|
475
459
|
|
|
476
460
|
// Only a CHANGED label is validated: keeping a stored label — whatever it
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
+
import { CALL_SITE_DEFAULTS } from "../../config/call-site-defaults.js";
|
|
3
4
|
import { getEffectiveProfilesForProvider } from "../../config/default-profile-catalog.js";
|
|
4
5
|
import { resolveDefaultProfileKey } from "../../config/llm-resolver.js";
|
|
5
6
|
import { loadConfig } from "../../config/loader.js";
|
|
@@ -21,7 +22,17 @@ const callSiteEntrySchema = z.object({
|
|
|
21
22
|
displayName: z.string(),
|
|
22
23
|
description: z.string(),
|
|
23
24
|
domain: z.string(),
|
|
25
|
+
/** The effective winning profile key: includes per-call-site pins. */
|
|
24
26
|
defaultProfile: z.string().optional(),
|
|
27
|
+
/**
|
|
28
|
+
* The code-owned `CALL_SITE_DEFAULTS` tier key, independent of pins and
|
|
29
|
+
* tier remaps. Clients group call sites by tier with this; grouping by
|
|
30
|
+
* `defaultProfile` would scatter pinned or remapped sites across their
|
|
31
|
+
* winners. Profileless call sites report `balanced`: the resolver's
|
|
32
|
+
* fallback anchor consults the balanced remap for them, so they follow
|
|
33
|
+
* the Balanced tier like any balanced-keyed site.
|
|
34
|
+
*/
|
|
35
|
+
shippedDefaultProfile: z.string().optional(),
|
|
25
36
|
});
|
|
26
37
|
|
|
27
38
|
const callSiteCatalogResponseSchema = z.object({
|
|
@@ -36,6 +47,8 @@ async function handleGetCallSites() {
|
|
|
36
47
|
callSites: CALL_SITE_CATALOG.map((entry) => ({
|
|
37
48
|
...entry,
|
|
38
49
|
defaultProfile: resolveDefaultProfileKey(entry.id as LLMCallSite, llm),
|
|
50
|
+
shippedDefaultProfile:
|
|
51
|
+
CALL_SITE_DEFAULTS[entry.id]?.profile ?? "balanced",
|
|
39
52
|
})),
|
|
40
53
|
};
|
|
41
54
|
}
|
|
@@ -465,7 +465,7 @@ async function handleExport({
|
|
|
465
465
|
);
|
|
466
466
|
|
|
467
467
|
// --- Create tar.gz archive ---
|
|
468
|
-
const archiveBuffer = createTarGz(staging);
|
|
468
|
+
const archiveBuffer = await createTarGz(staging);
|
|
469
469
|
if (!archiveBuffer) {
|
|
470
470
|
throw new InternalError("Failed to create archive");
|
|
471
471
|
}
|
|
@@ -6,7 +6,6 @@ import { eq } from "drizzle-orm";
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
|
|
8
8
|
import { FeedItemSchema } from "../../api/responses/home.js";
|
|
9
|
-
import { bufferIfDeferred } from "../../notifications/deferred-emit.js";
|
|
10
9
|
import { editNotification } from "../../notifications/edit-notification.js";
|
|
11
10
|
import { emitNotificationSignal } from "../../notifications/emit-signal.js";
|
|
12
11
|
import { listEvents } from "../../notifications/events-store.js";
|
|
@@ -72,7 +71,6 @@ const EmitSignalParams = z.object({
|
|
|
72
71
|
conversationAffinityHint: z.record(z.string(), z.string()).optional(),
|
|
73
72
|
dedupeKey: z.string().optional(),
|
|
74
73
|
throwOnError: z.boolean().optional(),
|
|
75
|
-
originatingConversationId: z.string().optional(),
|
|
76
74
|
});
|
|
77
75
|
|
|
78
76
|
const EmitSignalResponse = z.object({
|
|
@@ -90,18 +88,6 @@ async function handleEmitSignal({ body = {} }: RouteHandlerArgs) {
|
|
|
90
88
|
);
|
|
91
89
|
}
|
|
92
90
|
const validated = parsed.data;
|
|
93
|
-
const buffered = bufferIfDeferred(
|
|
94
|
-
validated.originatingConversationId,
|
|
95
|
-
validated,
|
|
96
|
-
);
|
|
97
|
-
if (buffered) {
|
|
98
|
-
return {
|
|
99
|
-
signalId: buffered.signalId,
|
|
100
|
-
dispatched: buffered.dispatched,
|
|
101
|
-
deduplicated: buffered.deduplicated,
|
|
102
|
-
reason: buffered.reason,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
91
|
const result = await emitNotificationSignal(validated);
|
|
106
92
|
return {
|
|
107
93
|
signalId: result.signalId,
|
|
@@ -525,6 +525,27 @@ const pluginSurfacesSchema = z
|
|
|
525
525
|
.describe(
|
|
526
526
|
"Registered tool names from `tools/<name>.{ts,js}` (filenames derived to tool names, e.g. `create-issue` \u2192 `create_issue`).",
|
|
527
527
|
),
|
|
528
|
+
schedules: z
|
|
529
|
+
.array(
|
|
530
|
+
z.object({
|
|
531
|
+
name: z
|
|
532
|
+
.string()
|
|
533
|
+
.describe("Schedule name: the declaration directory's name."),
|
|
534
|
+
cadence: z
|
|
535
|
+
.string()
|
|
536
|
+
.describe(
|
|
537
|
+
"Raw schedule `expression` string from the declaration's config.",
|
|
538
|
+
),
|
|
539
|
+
mode: z
|
|
540
|
+
.enum(["execute", "script"])
|
|
541
|
+
.describe(
|
|
542
|
+
"`execute` for a markdown prompt entrypoint, `script` for `index.sh`.",
|
|
543
|
+
),
|
|
544
|
+
}),
|
|
545
|
+
)
|
|
546
|
+
.describe(
|
|
547
|
+
"Schedules declared under `schedules/`, each a `<name>/` directory with `config.json` plus one entrypoint. Display surface only; files directly under `schedules/` and unsupported declarations are omitted.",
|
|
548
|
+
),
|
|
528
549
|
})
|
|
529
550
|
.describe(
|
|
530
551
|
"Surfaces the installed copy contributes, read from its on-disk tree.",
|
|
@@ -568,7 +589,7 @@ const pluginInspectResponseSchema = z.object({
|
|
|
568
589
|
surfaces: pluginSurfacesSchema
|
|
569
590
|
.nullable()
|
|
570
591
|
.describe(
|
|
571
|
-
"Surfaces the installed copy contributes (skills, hooks, tools); null when the plugin is not installed.",
|
|
592
|
+
"Surfaces the installed copy contributes (skills, hooks, tools, schedules); null when the plugin is not installed.",
|
|
572
593
|
),
|
|
573
594
|
});
|
|
574
595
|
|
|
@@ -1206,6 +1227,11 @@ async function handleInstallPlugin({ body = {}, headers }: RouteHandlerArgs) {
|
|
|
1206
1227
|
// that introduced it through the plugin's reviewed pin history; an unreviewed
|
|
1207
1228
|
// SHA is refused. Operators who need an unreviewed revision use the local
|
|
1208
1229
|
// CLI's `assistant plugins install --pin <sha> --allow-unreviewed`.
|
|
1230
|
+
//
|
|
1231
|
+
// No `confirmStaged` consent gate: the daemon route is unattended by design
|
|
1232
|
+
// (there is no interactive surface to prompt on). Declared schedules the
|
|
1233
|
+
// install arms are surfaced to the user by the schedule reconciler's
|
|
1234
|
+
// `schedule.declared` notification.
|
|
1209
1235
|
try {
|
|
1210
1236
|
// Validate the name up front — before any catalog/pin/network work — so a
|
|
1211
1237
|
// malformed name (`../escape`) is a deterministic 400 rather than a 404/503
|
|
@@ -1400,6 +1426,34 @@ async function handleDiffPlugin({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
1400
1426
|
// Handler — upgrade
|
|
1401
1427
|
// ---------------------------------------------------------------------------
|
|
1402
1428
|
|
|
1429
|
+
/**
|
|
1430
|
+
* Install names with an upgrade past the staging boundary right now.
|
|
1431
|
+
*
|
|
1432
|
+
* An upgrade stages into `<plugins>/../.plugins-staging/<name>.upgrading.<pid>`
|
|
1433
|
+
* and finishes with an `rm -rf` + rename over the live install. Two concurrent
|
|
1434
|
+
* upgrades of the same plugin in this process derive the same staging path, so
|
|
1435
|
+
* the second would delete the first's tree mid-flight and leave the install
|
|
1436
|
+
* half-swapped. The upgrade is per-plugin mutable state with more than one
|
|
1437
|
+
* caller (CLI, the web Upgrade button, and the monitor's auto-update sweep),
|
|
1438
|
+
* so it is serialized per name: the second caller is refused rather than
|
|
1439
|
+
* queued, since by the time it could run, the revision it wanted is already
|
|
1440
|
+
* what the first caller installed.
|
|
1441
|
+
*
|
|
1442
|
+
* Dry runs never stage — they return before the swap boundary — so they
|
|
1443
|
+
* neither take nor respect the guard.
|
|
1444
|
+
*/
|
|
1445
|
+
const upgradesInFlight = new Set<string>();
|
|
1446
|
+
|
|
1447
|
+
/** An upgrade for this plugin is already running in this process. */
|
|
1448
|
+
class PluginUpgradeInProgressError extends Error {
|
|
1449
|
+
constructor(pluginName: string) {
|
|
1450
|
+
super(
|
|
1451
|
+
`An upgrade for plugin "${pluginName}" is already in progress. Wait for it to finish before starting another.`,
|
|
1452
|
+
);
|
|
1453
|
+
this.name = "PluginUpgradeInProgressError";
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1403
1457
|
async function handleUpgradePlugin({
|
|
1404
1458
|
pathParams = {},
|
|
1405
1459
|
body = {},
|
|
@@ -1427,8 +1481,22 @@ async function handleUpgradePlugin({
|
|
|
1427
1481
|
// brings the on-disk version up, so the reconcile below must run even when
|
|
1428
1482
|
// the swap itself failed (re-initializing the untouched old install).
|
|
1429
1483
|
let deactivated = false;
|
|
1484
|
+
// Name held by this request in `upgradesInFlight`, so `finally` releases
|
|
1485
|
+
// exactly what it claimed (and nothing when the claim was refused).
|
|
1486
|
+
let claimed: string | null = null;
|
|
1430
1487
|
try {
|
|
1431
1488
|
const name = sanitizePluginName(rawName);
|
|
1489
|
+
if (!dryRun) {
|
|
1490
|
+
if (upgradesInFlight.has(name)) {
|
|
1491
|
+
throw new PluginUpgradeInProgressError(name);
|
|
1492
|
+
}
|
|
1493
|
+
upgradesInFlight.add(name);
|
|
1494
|
+
claimed = name;
|
|
1495
|
+
}
|
|
1496
|
+
// No `confirmStaged` consent gate here: the daemon route is unattended by
|
|
1497
|
+
// design (there is no interactive surface to prompt on). A schedule the
|
|
1498
|
+
// upgraded revision adds is surfaced to the user by the schedule
|
|
1499
|
+
// reconciler's `schedule.declared` notification when it arms.
|
|
1432
1500
|
const result = await upgradePlugin(
|
|
1433
1501
|
{ name, dryRun, strategy },
|
|
1434
1502
|
{
|
|
@@ -1476,6 +1544,11 @@ async function handleUpgradePlugin({
|
|
|
1476
1544
|
if (err instanceof InvalidPluginNameError) {
|
|
1477
1545
|
throw new BadRequestError(err.message);
|
|
1478
1546
|
}
|
|
1547
|
+
// A concurrent upgrade of the same plugin owns the staging path — a
|
|
1548
|
+
// well-formed request that is not actionable until the first one lands.
|
|
1549
|
+
if (err instanceof PluginUpgradeInProgressError) {
|
|
1550
|
+
throw new ConflictError(err.message);
|
|
1551
|
+
}
|
|
1479
1552
|
if (err instanceof PluginNotInstalledError) {
|
|
1480
1553
|
throw new NotFoundError(err.message);
|
|
1481
1554
|
}
|
|
@@ -1515,6 +1588,13 @@ async function handleUpgradePlugin({
|
|
|
1515
1588
|
if (deactivated) {
|
|
1516
1589
|
await reconcilePluginSourcesNow();
|
|
1517
1590
|
}
|
|
1591
|
+
// Released after the reconcile, not before: until the new version's
|
|
1592
|
+
// `init` has run the plugin is still mid-swap, and a second upgrade
|
|
1593
|
+
// starting there would stage against a tree this request is still
|
|
1594
|
+
// bringing up.
|
|
1595
|
+
if (claimed !== null) {
|
|
1596
|
+
upgradesInFlight.delete(claimed);
|
|
1597
|
+
}
|
|
1518
1598
|
}
|
|
1519
1599
|
}
|
|
1520
1600
|
|
|
@@ -1543,6 +1623,29 @@ function mapTogglePluginError(err: unknown): RouteError {
|
|
|
1543
1623
|
);
|
|
1544
1624
|
}
|
|
1545
1625
|
|
|
1626
|
+
/**
|
|
1627
|
+
* Converge plugin-declared schedules against the sentinel this route just
|
|
1628
|
+
* wrote, so a toggled plugin's rows disarm or re-arm now rather than at the
|
|
1629
|
+
* reconciler's next backstop sweep.
|
|
1630
|
+
*
|
|
1631
|
+
* Fire-and-forget: the toggle itself already succeeded on disk, so a reconcile
|
|
1632
|
+
* failure must not turn it into a route error. Imported lazily, matching the
|
|
1633
|
+
* plugin source reconcile's own hook, to keep the schedule and notification
|
|
1634
|
+
* modules out of this route module's static graph. The scheduler applies the
|
|
1635
|
+
* sentinel at fire time as well, so a slow or failed pass here delays the row
|
|
1636
|
+
* bookkeeping without letting a disabled plugin run.
|
|
1637
|
+
*/
|
|
1638
|
+
function reconcilePluginSchedulesInBackground(): void {
|
|
1639
|
+
void import("../../schedule/plugin-schedule-reconciler.js")
|
|
1640
|
+
.then(({ reconcilePluginSchedules }) => reconcilePluginSchedules())
|
|
1641
|
+
.catch((err: unknown) => {
|
|
1642
|
+
log.error(
|
|
1643
|
+
{ err },
|
|
1644
|
+
"plugin schedule reconcile after a plugin toggle failed",
|
|
1645
|
+
);
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1546
1649
|
/**
|
|
1547
1650
|
* Toggle a plugin's `.disabled` sentinel through the shared toggle-plugin lib,
|
|
1548
1651
|
* then publish a generic `sync_changed(plugins:list)` so every client refetches
|
|
@@ -1554,6 +1657,7 @@ function handleEnablePlugin({ pathParams = {}, headers }: RouteHandlerArgs) {
|
|
|
1554
1657
|
try {
|
|
1555
1658
|
enablePlugin(pathParams.name ?? "");
|
|
1556
1659
|
publishPluginsChanged(getOriginClientId(headers));
|
|
1660
|
+
reconcilePluginSchedulesInBackground();
|
|
1557
1661
|
return { ok: true };
|
|
1558
1662
|
} catch (err) {
|
|
1559
1663
|
throw mapTogglePluginError(err);
|
|
@@ -1564,6 +1668,7 @@ function handleDisablePlugin({ pathParams = {}, headers }: RouteHandlerArgs) {
|
|
|
1564
1668
|
try {
|
|
1565
1669
|
disablePlugin(pathParams.name ?? "");
|
|
1566
1670
|
publishPluginsChanged(getOriginClientId(headers));
|
|
1671
|
+
reconcilePluginSchedulesInBackground();
|
|
1567
1672
|
return { ok: true };
|
|
1568
1673
|
} catch (err) {
|
|
1569
1674
|
throw mapTogglePluginError(err);
|
|
@@ -127,7 +127,9 @@ function handleGetRun({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
function handleExportRun({
|
|
130
|
+
async function handleExportRun({
|
|
131
|
+
pathParams = {},
|
|
132
|
+
}: RouteHandlerArgs): Promise<Uint8Array> {
|
|
131
133
|
const runId = validateRunId(pathParams.runId);
|
|
132
134
|
|
|
133
135
|
const runDir = getProfilerRunDir(runId);
|
|
@@ -140,7 +142,7 @@ function handleExportRun({ pathParams = {} }: RouteHandlerArgs): Uint8Array {
|
|
|
140
142
|
try {
|
|
141
143
|
copyDirContents(runDir, staging);
|
|
142
144
|
|
|
143
|
-
const archiveBuf = createTarGz(staging);
|
|
145
|
+
const archiveBuf = await createTarGz(staging);
|
|
144
146
|
if (!archiveBuf) {
|
|
145
147
|
log.error(
|
|
146
148
|
{ runId },
|
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
*
|
|
19
19
|
* Cross-talk safety: pending interactions of other kinds (`confirmation`,
|
|
20
20
|
* `secret`, host_*, etc.) return 404 here rather than being mis-resolved.
|
|
21
|
+
*
|
|
22
|
+
* Status ordering: a missing interaction is always 404, never a body-validation
|
|
23
|
+
* 400, whichever shape was submitted. Clients treat 404 as the terminal signal
|
|
24
|
+
* that retires a stale card, so a gone interaction reported as 400 would strand
|
|
25
|
+
* the card and surface a validation string the user cannot act on.
|
|
21
26
|
*/
|
|
22
27
|
import { z } from "zod";
|
|
23
28
|
|
|
@@ -112,8 +117,25 @@ function handleQuestionResponse({ body }: RouteHandlerArgs) {
|
|
|
112
117
|
const response: QuestionResponseBody = parsed.data;
|
|
113
118
|
const { requestId } = response;
|
|
114
119
|
|
|
115
|
-
//
|
|
116
|
-
//
|
|
120
|
+
// Establish the interaction exists BEFORE normalizing the body. A missing or
|
|
121
|
+
// wrong-kind interaction is not-found regardless of which body shape asked,
|
|
122
|
+
// and the legacy shim below reads its stashed metadata: normalizing first
|
|
123
|
+
// would surface a gone interaction as a body-validation 400, telling the
|
|
124
|
+
// client its payload was malformed when the real answer is that there is
|
|
125
|
+
// nothing left to answer. Clients rely on 404 being the terminal signal that
|
|
126
|
+
// retires a stale card, so the status has to be right for every shape.
|
|
127
|
+
// Peek, don't consume; `resolvePendingQuestion` performs the real consume.
|
|
128
|
+
const interaction = pendingInteractions.get(requestId);
|
|
129
|
+
if (!interaction || interaction.kind !== "question") {
|
|
130
|
+
log.warn(
|
|
131
|
+
{ requestId },
|
|
132
|
+
"Question response for unknown or wrong-kind requestId",
|
|
133
|
+
);
|
|
134
|
+
throw new NotFoundError(
|
|
135
|
+
"No pending question interaction found for this requestId",
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
117
139
|
let input;
|
|
118
140
|
try {
|
|
119
141
|
input =
|
|
@@ -121,10 +143,7 @@ function handleQuestionResponse({ body }: RouteHandlerArgs) {
|
|
|
121
143
|
? ({ kind: "close" } as const)
|
|
122
144
|
: ({
|
|
123
145
|
kind: "submit",
|
|
124
|
-
submissions: buildSubmissions(
|
|
125
|
-
response,
|
|
126
|
-
pendingInteractions.get(requestId),
|
|
127
|
-
),
|
|
146
|
+
submissions: buildSubmissions(response, interaction),
|
|
128
147
|
} as const);
|
|
129
148
|
} catch (err) {
|
|
130
149
|
if (err instanceof QuestionBatchValidationError) {
|
|
@@ -135,11 +154,10 @@ function handleQuestionResponse({ body }: RouteHandlerArgs) {
|
|
|
135
154
|
|
|
136
155
|
const outcome = resolvePendingQuestion(requestId, input);
|
|
137
156
|
|
|
157
|
+
// Still reachable: the interaction can be consumed between the peek above and
|
|
158
|
+
// the resolve (a channel answer, a timeout firing).
|
|
138
159
|
if (outcome.status === "not_found") {
|
|
139
|
-
log.warn(
|
|
140
|
-
{ requestId },
|
|
141
|
-
"Question response for unknown or wrong-kind requestId",
|
|
142
|
-
);
|
|
160
|
+
log.warn({ requestId }, "Question interaction resolved before submission");
|
|
143
161
|
throw new NotFoundError(
|
|
144
162
|
"No pending question interaction found for this requestId",
|
|
145
163
|
);
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
*
|
|
13
13
|
* `available` gates on `memory.enabled` alone (matching `isMemoryEnabled` in
|
|
14
14
|
* the enqueue path). Retrospectives do NOT depend on `memory.v2.enabled`.
|
|
15
|
+
* `enabled` narrows `available` by `memory.retrospective.enabled`, the
|
|
16
|
+
* per-pass kill switch, so a memory-on assistant with retrospectives turned
|
|
17
|
+
* off reports `available: true, enabled: false` and the Settings row reads
|
|
18
|
+
* "Paused" rather than implying memory itself is off.
|
|
15
19
|
*/
|
|
16
20
|
|
|
17
21
|
import { z } from "zod";
|
|
@@ -71,7 +75,7 @@ function listRetrospectiveConversations(
|
|
|
71
75
|
function readRetrospectiveConfigResponse() {
|
|
72
76
|
const config = getConfig();
|
|
73
77
|
const available = isMemoryEnabled();
|
|
74
|
-
const enabled = available;
|
|
78
|
+
const enabled = available && config.memory.retrospective.enabled;
|
|
75
79
|
const intervalMs = config.memory.retrospective.timeThresholdMs;
|
|
76
80
|
// Retrospectives have no global schedule — runs are triggered per
|
|
77
81
|
// conversation after activity, so a future run time is never known.
|
|
@@ -109,8 +113,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
109
113
|
"endpoint exists. `intervalMs` is the per-conversation time threshold " +
|
|
110
114
|
"(`memory.retrospective.timeThresholdMs`), `lastRunAt` is the " +
|
|
111
115
|
"`createdAt` of the most recent retrospective conversation across " +
|
|
112
|
-
"both legacy and fork sources,
|
|
113
|
-
"
|
|
116
|
+
"both legacy and fork sources, `available` gates on `memory.enabled` " +
|
|
117
|
+
"(not `memory.v2.enabled`), and `enabled` narrows that by " +
|
|
118
|
+
"`memory.retrospective.enabled`, the per-pass kill switch that stops " +
|
|
119
|
+
"retrospectives without disabling the rest of memory.",
|
|
114
120
|
tags: ["retrospective"],
|
|
115
121
|
responseBody: z.object({
|
|
116
122
|
available: z.boolean(),
|