@vellumai/assistant 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +2 -2
- package/docker-entrypoint.sh +0 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
- package/openapi.yaml +1492 -100
- package/package.json +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +88 -3
- package/src/__tests__/anthropic-provider.test.ts +302 -33
- package/src/__tests__/approval-cascade.test.ts +1 -1
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +193 -0
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/channel-reply-delivery.test.ts +284 -5
- package/src/__tests__/channel-retry-sweep.test.ts +274 -1
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +2 -1
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-token-estimator.test.ts +91 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
- package/src/__tests__/conversation-agent-loop.test.ts +188 -129
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +137 -0
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +324 -0
- package/src/__tests__/conversation-lifecycle.test.ts +53 -12
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-process-callsite.test.ts +1 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
- package/src/__tests__/conversation-seed-composer.test.ts +66 -4
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-slash-commands.test.ts +36 -8
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
- package/src/__tests__/conversation-speed-override.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +7 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/cu-unified-flow.test.ts +10 -1
- package/src/__tests__/dm-backfill.test.ts +64 -0
- package/src/__tests__/dm-persistence.test.ts +33 -0
- package/src/__tests__/document-find-replace.test.ts +501 -0
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/first-greeting.test.ts +23 -2
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +172 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-bash-proxy.test.ts +6 -0
- package/src/__tests__/host-browser-proxy.test.ts +10 -0
- package/src/__tests__/host-cu-proxy.test.ts +8 -1
- package/src/__tests__/host-file-proxy.test.ts +8 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/host-transfer-proxy.test.ts +8 -1
- package/src/__tests__/identity-routes.test.ts +57 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-chain.test.ts +2 -0
- package/src/__tests__/injector-document-comments.test.ts +378 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
- package/src/__tests__/list-messages-attachments.test.ts +21 -17
- package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
- package/src/__tests__/list-messages-page-latest.test.ts +130 -14
- package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
- package/src/__tests__/llm-context-normalization.test.ts +0 -2
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +161 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/log-export-routes.test.ts +99 -2
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/message-queue-steer.test.ts +114 -0
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +151 -0
- package/src/__tests__/openai-responses-provider.test.ts +118 -16
- package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
- package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -5
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-source-watcher.test.ts +302 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +1 -51
- package/src/__tests__/process-message-display-content.test.ts +21 -16
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/server-history-render.test.ts +83 -4
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/steer-tool-repair.test.ts +249 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +161 -124
- package/src/__tests__/terminal-tools.test.ts +12 -2
- package/src/__tests__/thinking-block-replay.test.ts +113 -0
- package/src/__tests__/thread-backfill.test.ts +370 -22
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +89 -53
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +1 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/web-fetch.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +94 -10
- package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/attachments.ts +1 -0
- package/src/agent/loop.ts +65 -20
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/next-wake.test.ts +289 -0
- package/src/background-wake/next-wake.ts +172 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/browser/operations.ts +15 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/conversations.ts +128 -1
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference-providers.ts +147 -1
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +483 -0
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/commands/notifications.ts +24 -2
- package/src/cli/program.ts +2 -0
- package/src/cli/utils/conversation-id.ts +17 -5
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
- package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
- package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +8 -0
- package/src/config/bundled-tool-registry.ts +24 -12
- package/src/config/call-site-defaults.ts +20 -0
- package/src/config/feature-flag-registry.json +115 -3
- package/src/config/llm-resolver.ts +16 -2
- package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
- package/src/config/schemas/call-site-catalog.ts +35 -0
- package/src/config/schemas/llm.ts +14 -0
- package/src/config/schemas/memory-v2.ts +294 -1
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +60 -1
- package/src/context/token-estimator.ts +47 -4
- package/src/context/window-manager.ts +25 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-health/credential-health-service.ts +34 -19
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
- package/src/daemon/conversation-agent-loop.ts +307 -88
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +149 -118
- package/src/daemon/conversation-messaging.ts +3 -0
- package/src/daemon/conversation-process.ts +273 -0
- package/src/daemon/conversation-queue-manager.ts +14 -0
- package/src/daemon/conversation-runtime-assembly.ts +145 -84
- package/src/daemon/conversation-slash.ts +37 -5
- package/src/daemon/conversation-surfaces.ts +45 -2
- package/src/daemon/conversation-tool-setup.ts +70 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +54 -32
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/first-greeting.ts +10 -0
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
- package/src/daemon/handlers/config-a2a.ts +160 -0
- package/src/daemon/handlers/config-model.test.ts +2 -0
- package/src/daemon/handlers/conversations.ts +90 -3
- package/src/daemon/handlers/shared.ts +92 -29
- package/src/daemon/host-bash-proxy.ts +1 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +5 -5
- package/src/daemon/host-file-proxy.ts +5 -5
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +11 -11
- package/src/daemon/lifecycle.ts +40 -23
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-protocol.ts +4 -0
- package/src/daemon/message-types/conversations.ts +14 -9
- package/src/daemon/message-types/document-comments.ts +50 -0
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +66 -7
- package/src/daemon/message-types/surfaces.ts +3 -1
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/message-types/web-activity.ts +57 -0
- package/src/daemon/plugin-source-watcher.ts +135 -3
- package/src/daemon/process-message.ts +69 -12
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/daemon/trust-context.ts +6 -0
- package/src/documents/document-comments-store.test.ts +338 -0
- package/src/documents/document-comments-store.ts +237 -0
- package/src/documents/document-store.ts +202 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
- package/src/heartbeat/heartbeat-service.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +33 -2
- package/src/home/feed-types.ts +6 -1
- package/src/home/home-content-refresh.ts +52 -0
- package/src/home/home-greeting-cache.ts +69 -0
- package/src/home/home-greeting.ts +85 -0
- package/src/home/suggested-prompts.ts +168 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +191 -100
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +26 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/delivery-crud.ts +41 -0
- package/src/memory/delivery-status.ts +141 -15
- package/src/memory/external-conversation-store.ts +32 -1
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +68 -15
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-constants.ts +28 -0
- package/src/memory/memory-retrospective-enqueue.ts +11 -3
- package/src/memory/memory-retrospective-job.ts +413 -18
- package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
- package/src/memory/memory-v2-activation-log-store.ts +41 -14
- package/src/memory/migrations/100-core-tables.ts +1 -0
- package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
- package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
- package/src/memory/migrations/253-document-comments.ts +47 -0
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
- package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
- package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
- package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
- package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +34 -0
- package/src/memory/migrations/registry.ts +58 -0
- package/src/memory/onboarding-events-store.ts +7 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/infrastructure.ts +22 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/memory/v2/__tests__/injection.test.ts +158 -112
- package/src/memory/v2/__tests__/page-index.test.ts +365 -1
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +660 -4
- package/src/memory/v2/consolidation-job.ts +14 -0
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection-events.ts +101 -0
- package/src/memory/v2/injection.ts +42 -25
- package/src/memory/v2/page-index.ts +209 -7
- package/src/memory/v2/page-store.ts +18 -0
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +369 -62
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/messaging/providers/index.ts +7 -1
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
- package/src/messaging/providers/slack/adapter.ts +178 -25
- package/src/messaging/providers/slack/api.test.ts +54 -0
- package/src/messaging/providers/slack/api.ts +119 -3
- package/src/messaging/providers/slack/client.ts +12 -0
- package/src/messaging/providers/slack/deep-link.ts +20 -1
- package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
- package/src/messaging/providers/slack/message-metadata.ts +156 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
- package/src/messaging/providers/slack/render-transcript.ts +176 -49
- package/src/messaging/providers/slack/send.test.ts +77 -0
- package/src/messaging/providers/slack/send.ts +8 -2
- package/src/messaging/providers/slack/types.ts +14 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +14 -2
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/deferred-emit.ts +135 -0
- package/src/notifications/emit-signal.ts +38 -50
- package/src/notifications/home-feed-side-effect.ts +60 -30
- package/src/oauth/connect-orchestrator.ts +3 -0
- package/src/oauth/credential-token-resolver.ts +2 -0
- package/src/oauth/manual-token-connection.ts +19 -0
- package/src/oauth/oauth-store.ts +12 -0
- package/src/oauth/seed-providers.ts +22 -0
- package/src/permissions/prompter.ts +8 -5
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +6 -3
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +100 -20
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/system-prompt.test.ts +46 -2
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/normalize-onboarding.ts +40 -0
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +69 -19
- package/src/prompts/system-prompt.ts +118 -216
- package/src/prompts/template-detection.ts +37 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
- package/src/prompts/templates/BOOTSTRAP.md +10 -2
- package/src/prompts/templates/VOICE.md +3 -0
- package/src/prompts/templates/system-sections.ts +281 -9
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +159 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/fireworks/client.ts +20 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
- package/src/providers/inference/adapter-factory.ts +18 -1
- package/src/providers/inference/auth.ts +3 -3
- package/src/providers/inference/codex-token-refresh.ts +128 -0
- package/src/providers/inference/resolve-auth.ts +49 -6
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +91 -1
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +63 -23
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +86 -23
- package/src/providers/openrouter/client.ts +5 -1
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +214 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
- package/src/runtime/agent-wake.ts +152 -56
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +43 -3
- package/src/runtime/background-job-runner.ts +26 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-reply-delivery.ts +182 -47
- package/src/runtime/channel-retry-sweep.ts +141 -16
- package/src/runtime/http-types.ts +7 -6
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +50 -8
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/approval-routes.ts +4 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
- package/src/runtime/routes/content-source-routes.ts +78 -0
- package/src/runtime/routes/conversation-cli-routes.ts +147 -2
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +196 -31
- package/src/runtime/routes/conversation-routes.ts +472 -425
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/document-comments-routes.ts +287 -0
- package/src/runtime/routes/documents-routes.ts +33 -0
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/home-feed-routes.ts +6 -3
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-browser-routes.ts +17 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +21 -0
- package/src/runtime/routes/inbound-message-handler.ts +288 -58
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
- package/src/runtime/routes/index.ts +20 -4
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
- package/src/runtime/routes/integrations/a2a.ts +60 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/log-export-routes.ts +39 -0
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +427 -0
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/notification-routes.ts +19 -2
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/question-routes.ts +4 -1
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/sanity-routes.ts +159 -0
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +188 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/conversation-serializer.ts +30 -4
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/integration-status.ts +3 -1
- package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
- package/src/security/oauth2-device-code.ts +307 -0
- package/src/security/oauth2.ts +26 -9
- package/src/security/secure-keys.ts +5 -0
- package/src/skills/catalog-install.ts +6 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
- package/src/tools/browser/browser-execution.ts +106 -0
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
- package/src/tools/browser/cdp-client/factory.ts +171 -4
- package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
- package/src/tools/browser/cdp-client/types.ts +101 -0
- package/src/tools/browser/pinned-tabs.ts +146 -0
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-comment-tool.test.ts +379 -0
- package/src/tools/document/document-comment-tool.ts +156 -0
- package/src/tools/document/document-tool.ts +187 -2
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
- package/src/tools/network/domain-normalize.ts +17 -0
- package/src/tools/network/web-fetch.ts +216 -73
- package/src/tools/network/web-search.ts +216 -98
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +19 -12
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +31 -98
- package/src/tools/ui-surface/definitions.ts +9 -23
- package/src/types/onboarding-context.ts +4 -0
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/__tests__/favicon.test.ts +84 -0
- package/src/util/favicon.ts +40 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -7
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/git-service.ts +75 -4
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/config/bundled-skills/document/SKILL.md +0 -54
- package/src/config/bundled-skills/document/TOOLS.json +0 -106
- package/src/daemon/seed-files.ts +0 -18
- package/src/prompts/cache-boundary.ts +0 -8
- package/src/runtime/routes/interface-routes.ts +0 -43
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
|
@@ -11,6 +11,7 @@ import { z } from "zod";
|
|
|
11
11
|
|
|
12
12
|
import { clearAllConversations as clearAllActive } from "../../daemon/handlers/conversations.js";
|
|
13
13
|
import { formatJson, formatMarkdown } from "../../export/formatter.js";
|
|
14
|
+
import { ipcCall as ipcCallGateway } from "../../ipc/gateway-client.js";
|
|
14
15
|
import {
|
|
15
16
|
addMessage,
|
|
16
17
|
createConversation,
|
|
@@ -19,8 +20,10 @@ import {
|
|
|
19
20
|
} from "../../memory/conversation-crud.js";
|
|
20
21
|
import { setConversationKey } from "../../memory/conversation-key-store.js";
|
|
21
22
|
import { listConversations } from "../../memory/conversation-queries.js";
|
|
23
|
+
import { getBindingByConversation } from "../../memory/external-conversation-store.js";
|
|
24
|
+
import { sendSlackReply } from "../../messaging/providers/slack/send.js";
|
|
22
25
|
import { getLogger } from "../../util/logger.js";
|
|
23
|
-
import { BadRequestError, NotFoundError } from "./errors.js";
|
|
26
|
+
import { BadGatewayError, BadRequestError, NotFoundError } from "./errors.js";
|
|
24
27
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
25
28
|
|
|
26
29
|
const log = getLogger("conversation-cli-routes");
|
|
@@ -142,7 +145,7 @@ function handleExportCli({ body = {} }: RouteHandlerArgs) {
|
|
|
142
145
|
|
|
143
146
|
async function handleClearCli(_args: RouteHandlerArgs) {
|
|
144
147
|
// Tear down in-memory conversation state before DB clear.
|
|
145
|
-
const cleared = clearAllActive();
|
|
148
|
+
const cleared = await clearAllActive();
|
|
146
149
|
log.info(
|
|
147
150
|
{ cleared },
|
|
148
151
|
"CLI conversations clear: active conversations torn down",
|
|
@@ -150,6 +153,136 @@ async function handleClearCli(_args: RouteHandlerArgs) {
|
|
|
150
153
|
return { cleared };
|
|
151
154
|
}
|
|
152
155
|
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// slack detach (CLI)
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
|
|
160
|
+
const slackDetachRequestSchema = z.object({
|
|
161
|
+
conversationId: z.string().trim().min(1).optional(),
|
|
162
|
+
channelId: z.string().trim().min(1).optional(),
|
|
163
|
+
threadTs: z.string().trim().min(1).optional(),
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const slackDetachResponseSchema = z.object({
|
|
167
|
+
detached: z.boolean(),
|
|
168
|
+
channelId: z.string(),
|
|
169
|
+
threadTs: z.string(),
|
|
170
|
+
source: z.enum(["explicit", "conversation_binding"]),
|
|
171
|
+
conversationId: z.string().optional(),
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
type SlackDetachGatewayResponse = {
|
|
175
|
+
detached: boolean;
|
|
176
|
+
channelId: string;
|
|
177
|
+
threadTs: string;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const SLACK_DETACH_CONFIRMATION_TEXT =
|
|
181
|
+
"Muted this Slack thread. I won't respond to further replies here unless you mention me again.";
|
|
182
|
+
|
|
183
|
+
function isSlackDetachGatewayResponse(
|
|
184
|
+
value: unknown,
|
|
185
|
+
): value is SlackDetachGatewayResponse {
|
|
186
|
+
return (
|
|
187
|
+
value != null &&
|
|
188
|
+
typeof value === "object" &&
|
|
189
|
+
typeof (value as SlackDetachGatewayResponse).detached === "boolean" &&
|
|
190
|
+
typeof (value as SlackDetachGatewayResponse).channelId === "string" &&
|
|
191
|
+
typeof (value as SlackDetachGatewayResponse).threadTs === "string"
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function handleSlackDetachCli({ body = {} }: RouteHandlerArgs) {
|
|
196
|
+
const parsed = slackDetachRequestSchema.parse(body);
|
|
197
|
+
const explicitChannelId = parsed.channelId;
|
|
198
|
+
const explicitThreadTs = parsed.threadTs;
|
|
199
|
+
|
|
200
|
+
let channelId: string;
|
|
201
|
+
let threadTs: string;
|
|
202
|
+
let source: "explicit" | "conversation_binding";
|
|
203
|
+
let conversationId: string | undefined;
|
|
204
|
+
|
|
205
|
+
if (explicitChannelId || explicitThreadTs) {
|
|
206
|
+
if (!explicitChannelId || !explicitThreadTs) {
|
|
207
|
+
throw new BadRequestError(
|
|
208
|
+
"Both channelId and threadTs are required when detaching by explicit Slack identifiers",
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
channelId = explicitChannelId;
|
|
212
|
+
threadTs = explicitThreadTs;
|
|
213
|
+
source = "explicit";
|
|
214
|
+
} else {
|
|
215
|
+
if (!parsed.conversationId) {
|
|
216
|
+
throw new BadRequestError(
|
|
217
|
+
"conversationId is required unless channelId and threadTs are provided",
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const binding = getBindingByConversation(parsed.conversationId);
|
|
222
|
+
if (!binding) {
|
|
223
|
+
throw new NotFoundError(
|
|
224
|
+
`No channel binding found for conversation ${parsed.conversationId}`,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
if (binding.sourceChannel !== "slack") {
|
|
228
|
+
throw new BadRequestError(
|
|
229
|
+
`Conversation ${parsed.conversationId} is bound to ${binding.sourceChannel}, not Slack`,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
if (!binding.externalThreadId) {
|
|
233
|
+
throw new BadRequestError(
|
|
234
|
+
`Conversation ${parsed.conversationId} is not bound to a Slack thread`,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
channelId = binding.externalChatId;
|
|
239
|
+
threadTs = binding.externalThreadId;
|
|
240
|
+
source = "conversation_binding";
|
|
241
|
+
conversationId = parsed.conversationId;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const gatewayResult = await ipcCallGateway(
|
|
245
|
+
"detach_slack_active_thread",
|
|
246
|
+
{ channelId, threadTs },
|
|
247
|
+
5_000,
|
|
248
|
+
);
|
|
249
|
+
if (!isSlackDetachGatewayResponse(gatewayResult)) {
|
|
250
|
+
throw new BadGatewayError(
|
|
251
|
+
"Could not detach Slack thread from assistant listening",
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (gatewayResult.detached) {
|
|
256
|
+
try {
|
|
257
|
+
await sendSlackReply(
|
|
258
|
+
gatewayResult.channelId,
|
|
259
|
+
SLACK_DETACH_CONFIRMATION_TEXT,
|
|
260
|
+
{ threadTs: gatewayResult.threadTs },
|
|
261
|
+
);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
log.warn(
|
|
264
|
+
{
|
|
265
|
+
err,
|
|
266
|
+
channelId: gatewayResult.channelId,
|
|
267
|
+
threadTs: gatewayResult.threadTs,
|
|
268
|
+
},
|
|
269
|
+
"Slack thread detached, but confirmation message failed",
|
|
270
|
+
);
|
|
271
|
+
throw new BadGatewayError(
|
|
272
|
+
"Detached Slack thread but could not send confirmation",
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
detached: gatewayResult.detached,
|
|
279
|
+
channelId: gatewayResult.channelId,
|
|
280
|
+
threadTs: gatewayResult.threadTs,
|
|
281
|
+
source,
|
|
282
|
+
...(conversationId ? { conversationId } : {}),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
153
286
|
// ---------------------------------------------------------------------------
|
|
154
287
|
// Route definitions
|
|
155
288
|
// ---------------------------------------------------------------------------
|
|
@@ -230,4 +363,16 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
230
363
|
}),
|
|
231
364
|
handler: handleClearCli,
|
|
232
365
|
},
|
|
366
|
+
{
|
|
367
|
+
operationId: "conversation_slack_detach_cli",
|
|
368
|
+
endpoint: "conversations/cli/slack/detach",
|
|
369
|
+
method: "POST",
|
|
370
|
+
summary: "Detach the assistant from a Slack thread (CLI)",
|
|
371
|
+
description:
|
|
372
|
+
"Stops Slack active-thread listening for a Slack thread. The CLI resolves current conversation defaults.",
|
|
373
|
+
tags: ["conversations"],
|
|
374
|
+
requestBody: slackDetachRequestSchema,
|
|
375
|
+
responseBody: slackDetachResponseSchema,
|
|
376
|
+
handler: handleSlackDetachCli,
|
|
377
|
+
},
|
|
233
378
|
];
|
|
@@ -111,7 +111,7 @@ function handleListConversations({ queryParams = {} }: RouteHandlerArgs) {
|
|
|
111
111
|
return response;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
114
|
+
function handleRecordSeen({ body = {}, headers }: RouteHandlerArgs) {
|
|
115
115
|
const rawConversationId = body.conversationId as string | undefined;
|
|
116
116
|
if (!rawConversationId) {
|
|
117
117
|
throw new BadRequestError("Missing conversationId");
|
|
@@ -142,7 +142,11 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
if (wasUnseen) {
|
|
145
|
-
publishConversationListAndMetadataChanged(
|
|
145
|
+
publishConversationListAndMetadataChanged(
|
|
146
|
+
"seen_changed",
|
|
147
|
+
conversationId,
|
|
148
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
149
|
+
);
|
|
146
150
|
}
|
|
147
151
|
|
|
148
152
|
return { ok: true };
|
|
@@ -152,7 +156,7 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
158
|
|
|
155
|
-
function handleMarkUnread({ body = {} }: RouteHandlerArgs) {
|
|
159
|
+
function handleMarkUnread({ body = {}, headers }: RouteHandlerArgs) {
|
|
156
160
|
const rawConversationId = body.conversationId as string | undefined;
|
|
157
161
|
if (!rawConversationId) {
|
|
158
162
|
throw new BadRequestError("Missing conversationId");
|
|
@@ -162,7 +166,11 @@ function handleMarkUnread({ body = {} }: RouteHandlerArgs) {
|
|
|
162
166
|
try {
|
|
163
167
|
const changed = markConversationUnread(conversationId);
|
|
164
168
|
if (changed) {
|
|
165
|
-
publishConversationListAndMetadataChanged(
|
|
169
|
+
publishConversationListAndMetadataChanged(
|
|
170
|
+
"seen_changed",
|
|
171
|
+
conversationId,
|
|
172
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
173
|
+
);
|
|
166
174
|
}
|
|
167
175
|
return { ok: true };
|
|
168
176
|
} catch (err) {
|
|
@@ -84,7 +84,7 @@ function cancelScheduleIfLast(conversationId: string): void {
|
|
|
84
84
|
// Handlers
|
|
85
85
|
// ---------------------------------------------------------------------------
|
|
86
86
|
|
|
87
|
-
function handleCreateConversation({ body = {} }: RouteHandlerArgs) {
|
|
87
|
+
function handleCreateConversation({ body = {}, headers }: RouteHandlerArgs) {
|
|
88
88
|
const conversationKey =
|
|
89
89
|
(body.conversationKey as string | undefined) ?? crypto.randomUUID();
|
|
90
90
|
const result = getOrCreateConversation(conversationKey, {
|
|
@@ -92,7 +92,11 @@ function handleCreateConversation({ body = {} }: RouteHandlerArgs) {
|
|
|
92
92
|
});
|
|
93
93
|
if (result.created) {
|
|
94
94
|
updateConversationTitle(result.conversationId, "New Conversation");
|
|
95
|
-
publishConversationListAndMetadataChanged(
|
|
95
|
+
publishConversationListAndMetadataChanged(
|
|
96
|
+
"created",
|
|
97
|
+
result.conversationId,
|
|
98
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
99
|
+
);
|
|
96
100
|
}
|
|
97
101
|
log.info(
|
|
98
102
|
{
|
|
@@ -110,7 +114,7 @@ function handleCreateConversation({ body = {} }: RouteHandlerArgs) {
|
|
|
110
114
|
};
|
|
111
115
|
}
|
|
112
116
|
|
|
113
|
-
async function handleForkConversation({ body = {} }: RouteHandlerArgs) {
|
|
117
|
+
async function handleForkConversation({ body = {}, headers }: RouteHandlerArgs) {
|
|
114
118
|
const conversationId = body.conversationId as string | undefined;
|
|
115
119
|
if (!conversationId || typeof conversationId !== "string") {
|
|
116
120
|
throw new BadRequestError("Missing conversationId");
|
|
@@ -136,7 +140,11 @@ async function handleForkConversation({ body = {} }: RouteHandlerArgs) {
|
|
|
136
140
|
`Forked conversation ${forkedConversation.id} could not be loaded`,
|
|
137
141
|
);
|
|
138
142
|
}
|
|
139
|
-
publishConversationListAndMetadataChanged(
|
|
143
|
+
publishConversationListAndMetadataChanged(
|
|
144
|
+
"created",
|
|
145
|
+
forkedConversation.id,
|
|
146
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
147
|
+
);
|
|
140
148
|
return { conversation: detail.conversation };
|
|
141
149
|
} catch (err) {
|
|
142
150
|
if (err instanceof UserError) {
|
|
@@ -171,6 +179,7 @@ async function handleSwitchConversation({ body = {} }: RouteHandlerArgs) {
|
|
|
171
179
|
async function handleSetInferenceProfile({
|
|
172
180
|
pathParams = {},
|
|
173
181
|
body = {},
|
|
182
|
+
headers,
|
|
174
183
|
}: RouteHandlerArgs) {
|
|
175
184
|
if (
|
|
176
185
|
body.profile !== null &&
|
|
@@ -184,6 +193,7 @@ async function handleSetInferenceProfile({
|
|
|
184
193
|
profile: body.profile as string | null,
|
|
185
194
|
ttlSeconds: body.ttlSeconds as number | null | undefined,
|
|
186
195
|
sessionId: body.sessionId as string | undefined,
|
|
196
|
+
originClientId: headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
187
197
|
});
|
|
188
198
|
|
|
189
199
|
return result;
|
|
@@ -192,6 +202,7 @@ async function handleSetInferenceProfile({
|
|
|
192
202
|
function handleRenameConversation({
|
|
193
203
|
pathParams = {},
|
|
194
204
|
body = {},
|
|
205
|
+
headers,
|
|
195
206
|
}: RouteHandlerArgs) {
|
|
196
207
|
const name = body.name as string | undefined;
|
|
197
208
|
if (!name || typeof name !== "string") {
|
|
@@ -203,12 +214,18 @@ function handleRenameConversation({
|
|
|
203
214
|
}
|
|
204
215
|
updateConversationTitle(pathParams.id!, name, 0);
|
|
205
216
|
|
|
206
|
-
publishConversationTitleChanged(
|
|
217
|
+
publishConversationTitleChanged(
|
|
218
|
+
pathParams.id!,
|
|
219
|
+
name,
|
|
220
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
221
|
+
);
|
|
207
222
|
|
|
208
223
|
return { ok: true };
|
|
209
224
|
}
|
|
210
225
|
|
|
211
|
-
function handleClearAllConversations({
|
|
226
|
+
async function handleClearAllConversations({
|
|
227
|
+
headers = {},
|
|
228
|
+
}: RouteHandlerArgs) {
|
|
212
229
|
const confirm = headers["x-confirm-destructive"];
|
|
213
230
|
if (confirm !== "clear-all-conversations") {
|
|
214
231
|
throw new BadRequestError(
|
|
@@ -216,12 +233,15 @@ function handleClearAllConversations({ headers = {} }: RouteHandlerArgs) {
|
|
|
216
233
|
"To confirm, set header X-Confirm-Destructive: clear-all-conversations",
|
|
217
234
|
);
|
|
218
235
|
}
|
|
219
|
-
clearAllConversations();
|
|
220
|
-
publishConversationListChanged(
|
|
236
|
+
await clearAllConversations();
|
|
237
|
+
publishConversationListChanged(
|
|
238
|
+
"deleted",
|
|
239
|
+
headers["x-vellum-client-id"]?.trim() || undefined,
|
|
240
|
+
);
|
|
221
241
|
return undefined;
|
|
222
242
|
}
|
|
223
243
|
|
|
224
|
-
function handleWipeConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
244
|
+
function handleWipeConversation({ pathParams = {}, headers }: RouteHandlerArgs) {
|
|
225
245
|
const resolvedId = resolveOrThrow(pathParams.id!);
|
|
226
246
|
|
|
227
247
|
cancelScheduleIfLast(resolvedId);
|
|
@@ -248,7 +268,11 @@ function handleWipeConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
248
268
|
},
|
|
249
269
|
"Wiped conversation and reverted memory changes",
|
|
250
270
|
);
|
|
251
|
-
publishConversationListAndMetadataChanged(
|
|
271
|
+
publishConversationListAndMetadataChanged(
|
|
272
|
+
"deleted",
|
|
273
|
+
resolvedId,
|
|
274
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
275
|
+
);
|
|
252
276
|
return {
|
|
253
277
|
wiped: true,
|
|
254
278
|
unsupersededItems: 0,
|
|
@@ -257,7 +281,10 @@ function handleWipeConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
257
281
|
};
|
|
258
282
|
}
|
|
259
283
|
|
|
260
|
-
function handleDeleteConversation({
|
|
284
|
+
function handleDeleteConversation({
|
|
285
|
+
pathParams = {},
|
|
286
|
+
headers,
|
|
287
|
+
}: RouteHandlerArgs) {
|
|
261
288
|
const resolvedId = resolveOrThrow(pathParams.id!);
|
|
262
289
|
|
|
263
290
|
cancelScheduleIfLast(resolvedId);
|
|
@@ -278,28 +305,46 @@ function handleDeleteConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
278
305
|
}
|
|
279
306
|
log.info({ conversationId: resolvedId }, "Deleted conversation");
|
|
280
307
|
|
|
281
|
-
publishConversationListAndMetadataChanged(
|
|
308
|
+
publishConversationListAndMetadataChanged(
|
|
309
|
+
"deleted",
|
|
310
|
+
resolvedId,
|
|
311
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
312
|
+
);
|
|
282
313
|
|
|
283
314
|
return undefined;
|
|
284
315
|
}
|
|
285
316
|
|
|
286
|
-
function handleArchiveConversation({
|
|
317
|
+
function handleArchiveConversation({
|
|
318
|
+
pathParams = {},
|
|
319
|
+
headers,
|
|
320
|
+
}: RouteHandlerArgs) {
|
|
287
321
|
const resolvedId = resolveOrThrow(pathParams.id!);
|
|
288
322
|
const archived = archiveConversation(resolvedId);
|
|
289
323
|
if (!archived) {
|
|
290
324
|
throw new NotFoundError(`Conversation ${pathParams.id} not found`);
|
|
291
325
|
}
|
|
292
|
-
publishConversationListAndMetadataChanged(
|
|
326
|
+
publishConversationListAndMetadataChanged(
|
|
327
|
+
"reordered",
|
|
328
|
+
resolvedId,
|
|
329
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
330
|
+
);
|
|
293
331
|
return { ok: true, conversationId: resolvedId };
|
|
294
332
|
}
|
|
295
333
|
|
|
296
|
-
function handleUnarchiveConversation({
|
|
334
|
+
function handleUnarchiveConversation({
|
|
335
|
+
pathParams = {},
|
|
336
|
+
headers,
|
|
337
|
+
}: RouteHandlerArgs) {
|
|
297
338
|
const resolvedId = resolveOrThrow(pathParams.id!);
|
|
298
339
|
const unarchived = unarchiveConversation(resolvedId);
|
|
299
340
|
if (!unarchived) {
|
|
300
341
|
throw new NotFoundError(`Conversation ${pathParams.id} not found`);
|
|
301
342
|
}
|
|
302
|
-
publishConversationListAndMetadataChanged(
|
|
343
|
+
publishConversationListAndMetadataChanged(
|
|
344
|
+
"reordered",
|
|
345
|
+
resolvedId,
|
|
346
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
347
|
+
);
|
|
303
348
|
return { ok: true, conversationId: resolvedId };
|
|
304
349
|
}
|
|
305
350
|
|
|
@@ -339,7 +384,7 @@ async function handleRegenerateResponse({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
339
384
|
}
|
|
340
385
|
}
|
|
341
386
|
|
|
342
|
-
function handleReorderConversations({ body = {} }: RouteHandlerArgs) {
|
|
387
|
+
function handleReorderConversations({ body = {}, headers }: RouteHandlerArgs) {
|
|
343
388
|
const updates = body.updates as
|
|
344
389
|
| Array<{
|
|
345
390
|
conversationId: string;
|
|
@@ -362,6 +407,7 @@ function handleReorderConversations({ body = {} }: RouteHandlerArgs) {
|
|
|
362
407
|
publishConversationListAndMetadataChanged(
|
|
363
408
|
"reordered",
|
|
364
409
|
updates.map((u) => u.conversationId),
|
|
410
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
365
411
|
);
|
|
366
412
|
return { ok: true };
|
|
367
413
|
}
|
|
@@ -382,15 +428,26 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
382
428
|
requestBody: z.object({
|
|
383
429
|
conversationKey: z
|
|
384
430
|
.string()
|
|
385
|
-
.
|
|
431
|
+
.optional()
|
|
432
|
+
.describe(
|
|
433
|
+
"Optional external key. Echoed back in the response. Non-vellum channels (Telegram, WhatsApp) use this to scope to a logical channel thread; vellum-web clients can omit it and rely on the assistant-minted `id`.",
|
|
434
|
+
),
|
|
386
435
|
conversationType: z
|
|
387
436
|
.literal("standard")
|
|
388
437
|
.optional()
|
|
389
438
|
.describe("Only standard conversations are created by this endpoint"),
|
|
390
439
|
}),
|
|
391
440
|
responseBody: z.object({
|
|
392
|
-
id: z
|
|
393
|
-
|
|
441
|
+
id: z
|
|
442
|
+
.string()
|
|
443
|
+
.describe(
|
|
444
|
+
"Assistant-minted internal conversation id. The authoritative identifier for the conversation.",
|
|
445
|
+
),
|
|
446
|
+
conversationKey: z
|
|
447
|
+
.string()
|
|
448
|
+
.describe(
|
|
449
|
+
"Echo of the optional external key supplied by the client.",
|
|
450
|
+
),
|
|
394
451
|
conversationType: z.string(),
|
|
395
452
|
created: z.boolean(),
|
|
396
453
|
}),
|