@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
|
@@ -36,7 +36,15 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
|
36
36
|
undefined,
|
|
37
37
|
{ source: "button" },
|
|
38
38
|
);
|
|
39
|
-
|
|
39
|
+
// Idempotent cleanup: the prompter's `resolveConfirmation` already
|
|
40
|
+
// resolved the interaction with the correct approved/rejected state
|
|
41
|
+
// before we reach here, so the entry is typically gone. This call is
|
|
42
|
+
// a safety net for paths where the prompter no-ops; map decision to
|
|
43
|
+
// state to keep the emitted event accurate when it does fire.
|
|
44
|
+
pendingInteractions.resolve(
|
|
45
|
+
msg.requestId,
|
|
46
|
+
decision === "allow" ? "approved" : "rejected",
|
|
47
|
+
);
|
|
40
48
|
return;
|
|
41
49
|
}
|
|
42
50
|
}
|
|
@@ -49,13 +57,13 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
|
49
57
|
/**
|
|
50
58
|
* Clear all conversations and DB conversations. Returns the number of conversations cleared.
|
|
51
59
|
*/
|
|
52
|
-
export function clearAllConversations(): number {
|
|
60
|
+
export async function clearAllConversations(): Promise<number> {
|
|
53
61
|
const cleared = clearAllActiveConversations();
|
|
54
62
|
// Also clear DB conversations. When a new local connection triggers
|
|
55
63
|
// sendInitialConversation, it auto-creates a conversation if none exist.
|
|
56
64
|
// Without this DB clear, that auto-created row survives, contradicting
|
|
57
65
|
// the "clear all conversations" intent.
|
|
58
|
-
clearAll();
|
|
66
|
+
await clearAll();
|
|
59
67
|
return cleared;
|
|
60
68
|
}
|
|
61
69
|
|
|
@@ -202,6 +210,85 @@ export function deleteQueuedMessage(
|
|
|
202
210
|
return { removed: false, reason: "message_not_found" };
|
|
203
211
|
}
|
|
204
212
|
|
|
213
|
+
/**
|
|
214
|
+
* Steer a conversation to a specific queued message.
|
|
215
|
+
* Promotes the message to the head of the queue, marks the conversation
|
|
216
|
+
* as needing tool-result repair, and aborts the current generation so the
|
|
217
|
+
* drain path picks up the promoted message.
|
|
218
|
+
*
|
|
219
|
+
* Returns `{ steered: true }` on success, or `{ steered: false, reason }` on failure.
|
|
220
|
+
*/
|
|
221
|
+
export function steerToMessage(
|
|
222
|
+
conversationId: string,
|
|
223
|
+
requestId: string,
|
|
224
|
+
):
|
|
225
|
+
| { steered: true }
|
|
226
|
+
| {
|
|
227
|
+
steered: false;
|
|
228
|
+
reason:
|
|
229
|
+
| "conversation_not_found"
|
|
230
|
+
| "message_not_found"
|
|
231
|
+
| "not_processing";
|
|
232
|
+
} {
|
|
233
|
+
const conversation = findConversation(conversationId);
|
|
234
|
+
if (!conversation) {
|
|
235
|
+
log.warn(
|
|
236
|
+
{ conversationId, requestId },
|
|
237
|
+
"No conversation found for steer_to_message",
|
|
238
|
+
);
|
|
239
|
+
return { steered: false, reason: "conversation_not_found" };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!conversation.isProcessing()) {
|
|
243
|
+
log.warn(
|
|
244
|
+
{ conversationId, requestId },
|
|
245
|
+
"Cannot steer: conversation is not processing",
|
|
246
|
+
);
|
|
247
|
+
return { steered: false, reason: "not_processing" };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const promoted = conversation.queue.promoteToHead(requestId);
|
|
251
|
+
if (!promoted) {
|
|
252
|
+
log.warn(
|
|
253
|
+
{ conversationId, requestId },
|
|
254
|
+
"Queued message not found for steering",
|
|
255
|
+
);
|
|
256
|
+
return { steered: false, reason: "message_not_found" };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Mark the conversation for tool-result repair so the drain path can
|
|
260
|
+
// inject synthetic tool results for any pending tool_use blocks that
|
|
261
|
+
// were abandoned by the aborted generation.
|
|
262
|
+
conversation.pendingSteerRepair = true;
|
|
263
|
+
|
|
264
|
+
// Broadcast the steer event so clients can update their UI.
|
|
265
|
+
broadcastMessage({
|
|
266
|
+
type: "message_steered",
|
|
267
|
+
conversationId,
|
|
268
|
+
requestId,
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
log.info(
|
|
272
|
+
{ conversationId, requestId },
|
|
273
|
+
"Steering to queued message — aborting current generation",
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
// Abort the in-flight generation. The agent loop's finally block calls
|
|
277
|
+
// drainQueue, which will pick up the promoted message at the head.
|
|
278
|
+
// Unlike abortConversation, we do NOT clear the queue or dispose
|
|
279
|
+
// prompters — we want the queue to drain with the promoted message first.
|
|
280
|
+
const reason = createAbortReason(
|
|
281
|
+
"preempted_by_new_message",
|
|
282
|
+
"steerToMessage",
|
|
283
|
+
conversationId,
|
|
284
|
+
);
|
|
285
|
+
conversation.abortController?.abort(reason);
|
|
286
|
+
// Deny pending confirmations so the abort unblocks immediately.
|
|
287
|
+
conversation.denyAllPendingConfirmations();
|
|
288
|
+
|
|
289
|
+
return { steered: true };
|
|
290
|
+
}
|
|
291
|
+
|
|
205
292
|
// ---------------------------------------------------------------------------
|
|
206
293
|
// HTTP handler (delegates to shared logic)
|
|
207
294
|
// ---------------------------------------------------------------------------
|
|
@@ -92,6 +92,19 @@ export interface HistorySurface {
|
|
|
92
92
|
completionSummary?: string;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Positional reference to a file attachment captured while walking the
|
|
97
|
+
* content array. The index of an entry in `RenderedHistoryContent.attachments`
|
|
98
|
+
* is what `contentOrder` references as `attachment:N`.
|
|
99
|
+
*/
|
|
100
|
+
export interface HistoryAttachmentRef {
|
|
101
|
+
/** Stable DB attachment id when persisted on the file block (`_attachmentId`). */
|
|
102
|
+
attachmentId?: string;
|
|
103
|
+
filename: string;
|
|
104
|
+
mimeType: string;
|
|
105
|
+
sizeBytes: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
95
108
|
export interface RenderedHistoryContent {
|
|
96
109
|
text: string;
|
|
97
110
|
toolCalls: HistoryToolCall[];
|
|
@@ -99,12 +112,18 @@ export interface RenderedHistoryContent {
|
|
|
99
112
|
toolCallsBeforeText: boolean;
|
|
100
113
|
/** Text segments split by tool-call boundaries. */
|
|
101
114
|
textSegments: string[];
|
|
102
|
-
/** Content block ordering using "text:N", "tool:N", "surface:N" encoding. */
|
|
115
|
+
/** Content block ordering using "text:N", "tool:N", "surface:N", "attachment:N" encoding. */
|
|
103
116
|
contentOrder: string[];
|
|
104
117
|
/** UI surfaces (widgets) embedded in the message. */
|
|
105
118
|
surfaces: HistorySurface[];
|
|
106
119
|
/** Thinking segments extracted from thinking blocks. */
|
|
107
120
|
thinkingSegments: string[];
|
|
121
|
+
/**
|
|
122
|
+
* File attachments captured in content order. Index `N` matches an
|
|
123
|
+
* `attachment:N` entry in `contentOrder`. Callers align their DB-sourced
|
|
124
|
+
* attachment metadata to this ordering for inline placement.
|
|
125
|
+
*/
|
|
126
|
+
attachments: HistoryAttachmentRef[];
|
|
108
127
|
}
|
|
109
128
|
|
|
110
129
|
/**
|
|
@@ -115,6 +134,8 @@ export interface RenderedHistoryContent {
|
|
|
115
134
|
export interface SlackInboundMessageMetadata {
|
|
116
135
|
/** Slack channel id (conversation external id) — recorded as `channelId`. */
|
|
117
136
|
channelId: string;
|
|
137
|
+
/** Human-readable Slack channel name, when the gateway supplied it. */
|
|
138
|
+
channelName?: string;
|
|
118
139
|
/** Slack `ts` for this message — required so persistence can record `channelTs`. */
|
|
119
140
|
channelTs: string;
|
|
120
141
|
/** Parent `thread_ts` when the message lives inside a thread; absent for top-level. */
|
|
@@ -123,6 +144,18 @@ export interface SlackInboundMessageMetadata {
|
|
|
123
144
|
displayName?: string;
|
|
124
145
|
/** Canonical Slack external user id for the sender, when available. */
|
|
125
146
|
actorExternalUserId?: string;
|
|
147
|
+
/** Raw Slack profile timezone for the sender, when supplied. */
|
|
148
|
+
actorTimezone?: string;
|
|
149
|
+
/** Compact Slack profile timezone label for the sender, when supplied. */
|
|
150
|
+
actorTimezoneLabel?: string;
|
|
151
|
+
/** Raw Slack profile timezone offset in seconds, when supplied. */
|
|
152
|
+
actorTimezoneOffsetSeconds?: number;
|
|
153
|
+
/** Timezone used to render this message's timestamp. */
|
|
154
|
+
timestampTimezone?: string;
|
|
155
|
+
/** Compact label for the rendered timestamp timezone. */
|
|
156
|
+
timestampTimezoneLabel?: string;
|
|
157
|
+
/** Compact timezone label appended to the rendered speaker name. */
|
|
158
|
+
speakerTimezoneLabel?: string;
|
|
126
159
|
}
|
|
127
160
|
|
|
128
161
|
/**
|
|
@@ -144,8 +177,6 @@ export interface ConversationCreateOptions {
|
|
|
144
177
|
authContext?: AuthContext;
|
|
145
178
|
/** Whether this turn can block on interactive approval prompts. */
|
|
146
179
|
isInteractive?: boolean;
|
|
147
|
-
/** Slack-only non-persisted notice injected into the active model turn. */
|
|
148
|
-
slackRuntimeContextNotice?: string;
|
|
149
180
|
/**
|
|
150
181
|
* Persisted user-facing content. When present, storage/UI use this value
|
|
151
182
|
* while the model-facing turn continues to use `content`.
|
|
@@ -192,22 +223,42 @@ function clampAttachmentText(text: string): string {
|
|
|
192
223
|
return `${text.slice(0, HISTORY_ATTACHMENT_TEXT_LIMIT)}<truncated />`;
|
|
193
224
|
}
|
|
194
225
|
|
|
195
|
-
|
|
226
|
+
interface FileBlockMetadata {
|
|
227
|
+
mediaType: string;
|
|
228
|
+
filename: string;
|
|
229
|
+
sizeBytes: number;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function extractFileBlockMetadata(
|
|
233
|
+
block: Record<string, unknown>,
|
|
234
|
+
): FileBlockMetadata {
|
|
196
235
|
const source = isRecord(block.source) ? block.source : null;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
236
|
+
return {
|
|
237
|
+
mediaType:
|
|
238
|
+
source && typeof source.media_type === "string"
|
|
239
|
+
? source.media_type
|
|
240
|
+
: "application/octet-stream",
|
|
241
|
+
filename:
|
|
242
|
+
source && typeof source.filename === "string"
|
|
243
|
+
? source.filename
|
|
244
|
+
: "attachment",
|
|
245
|
+
sizeBytes:
|
|
246
|
+
source && typeof source.data === "string"
|
|
247
|
+
? estimateBase64Bytes(source.data)
|
|
248
|
+
: 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function renderFileBlockForHistory(
|
|
253
|
+
block: Record<string, unknown>,
|
|
254
|
+
meta: FileBlockMetadata,
|
|
255
|
+
): string {
|
|
256
|
+
const summaryParts = [
|
|
257
|
+
`[File attachment] ${meta.filename}`,
|
|
258
|
+
`type=${meta.mediaType}`,
|
|
259
|
+
];
|
|
260
|
+
if (meta.sizeBytes > 0)
|
|
261
|
+
summaryParts.push(`size=${formatBytes(meta.sizeBytes)}`);
|
|
211
262
|
|
|
212
263
|
const extractedText =
|
|
213
264
|
typeof block.extracted_text === "string" ? block.extracted_text.trim() : "";
|
|
@@ -237,11 +288,13 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
237
288
|
contentOrder: text ? ["text:0"] : [],
|
|
238
289
|
surfaces: [],
|
|
239
290
|
thinkingSegments: [],
|
|
291
|
+
attachments: [],
|
|
240
292
|
};
|
|
241
293
|
}
|
|
242
294
|
|
|
243
295
|
const textParts: string[] = [];
|
|
244
296
|
const attachmentParts: string[] = [];
|
|
297
|
+
const attachments: HistoryAttachmentRef[] = [];
|
|
245
298
|
const toolCalls: HistoryToolCall[] = [];
|
|
246
299
|
const surfaces: HistorySurface[] = [];
|
|
247
300
|
const thinkingSegments: string[] = [];
|
|
@@ -351,7 +404,19 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
351
404
|
continue;
|
|
352
405
|
}
|
|
353
406
|
if (block.type === "file") {
|
|
354
|
-
|
|
407
|
+
const meta = extractFileBlockMetadata(block);
|
|
408
|
+
attachmentParts.push(renderFileBlockForHistory(block, meta));
|
|
409
|
+
finalizeSegment();
|
|
410
|
+
const ref: HistoryAttachmentRef = {
|
|
411
|
+
filename: meta.filename,
|
|
412
|
+
mimeType: meta.mediaType,
|
|
413
|
+
sizeBytes: meta.sizeBytes,
|
|
414
|
+
};
|
|
415
|
+
if (typeof block._attachmentId === "string" && block._attachmentId) {
|
|
416
|
+
ref.attachmentId = block._attachmentId;
|
|
417
|
+
}
|
|
418
|
+
attachments.push(ref);
|
|
419
|
+
contentOrder.push(`attachment:${attachments.length - 1}`);
|
|
355
420
|
continue;
|
|
356
421
|
}
|
|
357
422
|
if (block.type === "image") {
|
|
@@ -495,17 +560,14 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
495
560
|
matched.imageData = imageDataList[0];
|
|
496
561
|
matched.imageDataList = imageDataList;
|
|
497
562
|
}
|
|
498
|
-
} else {
|
|
499
|
-
toolCalls.push({
|
|
500
|
-
name: "unknown",
|
|
501
|
-
input: {},
|
|
502
|
-
result: resultContent,
|
|
503
|
-
isError,
|
|
504
|
-
...(imageDataList.length > 0
|
|
505
|
-
? { imageData: imageDataList[0], imageDataList }
|
|
506
|
-
: {}),
|
|
507
|
-
});
|
|
508
563
|
}
|
|
564
|
+
// Orphan tool_result with no matching tool_use — drop it. Synthesizing
|
|
565
|
+
// a "name: 'unknown'" phantom entry rendered in chat as "Used unknown"
|
|
566
|
+
// / "Completed 1 step" with no context, with a timestamp later than
|
|
567
|
+
// the assistant's final answer. Most commonly orphans appear when
|
|
568
|
+
// context-window compaction trims the parent tool_use block while
|
|
569
|
+
// leaving the paired tool_result. Losing the orphan's result content
|
|
570
|
+
// is correct: without the parent we can't tell the user what tool ran.
|
|
509
571
|
continue;
|
|
510
572
|
}
|
|
511
573
|
}
|
|
@@ -541,6 +603,7 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
541
603
|
contentOrder,
|
|
542
604
|
surfaces,
|
|
543
605
|
thinkingSegments,
|
|
606
|
+
attachments,
|
|
544
607
|
};
|
|
545
608
|
}
|
|
546
609
|
|
|
@@ -185,7 +185,7 @@ export class HostBrowserProxy {
|
|
|
185
185
|
let detachAbort: () => void = () => {};
|
|
186
186
|
|
|
187
187
|
const timer = setTimeout(() => {
|
|
188
|
-
pendingInteractions.resolve(requestId);
|
|
188
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
189
189
|
log.warn(
|
|
190
190
|
{ requestId, cdpMethod: input.cdpMethod },
|
|
191
191
|
"Host browser proxy request timed out",
|
|
@@ -200,7 +200,7 @@ export class HostBrowserProxy {
|
|
|
200
200
|
if (signal) {
|
|
201
201
|
const onAbort = () => {
|
|
202
202
|
if (pendingInteractions.get(requestId)) {
|
|
203
|
-
pendingInteractions.resolve(requestId);
|
|
203
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
204
204
|
try {
|
|
205
205
|
broadcastMessage({
|
|
206
206
|
type: "host_browser_cancel",
|
|
@@ -229,7 +229,7 @@ export class HostBrowserProxy {
|
|
|
229
229
|
|
|
230
230
|
try {
|
|
231
231
|
if (!preferredClient) {
|
|
232
|
-
pendingInteractions.resolve(requestId);
|
|
232
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
233
233
|
reject(
|
|
234
234
|
new Error(
|
|
235
235
|
"host_browser send failed: no active extension connection",
|
|
@@ -244,7 +244,7 @@ export class HostBrowserProxy {
|
|
|
244
244
|
{ targetClientId: preferredClient.clientId },
|
|
245
245
|
);
|
|
246
246
|
} catch (err) {
|
|
247
|
-
pendingInteractions.resolve(requestId);
|
|
247
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
248
248
|
log.warn(
|
|
249
249
|
{ requestId, cdpMethod: input.cdpMethod, err },
|
|
250
250
|
"Host browser proxy send failed",
|
|
@@ -256,7 +256,7 @@ export class HostBrowserProxy {
|
|
|
256
256
|
|
|
257
257
|
dispose(): void {
|
|
258
258
|
for (const entry of pendingInteractions.getByKind("host_browser")) {
|
|
259
|
-
pendingInteractions.resolve(entry.requestId);
|
|
259
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
260
260
|
try {
|
|
261
261
|
broadcastMessage({
|
|
262
262
|
type: "host_browser_cancel",
|
|
@@ -195,7 +195,7 @@ export class HostCuProxy {
|
|
|
195
195
|
|
|
196
196
|
const timer = setTimeout(() => {
|
|
197
197
|
this._ownedRequests.delete(requestId);
|
|
198
|
-
pendingInteractions.resolve(requestId);
|
|
198
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
199
199
|
log.warn({ requestId, toolName }, "Host CU proxy request timed out");
|
|
200
200
|
resolve({
|
|
201
201
|
content: "Host CU proxy timed out waiting for client response",
|
|
@@ -207,7 +207,7 @@ export class HostCuProxy {
|
|
|
207
207
|
const onAbort = () => {
|
|
208
208
|
if (pendingInteractions.get(requestId)) {
|
|
209
209
|
this._ownedRequests.delete(requestId);
|
|
210
|
-
pendingInteractions.resolve(requestId);
|
|
210
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
211
211
|
try {
|
|
212
212
|
broadcastMessage(
|
|
213
213
|
{
|
|
@@ -263,7 +263,7 @@ export class HostCuProxy {
|
|
|
263
263
|
);
|
|
264
264
|
} catch (err) {
|
|
265
265
|
this._ownedRequests.delete(requestId);
|
|
266
|
-
pendingInteractions.resolve(requestId);
|
|
266
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
267
267
|
log.warn({ requestId, toolName, err }, "Host CU proxy send failed");
|
|
268
268
|
reject(err instanceof Error ? err : new Error(String(err)));
|
|
269
269
|
}
|
|
@@ -280,7 +280,7 @@ export class HostCuProxy {
|
|
|
280
280
|
observation: CuObservationResult,
|
|
281
281
|
): ToolExecutionResult | undefined {
|
|
282
282
|
this._ownedRequests.delete(requestId);
|
|
283
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
283
|
+
const interaction = pendingInteractions.resolve(requestId, "answered");
|
|
284
284
|
if (!interaction?.rpcResolve) {
|
|
285
285
|
log.warn({ requestId }, "No pending host CU request for response");
|
|
286
286
|
return undefined;
|
|
@@ -447,7 +447,7 @@ export class HostCuProxy {
|
|
|
447
447
|
|
|
448
448
|
dispose(): void {
|
|
449
449
|
for (const requestId of this._ownedRequests) {
|
|
450
|
-
const entry = pendingInteractions.resolve(requestId);
|
|
450
|
+
const entry = pendingInteractions.resolve(requestId, "cancelled");
|
|
451
451
|
if (!entry) continue;
|
|
452
452
|
try {
|
|
453
453
|
broadcastMessage(
|
|
@@ -136,7 +136,7 @@ export class HostFileProxy {
|
|
|
136
136
|
let detachAbort: () => void = () => {};
|
|
137
137
|
|
|
138
138
|
const timer = setTimeout(() => {
|
|
139
|
-
pendingInteractions.resolve(requestId);
|
|
139
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
140
140
|
log.warn(
|
|
141
141
|
{ requestId, operation: input.operation },
|
|
142
142
|
"Host file proxy request timed out",
|
|
@@ -152,7 +152,7 @@ export class HostFileProxy {
|
|
|
152
152
|
if (signal) {
|
|
153
153
|
const onAbort = () => {
|
|
154
154
|
if (pendingInteractions.get(requestId)) {
|
|
155
|
-
pendingInteractions.resolve(requestId);
|
|
155
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
156
156
|
try {
|
|
157
157
|
broadcastMessage(
|
|
158
158
|
{
|
|
@@ -210,7 +210,7 @@ export class HostFileProxy {
|
|
|
210
210
|
{ targetClientId: resolvedTargetClientId },
|
|
211
211
|
);
|
|
212
212
|
} catch (err) {
|
|
213
|
-
pendingInteractions.resolve(requestId);
|
|
213
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
214
214
|
log.warn(
|
|
215
215
|
{ requestId, operation: input.operation, err },
|
|
216
216
|
"Host file proxy send failed",
|
|
@@ -227,7 +227,7 @@ export class HostFileProxy {
|
|
|
227
227
|
requestId: string,
|
|
228
228
|
response: { content: string; isError: boolean; imageData?: string },
|
|
229
229
|
): void {
|
|
230
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
230
|
+
const interaction = pendingInteractions.resolve(requestId, "answered");
|
|
231
231
|
if (!interaction?.rpcResolve) {
|
|
232
232
|
log.warn({ requestId }, "No pending host file request for response");
|
|
233
233
|
return;
|
|
@@ -252,7 +252,7 @@ export class HostFileProxy {
|
|
|
252
252
|
|
|
253
253
|
dispose(): void {
|
|
254
254
|
for (const entry of pendingInteractions.getByKind("host_file")) {
|
|
255
|
-
pendingInteractions.resolve(entry.requestId);
|
|
255
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
256
256
|
try {
|
|
257
257
|
broadcastMessage(
|
|
258
258
|
{
|
|
@@ -154,7 +154,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
154
154
|
const timer = setTimeout(() => {
|
|
155
155
|
this.pending.delete(requestId);
|
|
156
156
|
detachAbort();
|
|
157
|
-
pendingInteractions.resolve(requestId);
|
|
157
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
158
158
|
log.warn(
|
|
159
159
|
{ requestId, toolName, kind: this.resultPendingKind },
|
|
160
160
|
"Host proxy request timed out",
|
|
@@ -168,7 +168,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
168
168
|
clearTimeout(timer);
|
|
169
169
|
this.pending.delete(requestId);
|
|
170
170
|
detachAbort();
|
|
171
|
-
pendingInteractions.resolve(requestId);
|
|
171
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
172
172
|
try {
|
|
173
173
|
broadcastDynamic(
|
|
174
174
|
{
|
|
@@ -239,7 +239,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
239
239
|
clearTimeout(timer);
|
|
240
240
|
this.pending.delete(requestId);
|
|
241
241
|
detachAbort();
|
|
242
|
-
pendingInteractions.resolve(requestId);
|
|
242
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
243
243
|
log.warn(
|
|
244
244
|
{ requestId, toolName, kind: this.resultPendingKind, err },
|
|
245
245
|
"Host proxy send failed",
|
|
@@ -285,7 +285,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
285
285
|
for (const [requestId, entry] of this.pending) {
|
|
286
286
|
clearTimeout(entry.timer);
|
|
287
287
|
entry.detachAbort();
|
|
288
|
-
pendingInteractions.resolve(requestId);
|
|
288
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
289
289
|
try {
|
|
290
290
|
broadcastDynamic(
|
|
291
291
|
{
|
|
@@ -205,7 +205,7 @@ export class HostTransferProxy {
|
|
|
205
205
|
|
|
206
206
|
const timer = setTimeout(() => {
|
|
207
207
|
this.transfers.delete(transferId);
|
|
208
|
-
pendingInteractions.resolve(requestId);
|
|
208
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
209
209
|
log.warn(
|
|
210
210
|
{ requestId, transferId, direction: "to_host" },
|
|
211
211
|
"Host transfer proxy request timed out",
|
|
@@ -222,7 +222,7 @@ export class HostTransferProxy {
|
|
|
222
222
|
const onAbort = () => {
|
|
223
223
|
if (pendingInteractions.get(requestId)) {
|
|
224
224
|
this.transfers.delete(transferId);
|
|
225
|
-
pendingInteractions.resolve(requestId);
|
|
225
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
226
226
|
try {
|
|
227
227
|
broadcastMessage(
|
|
228
228
|
{
|
|
@@ -301,7 +301,7 @@ export class HostTransferProxy {
|
|
|
301
301
|
);
|
|
302
302
|
} catch (err) {
|
|
303
303
|
this.transfers.delete(transferId);
|
|
304
|
-
pendingInteractions.resolve(requestId);
|
|
304
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
305
305
|
log.warn(
|
|
306
306
|
{ requestId, transferId, err },
|
|
307
307
|
"Host transfer proxy send failed",
|
|
@@ -396,7 +396,7 @@ export class HostTransferProxy {
|
|
|
396
396
|
|
|
397
397
|
const timer = setTimeout(() => {
|
|
398
398
|
this.transfers.delete(transferId);
|
|
399
|
-
pendingInteractions.resolve(requestId);
|
|
399
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
400
400
|
log.warn(
|
|
401
401
|
{ requestId, transferId, direction: "to_sandbox" },
|
|
402
402
|
"Host transfer proxy request timed out",
|
|
@@ -413,7 +413,7 @@ export class HostTransferProxy {
|
|
|
413
413
|
const onAbort = () => {
|
|
414
414
|
if (pendingInteractions.get(requestId)) {
|
|
415
415
|
this.transfers.delete(transferId);
|
|
416
|
-
pendingInteractions.resolve(requestId);
|
|
416
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
417
417
|
try {
|
|
418
418
|
broadcastMessage(
|
|
419
419
|
{
|
|
@@ -487,7 +487,7 @@ export class HostTransferProxy {
|
|
|
487
487
|
);
|
|
488
488
|
} catch (err) {
|
|
489
489
|
this.transfers.delete(transferId);
|
|
490
|
-
pendingInteractions.resolve(requestId);
|
|
490
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
491
491
|
log.warn(
|
|
492
492
|
{ requestId, transferId, err },
|
|
493
493
|
"Host transfer proxy send failed",
|
|
@@ -508,7 +508,7 @@ export class HostTransferProxy {
|
|
|
508
508
|
errorMessage?: string;
|
|
509
509
|
},
|
|
510
510
|
): void {
|
|
511
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
511
|
+
const interaction = pendingInteractions.resolve(requestId, "answered");
|
|
512
512
|
if (!interaction?.rpcResolve) {
|
|
513
513
|
log.warn({ requestId }, "No pending host transfer request for response");
|
|
514
514
|
return;
|
|
@@ -622,14 +622,14 @@ export class HostTransferProxy {
|
|
|
622
622
|
|
|
623
623
|
if (entry.overwrite !== true && existsSync(entry.filePath)) {
|
|
624
624
|
const errorMsg = `Destination file already exists: ${entry.filePath}. Set overwrite to true to replace it.`;
|
|
625
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
625
|
+
const interaction = pendingInteractions.resolve(requestId, "answered");
|
|
626
626
|
this.transfers.delete(transferId);
|
|
627
627
|
interaction?.rpcResolve?.({ content: errorMsg, isError: true });
|
|
628
628
|
return { accepted: false, error: errorMsg };
|
|
629
629
|
}
|
|
630
630
|
|
|
631
631
|
const cleanup = () => {
|
|
632
|
-
pendingInteractions.resolve(requestId);
|
|
632
|
+
pendingInteractions.resolve(requestId, "answered");
|
|
633
633
|
this.transfers.delete(transferId);
|
|
634
634
|
};
|
|
635
635
|
|
|
@@ -662,7 +662,7 @@ export class HostTransferProxy {
|
|
|
662
662
|
if (!interaction) return;
|
|
663
663
|
const transferId = interaction.metadata?.transferId as string | undefined;
|
|
664
664
|
if (transferId) this.transfers.delete(transferId);
|
|
665
|
-
pendingInteractions.resolve(requestId);
|
|
665
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
666
666
|
try {
|
|
667
667
|
broadcastMessage(
|
|
668
668
|
{
|
|
@@ -718,7 +718,7 @@ export class HostTransferProxy {
|
|
|
718
718
|
for (const entry of pendingInteractions.getByKind("host_transfer")) {
|
|
719
719
|
const transferId = entry.metadata?.transferId as string | undefined;
|
|
720
720
|
if (transferId) this.transfers.delete(transferId);
|
|
721
|
-
pendingInteractions.resolve(entry.requestId);
|
|
721
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
722
722
|
try {
|
|
723
723
|
broadcastMessage(
|
|
724
724
|
{
|