@vellumai/assistant 0.8.7 → 0.8.8-dev.202606052332.17fc8ea
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/Dockerfile +20 -4
- package/bun.lock +2 -2
- package/docker-entrypoint.sh +4 -2
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/examples/plugins/echo/README.md +61 -66
- package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
- package/examples/plugins/echo/hooks/stop.ts +16 -0
- package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
- package/examples/plugins/echo/package.json +1 -2
- package/examples/plugins/echo/src/emit.ts +19 -0
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +3378 -335
- package/package.json +2 -2
- package/scripts/generate-openapi.ts +68 -41
- package/src/__tests__/agent-loop-exit-reason.test.ts +35 -93
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +37 -87
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -3
- package/src/__tests__/anthropic-provider.test.ts +95 -2
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/{conversation-stream-state.test.ts → assistant-stream-state.test.ts} +252 -91
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
- package/src/__tests__/btw-routes.test.ts +62 -3
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- package/src/__tests__/catalog-files.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/clawhub-files.test.ts +1 -1
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +132 -0
- package/src/__tests__/compaction.benchmark.test.ts +0 -30
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +57 -19
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +6 -5
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -7
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +316 -1143
- package/src/__tests__/conversation-agent-loop.test.ts +638 -1655
- package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-pairing.test.ts +4 -31
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +6 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -10
- package/src/__tests__/conversation-queue.test.ts +2 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +6 -5
- package/src/__tests__/conversation-runtime-assembly.test.ts +310 -300
- package/src/__tests__/conversation-runtime-workspace.test.ts +105 -45
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +6 -1
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +84 -0
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +17 -16
- package/src/__tests__/conversation-workspace-injection.test.ts +67 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +7 -6
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/cross-provider-web-search.test.ts +214 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
- package/src/__tests__/dm-persistence.test.ts +5 -1
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +12 -2
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/mock-provider.ts +110 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
- package/src/__tests__/history-repair-hook.test.ts +1 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/identity-intro-cache.test.ts +12 -100
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +5 -1
- package/src/__tests__/injector-background-turn.test.ts +3 -9
- package/src/__tests__/injector-chain.test.ts +139 -275
- package/src/__tests__/injector-disk-pressure.test.ts +75 -41
- package/src/__tests__/injector-document-comments.test.ts +3 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
- package/src/__tests__/injector-v3-suppression.test.ts +31 -37
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/list-messages-page-latest.test.ts +60 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +20 -0
- package/src/__tests__/llm-usage-store.test.ts +223 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/native-web-search.test.ts +191 -0
- package/src/__tests__/onboarding-template-contract.test.ts +2 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +31 -1
- package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -284
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-api-shim.test.ts +3 -6
- package/src/__tests__/plugin-bootstrap.test.ts +14 -40
- package/src/__tests__/plugin-registry.test.ts +3 -76
- package/src/__tests__/plugin-types.test.ts +0 -193
- package/src/__tests__/process-message-display-content.test.ts +6 -2
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +60 -23
- package/src/__tests__/schedule-routes.test.ts +603 -2
- package/src/__tests__/schedule-store.test.ts +41 -0
- package/src/__tests__/schedule-tools.test.ts +35 -0
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
- package/src/__tests__/skillssh-files.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/system-prompt.test.ts +20 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +6 -1
- package/src/__tests__/title-generate-hook.test.ts +319 -0
- package/src/__tests__/tool-error-hook.test.ts +278 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +468 -5
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -2
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/voice-session-bridge.test.ts +6 -3
- package/src/__tests__/web-search-backend-failure.test.ts +166 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +196 -0
- package/src/acp/auto-install.ts +177 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/feature-gate.test.ts +48 -0
- package/src/acp/feature-gate.ts +34 -0
- package/src/acp/prepare-agent-env.ts +83 -29
- package/src/acp/resolve-agent.test.ts +320 -7
- package/src/acp/resolve-agent.ts +182 -18
- package/src/acp/resume-hint.ts +25 -0
- package/src/acp/session-manager.ts +495 -73
- package/src/acp/types.ts +8 -0
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +362 -485
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/tool-output-chunk.ts +45 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/trace-event.ts +69 -0
- package/src/api/index.ts +48 -13
- package/src/api/responses/conversation-message.ts +374 -0
- package/src/approvals/guardian-request-resolvers.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +34 -29
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/notifications.ts +112 -60
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +6 -0
- package/src/config/assistant-feature-flags.ts +22 -11
- package/src/config/bundled-skills/acp/SKILL.md +83 -31
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -398
- package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
- package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
- package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
- package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +48 -7
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-v2.ts +8 -0
- package/src/config/schemas/memory-v3.ts +8 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +1 -1
- package/src/context/strip-injections.ts +128 -0
- package/src/context/token-estimator.ts +23 -0
- package/src/context/tool-result-truncation.ts +0 -23
- package/src/context/window-manager.ts +5 -7
- package/src/credential-execution/executable-discovery.ts +16 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +594 -153
- package/src/daemon/conversation-agent-loop.ts +301 -997
- package/src/daemon/conversation-history.ts +5 -4
- package/src/daemon/conversation-lifecycle.ts +3 -4
- package/src/daemon/conversation-messaging.ts +7 -6
- package/src/daemon/conversation-process.ts +11 -16
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +218 -398
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +222 -4
- package/src/daemon/conversation-tool-setup.ts +2 -29
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +32 -20
- package/src/daemon/external-plugins-bootstrap.ts +17 -18
- package/src/daemon/handlers/config-a2a.ts +51 -36
- package/src/daemon/handlers/config-slack-channel.ts +20 -14
- package/src/daemon/handlers/config-telegram.ts +16 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/shared.ts +156 -84
- package/src/daemon/handlers/skills.ts +42 -10
- package/src/daemon/lifecycle.ts +25 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/messages.ts +9 -57
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +136 -3
- package/src/daemon/now-scratchpad.ts +21 -0
- package/src/daemon/orphan-reaper.test.ts +210 -0
- package/src/daemon/orphan-reaper.ts +240 -0
- package/src/daemon/overflow-reduction-loop.ts +230 -0
- package/src/daemon/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +1 -3
- package/src/daemon/server.ts +2 -0
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +19 -0
- package/src/daemon/wake-target-adapter.ts +3 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
- package/src/heartbeat/heartbeat-run-store.ts +23 -1
- package/src/heartbeat/heartbeat-service.ts +26 -0
- package/src/home/home-greeting-cache.ts +24 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.ts +3 -3
- package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
- package/src/ipc/skill-routes/memory.ts +4 -2
- package/src/media/gemini-image-service.ts +15 -0
- package/src/media/openai-image-service.ts +14 -0
- package/src/media/types.ts +34 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +6 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/conversation-graph-memory.ts +65 -0
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs-store.ts +33 -0
- package/src/memory/jobs-worker.ts +32 -5
- package/src/memory/llm-usage-store.ts +224 -50
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
- package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/pkb/autoinject.ts +61 -0
- package/src/memory/pkb/context.ts +50 -0
- package/src/memory/pkb/types.ts +14 -0
- package/src/memory/schedule-attribution-sql.ts +104 -0
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +16 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -4
- package/src/memory/v2/consolidation-job.ts +14 -5
- package/src/notifications/conversation-pairing.ts +8 -15
- package/src/notifications/decision-engine.ts +6 -3
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/permissions/prompter.ts +4 -0
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +7 -5
- package/src/plugin-api/types.ts +151 -1
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/compaction/register.ts +8 -19
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/register.ts +8 -13
- package/src/plugins/defaults/index.ts +2 -18
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +288 -81
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +16 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +4 -4
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +48 -12
- package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +104 -32
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +96 -30
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +34 -16
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +5 -5
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
- package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +8 -8
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +26 -14
- package/src/plugins/defaults/{llm-call → memory-v3-shadow}/package.json +2 -2
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
- package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +3 -3
- package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +51 -45
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +61 -46
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +69 -99
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +8 -0
- package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/title-generate/register.ts +18 -18
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-error/register.ts +9 -21
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +10 -21
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +37 -18
- package/src/plugins/external-api.ts +2 -2
- package/src/plugins/pipeline.ts +6 -305
- package/src/plugins/registry.ts +10 -55
- package/src/plugins/types.ts +62 -797
- package/src/plugins/user-loader.ts +30 -127
- package/src/proactive-artifact/aux-message-injector.ts +4 -4
- package/src/proactive-artifact/job.test.ts +8 -13
- package/src/prompts/__tests__/system-prompt.test.ts +42 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +15 -0
- package/src/providers/anthropic/client.ts +37 -29
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -0
- package/src/providers/openrouter/client.ts +1 -0
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/runtime/__tests__/agent-wake.test.ts +10 -6
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +2 -5
- package/src/runtime/assistant-event-hub.ts +37 -7
- package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/http-router.ts +16 -21
- package/src/runtime/http-types.ts +16 -70
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.test.ts +89 -25
- package/src/runtime/routes/acp-routes.ts +81 -29
- package/src/runtime/routes/app-management-routes.ts +6 -117
- package/src/runtime/routes/app-routes.ts +13 -15
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +26 -15
- package/src/runtime/routes/avatar-routes.ts +26 -0
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/btw-routes.ts +29 -23
- package/src/runtime/routes/consolidation-routes.ts +120 -20
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +3 -1
- package/src/runtime/routes/conversation-routes.ts +372 -185
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/documents-routes.ts +4 -0
- package/src/runtime/routes/domain-routes.ts +51 -37
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +28 -34
- package/src/runtime/routes/gateway-log-routes.ts +26 -4
- package/src/runtime/routes/heartbeat-routes.ts +32 -12
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/identity-intro-cache.ts +11 -34
- package/src/runtime/routes/identity-routes.ts +224 -18
- package/src/runtime/routes/image-generation-routes.ts +40 -2
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/a2a.ts +12 -10
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +4 -0
- package/src/runtime/routes/integrations/slack/share.ts +27 -6
- package/src/runtime/routes/integrations/telegram.ts +6 -0
- package/src/runtime/routes/integrations/twilio.ts +42 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
- package/src/runtime/routes/log-export-routes.ts +8 -0
- package/src/runtime/routes/memory-v2-routes.ts +15 -8
- package/src/runtime/routes/memory-v3-routes.ts +66 -34
- package/src/runtime/routes/oauth-apps.ts +66 -12
- package/src/runtime/routes/oauth-providers.ts +44 -5
- package/src/runtime/routes/platform-routes.ts +81 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +6 -4
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/schedule-routes.ts +152 -42
- package/src/runtime/routes/secret-routes.ts +14 -2
- package/src/runtime/routes/skills-routes.ts +43 -14
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
- package/src/runtime/routes/trust-rules-routes.ts +26 -2
- package/src/runtime/routes/tts-routes.ts +35 -0
- package/src/runtime/routes/types.ts +66 -8
- package/src/runtime/routes/usage-routes.ts +47 -39
- package/src/runtime/routes/webhook-routes.ts +41 -2
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +4 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +6 -0
- package/src/runtime/services/analyze-conversation.ts +2 -2
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/schedule/schedule-store.ts +20 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +12 -5
- package/src/signals/cancel.ts +2 -4
- package/src/skills/catalog-files.ts +2 -2
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -2
- package/src/skills/skillssh-files.ts +1 -2
- package/src/subagent/manager.ts +17 -5
- package/src/telemetry/types.ts +29 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +112 -3
- package/src/telemetry/usage-telemetry-reporter.ts +57 -2
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +7 -1
- package/src/tools/acp/spawn.test.ts +158 -55
- package/src/tools/acp/spawn.ts +47 -72
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +13 -8
- package/src/tools/executor.ts +1 -53
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
- package/src/tools/network/__tests__/web-search.test.ts +11 -3
- package/src/tools/network/web-search-error.test.ts +248 -0
- package/src/tools/network/web-search-error.ts +267 -0
- package/src/tools/network/web-search.ts +207 -48
- package/src/tools/schedule/create.ts +2 -0
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/ui-surface/definitions.ts +34 -5
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/util/mutex.ts +47 -0
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
- package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/docs/plugins.md +0 -836
- package/examples/plugins/echo/register.ts +0 -184
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
- package/src/__tests__/empty-response-pipeline.test.ts +0 -423
- package/src/__tests__/llm-call-pipeline.test.ts +0 -287
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -503
- package/src/__tests__/pipeline-runner.test.ts +0 -564
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -479
- package/src/__tests__/tool-error-pipeline.test.ts +0 -241
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -341
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/home/feature-gate.ts +0 -22
- package/src/memory/v3/provider-blocks.ts +0 -16
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
- package/src/plugins/defaults/circuit-breaker/package.json +0 -15
- package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
- package/src/plugins/defaults/compaction/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +0 -22
- package/src/plugins/defaults/empty-response/terminal.ts +0 -106
- package/src/plugins/defaults/injectors/package.json +0 -15
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +0 -17
- package/src/plugins/defaults/llm-call/register.ts +0 -45
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +0 -17
- package/src/plugins/defaults/memory-retrieval/package.json +0 -15
- package/src/plugins/defaults/memory-retrieval/register.ts +0 -181
- package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
- package/src/plugins/defaults/overflow-reduce/package.json +0 -15
- package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +0 -19
- package/src/plugins/defaults/persistence/package.json +0 -15
- package/src/plugins/defaults/persistence/register.ts +0 -38
- package/src/plugins/defaults/persistence/terminal.ts +0 -83
- package/src/plugins/defaults/title-generate/terminal.ts +0 -31
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +0 -23
- package/src/plugins/defaults/token-estimate/package.json +0 -15
- package/src/plugins/defaults/token-estimate/register.ts +0 -34
- package/src/plugins/defaults/token-estimate/terminal.ts +0 -40
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +0 -21
- package/src/plugins/defaults/tool-error/terminal.ts +0 -47
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +0 -23
- package/src/plugins/defaults/tool-execute/package.json +0 -15
- package/src/plugins/defaults/tool-execute/register.ts +0 -49
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/types.ts +0 -22
- package/src/skills/category-inference.ts +0 -111
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* bearer-token authenticated via the standard runtime auth middleware.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
|
|
9
11
|
import { orchestrateOAuthConnect } from "../../oauth/connect-orchestrator.js";
|
|
10
12
|
import {
|
|
11
13
|
deleteApp,
|
|
@@ -22,11 +24,8 @@ import {
|
|
|
22
24
|
} from "../../oauth/oauth-store.js";
|
|
23
25
|
import { serializeProviderSummary } from "../../oauth/provider-serializer.js";
|
|
24
26
|
import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
InternalError,
|
|
28
|
-
NotFoundError,
|
|
29
|
-
} from "./errors.js";
|
|
27
|
+
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
28
|
+
import { oauthProviderSummarySchema } from "./oauth-providers.js";
|
|
30
29
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
31
30
|
|
|
32
31
|
function parseGrantedScopes(
|
|
@@ -131,17 +130,14 @@ async function handleUpsertApp({ body = {} }: RouteHandlerArgs) {
|
|
|
131
130
|
const clientId = b.client_id as string | undefined;
|
|
132
131
|
|
|
133
132
|
if (!providerKey || !clientId) {
|
|
134
|
-
throw new BadRequestError(
|
|
135
|
-
"provider_key and client_id are required",
|
|
136
|
-
);
|
|
133
|
+
throw new BadRequestError("provider_key and client_id are required");
|
|
137
134
|
}
|
|
138
135
|
|
|
139
136
|
const clientSecretOpts = b.client_secret
|
|
140
137
|
? { clientSecretValue: b.client_secret as string }
|
|
141
138
|
: b.client_secret_credential_path
|
|
142
139
|
? {
|
|
143
|
-
clientSecretCredentialPath:
|
|
144
|
-
b.client_secret_credential_path as string,
|
|
140
|
+
clientSecretCredentialPath: b.client_secret_credential_path as string,
|
|
145
141
|
}
|
|
146
142
|
: undefined;
|
|
147
143
|
|
|
@@ -297,6 +293,38 @@ async function handleConnectApp({ pathParams = {}, body }: RouteHandlerArgs) {
|
|
|
297
293
|
return { ok: true };
|
|
298
294
|
}
|
|
299
295
|
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
// Schemas
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
|
|
300
|
+
/** Custom OAuth app registration (snake_case wire shape from `formatAppRow`). */
|
|
301
|
+
const oauthAppSchema = z.object({
|
|
302
|
+
id: z.string(),
|
|
303
|
+
provider_key: z.string(),
|
|
304
|
+
client_id: z.string(),
|
|
305
|
+
created_at: z.number(),
|
|
306
|
+
updated_at: z.number(),
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
/** OAuth connection linked to a custom OAuth app. */
|
|
310
|
+
const oauthAppConnectionSchema = z.object({
|
|
311
|
+
id: z.string(),
|
|
312
|
+
provider_key: z.string(),
|
|
313
|
+
account_info: z.string().nullable(),
|
|
314
|
+
granted_scopes: z.array(z.string()),
|
|
315
|
+
status: z.string(),
|
|
316
|
+
has_refresh_token: z.boolean(),
|
|
317
|
+
expires_at: z.number().nullable(),
|
|
318
|
+
created_at: z.number(),
|
|
319
|
+
updated_at: z.number(),
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
const oauthAppCredentialsSchema = z.object({
|
|
323
|
+
provider_key: z.string(),
|
|
324
|
+
client_id: z.string(),
|
|
325
|
+
client_secret: z.string(),
|
|
326
|
+
});
|
|
327
|
+
|
|
300
328
|
// ---------------------------------------------------------------------------
|
|
301
329
|
// Route definitions
|
|
302
330
|
// ---------------------------------------------------------------------------
|
|
@@ -321,6 +349,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
321
349
|
description: "OAuth provider key to filter by",
|
|
322
350
|
},
|
|
323
351
|
],
|
|
352
|
+
responseBody: z.object({
|
|
353
|
+
provider: oauthProviderSummarySchema.nullable(),
|
|
354
|
+
apps: z.array(oauthAppSchema),
|
|
355
|
+
}),
|
|
324
356
|
handler: handleListApps,
|
|
325
357
|
},
|
|
326
358
|
{
|
|
@@ -352,6 +384,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
352
384
|
description: "OAuth client ID (requires provider)",
|
|
353
385
|
},
|
|
354
386
|
],
|
|
387
|
+
responseBody: z.object({ app: oauthAppSchema }),
|
|
355
388
|
handler: handleGetApp,
|
|
356
389
|
},
|
|
357
390
|
{
|
|
@@ -366,6 +399,13 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
366
399
|
description:
|
|
367
400
|
"Create or return an existing OAuth app registration. Updates client secret if provided.",
|
|
368
401
|
tags: ["oauth"],
|
|
402
|
+
requestBody: z.object({
|
|
403
|
+
provider_key: z.string(),
|
|
404
|
+
client_id: z.string(),
|
|
405
|
+
client_secret: z.string().optional(),
|
|
406
|
+
client_secret_credential_path: z.string().optional(),
|
|
407
|
+
}),
|
|
408
|
+
responseBody: z.object({ app: oauthAppSchema }),
|
|
369
409
|
handler: handleUpsertApp,
|
|
370
410
|
},
|
|
371
411
|
{
|
|
@@ -379,6 +419,8 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
379
419
|
summary: "Create OAuth app",
|
|
380
420
|
description: "Register a new OAuth app with client credentials.",
|
|
381
421
|
tags: ["oauth"],
|
|
422
|
+
requestBody: oauthAppCredentialsSchema,
|
|
423
|
+
responseBody: z.object({ app: oauthAppSchema }),
|
|
382
424
|
responseStatus: "201",
|
|
383
425
|
handler: handleCreateApp,
|
|
384
426
|
},
|
|
@@ -391,9 +433,9 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
391
433
|
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
392
434
|
},
|
|
393
435
|
summary: "Delete OAuth app",
|
|
394
|
-
description:
|
|
395
|
-
"Delete an OAuth app and disconnect all its connections.",
|
|
436
|
+
description: "Delete an OAuth app and disconnect all its connections.",
|
|
396
437
|
tags: ["oauth"],
|
|
438
|
+
responseBody: z.object({ ok: z.boolean() }),
|
|
397
439
|
handler: handleDeleteApp,
|
|
398
440
|
},
|
|
399
441
|
{
|
|
@@ -407,6 +449,9 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
407
449
|
summary: "List OAuth connections",
|
|
408
450
|
description: "List connections for an OAuth app.",
|
|
409
451
|
tags: ["oauth"],
|
|
452
|
+
responseBody: z.object({
|
|
453
|
+
connections: z.array(oauthAppConnectionSchema),
|
|
454
|
+
}),
|
|
410
455
|
handler: handleListConnections,
|
|
411
456
|
},
|
|
412
457
|
{
|
|
@@ -420,6 +465,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
420
465
|
summary: "Disconnect OAuth connection",
|
|
421
466
|
description: "Disconnect a single OAuth connection.",
|
|
422
467
|
tags: ["oauth"],
|
|
468
|
+
responseBody: z.object({ ok: z.boolean() }),
|
|
423
469
|
handler: handleDeleteConnection,
|
|
424
470
|
},
|
|
425
471
|
{
|
|
@@ -433,6 +479,14 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
433
479
|
summary: "Start OAuth connect",
|
|
434
480
|
description: "Start an OAuth connect flow for an app.",
|
|
435
481
|
tags: ["oauth"],
|
|
482
|
+
requestBody: z.object({
|
|
483
|
+
scopes: z.array(z.string()).optional(),
|
|
484
|
+
callback_transport: z.enum(["loopback", "gateway"]).optional(),
|
|
485
|
+
}),
|
|
486
|
+
responseBody: z.union([
|
|
487
|
+
z.object({ auth_url: z.string(), state: z.string() }),
|
|
488
|
+
z.object({ ok: z.literal(true) }),
|
|
489
|
+
]),
|
|
436
490
|
handler: handleConnectApp,
|
|
437
491
|
},
|
|
438
492
|
];
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* the standard runtime auth middleware.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
|
|
9
11
|
import { loadConfig } from "../../config/loader.js";
|
|
10
12
|
import { getOAuthCallbackUrl } from "../../inbound/public-ingress-urls.js";
|
|
11
13
|
import {
|
|
@@ -220,7 +222,8 @@ function handleUpdateProvider({
|
|
|
220
222
|
if (b.default_scopes !== undefined) params.defaultScopes = b.default_scopes;
|
|
221
223
|
if (b.available_scopes !== undefined)
|
|
222
224
|
params.availableScopes = b.available_scopes;
|
|
223
|
-
if (b.scope_separator !== undefined)
|
|
225
|
+
if (b.scope_separator !== undefined)
|
|
226
|
+
params.scopeSeparator = b.scope_separator;
|
|
224
227
|
if (b.token_endpoint_auth_method !== undefined)
|
|
225
228
|
params.tokenEndpointAuthMethod = b.token_endpoint_auth_method;
|
|
226
229
|
if (b.token_exchange_body_format !== undefined)
|
|
@@ -245,13 +248,15 @@ function handleUpdateProvider({
|
|
|
245
248
|
params.injectionTemplates = b.injection_templates;
|
|
246
249
|
if (b.app_type !== undefined) params.appType = b.app_type;
|
|
247
250
|
if (b.identity_url !== undefined) params.identityUrl = b.identity_url;
|
|
248
|
-
if (b.identity_method !== undefined)
|
|
251
|
+
if (b.identity_method !== undefined)
|
|
252
|
+
params.identityMethod = b.identity_method;
|
|
249
253
|
if (b.identity_headers !== undefined)
|
|
250
254
|
params.identityHeaders = b.identity_headers;
|
|
251
255
|
if (b.identity_body !== undefined) params.identityBody = b.identity_body;
|
|
252
256
|
if (b.identity_response_paths !== undefined)
|
|
253
257
|
params.identityResponsePaths = b.identity_response_paths;
|
|
254
|
-
if (b.identity_format !== undefined)
|
|
258
|
+
if (b.identity_format !== undefined)
|
|
259
|
+
params.identityFormat = b.identity_format;
|
|
255
260
|
if (b.identity_ok_field !== undefined)
|
|
256
261
|
params.identityOkField = b.identity_ok_field;
|
|
257
262
|
if (b.setup_notes !== undefined) params.setupNotes = b.setup_notes;
|
|
@@ -321,6 +326,37 @@ async function handleDeleteProvider({
|
|
|
321
326
|
// Route definitions
|
|
322
327
|
// ---------------------------------------------------------------------------
|
|
323
328
|
|
|
329
|
+
/**
|
|
330
|
+
* Lightweight summary projection of an OAuth provider returned by the catalog
|
|
331
|
+
* list endpoint. Mirrors `SerializedProviderSummary` from the provider
|
|
332
|
+
* serializer (snake_case to match the HTTP API convention).
|
|
333
|
+
*/
|
|
334
|
+
export const oauthProviderSummarySchema = z.object({
|
|
335
|
+
provider_key: z.string(),
|
|
336
|
+
display_name: z.string().nullable(),
|
|
337
|
+
description: z.string().nullable(),
|
|
338
|
+
dashboard_url: z.string().nullable(),
|
|
339
|
+
client_id_placeholder: z.string().nullable(),
|
|
340
|
+
requires_client_secret: z.boolean(),
|
|
341
|
+
logo_url: z.string().nullable(),
|
|
342
|
+
supports_managed_mode: z.boolean(),
|
|
343
|
+
managed_service_is_paid: z.boolean(),
|
|
344
|
+
feature_flag: z.string().nullable(),
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Response for the single-provider detail endpoint. The `provider` field is the
|
|
349
|
+
* full serialized provider configuration — an open-ended, admin-defined object
|
|
350
|
+
* whose keys depend on the stored row (parsed JSON blobs, identity templates,
|
|
351
|
+
* and forwarded columns), so it is intentionally typed as an open record rather
|
|
352
|
+
* than a closed schema. `oauth_callback_url` is the ingress callback URL the
|
|
353
|
+
* web UI consumes (null when ingress is not configured).
|
|
354
|
+
*/
|
|
355
|
+
export const oauthProviderDetailSchema = z.object({
|
|
356
|
+
provider: z.record(z.string(), z.unknown()),
|
|
357
|
+
oauth_callback_url: z.string().nullable(),
|
|
358
|
+
});
|
|
359
|
+
|
|
324
360
|
export const ROUTES: RouteDefinition[] = [
|
|
325
361
|
{
|
|
326
362
|
operationId: "oauth_providers_get",
|
|
@@ -331,8 +367,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
331
367
|
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
332
368
|
},
|
|
333
369
|
summary: "List OAuth providers",
|
|
334
|
-
description:
|
|
335
|
-
"List all registered OAuth providers with optional filtering.",
|
|
370
|
+
description: "List all registered OAuth providers with optional filtering.",
|
|
336
371
|
tags: ["oauth"],
|
|
337
372
|
handler: handleListProviders,
|
|
338
373
|
queryParams: [
|
|
@@ -342,6 +377,9 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
342
377
|
description: "Filter by managed mode support (true/false)",
|
|
343
378
|
},
|
|
344
379
|
],
|
|
380
|
+
responseBody: z.object({
|
|
381
|
+
providers: z.array(oauthProviderSummarySchema),
|
|
382
|
+
}),
|
|
345
383
|
},
|
|
346
384
|
{
|
|
347
385
|
operationId: "oauth_providers_by_providerKey_get",
|
|
@@ -355,6 +393,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
355
393
|
description: "Get a single OAuth provider by key.",
|
|
356
394
|
tags: ["oauth"],
|
|
357
395
|
handler: handleGetProvider,
|
|
396
|
+
responseBody: oauthProviderDetailSchema,
|
|
358
397
|
},
|
|
359
398
|
{
|
|
360
399
|
operationId: "oauth_providers_post",
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* registered callback routes for this assistant.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
|
|
17
19
|
import { isPlatformRemote } from "../../config/env-registry.js";
|
|
18
20
|
import {
|
|
19
21
|
registerCallbackRoute,
|
|
@@ -47,13 +49,80 @@ const CREDENTIAL_KEYS = {
|
|
|
47
49
|
userId: { service: "vellum", field: "platform_user_id" },
|
|
48
50
|
} as const;
|
|
49
51
|
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Schemas
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
const VelayTunnelStatusSchema = z.object({
|
|
57
|
+
connected: z.boolean(),
|
|
58
|
+
publicUrl: z.string().nullable(),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const PlatformStatusResponseSchema = z.object({
|
|
62
|
+
isPlatform: z.boolean(),
|
|
63
|
+
baseUrl: z.string(),
|
|
64
|
+
assistantId: z.string(),
|
|
65
|
+
hasAssistantApiKey: z.boolean(),
|
|
66
|
+
hasWebhookSecret: z.boolean(),
|
|
67
|
+
available: z.boolean(),
|
|
68
|
+
organizationId: z.string().nullable(),
|
|
69
|
+
userId: z.string().nullable(),
|
|
70
|
+
velayTunnel: VelayTunnelStatusSchema.nullable(),
|
|
71
|
+
});
|
|
72
|
+
type PlatformStatusResponse = z.infer<typeof PlatformStatusResponseSchema>;
|
|
73
|
+
|
|
74
|
+
const PlatformConnectResponseSchema = z.object({
|
|
75
|
+
alreadyConnected: z.boolean().optional(),
|
|
76
|
+
baseUrl: z.string().optional(),
|
|
77
|
+
showPlatformLogin: z.boolean().optional(),
|
|
78
|
+
});
|
|
79
|
+
type PlatformConnectResponse = z.infer<typeof PlatformConnectResponseSchema>;
|
|
80
|
+
|
|
81
|
+
const PlatformDisconnectResponseSchema = z.object({
|
|
82
|
+
disconnected: z.literal(true),
|
|
83
|
+
previousBaseUrl: z.string().nullable(),
|
|
84
|
+
});
|
|
85
|
+
type PlatformDisconnectResponse = z.infer<
|
|
86
|
+
typeof PlatformDisconnectResponseSchema
|
|
87
|
+
>;
|
|
88
|
+
|
|
89
|
+
const CallbackRouteRegisterRequestSchema = z.object({
|
|
90
|
+
path: z.string(),
|
|
91
|
+
type: z.string(),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const CallbackRouteRegisterResponseSchema = z.object({
|
|
95
|
+
callbackUrl: z.string(),
|
|
96
|
+
callbackPath: z.string(),
|
|
97
|
+
type: z.string(),
|
|
98
|
+
});
|
|
99
|
+
type CallbackRouteRegisterResponse = z.infer<
|
|
100
|
+
typeof CallbackRouteRegisterResponseSchema
|
|
101
|
+
>;
|
|
102
|
+
|
|
103
|
+
const CallbackRouteSchema = z.object({
|
|
104
|
+
id: z.string(),
|
|
105
|
+
assistant_id: z.string(),
|
|
106
|
+
type: z.string(),
|
|
107
|
+
callback_path: z.string(),
|
|
108
|
+
callback_url: z.string(),
|
|
109
|
+
source_identifier: z.string().nullable(),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const CallbackRoutesListResponseSchema = z.object({
|
|
113
|
+
routes: z.array(CallbackRouteSchema),
|
|
114
|
+
});
|
|
115
|
+
type CallbackRoutesListResponse = z.infer<
|
|
116
|
+
typeof CallbackRoutesListResponseSchema
|
|
117
|
+
>;
|
|
118
|
+
|
|
50
119
|
// ---------------------------------------------------------------------------
|
|
51
120
|
// Handlers
|
|
52
121
|
// ---------------------------------------------------------------------------
|
|
53
122
|
|
|
54
123
|
async function handlePlatformStatus(
|
|
55
124
|
_args: RouteHandlerArgs,
|
|
56
|
-
): Promise<
|
|
125
|
+
): Promise<PlatformStatusResponse> {
|
|
57
126
|
const [context, velayTunnel] = await Promise.all([
|
|
58
127
|
resolvePlatformCallbackRegistrationContext(),
|
|
59
128
|
ipcGetVelayStatus().catch(() => null),
|
|
@@ -94,7 +163,7 @@ async function handlePlatformStatus(
|
|
|
94
163
|
|
|
95
164
|
async function handlePlatformConnect(
|
|
96
165
|
_args: RouteHandlerArgs,
|
|
97
|
-
): Promise<
|
|
166
|
+
): Promise<PlatformConnectResponse> {
|
|
98
167
|
// Check if already connected
|
|
99
168
|
const [existingUrl, existingApiKey] = await Promise.all([
|
|
100
169
|
getSecureKeyAsync(
|
|
@@ -128,7 +197,7 @@ async function handlePlatformConnect(
|
|
|
128
197
|
|
|
129
198
|
async function handlePlatformDisconnect(
|
|
130
199
|
_args: RouteHandlerArgs,
|
|
131
|
-
): Promise<
|
|
200
|
+
): Promise<PlatformDisconnectResponse> {
|
|
132
201
|
// Reject if running inside a platform host
|
|
133
202
|
if (isPlatformRemote()) {
|
|
134
203
|
throw new UnprocessableEntityError(
|
|
@@ -197,7 +266,7 @@ async function handlePlatformDisconnect(
|
|
|
197
266
|
|
|
198
267
|
async function handleCallbackRoutesRegister(
|
|
199
268
|
args: RouteHandlerArgs,
|
|
200
|
-
): Promise<
|
|
269
|
+
): Promise<CallbackRouteRegisterResponse> {
|
|
201
270
|
const { path, type } = (args.body ?? {}) as {
|
|
202
271
|
path?: string;
|
|
203
272
|
type?: string;
|
|
@@ -235,7 +304,7 @@ async function handleCallbackRoutesRegister(
|
|
|
235
304
|
|
|
236
305
|
async function handleCallbackRoutesList(
|
|
237
306
|
_args: RouteHandlerArgs,
|
|
238
|
-
): Promise<
|
|
307
|
+
): Promise<CallbackRoutesListResponse> {
|
|
239
308
|
const context = await resolvePlatformCallbackRegistrationContext();
|
|
240
309
|
|
|
241
310
|
if (!context.platformBaseUrl || !context.authHeader) {
|
|
@@ -274,6 +343,7 @@ async function handleCallbackRoutesList(
|
|
|
274
343
|
type: string;
|
|
275
344
|
callback_path: string;
|
|
276
345
|
callback_url: string;
|
|
346
|
+
source_identifier: string | null;
|
|
277
347
|
}>;
|
|
278
348
|
|
|
279
349
|
return { routes };
|
|
@@ -297,6 +367,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
297
367
|
"Aggregates platform context, credentials, assistant ID, webhook secret, and Velay tunnel status.",
|
|
298
368
|
tags: ["platform"],
|
|
299
369
|
handler: handlePlatformStatus,
|
|
370
|
+
responseBody: PlatformStatusResponseSchema,
|
|
300
371
|
},
|
|
301
372
|
{
|
|
302
373
|
operationId: "platform_connect",
|
|
@@ -311,6 +382,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
311
382
|
"Checks existing credentials and emits the show_platform_login signal for connected clients to show a login UI.",
|
|
312
383
|
tags: ["platform"],
|
|
313
384
|
handler: handlePlatformConnect,
|
|
385
|
+
responseBody: PlatformConnectResponseSchema,
|
|
314
386
|
},
|
|
315
387
|
{
|
|
316
388
|
operationId: "platform_disconnect",
|
|
@@ -325,6 +397,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
325
397
|
"Deletes stored platform credentials and emits platform_disconnected signal to connected clients.",
|
|
326
398
|
tags: ["platform"],
|
|
327
399
|
handler: handlePlatformDisconnect,
|
|
400
|
+
responseBody: PlatformDisconnectResponseSchema,
|
|
328
401
|
},
|
|
329
402
|
{
|
|
330
403
|
operationId: "platform_callback_routes_register",
|
|
@@ -339,6 +412,8 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
339
412
|
"Registers a callback route with the platform gateway for inbound provider webhooks.",
|
|
340
413
|
tags: ["platform"],
|
|
341
414
|
handler: handleCallbackRoutesRegister,
|
|
415
|
+
requestBody: CallbackRouteRegisterRequestSchema,
|
|
416
|
+
responseBody: CallbackRouteRegisterResponseSchema,
|
|
342
417
|
},
|
|
343
418
|
{
|
|
344
419
|
operationId: "platform_callback_routes_list",
|
|
@@ -353,5 +428,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
353
428
|
"Lists all callback routes registered with the platform for this assistant.",
|
|
354
429
|
tags: ["platform"],
|
|
355
430
|
handler: handleCallbackRoutesList,
|
|
431
|
+
responseBody: CallbackRoutesListResponseSchema,
|
|
356
432
|
},
|
|
357
433
|
];
|
|
@@ -65,8 +65,12 @@ function makeFakeConversation(
|
|
|
65
65
|
...options.result,
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
+
let processing = options.processing ?? false;
|
|
68
69
|
const fake = {
|
|
69
|
-
|
|
70
|
+
isProcessing: () => processing,
|
|
71
|
+
setProcessing: (value: boolean) => {
|
|
72
|
+
processing = value;
|
|
73
|
+
},
|
|
70
74
|
getMessages(): Message[] {
|
|
71
75
|
if (!returnedAfter && calls === 0) return messagesBefore;
|
|
72
76
|
return messagesAfter;
|
|
@@ -85,9 +89,7 @@ function makeFakeConversation(
|
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
function findRoute() {
|
|
88
|
-
const route = ROUTES.find(
|
|
89
|
-
(r) => r.operationId === "playgroundForceCompact",
|
|
90
|
-
);
|
|
92
|
+
const route = ROUTES.find((r) => r.operationId === "playgroundForceCompact");
|
|
91
93
|
if (!route) throw new Error("force-compact route not registered");
|
|
92
94
|
return route;
|
|
93
95
|
}
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { Conversation } from "../../../daemon/conversation.js";
|
|
10
|
+
import { findConversation } from "../../../daemon/conversation-registry.js";
|
|
10
11
|
import {
|
|
11
12
|
destroyActiveConversation,
|
|
12
|
-
findConversation,
|
|
13
13
|
getOrCreateConversation,
|
|
14
14
|
} from "../../../daemon/conversation-store.js";
|
|
15
15
|
import {
|
|
@@ -23,6 +23,10 @@ const RenameConversationBody = z.object({
|
|
|
23
23
|
title: z.string().min(1),
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
const RenameConversationResponse = z.object({
|
|
27
|
+
ok: z.literal(true),
|
|
28
|
+
});
|
|
29
|
+
|
|
26
30
|
export const ROUTES: RouteDefinition[] = [
|
|
27
31
|
{
|
|
28
32
|
operationId: "rename_conversation",
|
|
@@ -36,6 +40,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
36
40
|
description: "Update the display title of a conversation.",
|
|
37
41
|
tags: ["conversations"],
|
|
38
42
|
requestBody: RenameConversationBody,
|
|
43
|
+
responseBody: RenameConversationResponse,
|
|
39
44
|
handler: ({ body, headers }) => {
|
|
40
45
|
const parsed = RenameConversationBody.safeParse(body);
|
|
41
46
|
if (!parsed.success) {
|