@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
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import { credentialKey } from "../security/credential-key.js";
|
|
12
12
|
import { getSecureKeyResultAsync } from "../security/secure-keys.js";
|
|
13
|
+
import { getTelegramBotUsername } from "../telegram/bot-username.js";
|
|
13
14
|
import { getLogger } from "../util/logger.js";
|
|
14
15
|
import {
|
|
15
16
|
createConnection,
|
|
@@ -24,6 +25,44 @@ const log = getLogger("manual-token-connection");
|
|
|
24
25
|
/** Sentinel client_id used for non-OAuth providers that don't have a real app. */
|
|
25
26
|
const MANUAL_TOKEN_CLIENT_ID = "manual-config";
|
|
26
27
|
|
|
28
|
+
type ResolvedAccountInfoSource = "provided" | "derived" | "none";
|
|
29
|
+
|
|
30
|
+
interface ResolvedAccountInfo {
|
|
31
|
+
value?: string;
|
|
32
|
+
source: ResolvedAccountInfoSource;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function resolveManualTokenAccountInfo(
|
|
36
|
+
provider: string,
|
|
37
|
+
accountInfo?: string,
|
|
38
|
+
): ResolvedAccountInfo {
|
|
39
|
+
if (accountInfo !== undefined) {
|
|
40
|
+
return { value: accountInfo, source: "provided" };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (provider === "telegram") {
|
|
44
|
+
const botUsername = getTelegramBotUsername();
|
|
45
|
+
if (!botUsername) return { source: "none" };
|
|
46
|
+
return {
|
|
47
|
+
value: botUsername.startsWith("@") ? botUsername : `@${botUsername}`,
|
|
48
|
+
source: "derived",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return { source: "none" };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function accountInfoForManualTokenSync(
|
|
56
|
+
provider: string,
|
|
57
|
+
resolved: ResolvedAccountInfo,
|
|
58
|
+
): string | undefined {
|
|
59
|
+
if (resolved.source !== "derived") return resolved.value;
|
|
60
|
+
|
|
61
|
+
const existing = getConnectionByProvider(provider);
|
|
62
|
+
if (existing?.accountInfo) return undefined;
|
|
63
|
+
return resolved.value;
|
|
64
|
+
}
|
|
65
|
+
|
|
27
66
|
/**
|
|
28
67
|
* Ensure an active oauth_connection row exists for the given manual-token
|
|
29
68
|
* provider. Creates the synthetic oauth_app row on first use.
|
|
@@ -79,6 +118,15 @@ export async function syncManualTokenConnection(
|
|
|
79
118
|
provider: string,
|
|
80
119
|
accountInfo?: string,
|
|
81
120
|
): Promise<void> {
|
|
121
|
+
const resolvedAccountInfo = resolveManualTokenAccountInfo(
|
|
122
|
+
provider,
|
|
123
|
+
accountInfo,
|
|
124
|
+
);
|
|
125
|
+
const accountInfoToStore = accountInfoForManualTokenSync(
|
|
126
|
+
provider,
|
|
127
|
+
resolvedAccountInfo,
|
|
128
|
+
);
|
|
129
|
+
|
|
82
130
|
switch (provider) {
|
|
83
131
|
case "telegram": {
|
|
84
132
|
const botTokenResult = await getSecureKeyResultAsync(
|
|
@@ -94,7 +142,7 @@ export async function syncManualTokenConnection(
|
|
|
94
142
|
return;
|
|
95
143
|
}
|
|
96
144
|
if (botTokenResult.value && webhookSecretResult.value) {
|
|
97
|
-
await ensureManualTokenConnection(provider,
|
|
145
|
+
await ensureManualTokenConnection(provider, accountInfoToStore);
|
|
98
146
|
} else {
|
|
99
147
|
removeManualTokenConnection(provider);
|
|
100
148
|
}
|
|
@@ -115,7 +163,7 @@ export async function syncManualTokenConnection(
|
|
|
115
163
|
return;
|
|
116
164
|
}
|
|
117
165
|
if (botTokenResult.value && appTokenResult.value) {
|
|
118
|
-
await ensureManualTokenConnection(provider,
|
|
166
|
+
await ensureManualTokenConnection(provider, accountInfoToStore);
|
|
119
167
|
} else {
|
|
120
168
|
removeManualTokenConnection(provider);
|
|
121
169
|
}
|
|
@@ -133,7 +181,7 @@ export async function syncManualTokenConnection(
|
|
|
133
181
|
return;
|
|
134
182
|
}
|
|
135
183
|
if (tokenResult.value) {
|
|
136
|
-
await ensureManualTokenConnection(provider,
|
|
184
|
+
await ensureManualTokenConnection(provider, accountInfoToStore);
|
|
137
185
|
} else {
|
|
138
186
|
removeManualTokenConnection(provider);
|
|
139
187
|
}
|
|
@@ -199,6 +199,9 @@ export const PROVIDER_SEED_DATA: Record<
|
|
|
199
199
|
},
|
|
200
200
|
],
|
|
201
201
|
appType: "Public integration",
|
|
202
|
+
setupNotes: [
|
|
203
|
+
"Enable Token Rotation on your Notion integration (developer dashboard → your integration → Configuration → Token rotation). Without it, Notion does not issue a refresh token and the connection cannot auto-recover if Notion revokes the access token server-side — you will silently lose access and need to reconnect manually.",
|
|
204
|
+
],
|
|
202
205
|
identityUrl: "https://api.notion.com/v1/users/me",
|
|
203
206
|
identityHeaders: { "Notion-Version": "2022-06-28" },
|
|
204
207
|
identityResponsePaths: ["name", "person.email"],
|
|
@@ -334,6 +334,19 @@ describe("no rule — third-party skill tool", () => {
|
|
|
334
334
|
expect(result.reason).toContain("Skill tool");
|
|
335
335
|
});
|
|
336
336
|
|
|
337
|
+
test("plugin origin → treated as extension-owned (prompt at strict threshold)", () => {
|
|
338
|
+
// Plugins join skills in the "extension-owned" bucket — both prompt by
|
|
339
|
+
// default. `isSkillBundled` is irrelevant for plugins (always false).
|
|
340
|
+
const result = evaluate({
|
|
341
|
+
riskLevel: RiskLevel.Low,
|
|
342
|
+
toolName: "custom_plugin_tool",
|
|
343
|
+
toolOrigin: "plugin",
|
|
344
|
+
autoApproveUpTo: "none",
|
|
345
|
+
});
|
|
346
|
+
expect(result.decision).toBe("prompt");
|
|
347
|
+
expect(result.reason).toContain("Skill tool");
|
|
348
|
+
});
|
|
349
|
+
|
|
337
350
|
test("no tool origin but hasManifestOverride, strict threshold → prompt (unregistered skill tool)", () => {
|
|
338
351
|
const result = evaluate({
|
|
339
352
|
riskLevel: RiskLevel.Low,
|
|
@@ -699,16 +712,17 @@ describe("edge cases", () => {
|
|
|
699
712
|
expect(result.reason).toContain("Skill tool");
|
|
700
713
|
});
|
|
701
714
|
|
|
702
|
-
test("hasManifestOverride with toolOrigin
|
|
715
|
+
test("hasManifestOverride with toolOrigin=mcp — falls through (not extension-owned)", () => {
|
|
703
716
|
const result = evaluate({
|
|
704
717
|
riskLevel: RiskLevel.Low,
|
|
705
718
|
toolName: "manifest_tool",
|
|
706
|
-
toolOrigin: "
|
|
719
|
+
toolOrigin: "mcp",
|
|
707
720
|
hasManifestOverride: true,
|
|
708
721
|
});
|
|
709
|
-
// toolOrigin is "
|
|
710
|
-
//
|
|
711
|
-
//
|
|
722
|
+
// toolOrigin is "mcp", which is not extension-class (skill/plugin), so
|
|
723
|
+
// the third-party skill check doesn't trigger. The hasManifestOverride
|
|
724
|
+
// sub-check requires !toolOrigin, but toolOrigin is set. Falls through
|
|
725
|
+
// to risk-based: Low → allow (within default "low" threshold).
|
|
712
726
|
expect(result.decision).toBe("allow");
|
|
713
727
|
expect(result.reason).toContain("low risk");
|
|
714
728
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OwnerKind } from "../tools/types.js";
|
|
1
2
|
import type { TrustRule } from "./types.js";
|
|
2
3
|
import { RiskLevel } from "./types.js";
|
|
3
4
|
|
|
@@ -13,8 +14,13 @@ export interface ApprovalContext {
|
|
|
13
14
|
matchedRule?: TrustRule;
|
|
14
15
|
isContainerized: boolean;
|
|
15
16
|
isWorkspaceScoped: boolean;
|
|
16
|
-
/**
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Owner kind of the tool, as recorded by the tool registry — "skill" /
|
|
19
|
+
* "plugin" / "mcp" for extension-owned tools, `undefined` for core tools
|
|
20
|
+
* (and for tools that aren't registered, e.g. unregistered skill tools
|
|
21
|
+
* matched only via `hasManifestOverride`).
|
|
22
|
+
*/
|
|
23
|
+
toolOrigin?: OwnerKind;
|
|
18
24
|
/** Whether the tool's owning skill is a first-party bundled skill. */
|
|
19
25
|
isSkillBundled?: boolean;
|
|
20
26
|
/** Whether the tool has a manifest override (unregistered skill tool). */
|
|
@@ -173,8 +179,13 @@ export class DefaultApprovalPolicy implements ApprovalPolicy {
|
|
|
173
179
|
|
|
174
180
|
// ── 6. No rule + third-party skill tool → prompt (unless threshold covers it)
|
|
175
181
|
if (!matchedRule) {
|
|
182
|
+
// Plugin- and skill-owned tools are both treated as extension-class
|
|
183
|
+
// for approval purposes: external by default, prompt unless bundled.
|
|
184
|
+
// MCP-owned tools fall through to the core risk-based path.
|
|
185
|
+
const isExtensionOwned =
|
|
186
|
+
toolOrigin === "skill" || toolOrigin === "plugin";
|
|
176
187
|
const isThirdPartySkill =
|
|
177
|
-
(
|
|
188
|
+
(isExtensionOwned && !isSkillBundled) ||
|
|
178
189
|
(hasManifestOverride && !toolOrigin);
|
|
179
190
|
if (isThirdPartySkill) {
|
|
180
191
|
if (isRiskWithinThreshold(riskLevel, context.autoApproveUpTo)) {
|
|
@@ -15,7 +15,8 @@ import {
|
|
|
15
15
|
looksLikeHostPortShorthand,
|
|
16
16
|
looksLikePathOnlyInput,
|
|
17
17
|
} from "../tools/network/url-safety.js";
|
|
18
|
-
import { getTool } from "../tools/registry.js";
|
|
18
|
+
import { getTool, getToolOwner } from "../tools/registry.js";
|
|
19
|
+
import type { Tool } from "../tools/types.js";
|
|
19
20
|
import {
|
|
20
21
|
getDeprecatedDir,
|
|
21
22
|
getProtectedDir,
|
|
@@ -150,6 +151,23 @@ function resolveSkillIdAndHash(
|
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Resolve whether the skill that owns this tool is bundled (first-party).
|
|
156
|
+
* Returns false when the tool has no owning skill or the skill is not in
|
|
157
|
+
* the catalog. Derived from `loadSkillCatalog()` at check time so the
|
|
158
|
+
* answer reflects current catalog truth (managed overrides flip the bit
|
|
159
|
+
* without needing to re-register tools). Owner is looked up from the tool
|
|
160
|
+
* registry (`getToolOwner(name)`) rather than read from the `Tool` object,
|
|
161
|
+
* since ownership lives on the registry, not on the tool itself.
|
|
162
|
+
*/
|
|
163
|
+
function isToolOwnerSkillBundled(tool: Tool | undefined): boolean {
|
|
164
|
+
if (!tool) return false;
|
|
165
|
+
const owner = getToolOwner(tool.name);
|
|
166
|
+
if (owner?.kind !== "skill") return false;
|
|
167
|
+
const skill = loadSkillCatalog().find((s) => s.id === owner.id);
|
|
168
|
+
return skill?.bundled ?? false;
|
|
169
|
+
}
|
|
170
|
+
|
|
153
171
|
/**
|
|
154
172
|
* Check whether a skill (by id) has parsed inline command expansions.
|
|
155
173
|
* Returns false when the skill is not found in the catalog.
|
|
@@ -529,13 +547,8 @@ export async function check(
|
|
|
529
547
|
risk === RiskLevel.Low
|
|
530
548
|
? isWorkspaceScopedInvocation(toolName, input, workingDir)
|
|
531
549
|
: false,
|
|
532
|
-
toolOrigin:
|
|
533
|
-
|
|
534
|
-
? "skill"
|
|
535
|
-
: tool
|
|
536
|
-
? "builtin"
|
|
537
|
-
: undefined,
|
|
538
|
-
isSkillBundled: tool?.ownerSkillBundled ?? false,
|
|
550
|
+
toolOrigin: getToolOwner(toolName)?.kind,
|
|
551
|
+
isSkillBundled: isToolOwnerSkillBundled(tool),
|
|
539
552
|
hasManifestOverride: !!manifestOverride,
|
|
540
553
|
autoApproveUpTo: threshold,
|
|
541
554
|
hasSandboxAutoApprove,
|
|
@@ -79,7 +79,7 @@ export class PermissionPrompter {
|
|
|
79
79
|
const timeoutMs = getConfig().timeouts.permissionTimeoutSec * 1000;
|
|
80
80
|
|
|
81
81
|
const timer = setTimeout(() => {
|
|
82
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
82
|
+
const interaction = pendingInteractions.resolve(requestId, "cancelled");
|
|
83
83
|
this.ownedIds.delete(requestId);
|
|
84
84
|
log.warn(
|
|
85
85
|
{ requestId, toolName },
|
|
@@ -130,7 +130,7 @@ export class PermissionPrompter {
|
|
|
130
130
|
if (signal) {
|
|
131
131
|
const onAbort = () => {
|
|
132
132
|
if (this.ownedIds.has(requestId)) {
|
|
133
|
-
pendingInteractions.resolve(requestId);
|
|
133
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
134
134
|
this.ownedIds.delete(requestId);
|
|
135
135
|
resolve({ decision: "deny", wasAbort: true });
|
|
136
136
|
}
|
|
@@ -232,7 +232,7 @@ export class PermissionPrompter {
|
|
|
232
232
|
|
|
233
233
|
dispose(): void {
|
|
234
234
|
for (const requestId of [...this.ownedIds]) {
|
|
235
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
235
|
+
const interaction = pendingInteractions.resolve(requestId, "cancelled");
|
|
236
236
|
this.ownedIds.delete(requestId);
|
|
237
237
|
interaction?.rpcReject?.(
|
|
238
238
|
new AssistantError("Prompter disposed", ErrorCode.INTERNAL_ERROR),
|
|
@@ -223,8 +223,11 @@ export class QuestionPrompter {
|
|
|
223
223
|
signal.removeEventListener("abort", onAbort);
|
|
224
224
|
}
|
|
225
225
|
// Idempotent: a no-op if the entry was already removed (e.g. by
|
|
226
|
-
// `removeByConversation`) or by an earlier path.
|
|
227
|
-
|
|
226
|
+
// `removeByConversation`) or by an earlier path. The route's
|
|
227
|
+
// success path resolves with "answered" before invoking rpcResolve,
|
|
228
|
+
// so this fallback only fires for timeout / abort / removeByConversation —
|
|
229
|
+
// all cancellation-shaped outcomes.
|
|
230
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
228
231
|
fn();
|
|
229
232
|
};
|
|
230
233
|
|
|
@@ -71,7 +71,7 @@ export class SecretPrompter {
|
|
|
71
71
|
const timeoutMs = getConfig().timeouts.permissionTimeoutSec * 1000;
|
|
72
72
|
|
|
73
73
|
const timer = setTimeout(() => {
|
|
74
|
-
pendingInteractions.resolve(requestId);
|
|
74
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
75
75
|
this.ownedIds.delete(requestId);
|
|
76
76
|
log.warn({ requestId, service, field }, "Secret prompt timed out");
|
|
77
77
|
resolve({ value: null, delivery: "store" });
|
|
@@ -142,7 +142,7 @@ export class SecretPrompter {
|
|
|
142
142
|
|
|
143
143
|
dispose(): void {
|
|
144
144
|
for (const requestId of [...this.ownedIds]) {
|
|
145
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
145
|
+
const interaction = pendingInteractions.resolve(requestId, "cancelled");
|
|
146
146
|
this.ownedIds.delete(requestId);
|
|
147
147
|
interaction?.rpcReject?.(
|
|
148
148
|
new AssistantError("Prompter disposed", ErrorCode.INTERNAL_ERROR),
|
|
@@ -10,6 +10,7 @@ let mockManagedProxyCtx = {
|
|
|
10
10
|
assistantApiKey: "",
|
|
11
11
|
};
|
|
12
12
|
let mockAssistantId = "";
|
|
13
|
+
let mockSecureKeys: Record<string, string | null | undefined> = {};
|
|
13
14
|
|
|
14
15
|
// ---------------------------------------------------------------------------
|
|
15
16
|
// Module mocks
|
|
@@ -26,7 +27,7 @@ mock.module("../config/env.js", () => ({
|
|
|
26
27
|
// Stub the credential-store fallback so tests stay hermetic and do not
|
|
27
28
|
// read real values from the host credential backend.
|
|
28
29
|
mock.module("../security/secure-keys.js", () => ({
|
|
29
|
-
getSecureKeyAsync: async () => null,
|
|
30
|
+
getSecureKeyAsync: async (key: string) => mockSecureKeys[key] ?? null,
|
|
30
31
|
}));
|
|
31
32
|
|
|
32
33
|
mock.module("../security/credential-key.js", () => ({
|
|
@@ -54,6 +55,7 @@ describe("VellumPlatformClient", () => {
|
|
|
54
55
|
assistantApiKey: "sk-test-key",
|
|
55
56
|
};
|
|
56
57
|
mockAssistantId = "asst-123";
|
|
58
|
+
mockSecureKeys = {};
|
|
57
59
|
});
|
|
58
60
|
|
|
59
61
|
afterEach(() => {
|
|
@@ -94,6 +96,27 @@ describe("VellumPlatformClient", () => {
|
|
|
94
96
|
const client = await VellumPlatformClient.create();
|
|
95
97
|
expect(client!.baseUrl).toBe("https://platform.example.com");
|
|
96
98
|
});
|
|
99
|
+
|
|
100
|
+
test("falls back to credential store values when managed context is not rehydrated", async () => {
|
|
101
|
+
mockManagedProxyCtx = {
|
|
102
|
+
enabled: false,
|
|
103
|
+
platformBaseUrl: "",
|
|
104
|
+
assistantApiKey: "",
|
|
105
|
+
};
|
|
106
|
+
mockAssistantId = "";
|
|
107
|
+
mockSecureKeys = {
|
|
108
|
+
"vellum:platform_base_url": "https://stored-platform.example.com/",
|
|
109
|
+
"vellum:assistant_api_key": "stored-api-key",
|
|
110
|
+
"vellum:platform_assistant_id": " stored-assistant-id ",
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const client = await VellumPlatformClient.create();
|
|
114
|
+
|
|
115
|
+
expect(client).not.toBeNull();
|
|
116
|
+
expect(client!.baseUrl).toBe("https://stored-platform.example.com");
|
|
117
|
+
expect(client!.assistantApiKey).toBe("stored-api-key");
|
|
118
|
+
expect(client!.platformAssistantId).toBe("stored-assistant-id");
|
|
119
|
+
});
|
|
97
120
|
});
|
|
98
121
|
|
|
99
122
|
describe("fetch()", () => {
|
package/src/platform/client.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { resolveManagedProxyContext } from "../providers/platform-proxy/context.
|
|
|
10
10
|
import { credentialKey } from "../security/credential-key.js";
|
|
11
11
|
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
12
12
|
import { getLogger } from "../util/logger.js";
|
|
13
|
+
import { arePlatformFeaturesEnabled } from "./feature-gate.js";
|
|
13
14
|
|
|
14
15
|
const log = getLogger("platform-client");
|
|
15
16
|
|
|
@@ -43,6 +44,13 @@ export class VellumPlatformClient {
|
|
|
43
44
|
* should check `platformAssistantId` themselves.
|
|
44
45
|
*/
|
|
45
46
|
static async create(): Promise<VellumPlatformClient | null> {
|
|
47
|
+
if (!arePlatformFeaturesEnabled()) {
|
|
48
|
+
log.debug(
|
|
49
|
+
"platform-features-in-local-mode is disabled — returning null",
|
|
50
|
+
);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
46
54
|
const ctx = await resolveManagedProxyContext();
|
|
47
55
|
|
|
48
56
|
let baseUrl = ctx.enabled ? ctx.platformBaseUrl : "";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
2
|
+
import { getIsPlatform } from "../config/env-registry.js";
|
|
3
|
+
import type { AssistantConfig } from "../config/schema.js";
|
|
4
|
+
|
|
5
|
+
const FLAG_KEY = "platform-features-in-local-mode" as const;
|
|
6
|
+
|
|
7
|
+
export function arePlatformFeaturesEnabled(
|
|
8
|
+
config?: AssistantConfig,
|
|
9
|
+
): boolean {
|
|
10
|
+
if (getIsPlatform()) return true;
|
|
11
|
+
return isAssistantFeatureFlagEnabled(
|
|
12
|
+
FLAG_KEY,
|
|
13
|
+
(config ?? {}) as AssistantConfig,
|
|
14
|
+
);
|
|
15
|
+
}
|
package/src/plugin-api/index.ts
CHANGED
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
* - {@link UserPromptSubmitContext} — passed to `user-prompt-submit` hook,
|
|
26
26
|
* fired immediately before the agent loop receives a user's prompt
|
|
27
27
|
* - {@link PluginLogger} — pino-compatible logger shape on the contexts
|
|
28
|
+
* - {@link ToolDefinition} — author-facing tool spec (default-export shape
|
|
29
|
+
* for both plugin tool files and workspace tool files)
|
|
28
30
|
* - {@link ToolContext} — passed to a plugin tool's `execute` method
|
|
29
31
|
* - {@link ToolExecutionResult} — return shape of a plugin tool's `execute`
|
|
30
32
|
*
|
|
@@ -41,6 +43,8 @@ export type {
|
|
|
41
43
|
PluginLogger,
|
|
42
44
|
PluginShutdownContext,
|
|
43
45
|
ToolContext,
|
|
46
|
+
ToolDefinition,
|
|
44
47
|
ToolExecutionResult,
|
|
45
48
|
UserPromptSubmitContext,
|
|
46
49
|
} from "./types.js";
|
|
50
|
+
export { RiskLevel } from "./types.js";
|
package/src/plugin-api/types.ts
CHANGED
|
@@ -1,43 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Public plugin-API types
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* from `@vellumai/plugin-api`. The shapes here are the canonical public
|
|
6
|
-
* contract — anything exported is part of the surface that semver gates.
|
|
7
|
-
*
|
|
8
|
-
* ## Tool-execution types
|
|
9
|
-
*
|
|
10
|
-
* `ToolContext` and `ToolExecutionResult` are re-exports of the narrow,
|
|
11
|
-
* stable bases defined alongside their daemon-internal counterparts in
|
|
12
|
-
* `assistant/src/tools/types.ts`. The daemon-internal `ToolContext` /
|
|
13
|
-
* `ToolExecutionResult` (with CES, trust classification, lifecycle
|
|
14
|
-
* events, sensitive-output bindings, risk metadata, etc.) `extends`
|
|
15
|
-
* the public bases, so the runtime can hand plugins the full value
|
|
16
|
-
* without a manual cast and tsc enforces the structural relationship.
|
|
17
|
-
* Plugin tools see the narrow surface only — they MUST NOT set fields
|
|
18
|
-
* that belong to the daemon-internal extension.
|
|
19
|
-
*
|
|
20
|
-
* ## Hook contexts
|
|
21
|
-
*
|
|
22
|
-
* The init / shutdown hook contexts are owned by this module directly.
|
|
23
|
-
* They have no daemon-internal extension today (the daemon constructs
|
|
24
|
-
* and hands them straight through), so there's nothing to inherit from.
|
|
25
|
-
*
|
|
26
|
-
* ## Compatibility
|
|
27
|
-
*
|
|
28
|
-
* Adding fields to any public shape is non-breaking. Renaming or
|
|
29
|
-
* removing fields is breaking and gated on a major bump of
|
|
30
|
-
* `@vellumai/plugin-api`.
|
|
2
|
+
* Public plugin-API types — the canonical contract for
|
|
3
|
+
* `@vellumai/plugin-api`. Adding fields is non-breaking; renaming /
|
|
4
|
+
* removing is breaking and gated on a major bump.
|
|
31
5
|
*/
|
|
32
6
|
|
|
33
7
|
import type { Message } from "../providers/types.js";
|
|
34
8
|
|
|
35
|
-
// ─── Tool-execution types (re-exported from daemon source-of-truth) ──────────
|
|
36
|
-
|
|
37
9
|
export type {
|
|
38
|
-
|
|
39
|
-
|
|
10
|
+
ToolContext,
|
|
11
|
+
ToolDefinition,
|
|
12
|
+
ToolExecutionResult,
|
|
40
13
|
} from "../tools/types.js";
|
|
14
|
+
export { RiskLevel } from "../tools/types.js";
|
|
41
15
|
|
|
42
16
|
// ─── Logger ──────────────────────────────────────────────────────────────────
|
|
43
17
|
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* chain) does not trip a TDZ.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
+
import { memoryV3ShadowPlugin } from "../../memory/v3/shadow-middleware.js";
|
|
27
28
|
import { registerPlugin, resetPluginRegistryForTests } from "../registry.js";
|
|
28
29
|
import { type Plugin, PluginExecutionError } from "../types.js";
|
|
29
30
|
import { defaultCircuitBreakerPlugin } from "./circuit-breaker.js";
|
|
@@ -60,6 +61,11 @@ function getAllDefaultPlugins(): readonly Plugin[] {
|
|
|
60
61
|
defaultEmptyResponsePlugin,
|
|
61
62
|
defaultToolErrorPlugin,
|
|
62
63
|
defaultMemoryRetrievalPlugin,
|
|
64
|
+
// Live-shadow v3 retrieval. Always registered; inert unless both
|
|
65
|
+
// `memory.v3.enabled` and `memory.v3.shadow` are on (gated inside the
|
|
66
|
+
// middleware). Ordered after the default so the default terminal still
|
|
67
|
+
// produces the injected (v2) `MemoryResult`.
|
|
68
|
+
memoryV3ShadowPlugin,
|
|
63
69
|
defaultInjectorsPlugin,
|
|
64
70
|
defaultTokenEstimatePlugin,
|
|
65
71
|
defaultOverflowReducePlugin,
|
|
@@ -48,7 +48,6 @@
|
|
|
48
48
|
|
|
49
49
|
import { resolve } from "node:path";
|
|
50
50
|
|
|
51
|
-
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
52
51
|
import { getConfig } from "../../config/loader.js";
|
|
53
52
|
import { getInContextPkbPaths } from "../../daemon/pkb-context-tracker.js";
|
|
54
53
|
import { buildPkbReminder } from "../../daemon/pkb-reminder-builder.js";
|
|
@@ -107,24 +106,19 @@ function readInjectionInputs(ctx: TurnContext): TurnInjectionInputs {
|
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
export const DISK_PRESSURE_WARNING_PROMPT = `<disk_pressure_warning>
|
|
110
|
-
Disk usage is critically low: this assistant is in storage cleanup mode because the workspace volume is
|
|
109
|
+
Disk usage is critically low: this assistant is in storage cleanup mode because the workspace volume is critically full.
|
|
111
110
|
|
|
112
111
|
In your first paragraph, warn the user that storage is critically low and that normal work is suspended until space is freed.
|
|
113
112
|
|
|
114
113
|
Then help the user clean up storage. Prefer safe inspection steps first, such as checking available space and finding large directories. Ask before deleting files or caches unless the user has already clearly approved the specific cleanup action.
|
|
115
114
|
|
|
116
|
-
Do not work on unrelated tasks until
|
|
115
|
+
Do not work on unrelated tasks until enough space is freed to clear the lock or the user explicitly overrides it. Background processes and messages from trusted contacts are blocked while this cleanup mode is active.
|
|
117
116
|
</disk_pressure_warning>`;
|
|
118
117
|
|
|
119
|
-
function isSafeStorageLimitsEnabled(): boolean {
|
|
120
|
-
return isAssistantFeatureFlagEnabled("safe-storage-limits", getConfig());
|
|
121
|
-
}
|
|
122
|
-
|
|
123
118
|
const diskPressureWarningInjector: Injector = {
|
|
124
119
|
name: "disk-pressure-warning",
|
|
125
120
|
order: DEFAULT_INJECTOR_ORDER.diskPressureWarning,
|
|
126
121
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
127
|
-
if (!isSafeStorageLimitsEnabled()) return null;
|
|
128
122
|
const inputs = readInjectionInputs(ctx);
|
|
129
123
|
if (!inputs.diskPressureContext?.cleanupModeActive) return null;
|
|
130
124
|
return {
|
|
@@ -387,17 +381,20 @@ async function buildPkbReminderWithHints(
|
|
|
387
381
|
* `memory-v2-static` injector — order 38, after-memory-prefix.
|
|
388
382
|
*
|
|
389
383
|
* Injects the v2 static memory block (essentials/threads/recent/buffer
|
|
390
|
-
* concatenated under markdown headings) wrapped in `<
|
|
384
|
+
* concatenated under markdown headings) wrapped in `<info>...</info>`
|
|
391
385
|
* onto the user message. The agent loop only forwards `memoryV2Static` on
|
|
392
386
|
* full-mode turns (first turn / post-compaction), mirroring the PKB
|
|
393
387
|
* auto-inject cadence — subsequent turns get `null` and the prior block
|
|
394
388
|
* stays cached on its original user message.
|
|
395
389
|
*
|
|
396
|
-
* Sits between `pkb-reminder` (35) and `now-md` (40)
|
|
397
|
-
* after
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
390
|
+
* Sits between `pkb-reminder` (35) and `now-md` (40). Because every
|
|
391
|
+
* after-memory-prefix splice lands at the memory-prefix boundary in
|
|
392
|
+
* ascending `order`, higher-order blocks end up closer to the memory
|
|
393
|
+
* prefix. The rendered layout is therefore `[<memory>dynamic</memory>,
|
|
394
|
+
* <info>memory-v2-static</info>, <NOW.md>, <system_reminder>,
|
|
395
|
+
* <knowledge_base>, ...user text]` when every PKB injector also fires.
|
|
396
|
+
* `countMemoryPrefixBlocks` treats the `<info>` static block as part of
|
|
397
|
+
* the memory prefix so `now-md` (40) splices after it.
|
|
401
398
|
*
|
|
402
399
|
* Gating:
|
|
403
400
|
* - `mode === "full"`.
|
|
@@ -420,14 +417,18 @@ const memoryV2StaticInjector: Injector = {
|
|
|
420
417
|
},
|
|
421
418
|
};
|
|
422
419
|
|
|
420
|
+
const INFO_CLOSE_TAG_RE = /<\/info\s*>/gi;
|
|
421
|
+
|
|
423
422
|
/**
|
|
424
|
-
* Wrap the static memory content in `<
|
|
425
|
-
* closing `</
|
|
426
|
-
* accidentally break out of the wrapper.
|
|
423
|
+
* Wrap the static memory content in `<info>...</info>`. Escapes any
|
|
424
|
+
* closing `</info>` inside the content so authored memory files cannot
|
|
425
|
+
* accidentally break out of the wrapper. Distinct from the dynamic
|
|
426
|
+
* activation block (which uses `<memory>...</memory>`) so downstream
|
|
427
|
+
* logic can address the two differently.
|
|
427
428
|
*/
|
|
428
429
|
function buildMemoryV2StaticBlock(content: string): string {
|
|
429
|
-
const escaped = content.replace(
|
|
430
|
-
return `<
|
|
430
|
+
const escaped = content.replace(INFO_CLOSE_TAG_RE, "</info>");
|
|
431
|
+
return `<info>\n${escaped}\n</info>`;
|
|
431
432
|
}
|
|
432
433
|
|
|
433
434
|
/**
|
|
@@ -15,12 +15,17 @@
|
|
|
15
15
|
*
|
|
16
16
|
* The terminal dispatches on the discriminated {@link PersistArgs.op} field:
|
|
17
17
|
*
|
|
18
|
-
* - `add`
|
|
19
|
-
*
|
|
20
|
-
* - `
|
|
21
|
-
*
|
|
22
|
-
* - `
|
|
23
|
-
*
|
|
18
|
+
* - `add` → {@link addMessage}, optionally followed by
|
|
19
|
+
* {@link syncMessageToDisk} when `args.syncToDisk` is true.
|
|
20
|
+
* - `reserve` → {@link reserveMessage} — pre-allocates an empty row
|
|
21
|
+
* for assistant anchor stamping.
|
|
22
|
+
* - `updateContent` → {@link updateMessageContent} — overwrites an existing
|
|
23
|
+
* row's content (returns `void`, wrapped as
|
|
24
|
+
* `{ op: "updateContent" }`).
|
|
25
|
+
* - `update` → {@link updateMessageMetadata} (returns `void`, wrapped
|
|
26
|
+
* as `{ op: "update" }`).
|
|
27
|
+
* - `delete` → {@link deleteMessageById} (returns the segment/summary
|
|
28
|
+
* IDs the caller must clean up out-of-band).
|
|
24
29
|
*
|
|
25
30
|
* Manifest declares `provides.persistence: "v1"` so other plugins can
|
|
26
31
|
* negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
|
|
@@ -36,6 +41,8 @@
|
|
|
36
41
|
import {
|
|
37
42
|
addMessage,
|
|
38
43
|
deleteMessageById,
|
|
44
|
+
reserveMessage,
|
|
45
|
+
updateMessageContent,
|
|
39
46
|
updateMessageMetadata,
|
|
40
47
|
} from "../../memory/conversation-crud.js";
|
|
41
48
|
import { syncMessageToDisk } from "../../memory/conversation-disk-view.js";
|
|
@@ -74,6 +81,18 @@ export async function defaultPersistenceTerminal(
|
|
|
74
81
|
}
|
|
75
82
|
return { op: "add", message };
|
|
76
83
|
}
|
|
84
|
+
case "reserve": {
|
|
85
|
+
const message = await reserveMessage(
|
|
86
|
+
args.conversationId,
|
|
87
|
+
args.role,
|
|
88
|
+
args.metadata,
|
|
89
|
+
);
|
|
90
|
+
return { op: "reserve", message };
|
|
91
|
+
}
|
|
92
|
+
case "updateContent": {
|
|
93
|
+
updateMessageContent(args.messageId, args.content);
|
|
94
|
+
return { op: "updateContent" };
|
|
95
|
+
}
|
|
77
96
|
case "update": {
|
|
78
97
|
updateMessageMetadata(args.messageId, args.updates);
|
|
79
98
|
return { op: "update" };
|