@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
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* without going through the legacy Slack share flow.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
|
|
8
10
|
import { getApp } from "../../../../memory/app-store.js";
|
|
9
11
|
import {
|
|
10
12
|
listConversations,
|
|
@@ -29,12 +31,24 @@ const log = getLogger("slack-share");
|
|
|
29
31
|
// GET /v1/slack/channels
|
|
30
32
|
// ---------------------------------------------------------------------------
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
id: string
|
|
34
|
-
name: string
|
|
35
|
-
type: "channel"
|
|
36
|
-
isPrivate: boolean
|
|
37
|
-
}
|
|
34
|
+
const NormalizedChannelSchema = z.object({
|
|
35
|
+
id: z.string(),
|
|
36
|
+
name: z.string(),
|
|
37
|
+
type: z.enum(["channel", "group", "dm"]),
|
|
38
|
+
isPrivate: z.boolean(),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
type NormalizedChannel = z.infer<typeof NormalizedChannelSchema>;
|
|
42
|
+
|
|
43
|
+
const SlackChannelsListResultSchema = z.object({
|
|
44
|
+
channels: z.array(NormalizedChannelSchema),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const SlackShareResultSchema = z.object({
|
|
48
|
+
ok: z.boolean(),
|
|
49
|
+
ts: z.string(),
|
|
50
|
+
channel: z.string(),
|
|
51
|
+
});
|
|
38
52
|
|
|
39
53
|
function classifyConversation(
|
|
40
54
|
conv: SlackConversation,
|
|
@@ -205,6 +219,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
205
219
|
summary: "List Slack channels",
|
|
206
220
|
description: "List Slack channels, groups, and DMs for the channel picker.",
|
|
207
221
|
tags: ["integrations"],
|
|
222
|
+
responseBody: SlackChannelsListResultSchema,
|
|
208
223
|
handler: () => handleListSlackChannels(),
|
|
209
224
|
},
|
|
210
225
|
{
|
|
@@ -218,6 +233,12 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
218
233
|
summary: "Share to Slack channel",
|
|
219
234
|
description: "Post an app link directly to a Slack channel.",
|
|
220
235
|
tags: ["integrations"],
|
|
236
|
+
requestBody: z.object({
|
|
237
|
+
appId: z.string().describe("App to share"),
|
|
238
|
+
channelId: z.string().describe("Target Slack channel ID"),
|
|
239
|
+
message: z.string().optional().describe("Optional accompanying message"),
|
|
240
|
+
}),
|
|
241
|
+
responseBody: SlackShareResultSchema,
|
|
221
242
|
handler: handleShareToSlackChannel,
|
|
222
243
|
},
|
|
223
244
|
];
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
setTelegramCommands,
|
|
17
17
|
setTelegramConfig,
|
|
18
18
|
setupTelegram,
|
|
19
|
+
TelegramConfigResultSchema,
|
|
19
20
|
} from "../../../daemon/handlers/config-telegram.js";
|
|
20
21
|
import { ACTOR_PRINCIPALS } from "../../auth/route-policy.js";
|
|
21
22
|
import { BadRequestError } from "../errors.js";
|
|
@@ -87,6 +88,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
87
88
|
summary: "Get Telegram config",
|
|
88
89
|
description: "Check current Telegram bot configuration status.",
|
|
89
90
|
tags: ["integrations"],
|
|
91
|
+
responseBody: TelegramConfigResultSchema,
|
|
90
92
|
handler: () => handleGetTelegramConfig(),
|
|
91
93
|
},
|
|
92
94
|
{
|
|
@@ -104,6 +106,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
104
106
|
requestBody: z.object({
|
|
105
107
|
botToken: z.string().describe("Telegram bot token"),
|
|
106
108
|
}),
|
|
109
|
+
responseBody: TelegramConfigResultSchema,
|
|
107
110
|
},
|
|
108
111
|
{
|
|
109
112
|
operationId: "integrations_telegram_config_delete",
|
|
@@ -116,6 +119,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
116
119
|
summary: "Clear Telegram config",
|
|
117
120
|
description: "Clear credentials and deregister webhook.",
|
|
118
121
|
tags: ["integrations"],
|
|
122
|
+
responseBody: TelegramConfigResultSchema,
|
|
119
123
|
handler: () => handleClearTelegramConfig(),
|
|
120
124
|
},
|
|
121
125
|
{
|
|
@@ -129,6 +133,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
129
133
|
summary: "Register Telegram commands",
|
|
130
134
|
description: "Register bot commands with the Telegram API.",
|
|
131
135
|
tags: ["integrations"],
|
|
136
|
+
responseBody: TelegramConfigResultSchema,
|
|
132
137
|
handler: handleSetTelegramCommands,
|
|
133
138
|
},
|
|
134
139
|
{
|
|
@@ -142,6 +147,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
142
147
|
summary: "Setup Telegram",
|
|
143
148
|
description: "Composite: set config + register commands.",
|
|
144
149
|
tags: ["integrations"],
|
|
150
|
+
responseBody: TelegramConfigResultSchema,
|
|
145
151
|
handler: handleSetupTelegram,
|
|
146
152
|
},
|
|
147
153
|
];
|
|
@@ -36,6 +36,41 @@ import { ACTOR_PRINCIPALS } from "../../auth/route-policy.js";
|
|
|
36
36
|
import { BadRequestError, InternalError } from "../errors.js";
|
|
37
37
|
import type { RouteDefinition, RouteHandlerArgs } from "../types.js";
|
|
38
38
|
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Response schemas
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
const TwilioPhoneNumberSchema = z.object({
|
|
44
|
+
phoneNumber: z.string(),
|
|
45
|
+
friendlyName: z.string(),
|
|
46
|
+
capabilities: z.object({ voice: z.boolean() }),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const TwilioConfigResultSchema = z.object({
|
|
50
|
+
success: z.boolean(),
|
|
51
|
+
hasCredentials: z.boolean(),
|
|
52
|
+
accountSid: z.string().optional(),
|
|
53
|
+
phoneNumber: z.string().optional(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const TwilioCredentialsResultSchema = z.object({
|
|
57
|
+
success: z.boolean(),
|
|
58
|
+
hasCredentials: z.boolean(),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const TwilioNumbersResultSchema = z.object({
|
|
62
|
+
success: z.boolean(),
|
|
63
|
+
hasCredentials: z.boolean(),
|
|
64
|
+
numbers: z.array(TwilioPhoneNumberSchema),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const TwilioNumberMutationResultSchema = z.object({
|
|
68
|
+
success: z.boolean(),
|
|
69
|
+
hasCredentials: z.boolean(),
|
|
70
|
+
phoneNumber: z.string().optional(),
|
|
71
|
+
warning: z.string().optional(),
|
|
72
|
+
});
|
|
73
|
+
|
|
39
74
|
// ---------------------------------------------------------------------------
|
|
40
75
|
// Shared helpers
|
|
41
76
|
// ---------------------------------------------------------------------------
|
|
@@ -362,6 +397,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
362
397
|
summary: "Get Twilio config",
|
|
363
398
|
description: "Return current Twilio configuration status.",
|
|
364
399
|
tags: ["integrations"],
|
|
400
|
+
responseBody: TwilioConfigResultSchema,
|
|
365
401
|
handler: () => handleGetTwilioConfig(),
|
|
366
402
|
},
|
|
367
403
|
{
|
|
@@ -380,6 +416,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
380
416
|
accountSid: z.string().describe("Twilio account SID"),
|
|
381
417
|
authToken: z.string().describe("Twilio auth token"),
|
|
382
418
|
}),
|
|
419
|
+
responseBody: TwilioCredentialsResultSchema,
|
|
383
420
|
},
|
|
384
421
|
{
|
|
385
422
|
operationId: "integrations_twilio_credentials_delete",
|
|
@@ -392,6 +429,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
392
429
|
summary: "Clear Twilio credentials",
|
|
393
430
|
description: "Remove stored Twilio credentials.",
|
|
394
431
|
tags: ["integrations"],
|
|
432
|
+
responseBody: TwilioCredentialsResultSchema,
|
|
395
433
|
handler: () => handleClearTwilioCredentials(),
|
|
396
434
|
},
|
|
397
435
|
{
|
|
@@ -405,6 +443,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
405
443
|
summary: "List Twilio numbers",
|
|
406
444
|
description: "List phone numbers on the Twilio account.",
|
|
407
445
|
tags: ["integrations"],
|
|
446
|
+
responseBody: TwilioNumbersResultSchema,
|
|
408
447
|
handler: () => handleListTwilioNumbers(),
|
|
409
448
|
},
|
|
410
449
|
{
|
|
@@ -418,6 +457,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
418
457
|
summary: "Provision Twilio number",
|
|
419
458
|
description: "Search for and provision a new phone number.",
|
|
420
459
|
tags: ["integrations"],
|
|
460
|
+
responseBody: TwilioNumberMutationResultSchema,
|
|
421
461
|
handler: handleProvisionTwilioNumber,
|
|
422
462
|
},
|
|
423
463
|
{
|
|
@@ -431,6 +471,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
431
471
|
summary: "Assign Twilio number",
|
|
432
472
|
description: "Assign an existing phone number to this assistant.",
|
|
433
473
|
tags: ["integrations"],
|
|
474
|
+
responseBody: TwilioNumberMutationResultSchema,
|
|
434
475
|
handler: handleAssignTwilioNumber,
|
|
435
476
|
},
|
|
436
477
|
{
|
|
@@ -444,6 +485,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
444
485
|
summary: "Release Twilio number",
|
|
445
486
|
description: "Release a phone number back to Twilio.",
|
|
446
487
|
tags: ["integrations"],
|
|
488
|
+
responseBody: TwilioNumberMutationResultSchema,
|
|
447
489
|
handler: handleReleaseTwilioNumber,
|
|
448
490
|
},
|
|
449
491
|
];
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal telemetry routes — receive operational signals forwarded from the
|
|
3
|
+
* gateway over the internal (service-token) transport.
|
|
4
|
+
*
|
|
5
|
+
* POST /v1/internal/telemetry/auth-fallback — record aggregated counts of
|
|
6
|
+
* requests served via the legacy loopback auth fallback. The gateway counts
|
|
7
|
+
* fallbacks in memory and flushes them here per window; the usage telemetry
|
|
8
|
+
* reporter ships the persisted rows to the platform.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
type AuthFallbackCount,
|
|
15
|
+
recordAuthFallbackCounts,
|
|
16
|
+
} from "../../memory/auth-fallback-events-store.js";
|
|
17
|
+
import { getLogger } from "../../util/logger.js";
|
|
18
|
+
import { GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
|
|
19
|
+
import { BadRequestError } from "./errors.js";
|
|
20
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
21
|
+
|
|
22
|
+
const log = getLogger("internal-telemetry-routes");
|
|
23
|
+
|
|
24
|
+
const authFallbackBody = z.object({
|
|
25
|
+
window_start: z.number().int().nonnegative(),
|
|
26
|
+
window_end: z.number().int().nonnegative(),
|
|
27
|
+
counts: z
|
|
28
|
+
.array(
|
|
29
|
+
z.object({
|
|
30
|
+
guard: z.string().min(1),
|
|
31
|
+
path: z.string().min(1),
|
|
32
|
+
failure_kind: z.string().min(1),
|
|
33
|
+
count: z.number().int().positive(),
|
|
34
|
+
}),
|
|
35
|
+
)
|
|
36
|
+
.min(1),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
function handleRecordAuthFallback({ body }: RouteHandlerArgs) {
|
|
40
|
+
const parsed = authFallbackBody.safeParse(body);
|
|
41
|
+
if (!parsed.success) {
|
|
42
|
+
throw new BadRequestError(
|
|
43
|
+
`Invalid auth-fallback payload: ${parsed.error.message}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const { window_start, window_end, counts } = parsed.data;
|
|
47
|
+
const mapped: AuthFallbackCount[] = counts.map((c) => ({
|
|
48
|
+
guard: c.guard,
|
|
49
|
+
path: c.path,
|
|
50
|
+
failureKind: c.failure_kind,
|
|
51
|
+
count: c.count,
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
const recorded = recordAuthFallbackCounts(window_start, window_end, mapped);
|
|
55
|
+
if (recorded === 0) {
|
|
56
|
+
// collectUsageData disabled — counts dropped to honor the opt-out.
|
|
57
|
+
return { skipped: true };
|
|
58
|
+
}
|
|
59
|
+
log.debug({ recorded }, "Recorded auth-fallback counts");
|
|
60
|
+
return { recorded };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const ROUTES: RouteDefinition[] = [
|
|
64
|
+
{
|
|
65
|
+
operationId: "internal_telemetry_auth_fallback",
|
|
66
|
+
endpoint: "internal/telemetry/auth-fallback",
|
|
67
|
+
method: "POST",
|
|
68
|
+
policy: {
|
|
69
|
+
requiredScopes: ["internal.write"],
|
|
70
|
+
allowedPrincipalTypes: GATEWAY_PRINCIPALS,
|
|
71
|
+
},
|
|
72
|
+
summary: "Record auth-fallback counts",
|
|
73
|
+
description:
|
|
74
|
+
"Receives aggregated legacy-loopback auth-fallback counts forwarded by " +
|
|
75
|
+
"the gateway and persists them for telemetry reporting.",
|
|
76
|
+
tags: ["internal", "telemetry"],
|
|
77
|
+
requestBody: authFallbackBody,
|
|
78
|
+
responseBody: z.union([
|
|
79
|
+
z.object({ recorded: z.number().int().nonnegative() }),
|
|
80
|
+
z.object({
|
|
81
|
+
skipped: z
|
|
82
|
+
.literal(true)
|
|
83
|
+
.describe("Counts dropped because usage data collection is disabled"),
|
|
84
|
+
}),
|
|
85
|
+
]),
|
|
86
|
+
handler: handleRecordAuthFallback,
|
|
87
|
+
},
|
|
88
|
+
];
|
|
@@ -508,6 +508,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
508
508
|
"Export audit records, assistant logs, and config as a tar.gz archive.",
|
|
509
509
|
tags: ["export"],
|
|
510
510
|
requestBody: exportRequestBody,
|
|
511
|
+
responseBody: {
|
|
512
|
+
contentType: "application/gzip",
|
|
513
|
+
schema: { type: "string", format: "binary" },
|
|
514
|
+
},
|
|
511
515
|
responseHeaders: {
|
|
512
516
|
"Content-Type": "application/gzip",
|
|
513
517
|
"Content-Disposition": 'attachment; filename="logs.tar.gz"',
|
|
@@ -532,6 +536,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
532
536
|
"Alias for /v1/export. Export audit records, assistant logs, and config as a tar.gz archive.",
|
|
533
537
|
tags: ["export"],
|
|
534
538
|
requestBody: exportRequestBody,
|
|
539
|
+
responseBody: {
|
|
540
|
+
contentType: "application/gzip",
|
|
541
|
+
schema: { type: "string", format: "binary" },
|
|
542
|
+
},
|
|
535
543
|
responseHeaders: {
|
|
536
544
|
"Content-Type": "application/gzip",
|
|
537
545
|
"Content-Disposition": 'attachment; filename="logs.tar.gz"',
|
|
@@ -210,14 +210,20 @@ async function handleGetConceptPage({
|
|
|
210
210
|
|
|
211
211
|
const MemoryV2ListConceptPagesParams = z.object({}).strict();
|
|
212
212
|
|
|
213
|
-
export
|
|
214
|
-
pages:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
213
|
+
export const MemoryV2ListConceptPagesResultSchema = z.object({
|
|
214
|
+
pages: z.array(
|
|
215
|
+
z.object({
|
|
216
|
+
slug: z.string(),
|
|
217
|
+
bodyBytes: z.number(),
|
|
218
|
+
edgeCount: z.number(),
|
|
219
|
+
updatedAtMs: z.number(),
|
|
220
|
+
}),
|
|
221
|
+
),
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
export type MemoryV2ListConceptPagesResult = z.infer<
|
|
225
|
+
typeof MemoryV2ListConceptPagesResultSchema
|
|
226
|
+
>;
|
|
221
227
|
|
|
222
228
|
async function handleListConceptPages({
|
|
223
229
|
body = {},
|
|
@@ -732,6 +738,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
732
738
|
"Returns slugs, body sizes, edge counts, and last-modified timestamps for every concept page on disk. Read-only; used by the desktop About → Memories surface to render a browse-able list.",
|
|
733
739
|
tags: ["memory"],
|
|
734
740
|
requestBody: MemoryV2ListConceptPagesParams,
|
|
741
|
+
responseBody: MemoryV2ListConceptPagesResultSchema,
|
|
735
742
|
},
|
|
736
743
|
{
|
|
737
744
|
operationId: "memory_v2_reembed_skills",
|
|
@@ -18,17 +18,29 @@
|
|
|
18
18
|
import { writeFile } from "node:fs/promises";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
|
|
21
23
|
import { getPageIndex } from "../../memory/v2/page-index.js";
|
|
22
|
-
import { loadCore } from "../../memory
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
import { loadCore } from "../../plugins/defaults/memory-v3-shadow/core.js";
|
|
25
|
+
import {
|
|
26
|
+
computeV3Health,
|
|
27
|
+
renderV3Health,
|
|
28
|
+
} from "../../plugins/defaults/memory-v3-shadow/health.js";
|
|
29
|
+
import {
|
|
30
|
+
type LeafRef,
|
|
31
|
+
reconcileTree,
|
|
32
|
+
} from "../../plugins/defaults/memory-v3-shadow/reconcile.js";
|
|
33
|
+
import { invalidateLanes } from "../../plugins/defaults/memory-v3-shadow/shadow-plugin.js";
|
|
26
34
|
import {
|
|
27
35
|
coreSlugs,
|
|
28
36
|
loadLeafTree,
|
|
29
37
|
resolveDataDir,
|
|
30
|
-
} from "../../memory
|
|
31
|
-
import type {
|
|
38
|
+
} from "../../plugins/defaults/memory-v3-shadow/tree.js";
|
|
39
|
+
import type {
|
|
40
|
+
LeafPath,
|
|
41
|
+
LeafTree,
|
|
42
|
+
Slug,
|
|
43
|
+
} from "../../plugins/defaults/memory-v3-shadow/types.js";
|
|
32
44
|
import { getLogger } from "../../util/logger.js";
|
|
33
45
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
34
46
|
import { ACTOR_PRINCIPALS, type RoutePolicy } from "../auth/route-policy.js";
|
|
@@ -88,18 +100,19 @@ async function loadTreeAndSlugs(deps?: MemoryV3Deps): Promise<{
|
|
|
88
100
|
// health
|
|
89
101
|
// ---------------------------------------------------------------------------
|
|
90
102
|
|
|
91
|
-
|
|
103
|
+
const MemoryV3HealthResultSchema = z.object({
|
|
92
104
|
/** Pre-rendered, human-readable report. Empty string when all-green. */
|
|
93
|
-
rendered: string
|
|
105
|
+
rendered: z.string(),
|
|
94
106
|
/** The structural counts, for `--json` consumers. */
|
|
95
|
-
counts: {
|
|
96
|
-
unassigned: number
|
|
97
|
-
danglingRefs: number
|
|
98
|
-
novelClusters: number
|
|
99
|
-
oversizedLeaves: number
|
|
100
|
-
tinyLeaves: number
|
|
101
|
-
}
|
|
102
|
-
}
|
|
107
|
+
counts: z.object({
|
|
108
|
+
unassigned: z.number(),
|
|
109
|
+
danglingRefs: z.number(),
|
|
110
|
+
novelClusters: z.number(),
|
|
111
|
+
oversizedLeaves: z.number(),
|
|
112
|
+
tinyLeaves: z.number(),
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
export type MemoryV3HealthResult = z.infer<typeof MemoryV3HealthResultSchema>;
|
|
103
116
|
|
|
104
117
|
export async function handleMemoryV3Health(
|
|
105
118
|
deps?: MemoryV3Deps,
|
|
@@ -123,26 +136,28 @@ export async function handleMemoryV3Health(
|
|
|
123
136
|
// set-core
|
|
124
137
|
// ---------------------------------------------------------------------------
|
|
125
138
|
|
|
126
|
-
|
|
139
|
+
const MemoryV3SetCoreBodySchema = z.object({
|
|
127
140
|
/** Leaves to add to the always-on core set. */
|
|
128
|
-
add
|
|
141
|
+
add: z.array(z.string()).optional(),
|
|
129
142
|
/** Leaves to remove from the always-on core set. */
|
|
130
|
-
remove
|
|
143
|
+
remove: z.array(z.string()).optional(),
|
|
131
144
|
/**
|
|
132
145
|
* When true, persist the new core to `core.json` and invalidate the lanes.
|
|
133
146
|
* When false (default), compute the preview WITHOUT writing.
|
|
134
147
|
*/
|
|
135
|
-
write
|
|
136
|
-
}
|
|
148
|
+
write: z.boolean().optional(),
|
|
149
|
+
});
|
|
150
|
+
export type MemoryV3SetCoreBody = z.infer<typeof MemoryV3SetCoreBodySchema>;
|
|
137
151
|
|
|
138
|
-
|
|
152
|
+
const MemoryV3SetCoreResultSchema = z.object({
|
|
139
153
|
/** The core leaf set that would result (or did result, when `write`). */
|
|
140
|
-
nextCore:
|
|
154
|
+
nextCore: z.array(z.string()),
|
|
141
155
|
/** Number of unique page slugs the new core set pins always-on. */
|
|
142
|
-
alwaysOnPageCount: number
|
|
156
|
+
alwaysOnPageCount: z.number(),
|
|
143
157
|
/** Whether `core.json` was written. */
|
|
144
|
-
written: boolean
|
|
145
|
-
}
|
|
158
|
+
written: z.boolean(),
|
|
159
|
+
});
|
|
160
|
+
export type MemoryV3SetCoreResult = z.infer<typeof MemoryV3SetCoreResultSchema>;
|
|
146
161
|
|
|
147
162
|
/** Wire-format error code for a `set-core` add referencing an unknown leaf. */
|
|
148
163
|
export const MEMORY_V3_UNKNOWN_LEAF_CODE = "MEMORY_V3_UNKNOWN_LEAF";
|
|
@@ -206,11 +221,20 @@ export async function handleMemoryV3SetCore(
|
|
|
206
221
|
// reconcile
|
|
207
222
|
// ---------------------------------------------------------------------------
|
|
208
223
|
|
|
209
|
-
|
|
210
|
-
renames:
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
224
|
+
const MemoryV3ReconcileResultSchema = z.object({
|
|
225
|
+
renames: z.array(
|
|
226
|
+
z.object({
|
|
227
|
+
id: z.string().optional(),
|
|
228
|
+
oldPath: z.string(),
|
|
229
|
+
newPath: z.string(),
|
|
230
|
+
}),
|
|
231
|
+
),
|
|
232
|
+
deleted: z.array(z.string()),
|
|
233
|
+
prunedCore: z.array(z.string()),
|
|
234
|
+
});
|
|
235
|
+
export type MemoryV3ReconcileResult = z.infer<
|
|
236
|
+
typeof MemoryV3ReconcileResultSchema
|
|
237
|
+
>;
|
|
214
238
|
|
|
215
239
|
/**
|
|
216
240
|
* Reconcile page + core references against the live on-disk tree.
|
|
@@ -253,9 +277,12 @@ async function loadPrevLeaves(dataDir: string): Promise<LeafRef[]> {
|
|
|
253
277
|
// rebuild-index
|
|
254
278
|
// ---------------------------------------------------------------------------
|
|
255
279
|
|
|
256
|
-
|
|
257
|
-
ok: true
|
|
258
|
-
}
|
|
280
|
+
const MemoryV3RebuildIndexResultSchema = z.object({
|
|
281
|
+
ok: z.literal(true),
|
|
282
|
+
});
|
|
283
|
+
export type MemoryV3RebuildIndexResult = z.infer<
|
|
284
|
+
typeof MemoryV3RebuildIndexResultSchema
|
|
285
|
+
>;
|
|
259
286
|
|
|
260
287
|
/**
|
|
261
288
|
* Invalidate the v3 shadow lanes so the next turn rebuilds the tree/needle
|
|
@@ -299,6 +326,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
299
326
|
handler: () => handleMemoryV3Health(),
|
|
300
327
|
summary: "Print the v3 structural health report (read-only)",
|
|
301
328
|
tags: ["memory"],
|
|
329
|
+
responseBody: MemoryV3HealthResultSchema,
|
|
302
330
|
},
|
|
303
331
|
{
|
|
304
332
|
operationId: "memory_v3_set_core",
|
|
@@ -317,6 +345,8 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
317
345
|
},
|
|
318
346
|
summary: "Add/remove always-on core leaves (validates + previews cost)",
|
|
319
347
|
tags: ["memory"],
|
|
348
|
+
requestBody: MemoryV3SetCoreBodySchema,
|
|
349
|
+
responseBody: MemoryV3SetCoreResultSchema,
|
|
320
350
|
},
|
|
321
351
|
{
|
|
322
352
|
operationId: "memory_v3_reconcile",
|
|
@@ -327,6 +357,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
327
357
|
summary:
|
|
328
358
|
"v1 convergence/prune pass over page+core refs (no rename detection without a prior snapshot)",
|
|
329
359
|
tags: ["memory"],
|
|
360
|
+
responseBody: MemoryV3ReconcileResultSchema,
|
|
330
361
|
},
|
|
331
362
|
{
|
|
332
363
|
operationId: "memory_v3_rebuild_index",
|
|
@@ -336,5 +367,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
336
367
|
handler: () => handleMemoryV3RebuildIndex(),
|
|
337
368
|
summary: "Invalidate the v3 lanes so the next turn rebuilds",
|
|
338
369
|
tags: ["memory"],
|
|
370
|
+
responseBody: MemoryV3RebuildIndexResultSchema,
|
|
339
371
|
},
|
|
340
372
|
];
|