@vellumai/assistant 0.9.0 → 0.10.0-dev.202606192226.8ed8a6a
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 +19 -35
- package/bun.lock +7 -8
- package/docs/activation-funnel-telemetry.md +28 -22
- package/docs/architecture/security.md +29 -28
- package/docs/stt-provider-onboarding.md +3 -5
- package/docs/workflows-testing.md +13 -44
- package/docs/workflows.md +3 -5
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
- package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +97 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +32 -6
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
- package/openapi.yaml +1128 -119
- package/package.json +2 -1
- package/scripts/sync-llm-catalog.ts +6 -15
- package/scripts/sync-web-search-catalog.ts +3 -11
- package/src/__tests__/access-request-card-view.test.ts +98 -0
- package/src/__tests__/access-request-seed-content-blocks.test.ts +2 -4
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +72 -32
- package/src/__tests__/agent-loop-compaction-strip.test.ts +241 -0
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +16 -13
- package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
- package/src/__tests__/app-compiler.test.ts +15 -1
- package/src/__tests__/app-dir-path-guard.test.ts +0 -1
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-routes-http.test.ts +128 -0
- package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/auth-fallback-events-store.test.ts +6 -14
- package/src/__tests__/avatar-identity-sync.test.ts +2 -27
- package/src/__tests__/btw-routes.test.ts +6 -8
- package/src/__tests__/call-pointer-messages.test.ts +28 -0
- package/src/__tests__/cancel-clears-processing.test.ts +89 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -4
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -15
- package/src/__tests__/checker.test.ts +0 -3
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -4
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +21 -1
- package/src/__tests__/compactor-summary-call-truncation.test.ts +223 -0
- package/src/__tests__/config-loader-backfill.test.ts +268 -27
- package/src/__tests__/config-schema.test.ts +35 -0
- package/src/__tests__/config-watcher.test.ts +0 -18
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +0 -6
- package/src/__tests__/contacts-tools.test.ts +29 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +58 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-process-callsite.test.ts +6 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-broker.test.ts +449 -1
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +18 -11
- package/src/__tests__/credential-execution-tools.test.ts +0 -1
- package/src/__tests__/credential-prompt-route.test.ts +4 -4
- package/src/__tests__/credential-routes.test.ts +360 -0
- package/src/__tests__/credential-security-invariants.test.ts +4 -13
- package/src/__tests__/disk-pressure-policy.test.ts +12 -0
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/disk-usage.test.ts +65 -0
- package/src/__tests__/document-tool-security.test.ts +9 -6
- package/src/__tests__/document-update-default-surface.test.ts +202 -0
- package/src/__tests__/dynamic-page-surface.test.ts +152 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
- package/src/__tests__/gateway-flag-listener.test.ts +110 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -7
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +403 -0
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
- package/src/__tests__/guardian-grant-minting.test.ts +3 -35
- package/src/__tests__/guardian-routing-invariants.test.ts +64 -26
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/headless-browser-mode.test.ts +10 -0
- package/src/__tests__/headless-browser-navigate.test.ts +8 -3
- package/src/__tests__/helpers/create-guardian-binding.ts +0 -1
- package/src/__tests__/host-browser-proxy.test.ts +87 -0
- package/src/__tests__/identity-routes.test.ts +0 -189
- package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
- package/src/__tests__/injector-disk-pressure.test.ts +10 -5
- package/src/__tests__/injector-v3-suppression.test.ts +27 -20
- package/src/__tests__/internal-telemetry-routes.test.ts +6 -14
- package/src/__tests__/invite-redemption-service.test.ts +4 -7
- package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +30 -23
- package/src/__tests__/llm-resolver.test.ts +70 -24
- package/src/__tests__/llm-schema.test.ts +1 -0
- package/src/__tests__/managed-profile-guard.test.ts +163 -4
- package/src/__tests__/mcp-health-check.test.ts +6 -7
- package/src/__tests__/media-stream-server-integration.test.ts +317 -13
- package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +34 -0
- package/src/__tests__/persona-resolver.test.ts +49 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
- package/src/__tests__/plugin-api-provider.test.ts +24 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +6 -3
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +214 -0
- package/src/__tests__/provider-send-message-override-profile.test.ts +76 -0
- package/src/__tests__/reaction-persistence.test.ts +150 -29
- package/src/__tests__/registry.test.ts +2 -7
- package/src/__tests__/relay-server.test.ts +285 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
- package/src/__tests__/schedule-routes.test.ts +0 -30
- package/src/__tests__/schedule-tools.test.ts +2 -18
- package/src/__tests__/scheduler-reuse-conversation.test.ts +8 -5
- package/src/__tests__/secret-response-routing.test.ts +35 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +16 -2
- package/src/__tests__/skill-execute-input.test.ts +177 -1
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/skill-runtime-path.test.ts +2 -3
- package/src/__tests__/skills.test.ts +51 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +176 -0
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +285 -0
- package/src/__tests__/subagent-tools.test.ts +266 -0
- package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-progress-nudge-hook.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +100 -3
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
- package/src/__tests__/token-manager.test.ts +519 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +1 -1
- package/src/__tests__/tool-audit-listener.test.ts +7 -7
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +6 -3
- package/src/__tests__/tool-executor.test.ts +0 -79
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +4 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +220 -3
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
- package/src/__tests__/trusted-contact-verification.test.ts +8 -10
- package/src/__tests__/twilio-routes.test.ts +81 -1
- package/src/__tests__/voice-invite-redemption.test.ts +2 -3
- package/src/__tests__/weak-open-model.test.ts +30 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
- package/src/__tests__/workspace-greetings.test.ts +152 -0
- package/src/__tests__/workspace-migration-105-enable-memory-v3-live-for-new-workspaces.test.ts +149 -0
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +285 -0
- package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-collect-usage-data.test.ts +118 -0
- package/src/__tests__/workspace-migration-drop-send-diagnostics.test.ts +118 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +0 -4
- package/src/agent/loop.ts +75 -29
- package/src/api/README.md +6 -6
- package/src/api/events/tool-result.ts +6 -0
- package/src/api/events/workflow-completed.ts +53 -0
- package/src/api/events/workflow-leaf-finished.ts +38 -0
- package/src/api/events/workflow-leaf-started.ts +35 -0
- package/src/api/events/workflow-progress.ts +32 -0
- package/src/api/events/workflow-started.ts +31 -0
- package/src/api/index.ts +40 -0
- package/src/api/responses/conversation-message.ts +28 -4
- package/src/api/responses/home.ts +26 -4
- package/src/api/responses/workflow-journal.ts +53 -0
- package/src/approvals/guardian-card-withdrawal.ts +145 -0
- package/src/approvals/guardian-decision-primitive.ts +26 -3
- package/src/approvals/guardian-request-resolvers.ts +183 -80
- package/src/calls/__tests__/channel-admission-reader.test.ts +132 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +350 -0
- package/src/calls/call-pointer-messages.ts +10 -4
- package/src/calls/channel-admission-reader.ts +104 -0
- package/src/calls/guardian-dispatch.ts +17 -45
- package/src/calls/media-stream-server.ts +84 -2
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +66 -0
- package/src/calls/relay-setup-router.ts +82 -1
- package/src/calls/twilio-routes.ts +17 -8
- package/src/calls/voice-session-bridge.ts +2 -2
- package/src/cli/commands/clients.ts +3 -0
- package/src/cli/commands/db/status.ts +37 -3
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2.test.ts +8 -7
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v3.test.ts +5 -4
- package/src/cli/commands/memory/index.ts +30 -0
- package/src/cli/commands/{memory-v2-compare-render.ts → memory/memory-v2-compare-render.ts} +1 -1
- package/src/cli/commands/{memory-v2.ts → memory/memory-v2.ts} +6 -15
- package/src/cli/commands/{memory-v3.ts → memory/memory-v3.ts} +97 -11
- package/src/cli/commands/oauth/status.test.ts +36 -0
- package/src/cli/commands/oauth/status.ts +23 -3
- package/src/cli/commands/plugins.ts +400 -14
- package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +31 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +443 -0
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +111 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +295 -2
- package/src/cli/lib/diff-plugin.ts +346 -0
- package/src/cli/lib/inspect-plugin.ts +12 -1
- package/src/cli/lib/install-from-github.ts +128 -19
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -0
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/plugin-surfaces.ts +104 -0
- package/src/cli/lib/upgrade-plugin.ts +298 -10
- package/src/cli/program.ts +2 -6
- package/src/config/__tests__/sync-gated-profiles.test.ts +368 -0
- package/src/config/assistant-feature-flags.ts +22 -7
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -1
- package/src/config/bundled-skills/document-editor/SKILL.md +3 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
- package/src/config/bundled-skills/messaging/SKILL.md +6 -4
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -8
- package/src/config/bundled-skills/subagent/SKILL.md +4 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +14 -8
- package/src/config/bundled-tool-registry.ts +2 -7
- package/src/config/call-site-defaults.ts +15 -2
- package/src/config/feature-flag-registry.json +46 -31
- package/src/config/inference-profile-validation.ts +26 -0
- package/src/config/llm-resolver.ts +3 -0
- package/src/config/loader.ts +4 -0
- package/src/config/memory-v3-gate.ts +11 -0
- package/src/config/profile-order.ts +28 -0
- package/src/config/schema.ts +8 -6
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/channels.ts +11 -0
- package/src/config/schemas/elevenlabs.ts +0 -1
- package/src/config/schemas/llm.ts +31 -0
- package/src/config/schemas/memory-lifecycle.ts +3 -7
- package/src/config/schemas/memory-v3.ts +6 -0
- package/src/config/schemas/platform.ts +0 -8
- package/src/config/schemas/services.ts +18 -0
- package/src/config/seed-inference-profiles.ts +109 -44
- package/src/config/skills.ts +21 -0
- package/src/config/sync-gated-profiles.ts +220 -0
- package/src/contacts/contact-store.ts +89 -106
- package/src/contacts/contacts-write.ts +5 -22
- package/src/contacts/types.ts +0 -1
- package/src/context/compactor.ts +88 -54
- package/src/context/strip-injections.ts +58 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/credential-execution/process-manager.ts +55 -14
- package/src/credential-execution/prompted-credential.ts +2 -3
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -2
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/config-watcher.ts +0 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -0
- package/src/daemon/conversation-agent-loop.ts +114 -22
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +3 -5
- package/src/daemon/conversation-process.ts +13 -5
- package/src/daemon/conversation-runtime-assembly.ts +13 -15
- package/src/daemon/conversation-slash.ts +2 -23
- package/src/daemon/conversation-surfaces.ts +26 -0
- package/src/daemon/conversation-tool-setup.ts +53 -19
- package/src/daemon/conversation.ts +131 -20
- package/src/daemon/disk-pressure-policy.ts +5 -3
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -1
- package/src/daemon/handlers/config-a2a.ts +0 -2
- package/src/daemon/handlers/config-channels.ts +15 -16
- package/src/daemon/handlers/config-slack-channel.ts +22 -3
- package/src/daemon/handlers/conversations.ts +107 -0
- package/src/daemon/host-browser-proxy.ts +41 -0
- package/src/daemon/lifecycle.ts +55 -27
- package/src/daemon/memory-v2-startup.test.ts +131 -0
- package/src/daemon/memory-v2-startup.ts +100 -1
- package/src/daemon/message-provenance.ts +2 -0
- package/src/daemon/message-types/contacts.ts +0 -1
- package/src/daemon/message-types/conversations.ts +3 -3
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/message-types/web-activity.ts +7 -1
- package/src/daemon/message-types/workflows.ts +83 -1
- package/src/daemon/orphan-reaper.test.ts +0 -19
- package/src/daemon/orphan-reaper.ts +2 -24
- package/src/daemon/server.ts +0 -10
- package/src/daemon/tool-setup-types.ts +4 -0
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +1 -0
- package/src/events/tool-audit-listener.ts +2 -2
- package/src/home/feed-source-enrichment.test.ts +151 -0
- package/src/home/feed-source-enrichment.ts +176 -0
- package/src/home/relationship-state.ts +2 -4
- package/src/instrument.ts +18 -6
- package/src/ipc/__tests__/binary-result-ipc.test.ts +81 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +20 -0
- package/src/ipc/assistant-server.ts +37 -4
- package/src/ipc/gateway-flag-listener.ts +18 -2
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +5 -16
- package/src/memory/__tests__/db-logs-attach.test.ts +122 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -11
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +37 -7
- package/src/memory/__tests__/memory-retrospective-job.test.ts +229 -401
- package/src/memory/__tests__/onboarding-events-store.test.ts +7 -7
- package/src/memory/auth-fallback-events-store.ts +2 -2
- package/src/memory/auto-analysis-enqueue.ts +3 -5
- package/src/memory/bookmark-crud.ts +1 -2
- package/src/memory/canonical-guardian-store.ts +39 -1
- package/src/memory/conversation-crud.ts +9 -4
- package/src/memory/conversation-key-store.ts +17 -2
- package/src/memory/conversation-title-service.ts +64 -7
- package/src/memory/db-async-query.ts +20 -2
- package/src/memory/db-connection.ts +49 -5
- package/src/memory/db-init.ts +17 -17
- package/src/memory/embedding-backend.ts +38 -1
- package/src/memory/embedding-billing-breaker.ts +96 -0
- package/src/memory/jobs-store.ts +25 -13
- package/src/memory/jobs-worker.ts +54 -1
- package/src/memory/lifecycle-events-store.ts +2 -2
- package/src/memory/memory-retrospective-constants.ts +4 -4
- package/src/memory/memory-retrospective-enqueue.ts +31 -6
- package/src/memory/memory-retrospective-job.ts +28 -227
- package/src/memory/migrations/129-contact-channels-access-fields.ts +18 -9
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +14 -2
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +10 -0
- package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +72 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.test.ts +67 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.ts +25 -0
- package/src/memory/migrations/293-workflow-journal-leaf-tokens.ts +32 -0
- package/src/memory/migrations/294-drop-external-user-id.ts +31 -0
- package/src/memory/migrations/295-drop-approval-prompt-ts-tracker.ts +20 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +110 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.ts +68 -0
- package/src/memory/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +154 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +31 -0
- package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +341 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/run-migrations.ts +41 -0
- package/src/memory/migrations/validate-migration-state.ts +1 -1
- package/src/memory/onboarding-events-store.ts +3 -3
- package/src/memory/schema/contacts.ts +0 -5
- package/src/memory/skill-loaded-events-store.test.ts +7 -15
- package/src/memory/skill-loaded-events-store.ts +2 -2
- package/src/memory/tool-executed-events-store.test.ts +7 -7
- package/src/memory/turn-trace-store.test.ts +736 -0
- package/src/memory/turn-trace-store.ts +364 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +8 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +30 -0
- package/src/memory/v2/consolidation-job.ts +2 -2
- package/src/memory/v2/skill-content.ts +25 -7
- package/src/memory/v2/skill-store.ts +7 -1
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +248 -0
- package/src/memory/v3-eval/eval-packets.ts +546 -0
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/api.ts +31 -0
- package/src/messaging/providers/slack/send.test.ts +114 -2
- package/src/messaging/providers/slack/send.ts +30 -7
- package/src/messaging/providers/slack/withdraw.test.ts +200 -0
- package/src/messaging/providers/slack/withdraw.ts +161 -0
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/access-request-copy.ts +72 -59
- package/src/notifications/adapters/shared.ts +29 -0
- package/src/notifications/adapters/slack.ts +58 -103
- package/src/notifications/adapters/telegram.ts +2 -20
- package/src/notifications/approval-card-data.ts +333 -0
- package/src/notifications/broadcaster.ts +16 -3
- package/src/notifications/canonical-delivery-recorder.ts +139 -0
- package/src/notifications/copy-composer.ts +3 -3
- package/src/notifications/decision-engine.ts +4 -2
- package/src/notifications/destination-resolver.ts +4 -6
- package/src/notifications/guardian-question-mode.ts +10 -0
- package/src/notifications/home-feed-side-effect.ts +7 -16
- package/src/notifications/notification-utils.ts +19 -20
- package/src/notifications/signal.ts +79 -43
- package/src/notifications/types.ts +98 -121
- package/src/oauth/AGENTS.md +5 -24
- package/src/permissions/checker.test.ts +51 -0
- package/src/permissions/checker.ts +185 -26
- package/src/permissions/ipc-risk-types.ts +24 -0
- package/src/permissions/question-prompter.test.ts +27 -0
- package/src/permissions/question-prompter.ts +4 -0
- package/src/permissions/secret-prompter.ts +15 -1
- package/src/platform/client.test.ts +119 -0
- package/src/platform/client.ts +66 -0
- package/src/platform/consent-cache.test.ts +267 -0
- package/src/platform/consent-cache.ts +174 -0
- package/src/plugin-api/constants.ts +1 -1
- package/src/plugin-api/index.ts +33 -1
- package/src/plugin-api/model-profiles.ts +33 -0
- package/src/plugin-api/types.ts +50 -2
- package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +56 -0
- package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +43 -0
- package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +137 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +153 -0
- package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +138 -0
- package/src/plugins/defaults/advisor/__tests__/transcript.test.ts +147 -0
- package/src/plugins/defaults/advisor/advisor-gate.ts +29 -0
- package/src/plugins/defaults/advisor/advisor-state-store.ts +94 -0
- package/src/plugins/defaults/advisor/config.ts +21 -0
- package/src/plugins/defaults/advisor/consult.ts +93 -0
- package/src/plugins/defaults/advisor/hooks/post-model-call.ts +34 -0
- package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +30 -0
- package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/advisor/package.json +14 -0
- package/src/plugins/defaults/advisor/steering.ts +67 -0
- package/src/plugins/defaults/advisor/tools/advisor.ts +65 -0
- package/src/plugins/defaults/advisor/transcript.ts +76 -0
- package/src/plugins/defaults/compaction/window-manager.ts +18 -0
- package/src/plugins/defaults/index.ts +60 -0
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +22 -9
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +64 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +29 -21
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +129 -9
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +31 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +77 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +7 -10
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +144 -11
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +32 -20
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +56 -3
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +23 -2
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
- package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +3 -13
- package/src/plugins/defaults/title-generate/hooks/stop.ts +56 -21
- package/src/prompts/persona-resolver.ts +14 -4
- package/src/prompts/templates/system-sections.ts +7 -2
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +1 -0
- package/src/providers/__tests__/retry-callsite.test.ts +176 -0
- package/src/providers/anthropic/client.ts +230 -175
- package/src/providers/atlascloud/client.ts +85 -0
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/fetch-provider-catalog.ts +85 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/model-catalog.ts +58 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +33 -0
- package/src/providers/openai/chat-completions-provider.ts +7 -0
- package/src/providers/openai/responses-provider.ts +10 -0
- package/src/providers/provider-send-message.ts +11 -3
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +62 -12
- package/src/providers/search-provider-catalog.ts +10 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/providers/weak-open-model.ts +22 -0
- package/src/runtime/AGENTS.md +0 -1
- package/src/runtime/__tests__/agent-wake.test.ts +227 -0
- package/src/runtime/__tests__/client-health.test.ts +44 -0
- package/src/runtime/access-request-helper.ts +21 -53
- package/src/runtime/actor-trust-resolver.ts +59 -63
- package/src/runtime/agent-wake.ts +71 -0
- package/src/runtime/assistant-event-hub.ts +18 -4
- package/src/runtime/auth/__tests__/route-policy.test.ts +12 -0
- package/src/runtime/auth/require-bound-guardian.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -6
- package/src/runtime/capabilities.test.ts +120 -0
- package/src/runtime/capabilities.ts +197 -0
- package/src/runtime/channel-approval-types.ts +22 -45
- package/src/runtime/channel-invite-transports/telegram.ts +4 -4
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/channel-verification-service.ts +3 -3
- package/src/runtime/client-health.ts +26 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +38 -29
- package/src/runtime/effective-capabilities.test.ts +128 -0
- package/src/runtime/effective-capabilities.ts +84 -0
- package/src/runtime/guardian-reply-router.ts +106 -21
- package/src/runtime/invite-redemption-service.ts +9 -25
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +126 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +35 -0
- package/src/runtime/routes/__tests__/client-routes.test.ts +13 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +67 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +383 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/approval-routes.ts +40 -9
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
- package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
- package/src/runtime/routes/browser-tabs-routes.ts +9 -0
- package/src/runtime/routes/btw-routes.ts +1 -27
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +17 -8
- package/src/runtime/routes/client-routes.ts +10 -0
- package/src/runtime/routes/contact-routes.ts +31 -8
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-management-routes.ts +80 -1
- package/src/runtime/routes/conversation-query-routes.ts +68 -22
- package/src/runtime/routes/conversation-routes.ts +39 -14
- package/src/runtime/routes/credential-routes.ts +40 -16
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
- package/src/runtime/routes/events-routes.ts +1 -3
- package/src/runtime/routes/guardian-approval-interception.ts +14 -73
- package/src/runtime/routes/guardian-approval-prompt.ts +22 -4
- package/src/runtime/routes/home-feed-routes.ts +8 -3
- package/src/runtime/routes/identity-routes.ts +1 -296
- package/src/runtime/routes/inbound-message-handler.ts +214 -228
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +89 -7
- package/src/runtime/routes/inbound-stages/admission-policy.test.ts +154 -0
- package/src/runtime/routes/inbound-stages/admission-policy.ts +140 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +3 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -6
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +47 -28
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +358 -0
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +8 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/mcp-auth-routes.ts +233 -41
- package/src/runtime/routes/memory-eval-routes.ts +87 -0
- package/src/runtime/routes/notification-routes.ts +122 -133
- package/src/runtime/routes/platform-routes.ts +2 -2
- package/src/runtime/routes/plugins-routes.ts +366 -11
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +15 -0
- package/src/runtime/routes/surface-action-routes.ts +2 -1
- package/src/runtime/routes/tool-call-question-enrichment.test.ts +146 -0
- package/src/runtime/routes/tool-call-question-enrichment.ts +66 -0
- package/src/runtime/routes/workflow-routes.test.ts +229 -44
- package/src/runtime/routes/workflow-routes.ts +131 -29
- package/src/runtime/routes/workspace-greetings.ts +55 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -11
- package/src/runtime/tool-grant-request-helper.ts +18 -16
- package/src/runtime/trust-context-resolver.ts +8 -5
- package/src/schedule/inference-profile.ts +2 -14
- package/src/schedule/schedule-store.ts +1 -1
- package/src/schedule/scheduler-types.ts +5 -1
- package/src/security/__tests__/provider-key-env-fallback.test.ts +6 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/subagent/manager.ts +17 -4
- package/src/subagent/types.ts +6 -0
- package/src/telemetry/trace-collection-policy.test.ts +28 -0
- package/src/telemetry/trace-collection-policy.ts +30 -0
- package/src/telemetry/types.ts +89 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +586 -36
- package/src/telemetry/usage-telemetry-reporter.ts +148 -41
- package/src/tools/AGENTS.md +3 -3
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +31 -0
- package/src/tools/browser/browser-execution.ts +30 -19
- package/src/tools/document/document-tool.ts +30 -6
- package/src/tools/executor.ts +5 -3
- package/src/tools/host-terminal/host-shell.ts +5 -4
- package/src/tools/memory/register.ts +2 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +360 -0
- package/src/tools/network/__tests__/web-search.test.ts +143 -0
- package/src/tools/network/web-fetch.ts +372 -1
- package/src/tools/network/web-search-error.ts +1 -1
- package/src/tools/network/web-search.ts +213 -10
- package/src/tools/permission-checker.ts +4 -3
- package/src/tools/registry.ts +20 -0
- package/src/tools/schedule/create.ts +7 -12
- package/src/tools/schedule/update.ts +4 -11
- package/src/tools/shared/filesystem/path-policy.ts +39 -13
- package/src/tools/side-effects.ts +2 -17
- package/src/tools/skills/execute.ts +99 -2
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +64 -15
- package/src/tools/terminal/shell.ts +10 -4
- package/src/tools/tool-approval-handler.ts +18 -13
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/types.ts +10 -0
- package/src/tools/ui-surface/definitions.ts +64 -3
- package/src/tools/verification-control-plane-policy.ts +3 -1
- package/src/tools/workflows/run-workflow.test.ts +8 -18
- package/src/tools/workflows/run-workflow.ts +1 -0
- package/src/util/disk-usage.ts +78 -23
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/platform.ts +10 -3
- package/src/watcher/telemetry.ts +2 -2
- package/src/workflows/capabilities.ts +2 -3
- package/src/workflows/engine.test.ts +175 -1
- package/src/workflows/engine.ts +82 -0
- package/src/workflows/journal-store.test.ts +70 -0
- package/src/workflows/journal-store.ts +18 -3
- package/src/workflows/run-manager.test.ts +171 -28
- package/src/workflows/run-manager.ts +66 -24
- package/src/workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.ts +63 -0
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +47 -0
- package/src/workspace/migrations/107-drop-send-diagnostics.ts +47 -0
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +129 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
- package/src/__tests__/credential-security-e2e.test.ts +0 -362
- package/src/__tests__/credential-vault-unit.test.ts +0 -1528
- package/src/__tests__/credential-vault.test.ts +0 -1706
- package/src/__tests__/identity-intro-cache.test.ts +0 -315
- package/src/__tests__/secret-onetime-send.test.ts +0 -182
- package/src/cli/commands/__tests__/task.test.ts +0 -914
- package/src/cli/commands/task.ts +0 -771
- package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
- package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
- package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
- package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
- package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
- package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
- package/src/memory/preloaded-apps.ts +0 -116
- package/src/notifications/tool-approval-copy.ts +0 -142
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +0 -78
- package/src/runtime/routes/identity-intro-cache.ts +0 -172
- package/src/tools/credentials/vault.ts +0 -712
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
rmSync,
|
|
6
|
+
writeFileSync,
|
|
7
|
+
} from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import {
|
|
10
|
+
afterAll,
|
|
11
|
+
afterEach,
|
|
12
|
+
beforeEach,
|
|
13
|
+
describe,
|
|
14
|
+
expect,
|
|
15
|
+
mock,
|
|
16
|
+
test,
|
|
17
|
+
} from "bun:test";
|
|
18
|
+
|
|
19
|
+
const WORKSPACE_DIR = process.env.VELLUM_WORKSPACE_DIR!;
|
|
20
|
+
const CONFIG_PATH = join(WORKSPACE_DIR, "config.json");
|
|
21
|
+
|
|
22
|
+
function ensureTestDir(): void {
|
|
23
|
+
const dirs = [
|
|
24
|
+
WORKSPACE_DIR,
|
|
25
|
+
join(WORKSPACE_DIR, "data"),
|
|
26
|
+
join(WORKSPACE_DIR, "data", "memory"),
|
|
27
|
+
join(WORKSPACE_DIR, "data", "logs"),
|
|
28
|
+
];
|
|
29
|
+
for (const dir of dirs) {
|
|
30
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function makeLoggerStub(): Record<string, unknown> {
|
|
35
|
+
const stub: Record<string, unknown> = {};
|
|
36
|
+
for (const m of [
|
|
37
|
+
"info",
|
|
38
|
+
"warn",
|
|
39
|
+
"error",
|
|
40
|
+
"debug",
|
|
41
|
+
"trace",
|
|
42
|
+
"fatal",
|
|
43
|
+
"silent",
|
|
44
|
+
"child",
|
|
45
|
+
]) {
|
|
46
|
+
stub[m] = m === "child" ? () => makeLoggerStub() : () => {};
|
|
47
|
+
}
|
|
48
|
+
return stub;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
mock.module("../../util/logger.js", () => ({
|
|
52
|
+
getLogger: () => makeLoggerStub(),
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
afterAll(() => {
|
|
56
|
+
mock.restore();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
import { setOverridesForTesting } from "../../__tests__/feature-flag-test-helpers.js";
|
|
60
|
+
import { invalidateConfigCache } from "../loader.js";
|
|
61
|
+
import { LLMSchema } from "../schemas/llm.js";
|
|
62
|
+
import { seedInferenceProfiles } from "../seed-inference-profiles.js";
|
|
63
|
+
import { reconcileFlagGatedProfiles } from "../sync-gated-profiles.js";
|
|
64
|
+
|
|
65
|
+
type RawConfig = {
|
|
66
|
+
llm: {
|
|
67
|
+
profiles: Record<string, Record<string, unknown>>;
|
|
68
|
+
profileOrder: string[];
|
|
69
|
+
activeProfile?: string;
|
|
70
|
+
advisorProfile?: string;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
function writeConfig(obj: unknown): void {
|
|
75
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function readConfig(): RawConfig {
|
|
79
|
+
return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function seedBalancedConfig(): void {
|
|
83
|
+
writeConfig({ llm: { default: { provider: "anthropic" } } });
|
|
84
|
+
invalidateConfigCache();
|
|
85
|
+
seedInferenceProfiles({});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
describe("reconcileFlagGatedProfiles", () => {
|
|
89
|
+
beforeEach(() => {
|
|
90
|
+
ensureTestDir();
|
|
91
|
+
if (existsSync(CONFIG_PATH)) rmSync(CONFIG_PATH, { force: true });
|
|
92
|
+
delete process.env.IS_PLATFORM;
|
|
93
|
+
setOverridesForTesting({});
|
|
94
|
+
invalidateConfigCache();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
afterEach(() => {
|
|
98
|
+
delete process.env.IS_PLATFORM;
|
|
99
|
+
setOverridesForTesting({});
|
|
100
|
+
invalidateConfigCache();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("flag on materializes the managed os-beta profile after balanced", () => {
|
|
104
|
+
process.env.IS_PLATFORM = "true";
|
|
105
|
+
seedBalancedConfig();
|
|
106
|
+
setOverridesForTesting({ "os-beta": true });
|
|
107
|
+
|
|
108
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
109
|
+
|
|
110
|
+
const raw = readConfig();
|
|
111
|
+
const osBeta = raw.llm.profiles["os-beta"]!;
|
|
112
|
+
expect(osBeta.model).toBe("accounts/fireworks/models/glm-5p2");
|
|
113
|
+
expect(osBeta.provider_connection).toBe("fireworks-managed");
|
|
114
|
+
expect(osBeta.source).toBe("managed");
|
|
115
|
+
expect(osBeta.label).toBe("OS Beta");
|
|
116
|
+
|
|
117
|
+
const order = raw.llm.profileOrder;
|
|
118
|
+
expect(order.indexOf("os-beta")).toBe(order.indexOf("balanced") + 1);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("flag on in BYOK mode seeds the os-beta profile disabled", () => {
|
|
122
|
+
seedBalancedConfig();
|
|
123
|
+
setOverridesForTesting({ "os-beta": true });
|
|
124
|
+
|
|
125
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
126
|
+
|
|
127
|
+
const osBeta = readConfig().llm.profiles["os-beta"]!;
|
|
128
|
+
expect(osBeta.status).toBe("disabled");
|
|
129
|
+
expect(osBeta.label).toBe("OS Beta (Managed)");
|
|
130
|
+
expect(osBeta.source).toBe("managed");
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("flag on is idempotent across repeated runs", () => {
|
|
134
|
+
process.env.IS_PLATFORM = "true";
|
|
135
|
+
seedBalancedConfig();
|
|
136
|
+
setOverridesForTesting({ "os-beta": true });
|
|
137
|
+
|
|
138
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
139
|
+
invalidateConfigCache();
|
|
140
|
+
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("flag on preserves user overrides on the managed profile", () => {
|
|
144
|
+
process.env.IS_PLATFORM = "true";
|
|
145
|
+
seedBalancedConfig();
|
|
146
|
+
setOverridesForTesting({ "os-beta": true });
|
|
147
|
+
reconcileFlagGatedProfiles();
|
|
148
|
+
|
|
149
|
+
const raw = readConfig();
|
|
150
|
+
raw.llm.profiles["os-beta"]!.label = "My OS Beta";
|
|
151
|
+
raw.llm.profiles["os-beta"]!.status = "disabled";
|
|
152
|
+
raw.llm.profiles["os-beta"]!.advisorEnabled = true;
|
|
153
|
+
writeConfig(raw);
|
|
154
|
+
invalidateConfigCache();
|
|
155
|
+
|
|
156
|
+
reconcileFlagGatedProfiles();
|
|
157
|
+
|
|
158
|
+
const after = readConfig().llm.profiles["os-beta"]!;
|
|
159
|
+
expect(after.label).toBe("My OS Beta");
|
|
160
|
+
expect(after.status).toBe("disabled");
|
|
161
|
+
expect(after.advisorEnabled).toBe(true);
|
|
162
|
+
expect(after.model).toBe("accounts/fireworks/models/glm-5p2");
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test("flag off removes a managed os-beta and applies fallbacks", () => {
|
|
166
|
+
process.env.IS_PLATFORM = "true";
|
|
167
|
+
seedBalancedConfig();
|
|
168
|
+
setOverridesForTesting({ "os-beta": true });
|
|
169
|
+
reconcileFlagGatedProfiles();
|
|
170
|
+
|
|
171
|
+
const raw = readConfig();
|
|
172
|
+
raw.llm.activeProfile = "os-beta";
|
|
173
|
+
raw.llm.advisorProfile = "os-beta";
|
|
174
|
+
writeConfig(raw);
|
|
175
|
+
invalidateConfigCache();
|
|
176
|
+
|
|
177
|
+
setOverridesForTesting({ "os-beta": false });
|
|
178
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
179
|
+
|
|
180
|
+
const after = readConfig();
|
|
181
|
+
expect(after.llm.profiles["os-beta"]).toBeUndefined();
|
|
182
|
+
expect(after.llm.profileOrder.includes("os-beta")).toBe(false);
|
|
183
|
+
expect(after.llm.activeProfile).toBe("balanced");
|
|
184
|
+
expect(after.llm.advisorProfile).toBe("quality-optimized");
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("flag off with no os-beta present is a no-op", () => {
|
|
188
|
+
process.env.IS_PLATFORM = "true";
|
|
189
|
+
seedBalancedConfig();
|
|
190
|
+
setOverridesForTesting({ "os-beta": false });
|
|
191
|
+
|
|
192
|
+
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("flag off scrubs os-beta from user mix arms, keeping >= 2-arm mixes", () => {
|
|
196
|
+
process.env.IS_PLATFORM = "true";
|
|
197
|
+
seedBalancedConfig();
|
|
198
|
+
setOverridesForTesting({ "os-beta": true });
|
|
199
|
+
reconcileFlagGatedProfiles();
|
|
200
|
+
|
|
201
|
+
const raw = readConfig();
|
|
202
|
+
raw.llm.profiles["my-mix"] = {
|
|
203
|
+
source: "user",
|
|
204
|
+
label: "My Mix",
|
|
205
|
+
mix: [
|
|
206
|
+
{ profile: "balanced", weight: 70 },
|
|
207
|
+
{ profile: "quality-optimized", weight: 20 },
|
|
208
|
+
{ profile: "os-beta", weight: 30 },
|
|
209
|
+
],
|
|
210
|
+
};
|
|
211
|
+
raw.llm.profileOrder.push("my-mix");
|
|
212
|
+
writeConfig(raw);
|
|
213
|
+
invalidateConfigCache();
|
|
214
|
+
|
|
215
|
+
setOverridesForTesting({ "os-beta": false });
|
|
216
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
217
|
+
|
|
218
|
+
const after = readConfig();
|
|
219
|
+
expect(after.llm.profiles["os-beta"]).toBeUndefined();
|
|
220
|
+
const mix = after.llm.profiles["my-mix"]!;
|
|
221
|
+
expect(mix.mix).toEqual([
|
|
222
|
+
{ profile: "balanced", weight: 70 },
|
|
223
|
+
{ profile: "quality-optimized", weight: 20 },
|
|
224
|
+
]);
|
|
225
|
+
expect(mix.source).toBe("user");
|
|
226
|
+
expect(mix.label).toBe("My Mix");
|
|
227
|
+
|
|
228
|
+
invalidateConfigCache();
|
|
229
|
+
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("flag off removes a two-arm mix that loses os-beta and repoints refs", () => {
|
|
233
|
+
process.env.IS_PLATFORM = "true";
|
|
234
|
+
seedBalancedConfig();
|
|
235
|
+
setOverridesForTesting({ "os-beta": true });
|
|
236
|
+
reconcileFlagGatedProfiles();
|
|
237
|
+
|
|
238
|
+
const raw = readConfig();
|
|
239
|
+
raw.llm.profiles["experiment"] = {
|
|
240
|
+
source: "user",
|
|
241
|
+
label: "Experiment",
|
|
242
|
+
mix: [
|
|
243
|
+
{ profile: "balanced", weight: 50 },
|
|
244
|
+
{ profile: "os-beta", weight: 50 },
|
|
245
|
+
],
|
|
246
|
+
};
|
|
247
|
+
raw.llm.profileOrder.push("experiment");
|
|
248
|
+
raw.llm.activeProfile = "experiment";
|
|
249
|
+
raw.llm.advisorProfile = "os-beta";
|
|
250
|
+
(raw.llm as Record<string, unknown>).callSites = {
|
|
251
|
+
mainAgent: { profile: "experiment" },
|
|
252
|
+
};
|
|
253
|
+
writeConfig(raw);
|
|
254
|
+
invalidateConfigCache();
|
|
255
|
+
|
|
256
|
+
setOverridesForTesting({ "os-beta": false });
|
|
257
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
258
|
+
|
|
259
|
+
const after = readConfig();
|
|
260
|
+
expect(after.llm.profiles["os-beta"]).toBeUndefined();
|
|
261
|
+
expect(after.llm.profiles["experiment"]).toBeUndefined();
|
|
262
|
+
expect(after.llm.profileOrder.includes("os-beta")).toBe(false);
|
|
263
|
+
expect(after.llm.profileOrder.includes("experiment")).toBe(false);
|
|
264
|
+
expect(after.llm.activeProfile).toBe("balanced");
|
|
265
|
+
expect(after.llm.advisorProfile).toBe("quality-optimized");
|
|
266
|
+
expect(
|
|
267
|
+
(
|
|
268
|
+
after.llm as unknown as Record<
|
|
269
|
+
string,
|
|
270
|
+
Record<string, Record<string, unknown>>
|
|
271
|
+
>
|
|
272
|
+
).callSites.mainAgent.profile,
|
|
273
|
+
).toBeUndefined();
|
|
274
|
+
|
|
275
|
+
expect(LLMSchema.safeParse(after.llm).success).toBe(true);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test("flag off shortens a three-arm mix to two surviving arms", () => {
|
|
279
|
+
process.env.IS_PLATFORM = "true";
|
|
280
|
+
seedBalancedConfig();
|
|
281
|
+
setOverridesForTesting({ "os-beta": true });
|
|
282
|
+
reconcileFlagGatedProfiles();
|
|
283
|
+
|
|
284
|
+
const raw = readConfig();
|
|
285
|
+
raw.llm.profiles["blend"] = {
|
|
286
|
+
source: "user",
|
|
287
|
+
label: "Blend",
|
|
288
|
+
mix: [
|
|
289
|
+
{ profile: "balanced", weight: 40 },
|
|
290
|
+
{ profile: "os-beta", weight: 30 },
|
|
291
|
+
{ profile: "quality-optimized", weight: 30 },
|
|
292
|
+
],
|
|
293
|
+
};
|
|
294
|
+
raw.llm.profileOrder.push("blend");
|
|
295
|
+
writeConfig(raw);
|
|
296
|
+
invalidateConfigCache();
|
|
297
|
+
|
|
298
|
+
setOverridesForTesting({ "os-beta": false });
|
|
299
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
300
|
+
|
|
301
|
+
const after = readConfig();
|
|
302
|
+
expect(after.llm.profiles["os-beta"]).toBeUndefined();
|
|
303
|
+
expect(after.llm.profiles["blend"]!.mix).toEqual([
|
|
304
|
+
{ profile: "balanced", weight: 40 },
|
|
305
|
+
{ profile: "quality-optimized", weight: 30 },
|
|
306
|
+
]);
|
|
307
|
+
|
|
308
|
+
expect(LLMSchema.safeParse(after.llm).success).toBe(true);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test("flag off clears a call-site profile reference to os-beta", () => {
|
|
312
|
+
process.env.IS_PLATFORM = "true";
|
|
313
|
+
seedBalancedConfig();
|
|
314
|
+
setOverridesForTesting({ "os-beta": true });
|
|
315
|
+
reconcileFlagGatedProfiles();
|
|
316
|
+
|
|
317
|
+
const raw = readConfig();
|
|
318
|
+
(raw.llm as Record<string, unknown>).callSites = {
|
|
319
|
+
advisor: { profile: "os-beta", temperature: 0.3 },
|
|
320
|
+
};
|
|
321
|
+
writeConfig(raw);
|
|
322
|
+
invalidateConfigCache();
|
|
323
|
+
|
|
324
|
+
setOverridesForTesting({ "os-beta": false });
|
|
325
|
+
expect(reconcileFlagGatedProfiles()).toBe(true);
|
|
326
|
+
|
|
327
|
+
const after = readConfig();
|
|
328
|
+
const advisor = (
|
|
329
|
+
after.llm as unknown as Record<
|
|
330
|
+
string,
|
|
331
|
+
Record<string, Record<string, unknown>>
|
|
332
|
+
>
|
|
333
|
+
).callSites.advisor;
|
|
334
|
+
expect(advisor.profile).toBeUndefined();
|
|
335
|
+
expect(advisor.temperature).toBe(0.3);
|
|
336
|
+
|
|
337
|
+
expect(LLMSchema.safeParse(after.llm).success).toBe(true);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
test("a user-owned os-beta profile is never touched", () => {
|
|
341
|
+
process.env.IS_PLATFORM = "true";
|
|
342
|
+
writeConfig({
|
|
343
|
+
llm: {
|
|
344
|
+
default: { provider: "anthropic" },
|
|
345
|
+
profiles: {
|
|
346
|
+
"os-beta": {
|
|
347
|
+
source: "user",
|
|
348
|
+
label: "Mine",
|
|
349
|
+
provider: "anthropic",
|
|
350
|
+
model: "claude-x",
|
|
351
|
+
provider_connection: "anthropic-personal",
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
profileOrder: ["os-beta"],
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
invalidateConfigCache();
|
|
358
|
+
const before = readFileSync(CONFIG_PATH, "utf-8");
|
|
359
|
+
|
|
360
|
+
setOverridesForTesting({ "os-beta": true });
|
|
361
|
+
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
362
|
+
expect(readFileSync(CONFIG_PATH, "utf-8")).toBe(before);
|
|
363
|
+
|
|
364
|
+
setOverridesForTesting({ "os-beta": false });
|
|
365
|
+
expect(reconcileFlagGatedProfiles()).toBe(false);
|
|
366
|
+
expect(readFileSync(CONFIG_PATH, "utf-8")).toBe(before);
|
|
367
|
+
});
|
|
368
|
+
});
|
|
@@ -103,7 +103,11 @@ function parseRegistryToDefaults(parsed: unknown): FeatureFlagDefaultsRegistry {
|
|
|
103
103
|
const entry = flag as Record<string, unknown>;
|
|
104
104
|
if (entry.scope !== "assistant" && entry.scope !== "both") continue;
|
|
105
105
|
if (typeof entry.key !== "string") continue;
|
|
106
|
-
if (
|
|
106
|
+
if (
|
|
107
|
+
typeof entry.defaultEnabled !== "boolean" &&
|
|
108
|
+
typeof entry.defaultEnabled !== "string"
|
|
109
|
+
)
|
|
110
|
+
continue;
|
|
107
111
|
|
|
108
112
|
result[entry.key as string] = {
|
|
109
113
|
defaultEnabled: entry.defaultEnabled,
|
|
@@ -178,6 +182,12 @@ const DEFAULT_INIT_RETRY_BACKOFFS_MS: readonly number[] = [
|
|
|
178
182
|
* tests preseed flag state via `setOverridesForTesting()` (in
|
|
179
183
|
* `__tests__/feature-flag-test-helpers.ts`) without the gateway IPC call
|
|
180
184
|
* clobbering their setup.
|
|
185
|
+
*
|
|
186
|
+
* Resolves `true` when the override cache is populated from the gateway and
|
|
187
|
+
* `false` when the cache is left unset (exhausted retries / unreachable
|
|
188
|
+
* gateway). Callers that mutate persisted state from flag values gate that
|
|
189
|
+
* work on a `true` result so a failed fetch never resolves a flag to its
|
|
190
|
+
* registry default and drops user state.
|
|
181
191
|
*/
|
|
182
192
|
export async function initFeatureFlagOverrides(options?: {
|
|
183
193
|
retryBackoffsMs?: readonly number[];
|
|
@@ -188,8 +198,8 @@ export async function initFeatureFlagOverrides(options?: {
|
|
|
188
198
|
* instead of blocking startup.
|
|
189
199
|
*/
|
|
190
200
|
callTimeoutMs?: number;
|
|
191
|
-
}): Promise<
|
|
192
|
-
if (isCachedFromGateway()) return;
|
|
201
|
+
}): Promise<boolean> {
|
|
202
|
+
if (isCachedFromGateway()) return true;
|
|
193
203
|
|
|
194
204
|
const backoffs = options?.retryBackoffsMs ?? DEFAULT_INIT_RETRY_BACKOFFS_MS;
|
|
195
205
|
const callTimeoutMs = options?.callTimeoutMs;
|
|
@@ -205,7 +215,7 @@ export async function initFeatureFlagOverrides(options?: {
|
|
|
205
215
|
// Re-check after the wait: a concurrent caller (e.g. a test using
|
|
206
216
|
// `setOverridesForTesting`) may have populated the cache while we
|
|
207
217
|
// were sleeping. Bail out so we don't clobber their setup.
|
|
208
|
-
if (isCachedFromGateway()) return;
|
|
218
|
+
if (isCachedFromGateway()) return true;
|
|
209
219
|
}
|
|
210
220
|
|
|
211
221
|
const gatewayOverrides = await fetchOverridesFromGateway(callTimeoutMs);
|
|
@@ -217,7 +227,7 @@ export async function initFeatureFlagOverrides(options?: {
|
|
|
217
227
|
"Feature flag overrides loaded from gateway after retry",
|
|
218
228
|
);
|
|
219
229
|
}
|
|
220
|
-
return;
|
|
230
|
+
return true;
|
|
221
231
|
}
|
|
222
232
|
}
|
|
223
233
|
|
|
@@ -230,6 +240,7 @@ export async function initFeatureFlagOverrides(options?: {
|
|
|
230
240
|
"Feature flag overrides empty after all retries; falling back to registry defaults and fail-closed undeclared flags",
|
|
231
241
|
);
|
|
232
242
|
}
|
|
243
|
+
return false;
|
|
233
244
|
}
|
|
234
245
|
|
|
235
246
|
/**
|
|
@@ -262,10 +273,14 @@ export function clearFeatureFlagOverridesCache(): void {
|
|
|
262
273
|
* retries (the gateway is known to be up because it just pushed an event).
|
|
263
274
|
* Called by the gateway flag listener when a `feature_flags_changed` event
|
|
264
275
|
* arrives.
|
|
276
|
+
*
|
|
277
|
+
* Resolves `true` when the cache was repopulated from the gateway, `false`
|
|
278
|
+
* when the fetch came back empty/failed — callers gate persisted-state
|
|
279
|
+
* reconciliation on a `true` result.
|
|
265
280
|
*/
|
|
266
|
-
export async function refreshOverridesFromGateway(): Promise<
|
|
281
|
+
export async function refreshOverridesFromGateway(): Promise<boolean> {
|
|
267
282
|
clearFeatureFlagOverridesCache();
|
|
268
|
-
|
|
283
|
+
return initFeatureFlagOverrides({ retryBackoffsMs: [] });
|
|
269
284
|
}
|
|
270
285
|
|
|
271
286
|
// ---------------------------------------------------------------------------
|
|
@@ -18,7 +18,6 @@ function formatContactSummary(c: ContactWithChannels): string {
|
|
|
18
18
|
.map((ch) => {
|
|
19
19
|
let s = `${ch.type}:${ch.address}${ch.isPrimary ? "*" : ""}`;
|
|
20
20
|
const extras: string[] = [];
|
|
21
|
-
if (ch.externalUserId) extras.push(`userId: ${ch.externalUserId}`);
|
|
22
21
|
if (ch.externalChatId) extras.push(`chatId: ${ch.externalChatId}`);
|
|
23
22
|
if (extras.length > 0) s += ` (${extras.join(", ")})`;
|
|
24
23
|
return s;
|
|
@@ -33,13 +33,13 @@ Write and edit long-form documents using the built-in rich text editor. Document
|
|
|
33
33
|
|
|
34
34
|
This is the default path when the user asks you to write something.
|
|
35
35
|
|
|
36
|
-
1. **Create the document**: Call `document_create` with a title (inferred from the request). Call the tool immediately, not after conversational preamble.
|
|
36
|
+
1. **Create the document**: Call `document_create` with a title (inferred from the request). Call the tool immediately, not after conversational preamble.
|
|
37
37
|
2. **Write content in Markdown**: Use proper structure (`#` for titles, `##` for sections), **bold**, _italic_, code blocks, tables, lists, blockquotes as appropriate.
|
|
38
|
-
3. **CRITICAL - Stream content in chunks**: Call `document_update` MULTIPLE times, not just once. Break content into logical chunks (paragraphs, sections, or every 200-300 words). Call `document_update` with `mode: "append"` for EACH chunk separately. The user experiences real-time content appearing as you write.
|
|
38
|
+
3. **CRITICAL - Stream content in chunks**: Call `document_update` MULTIPLE times, not just once. Break content into logical chunks (paragraphs, sections, or every 200-300 words). Call `document_update` with `mode: "append"` for EACH chunk separately. When you are streaming into the document you just created, `surface_id` is optional — omit it and pass only `content`, and the update targets that document. The user experiences real-time content appearing as you write.
|
|
39
39
|
|
|
40
40
|
### Recovering from a failed update
|
|
41
41
|
|
|
42
|
-
If a `document_update` call fails with an `Invalid input` error
|
|
42
|
+
If a `document_update` call fails with an `Invalid input` error, do NOT call `document_create` again — that produces a duplicate for the user. The most common cause is a missing `content` field: resend the call with the chunk's Markdown in `content`. You can omit `surface_id` to target the document you are currently writing; pass it explicitly only when editing a different existing document.
|
|
43
43
|
|
|
44
44
|
## Editing an existing document
|
|
45
45
|
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"properties": {
|
|
51
51
|
"surface_id": {
|
|
52
52
|
"type": "string",
|
|
53
|
-
"description": "The ID of the document surface to update"
|
|
53
|
+
"description": "The ID of the document surface to update. Optional — when omitted, the most recently updated document in this conversation is used, so streaming successive chunks needs only `content`."
|
|
54
54
|
},
|
|
55
55
|
"content": {
|
|
56
56
|
"type": "string",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"description": "Whether to replace all content or append to the end. Defaults to append."
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
-
"required": ["
|
|
65
|
+
"required": ["content"]
|
|
66
66
|
},
|
|
67
67
|
"executor": "tools/document-update.ts",
|
|
68
68
|
"execution_target": "host"
|
|
@@ -28,6 +28,8 @@ When the user mentions "email" - sending, reading, checking, decluttering, draft
|
|
|
28
28
|
|
|
29
29
|
Do not offer the assistant's own email as an option unless the user specifically asks. If Gmail and Outlook are not connected, guide them through setup.
|
|
30
30
|
|
|
31
|
+
Reading, searching, or summarizing the user's inbox is a **messaging task** — use the messaging tools (or the Gmail connection flow below if nothing is connected). Never run `assistant channels` commands for a mailbox request: channels are the assistant's own inbound delivery routes, not the user's mailbox, and inspecting them sends you down the wrong path.
|
|
32
|
+
|
|
31
33
|
When a platform is connected (auth test succeeds), always use the messaging API tools for that platform. Never fall back to browser automation, shell commands (bash, curl), or any other approach for operations that messaging tools can handle. The messaging tools handle authentication internally - never try to access tokens or call APIs directly. Browser automation is only appropriate for initial credential setup (OAuth consent screens), not for day-to-day messaging operations.
|
|
32
34
|
|
|
33
35
|
**Exception: Slack.** Slack messaging should use the Slack Web API directly via CLI, not messaging tools. See the **slack** skill for details.
|
|
@@ -50,13 +52,13 @@ When the user asks to "connect my email", "set up email", "manage my email", or
|
|
|
50
52
|
|
|
51
53
|
### Gmail
|
|
52
54
|
|
|
53
|
-
1. **
|
|
54
|
-
2. **If no connections are found:**
|
|
55
|
+
1. **Check the connection.** Run `assistant oauth status google`. If a connection exists, the user is ready to go — proceed with their request.
|
|
56
|
+
2. **If no connections are found, render the connect button in one step:** call `ui_show` with `surface_type: "oauth_connect"` and `data.providerKey: "google"`. That surface is always available — do **not** run `assistant channels`, `oauth providers get`, or load `vellum-oauth-integrations` just to display the button, and do **not** fall back to `assistant oauth connect`. Only load `vellum-oauth-integrations` when the managed-vs-your-own-credentials decision genuinely needs handling (e.g. a BYOK setup where the managed connect surface isn't available).
|
|
55
57
|
|
|
56
58
|
### Outlook
|
|
57
59
|
|
|
58
|
-
1. **
|
|
59
|
-
2. **If no connections are found:**
|
|
60
|
+
1. **Check the connection.** Run `assistant oauth status outlook`. If a connection exists, the user is ready to go — proceed with their request.
|
|
61
|
+
2. **If no connections are found, render the connect button in one step:** call `ui_show` with `surface_type: "oauth_connect"` and `data.providerKey: "outlook"`. The same rules as Gmail apply — don't probe further or load a setup skill just to show the button; only load `vellum-oauth-integrations` when a managed-vs-your-own-credentials decision genuinely needs handling.
|
|
60
62
|
|
|
61
63
|
### Slack
|
|
62
64
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isArchiveBySenderAuthorized } from "../../../../runtime/effective-capabilities.js";
|
|
1
2
|
import type {
|
|
2
3
|
ToolContext,
|
|
3
4
|
ToolExecutionResult,
|
|
@@ -8,14 +9,14 @@ export async function run(
|
|
|
8
9
|
input: Record<string, unknown>,
|
|
9
10
|
context: ToolContext,
|
|
10
11
|
): Promise<ToolExecutionResult> {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
) {
|
|
12
|
+
const authorized = isArchiveBySenderAuthorized({
|
|
13
|
+
trustClass: context.trustClass,
|
|
14
|
+
triggeredBySurfaceAction: context.triggeredBySurfaceAction,
|
|
15
|
+
batchAuthorizedByTask: context.batchAuthorizedByTask,
|
|
16
|
+
approvedViaPrompt: context.approvedViaPrompt,
|
|
17
|
+
userApproved: input.user_approved === true,
|
|
18
|
+
});
|
|
19
|
+
if (!authorized) {
|
|
19
20
|
return err(
|
|
20
21
|
"This tool requires either a surface action or a scheduled task run with this tool in required_tools. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
|
|
21
22
|
);
|
|
@@ -71,6 +71,10 @@ Only the parent conversation that spawned a subagent can interact with it (check
|
|
|
71
71
|
|
|
72
72
|
Set `send_result_to_user: false` when spawning a subagent whose result is for internal processing only. The parent will still be notified on completion, but the notification will instruct it to read the result without presenting it to the user.
|
|
73
73
|
|
|
74
|
+
## Inference Profile
|
|
75
|
+
|
|
76
|
+
Set `inference_profile` to an `llm.profiles` key when a subagent should run under a specific model profile. When omitted, the subagent inherits the parent turn's active profile if one exists; otherwise it uses the `subagentSpawn` call site's default model selection.
|
|
77
|
+
|
|
74
78
|
## Fork Mode
|
|
75
79
|
|
|
76
80
|
Forks are sub-agents that inherit the parent's full context -- messages, system prompt, and memory -- sharing the KV cache for near-free context inheritance. Use forks when the task benefits from knowing what you've been discussing; use a regular sub-agent when the task is self-contained.
|
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
"investigator"
|
|
40
40
|
],
|
|
41
41
|
"description": "Agent specialization that controls tool access. 'researcher': read-only (web, files, memory). 'coder': file and bash access. 'planner': read-only analysis. 'investigator': root-cause analysis — debugging, log forensics, tracing behavior across many files; has bash for read-only investigation (grep/find/log inspection) and returns a compact root-cause report. 'general': full access (default). Ignored when fork: true (forks always use general)."
|
|
42
|
+
},
|
|
43
|
+
"inference_profile": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Optional llm.profiles key this subagent should run under. When omitted, the subagent inherits the parent turn's profile when one is active; otherwise it uses the subagentSpawn call site's default model selection."
|
|
42
46
|
}
|
|
43
47
|
},
|
|
44
48
|
"required": ["label", "objective"]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: system-storage-cleanup
|
|
3
|
+
description: "Handle disk pressure, critically low storage, safe storage limits, and storage cleanup mode by inspecting disk usage and proposing safe cleanup steps."
|
|
4
|
+
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "\U0001F9F9"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "System Storage Cleanup"
|
|
9
|
+
category: "system"
|
|
10
|
+
activation-hints:
|
|
11
|
+
- "Critical disk usage or disk-pressure lock is blocking normal work"
|
|
12
|
+
- "The assistant is in storage cleanup mode or normal work is suspended due to low storage"
|
|
13
|
+
- "User asks to inspect large files or find what is using disk space"
|
|
14
|
+
- "User asks to free workspace storage safely"
|
|
15
|
+
- "User asks to delete caches, logs, temp files, Docker artifacts, or other storage safely"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
You are operating under a critical storage cleanup contract. Your only goal is to free enough storage for the assistant to resume normal work without damaging user data.
|
|
19
|
+
|
|
20
|
+
## Cleanup Contract
|
|
21
|
+
|
|
22
|
+
Start by warning the user that storage is critically low and normal work is suspended until storage cleanup mode clears. Stay scoped to freeing storage until the disk-pressure lock clears or the guardian explicitly overrides it.
|
|
23
|
+
|
|
24
|
+
Prefer foreground inspection with available cleanup-safe tools before any mutation. Identify both the target volume that is actually full and the workspace path before proposing deletions. Do not work on unrelated tasks, refactors, installs, upgrades, or product changes while the storage lock is active.
|
|
25
|
+
|
|
26
|
+
Ask for explicit approval before deleting files, caches, logs, package caches, Docker artifacts, or any other data unless the user has already approved that exact action. Before asking, present each proposed deletion with:
|
|
27
|
+
|
|
28
|
+
- Exact path or artifact name.
|
|
29
|
+
- Estimated reclaimable size.
|
|
30
|
+
- Expected consequence, including whether it is regenerable or may remove user-visible history.
|
|
31
|
+
|
|
32
|
+
If the user approves a broad category, narrow it to exact paths or artifacts before deleting. If the user approves one exact path, do not treat that as approval for adjacent paths.
|
|
33
|
+
|
|
34
|
+
Never delete credentials, security material, workspace database files, config files, active profiler runs, migrations, skill source, app source, conversation records, memory graph nodes or segments, `journal/`, `data/reflections/`, PKB files, backups, or backup keys unless the user explicitly names that path and accepts the consequence.
|
|
35
|
+
|
|
36
|
+
## Inspection Procedure
|
|
37
|
+
|
|
38
|
+
Use local/container-visible inspection first. Prefer `df -h` on the current workspace path and on `VELLUM_WORKSPACE_DIR` when that variable is available. In Docker/container mode, `/workspace` is the persistent volume and cleanup should normally focus there.
|
|
39
|
+
|
|
40
|
+
Use `du` one level at a time and sort by size to identify large directories before drilling deeper. Keep each pass readable and bounded to the volume or workspace that is actually full. Avoid whole-filesystem scans unless the target volume cannot be isolated.
|
|
41
|
+
|
|
42
|
+
Use `host_bash` only when the sandbox cannot see the volume that is actually full and host-level inspection is necessary. Explain why host-level inspection is needed before using it.
|
|
43
|
+
|
|
44
|
+
## SQLite Diagnosis Only
|
|
45
|
+
|
|
46
|
+
If `data/db/assistant.db` dominates disk usage, inspect it only through read-only `sqlite3` access. Diagnostics may use `PRAGMA` and `SELECT` queries for:
|
|
47
|
+
|
|
48
|
+
- `page_size`
|
|
49
|
+
- `page_count`
|
|
50
|
+
- `freelist_count`
|
|
51
|
+
- `dbstat` object-size breakdowns
|
|
52
|
+
|
|
53
|
+
The purpose is to determine whether growth comes from specific tables/indexes or from free-page bloat. Do not edit the database manually.
|
|
54
|
+
|
|
55
|
+
Never run ad hoc `DELETE`, `UPDATE`, `INSERT`, `DROP`, `REINDEX`, schema changes, `VACUUM`, `PRAGMA writable_schema`, or any other mutating SQLite command from this skill. If SQLite tables are the main culprit, tell the user this needs product-owned retention or maintenance work rather than manual database editing.
|
|
56
|
+
|
|
57
|
+
## Safer Cleanup Candidates
|
|
58
|
+
|
|
59
|
+
Good candidates to inspect and propose, when they are clearly nonessential and user-approved, include:
|
|
60
|
+
|
|
61
|
+
- Scratch or temporary downloads created by the assistant.
|
|
62
|
+
- Generated build artifacts.
|
|
63
|
+
- Old logs.
|
|
64
|
+
- Stale temporary directories.
|
|
65
|
+
- Completed profiler runs that are no longer active.
|
|
66
|
+
- Stale caches.
|
|
67
|
+
- Large old diagnostic text attachments such as spindumps.
|
|
68
|
+
- Package cache cleanup or Docker cache/artifact cleanup after the user approves the exact package manager or Docker action.
|
|
69
|
+
|
|
70
|
+
Treat source files, persistent records, and user-authored content as protected unless the user explicitly names them for deletion and accepts the consequence.
|
|
71
|
+
|
|
72
|
+
## Non-Goals
|
|
73
|
+
|
|
74
|
+
ATL-450 product work is out of scope for this skill. Do not implement configurable trace or audit retention jobs, attachment retention or compression jobs, upload-time image re-encoding, first-class disk-usage UI, one-click cleanup buttons, or scheduled SQLite vacuuming. If inspection shows those are needed, report that as follow-up product work after the immediate storage cleanup path is safe.
|