@vellumai/assistant 0.9.0 → 0.10.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/ARCHITECTURE.md +18 -34
- 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 +976 -63
- 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__/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__/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__/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-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-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -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-usage.test.ts +65 -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__/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-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__/skill-execute-input.test.ts +51 -1
- 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__/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 +49 -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/{__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 +197 -4
- 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__/merge-plugin-tree.test.ts +443 -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 +105 -17
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -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/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/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/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 +27 -14
- package/src/daemon/conversation.ts +66 -14
- 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/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/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__/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-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/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/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/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__/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/atlascloud/client.ts +85 -0
- package/src/providers/fetch-provider-catalog.ts +85 -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/retry.ts +53 -12
- package/src/providers/search-provider-catalog.ts +10 -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 +181 -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 +52 -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 +123 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +15 -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 +240 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- 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 +202 -3
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +10 -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 +2 -3
- 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 +33 -0
- package/src/tools/subagent/spawn.ts +61 -12
- 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 +9 -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/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,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `workflow_started` SSE event.
|
|
3
|
+
*
|
|
4
|
+
* Server → client notification that a `run_workflow` run has begun.
|
|
5
|
+
* Carries `runId`, the parent `conversationId`, an optional anchoring
|
|
6
|
+
* `toolUseId`, and an optional human-readable `label`.
|
|
7
|
+
*
|
|
8
|
+
* `conversationId` is present so clients can route the event to the
|
|
9
|
+
* originating conversation's inline workflow card. `toolUseId` (the
|
|
10
|
+
* `skill_execute` block id that launched the run) anchors that inline
|
|
11
|
+
* card to the exact spawn tool call, mirroring
|
|
12
|
+
* `subagent_spawned.parentToolUseId`.
|
|
13
|
+
*
|
|
14
|
+
* Canonical wire-contract source. Daemon code imports the type
|
|
15
|
+
* directly from this file; external consumers import via
|
|
16
|
+
* `@vellumai/assistant-api`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
|
|
21
|
+
export const WorkflowStartedEventSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
type: z.literal("workflow_started"),
|
|
24
|
+
runId: z.string(),
|
|
25
|
+
conversationId: z.string(),
|
|
26
|
+
toolUseId: z.string().optional(),
|
|
27
|
+
label: z.string().optional(),
|
|
28
|
+
})
|
|
29
|
+
.strict();
|
|
30
|
+
|
|
31
|
+
export type WorkflowStartedEvent = z.infer<typeof WorkflowStartedEventSchema>;
|
package/src/api/index.ts
CHANGED
|
@@ -52,6 +52,11 @@ import { UISurfaceUpdateEventSchema } from "./events/ui-surface-update.js";
|
|
|
52
52
|
import { UsageProgressEventSchema } from "./events/usage-progress.js";
|
|
53
53
|
import { UsageUpdateEventSchema } from "./events/usage-update.js";
|
|
54
54
|
import { UserMessageEchoEventSchema } from "./events/user-message-echo.js";
|
|
55
|
+
import { WorkflowCompletedEventSchema } from "./events/workflow-completed.js";
|
|
56
|
+
import { WorkflowLeafFinishedEventSchema } from "./events/workflow-leaf-finished.js";
|
|
57
|
+
import { WorkflowLeafStartedEventSchema } from "./events/workflow-leaf-started.js";
|
|
58
|
+
import { WorkflowProgressEventSchema } from "./events/workflow-progress.js";
|
|
59
|
+
import { WorkflowStartedEventSchema } from "./events/workflow-started.js";
|
|
55
60
|
|
|
56
61
|
export {
|
|
57
62
|
CALL_SITE_COMPACTION_AGENT,
|
|
@@ -326,6 +331,28 @@ export {
|
|
|
326
331
|
type UserMessageEchoEvent,
|
|
327
332
|
UserMessageEchoEventSchema,
|
|
328
333
|
} from "./events/user-message-echo.js";
|
|
334
|
+
export {
|
|
335
|
+
type WorkflowCompletedEvent,
|
|
336
|
+
WorkflowCompletedEventSchema,
|
|
337
|
+
type WorkflowRunStatus,
|
|
338
|
+
WorkflowRunStatusSchema,
|
|
339
|
+
} from "./events/workflow-completed.js";
|
|
340
|
+
export {
|
|
341
|
+
type WorkflowLeafFinishedEvent,
|
|
342
|
+
WorkflowLeafFinishedEventSchema,
|
|
343
|
+
} from "./events/workflow-leaf-finished.js";
|
|
344
|
+
export {
|
|
345
|
+
type WorkflowLeafStartedEvent,
|
|
346
|
+
WorkflowLeafStartedEventSchema,
|
|
347
|
+
} from "./events/workflow-leaf-started.js";
|
|
348
|
+
export {
|
|
349
|
+
type WorkflowProgressEvent,
|
|
350
|
+
WorkflowProgressEventSchema,
|
|
351
|
+
} from "./events/workflow-progress.js";
|
|
352
|
+
export {
|
|
353
|
+
type WorkflowStartedEvent,
|
|
354
|
+
WorkflowStartedEventSchema,
|
|
355
|
+
} from "./events/workflow-started.js";
|
|
329
356
|
export {
|
|
330
357
|
type DictationContext,
|
|
331
358
|
DictationContextSchema,
|
|
@@ -385,6 +412,8 @@ export {
|
|
|
385
412
|
FeedItemDetailPanelKindSchema,
|
|
386
413
|
FeedItemDetailPanelSchema,
|
|
387
414
|
FeedItemSchema,
|
|
415
|
+
type FeedItemSourceType,
|
|
416
|
+
FeedItemSourceTypeSchema,
|
|
388
417
|
type FeedItemStatus,
|
|
389
418
|
FeedItemStatusSchema,
|
|
390
419
|
type FeedItemType,
|
|
@@ -441,6 +470,12 @@ export {
|
|
|
441
470
|
type SubagentDetailResponse,
|
|
442
471
|
SubagentDetailResponseSchema,
|
|
443
472
|
} from "./responses/subagent-detail.js";
|
|
473
|
+
export {
|
|
474
|
+
type WorkflowJournalResponse,
|
|
475
|
+
WorkflowJournalResponseSchema,
|
|
476
|
+
type WorkflowLeaf,
|
|
477
|
+
WorkflowLeafSchema,
|
|
478
|
+
} from "./responses/workflow-journal.js";
|
|
444
479
|
|
|
445
480
|
/**
|
|
446
481
|
* Canonical SSE event schema for the assistant runtime.
|
|
@@ -508,6 +543,11 @@ export const AssistantEventSchema = z.discriminatedUnion("type", [
|
|
|
508
543
|
UsageProgressEventSchema,
|
|
509
544
|
UsageUpdateEventSchema,
|
|
510
545
|
UserMessageEchoEventSchema,
|
|
546
|
+
WorkflowCompletedEventSchema,
|
|
547
|
+
WorkflowLeafFinishedEventSchema,
|
|
548
|
+
WorkflowLeafStartedEventSchema,
|
|
549
|
+
WorkflowProgressEventSchema,
|
|
550
|
+
WorkflowStartedEventSchema,
|
|
511
551
|
]);
|
|
512
552
|
|
|
513
553
|
/**
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
DirectoryScopeOptionSchema,
|
|
31
31
|
ScopeOptionSchema,
|
|
32
32
|
} from "../events/confirmation-request.js";
|
|
33
|
+
import { QuestionEntrySchema } from "../events/question-request.js";
|
|
33
34
|
import { ToolActivityMetadataSchema } from "../events/tool-result.js";
|
|
34
35
|
|
|
35
36
|
// ---------------------------------------------------------------------------
|
|
@@ -104,6 +105,25 @@ export type PendingToolConfirmation = z.infer<
|
|
|
104
105
|
typeof PendingToolConfirmationSchema
|
|
105
106
|
>;
|
|
106
107
|
|
|
108
|
+
/**
|
|
109
|
+
* In-flight `ask_question` prompt awaiting a user answer, mirrored onto the
|
|
110
|
+
* history tool call that raised it so a cold reconnect (or a conversation
|
|
111
|
+
* reopened after the event-buffer window has elapsed) can restore the inline
|
|
112
|
+
* question card without replaying the live `question_request` SSE event.
|
|
113
|
+
*
|
|
114
|
+
* Stamped at render time from the in-memory `pending-interactions` registry
|
|
115
|
+
* (the authoritative store of unresolved prompts) — not persisted to the
|
|
116
|
+
* database, so it appears only while the prompt is genuinely outstanding and
|
|
117
|
+
* disappears once the interaction resolves. `entries` mirrors the
|
|
118
|
+
* `question_request` event's `questions[]`, so both paths hydrate the same
|
|
119
|
+
* client state.
|
|
120
|
+
*/
|
|
121
|
+
export const PendingToolQuestionSchema = z.object({
|
|
122
|
+
requestId: z.string(),
|
|
123
|
+
entries: z.array(QuestionEntrySchema),
|
|
124
|
+
});
|
|
125
|
+
export type PendingToolQuestion = z.infer<typeof PendingToolQuestionSchema>;
|
|
126
|
+
|
|
107
127
|
/**
|
|
108
128
|
* Closed set of confirmation outcomes recorded for a tool call. The daemon
|
|
109
129
|
* only ever persists one of these three values (the outcome map is gated to
|
|
@@ -190,6 +210,12 @@ export const ConversationMessageToolCallSchema = z.object({
|
|
|
190
210
|
* Guaranteed present for outstanding prompts as of daemon v0.8.8.
|
|
191
211
|
*/
|
|
192
212
|
pendingConfirmation: PendingToolConfirmationSchema.optional(),
|
|
213
|
+
/**
|
|
214
|
+
* In-flight `ask_question` prompt, present only while the tool call is
|
|
215
|
+
* awaiting a user answer (read from the `pending-interactions` registry at
|
|
216
|
+
* render time). Lets a cold reconnect restore the inline question card.
|
|
217
|
+
*/
|
|
218
|
+
pendingQuestion: PendingToolQuestionSchema.optional(),
|
|
193
219
|
});
|
|
194
220
|
export type ConversationMessageToolCall = z.infer<
|
|
195
221
|
typeof ConversationMessageToolCallSchema
|
|
@@ -390,10 +416,8 @@ export const ConversationMessageSchema = z.object({
|
|
|
390
416
|
/**
|
|
391
417
|
* @deprecated Superseded by `contentBlocks`. Flat plain-text body (joined
|
|
392
418
|
* text segments). Redundant with `textSegments`/`contentOrder` for clients
|
|
393
|
-
* that render from the positional arrays (web, CLI)
|
|
394
|
-
*
|
|
395
|
-
* (its `HistoryReconstructionService` skips rows with empty text). The
|
|
396
|
-
* serializer always emits it — do not remove without updating that client.
|
|
419
|
+
* that render from the positional arrays (web, CLI). The serializer always
|
|
420
|
+
* emits it — do not remove without auditing clients that read it directly.
|
|
397
421
|
*/
|
|
398
422
|
content: z
|
|
399
423
|
.string()
|
|
@@ -12,10 +12,6 @@
|
|
|
12
12
|
* generator, and the web/CLI clients all derive from one source and cannot
|
|
13
13
|
* drift.
|
|
14
14
|
*
|
|
15
|
-
* A structurally compatible Swift mirror lives at
|
|
16
|
-
* `clients/shared/Network/FeedItem.swift`. Any change to the feed-item
|
|
17
|
-
* shape must be mirrored there.
|
|
18
|
-
*
|
|
19
15
|
* Canonical wire-contract source. Assistant code imports the types
|
|
20
16
|
* directly from this file via relative paths; external consumers
|
|
21
17
|
* (web client, gateway, evals) import via `@vellumai/assistant-api`.
|
|
@@ -59,6 +55,25 @@ export const FeedItemCategorySchema = z.enum([
|
|
|
59
55
|
]);
|
|
60
56
|
export type FeedItemCategory = z.infer<typeof FeedItemCategorySchema>;
|
|
61
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Producer of a feed item's source conversation — lets clients filter the
|
|
60
|
+
* activity feed by what generated each notification: the periodic
|
|
61
|
+
* heartbeat, a memory-consolidation pass, a recurring schedule, an
|
|
62
|
+
* auto-analysis run, etc. Derived at read time from the source
|
|
63
|
+
* conversation's `source` column (see `home/feed-source-enrichment.ts`).
|
|
64
|
+
* Individual schedules are distinguished by `sourceKey`/`sourceLabel`, not
|
|
65
|
+
* this coarse type.
|
|
66
|
+
*/
|
|
67
|
+
export const FeedItemSourceTypeSchema = z.enum([
|
|
68
|
+
"heartbeat",
|
|
69
|
+
"memory_consolidation",
|
|
70
|
+
"schedule",
|
|
71
|
+
"auto_analysis",
|
|
72
|
+
"user",
|
|
73
|
+
"other",
|
|
74
|
+
]);
|
|
75
|
+
export type FeedItemSourceType = z.infer<typeof FeedItemSourceTypeSchema>;
|
|
76
|
+
|
|
62
77
|
/**
|
|
63
78
|
* A single action button attached to a feed item.
|
|
64
79
|
*
|
|
@@ -124,6 +139,13 @@ export const FeedItemSchema = z.object({
|
|
|
124
139
|
noteworthy: z.boolean().optional(),
|
|
125
140
|
fromAssistant: z.boolean().optional(),
|
|
126
141
|
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
142
|
+
// Source-conversation classification, enriched at read time. `sourceKey`
|
|
143
|
+
// is the stable filter id — `schedule:<id>` for schedules so each filters
|
|
144
|
+
// separately, otherwise the `sourceType`. `sourceLabel` is the display
|
|
145
|
+
// string (a schedule's name, or a static label like "Heartbeat").
|
|
146
|
+
sourceType: FeedItemSourceTypeSchema.optional(),
|
|
147
|
+
sourceKey: z.string().optional(),
|
|
148
|
+
sourceLabel: z.string().optional(),
|
|
127
149
|
createdAt: z.string(),
|
|
128
150
|
});
|
|
129
151
|
export type FeedItem = z.infer<typeof FeedItemSchema>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract for the workflow-journal REST endpoint. Returns a
|
|
3
|
+
* `run_workflow` run's live status, cumulative usage/agent counters,
|
|
4
|
+
* current phase, and the ordered list of leaf agents spawned by the
|
|
5
|
+
* run.
|
|
6
|
+
*
|
|
7
|
+
* Reuses the canonical `WorkflowRunStatusSchema` defined alongside the
|
|
8
|
+
* `workflow_completed` SSE event so the polled REST journal and the
|
|
9
|
+
* streamed lifecycle events share one status shape.
|
|
10
|
+
*
|
|
11
|
+
* Canonical wire-contract source. Assistant code imports the types
|
|
12
|
+
* directly from this file via relative paths; external consumers
|
|
13
|
+
* (web client, gateway, evals) import via `@vellumai/assistant-api`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
|
|
18
|
+
import { WorkflowRunStatusSchema } from "../events/workflow-completed.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A single leaf within a workflow run. `kind` distinguishes a leaf
|
|
22
|
+
* agent from a nested workflow; `status` is an open string rather than
|
|
23
|
+
* a closed enum since it covers both lifecycle states and terminal
|
|
24
|
+
* results.
|
|
25
|
+
*/
|
|
26
|
+
export const WorkflowLeafSchema = z.object({
|
|
27
|
+
seq: z.number().int(),
|
|
28
|
+
kind: z.enum(["agent", "workflow"]),
|
|
29
|
+
label: z.string().optional(),
|
|
30
|
+
phase: z.string().optional(),
|
|
31
|
+
promptSummary: z.string().optional(),
|
|
32
|
+
status: z.string(),
|
|
33
|
+
resultSummary: z.string().optional(),
|
|
34
|
+
inputTokens: z.number().optional(),
|
|
35
|
+
outputTokens: z.number().optional(),
|
|
36
|
+
createdAt: z.number().nullable(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export type WorkflowLeaf = z.infer<typeof WorkflowLeafSchema>;
|
|
40
|
+
|
|
41
|
+
export const WorkflowJournalResponseSchema = z.object({
|
|
42
|
+
runId: z.string(),
|
|
43
|
+
status: WorkflowRunStatusSchema.optional(),
|
|
44
|
+
agentsSpawned: z.number().optional(),
|
|
45
|
+
inputTokens: z.number().optional(),
|
|
46
|
+
outputTokens: z.number().optional(),
|
|
47
|
+
phase: z.string().optional(),
|
|
48
|
+
leaves: z.array(WorkflowLeafSchema),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export type WorkflowJournalResponse = z.infer<
|
|
52
|
+
typeof WorkflowJournalResponseSchema
|
|
53
|
+
>;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-surface withdrawal of guardian approval cards.
|
|
3
|
+
*
|
|
4
|
+
* A single guardian request is projected onto every surface it was delivered
|
|
5
|
+
* to — the in-app Vellum card, a Slack message, etc. When the request reaches a
|
|
6
|
+
* terminal status its cards must stop offering live actions on *all* surfaces,
|
|
7
|
+
* not just the one the guardian acted on. This is the withdrawal counterpart to
|
|
8
|
+
* the unified card *rendering* dispatcher (`notifications/approval-card-data.ts`):
|
|
9
|
+
* rendering projects `pending` onto each surface, withdrawal projects the
|
|
10
|
+
* terminal status back onto each surface.
|
|
11
|
+
*
|
|
12
|
+
* Withdrawal preserves the card's information and removes only the live
|
|
13
|
+
* affordances (it does not delete the message/card) so each surface keeps an
|
|
14
|
+
* audit trail of what was decided.
|
|
15
|
+
*
|
|
16
|
+
* It is driven off `canonical_guardian_deliveries` — the per-request registry of
|
|
17
|
+
* where each card was sent — so it stays correct as surfaces are added and is
|
|
18
|
+
* agnostic to which surface originated the decision.
|
|
19
|
+
*
|
|
20
|
+
* Best-effort by contract: the request is already resolved (CAS committed)
|
|
21
|
+
* before this runs, so a failed edit must never surface as a decision failure.
|
|
22
|
+
* Every surface is attempted independently; one failure never blocks the rest.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { completeSurfaceAndNotify } from "../daemon/conversation-surfaces.js";
|
|
26
|
+
import {
|
|
27
|
+
type CanonicalGuardianDelivery,
|
|
28
|
+
type CanonicalGuardianRequest,
|
|
29
|
+
type CanonicalRequestStatus,
|
|
30
|
+
listCanonicalGuardianDeliveries,
|
|
31
|
+
} from "../memory/canonical-guardian-store.js";
|
|
32
|
+
import { withdrawSlackApprovalCard } from "../messaging/providers/slack/withdraw.js";
|
|
33
|
+
import { approvalCardSurfaceId } from "../notifications/approval-card-data.js";
|
|
34
|
+
import { getLogger } from "../util/logger.js";
|
|
35
|
+
|
|
36
|
+
const log = getLogger("guardian-card-withdrawal");
|
|
37
|
+
|
|
38
|
+
/** Completion-summary label shown on an in-app card for a resolved request. */
|
|
39
|
+
const SURFACE_STATUS_LABELS: Partial<Record<CanonicalRequestStatus, string>> = {
|
|
40
|
+
approved: "Approved",
|
|
41
|
+
denied: "Denied",
|
|
42
|
+
expired: "Expired",
|
|
43
|
+
cancelled: "Cancelled",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export interface WithdrawGuardianCardsParams {
|
|
47
|
+
/** The request, already transitioned to its terminal status. */
|
|
48
|
+
request: CanonicalGuardianRequest;
|
|
49
|
+
/** Terminal status to reflect on each card. */
|
|
50
|
+
status: CanonicalRequestStatus;
|
|
51
|
+
/**
|
|
52
|
+
* Channel the decision originated on, when applicable.
|
|
53
|
+
*
|
|
54
|
+
* The acting in-app client completes its own card optimistically, so the
|
|
55
|
+
* in-app card is skipped when the decision originated in-app; it is withdrawn
|
|
56
|
+
* here only when the decision came from another surface. Omit (e.g. the expiry
|
|
57
|
+
* sweep) to withdraw every surface.
|
|
58
|
+
*/
|
|
59
|
+
originChannel?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Withdraw a resolved request's approval cards across all delivery surfaces.
|
|
64
|
+
* Never throws.
|
|
65
|
+
*/
|
|
66
|
+
export async function withdrawGuardianRequestCards(
|
|
67
|
+
params: WithdrawGuardianCardsParams,
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
const { request, status, originChannel } = params;
|
|
70
|
+
|
|
71
|
+
let deliveries: CanonicalGuardianDelivery[];
|
|
72
|
+
try {
|
|
73
|
+
deliveries = listCanonicalGuardianDeliveries(request.id);
|
|
74
|
+
} catch (err) {
|
|
75
|
+
log.warn(
|
|
76
|
+
{ err, requestId: request.id },
|
|
77
|
+
"Failed to list deliveries for card withdrawal",
|
|
78
|
+
);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (const delivery of deliveries) {
|
|
83
|
+
try {
|
|
84
|
+
if (delivery.destinationChannel === "vellum") {
|
|
85
|
+
withdrawVellumCard(request, delivery, status, originChannel);
|
|
86
|
+
} else if (delivery.destinationChannel === "slack") {
|
|
87
|
+
await withdrawSlackCard(request, delivery, status);
|
|
88
|
+
}
|
|
89
|
+
// Telegram/WhatsApp direct delivery can't edit a message in place (it
|
|
90
|
+
// would post a new one), so their stale clicks are left to the existing
|
|
91
|
+
// "already resolved" reply until in-place edit support lands.
|
|
92
|
+
} catch (err) {
|
|
93
|
+
log.warn(
|
|
94
|
+
{
|
|
95
|
+
err,
|
|
96
|
+
requestId: request.id,
|
|
97
|
+
channel: delivery.destinationChannel,
|
|
98
|
+
},
|
|
99
|
+
"Failed to withdraw guardian card on surface (non-fatal)",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Withdraw the in-app approval card so it stops offering live actions while
|
|
107
|
+
* keeping its content. Skipped when the decision originated in-app — the acting
|
|
108
|
+
* client already completed the card itself.
|
|
109
|
+
*/
|
|
110
|
+
function withdrawVellumCard(
|
|
111
|
+
request: CanonicalGuardianRequest,
|
|
112
|
+
delivery: CanonicalGuardianDelivery,
|
|
113
|
+
status: CanonicalRequestStatus,
|
|
114
|
+
originChannel: string | undefined,
|
|
115
|
+
): void {
|
|
116
|
+
if (originChannel === "vellum") return;
|
|
117
|
+
if (!delivery.destinationConversationId) return;
|
|
118
|
+
const surfaceId = approvalCardSurfaceId(request.kind, request.id);
|
|
119
|
+
if (!surfaceId) return;
|
|
120
|
+
completeSurfaceAndNotify(
|
|
121
|
+
delivery.destinationConversationId,
|
|
122
|
+
surfaceId,
|
|
123
|
+
SURFACE_STATUS_LABELS[status] ?? "Resolved",
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Edit the Slack message in place to its resolved state — original card content
|
|
129
|
+
* preserved, action buttons removed, an outcome/decider/time line appended.
|
|
130
|
+
* No-ops when the channel-native message id was not captured at delivery time.
|
|
131
|
+
*/
|
|
132
|
+
async function withdrawSlackCard(
|
|
133
|
+
request: CanonicalGuardianRequest,
|
|
134
|
+
delivery: CanonicalGuardianDelivery,
|
|
135
|
+
status: CanonicalRequestStatus,
|
|
136
|
+
): Promise<void> {
|
|
137
|
+
if (!delivery.destinationChatId || !delivery.destinationMessageId) return;
|
|
138
|
+
await withdrawSlackApprovalCard({
|
|
139
|
+
channel: delivery.destinationChatId,
|
|
140
|
+
messageTs: delivery.destinationMessageId,
|
|
141
|
+
status,
|
|
142
|
+
decidedByExternalUserId: request.decidedByExternalUserId ?? undefined,
|
|
143
|
+
decidedAtMs: request.updatedAt,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -48,6 +48,7 @@ import type { ApplyGuardianDecisionResult } from "../runtime/guardian-decision-t
|
|
|
48
48
|
import { computeToolApprovalDigest } from "../security/tool-approval-digest.js";
|
|
49
49
|
import { getLogger } from "../util/logger.js";
|
|
50
50
|
import { mintGrantFromDecision } from "./approval-primitive.js";
|
|
51
|
+
import { withdrawGuardianRequestCards } from "./guardian-card-withdrawal.js";
|
|
51
52
|
import {
|
|
52
53
|
type ActorContext,
|
|
53
54
|
type ChannelDeliveryContext,
|
|
@@ -354,6 +355,7 @@ export type CanonicalDecisionResult =
|
|
|
354
355
|
| "not_found"
|
|
355
356
|
| "already_resolved"
|
|
356
357
|
| "identity_mismatch"
|
|
358
|
+
| "request_misconfigured"
|
|
357
359
|
| "invalid_action"
|
|
358
360
|
| "expired";
|
|
359
361
|
detail?: string;
|
|
@@ -426,18 +428,22 @@ export async function applyCanonicalGuardianDecision(
|
|
|
426
428
|
// authorization gate — principal identity must always match.
|
|
427
429
|
|
|
428
430
|
if (!request.guardianPrincipalId) {
|
|
429
|
-
|
|
431
|
+
// A decisionable request with no bound principal can never be authorized
|
|
432
|
+
// by anyone — it is stuck. This is a data-integrity fault (creation guards
|
|
433
|
+
// against it for decisionable kinds), not an authorization denial, so it
|
|
434
|
+
// must NOT be reported to the actor as "you don't have permission".
|
|
435
|
+
log.error(
|
|
430
436
|
{
|
|
431
437
|
event: "canonical_decision_missing_request_principal",
|
|
432
438
|
requestId,
|
|
433
439
|
kind: request.kind,
|
|
434
440
|
sourceType: request.sourceType,
|
|
435
441
|
},
|
|
436
|
-
"Canonical request missing guardianPrincipalId;
|
|
442
|
+
"Canonical request missing guardianPrincipalId; request is undecidable",
|
|
437
443
|
);
|
|
438
444
|
return {
|
|
439
445
|
applied: false,
|
|
440
|
-
reason: "
|
|
446
|
+
reason: "request_misconfigured",
|
|
441
447
|
detail: "request missing guardianPrincipalId",
|
|
442
448
|
};
|
|
443
449
|
}
|
|
@@ -571,6 +577,23 @@ export async function applyCanonicalGuardianDecision(
|
|
|
571
577
|
grantMinted = grantResult.minted;
|
|
572
578
|
}
|
|
573
579
|
|
|
580
|
+
// 6. Project the terminal status onto the request's approval cards on every
|
|
581
|
+
// surface it was delivered to (in-app, Slack, ...). Fire-and-forget: the
|
|
582
|
+
// decision is already committed via CAS and withdrawal is a best-effort
|
|
583
|
+
// cosmetic projection, so awaiting its Slack round-trips would only add
|
|
584
|
+
// latency to the decision response that interactive callers wait on. The
|
|
585
|
+
// projector never throws; the `.catch` is a defensive backstop.
|
|
586
|
+
void withdrawGuardianRequestCards({
|
|
587
|
+
request: resolved,
|
|
588
|
+
status: targetStatus,
|
|
589
|
+
originChannel: actorContext.channel,
|
|
590
|
+
}).catch((err) => {
|
|
591
|
+
log.warn(
|
|
592
|
+
{ err, requestId },
|
|
593
|
+
"Cross-surface card withdrawal failed (non-fatal)",
|
|
594
|
+
);
|
|
595
|
+
});
|
|
596
|
+
|
|
574
597
|
log.info(
|
|
575
598
|
{
|
|
576
599
|
event: "canonical_decision_applied",
|