@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
|
@@ -19,6 +19,7 @@ import { runSequencesOnce } from "../sequence/engine.js";
|
|
|
19
19
|
import type { TurnFailure } from "../telemetry/turn-outcome.js";
|
|
20
20
|
import { recordWatchdogEvent } from "../telemetry/watchdog-events-store.js";
|
|
21
21
|
import { getLogger } from "../util/logger.js";
|
|
22
|
+
import { describeScheduleSource } from "../util/schedule-source-key.js";
|
|
22
23
|
import {
|
|
23
24
|
createWorkerSupervisor,
|
|
24
25
|
type WorkerSupervisor,
|
|
@@ -26,6 +27,8 @@ import {
|
|
|
26
27
|
import { runWatchersOnce } from "../watcher/engine.js";
|
|
27
28
|
import { normalizeCapabilityManifest } from "../workflows/capabilities.js";
|
|
28
29
|
import { getWorkflowRunManager } from "../workflows/run-manager.js";
|
|
30
|
+
import { declarationExistsOnDisk } from "./plugin-schedule-declarations.js";
|
|
31
|
+
import { isPluginSchedulesEnabled } from "./plugin-schedules-gate.js";
|
|
29
32
|
import { hasSetConstructs } from "./recurrence-engine.js";
|
|
30
33
|
import { applyRetryDecision, decideRetry } from "./retry-policy.js";
|
|
31
34
|
import { runScript, type ScriptResult } from "./run-script.js";
|
|
@@ -37,6 +40,7 @@ import {
|
|
|
37
40
|
deferClaimedSchedule,
|
|
38
41
|
failOneShotPermanently,
|
|
39
42
|
getLastScheduleConversationId,
|
|
43
|
+
recordAdministrativeSkipRun,
|
|
40
44
|
resetRetryCount,
|
|
41
45
|
resolveScheduleConversationGroupId,
|
|
42
46
|
retryOneShot,
|
|
@@ -523,6 +527,40 @@ export async function runDueSchedulesOnce(
|
|
|
523
527
|
continue;
|
|
524
528
|
}
|
|
525
529
|
|
|
530
|
+
// Fire-time gate for plugin-sourced rows, covering every way the source
|
|
531
|
+
// can go away under an armed row. `declarationExistsOnDisk` is the probe
|
|
532
|
+
// the run-now route and the enable path use, and it answers for all of
|
|
533
|
+
// them: a `.disabled` sentinel, a plugin directory a local uninstall
|
|
534
|
+
// removed, a manifest that no longer parses, and a declaration that is
|
|
535
|
+
// simply gone. Turning the feature flag off retires the whole surface.
|
|
536
|
+
// The reconciler is what disarms the rows any of these own, and it runs
|
|
537
|
+
// on its own schedule, so re-reading here is what makes the change take
|
|
538
|
+
// effect immediately: a row still armed (or already claimed) at that
|
|
539
|
+
// moment cannot run the plugin's code. The probe costs a stat and a
|
|
540
|
+
// manifest read, paid only when a sourced row fires.
|
|
541
|
+
const sourceKey = job.sourceKey;
|
|
542
|
+
if (
|
|
543
|
+
sourceKey !== null &&
|
|
544
|
+
(!isPluginSchedulesEnabled() ||
|
|
545
|
+
!(await declarationExistsOnDisk(sourceKey)))
|
|
546
|
+
) {
|
|
547
|
+
const sourcePlugin = describeScheduleSource(sourceKey) ?? sourceKey;
|
|
548
|
+
log.info(
|
|
549
|
+
{ jobId: job.id, name: job.name, plugin: sourcePlugin },
|
|
550
|
+
"Schedule not run: its plugin schedule source is unavailable",
|
|
551
|
+
);
|
|
552
|
+
// cron_runs has no skip status, so the skip is recorded as an error run
|
|
553
|
+
// to stay visible in the schedule's history. It is an administrative
|
|
554
|
+
// skip, not an attempt: the retry budget is left alone and no retry is
|
|
555
|
+
// scheduled, so the row stays on its normal cadence.
|
|
556
|
+
await recordAdministrativeSkipRun(
|
|
557
|
+
job.id,
|
|
558
|
+
`Schedule not run: plugin "${sourcePlugin}" is disabled, uninstalled, or no longer declares this schedule.`,
|
|
559
|
+
);
|
|
560
|
+
mark("skipped");
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
563
|
+
|
|
526
564
|
const isOneShot = job.expression == null;
|
|
527
565
|
|
|
528
566
|
// ── Notify mode (one-shot or recurring) ─────────────────────────
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* is in use.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { getIsContainerized } from "../config/env-registry.js";
|
|
8
|
+
import { deleteKey, listKeys, readKey, setKey } from "./encrypted-store.js";
|
|
8
9
|
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
10
11
|
// Types
|
|
@@ -62,14 +63,21 @@ class EncryptedStoreBackend implements CredentialBackend {
|
|
|
62
63
|
readonly name = "encrypted-store";
|
|
63
64
|
|
|
64
65
|
isAvailable(): boolean {
|
|
65
|
-
|
|
66
|
+
// The local encrypted store is the legitimate backend only outside
|
|
67
|
+
// containers. On a pod `keys.enc` does not exist and CES owns credentials,
|
|
68
|
+
// so reporting available here would pin reads to a store that can never
|
|
69
|
+
// hold the key. Returning false lets the resolver recover to CES.
|
|
70
|
+
return !getIsContainerized();
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
async get(account: string): Promise<CredentialGetResult> {
|
|
69
74
|
try {
|
|
70
|
-
return { value:
|
|
75
|
+
return { value: readKey(account), unreachable: false };
|
|
71
76
|
} catch {
|
|
72
|
-
|
|
77
|
+
// A thrown error means the store exists but could not be read or
|
|
78
|
+
// decrypted, so it is unavailable, not absent. A genuinely-missing store
|
|
79
|
+
// or key returns undefined from readKey without throwing.
|
|
80
|
+
return { value: undefined, unreachable: true };
|
|
73
81
|
}
|
|
74
82
|
}
|
|
75
83
|
|
|
@@ -98,6 +106,41 @@ class EncryptedStoreBackend implements CredentialBackend {
|
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// UnavailableBackend
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* A backend whose every operation reports the store as unreachable. Used on
|
|
115
|
+
* containerized pods when no CES path is ready: resolving to the (nonexistent)
|
|
116
|
+
* local encrypted store would report provisioned credentials as absent, but
|
|
117
|
+
* the correct state is "temporarily unreachable" (presence indeterminate),
|
|
118
|
+
* which callers retry rather than treating as a missing key.
|
|
119
|
+
*/
|
|
120
|
+
class UnavailableBackend implements CredentialBackend {
|
|
121
|
+
readonly name = "unavailable";
|
|
122
|
+
|
|
123
|
+
isAvailable(): boolean {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async get(): Promise<CredentialGetResult> {
|
|
128
|
+
return { value: undefined, unreachable: true };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async set(): Promise<boolean> {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async delete(): Promise<DeleteResult> {
|
|
136
|
+
return "error";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async list(): Promise<CredentialListResult> {
|
|
140
|
+
return { accounts: [], unreachable: true };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
101
144
|
// ---------------------------------------------------------------------------
|
|
102
145
|
// Factory functions
|
|
103
146
|
// ---------------------------------------------------------------------------
|
|
@@ -105,3 +148,7 @@ class EncryptedStoreBackend implements CredentialBackend {
|
|
|
105
148
|
export function createEncryptedStoreBackend(): EncryptedStoreBackend {
|
|
106
149
|
return new EncryptedStoreBackend();
|
|
107
150
|
}
|
|
151
|
+
|
|
152
|
+
export function createUnavailableBackend(): UnavailableBackend {
|
|
153
|
+
return new UnavailableBackend();
|
|
154
|
+
}
|
|
@@ -418,58 +418,80 @@ function decrypt(entry: EncryptedEntry, key: Buffer): string {
|
|
|
418
418
|
return decrypted.toString("utf-8");
|
|
419
419
|
}
|
|
420
420
|
|
|
421
|
+
// ---------------------------------------------------------------------------
|
|
422
|
+
// Errors
|
|
423
|
+
// ---------------------------------------------------------------------------
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Thrown by `readKey()` when the store is UNAVAILABLE: the store file exists
|
|
427
|
+
* but cannot be read, the key material is missing, or an entry fails to
|
|
428
|
+
* decrypt. Distinct from a credential being ABSENT (no store file, or the
|
|
429
|
+
* store reads cleanly but lacks the requested key), which returns `undefined`.
|
|
430
|
+
*
|
|
431
|
+
* Mirrors the CES-side `StoreUnavailableError` so managed pods and local mode
|
|
432
|
+
* report the same absent-vs-unavailable distinction: an unavailable store must
|
|
433
|
+
* surface as `unreachable` (presence indeterminate), never as "no key".
|
|
434
|
+
*/
|
|
435
|
+
export class StoreUnavailableError extends Error {
|
|
436
|
+
constructor(message: string) {
|
|
437
|
+
super(message);
|
|
438
|
+
this.name = "StoreUnavailableError";
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
421
442
|
// ---------------------------------------------------------------------------
|
|
422
443
|
// Public API
|
|
423
444
|
// ---------------------------------------------------------------------------
|
|
424
445
|
|
|
425
446
|
/**
|
|
426
|
-
* Retrieve a secret
|
|
427
|
-
*
|
|
447
|
+
* Retrieve a secret, distinguishing a genuinely-absent credential (returns
|
|
448
|
+
* `undefined`) from a store that exists but cannot be read or decrypted
|
|
449
|
+
* (throws {@link StoreUnavailableError}).
|
|
428
450
|
*/
|
|
429
|
-
export function
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
451
|
+
export function readKey(account: string): string | undefined {
|
|
452
|
+
// `readStore()` returns null for a missing store (or a corrupt store it has
|
|
453
|
+
// just reset) and throws on transient I/O errors (EACCES, EMFILE, EIO). A
|
|
454
|
+
// missing store is genuinely absent; a transient read error is unavailable
|
|
455
|
+
// and propagates.
|
|
456
|
+
const store = readStore();
|
|
457
|
+
if (!store) {
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
435
460
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
if (!entry) {
|
|
443
|
-
return undefined;
|
|
444
|
-
}
|
|
445
|
-
const key = getKeyForStore(migrated);
|
|
446
|
-
if (!key) {
|
|
447
|
-
return undefined;
|
|
448
|
-
}
|
|
449
|
-
return decrypt(entry, key);
|
|
450
|
-
}
|
|
451
|
-
// Migration failed -- try reading with legacy key
|
|
452
|
-
const entry = store.entries[account];
|
|
453
|
-
if (!entry) {
|
|
454
|
-
return undefined;
|
|
455
|
-
}
|
|
456
|
-
const key = getKeyForStore(store);
|
|
457
|
-
if (!key) {
|
|
458
|
-
return undefined;
|
|
459
|
-
}
|
|
460
|
-
return decrypt(entry, key);
|
|
461
|
+
let effectiveStore: StoreFile = store;
|
|
462
|
+
if (store.version === 1) {
|
|
463
|
+
const migrated = migrateV1ToV2(store);
|
|
464
|
+
if (migrated) {
|
|
465
|
+
writeStore(migrated);
|
|
466
|
+
effectiveStore = migrated;
|
|
461
467
|
}
|
|
468
|
+
// Migration failed: fall through and read with the legacy PBKDF2 key.
|
|
469
|
+
}
|
|
462
470
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
471
|
+
const entry = effectiveStore.entries[account];
|
|
472
|
+
if (!entry) {
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
467
475
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
476
|
+
const key = getKeyForStore(effectiveStore);
|
|
477
|
+
if (!key) {
|
|
478
|
+
throw new StoreUnavailableError(
|
|
479
|
+
"credential store entry present but key material is unavailable",
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
// A decrypt failure means corrupt data or wrong key material, so the credential
|
|
483
|
+
// exists but its value cannot be produced. Let it propagate as unavailable
|
|
484
|
+
// rather than swallowing it into a false "not found".
|
|
485
|
+
return decrypt(entry, key);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Retrieve a secret from the encrypted store.
|
|
490
|
+
* Returns `undefined` if the key doesn't exist or decryption fails.
|
|
491
|
+
*/
|
|
492
|
+
export function getKey(account: string): string | undefined {
|
|
493
|
+
try {
|
|
494
|
+
return readKey(account);
|
|
473
495
|
} catch (err) {
|
|
474
496
|
log.debug({ err, account }, "Failed to read from encrypted store");
|
|
475
497
|
return undefined;
|
|
@@ -50,7 +50,10 @@ import type {
|
|
|
50
50
|
CredentialListResult,
|
|
51
51
|
DeleteResult,
|
|
52
52
|
} from "./credential-backend.js";
|
|
53
|
-
import {
|
|
53
|
+
import {
|
|
54
|
+
createEncryptedStoreBackend,
|
|
55
|
+
createUnavailableBackend,
|
|
56
|
+
} from "./credential-backend.js";
|
|
54
57
|
import { credentialKey } from "./credential-key.js";
|
|
55
58
|
|
|
56
59
|
export type {
|
|
@@ -148,6 +151,10 @@ export function setCesClient(client: CesClient | undefined): void {
|
|
|
148
151
|
_resolvedBackend = undefined;
|
|
149
152
|
_resolvePromise = undefined;
|
|
150
153
|
_cesHttpUnreachable = false;
|
|
154
|
+
log.info(
|
|
155
|
+
{ hasClient: !!client },
|
|
156
|
+
"CES client updated; resetting resolved credential backend cache",
|
|
157
|
+
);
|
|
151
158
|
_cesClientListener?.(client);
|
|
152
159
|
}
|
|
153
160
|
|
|
@@ -238,6 +245,21 @@ async function resolveBackendAsync(
|
|
|
238
245
|
// backends.
|
|
239
246
|
return _resolvedBackend;
|
|
240
247
|
}
|
|
248
|
+
} else if (
|
|
249
|
+
_resolvedBackend.name === "encrypted-store" &&
|
|
250
|
+
_cesClient?.isReady()
|
|
251
|
+
) {
|
|
252
|
+
// A CES client became ready after we fell back to the encrypted store
|
|
253
|
+
// (e.g. a worker/CLI whose handshake completed post-fallback, or a
|
|
254
|
+
// client injected before its handshake finished). No reconnect callback
|
|
255
|
+
// is needed, since the live client already exists. Drop the fallback and
|
|
256
|
+
// re-resolve so the CES RPC path wins.
|
|
257
|
+
log.info(
|
|
258
|
+
"CES client is ready; upgrading credential backend from encrypted store to CES RPC",
|
|
259
|
+
);
|
|
260
|
+
_resolvedBackend = undefined;
|
|
261
|
+
_resolvePromise = undefined;
|
|
262
|
+
// Fall through to re-resolve.
|
|
241
263
|
} else if (
|
|
242
264
|
_cesReconnect &&
|
|
243
265
|
(_resolvedBackend.name === "encrypted-store" ||
|
|
@@ -264,7 +286,16 @@ async function resolveBackendAsync(
|
|
|
264
286
|
}
|
|
265
287
|
}
|
|
266
288
|
if (!_resolvePromise) {
|
|
267
|
-
_resolvePromise = doResolveBackend()
|
|
289
|
+
_resolvePromise = doResolveBackend().then((backend) => {
|
|
290
|
+
// The containerized guard returns an unreachable backend without caching
|
|
291
|
+
// it (`_resolvedBackend` stays unset). Clear the memoized promise so the
|
|
292
|
+
// next credential op re-attempts CES rather than pinning the unreachable
|
|
293
|
+
// result to a pod whose CES may since have come up.
|
|
294
|
+
if (backend.name === "unavailable") {
|
|
295
|
+
_resolvePromise = undefined;
|
|
296
|
+
}
|
|
297
|
+
return backend;
|
|
298
|
+
});
|
|
268
299
|
}
|
|
269
300
|
return _resolvePromise;
|
|
270
301
|
}
|
|
@@ -456,10 +487,11 @@ async function doResolveBackend(): Promise<CredentialBackend> {
|
|
|
456
487
|
const cesRpc = new CesRpcCredentialBackend(_cesClient);
|
|
457
488
|
if (cesRpc.isAvailable()) {
|
|
458
489
|
_resolvedBackend = cesRpc;
|
|
490
|
+
log.info("Resolved credential backend: ces-rpc");
|
|
459
491
|
return cesRpc;
|
|
460
492
|
}
|
|
461
493
|
log.warn(
|
|
462
|
-
"CES RPC client is set but not ready
|
|
494
|
+
"CES RPC client is set but not ready; trying the next credential backend",
|
|
463
495
|
);
|
|
464
496
|
}
|
|
465
497
|
|
|
@@ -468,11 +500,12 @@ async function doResolveBackend(): Promise<CredentialBackend> {
|
|
|
468
500
|
const ces = createCesCredentialBackend();
|
|
469
501
|
if (ces.isAvailable()) {
|
|
470
502
|
_resolvedBackend = ces;
|
|
503
|
+
log.info("Resolved credential backend: ces-http");
|
|
471
504
|
return ces;
|
|
472
505
|
}
|
|
473
506
|
log.warn(
|
|
474
|
-
"CES_CREDENTIAL_URL is set but CES backend is not available
|
|
475
|
-
"
|
|
507
|
+
"CES_CREDENTIAL_URL is set but CES backend is not available; " +
|
|
508
|
+
"trying the next credential backend",
|
|
476
509
|
);
|
|
477
510
|
}
|
|
478
511
|
|
|
@@ -488,14 +521,29 @@ async function doResolveBackend(): Promise<CredentialBackend> {
|
|
|
488
521
|
const cesRpc = new CesRpcCredentialBackend(lazyClient);
|
|
489
522
|
if (cesRpc.isAvailable()) {
|
|
490
523
|
_resolvedBackend = cesRpc;
|
|
524
|
+
log.info("Resolved credential backend: ces-rpc (lazy connect)");
|
|
491
525
|
return cesRpc;
|
|
492
526
|
}
|
|
493
527
|
}
|
|
494
|
-
// Lazy connect failed
|
|
528
|
+
// Lazy connect failed; fall through.
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// 3. On a containerized pod the local encrypted store does not exist and CES
|
|
532
|
+
// owns credentials. Never resolve to the encrypted store here; it would
|
|
533
|
+
// report a provisioned credential as absent. Return an unreachable backend
|
|
534
|
+
// (presence indeterminate, which callers retry) WITHOUT caching it, so the
|
|
535
|
+
// next credential op re-attempts CES rather than pinning the dead answer.
|
|
536
|
+
if (getIsContainerized()) {
|
|
537
|
+
log.error(
|
|
538
|
+
"No CES credential backend is ready on a containerized pod; reporting credentials as unreachable (indeterminate). The local encrypted store is not used in managed mode.",
|
|
539
|
+
);
|
|
540
|
+
return createUnavailableBackend();
|
|
495
541
|
}
|
|
496
542
|
|
|
497
|
-
//
|
|
543
|
+
// 4. Encrypted file store: the legitimate backend for local / self-hosted
|
|
544
|
+
// mode when CES is unavailable.
|
|
498
545
|
_resolvedBackend = getEncryptedStoreBackend();
|
|
546
|
+
log.info("Resolved credential backend: encrypted-store (local mode)");
|
|
499
547
|
return _resolvedBackend;
|
|
500
548
|
}
|
|
501
549
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
2
|
import {
|
|
3
3
|
cpSync,
|
|
4
4
|
existsSync,
|
|
@@ -395,15 +395,28 @@ function assertStagedSkillRoot(skillId: string, stagedDir: string): void {
|
|
|
395
395
|
}
|
|
396
396
|
}
|
|
397
397
|
|
|
398
|
-
export function installSkillDependenciesIfPresent(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
398
|
+
export async function installSkillDependenciesIfPresent(
|
|
399
|
+
skillDir: string,
|
|
400
|
+
): Promise<void> {
|
|
401
|
+
if (!existsSync(join(skillDir, "package.json"))) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
const bunPath = `${homedir()}/.bun/bin`;
|
|
405
|
+
await new Promise<void>((resolve, reject) => {
|
|
406
|
+
const child = spawn("bun", ["install"], {
|
|
402
407
|
cwd: skillDir,
|
|
403
408
|
stdio: "inherit",
|
|
404
409
|
env: { ...process.env, PATH: `${bunPath}:${process.env.PATH}` },
|
|
405
410
|
});
|
|
406
|
-
|
|
411
|
+
child.on("error", reject);
|
|
412
|
+
child.on("close", (code) => {
|
|
413
|
+
if (code === 0) {
|
|
414
|
+
resolve();
|
|
415
|
+
} else {
|
|
416
|
+
reject(new Error(`bun install exited with code ${code}`));
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
});
|
|
407
420
|
}
|
|
408
421
|
|
|
409
422
|
function restoreOrRemoveFailedSkillInstall(
|
|
@@ -518,7 +531,7 @@ export async function installSkillLocally(
|
|
|
518
531
|
contentHash: computeSkillHash(stagedDir) ?? undefined,
|
|
519
532
|
});
|
|
520
533
|
|
|
521
|
-
installSkillDependenciesIfPresent(stagedDir);
|
|
534
|
+
await installSkillDependenciesIfPresent(stagedDir);
|
|
522
535
|
commitStagedSkillInstall(skillId, stagedDir);
|
|
523
536
|
|
|
524
537
|
log.info(
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
import { spawn } from "node:child_process";
|
|
25
25
|
|
|
26
26
|
import { buildSanitizedEnv } from "../tools/terminal/safe-env.js";
|
|
27
|
+
import { stripAnsiSequences } from "../util/ansi.js";
|
|
27
28
|
import { getLogger } from "../util/logger.js";
|
|
28
29
|
|
|
29
30
|
const log = getLogger("inline-command-runner");
|
|
@@ -45,12 +46,6 @@ const MAX_OUTPUT_CHARS = 20_000;
|
|
|
45
46
|
*/
|
|
46
47
|
const MAX_STDOUT_BUFFER_BYTES = MAX_OUTPUT_CHARS * 4;
|
|
47
48
|
|
|
48
|
-
/**
|
|
49
|
-
* ANSI escape sequence pattern (covers SGR, cursor movement, erase, etc.).
|
|
50
|
-
* Matches: ESC[ ... final_byte and ESC] ... ST (OSC sequences).
|
|
51
|
-
*/
|
|
52
|
-
const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]|\x1b\][^\x07]*(?:\x07|\x1b\\)/g;
|
|
53
|
-
|
|
54
49
|
/**
|
|
55
50
|
* Heuristic for binary output: if more than 10% of the characters are
|
|
56
51
|
* non-printable (control chars excluding \t, \n, \r) then reject.
|
|
@@ -198,7 +193,7 @@ export async function runInlineCommand(
|
|
|
198
193
|
// Strip ANSI sequences first — these are terminal artifacts, not
|
|
199
194
|
// binary data. Stripping before the binary check prevents legitimate
|
|
200
195
|
// color-coded tool output from being rejected.
|
|
201
|
-
let cleaned = raw
|
|
196
|
+
let cleaned = stripAnsiSequences(raw);
|
|
202
197
|
|
|
203
198
|
// Reject binary-ish output (after ANSI stripping)
|
|
204
199
|
if (isBinaryish(cleaned)) {
|