@vellumai/assistant 0.8.12 → 0.9.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +0 -14
- package/ARCHITECTURE.md +45 -45
- package/README.md +1 -1
- package/bun.lock +200 -154
- package/docs/architecture/integrations.md +3 -3
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/security.md +10 -10
- package/docs/runbook-trusted-contacts.md +12 -12
- package/docs/skills.md +6 -6
- package/docs/workflows-testing.md +221 -0
- package/docs/workflows.md +510 -0
- package/examples/plugins/echo/README.md +5 -5
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +105 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +12 -0
- package/openapi.yaml +7197 -5708
- package/package.json +8 -4
- package/scripts/generate-openapi.ts +66 -114
- package/src/__tests__/access-request-seed-content-blocks.test.ts +213 -0
- package/src/__tests__/adaptive-thinking-repair.test.ts +32 -3
- package/src/__tests__/agent-loop-output-hooks.test.ts +183 -0
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +506 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +77 -0
- package/src/__tests__/app-compiler.test.ts +7 -1
- package/src/__tests__/app-dir-path-guard.test.ts +27 -3
- package/src/__tests__/app-executors.test.ts +43 -0
- package/src/__tests__/approval-cascade.test.ts +0 -5
- package/src/__tests__/approval-routes-http.test.ts +91 -0
- package/src/__tests__/assistant-stream-state.test.ts +107 -0
- package/src/__tests__/browser-fill-credential.test.ts +3 -3
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +1 -1
- package/src/__tests__/compaction-events.test.ts +63 -7
- package/src/__tests__/compaction-trail-store.test.ts +74 -1
- package/src/__tests__/compaction.benchmark.test.ts +63 -41
- package/src/__tests__/compactor-low-watermark-cut.test.ts +349 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +64 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -5
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -5
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-process-callsite.test.ts +0 -5
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -5
- package/src/__tests__/conversation-queue.test.ts +0 -5
- package/src/__tests__/conversation-slash-queue.test.ts +0 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -5
- package/src/__tests__/conversation-speed-override.test.ts +0 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +97 -0
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +67 -0
- package/src/__tests__/conversation-usage.test.ts +2 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -5
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -5
- package/src/__tests__/credential-broker-browser-fill.test.ts +2 -2
- package/src/__tests__/credential-broker-server-use.test.ts +2 -2
- package/src/__tests__/credential-broker.test.ts +1 -1
- package/src/__tests__/credential-prompt-route.test.ts +417 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault.test.ts +37 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +24 -0
- package/src/__tests__/dynamic-page-surface.test.ts +219 -0
- package/src/__tests__/empty-state-greeting-cache.test.ts +94 -0
- package/src/__tests__/gateway-flag-listener.test.ts +24 -7
- package/src/__tests__/guardian-action-sweep.test.ts +56 -219
- package/src/__tests__/guardian-routing-invariants.test.ts +138 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
- package/src/__tests__/list-messages-hidden-metadata.test.ts +99 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +87 -1
- package/src/__tests__/llm-resolver.test.ts +115 -0
- package/src/__tests__/managed-profile-guard.test.ts +6 -5
- package/src/__tests__/max-tokens-continue-hook.test.ts +184 -0
- package/src/__tests__/media-generate-image.test.ts +20 -9
- package/src/__tests__/mock-gateway-ipc.ts +23 -0
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/normalize-onboarding.test.ts +26 -0
- package/src/__tests__/notification-decision-strategy.test.ts +4 -2
- package/src/__tests__/notification-telegram-adapter.test.ts +21 -3
- package/src/__tests__/pending-interactions-resolved-event.test.ts +62 -0
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +72 -18
- package/src/__tests__/require-fresh-approval.test.ts +425 -1
- package/src/__tests__/resolve-app-id.test.ts +56 -0
- package/src/__tests__/runtime-events-sse-parity.test.ts +2 -0
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +408 -0
- package/src/__tests__/schedule-routes.test.ts +257 -4
- package/src/__tests__/schedule-store.test.ts +60 -0
- package/src/__tests__/schedule-tools.test.ts +247 -2
- package/src/__tests__/skill-execute-input.test.ts +85 -0
- package/src/__tests__/skill-secret-handling-guard.test.ts +21 -20
- package/src/__tests__/skills.test.ts +3 -3
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +1 -1
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +547 -0
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/task-progress-nudge-hook.test.ts +372 -0
- package/src/__tests__/task-scheduler.test.ts +299 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +209 -0
- package/src/__tests__/tool-result-spool.test.ts +3 -1
- package/src/__tests__/workspace-migration-102-preserve-heartbeat-enabled-for-existing-workspaces.test.ts +181 -0
- package/src/__tests__/workspace-migration-103-upgrade-quality-profile-to-opus-4-8.test.ts +174 -0
- package/src/agent/compaction-circuit.ts +11 -0
- package/src/agent/loop.ts +181 -12
- package/src/api/constants/call-sites.ts +12 -0
- package/src/api/events/assistant-thinking-delta.ts +10 -0
- package/src/api/events/usage-update.ts +7 -0
- package/src/api/index.ts +4 -1
- package/src/api/responses/memory-v3-selection-log.ts +18 -11
- package/src/approvals/approval-primitive.ts +2 -2
- package/src/background-wake/background-wake-routes.test.ts +5 -2
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +0 -1
- package/src/calls/call-domain.ts +1 -1
- package/src/calls/guardian-action-sweep.ts +16 -93
- package/src/cli/AGENTS.md +4 -0
- package/src/cli/commands/__tests__/schedules.test.ts +430 -1
- package/src/cli/commands/credentials.ts +28 -24
- package/src/cli/commands/image-generation.ts +23 -9
- package/src/cli/commands/notifications.ts +1 -1
- package/src/cli/commands/plugins.ts +89 -46
- package/src/cli/commands/schedules.ts +384 -11
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +69 -5
- package/src/cli/lib/__tests__/install-from-github.test.ts +15 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +81 -4
- package/src/cli/lib/inspect-plugin.ts +62 -1
- package/src/cli/lib/install-from-github.ts +52 -5
- package/src/cli/lib/upgrade-plugin.ts +18 -0
- package/src/config/__tests__/workflows-schema.test.ts +60 -0
- package/src/config/bundled-skills/acp/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -1
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +6 -1
- package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +7 -1
- package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +7 -1
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +10 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +66 -19
- package/src/config/bundled-skills/image-studio/TOOLS.json +1 -6
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +22 -3
- package/src/config/bundled-skills/personal-page/SKILL.md +57 -0
- package/src/config/bundled-skills/personal-page/TOOLS.json +27 -0
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +17 -0
- package/src/config/bundled-skills/schedule/SKILL.md +7 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +48 -4
- package/src/config/bundled-skills/workflows/SKILL.md +214 -0
- package/src/config/bundled-skills/workflows/TOOLS.json +84 -0
- package/src/config/bundled-skills/workflows/tools/manage-workflows.ts +12 -0
- package/src/config/bundled-skills/workflows/tools/run-workflow.ts +12 -0
- package/src/config/bundled-tool-registry.ts +14 -2
- package/src/config/call-site-defaults.ts +5 -0
- package/src/config/feature-flag-registry.json +12 -4
- package/src/config/llm-context-resolution.ts +8 -0
- package/src/config/llm-resolver.ts +30 -0
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +22 -0
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +16 -0
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +77 -0
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +57 -0
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +28 -0
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +234 -0
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +48 -0
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +16 -0
- package/src/config/preloaded-apps/personal-page/src/index.html +20 -0
- package/src/config/preloaded-apps/personal-page/src/main.tsx +7 -0
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +82 -0
- package/src/config/preloaded-apps/personal-page/src/styles.css +759 -0
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/heartbeat.ts +4 -1
- package/src/config/schemas/llm.ts +33 -26
- package/src/config/schemas/memory-retrospective.ts +19 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/services.ts +5 -2
- package/src/config/schemas/workflows.ts +42 -0
- package/src/config/skills.ts +3 -3
- package/src/context/compactor.ts +273 -39
- package/src/context/post-turn-tool-result-truncation.ts +23 -6
- package/src/context/tool-result-spool.ts +12 -17
- package/src/credential-execution/executable-discovery.ts +1 -1
- package/src/credential-execution/process-manager.ts +37 -3
- package/src/credential-execution/prompted-credential.ts +205 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +14 -0
- package/src/daemon/conversation-process.ts +11 -2
- package/src/daemon/conversation-surfaces.ts +167 -3
- package/src/daemon/conversation-tool-setup.ts +103 -26
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +115 -11
- package/src/daemon/handlers/shared.ts +26 -14
- package/src/daemon/host-cu-proxy.ts +15 -12
- package/src/daemon/host-file-proxy.ts +15 -12
- package/src/daemon/host-transfer-proxy.ts +30 -24
- package/src/daemon/lifecycle.ts +40 -3
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/messages.ts +2 -10
- package/src/daemon/message-types/workflows.ts +49 -0
- package/src/daemon/parse-actual-tokens-from-error.test.ts +62 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +43 -4
- package/src/daemon/process-message.ts +6 -0
- package/src/daemon/tool-setup-types.ts +57 -0
- package/src/daemon/wake-conversation-ops.ts +18 -0
- package/src/heartbeat/heartbeat-run-store.ts +8 -2
- package/src/home/feed-types.ts +1 -1
- package/src/ipc/gateway-flag-listener.ts +28 -6
- package/src/mcp/mcp-auth-state.ts +8 -20
- package/src/media/__tests__/image-models.test.ts +57 -0
- package/src/media/image-models.ts +66 -0
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +38 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +12 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +911 -34
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +227 -5
- package/src/memory/__tests__/memory-retrospective-state.test.ts +195 -0
- package/src/memory/__tests__/preloaded-apps.test.ts +85 -0
- package/src/memory/auto-analysis-enqueue.ts +14 -1
- package/src/memory/compaction-log-store-clickhouse.ts +6 -4
- package/src/memory/conversation-crud.ts +9 -2
- package/src/memory/conversation-disk-view.ts +1 -1
- package/src/memory/conversation-queries.ts +22 -7
- package/src/memory/db-init.ts +20 -0
- package/src/memory/db-maintenance.ts +16 -0
- package/src/memory/embedding-runtime-manager.ts +1 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +112 -14
- package/src/memory/llm-request-log-source-local.ts +19 -1
- package/src/memory/llm-request-log-source.ts +35 -6
- package/src/memory/llm-request-log-store.ts +90 -2
- package/src/memory/memory-retrospective-constants.ts +9 -0
- package/src/memory/memory-retrospective-enqueue.ts +3 -6
- package/src/memory/memory-retrospective-fork-boundary.ts +94 -0
- package/src/memory/memory-retrospective-job.ts +500 -208
- package/src/memory/memory-retrospective-startup-cleanup.ts +97 -19
- package/src/memory/memory-retrospective-state.ts +85 -2
- package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +40 -0
- package/src/memory/migrations/282-schedule-inference-profile.test.ts +77 -0
- package/src/memory/migrations/282-schedule-inference-profile.ts +26 -0
- package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +102 -0
- package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.ts +53 -0
- package/src/memory/migrations/284-workflow-runs.ts +51 -0
- package/src/memory/migrations/285-schedule-workflow-mode.ts +26 -0
- package/src/memory/migrations/286-workflow-run-trust.ts +27 -0
- package/src/memory/migrations/287-conversation-origin-channel-index.ts +15 -0
- package/src/memory/migrations/288-backfill-origin-channel-from-bindings.ts +43 -0
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +115 -0
- package/src/memory/migrations/290-schedule-capabilities.test.ts +77 -0
- package/src/memory/migrations/290-schedule-capabilities.ts +25 -0
- package/src/memory/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +96 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +571 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/preloaded-apps.ts +116 -0
- package/src/memory/schema/infrastructure.ts +4 -0
- package/src/memory/schema/memory-core.ts +4 -0
- package/src/memory/v2/__tests__/concept-page-frontmatter-schema.test.ts +45 -0
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +11 -7
- package/src/memory/v2/__tests__/page-store.test.ts +13 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +24 -0
- package/src/memory/v2/frontmatter-sweep.ts +7 -6
- package/src/memory/v2/page-store.ts +4 -3
- package/src/memory/v2/qdrant.ts +42 -3
- package/src/memory/v2/types.ts +16 -10
- package/src/messaging/draft-store.ts +1 -1
- package/src/notifications/access-request-copy.ts +200 -113
- package/src/notifications/adapters/slack.ts +250 -111
- package/src/notifications/adapters/telegram.ts +7 -44
- package/src/notifications/approval-card-builder.ts +93 -0
- package/src/notifications/broadcaster.ts +74 -0
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/copy-composer.ts +32 -26
- package/src/notifications/decision-engine.ts +59 -7
- package/src/notifications/guardian-question-mode.ts +145 -155
- package/src/notifications/home-feed-side-effect.ts +28 -11
- package/src/notifications/notification-utils.ts +66 -0
- package/src/notifications/signal.ts +6 -0
- package/src/notifications/tool-approval-copy.ts +142 -0
- package/src/notifications/types.ts +19 -0
- package/src/permissions/threshold.ts +11 -0
- package/src/plugin-api/types.ts +16 -4
- package/src/plugins/defaults/compaction/window-manager.ts +44 -0
- package/src/plugins/defaults/index.ts +46 -0
- package/src/plugins/defaults/max-tokens-continue/continue-state-store.ts +53 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +80 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/stop.ts +20 -0
- package/src/plugins/defaults/max-tokens-continue/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/hooks/__tests__/user-prompt-submit.test.ts +37 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +29 -1
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +8 -3
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +4 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +28 -18
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +67 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +122 -22
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +2 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +63 -1
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +61 -18
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +1 -1
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +39 -10
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +34 -1
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +112 -47
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +78 -15
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +206 -0
- package/src/plugins/defaults/task-progress-nudge/package.json +15 -0
- package/src/prompts/__tests__/system-prompt.test.ts +100 -1
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +5 -7
- package/src/prompts/normalize-onboarding.ts +2 -0
- package/src/prompts/persona-resolver.ts +3 -0
- package/src/prompts/system-prompt.ts +51 -2
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +3 -1
- package/src/prompts/templates/system-sections.ts +8 -3
- package/src/providers/call-site-routing.ts +6 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/inference/auth.ts +52 -46
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/__tests__/coerce-object-args.test.ts +105 -0
- package/src/providers/openai/chat-completions-provider.ts +47 -9
- package/src/providers/openai/coerce-object-args.ts +104 -0
- package/src/providers/retry.ts +8 -5
- package/src/providers/types.ts +10 -0
- package/src/runtime/__tests__/agent-wake.test.ts +629 -7
- package/src/runtime/access-request-helper.ts +16 -9
- package/src/runtime/agent-wake.ts +302 -51
- package/src/runtime/assistant-stream-state.ts +141 -8
- package/src/runtime/background-job-runner.ts +9 -0
- package/src/runtime/channel-approval-types.ts +1 -0
- package/src/runtime/channel-invite-transports/telegram.ts +6 -5
- package/src/runtime/channel-invite-transports/voice.ts +2 -2
- package/src/runtime/channel-invite-types.ts +4 -2
- package/src/runtime/channel-retry-sweep.ts +19 -41
- package/src/runtime/finalize-event-delivery.ts +72 -0
- package/src/runtime/guardian-action-message-composer.ts +0 -54
- package/src/runtime/http-server.ts +6 -14
- package/src/runtime/http-types.ts +0 -1
- package/src/runtime/message-composer-types.ts +0 -9
- package/src/runtime/middleware/__tests__/rate-limiter.test.ts +63 -0
- package/src/runtime/middleware/auth.ts +27 -3
- package/src/runtime/middleware/rate-limiter.ts +28 -1
- package/src/runtime/migrations/vbundle-builder.ts +6 -5
- package/src/runtime/pending-interactions.ts +20 -1
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +232 -173
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +18 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +11 -0
- package/src/runtime/routes/approval-routes.ts +35 -8
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -1
- package/src/runtime/routes/btw-routes.ts +37 -1
- package/src/runtime/routes/channel-delivery-routes.ts +11 -7
- package/src/runtime/routes/channel-route-definitions.ts +3 -0
- package/src/runtime/routes/channel-route-shared.ts +3 -1
- package/src/runtime/routes/consolidation-routes.ts +17 -13
- package/src/runtime/routes/conversation-compaction-routes.ts +159 -119
- package/src/runtime/routes/conversation-list-routes.ts +41 -4
- package/src/runtime/routes/conversation-query-routes.ts +196 -11
- package/src/runtime/routes/conversation-routes.ts +15 -1
- package/src/runtime/routes/credential-prompt-routes.ts +39 -17
- package/src/runtime/routes/empty-state-greeting-cache.ts +65 -0
- package/src/runtime/routes/heartbeat-routes.ts +18 -13
- package/src/runtime/routes/image-generation-routes.ts +20 -2
- package/src/runtime/routes/inbound-message-handler.ts +13 -12
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +32 -31
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +7 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +7 -21
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +6 -15
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +1 -1
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/log-export/AGENTS.md +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +5 -9
- package/src/runtime/routes/plugins-routes.ts +26 -0
- package/src/runtime/routes/ps-routes.ts +10 -8
- package/src/runtime/routes/retrospective-routes.ts +235 -0
- package/src/runtime/routes/runs-pagination.ts +75 -0
- package/src/runtime/routes/schedule-routes.ts +367 -59
- package/src/runtime/routes/sounds-config-routes.ts +239 -0
- package/src/runtime/routes/surface-action-routes.ts +84 -4
- package/src/runtime/routes/workflow-routes.test.ts +372 -0
- package/src/runtime/routes/workflow-routes.ts +363 -0
- package/src/runtime/routes/workspace-routes.test.ts +61 -1
- package/src/runtime/routes/workspace-routes.ts +26 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +38 -0
- package/src/runtime/services/analyze-conversation.ts +26 -13
- package/src/schedule/inference-profile.ts +28 -0
- package/src/schedule/schedule-store.ts +152 -4
- package/src/schedule/scheduler-types.ts +6 -0
- package/src/schedule/scheduler.ts +96 -0
- package/src/security/secret-allowlist.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/tools/apps/executors.ts +23 -0
- package/src/tools/apps/resolve-app-id.ts +42 -0
- package/src/tools/browser/browser-execution.ts +9 -11
- package/src/tools/credentials/broker.ts +4 -4
- package/src/tools/credentials/vault.ts +26 -137
- package/src/tools/executor.ts +69 -0
- package/src/tools/flag-gated-tools.test.ts +76 -0
- package/src/tools/permission-checker.ts +8 -1
- package/src/tools/registry.ts +51 -0
- package/src/tools/schedule/create.ts +77 -1
- package/src/tools/schedule/list.ts +1 -0
- package/src/tools/schedule/update.ts +73 -1
- package/src/tools/skills/execute.ts +56 -0
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/ui-surface/definitions.ts +91 -2
- package/src/tools/workflows/manage-workflows.ts +183 -0
- package/src/tools/workflows/run-workflow.test.ts +442 -0
- package/src/tools/workflows/run-workflow.ts +88 -0
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +24 -0
- package/src/util/canonicalize-identity.ts +12 -3
- package/src/util/platform.ts +17 -17
- package/src/watcher/__tests__/engine.test.ts +24 -0
- package/src/watcher/__tests__/telemetry.test.ts +135 -0
- package/src/watcher/engine.ts +7 -0
- package/src/watcher/telemetry.ts +74 -0
- package/src/workflows/capabilities.test.ts +365 -0
- package/src/workflows/capabilities.ts +359 -0
- package/src/workflows/deterministic-stringify.ts +27 -0
- package/src/workflows/engine-integration.test.ts +656 -0
- package/src/workflows/engine.test.ts +1144 -0
- package/src/workflows/engine.ts +1078 -0
- package/src/workflows/fanout-load.test.ts +168 -0
- package/src/workflows/journal-store.test.ts +369 -0
- package/src/workflows/journal-store.ts +470 -0
- package/src/workflows/leaf-runner.test.ts +704 -0
- package/src/workflows/leaf-runner.ts +589 -0
- package/src/workflows/library.test.ts +134 -0
- package/src/workflows/library.ts +124 -0
- package/src/workflows/run-manager.test.ts +711 -0
- package/src/workflows/run-manager.ts +593 -0
- package/src/workflows/sandbox-escape.test.ts +339 -0
- package/src/workflows/sandbox.test.ts +251 -0
- package/src/workflows/sandbox.ts +447 -0
- package/src/workspace/adaptive-thinking-repair.ts +33 -11
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +1 -1
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +1 -1
- package/src/workspace/migrations/026-backfill-install-meta.ts +1 -1
- package/src/workspace/migrations/030-seed-pkb-autoinject.ts +2 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -4
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +1 -1
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +5 -2
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +1 -1
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +8 -2
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +41 -14
- package/src/workspace/migrations/102-preserve-heartbeat-enabled-for-existing-workspaces.ts +69 -0
- package/src/workspace/migrations/103-upgrade-quality-profile-to-opus-4-8.ts +83 -0
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +133 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/migrations/runner.ts +1 -1
- package/tsconfig.json +1 -1
- package/src/__tests__/guardian-action-copy-generator.test.ts +0 -200
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -579
- package/src/__tests__/guardian-action-store.test.ts +0 -106
- package/src/daemon/guardian-action-generators.ts +0 -71
- package/src/memory/guardian-action-store.ts +0 -484
- package/src/runtime/guardian-action-grant-minter.ts +0 -150
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { resolveSkillExecuteInput } from "../tools/skills/execute.js";
|
|
4
|
+
|
|
5
|
+
describe("resolveSkillExecuteInput", () => {
|
|
6
|
+
test("returns a correctly nested object unchanged", () => {
|
|
7
|
+
const input = { prompt: "a sunset", variants: 2 };
|
|
8
|
+
const result = resolveSkillExecuteInput({
|
|
9
|
+
tool: "media_generate_image",
|
|
10
|
+
input,
|
|
11
|
+
activity: "Generating image",
|
|
12
|
+
});
|
|
13
|
+
expect(result).toEqual(input);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("rescues parameters spread as top-level siblings", () => {
|
|
17
|
+
// Weak model put `prompt` next to `tool`/`activity` instead of under `input`.
|
|
18
|
+
const result = resolveSkillExecuteInput({
|
|
19
|
+
tool: "media_generate_image",
|
|
20
|
+
activity: "Generating image",
|
|
21
|
+
prompt: "a sunset over the ocean",
|
|
22
|
+
variants: 2,
|
|
23
|
+
});
|
|
24
|
+
expect(result).toEqual({ prompt: "a sunset over the ocean", variants: 2 });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("rescues siblings when input is an empty object", () => {
|
|
28
|
+
// The exact shape from the room-redesign failure: `input: {}` plus the
|
|
29
|
+
// real parameter placed at the top level.
|
|
30
|
+
const result = resolveSkillExecuteInput({
|
|
31
|
+
tool: "media_generate_image",
|
|
32
|
+
input: {},
|
|
33
|
+
activity: "Generating room concept image",
|
|
34
|
+
prompt: "a cozy living room",
|
|
35
|
+
});
|
|
36
|
+
expect(result).toEqual({ prompt: "a cozy living room" });
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("parses input passed as a JSON string", () => {
|
|
40
|
+
const result = resolveSkillExecuteInput({
|
|
41
|
+
tool: "media_generate_image",
|
|
42
|
+
input: '{"prompt":"a sunset","variants":3}',
|
|
43
|
+
activity: "Generating image",
|
|
44
|
+
});
|
|
45
|
+
expect(result).toEqual({ prompt: "a sunset", variants: 3 });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("non-empty nested object wins over stray siblings", () => {
|
|
49
|
+
const result = resolveSkillExecuteInput({
|
|
50
|
+
tool: "media_generate_image",
|
|
51
|
+
input: { prompt: "the real prompt" },
|
|
52
|
+
activity: "Generating image",
|
|
53
|
+
prompt: "a stray sibling",
|
|
54
|
+
});
|
|
55
|
+
expect(result).toEqual({ prompt: "the real prompt" });
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("returns empty object when no parameters are present anywhere", () => {
|
|
59
|
+
const result = resolveSkillExecuteInput({
|
|
60
|
+
tool: "media_generate_image",
|
|
61
|
+
input: {},
|
|
62
|
+
activity: "Generating image",
|
|
63
|
+
});
|
|
64
|
+
expect(result).toEqual({});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("does not treat a JSON array string as input", () => {
|
|
68
|
+
// An array isn't a valid parameter map; fall through to (absent) siblings.
|
|
69
|
+
const result = resolveSkillExecuteInput({
|
|
70
|
+
tool: "some_tool",
|
|
71
|
+
input: "[1,2,3]",
|
|
72
|
+
activity: "Doing work",
|
|
73
|
+
});
|
|
74
|
+
expect(result).toEqual({});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("ignores envelope keys when rescuing siblings", () => {
|
|
78
|
+
const result = resolveSkillExecuteInput({
|
|
79
|
+
tool: "some_tool",
|
|
80
|
+
activity: "Doing work",
|
|
81
|
+
foo: "bar",
|
|
82
|
+
});
|
|
83
|
+
expect(result).toEqual({ foo: "bar" });
|
|
84
|
+
});
|
|
85
|
+
});
|
|
@@ -5,7 +5,7 @@ import { describe, expect, test } from "bun:test";
|
|
|
5
5
|
* Guard test: SKILL.md files must never instruct the assistant to accept
|
|
6
6
|
* secrets (passwords, API keys, tokens, etc.) pasted directly in chat.
|
|
7
7
|
*
|
|
8
|
-
* Secrets must always be collected via `
|
|
8
|
+
* Secrets must always be collected via `assistant credentials prompt`, which
|
|
9
9
|
* presents a secure native UI that keeps the value out of conversation
|
|
10
10
|
* history and LLM context.
|
|
11
11
|
*
|
|
@@ -28,7 +28,7 @@ const SECRET_WORDS =
|
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Patterns that indicate the assistant is being told to accept a secret
|
|
31
|
-
* value directly in chat, rather than via
|
|
31
|
+
* value directly in chat, rather than via `assistant credentials prompt`.
|
|
32
32
|
*/
|
|
33
33
|
const VIOLATION_PATTERNS: RegExp[] = [
|
|
34
34
|
// "accept <secret> in/via/from chat/plaintext/the conversation"
|
|
@@ -72,12 +72,13 @@ const NEGATION_PATTERNS =
|
|
|
72
72
|
/\b(?:never|do\s+not|don['']t|must\s+not|should\s+not|shouldn['']t)\b|\bNOT\b/;
|
|
73
73
|
|
|
74
74
|
/**
|
|
75
|
-
* Lines that
|
|
76
|
-
* block
|
|
77
|
-
*
|
|
75
|
+
* Lines that carry the secure prompt's field text within an `assistant
|
|
76
|
+
* credentials prompt` block — either CLI flags (`--label`, `--description`,
|
|
77
|
+
* `--placeholder`, ...) or legacy YAML-style fields. These contain
|
|
78
|
+
* secret-related words but are secure UI text, not chat instructions.
|
|
78
79
|
*/
|
|
79
|
-
const
|
|
80
|
-
/^\s*(?:[-*]\s+)?(?:label|description|placeholder)\s*[:=]\s
|
|
80
|
+
const CREDENTIAL_PROMPT_UI_FIELD =
|
|
81
|
+
/^\s*(?:[-*]\s+)?(?:label|description|placeholder)\s*[:=]\s*|^\s*--(?:service|field|label|description|placeholder|allowed-domains|allowed-tools|injection-templates|usage-description)\b/i;
|
|
81
82
|
|
|
82
83
|
interface Violation {
|
|
83
84
|
file: string;
|
|
@@ -127,31 +128,31 @@ function findViolations(): Violation[] {
|
|
|
127
128
|
|
|
128
129
|
const lines = content.split("\n");
|
|
129
130
|
|
|
130
|
-
// Track whether we're inside
|
|
131
|
-
// (
|
|
132
|
-
let
|
|
131
|
+
// Track whether we're inside an `assistant credentials prompt` block
|
|
132
|
+
// (the command plus its indented flag continuation lines)
|
|
133
|
+
let inCredentialPromptBlock = false;
|
|
133
134
|
let blockIndent = 0;
|
|
134
135
|
|
|
135
136
|
for (let i = 0; i < lines.length; i++) {
|
|
136
137
|
const line = lines[i];
|
|
137
138
|
const lineNumber = i + 1;
|
|
138
139
|
|
|
139
|
-
// Track
|
|
140
|
-
if (/
|
|
141
|
-
|
|
140
|
+
// Track `assistant credentials prompt` blocks
|
|
141
|
+
if (/assistant\s+credentials\s+prompt/i.test(line)) {
|
|
142
|
+
inCredentialPromptBlock = true;
|
|
142
143
|
blockIndent = line.search(/\S/);
|
|
143
144
|
continue;
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
// Exit
|
|
147
|
-
if (
|
|
147
|
+
// Exit the prompt block when indentation returns to same or lesser level
|
|
148
|
+
if (inCredentialPromptBlock) {
|
|
148
149
|
const currentIndent = line.search(/\S/);
|
|
149
150
|
if (
|
|
150
151
|
currentIndent !== -1 &&
|
|
151
152
|
currentIndent <= blockIndent &&
|
|
152
153
|
line.trim().length > 0
|
|
153
154
|
) {
|
|
154
|
-
|
|
155
|
+
inCredentialPromptBlock = false;
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
158
|
|
|
@@ -161,8 +162,8 @@ function findViolations(): Violation[] {
|
|
|
161
162
|
// Skip negation lines — these instruct NOT to do something
|
|
162
163
|
if (NEGATION_PATTERNS.test(line)) continue;
|
|
163
164
|
|
|
164
|
-
// Skip
|
|
165
|
-
if (
|
|
165
|
+
// Skip secure-prompt UI field lines (--label/--description/--placeholder, etc.)
|
|
166
|
+
if (inCredentialPromptBlock && CREDENTIAL_PROMPT_UI_FIELD.test(line))
|
|
166
167
|
continue;
|
|
167
168
|
|
|
168
169
|
// Strip markdown backticks before pattern matching so that
|
|
@@ -193,13 +194,13 @@ describe("SKILL.md secret handling guard", () => {
|
|
|
193
194
|
if (violations.length > 0) {
|
|
194
195
|
const message = [
|
|
195
196
|
"Found SKILL.md files that instruct accepting secrets directly in chat.",
|
|
196
|
-
"Secrets must always be collected via `
|
|
197
|
+
"Secrets must always be collected via `assistant credentials prompt`, which",
|
|
197
198
|
"presents a secure native UI that keeps values out of conversation history.",
|
|
198
199
|
"",
|
|
199
200
|
"Violations:",
|
|
200
201
|
...violations.map((v) => ` - ${v.file}:${v.line}: ${v.text}`),
|
|
201
202
|
"",
|
|
202
|
-
"To fix: replace chat-based secret collection with
|
|
203
|
+
"To fix: replace chat-based secret collection with an `assistant credentials prompt` call.",
|
|
203
204
|
"See any *-setup skill (e.g. skills/slack-app-setup/SKILL.md) for the correct pattern.",
|
|
204
205
|
"",
|
|
205
206
|
"If this is a genuine exception, add the file path to the ALLOWLIST in",
|
|
@@ -103,7 +103,7 @@ describe("skills catalog loading", () => {
|
|
|
103
103
|
expect(skill!.bundled).toBeUndefined();
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
test("discovers symlinked skill directories that point inside
|
|
106
|
+
test("discovers symlinked skill directories that point inside $VELLUM_WORKSPACE_DIR/skills", () => {
|
|
107
107
|
const internalSkillDir = join(
|
|
108
108
|
TEST_DIR,
|
|
109
109
|
"skills",
|
|
@@ -124,7 +124,7 @@ describe("skills catalog loading", () => {
|
|
|
124
124
|
expect(catalog[0].name).toBe("Internal Linked Skill");
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
-
test("does not discover symlinked skill directories that point outside
|
|
127
|
+
test("does not discover symlinked skill directories that point outside $VELLUM_WORKSPACE_DIR/skills", () => {
|
|
128
128
|
const externalSkillDir = join(TEST_DIR, "outside", "external-skill");
|
|
129
129
|
mkdirSync(externalSkillDir, { recursive: true });
|
|
130
130
|
writeFileSync(
|
|
@@ -138,7 +138,7 @@ describe("skills catalog loading", () => {
|
|
|
138
138
|
expect(catalog).toHaveLength(0);
|
|
139
139
|
});
|
|
140
140
|
|
|
141
|
-
test("rejects symlinked SKILL.md files that point outside
|
|
141
|
+
test("rejects symlinked SKILL.md files that point outside $VELLUM_WORKSPACE_DIR/skills", () => {
|
|
142
142
|
const linkedSkillDir = join(TEST_DIR, "skills", "linked-file-skill");
|
|
143
143
|
mkdirSync(linkedSkillDir, { recursive: true });
|
|
144
144
|
|
|
@@ -10,7 +10,7 @@ const skillContent = readFileSync(SKILL_PATH, "utf-8");
|
|
|
10
10
|
describe("slack-app-setup skill regression", () => {
|
|
11
11
|
test("keeps Slack token collection on the secure credential prompt path", () => {
|
|
12
12
|
expect(skillContent).toContain(
|
|
13
|
-
|
|
13
|
+
"assistant credentials prompt --service slack_channel",
|
|
14
14
|
);
|
|
15
15
|
expect(skillContent).toContain(
|
|
16
16
|
"same Slack settings handler used by Settings",
|
|
@@ -87,6 +87,56 @@ describe("subagent-only tool filtering", () => {
|
|
|
87
87
|
expect(isToolActiveForContext(TEST_TOOL_NAME, ctx)).toBe(false);
|
|
88
88
|
});
|
|
89
89
|
|
|
90
|
+
test("execution gate mode keeps non-allowlisted tools visible (allowlist enforced at execution time)", () => {
|
|
91
|
+
// `subagentToolGateMode: "execution"` keeps the full tool surface on the
|
|
92
|
+
// wire for provider prompt-cache parity; the executor callback rejects
|
|
93
|
+
// non-allowlisted calls instead.
|
|
94
|
+
const ctx: SkillProjectionContext = {
|
|
95
|
+
skillProjectionState: new Map(),
|
|
96
|
+
skillProjectionCache: {},
|
|
97
|
+
coreToolNames: new Set(),
|
|
98
|
+
toolsDisabledDepth: 0,
|
|
99
|
+
hasNoClient: false,
|
|
100
|
+
subagentAllowedTools: new Set(["remember"]),
|
|
101
|
+
subagentToolGateMode: "execution",
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
expect(isToolActiveForContext("remember", ctx)).toBe(true);
|
|
105
|
+
expect(isToolActiveForContext("bash", ctx)).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test("explicit wire gate mode filters exactly like the absent default", () => {
|
|
109
|
+
const ctx: SkillProjectionContext = {
|
|
110
|
+
skillProjectionState: new Map(),
|
|
111
|
+
skillProjectionCache: {},
|
|
112
|
+
coreToolNames: new Set(),
|
|
113
|
+
toolsDisabledDepth: 0,
|
|
114
|
+
hasNoClient: false,
|
|
115
|
+
subagentAllowedTools: new Set(["remember"]),
|
|
116
|
+
subagentToolGateMode: "wire",
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
expect(isToolActiveForContext("remember", ctx)).toBe(true);
|
|
120
|
+
expect(isToolActiveForContext("bash", ctx)).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("execution gate mode still applies non-allowlist filters (toolsDisabledDepth)", () => {
|
|
124
|
+
// The execution gate only bypasses the subagent allowlist's wire filter;
|
|
125
|
+
// every other visibility rule still applies.
|
|
126
|
+
const ctx: SkillProjectionContext = {
|
|
127
|
+
skillProjectionState: new Map(),
|
|
128
|
+
skillProjectionCache: {},
|
|
129
|
+
coreToolNames: new Set(),
|
|
130
|
+
toolsDisabledDepth: 1,
|
|
131
|
+
hasNoClient: false,
|
|
132
|
+
subagentAllowedTools: new Set(["remember"]),
|
|
133
|
+
subagentToolGateMode: "execution",
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
expect(isToolActiveForContext("remember", ctx)).toBe(false);
|
|
137
|
+
expect(isToolActiveForContext("bash", ctx)).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
|
|
90
140
|
test("returns false for every tool when toolsDisabledDepth > 0", () => {
|
|
91
141
|
// `createResolveToolsCallback` returns an empty tool list when tools are
|
|
92
142
|
// disabled; mirror it here so this helper reports the same final tool set.
|