@vellumai/assistant 0.8.4 → 0.8.6
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/AGENTS.md +33 -1
- package/ARCHITECTURE.md +3 -3
- package/bunfig.toml +6 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +4 -3
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +2748 -216
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
- 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__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +9 -13
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
- package/src/__tests__/audit-log-rotation.test.ts +72 -18
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +5 -5
- package/src/__tests__/call-controller.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +3 -2
- package/src/__tests__/channel-guardian.test.ts +6 -5
- package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +320 -3
- package/src/__tests__/checker.test.ts +18 -27
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/compaction-trail-store.test.ts +264 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
- package/src/__tests__/computer-use-tools.test.ts +14 -18
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-token-estimator.test.ts +22 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
- package/src/__tests__/conversation-agent-loop.test.ts +581 -54
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
- package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +61 -0
- package/src/__tests__/conversation-fork-crud.test.ts +239 -15
- package/src/__tests__/conversation-fork-route.test.ts +3 -2
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-lifecycle.test.ts +53 -11
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
- package/src/__tests__/conversation-pairing.test.ts +53 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +333 -291
- package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
- package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
- package/src/__tests__/conversation-skill-tools.test.ts +40 -147
- package/src/__tests__/conversation-slash-queue.test.ts +84 -32
- package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
- package/src/__tests__/conversation-sync-tags.test.ts +218 -35
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
- package/src/__tests__/conversation-usage.test.ts +1 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +6 -5
- package/src/__tests__/credential-vault-unit.test.ts +21 -21
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +56 -2
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +58 -41
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +0 -33
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +26 -40
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +1 -0
- package/src/__tests__/first-greeting.test.ts +62 -12
- package/src/__tests__/gateway-flag-listener.test.ts +236 -0
- package/src/__tests__/gemini-provider.test.ts +104 -0
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +10 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
- package/src/__tests__/heartbeat-service.test.ts +5 -0
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +29 -7
- package/src/__tests__/identity-intro-cache.test.ts +133 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-disk-pressure.test.ts +3 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +408 -9
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +16 -2
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/messaging-send-tool.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +4 -6
- package/src/__tests__/native-web-search.test.ts +30 -2
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth-commands-routes.test.ts +37 -0
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +4 -3
- package/src/__tests__/openai-provider.test.ts +54 -9
- package/src/__tests__/openai-responses-provider.test.ts +176 -14
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/persistence-pipeline.test.ts +139 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +11 -13
- package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +21 -16
- package/src/__tests__/process-message-display-content.test.ts +19 -22
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +84 -84
- package/src/__tests__/relay-server.test.ts +10 -10
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/schedule-store.test.ts +16 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +81 -42
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
- package/src/__tests__/skill-feature-flags.test.ts +16 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
- package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
- package/src/__tests__/skill-tool-factory.test.ts +97 -96
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +6 -5
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +2 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +183 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
- package/src/__tests__/tool-executor.test.ts +64 -72
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
- package/src/__tests__/voice-session-bridge.test.ts +37 -28
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +6 -7
- package/src/agent/loop.ts +88 -0
- package/src/api/README.md +127 -0
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +51 -0
- package/src/api/events/assistant-text-delta.ts +32 -0
- package/src/api/events/assistant-turn-start.ts +33 -0
- package/src/api/events/document-comment-created.ts +48 -0
- package/src/api/events/document-comment-deleted.ts +24 -0
- package/src/api/events/document-comment-reopened.ts +25 -0
- package/src/api/events/document-comment-resolved.ts +27 -0
- package/src/api/events/generation-cancelled.ts +24 -0
- package/src/api/events/generation-handoff.ts +41 -0
- package/src/api/events/message-complete.ts +42 -0
- package/src/api/events/open-url.ts +30 -0
- package/src/api/events/relationship-state-updated.ts +25 -0
- package/src/api/events/tool-use-start.ts +32 -0
- package/src/api/index.ts +129 -0
- package/src/api/package.json +10 -0
- package/src/api/responses/llm-context-response.ts +39 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/background-wake/background-wake-routes.test.ts +868 -0
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/voice-session-bridge.ts +4 -4
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +491 -0
- package/src/cli/commands/memory-v3.ts +567 -0
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +4 -0
- package/src/config/assistant-feature-flags.ts +39 -46
- package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +8 -7
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +33 -17
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +102 -2
- package/src/config/schemas/memory-v2.ts +272 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +52 -0
- package/src/context/token-estimator.ts +10 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
- package/src/daemon/conversation-agent-loop.ts +244 -90
- package/src/daemon/conversation-error.ts +64 -6
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-messaging.ts +84 -43
- package/src/daemon/conversation-process.ts +74 -37
- package/src/daemon/conversation-runtime-assembly.ts +38 -17
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-surfaces.ts +69 -34
- package/src/daemon/conversation-tool-setup.ts +77 -32
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +40 -75
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +9 -2
- package/src/daemon/disk-pressure-guard.ts +39 -29
- package/src/daemon/first-greeting.ts +31 -13
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/handlers/shared.ts +6 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +29 -26
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +11 -24
- package/src/daemon/message-types/conversations.ts +22 -27
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/home.ts +2 -14
- package/src/daemon/message-types/integrations.ts +2 -7
- package/src/daemon/message-types/messages.ts +25 -48
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/process-message.ts +9 -9
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +62 -0
- package/src/daemon/tool-setup-types.ts +7 -0
- package/src/daemon/wake-target-adapter.ts +10 -0
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
- package/src/heartbeat/heartbeat-service.ts +63 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feed-writer.ts +146 -7
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +27 -154
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
- package/src/ipc/skill-routes/memory.ts +4 -3
- package/src/ipc/skill-routes/registries.ts +35 -40
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +423 -182
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +66 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
- package/src/memory/llm-request-log-source-local.ts +31 -0
- package/src/memory/llm-request-log-source.ts +40 -2
- package/src/memory/llm-request-log-store.ts +228 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +110 -7
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +10 -2
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +128 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +240 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +112 -0
- package/src/memory/v2/harness/trace.ts +64 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +706 -0
- package/src/memory/v3/__tests__/filter.test.ts +560 -0
- package/src/memory/v3/__tests__/gate.test.ts +637 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
- package/src/memory/v3/__tests__/loop.test.ts +775 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +489 -0
- package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +508 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
- package/src/memory/v3/__tests__/validate.test.ts +277 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/coretrieval-seed.ts +240 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +286 -0
- package/src/memory/v3/filter.ts +286 -0
- package/src/memory/v3/gate.ts +349 -0
- package/src/memory/v3/index-composition.ts +126 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +430 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +431 -0
- package/src/memory/v3/shadow-diff.ts +287 -0
- package/src/memory/v3/shadow-middleware.ts +347 -0
- package/src/memory/v3/traversal.ts +211 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +356 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +323 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +23 -3
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +40 -50
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +20 -19
- package/src/plugins/defaults/persistence.ts +25 -6
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +68 -29
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/proactive-artifact/job.test.ts +1 -0
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +84 -221
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP.md +9 -13
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +42 -6
- package/src/providers/connection-model-compat.ts +61 -0
- package/src/providers/connection-resolution.ts +47 -14
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +70 -6
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +78 -1
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
- package/src/providers/openai/chat-completions-provider.ts +116 -15
- package/src/providers/openai/codex-models.ts +20 -0
- package/src/providers/openai/responses-provider.ts +87 -30
- package/src/providers/openrouter/client.ts +13 -8
- package/src/providers/provider-send-message.ts +20 -5
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +50 -7
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +9 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +1 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +46 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-readiness-service.ts +68 -0
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +47 -14
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +12 -4
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/app-management-routes.ts +111 -4
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +356 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +4 -10
- package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
- package/src/runtime/routes/conversation-list-routes.ts +159 -4
- package/src/runtime/routes/conversation-management-routes.ts +108 -26
- package/src/runtime/routes/conversation-query-routes.ts +200 -44
- package/src/runtime/routes/conversation-routes.ts +409 -521
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/conversations-import-routes.ts +19 -6
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/documents-routes.ts +10 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +35 -8
- package/src/runtime/routes/home-feed-routes.ts +129 -0
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-intro-cache.ts +61 -16
- package/src/runtime/routes/identity-routes.ts +30 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
- package/src/runtime/routes/index.ts +10 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
- package/src/runtime/routes/integrations/vercel.ts +15 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +474 -0
- package/src/runtime/routes/migration-routes.ts +32 -28
- package/src/runtime/routes/notification-routes.ts +63 -1
- package/src/runtime/routes/oauth-commands-routes.ts +6 -1
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/surface-action-routes.ts +1 -38
- package/src/runtime/routes/surface-content-routes.ts +12 -5
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/schedule-store.ts +8 -1
- package/src/schedule/scheduler.ts +111 -15
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +5 -8
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +13 -13
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +36 -28
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +282 -336
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +189 -7
- package/src/tools/execution-target.ts +18 -23
- package/src/tools/executor.ts +24 -56
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -10
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +224 -76
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +150 -123
- package/src/tools/schedule/create.ts +1 -1
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +18 -44
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +32 -101
- package/src/tools/ui-surface/definitions.ts +104 -108
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/browser.ts +7 -2
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -49,12 +49,8 @@ import semver from "semver";
|
|
|
49
49
|
import { z } from "zod";
|
|
50
50
|
|
|
51
51
|
import assistantPkg from "../../package.json" with { type: "json" };
|
|
52
|
-
import
|
|
53
|
-
|
|
54
|
-
PluginTool,
|
|
55
|
-
RiskLevel,
|
|
56
|
-
ToolExecutionResult,
|
|
57
|
-
} from "../tools/types.js";
|
|
52
|
+
import { finalizeTool } from "../tools/tool-defaults.js";
|
|
53
|
+
import type { LoadedTool, ToolDefinition } from "../tools/types.js";
|
|
58
54
|
import { getLogger } from "../util/logger.js";
|
|
59
55
|
import { registerPlugin } from "./registry.js";
|
|
60
56
|
import type {
|
|
@@ -62,7 +58,6 @@ import type {
|
|
|
62
58
|
PluginHookFn,
|
|
63
59
|
PluginHooks,
|
|
64
60
|
PluginManifest,
|
|
65
|
-
PluginToolRegistration,
|
|
66
61
|
} from "./types.js";
|
|
67
62
|
|
|
68
63
|
const PLUGIN_API_PEER_DEP = "@vellumai/plugin-api";
|
|
@@ -122,64 +117,6 @@ function deriveToolName(toolFileBaseName: string): string {
|
|
|
122
117
|
return toToolNameSegment(toolFileBaseName);
|
|
123
118
|
}
|
|
124
119
|
|
|
125
|
-
/**
|
|
126
|
-
* Defaults applied by {@link applyPluginToolDefaults} when a plugin tool
|
|
127
|
-
* omits one of the normally-required fields. Exported as a constant so
|
|
128
|
-
* tests and callers can reference the same source of truth.
|
|
129
|
-
*
|
|
130
|
-
* The default `execute` returns an error result so the model sees a clear
|
|
131
|
-
* "this tool isn't wired up" signal at call time. The plugin still loads
|
|
132
|
-
* cleanly — broken individual tools must never block daemon boot.
|
|
133
|
-
*/
|
|
134
|
-
export const PLUGIN_TOOL_DEFAULTS = Object.freeze({
|
|
135
|
-
description: "",
|
|
136
|
-
defaultRiskLevel: "medium" as RiskLevel,
|
|
137
|
-
input_schema: Object.freeze({
|
|
138
|
-
type: "object",
|
|
139
|
-
properties: {},
|
|
140
|
-
additionalProperties: false,
|
|
141
|
-
}) as object,
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Fill the four normally-required {@link PluginTool} fields with documented
|
|
146
|
-
* defaults when the author omitted them. Returns a {@link LoadedPluginTool}
|
|
147
|
-
* that is safe to register.
|
|
148
|
-
*/
|
|
149
|
-
function applyPluginToolDefaults(
|
|
150
|
-
tool: PluginTool,
|
|
151
|
-
name: string,
|
|
152
|
-
): LoadedPluginTool {
|
|
153
|
-
const description =
|
|
154
|
-
typeof tool.description === "string"
|
|
155
|
-
? tool.description
|
|
156
|
-
: PLUGIN_TOOL_DEFAULTS.description;
|
|
157
|
-
const defaultRiskLevel =
|
|
158
|
-
typeof tool.defaultRiskLevel === "string"
|
|
159
|
-
? tool.defaultRiskLevel
|
|
160
|
-
: PLUGIN_TOOL_DEFAULTS.defaultRiskLevel;
|
|
161
|
-
const input_schema =
|
|
162
|
-
tool.input_schema !== null &&
|
|
163
|
-
typeof tool.input_schema === "object"
|
|
164
|
-
? tool.input_schema
|
|
165
|
-
: PLUGIN_TOOL_DEFAULTS.input_schema;
|
|
166
|
-
const execute =
|
|
167
|
-
typeof tool.execute === "function"
|
|
168
|
-
? tool.execute
|
|
169
|
-
: async (): Promise<ToolExecutionResult> => ({
|
|
170
|
-
content: `plugin tool ${name} has no execute implementation`,
|
|
171
|
-
isError: true,
|
|
172
|
-
});
|
|
173
|
-
return {
|
|
174
|
-
...tool,
|
|
175
|
-
name,
|
|
176
|
-
description,
|
|
177
|
-
defaultRiskLevel,
|
|
178
|
-
input_schema,
|
|
179
|
-
execute,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
120
|
/**
|
|
184
121
|
* Dynamic-import `absolutePath` and return its default export. Throws when
|
|
185
122
|
* the module has no default export — callers attribute the error.
|
|
@@ -339,17 +276,17 @@ async function buildPluginFromDir(pluginDir: string): Promise<Plugin> {
|
|
|
339
276
|
const hooks = await loadHooks(pluginDir, name);
|
|
340
277
|
if (hooks !== undefined) plugin.hooks = hooks;
|
|
341
278
|
|
|
342
|
-
const tools:
|
|
279
|
+
const tools: LoadedTool[] = [];
|
|
343
280
|
for (const { name: toolName, path: toolPath } of listSurfaceDir(
|
|
344
281
|
join(pluginDir, "tools"),
|
|
345
282
|
)) {
|
|
346
|
-
const tool = await importDefault<
|
|
283
|
+
const tool = await importDefault<ToolDefinition>(toolPath);
|
|
347
284
|
if (tool === null || typeof tool !== "object") {
|
|
348
285
|
throw new Error(
|
|
349
286
|
`external plugin ${name}: ${toolPath} default export must be an object`,
|
|
350
287
|
);
|
|
351
288
|
}
|
|
352
|
-
tools.push(
|
|
289
|
+
tools.push(finalizeTool(tool, deriveToolName(toolName)));
|
|
353
290
|
}
|
|
354
291
|
if (tools.length > 0) plugin.tools = tools;
|
|
355
292
|
|
package/src/plugins/types.ts
CHANGED
|
@@ -32,6 +32,7 @@ import type { RepairResult } from "../daemon/history-repair.js";
|
|
|
32
32
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
33
33
|
import type { PkbContextConversation } from "../daemon/pkb-context-tracker.js";
|
|
34
34
|
import type { TrustContext } from "../daemon/trust-context.js";
|
|
35
|
+
import type { MessageRole } from "../memory/conversation-crud.js";
|
|
35
36
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
36
37
|
import type {
|
|
37
38
|
ContentBlock,
|
|
@@ -43,7 +44,7 @@ import type {
|
|
|
43
44
|
} from "../providers/types.js";
|
|
44
45
|
import type { SkillRoute } from "../runtime/skill-route-registry.js";
|
|
45
46
|
import type {
|
|
46
|
-
|
|
47
|
+
LoadedTool,
|
|
47
48
|
ToolContext,
|
|
48
49
|
ToolExecutionResult,
|
|
49
50
|
} from "../tools/types.js";
|
|
@@ -439,18 +440,25 @@ export interface OverflowReduceResult {
|
|
|
439
440
|
* Pipeline arguments for `persistence` — a discriminated union over the
|
|
440
441
|
* message-CRUD operations plugins may observe, redirect, or short-circuit:
|
|
441
442
|
*
|
|
442
|
-
* - `add`
|
|
443
|
-
*
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
449
|
-
* - `
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
443
|
+
* - `add` — append a new message (`addMessage`). Mirrors
|
|
444
|
+
* `addMessage(conversationId, role, content, metadata?, opts?)`.
|
|
445
|
+
* When `syncToDisk` is set, the default plugin also runs
|
|
446
|
+
* {@link syncMessageToDisk} against the just-persisted row
|
|
447
|
+
* so the JSONL disk view stays consistent. The
|
|
448
|
+
* `createdAtMs` field carries the conversation's creation
|
|
449
|
+
* timestamp — needed to resolve the disk-view directory.
|
|
450
|
+
* - `reserve` — pre-allocate an empty assistant anchor row
|
|
451
|
+
* (`reserveMessage`) so the agent loop can stamp streaming
|
|
452
|
+
* events with stable identity before any content is
|
|
453
|
+
* produced. Returns the same row shape as `add`.
|
|
454
|
+
* - `updateContent` — overwrite the content of an existing message
|
|
455
|
+
* (`updateMessageContent`). Used to finalize a previously
|
|
456
|
+
* reserved row, and by consolidation paths.
|
|
457
|
+
* - `update` — shallow-merge metadata into an existing message
|
|
458
|
+
* (`updateMessageMetadata`). Returns `void`.
|
|
459
|
+
* - `delete` — remove a single message (`deleteMessageById`). Returns
|
|
460
|
+
* the {@link DeletedMemoryIds}-shaped segment/summary IDs
|
|
461
|
+
* the caller must clean up out-of-band.
|
|
454
462
|
*
|
|
455
463
|
* The discriminated `op` field lets plugin middleware narrow the union and
|
|
456
464
|
* tailor behavior per-operation (e.g. "only observe deletes", "redirect
|
|
@@ -459,7 +467,7 @@ export interface OverflowReduceResult {
|
|
|
459
467
|
export type PersistAddArgs = {
|
|
460
468
|
readonly op: "add";
|
|
461
469
|
readonly conversationId: string;
|
|
462
|
-
readonly role:
|
|
470
|
+
readonly role: MessageRole;
|
|
463
471
|
readonly content: string;
|
|
464
472
|
readonly metadata?: Record<string, unknown>;
|
|
465
473
|
readonly addOptions?: { readonly skipIndexing?: boolean };
|
|
@@ -473,6 +481,19 @@ export type PersistAddArgs = {
|
|
|
473
481
|
readonly createdAtMs?: number;
|
|
474
482
|
};
|
|
475
483
|
|
|
484
|
+
export type PersistReserveArgs = {
|
|
485
|
+
readonly op: "reserve";
|
|
486
|
+
readonly conversationId: string;
|
|
487
|
+
readonly role: MessageRole;
|
|
488
|
+
readonly metadata?: Record<string, unknown>;
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
export type PersistUpdateContentArgs = {
|
|
492
|
+
readonly op: "updateContent";
|
|
493
|
+
readonly messageId: string;
|
|
494
|
+
readonly content: string;
|
|
495
|
+
};
|
|
496
|
+
|
|
476
497
|
export type PersistUpdateArgs = {
|
|
477
498
|
readonly op: "update";
|
|
478
499
|
readonly messageId: string;
|
|
@@ -486,6 +507,8 @@ export type PersistDeleteArgs = {
|
|
|
486
507
|
|
|
487
508
|
export type PersistArgs =
|
|
488
509
|
| PersistAddArgs
|
|
510
|
+
| PersistReserveArgs
|
|
511
|
+
| PersistUpdateContentArgs
|
|
489
512
|
| PersistUpdateArgs
|
|
490
513
|
| PersistDeleteArgs;
|
|
491
514
|
|
|
@@ -506,6 +529,25 @@ export type PersistAddResult = {
|
|
|
506
529
|
};
|
|
507
530
|
};
|
|
508
531
|
|
|
532
|
+
/**
|
|
533
|
+
* Result row returned by a `reserve` op — same row shape as `add` but with
|
|
534
|
+
* empty `content` (`"[]"`) and tagged distinctly so middleware can branch
|
|
535
|
+
* on intent.
|
|
536
|
+
*/
|
|
537
|
+
export type PersistReserveResult = {
|
|
538
|
+
readonly op: "reserve";
|
|
539
|
+
readonly message: {
|
|
540
|
+
readonly id: string;
|
|
541
|
+
readonly conversationId: string;
|
|
542
|
+
readonly role: string;
|
|
543
|
+
readonly content: string;
|
|
544
|
+
readonly createdAt: number;
|
|
545
|
+
readonly metadata?: string;
|
|
546
|
+
};
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
export type PersistUpdateContentResult = { readonly op: "updateContent" };
|
|
550
|
+
|
|
509
551
|
export type PersistUpdateResult = { readonly op: "update" };
|
|
510
552
|
|
|
511
553
|
/** IDs of segments/summaries the caller must remove from Qdrant. */
|
|
@@ -517,6 +559,8 @@ export type PersistDeleteResult = {
|
|
|
517
559
|
|
|
518
560
|
export type PersistResult =
|
|
519
561
|
| PersistAddResult
|
|
562
|
+
| PersistReserveResult
|
|
563
|
+
| PersistUpdateContentResult
|
|
520
564
|
| PersistUpdateResult
|
|
521
565
|
| PersistDeleteResult;
|
|
522
566
|
|
|
@@ -1007,19 +1051,6 @@ export interface Injector {
|
|
|
1007
1051
|
// `PluginSkillRegistration` shape below so plugins can declare
|
|
1008
1052
|
// catalog-discoverable skills today.
|
|
1009
1053
|
|
|
1010
|
-
/**
|
|
1011
|
-
* Tool registration contributed by a plugin. Uses the narrow
|
|
1012
|
-
* {@link LoadedPluginTool} shape. External plugin authors declare the
|
|
1013
|
-
* nameless `PluginTool` file shape; the loader derives `name` from the
|
|
1014
|
-
* `tools/<name>.ts` basename before storing it on `plugin.tools`. Authors
|
|
1015
|
-
* also leave category / ownership metadata to the bootstrap, which stamps
|
|
1016
|
-
* `category: "plugin"`, `origin: "plugin"`, and
|
|
1017
|
-
* `ownerPluginId: <plugin.name>` before handing the batch to
|
|
1018
|
-
* `registerPluginTools`. The registration boundary synthesizes
|
|
1019
|
-
* `getDefinition()` from `{name, description, input_schema}` so the canonical
|
|
1020
|
-
* {@link Tool} interface used by the internal registry stays unchanged.
|
|
1021
|
-
*/
|
|
1022
|
-
export type PluginToolRegistration = LoadedPluginTool;
|
|
1023
1054
|
/**
|
|
1024
1055
|
* HTTP route registration contributed by a plugin. Plugins express routes as
|
|
1025
1056
|
* {@link SkillRoute} values — the same shape the skill-route registry
|
|
@@ -1120,8 +1151,16 @@ export interface Plugin {
|
|
|
1120
1151
|
manifest: PluginManifest;
|
|
1121
1152
|
/** Lifecycle hooks (init, shutdown). See {@link PluginHooks}. */
|
|
1122
1153
|
hooks?: PluginHooks;
|
|
1123
|
-
/**
|
|
1124
|
-
|
|
1154
|
+
/**
|
|
1155
|
+
* Tool registrations visible to the model. External plugin authors
|
|
1156
|
+
* declare the nameless `ToolDefinition` file shape (from
|
|
1157
|
+
* `@vellumai/plugin-api`); the loader derives `name` from the
|
|
1158
|
+
* `tools/<name>.ts` basename and runs the definition through
|
|
1159
|
+
* `finalizeTool` to fill omitted required fields, producing the
|
|
1160
|
+
* `LoadedTool` values stored here. Category / ownership metadata is
|
|
1161
|
+
* stamped by `registerPluginTools` at registration time.
|
|
1162
|
+
*/
|
|
1163
|
+
tools?: LoadedTool[];
|
|
1125
1164
|
/** HTTP route registrations served by the assistant. */
|
|
1126
1165
|
routes?: PluginRouteRegistration[];
|
|
1127
1166
|
/** Skill registrations loaded at startup. */
|
|
@@ -71,10 +71,23 @@ export async function injectAuxAssistantMessage(params: {
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
// The injected aux message bumps `lastMessageAt`, which can move the
|
|
75
|
+
// row in the paginated sidebar window — that's a shape change. macOS
|
|
76
|
+
// refreshes its full list on `conversation_list_invalidated`; web
|
|
77
|
+
// refreshes via the paired `sync_changed` `conversationsList` tag.
|
|
78
|
+
//
|
|
79
|
+
// TODO(electron-cutover): drop the `conversation_list_invalidated`
|
|
80
|
+
// emission once macOS migrates to the Electron client and consumes
|
|
81
|
+
// `sync_changed` directly. See `runtime/sync/resource-sync-events.ts`
|
|
82
|
+
// for the symmetric helper used by route handlers.
|
|
83
|
+
params.broadcastMessage(
|
|
84
|
+
{
|
|
85
|
+
type: "conversation_list_invalidated",
|
|
86
|
+
reason: "reordered",
|
|
87
|
+
},
|
|
88
|
+
undefined,
|
|
89
|
+
{ targetInterfaceId: "macos" },
|
|
90
|
+
);
|
|
78
91
|
params.broadcastMessage({
|
|
79
92
|
type: "sync_changed",
|
|
80
93
|
tags: [
|
|
@@ -163,6 +163,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
163
163
|
addMessageCalls.push({ conversationId, role, content, metadata, opts });
|
|
164
164
|
return { id: `msg-${addMessageCalls.length}` };
|
|
165
165
|
},
|
|
166
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
166
167
|
}));
|
|
167
168
|
|
|
168
169
|
// emitNotificationSignal mock
|
|
@@ -58,7 +58,7 @@ mock.module("../../config/loader.js", () => ({
|
|
|
58
58
|
setNestedValue: () => {},
|
|
59
59
|
}));
|
|
60
60
|
|
|
61
|
-
const { buildSystemPrompt,
|
|
61
|
+
const { buildSystemPrompt, maybeReseedBootstrap } =
|
|
62
62
|
await import("../system-prompt.js");
|
|
63
63
|
|
|
64
64
|
describe("buildSystemPrompt — tool routing guidance", () => {
|
|
@@ -73,12 +73,12 @@ describe("buildSystemPrompt — tool routing guidance", () => {
|
|
|
73
73
|
});
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
describe("
|
|
76
|
+
describe("maybeReseedBootstrap — content-automation template", () => {
|
|
77
77
|
const templatesDir = join(import.meta.dirname!, "..", "templates");
|
|
78
78
|
|
|
79
79
|
beforeEach(() => {
|
|
80
80
|
mkdirSync(TEST_DIR, { recursive: true });
|
|
81
|
-
// Seed the workspace with the generic BOOTSTRAP.md so the
|
|
81
|
+
// Seed the workspace with the generic BOOTSTRAP.md so the bootstrap
|
|
82
82
|
// reseed detects it as an unmodified template and overwrites it.
|
|
83
83
|
copyFileSync(
|
|
84
84
|
join(templatesDir, "BOOTSTRAP.md"),
|
|
@@ -87,7 +87,7 @@ describe("maybeReseedBootstrapForCohort — content-automation template", () =>
|
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
function reseedAndRead(): string {
|
|
90
|
-
|
|
90
|
+
maybeReseedBootstrap("BOOTSTRAP-CONTENT-AUTOMATION.md");
|
|
91
91
|
return readFileSync(join(TEST_DIR, "BOOTSTRAP.md"), "utf-8");
|
|
92
92
|
}
|
|
93
93
|
|
|
@@ -54,8 +54,9 @@ mock.module("../../config/loader.js", () => ({
|
|
|
54
54
|
setNestedValue: () => {},
|
|
55
55
|
}));
|
|
56
56
|
|
|
57
|
-
const { buildSystemPrompt, ensurePromptFiles
|
|
58
|
-
|
|
57
|
+
const { buildSystemPrompt, ensurePromptFiles } = await import(
|
|
58
|
+
"../system-prompt.js"
|
|
59
|
+
);
|
|
59
60
|
|
|
60
61
|
describe("task_progress hint in parallel-tool-calls section", () => {
|
|
61
62
|
beforeEach(() => {
|
|
@@ -85,11 +86,4 @@ describe("task_progress hint in parallel-tool-calls section", () => {
|
|
|
85
86
|
expect(withExcludePrefix).toContain("task_progress");
|
|
86
87
|
});
|
|
87
88
|
|
|
88
|
-
test("hint lives in the static (cached) block before SYSTEM_PROMPT_CACHE_BOUNDARY", () => {
|
|
89
|
-
const result = buildSystemPrompt();
|
|
90
|
-
const boundaryIdx = result.indexOf(SYSTEM_PROMPT_CACHE_BOUNDARY);
|
|
91
|
-
expect(boundaryIdx).toBeGreaterThan(-1);
|
|
92
|
-
const staticBlock = result.slice(0, boundaryIdx);
|
|
93
|
-
expect(staticBlock).toContain("task_progress");
|
|
94
|
-
});
|
|
95
89
|
});
|
|
@@ -77,31 +77,46 @@ function resolveUserFilename(
|
|
|
77
77
|
): string | null {
|
|
78
78
|
let filename: string | null = null;
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
filename = guardian.contact.userFile ?? "guardian.md";
|
|
87
|
-
}
|
|
88
|
-
} else if (trustContext.requesterExternalUserId) {
|
|
89
|
-
// Channel-routed request — look up contact by channel identity
|
|
90
|
-
const contactWithChannels = findContactByChannelExternalId(
|
|
91
|
-
trustContext.sourceChannel,
|
|
92
|
-
trustContext.requesterExternalUserId,
|
|
93
|
-
);
|
|
94
|
-
if (contactWithChannels) {
|
|
95
|
-
filename = contactWithChannels.userFile ?? null;
|
|
96
|
-
} else if (trustContext.trustClass === "guardian") {
|
|
97
|
-
// Managed desktop: the JWT principal ID used as requesterExternalUserId
|
|
98
|
-
// may differ from the contact channel's external_user_id (they are
|
|
99
|
-
// separate identity concepts). Fall back to the channel-type guardian.
|
|
100
|
-
const guardian = findGuardianForChannel(trustContext.sourceChannel);
|
|
80
|
+
try {
|
|
81
|
+
if (trustContext === undefined) {
|
|
82
|
+
// Desktop / native (no gateway) — resolve via guardian contact,
|
|
83
|
+
// preferring the vellum-channel guardian when multiple exist.
|
|
84
|
+
const vellumGuardian = findGuardianForChannel("vellum");
|
|
85
|
+
const guardian = vellumGuardian ?? listGuardianChannels();
|
|
101
86
|
if (guardian) {
|
|
102
87
|
filename = guardian.contact.userFile ?? "guardian.md";
|
|
103
88
|
}
|
|
89
|
+
} else if (trustContext.requesterExternalUserId) {
|
|
90
|
+
// Channel-routed request — look up contact by channel identity
|
|
91
|
+
const contactWithChannels = findContactByChannelExternalId(
|
|
92
|
+
trustContext.sourceChannel,
|
|
93
|
+
trustContext.requesterExternalUserId,
|
|
94
|
+
);
|
|
95
|
+
if (contactWithChannels) {
|
|
96
|
+
filename = contactWithChannels.userFile ?? null;
|
|
97
|
+
} else if (trustContext.trustClass === "guardian") {
|
|
98
|
+
// Managed desktop: the JWT principal ID used as requesterExternalUserId
|
|
99
|
+
// may differ from the contact channel's external_user_id (they are
|
|
100
|
+
// separate identity concepts). Fall back to the channel-type guardian.
|
|
101
|
+
const guardian = findGuardianForChannel(trustContext.sourceChannel);
|
|
102
|
+
if (guardian) {
|
|
103
|
+
filename = guardian.contact.userFile ?? "guardian.md";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
104
106
|
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
// Contacts table may be absent — happens during early bootstrap
|
|
109
|
+
// before migrations run, in CLI smoke commands that don't touch
|
|
110
|
+
// the DB, and in tests that build the system prompt without first
|
|
111
|
+
// initializing a schema. Treat the same as "no guardian found"
|
|
112
|
+
// so callers fall back to `users/default.md`. Mirrors the same
|
|
113
|
+
// try/catch pattern used by `renderConnectedServices()` around
|
|
114
|
+
// `listConnections()`.
|
|
115
|
+
log.debug(
|
|
116
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
117
|
+
"Contacts lookup failed during persona resolution; treating as no guardian",
|
|
118
|
+
);
|
|
119
|
+
return null;
|
|
105
120
|
}
|
|
106
121
|
|
|
107
122
|
// Validate basename to prevent path traversal
|
package/src/prompts/sections.ts
CHANGED
|
@@ -110,6 +110,7 @@ interface ResolvedSection {
|
|
|
110
110
|
|
|
111
111
|
function resolveSection(
|
|
112
112
|
id: string,
|
|
113
|
+
ctx: SectionRenderContext,
|
|
113
114
|
workspaceDir: string,
|
|
114
115
|
): ResolvedSection | null {
|
|
115
116
|
const workspacePath = join(workspaceDir, `${id}.md`);
|
|
@@ -139,15 +140,28 @@ function resolveSection(
|
|
|
139
140
|
|
|
140
141
|
// A bundled section may delegate its body to a workspace file outside
|
|
141
142
|
// the section override directory (e.g. `SOUL.md` at the workspace
|
|
142
|
-
// root).
|
|
143
|
-
//
|
|
144
|
-
//
|
|
143
|
+
// root). `workspacePath` may be a single path or an array of paths
|
|
144
|
+
// tried in order — the first one whose file exists and has non-empty
|
|
145
|
+
// content wins. Each entry may reference `{{ctx-key}}` variables
|
|
146
|
+
// (e.g. `users/{{userSlug}}.md`) that are interpolated against the
|
|
147
|
+
// render context before resolution. Missing/empty files yield "",
|
|
148
|
+
// which `renderSection` then gates off via its empty-body check (or
|
|
149
|
+
// via the section's `transform`, if set).
|
|
145
150
|
if (bundled.workspacePath) {
|
|
146
|
-
const
|
|
151
|
+
const paths = Array.isArray(bundled.workspacePath)
|
|
152
|
+
? bundled.workspacePath
|
|
153
|
+
: [bundled.workspacePath];
|
|
147
154
|
let body = "";
|
|
148
|
-
|
|
155
|
+
for (const pathTemplate of paths) {
|
|
156
|
+
const interpolated = interpolateWorkspacePath(pathTemplate, ctx);
|
|
157
|
+
const filePath = getWorkspacePromptPath(interpolated);
|
|
158
|
+
if (!existsSync(filePath)) continue;
|
|
149
159
|
try {
|
|
150
|
-
|
|
160
|
+
const content = readFileSync(filePath, "utf-8");
|
|
161
|
+
if (content.trim().length > 0) {
|
|
162
|
+
body = content;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
151
165
|
} catch (err) {
|
|
152
166
|
log.warn({ err, filePath, id }, "Failed to read section workspacePath");
|
|
153
167
|
}
|
|
@@ -162,12 +176,30 @@ function resolveSection(
|
|
|
162
176
|
};
|
|
163
177
|
}
|
|
164
178
|
|
|
179
|
+
/**
|
|
180
|
+
* Interpolate `{{key}}` references in a workspace-path template against
|
|
181
|
+
* `ctx`. Section / inverted-section tags are not supported in paths —
|
|
182
|
+
* only flat variable substitution. Unresolved keys stay literal so a
|
|
183
|
+
* typo surfaces as a missing file rather than silently rendering an
|
|
184
|
+
* unrelated section.
|
|
185
|
+
*/
|
|
186
|
+
function interpolateWorkspacePath(
|
|
187
|
+
template: string,
|
|
188
|
+
ctx: SectionRenderContext,
|
|
189
|
+
): string {
|
|
190
|
+
return template.replace(VARIABLE, (match, key: string) => {
|
|
191
|
+
const value = ctx[key];
|
|
192
|
+
if (value === undefined || value === null) return match;
|
|
193
|
+
return String(value);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
165
197
|
function renderSection(
|
|
166
198
|
id: string,
|
|
167
199
|
ctx: SectionRenderContext,
|
|
168
200
|
workspaceDir: string,
|
|
169
201
|
): string | null {
|
|
170
|
-
const section = resolveSection(id, workspaceDir);
|
|
202
|
+
const section = resolveSection(id, ctx, workspaceDir);
|
|
171
203
|
if (section === null) return null;
|
|
172
204
|
|
|
173
205
|
if (!isEnabled(section.enabled, ctx)) return null;
|