@vellumai/assistant 0.8.2 → 0.8.4
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 +11 -12
- package/docker-entrypoint.sh +13 -2
- package/docker-init-apt-root.sh +79 -6
- package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
- package/openapi.yaml +945 -36
- package/package.json +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +271 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +195 -0
- package/src/__tests__/agent-loop.test.ts +88 -3
- package/src/__tests__/anthropic-provider.test.ts +272 -0
- package/src/__tests__/approval-cascade.test.ts +1 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
- package/src/__tests__/channel-delivery-store.test.ts +193 -0
- package/src/__tests__/channel-reply-delivery.test.ts +284 -5
- package/src/__tests__/channel-retry-sweep.test.ts +274 -1
- package/src/__tests__/compaction-events.test.ts +1 -1
- package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
- package/src/__tests__/compactor-tail-resolution.test.ts +107 -1
- package/src/__tests__/config-get-vision-flag.test.ts +136 -0
- package/src/__tests__/config-loader-backfill.test.ts +115 -18
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/context-token-estimator.test.ts +112 -57
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +54 -3
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +31 -6
- package/src/__tests__/conversation-agent-loop.test.ts +77 -3
- 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-confirmation-signals.test.ts +1 -1
- package/src/__tests__/conversation-fork-crud.test.ts +161 -0
- package/src/__tests__/conversation-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-load-cleaned-at.test.ts +279 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-media-retry.test.ts +19 -8
- 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 +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +290 -85
- package/src/__tests__/conversation-seed-composer.test.ts +66 -4
- 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-surfaces-task-progress.test.ts +220 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -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-security-invariants.test.ts +6 -0
- package/src/__tests__/cu-unified-flow.test.ts +10 -1
- package/src/__tests__/date-context.test.ts +45 -0
- 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__/external-plugin-loader.test.ts +91 -19
- package/src/__tests__/first-greeting.test.ts +23 -2
- package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -0
- package/src/__tests__/headless-browser-navigate.test.ts +172 -0
- package/src/__tests__/heartbeat-service.test.ts +24 -164
- package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
- package/src/__tests__/host-app-control-proxy.test.ts +241 -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-proxy-preactivation.test.ts +200 -13
- 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__/injector-background-turn.test.ts +153 -0
- package/src/__tests__/injector-chain.test.ts +7 -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__/lifecycle-memory-v2-seed.test.ts +9 -2
- 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 +17 -16
- package/src/__tests__/llm-callsite-catalog.test.ts +25 -0
- package/src/__tests__/llm-catalog-parity.test.ts +3 -0
- package/src/__tests__/llm-context-normalization.test.ts +0 -2
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +116 -0
- package/src/__tests__/llm-request-log-error-payload.test.ts +138 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -0
- package/src/__tests__/llm-resolver.test.ts +340 -3
- package/src/__tests__/log-export-routes.test.ts +99 -2
- package/src/__tests__/managed-profile-guard.test.ts +10 -0
- package/src/__tests__/message-queue-steer.test.ts +114 -0
- package/src/__tests__/notification-decision-fallback.test.ts +0 -91
- package/src/__tests__/notification-decision-strategy.test.ts +14 -31
- package/src/__tests__/notification-deep-link.test.ts +15 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -2
- package/src/__tests__/notification-platform-adapter.test.ts +5 -4
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -0
- package/src/__tests__/notification-vellum-adapter.test.ts +113 -0
- package/src/__tests__/openai-provider.test.ts +323 -3
- package/src/__tests__/openai-responses-cutover-guard.test.ts +3 -3
- package/src/__tests__/openai-responses-provider.test.ts +4 -4
- package/src/__tests__/openrouter-provider-only.test.ts +51 -3
- package/src/__tests__/openrouter-token-estimation.test.ts +34 -25
- package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
- package/src/__tests__/pending-interactions-resolved-event.test.ts +190 -0
- package/src/__tests__/platform-proxy-context.test.ts +6 -1
- package/src/__tests__/platform.test.ts +0 -3
- package/src/__tests__/plugin-source-watcher.test.ts +302 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +3 -3
- package/src/__tests__/plugin-types.test.ts +2 -2
- 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__/provider-catalog-visibility.test.ts +16 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +27 -25
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +83 -4
- package/src/__tests__/steer-tool-repair.test.ts +249 -0
- package/src/__tests__/system-prompt.test.ts +57 -101
- package/src/__tests__/terminal-tools.test.ts +11 -1
- package/src/__tests__/thinking-block-replay.test.ts +113 -0
- package/src/__tests__/thread-backfill.test.ts +370 -22
- package/src/__tests__/tool-executor.test.ts +90 -1
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
- package/src/__tests__/twilio-routes.test.ts +1 -1
- package/src/__tests__/web-fetch.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +88 -5
- package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +228 -0
- package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
- package/src/a2a/__tests__/agent-card.test.ts +98 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +597 -0
- package/src/a2a/__tests__/protocol-helpers.test.ts +113 -0
- package/src/a2a/__tests__/task-store.test.ts +246 -0
- package/src/a2a/agent-card.ts +58 -0
- package/src/a2a/feature-gate.ts +8 -0
- package/src/a2a/protocol-constants.ts +21 -0
- package/src/a2a/protocol-errors.ts +50 -0
- package/src/a2a/protocol-types.ts +162 -0
- package/src/a2a/task-store.ts +168 -0
- package/src/agent/attachments.ts +1 -0
- package/src/agent/loop.ts +208 -22
- package/src/background-wake/next-wake.test.ts +289 -0
- package/src/background-wake/next-wake.ts +172 -0
- package/src/browser/operations.ts +15 -0
- package/src/channels/config.ts +9 -0
- package/src/channels/types.ts +14 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +9 -12
- package/src/cli/{__tests__ → commands/__tests__}/notifications.test.ts +201 -28
- package/src/cli/commands/__tests__/schedules.test.ts +469 -0
- package/src/cli/commands/conversations.ts +128 -1
- package/src/cli/commands/inference-providers.ts +147 -1
- package/src/cli/commands/memory-v2.ts +308 -0
- package/src/cli/commands/notifications.ts +89 -37
- package/src/cli/commands/plugins.ts +67 -0
- package/src/cli/commands/schedules.ts +297 -5
- package/src/cli/lib/__tests__/search-plugins.test.ts +261 -0
- package/src/cli/lib/install-from-github.ts +8 -9
- package/src/cli/lib/search-plugins.ts +163 -0
- package/src/cli/program.ts +14 -0
- package/src/cli/utils/conversation-id.ts +17 -5
- package/src/config/assistant-feature-flags.ts +24 -54
- package/src/config/bundled-skills/app-builder/SKILL.md +117 -1
- package/src/config/bundled-skills/document-editor/SKILL.md +115 -0
- package/src/config/bundled-skills/document-editor/TOOLS.json +240 -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-replace-text.ts +12 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/SKILL.md +8 -0
- package/src/config/bundled-tool-registry.ts +22 -12
- package/src/config/call-site-defaults.ts +124 -0
- package/src/config/feature-flag-registry.json +111 -23
- package/src/config/llm-resolver.ts +66 -1
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +7 -3
- package/src/config/schemas/call-site-catalog.ts +21 -0
- package/src/config/schemas/channels.ts +9 -0
- package/src/config/schemas/conversations.ts +10 -0
- package/src/config/schemas/heartbeat.ts +14 -0
- package/src/config/schemas/llm.ts +4 -3
- package/src/config/schemas/memory-retrospective.ts +1 -1
- package/src/config/schemas/memory-v2.ts +51 -4
- package/src/config/schemas/memory.ts +3 -1
- package/src/config/seed-inference-profiles.ts +99 -29
- package/src/context/compactor.ts +80 -13
- package/src/context/token-estimator.ts +72 -31
- package/src/context/window-manager.ts +25 -0
- package/src/credential-health/credential-health-service.ts +34 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -22
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
- 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 +231 -23
- package/src/daemon/conversation-agent-loop.ts +252 -56
- package/src/daemon/conversation-lifecycle.ts +142 -116
- 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 +144 -75
- package/src/daemon/conversation-slash.ts +37 -5
- package/src/daemon/conversation-surfaces.ts +45 -2
- package/src/daemon/conversation-tool-setup.ts +7 -0
- package/src/daemon/conversation.ts +42 -12
- package/src/daemon/date-context.ts +40 -0
- package/src/daemon/first-greeting.ts +10 -0
- package/src/daemon/guardian-action-generators.ts +1 -125
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +248 -0
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +154 -0
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +133 -0
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +95 -0
- package/src/daemon/handlers/config-a2a.ts +449 -0
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +80 -0
- package/src/daemon/handlers/shared.ts +92 -29
- package/src/daemon/host-app-control-proxy.ts +69 -18
- package/src/daemon/host-bash-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/host-file-proxy.ts +1 -1
- package/src/daemon/host-proxy-preactivation.ts +85 -18
- package/src/daemon/host-transfer-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +67 -65
- package/src/daemon/memory-v2-startup.ts +49 -13
- package/src/daemon/message-protocol.ts +4 -0
- package/src/daemon/message-types/conversations.ts +8 -0
- package/src/daemon/message-types/document-comments.ts +50 -0
- package/src/daemon/message-types/messages.ts +68 -1
- package/src/daemon/message-types/notifications.ts +21 -0
- package/src/daemon/message-types/surfaces.ts +3 -1
- package/src/daemon/message-types/web-activity.ts +57 -0
- package/src/daemon/pkb-reminder-builder.test.ts +10 -53
- package/src/daemon/pkb-reminder-builder.ts +4 -19
- package/src/daemon/plugin-source-watcher.ts +135 -3
- package/src/daemon/process-message.ts +72 -12
- package/src/daemon/query-complexity-router.ts +75 -0
- package/src/daemon/skill-memory-refresh.ts +5 -1
- package/src/daemon/trust-context.ts +6 -0
- package/src/daemon/wake-target-adapter.ts +2 -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/export/__tests__/transcript-formatter.test.ts +121 -0
- package/src/export/transcript-formatter.ts +54 -20
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +44 -1
- package/src/heartbeat/heartbeat-service.ts +35 -191
- package/src/home/__tests__/feed-types.test.ts +40 -0
- package/src/home/__tests__/suggested-prompts.test.ts +33 -2
- package/src/home/feed-types.ts +20 -3
- package/src/home/home-content-refresh.ts +52 -0
- package/src/home/home-greeting-cache.ts +69 -0
- package/src/home/home-greeting.ts +94 -0
- package/src/home/suggested-prompts.ts +177 -9
- package/src/ipc/cli-client.ts +147 -45
- package/src/memory/__tests__/conversation-queries.test.ts +220 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +2 -50
- package/src/memory/__tests__/memory-retrospective-job.test.ts +407 -10
- package/src/memory/conversation-crud.ts +133 -43
- package/src/memory/conversation-queries.ts +87 -1
- package/src/memory/conversation-title-service.ts +26 -4
- package/src/memory/db-init.ts +22 -0
- 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/__tests__/conversation-graph-memory-v2-routing.test.ts +84 -3
- package/src/memory/graph/conversation-graph-memory.ts +18 -6
- package/src/memory/graph/tools.ts +6 -37
- package/src/memory/invite-store.ts +53 -0
- package/src/memory/jobs-worker.ts +21 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +7 -2
- package/src/memory/llm-request-log-store.ts +92 -1
- package/src/memory/memory-retrospective-constants.ts +28 -0
- package/src/memory/memory-retrospective-enqueue.ts +4 -22
- package/src/memory/memory-retrospective-job.ts +438 -21
- package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
- package/src/memory/memory-v2-activation-log-store.ts +26 -8
- 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/250-provider-connection-base-url-and-models.ts +28 -0
- package/src/memory/migrations/251-a2a-tasks.ts +49 -0
- package/src/memory/migrations/252-llm-request-log-agent-loop-exit-reason.ts +32 -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/index.ts +20 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/onboarding-events-store.ts +7 -0
- package/src/memory/schema/a2a.ts +15 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/inference.ts +2 -0
- package/src/memory/schema/infrastructure.ts +2 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +25 -23
- package/src/memory/v2/__tests__/cli-command-store.test.ts +404 -0
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +25 -4
- package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/memory/v2/__tests__/injection.test.ts +221 -17
- package/src/memory/v2/__tests__/page-index.test.ts +365 -1
- package/src/memory/v2/__tests__/router.test.ts +489 -1
- package/src/memory/v2/__tests__/static-context.test.ts +12 -1
- package/src/memory/v2/activation-store.ts +14 -16
- package/src/memory/v2/cli-command-content.ts +19 -0
- package/src/memory/v2/cli-command-store.ts +304 -0
- package/src/memory/v2/consolidation-job.ts +14 -0
- package/src/memory/v2/frontmatter-sweep.ts +7 -1
- package/src/memory/v2/injection-events.ts +101 -0
- package/src/memory/v2/injection.ts +69 -29
- package/src/memory/v2/page-index.ts +246 -19
- package/src/memory/v2/page-store.ts +18 -0
- package/src/memory/v2/router.ts +209 -55
- package/src/memory/v2/static-context.ts +4 -4
- package/src/memory/v2/types.ts +23 -0
- package/src/messaging/providers/a2a/__tests__/deliver.test.ts +274 -0
- package/src/messaging/providers/a2a/deliver.ts +156 -0
- package/src/messaging/providers/gmail/client.ts +9 -2
- package/src/messaging/providers/index.ts +18 -3
- 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__/broadcaster.test.ts +203 -0
- package/src/notifications/__tests__/decision-engine.test.ts +283 -0
- package/src/notifications/__tests__/deterministic-checks.test.ts +286 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +5 -1
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +521 -36
- package/src/notifications/adapters/macos.ts +12 -2
- package/src/notifications/broadcaster.ts +29 -4
- package/src/notifications/conversation-seed-composer.ts +14 -2
- package/src/notifications/copy-composer.ts +17 -64
- package/src/notifications/decision-engine.ts +111 -44
- package/src/notifications/deferred-emit.ts +135 -0
- package/src/notifications/deterministic-checks.ts +96 -0
- package/src/notifications/emit-signal.ts +10 -1
- package/src/notifications/home-feed-side-effect.ts +136 -27
- package/src/notifications/signal.ts +0 -4
- package/src/notifications/types.ts +8 -0
- 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/platform-connection.test.ts +43 -3
- package/src/oauth/platform-connection.ts +13 -4
- package/src/oauth/seed-providers.ts +22 -0
- package/src/permissions/prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +4 -1
- package/src/plugins/defaults/injectors.ts +118 -26
- package/src/plugins/external-plugin-loader.ts +82 -10
- package/src/plugins/types.ts +16 -7
- package/src/prompts/__tests__/system-prompt.test.ts +44 -45
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +4 -8
- package/src/prompts/normalize-onboarding.ts +40 -0
- package/src/prompts/sections.ts +32 -14
- package/src/prompts/system-prompt.ts +105 -76
- package/src/prompts/template-detection.ts +37 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/VOICE.md +3 -0
- package/src/prompts/templates/system-sections.ts +51 -10
- package/src/providers/__tests__/inference.test.ts +2 -0
- package/src/providers/anthropic/client.ts +132 -5
- package/src/providers/call-site-routing.ts +24 -6
- package/src/providers/connection-resolution.ts +63 -13
- package/src/providers/fireworks/client.ts +20 -2
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +74 -0
- 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/__tests__/connections-openai-compatible.test.ts +175 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +15 -0
- package/src/providers/inference/adapter-factory.ts +24 -21
- package/src/providers/inference/auth.ts +15 -3
- package/src/providers/inference/backfill.ts +14 -1
- package/src/providers/inference/codex-token-refresh.ts +128 -0
- package/src/providers/inference/connections.ts +85 -5
- package/src/providers/inference/resolve-auth.ts +50 -5
- package/src/providers/model-catalog.ts +244 -242
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +235 -0
- package/src/providers/openai/chat-completions-provider.ts +215 -25
- package/src/providers/openai/responses-provider.ts +9 -3
- package/src/providers/openrouter/client.ts +46 -4
- package/src/providers/platform-proxy/constants.ts +3 -4
- package/src/providers/provider-catalog-visibility.ts +3 -1
- package/src/providers/provider-send-message.ts +27 -12
- package/src/providers/registry.ts +30 -1
- package/src/providers/types.ts +25 -0
- 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 +212 -57
- package/src/runtime/auth/route-policy.ts +20 -3
- package/src/runtime/background-job-runner.ts +26 -0
- package/src/runtime/channel-reply-delivery.ts +182 -47
- package/src/runtime/channel-retry-sweep.ts +141 -16
- package/src/runtime/http-server.ts +7 -16
- package/src/runtime/http-types.ts +7 -51
- package/src/runtime/pending-interactions.ts +51 -8
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +258 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +121 -5
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +275 -44
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +12 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +271 -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/approval-routes.ts +4 -1
- package/src/runtime/routes/channel-availability-routes.ts +5 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
- package/src/runtime/routes/consolidation-routes.ts +100 -0
- package/src/runtime/routes/content-source-routes.ts +78 -0
- package/src/runtime/routes/conversation-cli-routes.ts +146 -1
- package/src/runtime/routes/conversation-query-routes.ts +130 -12
- package/src/runtime/routes/conversation-routes.ts +288 -76
- package/src/runtime/routes/document-comments-routes.ts +287 -0
- package/src/runtime/routes/documents-routes.ts +33 -0
- 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 +8 -1
- 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/background-dispatch.test.ts +365 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
- package/src/runtime/routes/index.ts +14 -4
- package/src/runtime/routes/inference-provider-connection-routes.ts +192 -3
- package/src/runtime/routes/integrations/a2a.ts +294 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +11 -1
- package/src/runtime/routes/log-export-routes.ts +39 -0
- package/src/runtime/routes/memory-v2-routes.ts +217 -0
- package/src/runtime/routes/notification-routes.ts +19 -2
- package/src/runtime/routes/question-routes.ts +4 -1
- package/src/runtime/routes/sanity-routes.ts +159 -0
- package/src/runtime/routes/slack-channel-routes.ts +187 -0
- package/src/runtime/routes/subagents-routes.ts +41 -0
- package/src/runtime/services/conversation-serializer.ts +30 -4
- 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/subagent/manager.ts +2 -0
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +80 -0
- package/src/tools/browser/browser-execution.ts +93 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +1 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +10 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +15 -1
- package/src/tools/browser/cdp-client/factory.ts +87 -3
- package/src/tools/browser/cdp-client/local-cdp-client.ts +9 -0
- package/src/tools/browser/cdp-client/types.ts +36 -0
- package/src/tools/browser/pinned-tabs.ts +90 -0
- 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 +128 -2
- package/src/tools/memory/register.ts +1 -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 +213 -64
- package/src/tools/network/web-search.ts +191 -66
- package/src/tools/registry.ts +2 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/tool-approval-handler.ts +19 -12
- package/src/tools/types.ts +41 -2
- package/src/tools/ui-surface/definitions.ts +3 -1
- package/src/types/onboarding-context.ts +4 -0
- package/src/util/__tests__/favicon.test.ts +84 -0
- package/src/util/favicon.ts +40 -0
- package/src/util/platform.ts +0 -5
- package/src/workspace/git-service.ts +75 -4
- package/src/workspace/migrations/087-memory-router-balanced-profile.ts +91 -0
- package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -441
- 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/memory/graph/__tests__/remember-description.test.ts +0 -55
- package/src/runtime/guardian-action-conversation-turn.ts +0 -99
- 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
|
@@ -53,8 +53,8 @@ import {
|
|
|
53
53
|
getConversation,
|
|
54
54
|
getConversationOriginChannel,
|
|
55
55
|
getConversationOverrideProfileFromRow,
|
|
56
|
+
setConversationCleanedAt,
|
|
56
57
|
} from "../memory/conversation-crud.js";
|
|
57
|
-
import { isBackgroundConversationType } from "../memory/conversation-types.js";
|
|
58
58
|
import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
59
59
|
import { shouldExposePersonalMemory } from "../memory/v2/static-context.js";
|
|
60
60
|
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
@@ -105,6 +105,7 @@ import {
|
|
|
105
105
|
type ChannelCapabilities,
|
|
106
106
|
getSlackCompactionWatermarkForPrefix,
|
|
107
107
|
loadSlackChronologicalContext,
|
|
108
|
+
stripInjectionsForCompaction,
|
|
108
109
|
} from "./conversation-runtime-assembly.js";
|
|
109
110
|
import type { SkillProjectionCache } from "./conversation-skill-tools.js";
|
|
110
111
|
import {
|
|
@@ -143,6 +144,13 @@ import { TraceEmitter } from "./trace-emitter.js";
|
|
|
143
144
|
|
|
144
145
|
const log = getLogger("conversation");
|
|
145
146
|
|
|
147
|
+
export interface CleanResult {
|
|
148
|
+
previousEstimatedInputTokens: number;
|
|
149
|
+
estimatedInputTokens: number;
|
|
150
|
+
maxInputTokens: number;
|
|
151
|
+
preservedMessages: number;
|
|
152
|
+
}
|
|
153
|
+
|
|
146
154
|
export { findLastUndoableUserMessageIndex } from "./conversation-history.js";
|
|
147
155
|
export type {
|
|
148
156
|
QueueDrainReason,
|
|
@@ -241,7 +249,6 @@ export class Conversation {
|
|
|
241
249
|
/** @internal */ loadedHistoryPersonalMemoryAllowed?: boolean;
|
|
242
250
|
/** @internal */ voiceCallControlPrompt?: string;
|
|
243
251
|
/** @internal */ transportHints?: string[];
|
|
244
|
-
/** @internal */ slackRuntimeContextNotice?: string;
|
|
245
252
|
/** @internal */ assistantId?: string;
|
|
246
253
|
/** @internal */ commandIntent?: {
|
|
247
254
|
type: string;
|
|
@@ -250,6 +257,13 @@ export class Conversation {
|
|
|
250
257
|
};
|
|
251
258
|
/** @internal */ surfaceActionRequestIds = new Set<string>();
|
|
252
259
|
/** @internal */ approvedViaPromptThisTurn = false;
|
|
260
|
+
/**
|
|
261
|
+
* Set by `steerToMessage` to signal the drain path that it should inject
|
|
262
|
+
* synthetic tool_result messages for any pending tool_use blocks abandoned
|
|
263
|
+
* by the aborted generation. Cleared after repair.
|
|
264
|
+
* @internal
|
|
265
|
+
*/
|
|
266
|
+
pendingSteerRepair = false;
|
|
253
267
|
/**
|
|
254
268
|
* When true, side-effect tools must prompt even if a trust/allow rule
|
|
255
269
|
* would auto-allow. Set by non-interactive callers (e.g. non-guardian
|
|
@@ -489,9 +503,6 @@ export class Conversation {
|
|
|
489
503
|
channelPersona: persona.channelPersona,
|
|
490
504
|
userSlug: persona.userSlug,
|
|
491
505
|
onboardingContext: this.getOnboardingContext(),
|
|
492
|
-
isBackgroundConversation: isBackgroundConversationType(
|
|
493
|
-
getConversation(this.conversationId)?.conversationType,
|
|
494
|
-
),
|
|
495
506
|
});
|
|
496
507
|
})(),
|
|
497
508
|
};
|
|
@@ -583,9 +594,6 @@ export class Conversation {
|
|
|
583
594
|
channelPersona: persona.channelPersona,
|
|
584
595
|
userSlug: persona.userSlug,
|
|
585
596
|
onboardingContext: this.getOnboardingContext(),
|
|
586
|
-
isBackgroundConversation: isBackgroundConversationType(
|
|
587
|
-
getConversation(this.conversationId)?.conversationType,
|
|
588
|
-
),
|
|
589
597
|
});
|
|
590
598
|
})();
|
|
591
599
|
const tools = buildToolDefinitions();
|
|
@@ -1133,6 +1141,32 @@ export class Conversation {
|
|
|
1133
1141
|
return result;
|
|
1134
1142
|
}
|
|
1135
1143
|
|
|
1144
|
+
/**
|
|
1145
|
+
* Strip stale runtime injections from the message history and reset the
|
|
1146
|
+
* memory-injection ledger without summarizing any history. Mirrors the
|
|
1147
|
+
* non-LLM side effects of `forceCompact`: the next turn re-injects fresh
|
|
1148
|
+
* NOW.md / knowledge-base / memory-v2 static blocks, and per-turn memory
|
|
1149
|
+
* activations are no longer deduped against the prior session.
|
|
1150
|
+
*/
|
|
1151
|
+
async forceClean(): Promise<CleanResult> {
|
|
1152
|
+
const previousEstimatedInputTokens =
|
|
1153
|
+
this.contextWindowManager.estimateInputTokens(this.messages);
|
|
1154
|
+
const stripped = stripInjectionsForCompaction(this.messages);
|
|
1155
|
+
this.messages = stripped;
|
|
1156
|
+
await this.graphMemory.onCompacted(0);
|
|
1157
|
+
this.pendingPostCompactReinject = true;
|
|
1158
|
+
setConversationCleanedAt(this.conversationId, Date.now());
|
|
1159
|
+
const estimatedInputTokens = this.contextWindowManager.estimateInputTokens(
|
|
1160
|
+
this.messages,
|
|
1161
|
+
);
|
|
1162
|
+
return {
|
|
1163
|
+
previousEstimatedInputTokens,
|
|
1164
|
+
estimatedInputTokens,
|
|
1165
|
+
maxInputTokens: this.contextWindowManager.maxInputTokens,
|
|
1166
|
+
preservedMessages: this.messages.length,
|
|
1167
|
+
};
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1136
1170
|
setChannelCapabilities(caps: ChannelCapabilities | null): void {
|
|
1137
1171
|
this.channelCapabilities = caps ?? undefined;
|
|
1138
1172
|
this.secretPrompter.setChannelContext(
|
|
@@ -1165,10 +1199,6 @@ export class Conversation {
|
|
|
1165
1199
|
this.transportHints = hints;
|
|
1166
1200
|
}
|
|
1167
1201
|
|
|
1168
|
-
setSlackRuntimeContextNotice(notice: string | undefined): void {
|
|
1169
|
-
this.slackRuntimeContextNotice = notice;
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
1202
|
/**
|
|
1173
1203
|
* Apply client-reported host environment (home dir, username) from
|
|
1174
1204
|
* transport metadata onto the conversation. Only interfaces whose
|
|
@@ -326,6 +326,46 @@ function formatLocalDate(date: Date, timeZone: string): string {
|
|
|
326
326
|
).padStart(2, "0")}`;
|
|
327
327
|
}
|
|
328
328
|
|
|
329
|
+
const localTimestampFormatterCache = new Map<string, Intl.DateTimeFormat>();
|
|
330
|
+
|
|
331
|
+
function getLocalTimestampFormatter(timeZone: string): Intl.DateTimeFormat {
|
|
332
|
+
let fmt = localTimestampFormatterCache.get(timeZone);
|
|
333
|
+
if (!fmt) {
|
|
334
|
+
fmt = new Intl.DateTimeFormat("en-CA", {
|
|
335
|
+
timeZone,
|
|
336
|
+
year: "numeric",
|
|
337
|
+
month: "2-digit",
|
|
338
|
+
day: "2-digit",
|
|
339
|
+
hour: "2-digit",
|
|
340
|
+
minute: "2-digit",
|
|
341
|
+
second: "2-digit",
|
|
342
|
+
hourCycle: "h23",
|
|
343
|
+
});
|
|
344
|
+
localTimestampFormatterCache.set(timeZone, fmt);
|
|
345
|
+
}
|
|
346
|
+
return fmt;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Format an epoch-millis instant as `YYYY-MM-DD HH:MM:SS` in the given
|
|
351
|
+
* IANA timezone. When `timeZone` is omitted or `"UTC"`, falls back to a
|
|
352
|
+
* pure-UTC `toISOString` slice so callers can opt in incrementally.
|
|
353
|
+
*
|
|
354
|
+
* The internal `Intl.DateTimeFormat` is memoized by `timeZone` because
|
|
355
|
+
* constructing it is ~1ms in V8 — material when rendering long transcripts.
|
|
356
|
+
*/
|
|
357
|
+
export function formatLocalTimestamp(ms: number, timeZone?: string): string {
|
|
358
|
+
if (!timeZone || timeZone === "UTC") {
|
|
359
|
+
return new Date(ms).toISOString().replace("T", " ").slice(0, 19);
|
|
360
|
+
}
|
|
361
|
+
const parts = getLocalTimestampFormatter(timeZone).formatToParts(
|
|
362
|
+
new Date(ms),
|
|
363
|
+
);
|
|
364
|
+
const v: Record<string, string> = {};
|
|
365
|
+
for (const p of parts) v[p.type] = p.value;
|
|
366
|
+
return `${v.year}-${v.month}-${v.day} ${v.hour}:${v.minute}:${v.second}`;
|
|
367
|
+
}
|
|
368
|
+
|
|
329
369
|
export function resolveTurnTimezoneContext(
|
|
330
370
|
options: TemporalContextOptions = {},
|
|
331
371
|
): TurnTimezoneContext {
|
|
@@ -102,6 +102,16 @@ function resolveTone(raw?: string): Tone {
|
|
|
102
102
|
return raw && VALID_TONES.has(raw) ? (raw as Tone) : "grounded";
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
export function buildScanFirstMessage(
|
|
106
|
+
url: string,
|
|
107
|
+
variant: "website" | "content-source",
|
|
108
|
+
): string {
|
|
109
|
+
if (variant === "content-source") {
|
|
110
|
+
return `Here's a page with content I'd like you to look at: ${url}`;
|
|
111
|
+
}
|
|
112
|
+
return `Here's my website: ${url}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
105
115
|
function buildPersonalizedGreeting(ctx: OnboardingGreetingContext): string {
|
|
106
116
|
const name = ctx.userName?.trim();
|
|
107
117
|
const assistant = ctx.assistantName?.trim();
|
|
@@ -9,12 +9,7 @@ import {
|
|
|
9
9
|
GUARDIAN_ACTION_COPY_TIMEOUT_MS,
|
|
10
10
|
includesRequiredKeywords,
|
|
11
11
|
} from "../runtime/guardian-action-message-composer.js";
|
|
12
|
-
import type {
|
|
13
|
-
GuardianActionCopyGenerator,
|
|
14
|
-
GuardianFollowUpConversationGenerator,
|
|
15
|
-
GuardianFollowUpDisposition,
|
|
16
|
-
GuardianFollowUpTurnResult,
|
|
17
|
-
} from "../runtime/http-types.js";
|
|
12
|
+
import type { GuardianActionCopyGenerator } from "../runtime/http-types.js";
|
|
18
13
|
|
|
19
14
|
/**
|
|
20
15
|
* Create the daemon-owned guardian action copy generator that resolves
|
|
@@ -74,122 +69,3 @@ export function createGuardianActionCopyGenerator(): GuardianActionCopyGenerator
|
|
|
74
69
|
return cleaned;
|
|
75
70
|
};
|
|
76
71
|
}
|
|
77
|
-
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
// Guardian follow-up conversation generator
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
|
|
82
|
-
const FOLLOWUP_CONVERSATION_TIMEOUT_MS = 8_000;
|
|
83
|
-
const FOLLOWUP_CONVERSATION_MAX_TOKENS = 300;
|
|
84
|
-
|
|
85
|
-
const FOLLOWUP_CONVERSATION_SYSTEM_PROMPT =
|
|
86
|
-
"You are an assistant helping route a guardian's reply to a post-timeout follow-up message. " +
|
|
87
|
-
"A voice caller asked a question, but the call timed out before the guardian could answer. " +
|
|
88
|
-
"The guardian has now replied late, and was asked whether they want to call the caller back " +
|
|
89
|
-
"or skip it. " +
|
|
90
|
-
"Analyze the guardian's latest reply to determine their intent. " +
|
|
91
|
-
"When uncertain, default to keep_pending and ask a clarifying question. " +
|
|
92
|
-
"Always provide a natural, helpful reply along with your decision.";
|
|
93
|
-
|
|
94
|
-
const FOLLOWUP_CONVERSATION_TOOL_NAME = "followup_decision";
|
|
95
|
-
|
|
96
|
-
const FOLLOWUP_CONVERSATION_TOOL_SCHEMA = {
|
|
97
|
-
name: FOLLOWUP_CONVERSATION_TOOL_NAME,
|
|
98
|
-
description:
|
|
99
|
-
"Record the guardian's follow-up decision and a natural reply. " +
|
|
100
|
-
"Call this tool with the determined disposition and a reply to the guardian.",
|
|
101
|
-
input_schema: {
|
|
102
|
-
type: "object" as const,
|
|
103
|
-
properties: {
|
|
104
|
-
disposition: {
|
|
105
|
-
type: "string",
|
|
106
|
-
enum: ["call_back", "decline", "keep_pending"],
|
|
107
|
-
description:
|
|
108
|
-
"The guardian's intent: call_back to call the original caller, " +
|
|
109
|
-
"decline to skip the follow-up, " +
|
|
110
|
-
"keep_pending if the intent is unclear (ask for clarification).",
|
|
111
|
-
},
|
|
112
|
-
replyText: {
|
|
113
|
-
type: "string",
|
|
114
|
-
description: "A natural language reply to send back to the guardian.",
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
required: ["disposition", "replyText"],
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
const VALID_FOLLOWUP_DISPOSITIONS: ReadonlySet<string> = new Set([
|
|
122
|
-
"call_back",
|
|
123
|
-
"decline",
|
|
124
|
-
"keep_pending",
|
|
125
|
-
]);
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Create the daemon-owned guardian follow-up conversation generator.
|
|
129
|
-
* Uses tool/function calling to produce structured dispositions alongside
|
|
130
|
-
* natural reply text. Follows the same pattern as
|
|
131
|
-
* createApprovalConversationGenerator().
|
|
132
|
-
*/
|
|
133
|
-
export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpConversationGenerator {
|
|
134
|
-
return async (context) => {
|
|
135
|
-
const baseProvider = await getConfiguredProvider("guardianQuestionCopy");
|
|
136
|
-
if (!baseProvider) {
|
|
137
|
-
throw new Error("No configured provider available for follow-up conversation");
|
|
138
|
-
}
|
|
139
|
-
const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
|
|
140
|
-
|
|
141
|
-
const userPrompt = [
|
|
142
|
-
`Original question from the voice call: "${context.questionText}"`,
|
|
143
|
-
`Guardian's late answer: "${context.lateAnswerText}"`,
|
|
144
|
-
`\nGuardian's latest reply: ${context.guardianReply}`,
|
|
145
|
-
].join("\n");
|
|
146
|
-
|
|
147
|
-
const response = await provider.sendMessage(
|
|
148
|
-
[{ role: "user", content: [{ type: "text", text: userPrompt }] }],
|
|
149
|
-
[FOLLOWUP_CONVERSATION_TOOL_SCHEMA],
|
|
150
|
-
FOLLOWUP_CONVERSATION_SYSTEM_PROMPT,
|
|
151
|
-
{
|
|
152
|
-
config: {
|
|
153
|
-
max_tokens: FOLLOWUP_CONVERSATION_MAX_TOKENS,
|
|
154
|
-
callSite: "guardianQuestionCopy",
|
|
155
|
-
},
|
|
156
|
-
signal: AbortSignal.timeout(FOLLOWUP_CONVERSATION_TIMEOUT_MS),
|
|
157
|
-
},
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
// Extract the tool_use block from the response
|
|
161
|
-
const toolUseBlock = response.content.find(
|
|
162
|
-
(block) =>
|
|
163
|
-
block.type === "tool_use" &&
|
|
164
|
-
block.name === FOLLOWUP_CONVERSATION_TOOL_NAME,
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
if (!toolUseBlock || toolUseBlock.type !== "tool_use") {
|
|
168
|
-
throw new Error(
|
|
169
|
-
"Provider did not return a tool_use block for follow-up decision",
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const input = toolUseBlock.input as Record<string, unknown>;
|
|
174
|
-
|
|
175
|
-
// Strict validation of the structured output
|
|
176
|
-
const disposition = input.disposition;
|
|
177
|
-
if (
|
|
178
|
-
typeof disposition !== "string" ||
|
|
179
|
-
!VALID_FOLLOWUP_DISPOSITIONS.has(disposition)
|
|
180
|
-
) {
|
|
181
|
-
throw new Error(`Invalid disposition: ${String(disposition)}`);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const replyText = input.replyText;
|
|
185
|
-
if (typeof replyText !== "string" || replyText.trim().length === 0) {
|
|
186
|
-
throw new Error("Missing or empty replyText in tool_use response");
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const result: GuardianFollowUpTurnResult = {
|
|
190
|
-
disposition: disposition as GuardianFollowUpDisposition,
|
|
191
|
-
replyText: replyText.trim(),
|
|
192
|
-
};
|
|
193
|
-
return result;
|
|
194
|
-
};
|
|
195
|
-
}
|