@vellumai/assistant 0.4.56 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +10 -10
- package/Dockerfile +3 -0
- package/README.md +11 -11
- package/docs/architecture/integrations.md +2 -2
- package/docs/architecture/memory.md +3 -4
- package/docs/credential-execution-service.md +13 -20
- package/node_modules/@vellumai/ces-contracts/src/error.ts +5 -4
- package/package.json +1 -1
- package/src/__tests__/actor-token-service.test.ts +7 -7
- package/src/__tests__/anthropic-provider.test.ts +172 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +15 -1
- package/src/__tests__/approval-cascade.test.ts +2 -2
- package/src/__tests__/approval-routes-http.test.ts +3 -4
- package/src/__tests__/asset-materialize-tool.test.ts +5 -5
- package/src/__tests__/asset-search-tool.test.ts +1 -1
- package/src/__tests__/assistant-attachments.test.ts +5 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-feature-flags-integration.test.ts +50 -38
- package/src/__tests__/attachments-store.test.ts +2 -2
- package/src/__tests__/avatar-e2e.test.ts +5 -3
- package/src/__tests__/browser-skill-endstate.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +2 -2
- package/src/__tests__/callback-handoff-copy.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +158 -0
- package/src/__tests__/channel-readiness-routes.test.ts +0 -1
- package/src/__tests__/channel-readiness-service.test.ts +0 -1
- package/src/__tests__/checker.test.ts +31 -32
- package/src/__tests__/chrome-cdp.test.ts +47 -18
- package/src/__tests__/claude-code-skill-regression.test.ts +2 -2
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +9 -18
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -2
- package/src/__tests__/conversation-agent-loop.test.ts +11 -4
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +33 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -1
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +1 -1
- package/src/__tests__/conversation-pre-run-repair.test.ts +4 -4
- package/src/__tests__/conversation-provider-retry-repair.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +23 -14
- package/src/__tests__/conversation-routes-slash-commands.test.ts +3 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +204 -185
- package/src/__tests__/conversation-seed-composer.test.ts +1 -1
- package/src/__tests__/conversation-slash-queue.test.ts +4 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -4
- package/src/__tests__/conversation-starter-routes.test.ts +291 -0
- package/src/__tests__/conversation-wipe.test.ts +438 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -3
- package/src/__tests__/conversation-workspace-injection.test.ts +4 -5
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -5
- package/src/__tests__/credential-security-e2e.test.ts +20 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault-unit.test.ts +227 -0
- package/src/__tests__/credentials-cli.test.ts +3 -0
- package/src/__tests__/date-context.test.ts +59 -377
- package/src/__tests__/drop-capability-card-state-migration.test.ts +169 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +11 -45
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/encrypted-store.test.ts +249 -15
- package/src/__tests__/ephemeral-permissions.test.ts +4 -5
- package/src/__tests__/event-bus.test.ts +3 -3
- package/src/__tests__/file-read-tool.test.ts +40 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -2
- package/src/__tests__/gateway-only-guard.test.ts +1 -0
- package/src/__tests__/gemini-image-service.test.ts +4 -4
- package/src/__tests__/gemini-provider.test.ts +6 -9
- package/src/__tests__/guardian-binding-drift-heal.test.ts +128 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/host-file-read-tool.test.ts +87 -0
- package/src/__tests__/host-shell-tool.test.ts +6 -6
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +209 -0
- package/src/__tests__/intent-routing.test.ts +51 -99
- package/src/__tests__/invite-routes-http.test.ts +5 -0
- package/src/__tests__/list-messages-attachments.test.ts +1 -1
- package/src/__tests__/managed-proxy-context.test.ts +2 -5
- package/src/__tests__/managed-skill-lifecycle.test.ts +8 -8
- package/src/__tests__/media-generate-image.test.ts +32 -15
- package/src/__tests__/media-reuse-story.e2e.test.ts +1 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +1 -1
- package/src/__tests__/memory-lifecycle-e2e.test.ts +24 -18
- package/src/__tests__/memory-recall-quality.test.ts +4 -3
- package/src/__tests__/memory-regressions.test.ts +86 -90
- package/src/__tests__/migration-cross-version-compatibility.test.ts +32 -32
- package/src/__tests__/migration-export-http.test.ts +26 -27
- package/src/__tests__/migration-import-commit-http.test.ts +165 -37
- package/src/__tests__/migration-import-preflight-http.test.ts +81 -20
- package/src/__tests__/migration-validate-http.test.ts +16 -16
- package/src/__tests__/model-intents.test.ts +2 -2
- package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +1 -1
- package/src/__tests__/non-member-access-request.test.ts +3 -3
- package/src/__tests__/notification-broadcaster.test.ts +1 -1
- package/src/__tests__/notification-decision-fallback.test.ts +2 -2
- package/src/__tests__/notification-decision-identity.test.ts +8 -9
- package/src/__tests__/notification-decision-strategy.test.ts +1 -1
- package/src/__tests__/notification-deep-link.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/notification-schedule-dedup.test.ts +7 -7
- package/src/__tests__/oauth-store.test.ts +1 -3
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -1
- package/src/__tests__/onboarding-template-contract.test.ts +23 -59
- package/src/__tests__/provider-error-scenarios.test.ts +154 -0
- package/src/__tests__/provider-fail-open-selection.test.ts +2 -2
- package/src/__tests__/provider-managed-proxy-integration.test.ts +8 -9
- package/src/__tests__/provider-registry-ollama.test.ts +5 -2
- package/src/__tests__/qdrant-manager.test.ts +7 -7
- package/src/__tests__/ratelimit.test.ts +0 -74
- package/src/__tests__/recording-handler.test.ts +0 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/scheduler-recurrence.test.ts +46 -2
- package/src/__tests__/schema-transforms.test.ts +114 -54
- package/src/__tests__/secret-onetime-send.test.ts +20 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -2
- package/src/__tests__/secret-scanner-executor.test.ts +1 -2
- package/src/__tests__/send-endpoint-busy.test.ts +63 -4
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/shell-credential-ref.test.ts +0 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -2
- package/src/__tests__/skill-memory.test.ts +549 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -2
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -0
- package/src/__tests__/slack-channel-config.test.ts +109 -94
- package/src/__tests__/swarm-conversation-integration.test.ts +2 -2
- package/src/__tests__/swarm-recursion.test.ts +2 -2
- package/src/__tests__/swarm-tool.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +19 -66
- package/src/__tests__/telegram-config.test.ts +121 -0
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +1 -1
- package/src/__tests__/trace-emitter.test.ts +8 -1
- package/src/__tests__/trust-store.test.ts +7 -8
- package/src/__tests__/twilio-routes.test.ts +1 -18
- package/src/__tests__/user-reference.test.ts +82 -2
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +196 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +3 -3
- package/src/avatar/ascii-renderer.ts +2 -2
- package/src/avatar/png-renderer.ts +2 -2
- package/src/avatar/resvg-lazy.ts +21 -0
- package/src/calls/guardian-dispatch.ts +1 -1
- package/src/calls/relay-access-wait.ts +2 -2
- package/src/calls/twilio-rest.ts +0 -248
- package/src/cli/AGENTS.md +5 -8
- package/src/cli/__tests__/notifications.test.ts +5 -5
- package/src/cli/commands/avatar.ts +64 -2
- package/src/cli/commands/conversations.ts +131 -1
- package/src/cli/commands/credentials.ts +2 -0
- package/src/cli/commands/notifications.ts +3 -3
- package/src/cli.ts +10 -0
- package/src/config/bundled-skills/acp/SKILL.md +5 -5
- package/src/config/bundled-skills/acp/TOOLS.json +6 -6
- package/src/config/bundled-skills/app-builder/SKILL.md +42 -42
- package/src/config/bundled-skills/app-builder/TOOLS.json +10 -10
- package/src/config/bundled-skills/browser/SKILL.md +15 -15
- package/src/config/bundled-skills/browser/TOOLS.json +14 -14
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +2 -2
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +1 -1
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -5
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -15
- package/src/config/bundled-skills/contacts/SKILL.md +3 -3
- package/src/config/bundled-skills/contacts/TOOLS.json +4 -4
- package/src/config/bundled-skills/document/SKILL.md +4 -4
- package/src/config/bundled-skills/document/TOOLS.json +2 -2
- package/src/config/bundled-skills/followups/TOOLS.json +3 -3
- package/src/config/bundled-skills/gmail/SKILL.md +32 -32
- package/src/config/bundled-skills/gmail/TOOLS.json +16 -16
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
- package/src/config/bundled-skills/google-calendar/SKILL.md +1 -1
- package/src/config/bundled-skills/google-calendar/TOOLS.json +5 -5
- package/src/config/bundled-skills/google-calendar/types.ts +1 -1
- package/src/config/bundled-skills/heartbeat/SKILL.md +43 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +3 -3
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -3
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +16 -12
- package/src/config/bundled-skills/media-processing/SKILL.md +40 -40
- package/src/config/bundled-skills/media-processing/TOOLS.json +8 -8
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +2 -2
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +5 -5
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +2 -2
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +2 -2
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +2 -2
- package/src/config/bundled-skills/media-processing/services/reduce.ts +3 -3
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +29 -25
- package/src/config/bundled-skills/messaging/TOOLS.json +11 -11
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
- package/src/config/bundled-skills/notifications/SKILL.md +3 -3
- package/src/config/bundled-skills/notifications/TOOLS.json +2 -2
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +3 -3
- package/src/config/bundled-skills/orchestration/SKILL.md +1 -1
- package/src/config/bundled-skills/orchestration/TOOLS.json +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +18 -14
- package/src/config/bundled-skills/phone-calls/TOOLS.json +3 -3
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +1 -1
- package/src/config/bundled-skills/playbooks/TOOLS.json +4 -4
- package/src/config/bundled-skills/schedule/SKILL.md +26 -26
- package/src/config/bundled-skills/schedule/TOOLS.json +5 -5
- package/src/config/bundled-skills/screen-watch/SKILL.md +3 -3
- package/src/config/bundled-skills/screen-watch/TOOLS.json +1 -1
- package/src/config/bundled-skills/sequences/SKILL.md +2 -2
- package/src/config/bundled-skills/sequences/TOOLS.json +10 -10
- package/src/config/bundled-skills/sequences/tools/sequence-analytics.ts +2 -2
- package/src/config/bundled-skills/sequences/tools/sequence-enroll.ts +2 -2
- package/src/config/bundled-skills/sequences/tools/sequence-enrollment-list.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-get.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-import.ts +3 -3
- package/src/config/bundled-skills/sequences/tools/sequence-list.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/bundled-skills/skill-management/TOOLS.json +5 -5
- package/src/config/bundled-skills/skills-catalog/SKILL.md +84 -0
- package/src/config/bundled-skills/slack/SKILL.md +2 -2
- package/src/config/bundled-skills/slack/TOOLS.json +8 -8
- package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +3 -3
- package/src/config/bundled-skills/subagent/TOOLS.json +5 -5
- package/src/config/bundled-skills/tasks/SKILL.md +1 -1
- package/src/config/bundled-skills/tasks/TOOLS.json +9 -9
- package/src/config/bundled-skills/transcribe/SKILL.md +5 -5
- package/src/config/bundled-skills/transcribe/TOOLS.json +1 -1
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +10 -10
- package/src/config/bundled-skills/watcher/SKILL.md +4 -4
- package/src/config/bundled-skills/watcher/TOOLS.json +5 -5
- package/src/config/feature-flag-registry.json +33 -17
- package/src/config/schemas/sandbox.ts +1 -1
- package/src/config/schemas/services.ts +13 -3
- package/src/config/schemas/timeouts.ts +0 -10
- package/src/contacts/contact-store.ts +63 -0
- package/src/contacts/contacts-write.ts +1 -1
- package/src/daemon/assistant-attachments.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -2
- package/src/daemon/conversation-agent-loop.ts +7 -30
- package/src/daemon/conversation-error.ts +24 -0
- package/src/daemon/conversation-memory.ts +8 -7
- package/src/daemon/conversation-runtime-assembly.ts +141 -275
- package/src/daemon/conversation-slash.ts +7 -26
- package/src/daemon/conversation-surfaces.ts +14 -0
- package/src/daemon/conversation-tool-setup.ts +9 -8
- package/src/daemon/conversation.ts +2 -0
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/date-context.ts +10 -83
- package/src/daemon/handlers/config-channels.ts +12 -2
- package/src/daemon/handlers/config-slack-channel.ts +7 -1
- package/src/daemon/handlers/config-telegram.ts +6 -1
- package/src/daemon/handlers/conversations.ts +2 -2
- package/src/daemon/handlers/skills.ts +4 -0
- package/src/daemon/lifecycle.ts +28 -4
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +1 -5
- package/src/daemon/shutdown-handlers.ts +9 -3
- package/src/daemon/tool-side-effects.ts +40 -0
- package/src/daemon/trace-emitter.ts +26 -2
- package/src/events/domain-events.ts +1 -1
- package/src/events/tool-permission-telemetry-listener.ts +46 -0
- package/src/inbound/platform-callback-registration.ts +0 -18
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +15 -8
- package/src/media/gemini-image-service.ts +125 -21
- package/src/memory/attachments-store.ts +3 -3
- package/src/memory/channel-verification-sessions.ts +6 -6
- package/src/memory/conversation-crud.ts +196 -1
- package/src/memory/{thread-starters-cadence.ts → conversation-starters-cadence.ts} +9 -42
- package/src/memory/conversation-title-service.ts +2 -3
- package/src/memory/db-init.ts +25 -1
- package/src/memory/invite-store.ts +4 -4
- package/src/memory/items-extractor.ts +4 -4
- package/src/memory/job-handlers/{thread-starters.ts → conversation-starters.ts} +123 -38
- package/src/memory/jobs-store.ts +3 -2
- package/src/memory/jobs-worker.ts +7 -5
- package/src/memory/lifecycle-events-store.ts +63 -0
- package/src/memory/migrations/172-rename-created-by-session-id.ts +27 -0
- package/src/memory/migrations/173-rename-source-session-id.ts +16 -0
- package/src/memory/migrations/174-rename-thread-starters-table.ts +52 -0
- package/src/memory/migrations/175-create-lifecycle-events.ts +15 -0
- package/src/memory/migrations/176-drop-capability-card-state.ts +36 -0
- package/src/memory/migrations/177-create-trace-events-table.ts +40 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +13 -0
- package/src/memory/retriever.test.ts +223 -96
- package/src/memory/retriever.ts +115 -138
- package/src/memory/schema/calls.ts +1 -1
- package/src/memory/schema/contacts.ts +1 -1
- package/src/memory/schema/infrastructure.ts +29 -0
- package/src/memory/schema/memory-core.ts +7 -17
- package/src/memory/schema/notifications.ts +1 -1
- package/src/memory/search/formatting.ts +23 -6
- package/src/memory/search/lexical.ts +2 -0
- package/src/memory/search/semantic.ts +2 -0
- package/src/memory/search/staleness.ts +5 -1
- package/src/memory/search/types.ts +4 -0
- package/src/memory/task-memory-cleanup.ts +96 -6
- package/src/memory/trace-event-store.ts +148 -0
- package/src/notifications/README.md +1 -1
- package/src/notifications/decision-engine.ts +45 -4
- package/src/notifications/emit-signal.ts +5 -4
- package/src/notifications/events-store.ts +4 -4
- package/src/notifications/signal.ts +1 -1
- package/src/oauth/manual-token-connection.ts +49 -25
- package/src/permissions/checker.ts +6 -5
- package/src/permissions/defaults.ts +4 -4
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +9 -90
- package/src/prompts/cache-boundary.ts +8 -0
- package/src/prompts/system-prompt.ts +105 -634
- package/src/prompts/templates/BOOTSTRAP.md +172 -33
- package/src/prompts/templates/IDENTITY.md +8 -24
- package/src/prompts/templates/SOUL.md +20 -41
- package/src/prompts/templates/USER.md +3 -19
- package/src/prompts/user-reference.ts +14 -16
- package/src/providers/anthropic/client.ts +51 -19
- package/src/providers/gemini/client.ts +6 -9
- package/src/providers/managed-proxy/constants.ts +1 -7
- package/src/providers/managed-proxy/context.ts +0 -1
- package/src/providers/model-intents.ts +5 -5
- package/src/providers/openai/client.ts +10 -1
- package/src/providers/openrouter/client.ts +1 -0
- package/src/providers/ratelimit.ts +0 -35
- package/src/providers/registry.ts +3 -5
- package/src/providers/retry.ts +18 -1
- package/src/runtime/access-request-helper.ts +16 -2
- package/src/runtime/auth/route-policy.ts +7 -0
- package/src/runtime/channel-verification-service.ts +1 -1
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/guardian-vellum-migration.ts +61 -1
- package/src/runtime/http-server.ts +8 -4
- package/src/runtime/migrations/vbundle-builder.ts +212 -32
- package/src/runtime/migrations/vbundle-import-analyzer.ts +74 -8
- package/src/runtime/migrations/vbundle-importer.ts +66 -1
- package/src/runtime/migrations/vbundle-validator.ts +17 -3
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +4 -4
- package/src/runtime/routes/attachment-routes.ts +2 -2
- package/src/runtime/routes/btw-routes.ts +93 -0
- package/src/runtime/routes/channel-verification-routes.ts +19 -2
- package/src/runtime/routes/conversation-management-routes.ts +55 -1
- package/src/runtime/routes/conversation-query-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +49 -5
- package/src/runtime/routes/conversation-starter-routes.ts +207 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +13 -9
- package/src/runtime/routes/identity-intro-cache.ts +105 -0
- package/src/runtime/routes/identity-routes.ts +51 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -1
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +25 -13
- package/src/runtime/routes/secret-routes.ts +18 -0
- package/src/runtime/routes/settings-routes.ts +9 -9
- package/src/runtime/routes/telemetry-routes.ts +53 -0
- package/src/runtime/routes/trace-event-routes.ts +62 -0
- package/src/runtime/tool-grant-request-helper.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +47 -31
- package/src/security/encrypted-store.ts +262 -78
- package/src/skills/catalog-install.ts +10 -0
- package/src/skills/managed-store.ts +2 -0
- package/src/skills/skill-memory.ts +222 -0
- package/src/subagent/manager.ts +1 -4
- package/src/telemetry/types.ts +10 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +7 -2
- package/src/telemetry/usage-telemetry-reporter.ts +53 -4
- package/src/tools/AGENTS.md +11 -11
- package/src/tools/acp/spawn.ts +1 -1
- package/src/tools/apps/executors.ts +8 -8
- package/src/tools/apps/registry.ts +1 -1
- package/src/tools/assets/materialize.ts +6 -6
- package/src/tools/assets/search.ts +10 -10
- package/src/tools/browser/__tests__/auth-cache.test.ts +2 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +4 -4
- package/src/tools/browser/auth-detector.ts +6 -6
- package/src/tools/browser/browser-execution.ts +13 -13
- package/src/tools/browser/browser-manager.ts +3 -3
- package/src/tools/browser/chrome-cdp.ts +5 -5
- package/src/tools/browser/jit-auth.ts +2 -2
- package/src/tools/browser/network-recorder.test.ts +2 -2
- package/src/tools/browser/network-recorder.ts +3 -3
- package/src/tools/browser/runtime-check.ts +3 -3
- package/src/tools/claude-code/claude-code.ts +2 -2
- package/src/tools/computer-use/definitions.ts +18 -18
- package/src/tools/credential-execution/make-authenticated-request.ts +4 -4
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -3
- package/src/tools/credential-execution/run-authenticated-command.ts +4 -4
- package/src/tools/credentials/broker-types.ts +5 -5
- package/src/tools/credentials/broker.ts +15 -15
- package/src/tools/credentials/metadata-store.ts +2 -2
- package/src/tools/credentials/resolve.ts +1 -1
- package/src/tools/credentials/selection.ts +1 -1
- package/src/tools/credentials/tool-policy.ts +1 -1
- package/src/tools/credentials/vault.ts +115 -25
- package/src/tools/execution-target.ts +2 -2
- package/src/tools/executor.ts +7 -7
- package/src/tools/filesystem/edit.ts +2 -2
- package/src/tools/filesystem/read.ts +15 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/host-filesystem/edit.ts +2 -1
- package/src/tools/host-filesystem/read.ts +18 -1
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +9 -8
- package/src/tools/mcp/mcp-tool-factory.ts +7 -6
- package/src/tools/memory/definitions.ts +6 -5
- package/src/tools/memory/handlers.test.ts +1 -1
- package/src/tools/network/__tests__/web-search.test.ts +3 -3
- package/src/tools/network/domain-normalize.ts +2 -2
- package/src/tools/network/script-proxy/session-manager.ts +10 -10
- package/src/tools/network/web-fetch.ts +1 -1
- package/src/tools/network/web-search.ts +3 -3
- package/src/tools/permission-checker.ts +8 -8
- package/src/tools/registry.ts +7 -7
- package/src/tools/schedule/list.ts +2 -2
- package/src/tools/schema-transforms.ts +31 -21
- package/src/tools/secret-detection-handler.ts +1 -1
- package/src/tools/sensitive-output-placeholders.ts +1 -1
- package/src/tools/shared/filesystem/edit-engine.ts +1 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +3 -3
- package/src/tools/shared/filesystem/image-read.ts +25 -5
- package/src/tools/shared/filesystem/path-policy.ts +2 -2
- package/src/tools/shared/shell-output.ts +1 -1
- package/src/tools/side-effects.ts +1 -1
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/load.ts +3 -3
- package/src/tools/skills/sandbox-runner.ts +3 -3
- package/src/tools/subagent/read.ts +1 -1
- package/src/tools/subagent/spawn.ts +2 -2
- package/src/tools/swarm/delegate.ts +3 -3
- package/src/tools/system/request-permission.ts +5 -4
- package/src/tools/terminal/backends/native.ts +4 -4
- package/src/tools/terminal/parser.ts +6 -6
- package/src/tools/terminal/sandbox-diagnostics.ts +1 -1
- package/src/tools/terminal/shell.ts +16 -16
- package/src/tools/tool-approval-handler.ts +21 -12
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +3 -3
- package/src/tools/ui-surface/definitions.ts +9 -37
- package/src/tools/watcher/list.ts +1 -1
- package/src/util/logger.ts +7 -2
- package/src/util/pricing.ts +4 -0
- package/src/util/retry.ts +29 -1
- package/src/workspace/migrations/007-web-search-provider-rename.ts +37 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/cli-help-reference-sync.test.ts +0 -26
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -190
- package/src/cli/reference.ts +0 -38
- package/src/memory/job-handlers/capability-cards.ts +0 -420
- package/src/runtime/routes/thread-starter-routes.ts +0 -294
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"enum": ["text", "blocks"],
|
|
34
34
|
"description": "Output format: 'text' returns JSON (default), 'blocks' returns Slack Block Kit structured output"
|
|
35
35
|
},
|
|
36
|
-
"
|
|
36
|
+
"activity": {
|
|
37
37
|
"type": "string",
|
|
38
38
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
39
39
|
}
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"type": "string",
|
|
55
55
|
"description": "The Slack channel ID to get details for"
|
|
56
56
|
},
|
|
57
|
-
"
|
|
57
|
+
"activity": {
|
|
58
58
|
"type": "string",
|
|
59
59
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
60
60
|
}
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
"description": "Channel IDs to add, remove, or set (not needed for 'list')"
|
|
86
86
|
},
|
|
87
|
-
"
|
|
87
|
+
"activity": {
|
|
88
88
|
"type": "string",
|
|
89
89
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
90
90
|
}
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"type": "number",
|
|
119
119
|
"description": "Confidence score (0-1) for this action"
|
|
120
120
|
},
|
|
121
|
-
"
|
|
121
|
+
"activity": {
|
|
122
122
|
"type": "string",
|
|
123
123
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
124
124
|
}
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"type": "number",
|
|
149
149
|
"description": "Confidence score (0-1) for this action"
|
|
150
150
|
},
|
|
151
|
-
"
|
|
151
|
+
"activity": {
|
|
152
152
|
"type": "string",
|
|
153
153
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
154
154
|
}
|
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
"type": "number",
|
|
183
183
|
"description": "Confidence score (0-1) for this action"
|
|
184
184
|
},
|
|
185
|
-
"
|
|
185
|
+
"activity": {
|
|
186
186
|
"type": "string",
|
|
187
187
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
188
188
|
}
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
"type": "number",
|
|
209
209
|
"description": "Confidence score (0-1) for this action"
|
|
210
210
|
},
|
|
211
|
-
"
|
|
211
|
+
"activity": {
|
|
212
212
|
"type": "string",
|
|
213
213
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
214
214
|
}
|
|
@@ -258,7 +258,7 @@
|
|
|
258
258
|
"enum": ["restricted", "standard"],
|
|
259
259
|
"description": "Trust level override: 'restricted' limits tool access, 'standard' uses defaults (for 'set' action)"
|
|
260
260
|
},
|
|
261
|
-
"
|
|
261
|
+
"activity": {
|
|
262
262
|
"type": "string",
|
|
263
263
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
264
264
|
}
|
|
@@ -165,7 +165,7 @@ function buildBlockKitOutput(
|
|
|
165
165
|
type: "header",
|
|
166
166
|
text: {
|
|
167
167
|
type: "plain_text",
|
|
168
|
-
text: `Slack Digest
|
|
168
|
+
text: `Slack Digest - ${digests.length} channel${digests.length !== 1 ? "s" : ""} scanned`,
|
|
169
169
|
},
|
|
170
170
|
});
|
|
171
171
|
|
|
@@ -185,7 +185,7 @@ function buildBlockKitOutput(
|
|
|
185
185
|
type: "section",
|
|
186
186
|
text: {
|
|
187
187
|
type: "mrkdwn",
|
|
188
|
-
text: `${digest.isPrivate ? "\ud83d\udd12 " : ""}*#${digest.channelName}*
|
|
188
|
+
text: `${digest.isPrivate ? "\ud83d\udd12 " : ""}*#${digest.channelName}* - _Error: ${digest.error}_`,
|
|
189
189
|
},
|
|
190
190
|
});
|
|
191
191
|
blocks.push({ type: "divider" });
|
|
@@ -198,7 +198,7 @@ function buildBlockKitOutput(
|
|
|
198
198
|
type: "section",
|
|
199
199
|
text: {
|
|
200
200
|
type: "mrkdwn",
|
|
201
|
-
text: `${privacyIcon}*#${digest.channelName}*
|
|
201
|
+
text: `${privacyIcon}*#${digest.channelName}* - ${digest.messageCount} message${digest.messageCount !== 1 ? "s" : ""}`,
|
|
202
202
|
},
|
|
203
203
|
});
|
|
204
204
|
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"type": "boolean",
|
|
26
26
|
"description": "Whether to present the subagent's result to the user when it completes. Defaults to true. Set to false for internal/silent processing."
|
|
27
27
|
},
|
|
28
|
-
"
|
|
28
|
+
"activity": {
|
|
29
29
|
"type": "string",
|
|
30
30
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
31
31
|
}
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"type": "string",
|
|
48
48
|
"description": "Optional subagent ID to query. If omitted, returns all subagents for this conversation."
|
|
49
49
|
},
|
|
50
|
-
"
|
|
50
|
+
"activity": {
|
|
51
51
|
"type": "string",
|
|
52
52
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
53
53
|
}
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"type": "string",
|
|
70
70
|
"description": "The ID of the subagent to abort."
|
|
71
71
|
},
|
|
72
|
-
"
|
|
72
|
+
"activity": {
|
|
73
73
|
"type": "string",
|
|
74
74
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
75
75
|
}
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"type": "string",
|
|
96
96
|
"description": "The message content to send to the subagent."
|
|
97
97
|
},
|
|
98
|
-
"
|
|
98
|
+
"activity": {
|
|
99
99
|
"type": "string",
|
|
100
100
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
101
101
|
}
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"type": "string",
|
|
118
118
|
"description": "The ID of the subagent whose output to read."
|
|
119
119
|
},
|
|
120
|
-
"
|
|
120
|
+
"activity": {
|
|
121
121
|
"type": "string",
|
|
122
122
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
123
123
|
}
|
|
@@ -29,4 +29,4 @@ Use `task_list_add` to enqueue items (ad-hoc or from a template), `task_list_sho
|
|
|
29
29
|
- When the user says "add to my tasks" or "add to my queue", use `task_list_add` (NOT schedule_create).
|
|
30
30
|
- Use `task_save` only when the user wants to capture a conversation pattern as a reusable template.
|
|
31
31
|
- `task_list` shows saved templates; `task_list_show` shows the active work queue.
|
|
32
|
-
- **Always specify `required_tools`** when calling `task_list_add`. Think about what tools the task will need at execution time and list them explicitly (e.g. `["host_bash"]` for shell commands, `["host_file_read", "host_file_write"]` for file operations, `["web_search", "web_fetch"]` for web lookups). The user must approve these tools before the task can run
|
|
32
|
+
- **Always specify `required_tools`** when calling `task_list_add`. Think about what tools the task will need at execution time and list them explicitly (e.g. `["host_bash"]` for shell commands, `["host_file_read", "host_file_write"]` for file operations, `["web_search", "web_fetch"]` for web lookups). The user must approve these tools before the task can run - omitting them forces a fallback to all tools, which is noisy and may miss non-standard tools the task actually needs.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"type": "string",
|
|
18
18
|
"description": "Optional override for the auto-generated task title"
|
|
19
19
|
},
|
|
20
|
-
"
|
|
20
|
+
"activity": {
|
|
21
21
|
"type": "string",
|
|
22
22
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
23
23
|
}
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"type": "string"
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
"
|
|
53
|
+
"activity": {
|
|
54
54
|
"type": "string",
|
|
55
55
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
56
56
|
}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"input_schema": {
|
|
68
68
|
"type": "object",
|
|
69
69
|
"properties": {
|
|
70
|
-
"
|
|
70
|
+
"activity": {
|
|
71
71
|
"type": "string",
|
|
72
72
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
73
73
|
}
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
},
|
|
92
92
|
"description": "One or more task IDs to delete."
|
|
93
93
|
},
|
|
94
|
-
"
|
|
94
|
+
"activity": {
|
|
95
95
|
"type": "string",
|
|
96
96
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
97
97
|
}
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
],
|
|
124
124
|
"description": "Optional status filter. A single status string (e.g. \"queued\") or an array of statuses to include."
|
|
125
125
|
},
|
|
126
|
-
"
|
|
126
|
+
"activity": {
|
|
127
127
|
"type": "string",
|
|
128
128
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
129
129
|
}
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
},
|
|
181
181
|
"description": "Tools the task will need at execution time. Always specify this \u2014 think about what tools are needed to accomplish the task (e.g. [\"host_bash\"] for shell commands, [\"host_file_read\", \"host_file_write\"] for file operations, [\"web_search\"] for web lookups). The user must approve these before the task runs. Pass [] if no tools are needed."
|
|
182
182
|
},
|
|
183
|
-
"
|
|
183
|
+
"activity": {
|
|
184
184
|
"type": "string",
|
|
185
185
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
186
186
|
}
|
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
"type": "number",
|
|
260
260
|
"description": "Disambiguation filter: pick the Nth oldest match (1 = oldest, 2 = second oldest, etc.) when multiple items share the same title/task_id."
|
|
261
261
|
},
|
|
262
|
-
"
|
|
262
|
+
"activity": {
|
|
263
263
|
"type": "string",
|
|
264
264
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
265
265
|
}
|
|
@@ -311,7 +311,7 @@
|
|
|
311
311
|
"type": "number",
|
|
312
312
|
"description": "Disambiguator: 1-indexed creation order among matches (1 = oldest, 2 = second oldest, etc.)"
|
|
313
313
|
},
|
|
314
|
-
"
|
|
314
|
+
"activity": {
|
|
315
315
|
"type": "string",
|
|
316
316
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
317
317
|
}
|
|
@@ -340,7 +340,7 @@
|
|
|
340
340
|
"type": "string",
|
|
341
341
|
"description": "Work item title to search for (case-insensitive substring match)"
|
|
342
342
|
},
|
|
343
|
-
"
|
|
343
|
+
"activity": {
|
|
344
344
|
"type": "string",
|
|
345
345
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
346
346
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: transcribe
|
|
3
|
-
description: Transcribe audio and video files using Whisper
|
|
3
|
+
description: Transcribe audio and video files using Whisper
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
5
|
metadata:
|
|
6
6
|
emoji: "🎙️"
|
|
@@ -8,14 +8,14 @@ metadata:
|
|
|
8
8
|
display-name: "Transcribe"
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
Transcribe audio and video files using OpenAI's Whisper model
|
|
11
|
+
Transcribe audio and video files using OpenAI's Whisper model - either via the cloud API or locally via whisper.cpp.
|
|
12
12
|
|
|
13
13
|
## Choosing a Mode
|
|
14
14
|
|
|
15
15
|
Before transcribing, **ask the user which mode they prefer** if they haven't specified:
|
|
16
16
|
|
|
17
|
-
1. **`api`**
|
|
18
|
-
2. **`local`**
|
|
17
|
+
1. **`api`** - Uses the OpenAI Whisper API. Fast, accurate, no setup needed. Requires an OpenAI API key (check if one is already configured). Audio is sent to OpenAI's servers. Costs ~$0.006/min.
|
|
18
|
+
2. **`local`** - Uses whisper.cpp installed via Homebrew. Free, private, runs entirely on-device. Requires a one-time `brew install whisper-cpp`. Slightly slower but no data leaves the machine.
|
|
19
19
|
|
|
20
20
|
If the user says "cloud", "API", or "online" → use `api`.
|
|
21
21
|
If the user says "local", "offline", "private", or "on-device" → use `local`.
|
|
@@ -25,5 +25,5 @@ If the user says "local", "offline", "private", or "on-device" → use `local`.
|
|
|
25
25
|
- The tool accepts either a `file_path` (absolute path to a local file) or an `attachment_id` (for uploaded attachments). Prefer `file_path` when the user references a file on disk.
|
|
26
26
|
- Supported formats: any video (mp4, mov, etc.) or audio (mp3, wav, m4a, etc.) file.
|
|
27
27
|
- For video files, audio is automatically extracted via ffmpeg before transcription.
|
|
28
|
-
- The API mode has a 25MB per-request limit
|
|
28
|
+
- The API mode has a 25MB per-request limit - large files are automatically split into chunks.
|
|
29
29
|
- Local mode requires whisper.cpp (`brew install whisper-cpp`). The model is downloaded automatically on first use.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"enum": ["api", "local"],
|
|
23
23
|
"description": "Transcription backend: 'api' for OpenAI Whisper API (cloud), 'local' for whisper.cpp (on-device)"
|
|
24
24
|
},
|
|
25
|
-
"
|
|
25
|
+
"activity": {
|
|
26
26
|
"type": "string",
|
|
27
27
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
28
28
|
}
|
|
@@ -50,7 +50,7 @@ const AUDIO_EXTENSIONS = new Set([
|
|
|
50
50
|
/** Max file size for a single OpenAI Whisper API request (25MB). */
|
|
51
51
|
const WHISPER_API_MAX_BYTES = 25 * 1024 * 1024;
|
|
52
52
|
|
|
53
|
-
/** Duration per chunk when splitting for the API (10 minutes
|
|
53
|
+
/** Duration per chunk when splitting for the API (10 minutes - stays well under 25MB as WAV). */
|
|
54
54
|
const API_CHUNK_DURATION_SECS = 600;
|
|
55
55
|
|
|
56
56
|
/** Timeout for a single Whisper API request. */
|
|
@@ -167,7 +167,7 @@ async function resolveSource(
|
|
|
167
167
|
// Check if this is a file-backed attachment (large files stored on disk)
|
|
168
168
|
const onDiskPath = getFilePathForAttachment(attachment.id);
|
|
169
169
|
if (onDiskPath) {
|
|
170
|
-
// File-backed attachment
|
|
170
|
+
// File-backed attachment - use the on-disk file directly
|
|
171
171
|
try {
|
|
172
172
|
await access(onDiskPath);
|
|
173
173
|
} catch {
|
|
@@ -183,7 +183,7 @@ async function resolveSource(
|
|
|
183
183
|
};
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
// Inline attachment
|
|
186
|
+
// Inline attachment - decode base64 to a temp file
|
|
187
187
|
const ext = mime.startsWith("video/") ? ".mp4" : ".m4a";
|
|
188
188
|
const tempPath = join(
|
|
189
189
|
tmpdir(),
|
|
@@ -217,7 +217,7 @@ async function toWav(inputPath: string, isVideo: boolean): Promise<string> {
|
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
// ---------------------------------------------------------------------------
|
|
220
|
-
// API mode
|
|
220
|
+
// API mode - OpenAI Whisper API
|
|
221
221
|
// ---------------------------------------------------------------------------
|
|
222
222
|
|
|
223
223
|
async function transcribeViaApi(
|
|
@@ -244,7 +244,7 @@ async function transcribeViaApi(
|
|
|
244
244
|
context.onOutput?.(
|
|
245
245
|
`Large file (${Math.round(
|
|
246
246
|
duration / 60,
|
|
247
|
-
)}min)
|
|
247
|
+
)}min) - splitting into chunks...\n`,
|
|
248
248
|
);
|
|
249
249
|
const chunks = await splitAudio(
|
|
250
250
|
audioPath,
|
|
@@ -305,7 +305,7 @@ async function whisperApiRequest(
|
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
// ---------------------------------------------------------------------------
|
|
308
|
-
// Local mode
|
|
308
|
+
// Local mode - whisper.cpp
|
|
309
309
|
// ---------------------------------------------------------------------------
|
|
310
310
|
|
|
311
311
|
async function transcribeViaLocal(
|
|
@@ -320,20 +320,20 @@ async function transcribeViaLocal(
|
|
|
320
320
|
);
|
|
321
321
|
}
|
|
322
322
|
|
|
323
|
-
// Resolve model path
|
|
323
|
+
// Resolve model path - use the base model, download if needed
|
|
324
324
|
const modelPath = await resolveWhisperModel(context);
|
|
325
325
|
|
|
326
326
|
const duration = await getAudioDuration(audioPath);
|
|
327
327
|
|
|
328
328
|
if (duration > 0 && duration <= 1800) {
|
|
329
|
-
// Under 30 minutes
|
|
329
|
+
// Under 30 minutes - transcribe directly (whisper.cpp handles long files well)
|
|
330
330
|
context.onOutput?.(
|
|
331
331
|
`Transcribing ${Math.round(duration / 60)}min of audio locally...\n`,
|
|
332
332
|
);
|
|
333
333
|
return await whisperCppRun(audioPath, modelPath);
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
-
// Very long files
|
|
336
|
+
// Very long files - split into 10-minute chunks to show progress
|
|
337
337
|
const chunkDir = join(
|
|
338
338
|
tmpdir(),
|
|
339
339
|
`vellum-transcribe-local-chunks-${randomUUID()}`,
|
|
@@ -344,7 +344,7 @@ async function transcribeViaLocal(
|
|
|
344
344
|
context.onOutput?.(
|
|
345
345
|
`Large file (${Math.round(
|
|
346
346
|
duration / 60,
|
|
347
|
-
)}min)
|
|
347
|
+
)}min) - splitting into chunks...\n`,
|
|
348
348
|
);
|
|
349
349
|
const chunks = await splitAudio(audioPath, chunkDir, 600);
|
|
350
350
|
const parts: string[] = [];
|
|
@@ -12,10 +12,10 @@ Create and manage watchers that poll external services for events and process th
|
|
|
12
12
|
|
|
13
13
|
## Concepts
|
|
14
14
|
|
|
15
|
-
- **Provider**
|
|
16
|
-
- **Action prompt**
|
|
17
|
-
- **Poll interval**
|
|
18
|
-
- **Digest**
|
|
15
|
+
- **Provider** - The external service to poll (e.g. "gmail"). Each provider defines how to fetch and parse events.
|
|
16
|
+
- **Action prompt** - LLM instructions for handling detected events. Sent along with event data to a background conversation.
|
|
17
|
+
- **Poll interval** - How often to check for new events (minimum 15 seconds, default 60 seconds).
|
|
18
|
+
- **Digest** - Summary of recent watcher activity, grouped by watcher with time-based filtering.
|
|
19
19
|
|
|
20
20
|
## Lifecycle
|
|
21
21
|
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"type": "object",
|
|
34
34
|
"description": "Provider-specific configuration (e.g. filter criteria)"
|
|
35
35
|
},
|
|
36
|
-
"
|
|
36
|
+
"activity": {
|
|
37
37
|
"type": "string",
|
|
38
38
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
39
39
|
}
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"type": "boolean",
|
|
60
60
|
"description": "When true, only show enabled watchers. Defaults to false."
|
|
61
61
|
},
|
|
62
|
-
"
|
|
62
|
+
"activity": {
|
|
63
63
|
"type": "string",
|
|
64
64
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
65
65
|
}
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"type": "object",
|
|
102
102
|
"description": "New provider-specific configuration"
|
|
103
103
|
},
|
|
104
|
-
"
|
|
104
|
+
"activity": {
|
|
105
105
|
"type": "string",
|
|
106
106
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
107
107
|
}
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"type": "string",
|
|
124
124
|
"description": "The ID of the watcher to delete"
|
|
125
125
|
},
|
|
126
|
-
"
|
|
126
|
+
"activity": {
|
|
127
127
|
"type": "string",
|
|
128
128
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
129
129
|
}
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"type": "number",
|
|
154
154
|
"description": "Maximum number of events to return. Defaults to 50."
|
|
155
155
|
},
|
|
156
|
-
"
|
|
156
|
+
"activity": {
|
|
157
157
|
"type": "string",
|
|
158
158
|
"description": "Brief non-technical explanation of why this tool is being called"
|
|
159
159
|
}
|
|
@@ -41,14 +41,6 @@
|
|
|
41
41
|
"description": "Enable multi-file TSX app creation with esbuild compilation instead of single-HTML apps",
|
|
42
42
|
"defaultEnabled": false
|
|
43
43
|
},
|
|
44
|
-
{
|
|
45
|
-
"id": "sentry-testing",
|
|
46
|
-
"scope": "macos",
|
|
47
|
-
"key": "sentry_testing_enabled",
|
|
48
|
-
"label": "Sentry Testing",
|
|
49
|
-
"description": "Show the Sentry Testing tab in Settings for triggering test crash reports and error events",
|
|
50
|
-
"defaultEnabled": false
|
|
51
|
-
},
|
|
52
44
|
{
|
|
53
45
|
"id": "mobile-pairing",
|
|
54
46
|
"scope": "macos",
|
|
@@ -226,19 +218,43 @@
|
|
|
226
218
|
"defaultEnabled": false
|
|
227
219
|
},
|
|
228
220
|
{
|
|
229
|
-
"id": "
|
|
230
|
-
"scope": "
|
|
231
|
-
"key": "
|
|
232
|
-
"label": "
|
|
233
|
-
"description": "
|
|
221
|
+
"id": "integration-notion",
|
|
222
|
+
"scope": "assistant",
|
|
223
|
+
"key": "feature_flags.integration-notion.enabled",
|
|
224
|
+
"label": "Notion Integration",
|
|
225
|
+
"description": "Enable the Notion setup skill for connecting to Notion",
|
|
226
|
+
"defaultEnabled": false
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"id": "conversation-starters",
|
|
230
|
+
"scope": "assistant",
|
|
231
|
+
"key": "feature_flags.conversation-starters.enabled",
|
|
232
|
+
"label": "Recommended Starts",
|
|
233
|
+
"description": "Show a curated row of recommended starting actions on the empty conversation page, ordered by relevance as confident first-click options",
|
|
234
|
+
"defaultEnabled": true
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"id": "deploy-to-vercel",
|
|
238
|
+
"scope": "assistant",
|
|
239
|
+
"key": "feature_flags.deploy-to-vercel.enabled",
|
|
240
|
+
"label": "Deploy to Vercel",
|
|
241
|
+
"description": "Enable the Deploy to Vercel / Publish option in the app workspace header share menu",
|
|
242
|
+
"defaultEnabled": false
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"id": "managed-google-oauth",
|
|
246
|
+
"scope": "assistant",
|
|
247
|
+
"key": "feature_flags.managed-google-oauth.enabled",
|
|
248
|
+
"label": "Managed Google OAuth",
|
|
249
|
+
"description": "Show the Google OAuth service card in Models & Services settings",
|
|
234
250
|
"defaultEnabled": false
|
|
235
251
|
},
|
|
236
252
|
{
|
|
237
|
-
"id": "
|
|
253
|
+
"id": "quick-input",
|
|
238
254
|
"scope": "macos",
|
|
239
|
-
"key": "
|
|
240
|
-
"label": "
|
|
241
|
-
"description": "
|
|
255
|
+
"key": "quick_input_enabled",
|
|
256
|
+
"label": "Quick Input",
|
|
257
|
+
"description": "Enable the Quick Input popover on right-click of the menu bar icon",
|
|
242
258
|
"defaultEnabled": false
|
|
243
259
|
}
|
|
244
260
|
]
|
|
@@ -17,7 +17,7 @@ export const VALID_IMAGE_GEN_PROVIDERS = ["gemini", "openai"] as const;
|
|
|
17
17
|
export const VALID_WEB_SEARCH_PROVIDERS = [
|
|
18
18
|
"perplexity",
|
|
19
19
|
"brave",
|
|
20
|
-
"
|
|
20
|
+
"inference-provider-native",
|
|
21
21
|
] as const;
|
|
22
22
|
|
|
23
23
|
export const InferenceServiceSchema = z.object({
|
|
@@ -30,7 +30,7 @@ export type InferenceService = z.infer<typeof InferenceServiceSchema>;
|
|
|
30
30
|
export const ImageGenerationServiceSchema = z.object({
|
|
31
31
|
mode: ServiceModeSchema.default("your-own"),
|
|
32
32
|
provider: z.enum(VALID_IMAGE_GEN_PROVIDERS).default("gemini"),
|
|
33
|
-
model: z.string().default("gemini-
|
|
33
|
+
model: z.string().default("gemini-3.1-flash-image-preview"),
|
|
34
34
|
});
|
|
35
35
|
export type ImageGenerationService = z.infer<
|
|
36
36
|
typeof ImageGenerationServiceSchema
|
|
@@ -38,10 +38,17 @@ export type ImageGenerationService = z.infer<
|
|
|
38
38
|
|
|
39
39
|
export const WebSearchServiceSchema = z.object({
|
|
40
40
|
mode: ServiceModeSchema.default("your-own"),
|
|
41
|
-
provider: z
|
|
41
|
+
provider: z
|
|
42
|
+
.enum(VALID_WEB_SEARCH_PROVIDERS)
|
|
43
|
+
.default("inference-provider-native"),
|
|
42
44
|
});
|
|
43
45
|
export type WebSearchService = z.infer<typeof WebSearchServiceSchema>;
|
|
44
46
|
|
|
47
|
+
export const GoogleOAuthServiceSchema = z.object({
|
|
48
|
+
mode: ServiceModeSchema.default("managed"),
|
|
49
|
+
});
|
|
50
|
+
export type GoogleOAuthService = z.infer<typeof GoogleOAuthServiceSchema>;
|
|
51
|
+
|
|
45
52
|
export const ServicesSchema = z.object({
|
|
46
53
|
inference: InferenceServiceSchema.default(InferenceServiceSchema.parse({})),
|
|
47
54
|
"image-generation": ImageGenerationServiceSchema.default(
|
|
@@ -50,5 +57,8 @@ export const ServicesSchema = z.object({
|
|
|
50
57
|
"web-search": WebSearchServiceSchema.default(
|
|
51
58
|
WebSearchServiceSchema.parse({}),
|
|
52
59
|
),
|
|
60
|
+
"google-oauth": GoogleOAuthServiceSchema.default(
|
|
61
|
+
GoogleOAuthServiceSchema.parse({}),
|
|
62
|
+
),
|
|
53
63
|
});
|
|
54
64
|
export type Services = z.infer<typeof ServicesSchema>;
|
|
@@ -53,16 +53,6 @@ export const RateLimitConfigSchema = z
|
|
|
53
53
|
)
|
|
54
54
|
.default(0)
|
|
55
55
|
.describe("Maximum number of LLM requests per minute (0 = unlimited)"),
|
|
56
|
-
maxTokensPerSession: z
|
|
57
|
-
.number({ error: "rateLimit.maxTokensPerSession must be a number" })
|
|
58
|
-
.int("rateLimit.maxTokensPerSession must be an integer")
|
|
59
|
-
.nonnegative(
|
|
60
|
-
"rateLimit.maxTokensPerSession must be a non-negative integer",
|
|
61
|
-
)
|
|
62
|
-
.default(0)
|
|
63
|
-
.describe(
|
|
64
|
-
"Maximum total tokens (input + output) per conversation session (0 = unlimited)",
|
|
65
|
-
),
|
|
66
56
|
})
|
|
67
57
|
.describe("Rate limiting for LLM provider requests");
|
|
68
58
|
|
|
@@ -900,6 +900,69 @@ export function updateChannelLastSeenById(channelId: string): void {
|
|
|
900
900
|
.run();
|
|
901
901
|
}
|
|
902
902
|
|
|
903
|
+
/**
|
|
904
|
+
* Update a guardian contact's principalId and its channel's identity fields.
|
|
905
|
+
* Used for healing guardian binding drift when the JWT principal no longer
|
|
906
|
+
* matches the stored guardian binding after a DB reset.
|
|
907
|
+
*
|
|
908
|
+
* Returns false if the update would violate the unique (type, address)
|
|
909
|
+
* constraint on contact_channels — e.g. when the incoming principal already
|
|
910
|
+
* exists on another channel record (a revoked former guardian entry).
|
|
911
|
+
* In that case the heal is skipped and trust stays `unknown`.
|
|
912
|
+
*/
|
|
913
|
+
export function updateContactPrincipalAndChannel(
|
|
914
|
+
contactId: string,
|
|
915
|
+
channelId: string,
|
|
916
|
+
newPrincipalId: string,
|
|
917
|
+
): boolean {
|
|
918
|
+
const db = getDb();
|
|
919
|
+
const now = Date.now();
|
|
920
|
+
const normalizedAddress = newPrincipalId.toLowerCase();
|
|
921
|
+
|
|
922
|
+
// Look up the channel we're about to update so we know its type.
|
|
923
|
+
const channel = db
|
|
924
|
+
.select()
|
|
925
|
+
.from(contactChannels)
|
|
926
|
+
.where(eq(contactChannels.id, channelId))
|
|
927
|
+
.get();
|
|
928
|
+
if (!channel) return false;
|
|
929
|
+
|
|
930
|
+
// Guard: check if another channel row already holds this (type, address).
|
|
931
|
+
const conflicting = db
|
|
932
|
+
.select()
|
|
933
|
+
.from(contactChannels)
|
|
934
|
+
.where(
|
|
935
|
+
and(
|
|
936
|
+
eq(contactChannels.type, channel.type),
|
|
937
|
+
eq(contactChannels.address, normalizedAddress),
|
|
938
|
+
),
|
|
939
|
+
)
|
|
940
|
+
.get();
|
|
941
|
+
|
|
942
|
+
if (conflicting && conflicting.id !== channelId) {
|
|
943
|
+
return false;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
db.transaction(() => {
|
|
947
|
+
db.update(contacts)
|
|
948
|
+
.set({ principalId: newPrincipalId, updatedAt: now })
|
|
949
|
+
.where(eq(contacts.id, contactId))
|
|
950
|
+
.run();
|
|
951
|
+
|
|
952
|
+
db.update(contactChannels)
|
|
953
|
+
.set({
|
|
954
|
+
externalUserId: newPrincipalId,
|
|
955
|
+
address: normalizedAddress,
|
|
956
|
+
updatedAt: now,
|
|
957
|
+
})
|
|
958
|
+
.where(eq(contactChannels.id, channelId))
|
|
959
|
+
.run();
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
emitContactChange();
|
|
963
|
+
return true;
|
|
964
|
+
}
|
|
965
|
+
|
|
903
966
|
/**
|
|
904
967
|
* Atomically increment interactionCount and set lastInteraction on a contact channel.
|
|
905
968
|
* Optimized for the hot path — single UPDATE with no prior SELECT.
|
|
@@ -145,7 +145,7 @@ export function upsertContactChannel(params: {
|
|
|
145
145
|
policy?: string;
|
|
146
146
|
status?: string;
|
|
147
147
|
inviteId?: string;
|
|
148
|
-
|
|
148
|
+
sourceConversationId?: string;
|
|
149
149
|
verifiedAt?: number;
|
|
150
150
|
verifiedVia?: string;
|
|
151
151
|
role?: ContactRole;
|
|
@@ -17,8 +17,8 @@ import {
|
|
|
17
17
|
// Constants
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
19
|
|
|
20
|
-
/** Maximum size in bytes for a single assistant attachment (
|
|
21
|
-
export const MAX_ASSISTANT_ATTACHMENT_BYTES =
|
|
20
|
+
/** Maximum size in bytes for a single assistant attachment (100 MB). */
|
|
21
|
+
export const MAX_ASSISTANT_ATTACHMENT_BYTES = 100 * 1024 * 1024;
|
|
22
22
|
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
// Types
|