@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SkillToolEntry } from "../../config/skills.js";
|
|
2
2
|
import { RiskLevel } from "../../permissions/types.js";
|
|
3
|
-
import
|
|
3
|
+
import { validateInputAgainstSchema } from "../../skills/validate-input.js";
|
|
4
4
|
import type {
|
|
5
5
|
ExecutionTarget,
|
|
6
6
|
Tool,
|
|
@@ -15,39 +15,16 @@ const riskMap: Record<SkillToolEntry["risk"], RiskLevel> = {
|
|
|
15
15
|
high: RiskLevel.High,
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* Validate that all keys in `input` are declared in the tool's input_schema
|
|
20
|
-
* properties. Returns an error result listing unknown parameters, or undefined
|
|
21
|
-
* if validation passes.
|
|
22
|
-
*/
|
|
23
|
-
function validateNoUnknownParams(
|
|
24
|
-
toolName: string,
|
|
25
|
-
input: Record<string, unknown>,
|
|
26
|
-
schema: SkillToolEntry["input_schema"],
|
|
27
|
-
): ToolExecutionResult | undefined {
|
|
28
|
-
const properties = schema?.properties;
|
|
29
|
-
if (!properties) return undefined;
|
|
30
|
-
|
|
31
|
-
const knownKeys = new Set(Object.keys(properties));
|
|
32
|
-
const unknownKeys = Object.keys(input).filter((k) => !knownKeys.has(k));
|
|
33
|
-
if (unknownKeys.length === 0) return undefined;
|
|
34
|
-
|
|
35
|
-
const listed = unknownKeys.map((k) => `"${k}"`).join(", ");
|
|
36
|
-
const supported = [...knownKeys].map((k) => `"${k}"`).join(", ");
|
|
37
|
-
return {
|
|
38
|
-
content: `Unknown parameter${unknownKeys.length > 1 ? "s" : ""} ${listed} for tool "${toolName}". Supported parameters: ${supported}. Remove unsupported parameters and retry.`,
|
|
39
|
-
isError: true,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
18
|
/**
|
|
44
19
|
* Create a runtime Tool object from a manifest entry.
|
|
45
20
|
* Maps SkillToolEntry metadata to the Tool interface and routes execution
|
|
46
|
-
* through the skill script runner.
|
|
21
|
+
* through the skill script runner. Ownership (the originating skill id) is
|
|
22
|
+
* recorded by the tool registry at `registerSkillTools(skillId, tools)`
|
|
23
|
+
* time, not stamped on the `Tool` object — see
|
|
24
|
+
* {@link ../../tools/registry.getToolOwner}.
|
|
47
25
|
*/
|
|
48
26
|
export function createSkillTool(
|
|
49
27
|
entry: SkillToolEntry,
|
|
50
|
-
skillId: string,
|
|
51
28
|
skillDir: string,
|
|
52
29
|
versionHash: string,
|
|
53
30
|
bundled?: boolean,
|
|
@@ -57,30 +34,25 @@ export function createSkillTool(
|
|
|
57
34
|
description: entry.description,
|
|
58
35
|
category: entry.category,
|
|
59
36
|
defaultRiskLevel: riskMap[entry.risk],
|
|
60
|
-
origin: "skill",
|
|
61
|
-
ownerSkillId: skillId,
|
|
62
37
|
executionTarget: entry.execution_target as ExecutionTarget,
|
|
63
|
-
ownerSkillVersionHash: versionHash,
|
|
64
|
-
ownerSkillBundled: bundled,
|
|
65
38
|
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
name: entry.name,
|
|
69
|
-
description: entry.description,
|
|
70
|
-
input_schema: entry.input_schema as ToolDefinition["input_schema"],
|
|
71
|
-
};
|
|
72
|
-
},
|
|
39
|
+
input_schema: entry.input_schema as object,
|
|
73
40
|
|
|
74
41
|
async execute(
|
|
75
42
|
input: Record<string, unknown>,
|
|
76
43
|
context: ToolContext,
|
|
77
44
|
): Promise<ToolExecutionResult> {
|
|
78
|
-
const
|
|
45
|
+
const validation = validateInputAgainstSchema(
|
|
79
46
|
entry.name,
|
|
80
47
|
input,
|
|
81
|
-
entry.input_schema,
|
|
48
|
+
entry.input_schema as Record<string, unknown> | undefined,
|
|
82
49
|
);
|
|
83
|
-
if (
|
|
50
|
+
if (!validation.ok) {
|
|
51
|
+
return {
|
|
52
|
+
content: `Invalid input for tool "${entry.name}": ${validation.errors.join("; ")}. Fix the arguments and retry.`,
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
84
56
|
|
|
85
57
|
return runSkillToolScript(skillDir, entry.executor, input, context, {
|
|
86
58
|
target: entry.execution_target,
|
|
@@ -93,15 +65,17 @@ export function createSkillTool(
|
|
|
93
65
|
|
|
94
66
|
/**
|
|
95
67
|
* Create runtime Tool objects from all entries in a manifest.
|
|
68
|
+
* The caller is responsible for passing the resulting array to
|
|
69
|
+
* `registerSkillTools(skillId, tools)`, which is where ownership is
|
|
70
|
+
* recorded.
|
|
96
71
|
*/
|
|
97
72
|
export function createSkillToolsFromManifest(
|
|
98
73
|
entries: SkillToolEntry[],
|
|
99
|
-
skillId: string,
|
|
100
74
|
skillDir: string,
|
|
101
75
|
versionHash: string,
|
|
102
76
|
bundled?: boolean,
|
|
103
77
|
): Tool[] {
|
|
104
78
|
return entries.map((entry) =>
|
|
105
|
-
createSkillTool(entry,
|
|
79
|
+
createSkillTool(entry, skillDir, versionHash, bundled),
|
|
106
80
|
);
|
|
107
81
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
3
2
|
import { getSubagentManager } from "../../subagent/index.js";
|
|
4
3
|
import { registerTool } from "../registry.js";
|
|
5
4
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
@@ -37,13 +36,10 @@ class NotifyParentTool implements Tool {
|
|
|
37
36
|
description =
|
|
38
37
|
"Send a notification to the parent conversation. Use this for important findings, when you're blocked, or when you have preliminary results the parent should know about. Do not overuse — notify for significant findings, not after every tool call.";
|
|
39
38
|
category = "orchestration";
|
|
39
|
+
executionTarget = "sandbox" as const;
|
|
40
40
|
defaultRiskLevel = RiskLevel.Low;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
name: this.name,
|
|
45
|
-
description: this.description,
|
|
46
|
-
input_schema: {
|
|
42
|
+
input_schema = {
|
|
47
43
|
type: "object",
|
|
48
44
|
properties: {
|
|
49
45
|
message: {
|
|
@@ -63,9 +59,7 @@ class NotifyParentTool implements Tool {
|
|
|
63
59
|
},
|
|
64
60
|
},
|
|
65
61
|
required: ["message", "activity"],
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
}
|
|
62
|
+
};
|
|
69
63
|
|
|
70
64
|
async execute(
|
|
71
65
|
input: Record<string, unknown>,
|
|
@@ -102,6 +102,9 @@ export async function executeSubagentSpawn(
|
|
|
102
102
|
...(inheritedOverrideProfile
|
|
103
103
|
? { overrideProfile: inheritedOverrideProfile }
|
|
104
104
|
: {}),
|
|
105
|
+
...(context.toolUseId
|
|
106
|
+
? { parentToolUseId: context.toolUseId }
|
|
107
|
+
: {}),
|
|
105
108
|
...forkFields,
|
|
106
109
|
},
|
|
107
110
|
sendToClient as (msg: unknown) => void,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
3
2
|
import { registerTool } from "../registry.js";
|
|
4
3
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
5
4
|
|
|
@@ -57,13 +56,10 @@ class RequestSystemPermissionTool implements Tool {
|
|
|
57
56
|
"Use when a tool fails with a permission/access error (e.g. 'Operation not permitted', 'EACCES', sandbox denial). " +
|
|
58
57
|
"Do not explain how to open System Settings manually - this tool handles it with a clickable button.";
|
|
59
58
|
category = "system";
|
|
59
|
+
executionTarget = "sandbox" as const;
|
|
60
60
|
defaultRiskLevel = RiskLevel.High;
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
name: this.name,
|
|
65
|
-
description: this.description,
|
|
66
|
-
input_schema: {
|
|
62
|
+
input_schema = {
|
|
67
63
|
type: "object",
|
|
68
64
|
properties: {
|
|
69
65
|
permission_type: {
|
|
@@ -78,9 +74,7 @@ class RequestSystemPermissionTool implements Tool {
|
|
|
78
74
|
},
|
|
79
75
|
},
|
|
80
76
|
required: ["permission_type", "activity"],
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
}
|
|
77
|
+
};
|
|
84
78
|
|
|
85
79
|
async execute(
|
|
86
80
|
input: Record<string, unknown>,
|
|
@@ -4,7 +4,6 @@ import { spawn } from "node:child_process";
|
|
|
4
4
|
import { getConfig } from "../../config/loader.js";
|
|
5
5
|
import { isCesShellLockdownEnabled } from "../../credential-execution/feature-gates.js";
|
|
6
6
|
import { RiskLevel } from "../../permissions/types.js";
|
|
7
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
8
7
|
import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
|
|
9
8
|
import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
|
|
10
9
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
@@ -49,13 +48,10 @@ class ShellTool implements Tool {
|
|
|
49
48
|
name = "bash";
|
|
50
49
|
description = "Execute a shell command on the local machine";
|
|
51
50
|
category = "terminal";
|
|
51
|
+
executionTarget = "sandbox" as const;
|
|
52
52
|
defaultRiskLevel = RiskLevel.Medium;
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
name: this.name,
|
|
57
|
-
description: this.description,
|
|
58
|
-
input_schema: {
|
|
54
|
+
input_schema = {
|
|
59
55
|
type: "object",
|
|
60
56
|
properties: {
|
|
61
57
|
command: {
|
|
@@ -91,9 +87,7 @@ class ShellTool implements Tool {
|
|
|
91
87
|
},
|
|
92
88
|
},
|
|
93
89
|
required: ["command", "activity"],
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}
|
|
90
|
+
};
|
|
97
91
|
|
|
98
92
|
async execute(
|
|
99
93
|
input: Record<string, unknown>,
|
|
@@ -10,7 +10,7 @@ import { createOrReuseToolGrantRequest } from "../runtime/tool-grant-request-hel
|
|
|
10
10
|
import { redactSecrets } from "../security/secret-scanner.js";
|
|
11
11
|
import { computeToolApprovalDigest } from "../security/tool-approval-digest.js";
|
|
12
12
|
import { getLogger } from "../util/logger.js";
|
|
13
|
-
import { getAllTools, getTool } from "./registry.js";
|
|
13
|
+
import { getAllTools, getTool, getToolOwner } from "./registry.js";
|
|
14
14
|
import { isSideEffectTool } from "./side-effects.js";
|
|
15
15
|
import { summarizeToolInput } from "./tool-input-summary.js";
|
|
16
16
|
import {
|
|
@@ -340,8 +340,12 @@ export class ToolApprovalHandler {
|
|
|
340
340
|
const tool = getTool(name);
|
|
341
341
|
if (!tool) {
|
|
342
342
|
const allowedToolNames = context.allowedToolNames;
|
|
343
|
+
// List every registered tool. Tools that need an external resolver
|
|
344
|
+
// (computer-use, ui-surface, etc.) now return a structured error
|
|
345
|
+
// from their `execute()` when no resolver is connected, rather than
|
|
346
|
+
// being filtered out here — listing them surfaces a clearer path
|
|
347
|
+
// than hiding their names entirely.
|
|
343
348
|
const available = getAllTools()
|
|
344
|
-
.filter((t) => t.executionMode !== "proxy" || context.proxyToolResolver)
|
|
345
349
|
.map((t) => t.name)
|
|
346
350
|
.filter((n) => !allowedToolNames || allowedToolNames.has(n))
|
|
347
351
|
.sort()
|
|
@@ -368,8 +372,10 @@ export class ToolApprovalHandler {
|
|
|
368
372
|
|
|
369
373
|
// Gate tools not active for the current turn
|
|
370
374
|
if (context.allowedToolNames && !context.allowedToolNames.has(name)) {
|
|
371
|
-
const
|
|
372
|
-
|
|
375
|
+
const owner = getToolOwner(name);
|
|
376
|
+
const ownerSkillId = owner?.kind === "skill" ? owner.id : undefined;
|
|
377
|
+
const loadHint = ownerSkillId
|
|
378
|
+
? `Load the "${ownerSkillId}" skill that provides this tool first.`
|
|
373
379
|
: `Load the skill that provides this tool first.`;
|
|
374
380
|
const msg = `Tool "${name}" is not currently active. ${loadHint}`;
|
|
375
381
|
const durationMs = Date.now() - startTime;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for the defaults applied when a `ToolDefinition`
|
|
3
|
+
* omits one of the normally-required fields, plus the `finalizeTool`
|
|
4
|
+
* helper that lifts a `ToolDefinition` into a `LoadedTool`.
|
|
5
|
+
*
|
|
6
|
+
* Plugins, external loaders, and any other registration boundary that
|
|
7
|
+
* accepts loose `ToolDefinition` objects from authors must run them
|
|
8
|
+
* through `finalizeTool` before handing the result to a `registerXxxTools`
|
|
9
|
+
* call. The registry types make this a hard rule: every registered tool
|
|
10
|
+
* is a `LoadedTool` (`Required<ToolDefinition> & { name }`).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
LoadedTool,
|
|
15
|
+
RiskLevel,
|
|
16
|
+
ToolDefinition,
|
|
17
|
+
ToolExecutionResult,
|
|
18
|
+
} from "./types.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Default values applied by `finalizeTool` when the author omits a field.
|
|
22
|
+
*
|
|
23
|
+
* - `description` defaults to empty — the model sees the tool name only
|
|
24
|
+
* for un-documented tools, which is the correct minimal-info signal.
|
|
25
|
+
* - `defaultRiskLevel` defaults to `medium` — the safe middle band that
|
|
26
|
+
* forces explicit approval for risky calls without spamming approval
|
|
27
|
+
* prompts on no-op tools.
|
|
28
|
+
* - `input_schema` defaults to an empty closed object — the model is
|
|
29
|
+
* allowed to call the tool with no arguments, and unknown arguments
|
|
30
|
+
* are rejected at the JSON-schema layer.
|
|
31
|
+
* - `executionTarget` defaults to `sandbox` — author-supplied tool code
|
|
32
|
+
* runs in the assistant container by default; opt in to `host` when
|
|
33
|
+
* the tool proxies work to the connected client.
|
|
34
|
+
*
|
|
35
|
+
* `execute` has no constant default because the default closure needs to
|
|
36
|
+
* close over the tool's name to produce a useful error message; see
|
|
37
|
+
* `finalizeTool` below.
|
|
38
|
+
*/
|
|
39
|
+
export const TOOL_DEFAULTS = Object.freeze({
|
|
40
|
+
description: "",
|
|
41
|
+
defaultRiskLevel: "medium" as RiskLevel,
|
|
42
|
+
input_schema: Object.freeze({
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {},
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
}) as object,
|
|
47
|
+
executionTarget: "sandbox" as const,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Fill the four normally-required `ToolDefinition` fields with documented
|
|
52
|
+
* defaults when the author omitted them, attach the registration-time
|
|
53
|
+
* `name`, and return a `LoadedTool` that is safe to hand to a
|
|
54
|
+
* `registerXxxTools` call.
|
|
55
|
+
*
|
|
56
|
+
* The default `execute` returns an error result so the model sees a clear
|
|
57
|
+
* "this tool isn't wired up" signal at call time. The owning loader still
|
|
58
|
+
* registers the tool cleanly — a broken individual tool must never block
|
|
59
|
+
* the registration batch.
|
|
60
|
+
*/
|
|
61
|
+
export function finalizeTool(
|
|
62
|
+
tool: ToolDefinition,
|
|
63
|
+
name: string,
|
|
64
|
+
): LoadedTool {
|
|
65
|
+
const description =
|
|
66
|
+
typeof tool.description === "string"
|
|
67
|
+
? tool.description
|
|
68
|
+
: TOOL_DEFAULTS.description;
|
|
69
|
+
const defaultRiskLevel =
|
|
70
|
+
typeof tool.defaultRiskLevel === "string"
|
|
71
|
+
? tool.defaultRiskLevel
|
|
72
|
+
: TOOL_DEFAULTS.defaultRiskLevel;
|
|
73
|
+
const input_schema =
|
|
74
|
+
tool.input_schema !== null && typeof tool.input_schema === "object"
|
|
75
|
+
? tool.input_schema
|
|
76
|
+
: TOOL_DEFAULTS.input_schema;
|
|
77
|
+
const execute =
|
|
78
|
+
typeof tool.execute === "function"
|
|
79
|
+
? tool.execute
|
|
80
|
+
: async (): Promise<ToolExecutionResult> => ({
|
|
81
|
+
content: `tool ${name} has no execute implementation`,
|
|
82
|
+
isError: true,
|
|
83
|
+
});
|
|
84
|
+
const executionTarget = tool.executionTarget ?? TOOL_DEFAULTS.executionTarget;
|
|
85
|
+
return {
|
|
86
|
+
...tool,
|
|
87
|
+
name,
|
|
88
|
+
description,
|
|
89
|
+
defaultRiskLevel,
|
|
90
|
+
input_schema,
|
|
91
|
+
executionTarget,
|
|
92
|
+
execute,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -1,19 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
type ToolInputNormalizer = (
|
|
2
|
+
input: Record<string, unknown>,
|
|
3
|
+
) => Record<string, unknown>;
|
|
4
|
+
|
|
5
|
+
const TOOL_NAME_ALIASES = new Map<
|
|
6
|
+
string,
|
|
7
|
+
{ canonicalName: string; normalizeInput?: ToolInputNormalizer }
|
|
8
|
+
>([
|
|
9
|
+
["create_app", { canonicalName: "app_create" }],
|
|
10
|
+
[
|
|
11
|
+
"computer_use_press_key",
|
|
12
|
+
{
|
|
13
|
+
canonicalName: "computer_use_key",
|
|
14
|
+
normalizeInput: normalizeLegacyComputerUsePressKeyInput,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
3
17
|
]);
|
|
4
18
|
|
|
5
|
-
|
|
6
|
-
* Resolve high-confidence compatibility aliases before active-tool gating.
|
|
7
|
-
* Keep this list narrow: aliases should only cover observed model drift where
|
|
8
|
-
* the canonical target is active for the turn.
|
|
9
|
-
*/
|
|
10
|
-
export function resolveToolNameAlias(
|
|
19
|
+
export function resolveToolInvocationAlias(
|
|
11
20
|
name: string,
|
|
21
|
+
input: Record<string, unknown>,
|
|
12
22
|
allowedToolNames?: ReadonlySet<string>,
|
|
13
|
-
): string {
|
|
14
|
-
if (allowedToolNames?.has(name)) return name;
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
17
|
-
if (allowedToolNames && !allowedToolNames.has(
|
|
18
|
-
|
|
23
|
+
): { name: string; input: Record<string, unknown> } {
|
|
24
|
+
if (allowedToolNames?.has(name)) return { name, input };
|
|
25
|
+
const alias = TOOL_NAME_ALIASES.get(name);
|
|
26
|
+
if (!alias) return { name, input };
|
|
27
|
+
if (allowedToolNames && !allowedToolNames.has(alias.canonicalName)) {
|
|
28
|
+
return { name, input };
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
name: alias.canonicalName,
|
|
32
|
+
input: alias.normalizeInput ? alias.normalizeInput(input) : input,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function normalizeLegacyComputerUsePressKeyInput(
|
|
37
|
+
input: Record<string, unknown>,
|
|
38
|
+
): Record<string, unknown> {
|
|
39
|
+
const normalized = { ...input };
|
|
40
|
+
const key = typeof normalized.key === "string" ? normalized.key.trim() : "";
|
|
41
|
+
const modifiers = Array.isArray(normalized.modifiers)
|
|
42
|
+
? normalized.modifiers.flatMap((modifier) => {
|
|
43
|
+
if (typeof modifier !== "string") return [];
|
|
44
|
+
const normalizedModifier = normalizeKeyModifier(modifier);
|
|
45
|
+
return normalizedModifier ? [normalizedModifier] : [];
|
|
46
|
+
})
|
|
47
|
+
: [];
|
|
48
|
+
|
|
49
|
+
delete normalized.modifiers;
|
|
50
|
+
|
|
51
|
+
if (key && modifiers.length > 0 && !key.includes("+")) {
|
|
52
|
+
normalized.key = [...new Set(modifiers), key.toLowerCase()].join("+");
|
|
53
|
+
} else if (key && !key.includes("+")) {
|
|
54
|
+
normalized.key = key.toLowerCase();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function normalizeKeyModifier(modifier: string): string | undefined {
|
|
61
|
+
switch (modifier.trim().toLowerCase()) {
|
|
62
|
+
case "cmd":
|
|
63
|
+
case "command":
|
|
64
|
+
case "meta":
|
|
65
|
+
return "cmd";
|
|
66
|
+
case "ctrl":
|
|
67
|
+
case "control":
|
|
68
|
+
return "ctrl";
|
|
69
|
+
case "option":
|
|
70
|
+
case "alt":
|
|
71
|
+
return "option";
|
|
72
|
+
case "shift":
|
|
73
|
+
return "shift";
|
|
74
|
+
default:
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
19
77
|
}
|
package/src/tools/types.ts
CHANGED
|
@@ -5,7 +5,6 @@ import type {
|
|
|
5
5
|
ProxyApprovalCallback,
|
|
6
6
|
RiskLevel,
|
|
7
7
|
SensitiveOutputBinding,
|
|
8
|
-
ToolDefinition,
|
|
9
8
|
ToolExecutionErrorEvent,
|
|
10
9
|
ToolExecutionStartEvent,
|
|
11
10
|
ToolPermissionDeniedEvent,
|
|
@@ -64,7 +63,6 @@ export type {
|
|
|
64
63
|
ProxyEnvVars,
|
|
65
64
|
SensitiveOutputBinding,
|
|
66
65
|
SensitiveOutputKind,
|
|
67
|
-
ToolDefinition,
|
|
68
66
|
ToolExecutionErrorEvent,
|
|
69
67
|
ToolExecutionStartEvent,
|
|
70
68
|
ToolPermissionDeniedEvent,
|
|
@@ -76,19 +74,7 @@ export { RiskLevel } from "@vellumai/skill-host-contracts";
|
|
|
76
74
|
// Assistant-side concrete overlays
|
|
77
75
|
// ---------------------------------------------------------------------------
|
|
78
76
|
|
|
79
|
-
|
|
80
|
-
* Public, narrow subset of {@link ToolExecutionResult} that plugin-authored
|
|
81
|
-
* tools are responsible for producing. Re-exported from
|
|
82
|
-
* `@vellumai/plugin-api` as `ToolExecutionResult` — the type name plugin
|
|
83
|
-
* authors actually import. The daemon-internal version below extends
|
|
84
|
-
* this and adds runtime-only fields (risk metadata, approval
|
|
85
|
-
* bookkeeping, sensitive-output bindings, etc.) that the executor
|
|
86
|
-
* populates around the call — plugins MUST NOT set those.
|
|
87
|
-
*
|
|
88
|
-
* Adding fields here is a non-breaking change; renaming or removing
|
|
89
|
-
* fields is breaking and gated on a major bump of `@vellumai/plugin-api`.
|
|
90
|
-
*/
|
|
91
|
-
export interface PluginToolExecutionResult {
|
|
77
|
+
export interface ToolExecutionResult {
|
|
92
78
|
/** Textual result shown to the model in the tool-result block. Empty string is valid. */
|
|
93
79
|
content: string;
|
|
94
80
|
/** When true, the agent loop treats `content` as an error and may surface it / retry. */
|
|
@@ -105,9 +91,6 @@ export interface PluginToolExecutionResult {
|
|
|
105
91
|
* the LLM voluntarily end its turn.
|
|
106
92
|
*/
|
|
107
93
|
yieldToUser?: boolean;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface ToolExecutionResult extends PluginToolExecutionResult {
|
|
111
94
|
diff?: DiffInfo;
|
|
112
95
|
/** Optional rich content blocks (e.g. images) to include alongside text in the tool result. */
|
|
113
96
|
contentBlocks?: ContentBlock[];
|
|
@@ -211,20 +194,7 @@ export type ToolLifecycleEventHandler = (
|
|
|
211
194
|
event: ToolLifecycleEvent,
|
|
212
195
|
) => void | Promise<void>;
|
|
213
196
|
|
|
214
|
-
|
|
215
|
-
* Public, narrow subset of {@link ToolContext} handed to plugin-authored
|
|
216
|
-
* tools. Re-exported from `@vellumai/plugin-api` as `ToolContext` — the
|
|
217
|
-
* type name plugin authors actually import. The daemon-internal version
|
|
218
|
-
* below extends this and adds host-only fields (CES client, trust class,
|
|
219
|
-
* lifecycle handlers, requester metadata, host-bash proxy, etc.). Plugin
|
|
220
|
-
* tools see this shape only — the runtime still hands them the full
|
|
221
|
-
* {@link ToolContext} value, but the structural extension here guarantees
|
|
222
|
-
* the assignment without a manual cast.
|
|
223
|
-
*
|
|
224
|
-
* Adding fields here is a non-breaking change; renaming or removing
|
|
225
|
-
* fields is breaking and gated on a major bump of `@vellumai/plugin-api`.
|
|
226
|
-
*/
|
|
227
|
-
export interface PluginToolContext {
|
|
197
|
+
export interface ToolContext {
|
|
228
198
|
/** Identifier of the conversation this tool invocation belongs to. */
|
|
229
199
|
conversationId: string;
|
|
230
200
|
/** Working directory the daemon was launched from. */
|
|
@@ -235,9 +205,6 @@ export interface PluginToolContext {
|
|
|
235
205
|
signal?: AbortSignal;
|
|
236
206
|
/** Optional incremental-output callback for streaming tools. Streaming tools should fall back to returning the full result in `content` when this is absent. */
|
|
237
207
|
onOutput?: (chunk: string) => void;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export interface ToolContext extends PluginToolContext {
|
|
241
208
|
/** Logical assistant scope for multi-assistant routing. */
|
|
242
209
|
assistantId?: string;
|
|
243
210
|
/** When set, the tool execution is part of a task run. Used to retrieve ephemeral permission rules. */
|
|
@@ -349,82 +316,46 @@ export interface ToolContext extends PluginToolContext {
|
|
|
349
316
|
sourceActorPrincipalId?: string;
|
|
350
317
|
}
|
|
351
318
|
|
|
352
|
-
export interface Tool {
|
|
353
|
-
name: string;
|
|
354
|
-
description: string;
|
|
355
|
-
category: string;
|
|
356
|
-
defaultRiskLevel: RiskLevel;
|
|
357
|
-
/** When set to 'proxy', the tool is forwarded to a connected client rather than executed locally. */
|
|
358
|
-
executionMode?: "local" | "proxy";
|
|
359
|
-
/** Whether this tool is a core built-in, provided by a skill, contributed by a plugin, or from an MCP server. */
|
|
360
|
-
origin?: "core" | "skill" | "mcp" | "plugin";
|
|
361
|
-
/** If origin is 'skill', the ID of the owning skill. */
|
|
362
|
-
ownerSkillId?: string;
|
|
363
|
-
/** If origin is 'mcp', the ID of the owning MCP server. */
|
|
364
|
-
ownerMcpServerId?: string;
|
|
365
|
-
/** If origin is 'plugin', the name of the owning plugin. */
|
|
366
|
-
ownerPluginId?: string;
|
|
367
|
-
/** Content-hash of the owning skill's source at registration time. */
|
|
368
|
-
ownerSkillVersionHash?: string;
|
|
369
|
-
/** Whether the owning skill is bundled with the daemon (trusted first-party). */
|
|
370
|
-
ownerSkillBundled?: boolean;
|
|
371
|
-
/** Declared execution target from the skill manifest. Used by resolveExecutionTarget
|
|
372
|
-
* to accurately label lifecycle events for skill-provided tools. */
|
|
373
|
-
executionTarget?: ExecutionTarget;
|
|
374
|
-
getDefinition(): ToolDefinition;
|
|
375
|
-
execute(
|
|
376
|
-
input: Record<string, unknown>,
|
|
377
|
-
context: ToolContext,
|
|
378
|
-
): Promise<ToolExecutionResult>;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
319
|
/**
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
* implementing `getDefinition()`. The registration boundary synthesizes
|
|
386
|
-
* `getDefinition()` from `{name, description, input_schema}` before the
|
|
387
|
-
* tool enters the internal registry.
|
|
388
|
-
* - `name` is derived from the tool file's basename by the external plugin
|
|
389
|
-
* loader.
|
|
390
|
-
* - `category` is registry-owned and stamped to `"plugin"` when the tool is
|
|
391
|
-
* registered.
|
|
392
|
-
* - All ownership stamps (`origin`, `ownerPluginId`, etc.) are set
|
|
393
|
-
* authoritatively by the bootstrap; plugin authors leave them blank.
|
|
394
|
-
*
|
|
395
|
-
* Every author-visible field is optional. The loader fills the four
|
|
396
|
-
* normally-required slots (`description`, `defaultRiskLevel`,
|
|
397
|
-
* `input_schema`, `execute`) with documented defaults when a plugin omits
|
|
398
|
-
* them — see `applyPluginToolDefaults` in `external-plugin-loader.ts`.
|
|
399
|
-
* A nameless, body-less `export default {}` is a valid (if useless) tool;
|
|
400
|
-
* misconfigured tools surface at call time rather than blocking plugin
|
|
401
|
-
* load.
|
|
320
|
+
* Author-facing tool spec — re-exported from `@vellumai/plugin-api`.
|
|
321
|
+
* Loaders fill documented defaults for omitted fields via `finalizeTool`
|
|
322
|
+
* in `tool-defaults.ts`.
|
|
402
323
|
*/
|
|
403
|
-
export
|
|
404
|
-
|
|
405
|
-
"category" | "getDefinition" | "name" | "description" | "defaultRiskLevel"
|
|
406
|
-
> & {
|
|
324
|
+
export interface ToolDefinition {
|
|
325
|
+
/** Human-readable description shown to the model in the tool catalog. */
|
|
407
326
|
description?: string;
|
|
327
|
+
/** Author-asserted risk band — low / medium / high. Drives default permission gating. */
|
|
408
328
|
defaultRiskLevel?: RiskLevel;
|
|
329
|
+
/** JSON schema describing the tool's input arguments. */
|
|
409
330
|
input_schema?: object;
|
|
331
|
+
/** Where the tool runs — sandbox (assistant container) or host (guardian device via proxy). Resolved by `resolveExecutionTarget` if omitted. */
|
|
332
|
+
executionTarget?: ExecutionTarget;
|
|
333
|
+
/** Implementation invoked when the model calls the tool. */
|
|
410
334
|
execute?: (
|
|
411
335
|
input: Record<string, unknown>,
|
|
412
336
|
context: ToolContext,
|
|
413
337
|
) => Promise<ToolExecutionResult>;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/** Tool after the loader has derived its name and filled defaults. */
|
|
341
|
+
export type LoadedTool = Required<ToolDefinition> & {
|
|
342
|
+
name: string;
|
|
414
343
|
};
|
|
415
344
|
|
|
345
|
+
/** The kind of extension that owns a tool. Core tools have no owner. */
|
|
346
|
+
export type OwnerKind = "skill" | "mcp" | "plugin";
|
|
347
|
+
|
|
416
348
|
/**
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
*
|
|
349
|
+
* Identifies which extension owns a tool (skill / plugin / MCP server).
|
|
350
|
+
* Tracked by the tool registry keyed by tool name, not stored on the `Tool`
|
|
351
|
+
* object itself — query via {@link ../tools/registry.getToolOwner}.
|
|
420
352
|
*/
|
|
421
|
-
export
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
};
|
|
353
|
+
export interface OwnerInfo {
|
|
354
|
+
kind: OwnerKind;
|
|
355
|
+
/** ID of the owning extension (skill id / plugin name / MCP server id). */
|
|
356
|
+
id: string;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export interface Tool extends LoadedTool {
|
|
360
|
+
category: string;
|
|
361
|
+
}
|