@vellumai/assistant 0.11.4 → 0.11.5-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 +2 -2
- package/ARCHITECTURE.md +29 -4
- package/README.md +1 -1
- package/docs/architecture/memory.md +17 -5
- package/docs/architecture/security.md +96 -152
- package/docs/guardian-request-flow.md +13 -2
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
- package/node_modules/@vellumai/gateway-client/src/http-delivery.ts +7 -14
- package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +29 -31
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/openapi.yaml +193 -3
- package/package.json +1 -1
- package/src/__tests__/anthropic-provider.test.ts +10 -3
- package/src/__tests__/approval-interception-trust-gates.test.ts +40 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +4 -0
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -6
- package/src/__tests__/channel-reply-delivery.test.ts +26 -13
- package/src/__tests__/checker.test.ts +20 -314
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
- package/src/__tests__/client-os-metadata-persistence.test.ts +16 -0
- package/src/__tests__/compactor-retained-image-validation.test.ts +142 -0
- package/src/__tests__/config-loader-backfill.test.ts +19 -10
- package/src/__tests__/container-cpu-sampler.test.ts +153 -0
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/conversation-attachments.test.ts +0 -1
- package/src/__tests__/conversation-error.test.ts +17 -0
- package/src/__tests__/conversation-lifecycle.test.ts +20 -26
- package/src/__tests__/conversation-pairing.test.ts +186 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +21 -2
- package/src/__tests__/credential-broker-server-use.test.ts +24 -5
- package/src/__tests__/credential-routes.test.ts +22 -3
- package/src/__tests__/credential-security-invariants.test.ts +2 -1
- package/src/__tests__/daemon-credential-client.test.ts +88 -0
- package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
- package/src/__tests__/dm-backfill.test.ts +63 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
- package/src/__tests__/edit-propagation.test.ts +107 -4
- package/src/__tests__/events-client-registration.test.ts +28 -0
- package/src/__tests__/file-write-tool.test.ts +4 -2
- package/src/__tests__/guardian-prompt-notice-privacy.test.ts +133 -0
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +143 -97
- package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
- package/src/__tests__/host-proxy-interface.test.ts +11 -1
- package/src/__tests__/host-shell-tool.test.ts +23 -4
- package/src/__tests__/image-conversion.test.ts +143 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
- package/src/__tests__/input-repairs.test.ts +207 -0
- package/src/__tests__/live-workspace-guard.test.ts +75 -0
- package/src/__tests__/managed-profile-guard.test.ts +4 -2
- package/src/__tests__/mcp-abort-signal.test.ts +1 -1
- package/src/__tests__/mcp-client-auth.test.ts +1 -1
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +1 -1
- package/src/__tests__/media-resolve-image-validation.test.ts +310 -0
- package/src/__tests__/mtime-cache.test.ts +2 -0
- package/src/__tests__/notification-vellum-adapter.test.ts +124 -1
- package/src/__tests__/openai-provider.test.ts +22 -0
- package/src/__tests__/personal-memory-auth-bypass.test.ts +22 -6
- package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
- package/src/__tests__/platform.test.ts +16 -1
- package/src/__tests__/plugin-api-resolve-credential.test.ts +22 -13
- package/src/__tests__/plugin-api-shim.test.ts +5 -0
- package/src/__tests__/plugin-api-store-credential.test.ts +268 -0
- package/src/__tests__/plugin-config-data-migration.test.ts +8 -1
- package/src/__tests__/plugin-disabled-state.test.ts +2 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
- package/src/__tests__/plugin-execution-context.test.ts +73 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -1
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +200 -7
- package/src/__tests__/require-fresh-approval.test.ts +0 -4
- package/src/__tests__/resource-pressure-guard.test.ts +428 -0
- package/src/__tests__/resource-pressure-routes.test.ts +113 -0
- package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +27 -1
- package/src/__tests__/secret-routes-platform-proxy.test.ts +7 -0
- package/src/__tests__/skill-tool-factory.test.ts +161 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
- package/src/__tests__/tool-executor.test.ts +63 -38
- package/src/__tests__/tool-policy.test.ts +97 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +7 -4
- package/src/__tests__/user-plugin-loader.test.ts +2 -0
- package/src/__tests__/validate-input.test.ts +243 -7
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -0
- package/src/__tests__/voice-session-bridge.test.ts +42 -0
- package/src/acp/__tests__/acp-claude-oauth.test.ts +97 -29
- package/src/acp/__tests__/prepare-agent-env.test.ts +376 -153
- package/src/acp/acp-claude-oauth.ts +38 -21
- package/src/acp/prepare-agent-env.ts +146 -55
- package/src/agent/loop-tool-dedup.test.ts +161 -0
- package/src/agent/loop.ts +68 -22
- package/src/api/constants/app-tools.ts +34 -0
- package/src/api/events/resource-pressure-status-changed.ts +53 -0
- package/src/api/index.ts +19 -0
- package/src/api/responses/resource-pressure-status.ts +25 -0
- package/src/approvals/guardian-channel-delivery.ts +70 -6
- package/src/approvals/guardian-request-resolvers.ts +32 -66
- package/src/calls/__tests__/voice-session-bridge.test.ts +114 -0
- package/src/calls/voice-session-bridge.ts +60 -6
- package/src/channels/__tests__/message-audience.test.ts +49 -0
- package/src/channels/__tests__/types.test.ts +17 -3
- package/src/channels/message-audience.ts +40 -0
- package/src/channels/types.ts +16 -12
- package/src/cli/__tests__/catalog-search-help.test.ts +50 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +31 -0
- package/src/cli/commands/__tests__/conversations-search.test.ts +289 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -0
- package/src/cli/commands/__tests__/inference-providers.test.ts +68 -0
- package/src/cli/commands/__tests__/keys.test.ts +89 -8
- package/src/cli/commands/__tests__/plugins.test.ts +57 -1
- package/src/cli/commands/channel-verification-sessions.help.ts +11 -9
- package/src/cli/commands/channel-verification-sessions.ts +11 -21
- package/src/cli/commands/conversations.help.ts +34 -0
- package/src/cli/commands/conversations.ts +125 -0
- package/src/cli/commands/inference-providers.ts +9 -4
- package/src/cli/commands/inference.help.ts +9 -4
- package/src/cli/commands/keys.help.ts +13 -1
- package/src/cli/commands/keys.ts +26 -15
- package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
- package/src/cli/commands/memory/index.help.ts +41 -27
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-v2.ts +58 -54
- package/src/cli/commands/memory/memory-validate.ts +18 -0
- package/src/cli/commands/monitoring.ts +1 -0
- package/src/cli/commands/plugins.help.ts +28 -31
- package/src/cli/commands/plugins.ts +10 -0
- package/src/cli/commands/skills.help.ts +13 -16
- package/src/cli/commands/trust.ts +3 -14
- package/src/cli/lib/__tests__/install-from-github.test.ts +38 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +34 -0
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +32 -1
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +2 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +64 -0
- package/src/cli/lib/bundled-marketplace.json +13 -0
- package/src/cli/lib/daemon-credential-client.ts +25 -3
- package/src/cli/lib/install-from-github.ts +35 -24
- package/src/cli/lib/merge-plugin-tree.ts +22 -4
- package/src/cli/lib/plugin-surfaces.ts +27 -0
- package/src/config/__tests__/balanced-model-experiment.test.ts +7 -7
- package/src/config/__tests__/default-profile-catalog.test.ts +3 -3
- package/src/config/default-profile-catalog.ts +5 -6
- package/src/config/feature-flag-registry.json +32 -32
- package/src/config/webhook-routing.ts +8 -0
- package/src/context/compactor.ts +31 -2
- package/src/daemon/__tests__/provider-rejection-log-fields.test.ts +272 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -1
- package/src/daemon/conversation-error.ts +13 -0
- package/src/daemon/conversation-messaging.ts +22 -2
- package/src/daemon/conversation-process.ts +11 -0
- package/src/daemon/conversation-store.ts +10 -0
- package/src/daemon/conversation-surfaces.ts +21 -8
- package/src/daemon/conversation.ts +12 -10
- package/src/daemon/lifecycle.ts +6 -2
- package/src/daemon/message-types/conversations.ts +5 -7
- package/src/daemon/provider-rejection-log-fields.ts +124 -0
- package/src/daemon/resource-pressure-guard-lifecycle.ts +66 -0
- package/src/daemon/resource-pressure-guard.ts +387 -0
- package/src/daemon/shutdown-handlers.ts +2 -0
- package/src/daemon/startup-error.ts +16 -0
- package/src/daemon/trust-context.ts +14 -10
- package/src/daemon/unsendable-image-notice.ts +76 -0
- package/src/hooks/registry.ts +65 -51
- package/src/ipc/__tests__/socket-path.test.ts +15 -7
- package/src/ipc/gateway-client.test.ts +1 -1
- package/src/ipc/gateway-client.ts +14 -21
- package/src/ipc/socket-cleanup.ts +2 -11
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +1 -1
- package/src/messaging/provider-message-metadata.ts +128 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +116 -68
- package/src/messaging/providers/channel-transport.ts +90 -13
- package/src/messaging/providers/discord/send.ts +16 -0
- package/src/messaging/providers/discord/transport.ts +11 -1
- package/src/messaging/providers/index.ts +109 -16
- package/src/messaging/providers/slack/message-metadata.ts +45 -0
- package/src/messaging/providers/slack/render-transcript.ts +1 -4
- package/src/messaging/providers/slack/send.test.ts +6 -9
- package/src/messaging/providers/slack/send.ts +40 -28
- package/src/messaging/providers/slack/transport.ts +22 -26
- package/src/messaging/providers/telegram-bot/send.test.ts +2 -8
- package/src/messaging/providers/telegram-bot/transport.ts +3 -6
- package/src/messaging/read-provider-metadata.test.ts +157 -0
- package/src/messaging/read-provider-metadata.ts +51 -0
- package/src/notifications/__tests__/assistant-reply-producer.test.ts +94 -0
- package/src/notifications/__tests__/edit-notification.test.ts +174 -2
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +536 -4
- package/src/notifications/adapters/macos.ts +55 -0
- package/src/notifications/adapters/slack.ts +10 -5
- package/src/notifications/assistant-reply-producer.ts +37 -4
- package/src/notifications/conversation-pairing.ts +111 -21
- package/src/notifications/edit-notification.ts +38 -8
- package/src/notifications/emit-signal.ts +12 -14
- package/src/notifications/home-feed-side-effect.ts +218 -15
- package/src/notifications/types.ts +5 -0
- package/src/permissions/AGENTS.md +16 -0
- package/src/permissions/checker.test.ts +75 -122
- package/src/permissions/checker.ts +44 -560
- package/src/permissions/confirmation-guardian-request.test.ts +28 -3
- package/src/permissions/confirmation-guardian-request.ts +5 -1
- package/src/persistence/conversation-crud.ts +23 -20
- package/src/persistence/conversation-queries.ts +14 -1
- package/src/persistence/conversation-types.ts +22 -0
- package/src/persistence/delivery-crud.ts +122 -15
- package/src/plugin-api/__tests__/import-graph-partial-mock.test.ts +67 -0
- package/src/plugin-api/conversation-turn.ts +27 -0
- package/src/plugin-api/credential-scope.test.ts +15 -0
- package/src/plugin-api/credential-scope.ts +14 -0
- package/src/plugin-api/index.ts +19 -1
- package/src/plugin-api/resolve-credential.ts +15 -10
- package/src/plugin-api/store-credential.ts +148 -0
- package/src/plugin-api/system-card.ts +36 -0
- package/src/plugin-api/vision-support.test.ts +82 -0
- package/src/plugin-api/vision-support.ts +14 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +361 -110
- package/src/plugins/defaults/image-fallback/__tests__/vision-recovery.test.ts +4 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +58 -0
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +64 -23
- package/src/plugins/defaults/image-recovery/detect.ts +24 -1
- package/src/plugins/defaults/main.ts +15 -0
- package/src/plugins/defaults/memory/AGENTS.md +11 -3
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +9 -12
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +114 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
- package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
- package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
- package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
- package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
- package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +1 -61
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +68 -6
- package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
- package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
- package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
- package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
- package/src/plugins/defaults/memory/substrate/static-context.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +3 -1
- package/src/plugins/defaults/memory/v3/card.ts +9 -9
- package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
- package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
- package/src/plugins/defaults/memory/v3/edge.ts +13 -57
- package/src/plugins/mtime-cache.ts +1 -1
- package/src/plugins/pipeline.ts +14 -7
- package/src/plugins/plugin-execution-context.ts +35 -11
- package/src/plugins/plugin-tree-walk.ts +63 -4
- package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
- package/src/providers/anthropic/client.ts +332 -241
- package/src/providers/connection-resolution.ts +2 -1
- package/src/providers/content-blocks.ts +22 -0
- package/src/providers/gemini/client.ts +5 -2
- package/src/providers/inference/__tests__/adapter-factory-litellm.test.ts +47 -1
- package/src/providers/inference/__tests__/adapter-factory-ollama.test.ts +83 -0
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +98 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +38 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +10 -0
- package/src/providers/inference/__tests__/connections-ollama.test.ts +90 -0
- package/src/providers/inference/__tests__/missing-credential-guard.test.ts +117 -0
- package/src/providers/inference/adapter-factory.ts +33 -2
- package/src/providers/inference/auth.ts +13 -2
- package/src/providers/inference/credential-usage.ts +37 -0
- package/src/providers/inference/missing-credential-guard.ts +110 -0
- package/src/providers/inference/resolve-auth.ts +7 -7
- package/src/providers/media-resolve.ts +176 -15
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +576 -46
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
- package/src/providers/openai/chat-completions-provider.ts +322 -42
- package/src/routes/route-host-protocol.ts +7 -0
- package/src/routes/worker.ts +31 -10
- package/src/runtime/AGENTS.md +35 -0
- package/src/runtime/__tests__/runtime-http-port-collision.test.ts +131 -0
- package/src/runtime/__tests__/web-presence.test.ts +234 -0
- package/src/runtime/assistant-event-hub.ts +38 -0
- package/src/runtime/channel-reply-delivery.ts +54 -31
- package/src/runtime/channel-retry-sweep.ts +6 -4
- package/src/runtime/effective-capabilities.test.ts +19 -0
- package/src/runtime/effective-capabilities.ts +25 -0
- package/src/runtime/guardian-reply-router.ts +6 -2
- package/src/runtime/http-errors.ts +1 -0
- package/src/runtime/http-server.ts +20 -5
- package/src/runtime/routes/__tests__/client-routes.test.ts +150 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +133 -0
- package/src/runtime/routes/__tests__/credential-delete-in-use.test.ts +155 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +52 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/pending-interactions-route.test.ts +175 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +88 -35
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
- package/src/runtime/routes/__tests__/system-card-turn-termination.test.ts +107 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +75 -4
- package/src/runtime/routes/approval-routes.ts +37 -4
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +16 -22
- package/src/runtime/routes/canned-message-complete.ts +68 -29
- package/src/runtime/routes/client-routes.ts +113 -0
- package/src/runtime/routes/conversation-list-routes.ts +22 -7
- package/src/runtime/routes/conversation-management-routes.ts +15 -9
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-in-use.ts +85 -0
- package/src/runtime/routes/credential-routes.ts +55 -85
- package/src/runtime/routes/guardian-approval-interception.ts +22 -22
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +14 -12
- package/src/runtime/routes/identity-routes.ts +5 -121
- package/src/runtime/routes/inbound-message-handler.ts +71 -27
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +16 -17
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +77 -50
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -97
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -77
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +17 -8
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -7
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -70
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +9 -7
- package/src/runtime/routes/monitoring-routes.ts +9 -1
- package/src/runtime/routes/plugins-routes.ts +17 -5
- package/src/runtime/routes/resource-pressure-routes.ts +22 -0
- package/src/runtime/routes/secret-routes.ts +39 -8
- package/src/runtime/routes/settings-routes.ts +6 -6
- package/src/runtime/routes/surface-action-routes.ts +20 -19
- package/src/runtime/routes/user-route-dispatcher.ts +31 -2
- package/src/runtime/routes/user-route-resolution.ts +18 -1
- package/src/runtime/slack-reply-session.test.ts +23 -13
- package/src/runtime/slack-reply-session.ts +38 -55
- package/src/runtime/web-presence.ts +90 -0
- package/src/skills/validate-input.ts +177 -40
- package/src/subagent/__tests__/consult-context-gating.test.ts +6 -10
- package/src/subagent/consult-context.ts +7 -23
- package/src/tools/credentials/broker.ts +24 -79
- package/src/tools/credentials/ref-parse.ts +35 -0
- package/src/tools/credentials/resolve.ts +4 -10
- package/src/tools/credentials/store.ts +168 -0
- package/src/tools/credentials/tool-policy.ts +67 -0
- package/src/tools/executor.ts +53 -15
- package/src/tools/network/__tests__/web-search.test.ts +41 -1
- package/src/tools/network/url-safety.ts +9 -16
- package/src/tools/network/web-search.ts +21 -3
- package/src/tools/permission-checker.ts +43 -52
- package/src/tools/schema-transforms.ts +40 -5
- package/src/tools/shared/input-repairs.ts +160 -0
- package/src/tools/skills/skill-tool-factory.ts +18 -4
- package/src/tools/subagent/spawn.ts +0 -1
- package/src/tools/tool-approval-handler.ts +16 -10
- package/src/tools/tool-types.ts +26 -13
- package/src/tools/types.ts +6 -6
- package/src/util/__tests__/cgroup-memory.test.ts +3 -0
- package/src/util/cgroup-memory.ts +3 -0
- package/src/util/container-cpu-sampler.ts +250 -0
- package/src/util/image-conversion.ts +178 -14
- package/src/util/platform.ts +93 -10
- package/src/permissions/ipc-risk-types.ts +0 -143
- package/src/permissions/risk-types.ts +0 -76
|
@@ -131,7 +131,6 @@ function buildManagedOutboundRequestId(
|
|
|
131
131
|
chatId: payload.chatId,
|
|
132
132
|
text: normalizedText,
|
|
133
133
|
assistantId: payload.assistantId ?? null,
|
|
134
|
-
chatAction: payload.chatAction ?? null,
|
|
135
134
|
hasAttachments:
|
|
136
135
|
Array.isArray(payload.attachments) && payload.attachments.length > 0,
|
|
137
136
|
approvalRequestId: payload.approval?.requestId ?? null,
|
|
@@ -212,7 +211,6 @@ async function deliverManagedOutboundReply(
|
|
|
212
211
|
chatId: payload.chatId,
|
|
213
212
|
text: payload.text ?? null,
|
|
214
213
|
assistantId: payload.assistantId ?? null,
|
|
215
|
-
chatAction: payload.chatAction ?? null,
|
|
216
214
|
hasAttachments,
|
|
217
215
|
sourceUpdateId: callback.sourceUpdateId ?? null,
|
|
218
216
|
},
|
|
@@ -325,7 +323,12 @@ export async function deliverChannelReply(
|
|
|
325
323
|
): Promise<ChannelDeliveryResult> {
|
|
326
324
|
const managedCallback = parseManagedOutboundCallback(callbackUrl);
|
|
327
325
|
if (managedCallback) {
|
|
328
|
-
await deliverManagedOutboundReply(
|
|
326
|
+
await deliverManagedOutboundReply(
|
|
327
|
+
managedCallback,
|
|
328
|
+
payload,
|
|
329
|
+
bearerToken,
|
|
330
|
+
log,
|
|
331
|
+
);
|
|
329
332
|
return { ok: true };
|
|
330
333
|
}
|
|
331
334
|
|
|
@@ -385,17 +388,7 @@ export async function deliverChannelReply(
|
|
|
385
388
|
// Response may not be JSON for non-Slack channels; that's fine.
|
|
386
389
|
}
|
|
387
390
|
|
|
388
|
-
|
|
389
|
-
log.debug(
|
|
390
|
-
{ chatId: payload.chatId, callbackUrl, chatAction: payload.chatAction },
|
|
391
|
-
"Channel action delivered",
|
|
392
|
-
);
|
|
393
|
-
} else {
|
|
394
|
-
log.info(
|
|
395
|
-
{ chatId: payload.chatId, callbackUrl },
|
|
396
|
-
"Channel reply delivered",
|
|
397
|
-
);
|
|
398
|
-
}
|
|
391
|
+
log.info({ chatId: payload.chatId, callbackUrl }, "Channel reply delivered");
|
|
399
392
|
|
|
400
393
|
return result;
|
|
401
394
|
}
|
|
@@ -26,6 +26,7 @@ export {
|
|
|
26
26
|
AttachmentMetadataSchema,
|
|
27
27
|
ChannelDeliveryResultSchema,
|
|
28
28
|
ChannelReplyPayloadSchema,
|
|
29
|
+
MessageAudienceSchema,
|
|
29
30
|
PermissionRequestDetailsSchema,
|
|
30
31
|
SlackStreamOpSchema,
|
|
31
32
|
SlackStreamTaskSchema,
|
|
@@ -37,6 +38,7 @@ export type {
|
|
|
37
38
|
AttachmentMetadata,
|
|
38
39
|
ChannelDeliveryResult,
|
|
39
40
|
ChannelReplyPayload,
|
|
41
|
+
MessageAudience,
|
|
40
42
|
PermissionRequestDetails,
|
|
41
43
|
SlackStreamOp,
|
|
42
44
|
SlackStreamTask,
|
|
@@ -156,6 +156,26 @@ export const SlackStreamOpSchema = z
|
|
|
156
156
|
|
|
157
157
|
export type SlackStreamOp = z.infer<typeof SlackStreamOpSchema>;
|
|
158
158
|
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Audience
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Restricts a message to a single reader in a room that has more.
|
|
165
|
+
*
|
|
166
|
+
* A single object rather than a flag beside an id, because the two are only
|
|
167
|
+
* meaningful together: a channel cannot address one reader without knowing
|
|
168
|
+
* which. Slack reads this as `chat.postEphemeral`; a channel whose rooms hold
|
|
169
|
+
* one reader already has nothing to do.
|
|
170
|
+
*/
|
|
171
|
+
export const MessageAudienceSchema = z.object({
|
|
172
|
+
kind: z.literal("oneReader"),
|
|
173
|
+
/** The reader, in the channel's own id space. */
|
|
174
|
+
userId: z.string(),
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
export type MessageAudience = z.infer<typeof MessageAudienceSchema>;
|
|
178
|
+
|
|
159
179
|
// ---------------------------------------------------------------------------
|
|
160
180
|
// Channel reply payload — the full outbound wire format
|
|
161
181
|
// ---------------------------------------------------------------------------
|
|
@@ -163,43 +183,21 @@ export type SlackStreamOp = z.infer<typeof SlackStreamOpSchema>;
|
|
|
163
183
|
export const ChannelReplyPayloadSchema = z.object({
|
|
164
184
|
chatId: z.string(),
|
|
165
185
|
text: z.string().optional(),
|
|
166
|
-
/** Pre-formatted Block Kit blocks for Slack delivery. */
|
|
167
|
-
blocks: z.array(z.custom<KnownBlock>()).optional(),
|
|
168
186
|
assistantId: z.string().optional(),
|
|
169
187
|
attachments: z.array(AttachmentMetadataSchema).optional(),
|
|
170
188
|
approval: ApprovalUIMetadataSchema.optional(),
|
|
171
|
-
chatAction: z.literal("typing").optional(),
|
|
172
189
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
190
|
+
* Who may see this message. Absent means everyone in the room, which is the
|
|
191
|
+
* only safe reading of an absent value: a message meant for one reader that
|
|
192
|
+
* loses its audience must not become a public one.
|
|
193
|
+
*/
|
|
194
|
+
audience: MessageAudienceSchema.optional(),
|
|
195
|
+
/**
|
|
196
|
+
* Asks the channel to render the text richly rather than as plain text.
|
|
197
|
+
* Each channel decides what that means, and one that cannot ignores it.
|
|
198
|
+
* Slack is the only channel acting on it today, where it becomes Block Kit.
|
|
175
199
|
*/
|
|
176
|
-
ephemeral: z.boolean().optional(),
|
|
177
|
-
/** Slack user ID — required when `ephemeral` is true. */
|
|
178
|
-
user: z.string().optional(),
|
|
179
|
-
/** When provided, update an existing message instead of posting a new one. */
|
|
180
|
-
messageTs: z.string().optional(),
|
|
181
|
-
/** When true, the daemon generates Block Kit blocks from the text before delivery. */
|
|
182
200
|
useBlocks: z.boolean().optional(),
|
|
183
|
-
/** When provided, add or remove an emoji reaction on a message. */
|
|
184
|
-
reaction: z
|
|
185
|
-
.object({
|
|
186
|
-
action: z.enum(["add", "remove"]),
|
|
187
|
-
name: z.string(),
|
|
188
|
-
messageTs: z.string(),
|
|
189
|
-
})
|
|
190
|
-
.optional(),
|
|
191
|
-
/** When provided, set or clear the Slack Assistants API thread status. */
|
|
192
|
-
assistantThreadStatus: z
|
|
193
|
-
.object({
|
|
194
|
-
channel: z.string(),
|
|
195
|
-
threadTs: z.string(),
|
|
196
|
-
status: z.string(),
|
|
197
|
-
/** Serialized to Slack as `loading_messages`. */
|
|
198
|
-
loadingMessages: z.array(z.string()).optional(),
|
|
199
|
-
})
|
|
200
|
-
.optional(),
|
|
201
|
-
/** When provided, perform one Slack streaming operation (start/append/stop). */
|
|
202
|
-
slackStream: SlackStreamOpSchema.optional(),
|
|
203
201
|
});
|
|
204
202
|
|
|
205
203
|
export type ChannelReplyPayload = z.infer<typeof ChannelReplyPayloadSchema>;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"./remote-web-pairing": "./src/remote-web-pairing.ts",
|
|
15
15
|
"./twilio-ingress": "./src/twilio-ingress.ts",
|
|
16
16
|
"./trust-rules": "./src/trust-rules.ts",
|
|
17
|
+
"./url-normalization": "./src/url-normalization.ts",
|
|
17
18
|
"./handles": "./src/handles.ts",
|
|
18
19
|
"./rpc": "./src/rpc.ts",
|
|
19
20
|
"./attachment-naming": "./src/attachment-naming.ts",
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
canonicalizeWebUrl,
|
|
5
|
+
looksLikeHostPortShorthand,
|
|
6
|
+
looksLikePathOnlyInput,
|
|
7
|
+
normalizeWebUrl,
|
|
8
|
+
} from "../url-normalization.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* These are the rules a trust rule is saved and matched under. A change here
|
|
12
|
+
* changes which saved rules still match, so each case states the target the
|
|
13
|
+
* two spellings must agree on.
|
|
14
|
+
*/
|
|
15
|
+
describe("normalizeWebUrl", () => {
|
|
16
|
+
test("keeps an ordinary https URL as-is", () => {
|
|
17
|
+
expect(normalizeWebUrl("https://example.com/docs/page")?.href).toBe(
|
|
18
|
+
"https://example.com/docs/page",
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("drops the fragment: it never reaches the server", () => {
|
|
23
|
+
expect(normalizeWebUrl("https://example.com/docs#section")?.href).toBe(
|
|
24
|
+
"https://example.com/docs",
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("drops userinfo so credentials cannot land in a saved rule", () => {
|
|
29
|
+
const credentialed = new URL("https://example.com/docs/page");
|
|
30
|
+
credentialed.username = "demo";
|
|
31
|
+
credentialed.password = ["c", "r", "e", "d", "1", "2", "3"].join("");
|
|
32
|
+
|
|
33
|
+
const normalized = normalizeWebUrl(credentialed.href);
|
|
34
|
+
expect(normalized?.href).toBe("https://example.com/docs/page");
|
|
35
|
+
expect(normalized?.username).toBe("");
|
|
36
|
+
expect(normalized?.password).toBe("");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("strips a trailing root dot from the hostname", () => {
|
|
40
|
+
expect(normalizeWebUrl("https://example.com./docs/page")?.href).toBe(
|
|
41
|
+
"https://example.com/docs/page",
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("decodes escaped path segments so one path has one spelling", () => {
|
|
46
|
+
// Without this, a rule scoped to /private is bypassed by /%70rivate.
|
|
47
|
+
expect(normalizeWebUrl("https://example.com/%70rivate")?.href).toBe(
|
|
48
|
+
"https://example.com/private",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("reads scheme-less input as https", () => {
|
|
53
|
+
expect(normalizeWebUrl("example.com/docs")?.href).toBe(
|
|
54
|
+
"https://example.com/docs",
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("reads host:port shorthand as an https origin, not a scheme", () => {
|
|
59
|
+
expect(normalizeWebUrl("example.com:8443/status")?.origin).toBe(
|
|
60
|
+
"https://example.com:8443",
|
|
61
|
+
);
|
|
62
|
+
expect(normalizeWebUrl("[2001:db8::1]:8443/status")?.origin).toBe(
|
|
63
|
+
"https://[2001:db8::1]:8443",
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("rejects path-only input rather than coercing it to a host", () => {
|
|
68
|
+
for (const input of ["/etc/passwd", "./rel", "../up", "?q=1", "#frag"]) {
|
|
69
|
+
expect(normalizeWebUrl(input)).toBeNull();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("rejects every non-http scheme", () => {
|
|
74
|
+
for (const input of [
|
|
75
|
+
"file:///etc/passwd",
|
|
76
|
+
"data:text/html,<script>",
|
|
77
|
+
"javascript:alert(1)",
|
|
78
|
+
"ftp://example.com/f",
|
|
79
|
+
]) {
|
|
80
|
+
expect(normalizeWebUrl(input)).toBeNull();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("rejects empty and whitespace-only input", () => {
|
|
85
|
+
expect(normalizeWebUrl("")).toBeNull();
|
|
86
|
+
expect(normalizeWebUrl(" ")).toBeNull();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("trims surrounding whitespace", () => {
|
|
90
|
+
expect(normalizeWebUrl(" https://example.com/a ")?.href).toBe(
|
|
91
|
+
"https://example.com/a",
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("returns null rather than throwing on an unparseable authority", () => {
|
|
96
|
+
expect(normalizeWebUrl("https://")).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe("canonicalizeWebUrl", () => {
|
|
101
|
+
test("keeps the parser's form when the path is not decodable, without throwing", () => {
|
|
102
|
+
// `%zz` and a truncated UTF-8 sequence are not valid escapes; the path
|
|
103
|
+
// must survive unchanged rather than the call throwing.
|
|
104
|
+
expect(canonicalizeWebUrl(new URL("https://example.com/100%zz")).href).toBe(
|
|
105
|
+
"https://example.com/100%zz",
|
|
106
|
+
);
|
|
107
|
+
expect(
|
|
108
|
+
canonicalizeWebUrl(new URL("https://example.com/%E0%A4%A")).href,
|
|
109
|
+
).toBe("https://example.com/%E0%A4%A");
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("decodes an escaped percent, so `%25` and `%` are one path", () => {
|
|
113
|
+
expect(canonicalizeWebUrl(new URL("https://example.com/100%25")).href).toBe(
|
|
114
|
+
"https://example.com/100%",
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe("input shape predicates", () => {
|
|
120
|
+
test("host:port shorthand is recognized, scheme-prefixed input is not", () => {
|
|
121
|
+
expect(looksLikeHostPortShorthand("example.com:8443/x")).toBe(true);
|
|
122
|
+
expect(looksLikeHostPortShorthand("[2001:db8::1]:443")).toBe(true);
|
|
123
|
+
expect(looksLikeHostPortShorthand("https://example.com/x")).toBe(false);
|
|
124
|
+
expect(looksLikeHostPortShorthand("example.com/x")).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("path-only input is recognized", () => {
|
|
128
|
+
expect(looksLikePathOnlyInput("/abs")).toBe(true);
|
|
129
|
+
expect(looksLikePathOnlyInput("./rel")).toBe(true);
|
|
130
|
+
expect(looksLikePathOnlyInput("../up")).toBe(true);
|
|
131
|
+
expect(looksLikePathOnlyInput("?q=1")).toBe(true);
|
|
132
|
+
expect(looksLikePathOnlyInput("#frag")).toBe(true);
|
|
133
|
+
expect(looksLikePathOnlyInput("example.com/x")).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical URL normalization for web tool inputs, shared by the gateway's
|
|
3
|
+
* risk classifiers and the daemon's URL safety checks.
|
|
4
|
+
*
|
|
5
|
+
* A URL a model passes to `web_fetch` / `network_request` reaches more than
|
|
6
|
+
* one consumer, and they must agree on what counts as the same target: the
|
|
7
|
+
* gateway builds the trust-rule ladder from it, and anything that later
|
|
8
|
+
* compares a URL to a saved rule has to fold the same spellings together. Two
|
|
9
|
+
* normalizations would mean two answers, so it lives here rather than in
|
|
10
|
+
* either process.
|
|
11
|
+
*
|
|
12
|
+
* Data-only in spirit: no imports, no config, no I/O.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Whether a bare `host:port` (or `[v6]:port`) shorthand was written. */
|
|
16
|
+
export function looksLikeHostPortShorthand(value: string): boolean {
|
|
17
|
+
if (/^\[[0-9a-fA-F:.%]+\]:\d+(?:[/?#]|$)/.test(value)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return /^[^/?#@\s:]+:\d+(?:[/?#]|$)/.test(value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Whether the input is a path, query, or fragment rather than a URL. */
|
|
24
|
+
export function looksLikePathOnlyInput(value: string): boolean {
|
|
25
|
+
return (
|
|
26
|
+
value.startsWith("/") ||
|
|
27
|
+
value.startsWith("./") ||
|
|
28
|
+
value.startsWith("../") ||
|
|
29
|
+
value.startsWith("?") ||
|
|
30
|
+
value.startsWith("#")
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Strip the parts of a URL that must not affect a trust decision, and fold
|
|
36
|
+
* the encodings that would otherwise let one URL wear two spellings.
|
|
37
|
+
*
|
|
38
|
+
* Percent-escaped path segments are decoded (`/%70rivate` and `/private` are
|
|
39
|
+
* one path, so a path-scoped rule cannot be bypassed by escaping), a trailing
|
|
40
|
+
* root dot is dropped from the hostname, and fragment and userinfo are
|
|
41
|
+
* removed: the fragment never reaches the server, and credentials in the
|
|
42
|
+
* authority must never end up in a saved rule.
|
|
43
|
+
*/
|
|
44
|
+
export function canonicalizeWebUrl(parsed: URL): URL {
|
|
45
|
+
parsed.hash = "";
|
|
46
|
+
parsed.username = "";
|
|
47
|
+
parsed.password = "";
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
parsed.pathname = decodeURI(parsed.pathname);
|
|
51
|
+
} catch {
|
|
52
|
+
// Keep the URL parser's canonical form when decoding fails.
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (parsed.hostname.endsWith(".")) {
|
|
56
|
+
parsed.hostname = parsed.hostname.replace(/\.+$/, "");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Parse and canonicalize a web tool's `url` input, or `null` when it is not a
|
|
64
|
+
* URL this system will fetch.
|
|
65
|
+
*
|
|
66
|
+
* Accepts `https://host/path`, `http://…`, bare `host/path`, and `host:port`
|
|
67
|
+
* shorthand. Rejects path-only input and any other scheme (`file:`, `data:`,
|
|
68
|
+
* `javascript:`), so a non-http target can never acquire a web trust rule.
|
|
69
|
+
*/
|
|
70
|
+
export function normalizeWebUrl(rawUrl: string): URL | null {
|
|
71
|
+
const trimmed = rawUrl.trim();
|
|
72
|
+
if (!trimmed) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (looksLikeHostPortShorthand(trimmed)) {
|
|
77
|
+
try {
|
|
78
|
+
return canonicalizeWebUrl(new URL(`https://${trimmed}`));
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const parsed = new URL(trimmed);
|
|
86
|
+
if (parsed.protocol === "http:" || parsed.protocol === "https:") {
|
|
87
|
+
return canonicalizeWebUrl(parsed);
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
} catch {
|
|
91
|
+
// Not an absolute URL; fall through to the shorthand forms.
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (looksLikePathOnlyInput(trimmed)) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
return canonicalizeWebUrl(new URL(`https://${trimmed}`));
|
|
104
|
+
} catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
package/openapi.yaml
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
openapi: 3.1.0
|
|
4
4
|
info:
|
|
5
5
|
title: Vellum Assistant API
|
|
6
|
-
version: 0.11.
|
|
6
|
+
version: 0.11.5
|
|
7
7
|
description: Auto-generated OpenAPI specification for the Vellum Assistant runtime HTTP server.
|
|
8
8
|
servers:
|
|
9
9
|
- url: http://127.0.0.1:7821
|
|
@@ -4651,6 +4651,47 @@ paths:
|
|
|
4651
4651
|
required:
|
|
4652
4652
|
- recorded
|
|
4653
4653
|
additionalProperties: false
|
|
4654
|
+
/v1/clients/web-presence:
|
|
4655
|
+
post:
|
|
4656
|
+
operationId: clients_webpresence_post
|
|
4657
|
+
summary: Report web tab visibility and focused conversation
|
|
4658
|
+
description:
|
|
4659
|
+
Record the visibility and focused conversation reported by the web client identified by the
|
|
4660
|
+
X-Vellum-Client-Id header.
|
|
4661
|
+
tags:
|
|
4662
|
+
- clients
|
|
4663
|
+
requestBody:
|
|
4664
|
+
required: true
|
|
4665
|
+
content:
|
|
4666
|
+
application/json:
|
|
4667
|
+
schema:
|
|
4668
|
+
type: object
|
|
4669
|
+
properties:
|
|
4670
|
+
visible:
|
|
4671
|
+
type: boolean
|
|
4672
|
+
description: Whether the reporting tab is currently visible.
|
|
4673
|
+
focusedConversationId:
|
|
4674
|
+
anyOf:
|
|
4675
|
+
- type: string
|
|
4676
|
+
- type: "null"
|
|
4677
|
+
description: The conversation currently focused (chat composer on screen) in the tab, or null.
|
|
4678
|
+
required:
|
|
4679
|
+
- visible
|
|
4680
|
+
- focusedConversationId
|
|
4681
|
+
responses:
|
|
4682
|
+
"200":
|
|
4683
|
+
description: Successful response
|
|
4684
|
+
content:
|
|
4685
|
+
application/json:
|
|
4686
|
+
schema:
|
|
4687
|
+
type: object
|
|
4688
|
+
properties:
|
|
4689
|
+
recorded:
|
|
4690
|
+
type: boolean
|
|
4691
|
+
description: Whether a connected client matched the reporting clientId.
|
|
4692
|
+
required:
|
|
4693
|
+
- recorded
|
|
4694
|
+
additionalProperties: false
|
|
4654
4695
|
/v1/config:
|
|
4655
4696
|
get:
|
|
4656
4697
|
operationId: config_get
|
|
@@ -6608,6 +6649,20 @@ paths:
|
|
|
6608
6649
|
predicate behind the unread count and the section index, so a client that keeps no complete conversation
|
|
6609
6650
|
list can ask for exactly the rows its attention surfaces need. Composes with every other filter. Any value
|
|
6610
6651
|
other than "true" is rejected. Omit to span every conversation.'
|
|
6652
|
+
- name: foregroundOnly
|
|
6653
|
+
in: query
|
|
6654
|
+
required: false
|
|
6655
|
+
schema:
|
|
6656
|
+
type: string
|
|
6657
|
+
enum:
|
|
6658
|
+
- "true"
|
|
6659
|
+
description:
|
|
6660
|
+
Pass "true" to return only user-facing foreground conversations, dropping the automated background and
|
|
6661
|
+
scheduled runs the standard listing admits when they are filed in a custom group (a surfaced run stays).
|
|
6662
|
+
This is the same predicate the unread count and the section index apply, so a client can ask for the newest
|
|
6663
|
+
conversation a user can open in one row instead of paging past runs it would skip. Composes with every other
|
|
6664
|
+
filter; a foreground-only first page never has pinned rows appended to it. Any value other than "true" is
|
|
6665
|
+
rejected. Omit to keep every visible row.
|
|
6611
6666
|
responses:
|
|
6612
6667
|
"200":
|
|
6613
6668
|
description: Successful response
|
|
@@ -9831,7 +9886,10 @@ paths:
|
|
|
9831
9886
|
post:
|
|
9832
9887
|
operationId: credentials_delete_post
|
|
9833
9888
|
summary: Delete a credential
|
|
9834
|
-
description:
|
|
9889
|
+
description:
|
|
9890
|
+
Remove a secret, its metadata, and any associated OAuth connection from the vault. Refused with
|
|
9891
|
+
CREDENTIAL_IN_USE while an LLM provider connection resolves its auth through the credential, unless `force` is
|
|
9892
|
+
set.
|
|
9835
9893
|
tags:
|
|
9836
9894
|
- credentials
|
|
9837
9895
|
requestBody:
|
|
@@ -9847,6 +9905,9 @@ paths:
|
|
|
9847
9905
|
field:
|
|
9848
9906
|
type: string
|
|
9849
9907
|
description: Field name
|
|
9908
|
+
force:
|
|
9909
|
+
description: Delete even when provider connections depend on the credential
|
|
9910
|
+
type: boolean
|
|
9850
9911
|
required:
|
|
9851
9912
|
- service
|
|
9852
9913
|
- field
|
|
@@ -9862,9 +9923,15 @@ paths:
|
|
|
9862
9923
|
type: string
|
|
9863
9924
|
field:
|
|
9864
9925
|
type: string
|
|
9926
|
+
affectedConnections:
|
|
9927
|
+
type: array
|
|
9928
|
+
items:
|
|
9929
|
+
type: string
|
|
9930
|
+
description: Provider connections that depended on the deleted credential
|
|
9865
9931
|
required:
|
|
9866
9932
|
- service
|
|
9867
9933
|
- field
|
|
9934
|
+
- affectedConnections
|
|
9868
9935
|
additionalProperties: false
|
|
9869
9936
|
/v1/credentials/inspect:
|
|
9870
9937
|
post:
|
|
@@ -21445,6 +21512,10 @@ paths:
|
|
|
21445
21512
|
anyOf:
|
|
21446
21513
|
- type: number
|
|
21447
21514
|
- type: "null"
|
|
21515
|
+
inactiveFileBytes:
|
|
21516
|
+
anyOf:
|
|
21517
|
+
- type: number
|
|
21518
|
+
- type: "null"
|
|
21448
21519
|
kernelBytes:
|
|
21449
21520
|
anyOf:
|
|
21450
21521
|
- type: number
|
|
@@ -21468,6 +21539,7 @@ paths:
|
|
|
21468
21539
|
required:
|
|
21469
21540
|
- anonBytes
|
|
21470
21541
|
- fileBytes
|
|
21542
|
+
- inactiveFileBytes
|
|
21471
21543
|
- kernelBytes
|
|
21472
21544
|
- slabReclaimableBytes
|
|
21473
21545
|
- slabUnreclaimableBytes
|
|
@@ -23021,6 +23093,51 @@ paths:
|
|
|
23021
23093
|
additionalProperties: {}
|
|
23022
23094
|
- type: "null"
|
|
23023
23095
|
description: Pending secret request or null
|
|
23096
|
+
pendingQuestion:
|
|
23097
|
+
anyOf:
|
|
23098
|
+
- type: object
|
|
23099
|
+
properties:
|
|
23100
|
+
requestId:
|
|
23101
|
+
type: string
|
|
23102
|
+
entries:
|
|
23103
|
+
type: array
|
|
23104
|
+
items:
|
|
23105
|
+
type: object
|
|
23106
|
+
properties:
|
|
23107
|
+
id:
|
|
23108
|
+
type: string
|
|
23109
|
+
question:
|
|
23110
|
+
type: string
|
|
23111
|
+
description:
|
|
23112
|
+
type: string
|
|
23113
|
+
options:
|
|
23114
|
+
type: array
|
|
23115
|
+
items:
|
|
23116
|
+
type: object
|
|
23117
|
+
properties:
|
|
23118
|
+
id:
|
|
23119
|
+
type: string
|
|
23120
|
+
label:
|
|
23121
|
+
type: string
|
|
23122
|
+
description:
|
|
23123
|
+
type: string
|
|
23124
|
+
required:
|
|
23125
|
+
- id
|
|
23126
|
+
- label
|
|
23127
|
+
additionalProperties: false
|
|
23128
|
+
freeTextPlaceholder:
|
|
23129
|
+
type: string
|
|
23130
|
+
required:
|
|
23131
|
+
- id
|
|
23132
|
+
- question
|
|
23133
|
+
- options
|
|
23134
|
+
additionalProperties: false
|
|
23135
|
+
required:
|
|
23136
|
+
- requestId
|
|
23137
|
+
- entries
|
|
23138
|
+
additionalProperties: false
|
|
23139
|
+
- type: "null"
|
|
23140
|
+
description: Outstanding ask_question prompt or null
|
|
23024
23141
|
interactions:
|
|
23025
23142
|
type: array
|
|
23026
23143
|
items:
|
|
@@ -25286,6 +25403,74 @@ paths:
|
|
|
25286
25403
|
responses:
|
|
25287
25404
|
"200":
|
|
25288
25405
|
description: Successful response
|
|
25406
|
+
/v1/resource-pressure/status:
|
|
25407
|
+
get:
|
|
25408
|
+
operationId: resourcepressure_status_get
|
|
25409
|
+
summary: Get resource pressure status
|
|
25410
|
+
description:
|
|
25411
|
+
Return the current resource pressure status snapshot. Off-platform the guard does not run, so a disabled
|
|
25412
|
+
status is returned.
|
|
25413
|
+
tags:
|
|
25414
|
+
- resource-pressure
|
|
25415
|
+
responses:
|
|
25416
|
+
"200":
|
|
25417
|
+
description: Successful response
|
|
25418
|
+
content:
|
|
25419
|
+
application/json:
|
|
25420
|
+
schema:
|
|
25421
|
+
type: object
|
|
25422
|
+
properties:
|
|
25423
|
+
status:
|
|
25424
|
+
type: object
|
|
25425
|
+
properties:
|
|
25426
|
+
enabled:
|
|
25427
|
+
type: boolean
|
|
25428
|
+
state:
|
|
25429
|
+
type: string
|
|
25430
|
+
enum:
|
|
25431
|
+
- disabled
|
|
25432
|
+
- ok
|
|
25433
|
+
- elevated
|
|
25434
|
+
- unknown
|
|
25435
|
+
cpuPercent:
|
|
25436
|
+
anyOf:
|
|
25437
|
+
- type: number
|
|
25438
|
+
- type: "null"
|
|
25439
|
+
memoryPercent:
|
|
25440
|
+
anyOf:
|
|
25441
|
+
- type: number
|
|
25442
|
+
- type: "null"
|
|
25443
|
+
cpuElevated:
|
|
25444
|
+
type: boolean
|
|
25445
|
+
memoryElevated:
|
|
25446
|
+
type: boolean
|
|
25447
|
+
cpuThresholdPercent:
|
|
25448
|
+
type: number
|
|
25449
|
+
memoryThresholdPercent:
|
|
25450
|
+
type: number
|
|
25451
|
+
lastCheckedAt:
|
|
25452
|
+
anyOf:
|
|
25453
|
+
- type: string
|
|
25454
|
+
- type: "null"
|
|
25455
|
+
error:
|
|
25456
|
+
anyOf:
|
|
25457
|
+
- type: string
|
|
25458
|
+
- type: "null"
|
|
25459
|
+
required:
|
|
25460
|
+
- enabled
|
|
25461
|
+
- state
|
|
25462
|
+
- cpuPercent
|
|
25463
|
+
- memoryPercent
|
|
25464
|
+
- cpuElevated
|
|
25465
|
+
- memoryElevated
|
|
25466
|
+
- cpuThresholdPercent
|
|
25467
|
+
- memoryThresholdPercent
|
|
25468
|
+
- lastCheckedAt
|
|
25469
|
+
- error
|
|
25470
|
+
additionalProperties: false
|
|
25471
|
+
required:
|
|
25472
|
+
- status
|
|
25473
|
+
additionalProperties: false
|
|
25289
25474
|
/v1/retrospective/config:
|
|
25290
25475
|
get:
|
|
25291
25476
|
operationId: retrospective_config_get
|
|
@@ -27818,7 +28003,9 @@ paths:
|
|
|
27818
28003
|
delete:
|
|
27819
28004
|
operationId: secrets_delete
|
|
27820
28005
|
summary: Delete a secret
|
|
27821
|
-
description:
|
|
28006
|
+
description:
|
|
28007
|
+
Remove a secret from the credential vault by name. Refused with CREDENTIAL_IN_USE while an LLM provider
|
|
28008
|
+
connection resolves its auth through the credential, unless `force` is set.
|
|
27822
28009
|
tags:
|
|
27823
28010
|
- secrets
|
|
27824
28011
|
requestBody:
|
|
@@ -27834,6 +28021,9 @@ paths:
|
|
|
27834
28021
|
name:
|
|
27835
28022
|
type: string
|
|
27836
28023
|
description: Name of the secret to delete
|
|
28024
|
+
force:
|
|
28025
|
+
description: Delete even when provider connections depend on the credential
|
|
28026
|
+
type: boolean
|
|
27837
28027
|
required:
|
|
27838
28028
|
- type
|
|
27839
28029
|
- name
|