@vellumai/assistant 0.4.26 → 0.4.29
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/.env.example +2 -2
- package/AGENTS.md +5 -0
- package/ARCHITECTURE.md +169 -69
- package/Dockerfile +1 -1
- package/README.md +111 -112
- package/bun.lock +0 -3
- package/docs/architecture/integrations.md +0 -1
- package/docs/architecture/memory.md +100 -63
- package/docs/error-handling.md +71 -0
- package/docs/runbook-trusted-contacts.md +10 -9
- package/docs/trusted-contact-access.md +48 -46
- package/package.json +3 -3
- package/scripts/compare-benchmarks.sh +12 -5
- package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
- package/scripts/test.sh +89 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/account-registry.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +36 -23
- package/src/__tests__/agent-loop-thinking.test.ts +29 -13
- package/src/__tests__/agent-loop.test.ts +2 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/asset-materialize-tool.test.ts +7 -7
- package/src/__tests__/asset-search-tool.test.ts +7 -7
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
- package/src/__tests__/call-controller.test.ts +99 -69
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +113 -70
- package/src/__tests__/channel-guardian.test.ts +173 -282
- package/src/__tests__/channel-readiness-service.test.ts +6 -2
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +14 -14
- package/src/__tests__/checker.test.ts +12 -31
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
- package/src/__tests__/compaction.benchmark.test.ts +6 -2
- package/src/__tests__/computer-use-tools.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +66 -7
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
- package/src/__tests__/contacts-tools.test.ts +63 -2
- package/src/__tests__/context-overflow-approval.test.ts +141 -0
- package/src/__tests__/context-overflow-policy.test.ts +171 -0
- package/src/__tests__/context-overflow-reducer.test.ts +533 -0
- package/src/__tests__/context-window-manager.test.ts +97 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
- package/src/__tests__/conversation-routes.test.ts +4 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
- package/src/__tests__/credential-security-e2e.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/credential-vault-unit.test.ts +1 -1
- package/src/__tests__/credential-vault.test.ts +11 -8
- package/src/__tests__/daemon-lifecycle.test.ts +2 -2
- package/src/__tests__/daemon-server-session-init.test.ts +6 -6
- package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
- package/src/__tests__/encrypted-store.test.ts +10 -7
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/file-edit-tool.test.ts +1 -1
- package/src/__tests__/file-read-tool.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +1 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
- package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
- package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -0
- package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
- package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +79 -1
- package/src/__tests__/guardian-grant-minting.test.ts +14 -14
- package/src/__tests__/guardian-outbound-http.test.ts +1 -2
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
- package/src/__tests__/guardian-routing-state.test.ts +36 -52
- package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
- package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
- package/src/__tests__/handlers-telegram-config.test.ts +14 -14
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +45 -2
- package/src/__tests__/host-file-edit-tool.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +1 -1
- package/src/__tests__/host-file-write-tool.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
- package/src/__tests__/ingress-reconcile.test.ts +2 -2
- package/src/__tests__/ingress-routes-http.test.ts +2 -1
- package/src/__tests__/integrations-cli.test.ts +256 -0
- package/src/__tests__/intent-routing.test.ts +4 -5
- package/src/__tests__/invite-redemption-service.test.ts +4 -3
- package/src/__tests__/ipc-snapshot.test.ts +28 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +136 -57
- package/src/__tests__/mcp-client-auth.test.ts +95 -0
- package/src/__tests__/media-generate-image.test.ts +2 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
- package/src/__tests__/memory-regressions.test.ts +6 -6
- package/src/__tests__/messaging-send-tool.test.ts +1 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
- package/src/__tests__/migration-export-http.test.ts +540 -0
- package/src/__tests__/migration-import-commit-http.test.ts +823 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
- package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
- package/src/__tests__/migration-transport.test.ts +904 -0
- package/src/__tests__/migration-validate-http.test.ts +698 -0
- package/src/__tests__/migration-wizard.test.ts +1289 -0
- package/src/__tests__/non-member-access-request.test.ts +17 -17
- package/src/__tests__/notification-decision-strategy.test.ts +110 -2
- package/src/__tests__/notification-deep-link.test.ts +18 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
- package/src/__tests__/proxy-approval-callback.test.ts +1 -1
- package/src/__tests__/qdrant-manager.test.ts +40 -11
- package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/recording-intent-handler.test.ts +3 -3
- package/src/__tests__/recording-state-machine.test.ts +2 -2
- package/src/__tests__/relay-server.test.ts +506 -227
- package/src/__tests__/reminder-store.test.ts +8 -0
- package/src/__tests__/reminder.test.ts +8 -0
- package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
- package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
- package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
- package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
- package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
- package/src/__tests__/script-proxy-policy.test.ts +2 -2
- package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
- package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
- package/src/__tests__/secret-onetime-send.test.ts +4 -4
- package/src/__tests__/secret-scanner-executor.test.ts +2 -2
- package/src/__tests__/send-endpoint-busy.test.ts +11 -9
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +17 -2
- package/src/__tests__/session-agent-loop.test.ts +456 -35
- package/src/__tests__/session-confirmation-signals.test.ts +3 -2
- package/src/__tests__/session-conflict-gate.test.ts +20 -3
- package/src/__tests__/session-init.benchmark.test.ts +2 -2
- package/src/__tests__/session-load-history-repair.test.ts +7 -7
- package/src/__tests__/session-pre-run-repair.test.ts +17 -2
- package/src/__tests__/session-profile-injection.test.ts +20 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
- package/src/__tests__/session-queue.test.ts +33 -18
- package/src/__tests__/session-runtime-assembly.test.ts +147 -1
- package/src/__tests__/session-runtime-workspace.test.ts +40 -0
- package/src/__tests__/session-slash-known.test.ts +21 -3
- package/src/__tests__/session-slash-queue.test.ts +17 -2
- package/src/__tests__/session-slash-unknown.test.ts +17 -2
- package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
- package/src/__tests__/session-workspace-injection.test.ts +17 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
- package/src/__tests__/shell-credential-ref.test.ts +1 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-script-runner-host.test.ts +1 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
- package/src/__tests__/skill-script-runner.test.ts +1 -1
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +3 -2
- package/src/__tests__/subagent-tools.test.ts +3 -3
- package/src/__tests__/swarm-recursion.test.ts +1 -1
- package/src/__tests__/swarm-session-integration.test.ts +1 -1
- package/src/__tests__/swarm-tool.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-tools.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
- package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +23 -182
- package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
- package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
- package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
- package/src/__tests__/trust-context-guards.test.ts +25 -29
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
- package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
- package/src/__tests__/trusted-contact-verification.test.ts +63 -77
- package/src/__tests__/turn-commit.test.ts +18 -18
- package/src/__tests__/twilio-provider.test.ts +7 -7
- package/src/__tests__/validation-results-screen.test.ts +1107 -0
- package/src/__tests__/view-image-tool.test.ts +1 -1
- package/src/__tests__/voice-invite-redemption.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
- package/src/__tests__/voice-session-bridge.test.ts +24 -24
- package/src/agent/attachments.ts +3 -1
- package/src/agent/loop.ts +13 -13
- package/src/agent/message-types.ts +13 -7
- package/src/amazon/cart.ts +59 -32
- package/src/amazon/checkout.ts +25 -14
- package/src/amazon/client.ts +68 -48
- package/src/amazon/product-details.ts +3 -3
- package/src/amazon/request-extractor.ts +46 -31
- package/src/amazon/search.ts +6 -4
- package/src/amazon/session.ts +33 -24
- package/src/approvals/AGENTS.md +26 -0
- package/src/approvals/approval-primitive.ts +87 -64
- package/src/approvals/guardian-decision-primitive.ts +172 -81
- package/src/approvals/guardian-request-resolvers.ts +262 -155
- package/src/autonomy/autonomy-resolver.ts +7 -5
- package/src/autonomy/autonomy-store.ts +34 -19
- package/src/autonomy/disposition-mapper.ts +5 -5
- package/src/autonomy/index.ts +6 -6
- package/src/autonomy/types.ts +7 -3
- package/src/browser-extension-relay/client.ts +50 -19
- package/src/browser-extension-relay/protocol.ts +11 -11
- package/src/browser-extension-relay/server.ts +45 -20
- package/src/bundler/app-bundler.ts +75 -50
- package/src/bundler/bundle-scanner.ts +145 -41
- package/src/bundler/bundle-signer.ts +16 -14
- package/src/bundler/signature-verifier.ts +36 -33
- package/src/calls/call-constants.ts +10 -3
- package/src/calls/call-controller.ts +473 -214
- package/src/calls/call-conversation-messages.ts +25 -15
- package/src/calls/call-domain.ts +401 -148
- package/src/calls/call-pointer-message-composer.ts +26 -21
- package/src/calls/call-pointer-messages.ts +52 -28
- package/src/calls/call-recovery.ts +53 -37
- package/src/calls/call-state-machine.ts +37 -7
- package/src/calls/call-state.ts +35 -13
- package/src/calls/call-store.ts +165 -77
- package/src/calls/elevenlabs-client.ts +39 -20
- package/src/calls/guardian-action-sweep.ts +42 -24
- package/src/calls/guardian-dispatch.ts +79 -56
- package/src/calls/guardian-question-copy.ts +28 -23
- package/src/calls/relay-server.ts +1121 -532
- package/src/calls/speaker-identification.ts +21 -15
- package/src/calls/twilio-config.ts +34 -17
- package/src/calls/twilio-provider.ts +108 -55
- package/src/calls/twilio-rest.ts +212 -100
- package/src/calls/twilio-routes.ts +165 -92
- package/src/calls/types.ts +55 -7
- package/src/calls/voice-quality.ts +6 -4
- package/src/calls/voice-session-bridge.ts +181 -133
- package/src/channels/config.ts +17 -13
- package/src/channels/types.ts +38 -10
- package/src/cli/amazon.ts +333 -227
- package/src/cli/config-commands.ts +236 -146
- package/src/cli/core-commands.ts +403 -329
- package/src/cli/email-guardrails.ts +38 -19
- package/src/cli/email.ts +207 -153
- package/src/cli/influencer.ts +58 -56
- package/src/cli/integrations.ts +362 -0
- package/src/cli/ipc-client.ts +24 -19
- package/src/cli/map.ts +176 -129
- package/src/cli/mcp.ts +260 -152
- package/src/cli/sequence.ts +165 -107
- package/src/cli/twitter.ts +302 -218
- package/src/cli.ts +418 -279
- package/src/commands/cc-command-registry.ts +52 -27
- package/src/config/agent-schema.ts +217 -134
- package/src/config/assistant-feature-flags.ts +23 -18
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
- package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
- package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
- package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
- package/src/config/bundled-skills/contacts/SKILL.md +446 -15
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
- package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
- package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
- package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
- package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
- package/src/config/bundled-skills/google-calendar/types.ts +3 -3
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
- package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
- package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
- package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
- package/src/config/bundled-skills/messaging/SKILL.md +7 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
- package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
- package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
- package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
- package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
- package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
- package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
- package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
- package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
- package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
- package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
- package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
- package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
- package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
- package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
- package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
- package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
- package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
- package/src/config/bundled-skills/slack/TOOLS.json +33 -15
- package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
- package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
- package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
- package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
- package/src/config/bundled-skills/twitter/SKILL.md +19 -2
- package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
- package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
- package/src/config/calls-schema.ts +108 -63
- package/src/config/computer-use-prompt.ts +7 -7
- package/src/config/core-schema.ts +239 -155
- package/src/config/defaults.ts +2 -2
- package/src/config/elevenlabs-schema.ts +15 -15
- package/src/config/env-registry.ts +33 -33
- package/src/config/feature-flag-registry.json +31 -7
- package/src/config/loader.ts +118 -58
- package/src/config/mcp-schema.ts +29 -15
- package/src/config/memory-schema.ts +434 -229
- package/src/config/notifications-schema.ts +4 -4
- package/src/config/sandbox-schema.ts +2 -2
- package/src/config/schema.ts +12 -2
- package/src/config/skill-state.ts +27 -15
- package/src/config/skills-schema.ts +72 -23
- package/src/config/skills.ts +303 -143
- package/src/config/system-prompt.ts +25 -6
- package/src/config/types.ts +1 -1
- package/src/config/update-bulletin-format.ts +3 -3
- package/src/config/update-bulletin-state.ts +15 -6
- package/src/config/update-bulletin-template-path.ts +8 -4
- package/src/config/update-bulletin.ts +33 -14
- package/src/config/user-reference.ts +8 -8
- package/src/contacts/contact-events.ts +21 -0
- package/src/contacts/contact-store.ts +622 -100
- package/src/contacts/contacts-write.ts +287 -0
- package/src/contacts/index.ts +13 -4
- package/src/contacts/startup-migration.ts +21 -0
- package/src/contacts/types.ts +47 -2
- package/src/context/token-estimator.ts +54 -31
- package/src/context/tool-result-truncation.ts +41 -7
- package/src/context/window-manager.ts +225 -120
- package/src/daemon/approval-generators.ts +83 -55
- package/src/daemon/approved-devices-store.ts +33 -20
- package/src/daemon/assistant-attachments.ts +134 -98
- package/src/daemon/auth-manager.ts +17 -15
- package/src/daemon/classifier.ts +117 -46
- package/src/daemon/computer-use-session.ts +316 -187
- package/src/daemon/config-watcher.ts +91 -44
- package/src/daemon/connection-policy.ts +18 -10
- package/src/daemon/context-overflow-approval.ts +48 -0
- package/src/daemon/context-overflow-policy.ts +50 -0
- package/src/daemon/context-overflow-reducer.ts +300 -0
- package/src/daemon/daemon-control.ts +79 -51
- package/src/daemon/date-context.ts +119 -69
- package/src/daemon/dictation-profile-store.ts +94 -48
- package/src/daemon/dictation-text-processing.ts +33 -12
- package/src/daemon/doordash-steps.ts +92 -49
- package/src/daemon/guardian-action-generators.ts +62 -46
- package/src/daemon/guardian-verification-intent.ts +31 -18
- package/src/daemon/handlers/apps.ts +257 -111
- package/src/daemon/handlers/avatar.ts +20 -15
- package/src/daemon/handlers/computer-use.ts +82 -39
- package/src/daemon/handlers/config-channels.ts +146 -69
- package/src/daemon/handlers/config-heartbeat.ts +114 -59
- package/src/daemon/handlers/config-inbox.ts +277 -106
- package/src/daemon/handlers/config-ingress.ts +127 -55
- package/src/daemon/handlers/config-integrations.ts +145 -88
- package/src/daemon/handlers/config-model.ts +58 -22
- package/src/daemon/handlers/config-platform.ts +40 -16
- package/src/daemon/handlers/config-scheduling.ts +109 -48
- package/src/daemon/handlers/config-slack-channel.ts +67 -35
- package/src/daemon/handlers/config-slack.ts +21 -20
- package/src/daemon/handlers/config-telegram.ts +100 -70
- package/src/daemon/handlers/config-tools.ts +103 -55
- package/src/daemon/handlers/config-trust.ts +50 -20
- package/src/daemon/handlers/config.ts +72 -24
- package/src/daemon/handlers/contacts.ts +163 -0
- package/src/daemon/handlers/diagnostics.ts +90 -48
- package/src/daemon/handlers/documents.ts +74 -46
- package/src/daemon/handlers/guardian-actions.ts +118 -71
- package/src/daemon/handlers/home-base.ts +19 -16
- package/src/daemon/handlers/identity.ts +65 -45
- package/src/daemon/handlers/index.ts +78 -54
- package/src/daemon/handlers/misc.ts +664 -234
- package/src/daemon/handlers/navigate-settings.ts +14 -11
- package/src/daemon/handlers/oauth-connect.ts +48 -35
- package/src/daemon/handlers/open-bundle-handler.ts +31 -24
- package/src/daemon/handlers/pairing.ts +51 -25
- package/src/daemon/handlers/publish.ts +55 -33
- package/src/daemon/handlers/recording.ts +378 -162
- package/src/daemon/handlers/sessions.ts +923 -423
- package/src/daemon/handlers/shared.ts +202 -117
- package/src/daemon/handlers/signing.ts +25 -6
- package/src/daemon/handlers/subagents.ts +117 -56
- package/src/daemon/handlers/twitter-auth.ts +70 -49
- package/src/daemon/handlers/work-items.ts +264 -112
- package/src/daemon/handlers/workspace-files.ts +27 -20
- package/src/daemon/handlers.ts +2 -2
- package/src/daemon/history-repair.ts +16 -15
- package/src/daemon/identity-helpers.ts +4 -4
- package/src/daemon/install-cli-launchers.ts +33 -22
- package/src/daemon/ipc-blob-store.ts +38 -24
- package/src/daemon/ipc-contract/apps.ts +61 -49
- package/src/daemon/ipc-contract/computer-use.ts +47 -37
- package/src/daemon/ipc-contract/contacts.ts +69 -0
- package/src/daemon/ipc-contract/diagnostics.ts +14 -14
- package/src/daemon/ipc-contract/documents.ts +8 -8
- package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
- package/src/daemon/ipc-contract/inbox.ts +16 -16
- package/src/daemon/ipc-contract/integrations.ts +57 -44
- package/src/daemon/ipc-contract/memory.ts +3 -5
- package/src/daemon/ipc-contract/messages.ts +95 -69
- package/src/daemon/ipc-contract/notifications.ts +10 -6
- package/src/daemon/ipc-contract/pairing.ts +8 -8
- package/src/daemon/ipc-contract/schedules.ts +20 -20
- package/src/daemon/ipc-contract/sessions.ts +88 -57
- package/src/daemon/ipc-contract/settings.ts +12 -7
- package/src/daemon/ipc-contract/shared.ts +9 -7
- package/src/daemon/ipc-contract/skills.ts +46 -26
- package/src/daemon/ipc-contract/subagents.ts +9 -9
- package/src/daemon/ipc-contract/trust.ts +11 -11
- package/src/daemon/ipc-contract/work-items.ts +33 -28
- package/src/daemon/ipc-contract/workspace.ts +28 -21
- package/src/daemon/ipc-contract-inventory.json +8 -0
- package/src/daemon/ipc-contract-inventory.ts +29 -26
- package/src/daemon/ipc-contract.ts +111 -44
- package/src/daemon/ipc-handler.ts +27 -19
- package/src/daemon/ipc-protocol.ts +22 -12
- package/src/daemon/ipc-validate.ts +91 -46
- package/src/daemon/lifecycle.ts +25 -1
- package/src/daemon/main.ts +10 -8
- package/src/daemon/media-visibility-policy.ts +3 -1
- package/src/daemon/pairing-store.ts +72 -40
- package/src/daemon/providers-setup.ts +35 -25
- package/src/daemon/recording-executor.ts +37 -30
- package/src/daemon/recording-intent-fallback.ts +58 -28
- package/src/daemon/recording-intent.ts +71 -61
- package/src/daemon/ride-shotgun-handler.ts +201 -121
- package/src/daemon/seed-files.ts +28 -17
- package/src/daemon/server.ts +23 -14
- package/src/daemon/session-agent-loop-handlers.ts +261 -135
- package/src/daemon/session-agent-loop.ts +795 -253
- package/src/daemon/session-attachments.ts +104 -39
- package/src/daemon/session-conflict-gate.ts +72 -28
- package/src/daemon/session-dynamic-profile.ts +36 -22
- package/src/daemon/session-error.ts +50 -45
- package/src/daemon/session-evictor.ts +17 -10
- package/src/daemon/session-history.ts +201 -89
- package/src/daemon/session-lifecycle.ts +79 -42
- package/src/daemon/session-media-retry.ts +89 -41
- package/src/daemon/session-memory.ts +77 -55
- package/src/daemon/session-messaging.ts +261 -111
- package/src/daemon/session-notifiers.ts +57 -45
- package/src/daemon/session-process.ts +370 -154
- package/src/daemon/session-queue-manager.ts +30 -13
- package/src/daemon/session-runtime-assembly.ts +61 -15
- package/src/daemon/session-skill-tools.ts +84 -36
- package/src/daemon/session-slash.ts +178 -113
- package/src/daemon/session-surfaces.ts +498 -211
- package/src/daemon/session-tool-setup.ts +22 -17
- package/src/daemon/session-usage.ts +26 -13
- package/src/daemon/session-workspace.ts +7 -4
- package/src/daemon/session.ts +18 -19
- package/src/daemon/shutdown-handlers.ts +36 -33
- package/src/daemon/tls-certs.ts +90 -57
- package/src/daemon/tool-side-effects.ts +97 -65
- package/src/daemon/trace-emitter.ts +8 -7
- package/src/daemon/video-thumbnail.ts +55 -25
- package/src/daemon/watch-handler.ts +164 -86
- package/src/email/provider.ts +1 -1
- package/src/email/providers/agentmail.ts +87 -45
- package/src/email/providers/index.ts +19 -14
- package/src/email/service.ts +52 -24
- package/src/email/types.ts +2 -2
- package/src/errors.ts +1 -1
- package/src/events/bus.ts +30 -10
- package/src/events/domain-events.ts +19 -13
- package/src/events/index.ts +6 -6
- package/src/events/tool-audit-listener.ts +34 -20
- package/src/events/tool-domain-event-publisher.ts +22 -20
- package/src/events/tool-metrics-listener.ts +26 -21
- package/src/events/tool-notification-listener.ts +5 -5
- package/src/events/tool-profiling-listener.ts +33 -23
- package/src/events/tool-trace-listener.ts +70 -46
- package/src/export/formatter.ts +38 -32
- package/src/followups/followup-store.ts +43 -36
- package/src/followups/index.ts +2 -2
- package/src/followups/types.ts +1 -1
- package/src/gallery/default-gallery.ts +37 -34
- package/src/gallery/gallery-manifest.ts +9 -9
- package/src/heartbeat/heartbeat-service.ts +59 -37
- package/src/home-base/app-link-store.ts +14 -12
- package/src/home-base/bootstrap.ts +14 -8
- package/src/home-base/prebuilt/seed.ts +35 -26
- package/src/home-base/prebuilt-home-base-updater.ts +14 -8
- package/src/hooks/cli.ts +56 -43
- package/src/hooks/config.ts +27 -14
- package/src/hooks/discovery.ts +53 -33
- package/src/hooks/manager.ts +50 -26
- package/src/hooks/runner.ts +35 -29
- package/src/hooks/templates.ts +38 -15
- package/src/hooks/types.ts +13 -13
- package/src/inbound/platform-callback-registration.ts +21 -15
- package/src/inbound/public-ingress-urls.ts +9 -6
- package/src/index.ts +20 -19
- package/src/influencer/client.ts +269 -108
- package/src/instrument.ts +3 -1
- package/src/logfire.ts +64 -39
- package/src/mcp/client.ts +107 -55
- package/src/mcp/manager.ts +45 -18
- package/src/mcp/mcp-oauth-provider.ts +114 -62
- package/src/media/gemini-image-service.ts +28 -21
- package/src/memory/account-store.ts +16 -9
- package/src/memory/admin.ts +87 -57
- package/src/memory/app-git-service.ts +77 -47
- package/src/memory/app-store.ts +151 -77
- package/src/memory/attachments-store.ts +123 -53
- package/src/memory/canonical-guardian-store.ts +190 -48
- package/src/memory/channel-delivery-store.ts +5 -5
- package/src/memory/channel-guardian-store.ts +31 -16
- package/src/memory/checkpoints.ts +14 -7
- package/src/memory/clarification-resolver.ts +219 -104
- package/src/memory/conflict-intent.ts +74 -23
- package/src/memory/conflict-policy.ts +20 -7
- package/src/memory/conflict-store.ts +144 -94
- package/src/memory/contradiction-checker.ts +257 -132
- package/src/memory/conversation-attention-store.ts +72 -32
- package/src/memory/conversation-bootstrap.ts +28 -0
- package/src/memory/conversation-crud.ts +12 -5
- package/src/memory/conversation-display-order-migration.ts +7 -7
- package/src/memory/conversation-key-store.ts +18 -13
- package/src/memory/conversation-queries.ts +130 -52
- package/src/memory/conversation-store.ts +43 -26
- package/src/memory/conversation-title-service.ts +89 -66
- package/src/memory/db-init.ts +90 -2
- package/src/memory/db.ts +10 -3
- package/src/memory/delivery-channels.ts +12 -6
- package/src/memory/delivery-crud.ts +26 -12
- package/src/memory/delivery-status.ts +19 -16
- package/src/memory/embedding-backend.ts +205 -77
- package/src/memory/embedding-gemini.ts +23 -10
- package/src/memory/embedding-local.ts +89 -44
- package/src/memory/embedding-ollama.ts +25 -13
- package/src/memory/embedding-openai.ts +20 -11
- package/src/memory/embedding-runtime-manager.ts +163 -90
- package/src/memory/entity-extractor.ts +185 -123
- package/src/memory/external-conversation-store.ts +30 -12
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/fts-reconciler.ts +57 -28
- package/src/memory/guardian-action-store.ts +162 -100
- package/src/memory/guardian-approvals.ts +63 -129
- package/src/memory/guardian-rate-limits.ts +20 -9
- package/src/memory/guardian-verification.ts +82 -35
- package/src/memory/indexer.ts +96 -55
- package/src/memory/ingress-invite-store.ts +28 -169
- package/src/memory/items-extractor.ts +313 -157
- package/src/memory/job-handlers/backfill.ts +116 -63
- package/src/memory/job-handlers/cleanup.ts +64 -41
- package/src/memory/job-handlers/conflict.ts +90 -49
- package/src/memory/job-handlers/embedding.ts +32 -17
- package/src/memory/job-handlers/extraction.ts +58 -33
- package/src/memory/job-handlers/index-maintenance.ts +31 -17
- package/src/memory/job-handlers/media-processing.ts +65 -24
- package/src/memory/job-handlers/summarization.ts +186 -128
- package/src/memory/job-utils.ts +100 -57
- package/src/memory/jobs-store.ts +235 -142
- package/src/memory/jobs-worker.ts +167 -83
- package/src/memory/llm-request-log-store.ts +13 -11
- package/src/memory/llm-usage-store.ts +35 -26
- package/src/memory/media-store.ts +151 -44
- package/src/memory/message-content.ts +28 -18
- package/src/memory/migrations/001-job-deferrals.ts +11 -5
- package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
- package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
- package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
- package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
- package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
- package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
- package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
- package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
- package/src/memory/migrations/022-add-origin-interface.ts +4 -2
- package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
- package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
- package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
- package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
- package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
- package/src/memory/migrations/028-call-session-mode.ts +13 -3
- package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
- package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
- package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
- package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
- package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
- package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
- package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
- package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
- package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
- package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
- package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
- package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
- package/src/memory/migrations/038-actor-token-records.ts +5 -9
- package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
- package/src/memory/migrations/100-core-tables.ts +1 -1
- package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
- package/src/memory/migrations/103-complex-migrations.ts +9 -9
- package/src/memory/migrations/104-core-indexes.ts +188 -64
- package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
- package/src/memory/migrations/106-call-sessions.ts +58 -16
- package/src/memory/migrations/107-followups.ts +16 -6
- package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
- package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
- package/src/memory/migrations/110-channel-guardian.ts +48 -10
- package/src/memory/migrations/111-media-assets.ts +52 -18
- package/src/memory/migrations/112-assistant-inbox.ts +32 -12
- package/src/memory/migrations/113-late-migrations.ts +12 -12
- package/src/memory/migrations/114-notifications.ts +28 -12
- package/src/memory/migrations/115-sequences.ts +10 -4
- package/src/memory/migrations/116-messages-fts.ts +1 -1
- package/src/memory/migrations/117-conversation-attention.ts +16 -6
- package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
- package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
- package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
- package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
- package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
- package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
- package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
- package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
- package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
- package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
- package/src/memory/migrations/index.ts +82 -73
- package/src/memory/migrations/registry.ts +53 -37
- package/src/memory/migrations/validate-migration-state.ts +73 -46
- package/src/memory/profile-compiler.ts +58 -24
- package/src/memory/published-pages-store.ts +12 -16
- package/src/memory/qdrant-circuit-breaker.ts +28 -20
- package/src/memory/qdrant-client.ts +99 -63
- package/src/memory/qdrant-manager.ts +89 -57
- package/src/memory/query-builder.ts +9 -7
- package/src/memory/raw-query.ts +63 -14
- package/src/memory/recall-cache.ts +15 -8
- package/src/memory/retrieval-budget.ts +0 -1
- package/src/memory/retriever.ts +385 -192
- package/src/memory/schema-migration.ts +1 -1
- package/src/memory/schema.ts +44 -56
- package/src/memory/scoped-approval-grants.ts +99 -45
- package/src/memory/search/entity.ts +102 -40
- package/src/memory/search/formatting.ts +70 -52
- package/src/memory/search/lexical.ts +82 -43
- package/src/memory/search/ranking.ts +103 -39
- package/src/memory/search/semantic.ts +59 -35
- package/src/memory/search/types.ts +8 -8
- package/src/memory/segmenter.ts +20 -12
- package/src/memory/shared-app-links-store.ts +21 -16
- package/src/memory/task-memory-cleanup.ts +18 -8
- package/src/memory/tool-usage-store.ts +27 -19
- package/src/memory/validation.ts +4 -2
- package/src/messaging/activity-analyzer.ts +7 -7
- package/src/messaging/draft-store.ts +13 -10
- package/src/messaging/email-classifier.ts +73 -37
- package/src/messaging/index.ts +3 -3
- package/src/messaging/outreach-classifier.ts +76 -38
- package/src/messaging/provider-types.ts +2 -4
- package/src/messaging/provider.ts +37 -8
- package/src/messaging/providers/gmail/adapter.ts +183 -66
- package/src/messaging/providers/gmail/client.ts +3 -1
- package/src/messaging/providers/gmail/mime-builder.ts +21 -19
- package/src/messaging/providers/gmail/people-client.ts +22 -9
- package/src/messaging/providers/gmail/types.ts +6 -6
- package/src/messaging/providers/slack/adapter.ts +93 -43
- package/src/messaging/providers/slack/client.ts +100 -41
- package/src/messaging/providers/slack/types.ts +6 -0
- package/src/messaging/providers/sms/adapter.ts +76 -40
- package/src/messaging/providers/sms/client.ts +4 -4
- package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
- package/src/messaging/providers/telegram-bot/client.ts +7 -7
- package/src/messaging/providers/whatsapp/adapter.ts +58 -31
- package/src/messaging/providers/whatsapp/client.ts +4 -4
- package/src/messaging/registry.ts +9 -5
- package/src/messaging/style-analyzer.ts +69 -39
- package/src/messaging/thread-summarizer.ts +101 -53
- package/src/messaging/triage-engine.ts +111 -82
- package/src/messaging/types.ts +10 -10
- package/src/migrations/config-merge.ts +18 -10
- package/src/migrations/data-layout.ts +35 -22
- package/src/migrations/data-merge.ts +17 -7
- package/src/migrations/hooks-merge.ts +43 -16
- package/src/migrations/index.ts +6 -6
- package/src/migrations/log.ts +9 -5
- package/src/migrations/skills-merge.ts +17 -7
- package/src/migrations/workspace-layout.ts +39 -25
- package/src/notifications/AGENTS.md +5 -0
- package/src/notifications/adapters/macos.ts +21 -14
- package/src/notifications/adapters/sms.ts +28 -15
- package/src/notifications/adapters/telegram.ts +24 -15
- package/src/notifications/broadcaster.ts +108 -52
- package/src/notifications/conversation-pairing.ts +64 -29
- package/src/notifications/copy-composer.ts +165 -95
- package/src/notifications/decision-engine.ts +353 -147
- package/src/notifications/decisions-store.ts +26 -10
- package/src/notifications/deliveries-store.ts +23 -13
- package/src/notifications/destination-resolver.ts +42 -24
- package/src/notifications/deterministic-checks.ts +78 -27
- package/src/notifications/emit-signal.ts +83 -45
- package/src/notifications/events-store.ts +13 -7
- package/src/notifications/guardian-question-mode.ts +125 -75
- package/src/notifications/preference-extractor.ts +85 -53
- package/src/notifications/preference-summary.ts +31 -18
- package/src/notifications/preferences-store.ts +29 -18
- package/src/notifications/runtime-dispatch.ts +22 -12
- package/src/notifications/signal.ts +4 -4
- package/src/notifications/thread-candidates.ts +59 -23
- package/src/notifications/thread-seed-composer.ts +45 -27
- package/src/notifications/types.ts +19 -10
- package/src/oauth/connect-orchestrator.ts +105 -54
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/provider-profiles.ts +80 -59
- package/src/oauth/scope-policy.ts +5 -2
- package/src/oauth/token-persistence.ts +58 -24
- package/src/outbound-proxy/certs.ts +284 -0
- package/src/outbound-proxy/config.ts +94 -0
- package/src/outbound-proxy/connect-tunnel.ts +84 -0
- package/src/outbound-proxy/health.ts +62 -0
- package/src/outbound-proxy/host-pattern-match.ts +67 -0
- package/src/outbound-proxy/http-forwarder.ts +162 -0
- package/src/outbound-proxy/index.ts +80 -0
- package/src/outbound-proxy/logging.ts +193 -0
- package/src/outbound-proxy/mitm-handler.ts +292 -0
- package/src/outbound-proxy/policy.ts +172 -0
- package/src/outbound-proxy/router.ts +64 -0
- package/src/outbound-proxy/server.ts +145 -0
- package/src/outbound-proxy/types.ts +150 -0
- package/src/permissions/checker.ts +481 -189
- package/src/permissions/defaults.ts +135 -108
- package/src/permissions/prompter.ts +53 -27
- package/src/permissions/secret-prompter.ts +21 -15
- package/src/permissions/shell-identity.ts +47 -16
- package/src/permissions/trust-store.ts +185 -73
- package/src/permissions/types.ts +22 -12
- package/src/permissions/workspace-policy.ts +47 -38
- package/src/playbooks/index.ts +10 -2
- package/src/playbooks/playbook-compiler.ts +30 -24
- package/src/playbooks/types.ts +11 -8
- package/src/providers/anthropic/client.ts +325 -168
- package/src/providers/failover.ts +57 -22
- package/src/providers/fireworks/client.ts +9 -5
- package/src/providers/gemini/client.ts +61 -39
- package/src/providers/model-intents.ts +40 -33
- package/src/providers/ollama/client.ts +7 -7
- package/src/providers/openai/client.ts +106 -68
- package/src/providers/openrouter/client.ts +9 -5
- package/src/providers/provider-send-message.ts +59 -27
- package/src/providers/ratelimit.ts +25 -8
- package/src/providers/registry.ts +86 -38
- package/src/providers/retry.ts +84 -36
- package/src/providers/stream-timeout.ts +5 -3
- package/src/providers/types.ts +7 -6
- package/src/runtime/AGENTS.md +42 -0
- package/src/runtime/access-request-helper.ts +118 -68
- package/src/runtime/actor-refresh-token-store.ts +21 -16
- package/src/runtime/actor-token-store.ts +25 -18
- package/src/runtime/actor-trust-resolver.ts +183 -80
- package/src/runtime/approval-conversation-turn.ts +39 -26
- package/src/runtime/approval-message-composer.ts +116 -84
- package/src/runtime/assistant-event-hub.ts +25 -6
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
- package/src/runtime/auth/context.ts +8 -7
- package/src/runtime/auth/credential-service.ts +60 -38
- package/src/runtime/auth/external-assistant-id.ts +16 -8
- package/src/runtime/auth/index.ts +23 -16
- package/src/runtime/auth/route-policy.ts +170 -104
- package/src/runtime/auth/scopes.ts +22 -29
- package/src/runtime/auth/subject.ts +19 -13
- package/src/runtime/auth/token-service.ts +3 -3
- package/src/runtime/auth/types.ts +23 -23
- package/src/runtime/channel-approval-parser.ts +37 -14
- package/src/runtime/channel-approval-types.ts +12 -4
- package/src/runtime/channel-approvals.ts +41 -23
- package/src/runtime/channel-guardian-service.ts +144 -103
- package/src/runtime/channel-invite-transport.ts +4 -2
- package/src/runtime/channel-invite-transports/telegram.ts +16 -10
- package/src/runtime/channel-invite-transports/voice.ts +7 -7
- package/src/runtime/channel-readiness-service.ts +139 -90
- package/src/runtime/channel-readiness-types.ts +4 -2
- package/src/runtime/channel-reply-delivery.ts +21 -11
- package/src/runtime/channel-retry-sweep.ts +111 -62
- package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
- package/src/runtime/gateway-client.ts +86 -53
- package/src/runtime/guardian-action-conversation-turn.ts +34 -18
- package/src/runtime/guardian-action-followup-executor.ts +115 -45
- package/src/runtime/guardian-action-grant-minter.ts +40 -24
- package/src/runtime/guardian-action-message-composer.ts +105 -84
- package/src/runtime/guardian-decision-types.ts +28 -13
- package/src/runtime/guardian-outbound-actions.ts +9 -0
- package/src/runtime/guardian-reply-router.ts +274 -145
- package/src/runtime/guardian-vellum-migration.ts +38 -24
- package/src/runtime/guardian-verification-templates.ts +8 -11
- package/src/runtime/http-router.ts +175 -0
- package/src/runtime/http-server.ts +931 -669
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/ingress-service.ts +182 -89
- package/src/runtime/invite-redemption-service.ts +211 -134
- package/src/runtime/invite-redemption-templates.ts +18 -11
- package/src/runtime/local-actor-identity.ts +73 -55
- package/src/runtime/middleware/auth.ts +25 -14
- package/src/runtime/middleware/error-handler.ts +15 -11
- package/src/runtime/middleware/rate-limiter.ts +23 -17
- package/src/runtime/middleware/request-logger.ts +4 -4
- package/src/runtime/middleware/twilio-validation.ts +29 -20
- package/src/runtime/migrations/migration-transport.ts +575 -0
- package/src/runtime/migrations/migration-wizard.ts +715 -0
- package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
- package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
- package/src/runtime/migrations/validation-results-screen.ts +467 -0
- package/src/runtime/migrations/vbundle-builder.ts +295 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
- package/src/runtime/migrations/vbundle-importer.ts +339 -0
- package/src/runtime/migrations/vbundle-validator.ts +356 -0
- package/src/runtime/pending-interactions.ts +16 -7
- package/src/runtime/routes/access-request-decision.ts +73 -52
- package/src/runtime/routes/app-routes.ts +56 -38
- package/src/runtime/routes/approval-routes.ts +165 -74
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
- package/src/runtime/routes/attachment-routes.ts +59 -48
- package/src/runtime/routes/brain-graph-routes.ts +85 -69
- package/src/runtime/routes/call-routes.ts +79 -38
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
- package/src/runtime/routes/channel-delivery-routes.ts +19 -14
- package/src/runtime/routes/channel-guardian-routes.ts +3 -3
- package/src/runtime/routes/channel-inbound-routes.ts +2 -2
- package/src/runtime/routes/channel-readiness-routes.ts +12 -6
- package/src/runtime/routes/channel-route-shared.ts +33 -25
- package/src/runtime/routes/channel-routes.ts +4 -6
- package/src/runtime/routes/contact-routes.ts +205 -16
- package/src/runtime/routes/conversation-attention-routes.ts +57 -28
- package/src/runtime/routes/conversation-routes.ts +321 -174
- package/src/runtime/routes/debug-routes.ts +14 -10
- package/src/runtime/routes/events-routes.ts +90 -57
- package/src/runtime/routes/global-search-routes.ts +266 -0
- package/src/runtime/routes/guardian-action-routes.ts +147 -56
- package/src/runtime/routes/guardian-approval-interception.ts +255 -880
- package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
- package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
- package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
- package/src/runtime/routes/identity-routes.ts +71 -42
- package/src/runtime/routes/inbound-conversation.ts +17 -11
- package/src/runtime/routes/inbound-message-handler.ts +278 -1460
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
- package/src/runtime/routes/ingress-routes.ts +34 -23
- package/src/runtime/routes/integration-routes.ts +60 -21
- package/src/runtime/routes/migration-routes.ts +434 -0
- package/src/runtime/routes/pairing-routes.ts +157 -79
- package/src/runtime/routes/secret-routes.ts +6 -2
- package/src/runtime/routes/twilio-routes.ts +443 -249
- package/src/runtime/tool-grant-request-helper.ts +36 -27
- package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
- package/src/schedule/integration-status.ts +44 -9
- package/src/schedule/recurrence-engine.ts +47 -24
- package/src/schedule/recurrence-types.ts +12 -7
- package/src/schedule/schedule-store.ts +166 -83
- package/src/schedule/scheduler.ts +26 -22
- package/src/security/encrypted-store.ts +68 -38
- package/src/security/keychain.ts +183 -120
- package/src/security/oauth-callback-registry.ts +3 -3
- package/src/security/oauth2.ts +226 -138
- package/src/security/redaction.ts +24 -24
- package/src/security/secret-allowlist.ts +46 -21
- package/src/security/secret-ingress.ts +15 -7
- package/src/security/secret-scanner.ts +193 -104
- package/src/security/secure-keys.ts +9 -3
- package/src/security/token-manager.ts +99 -40
- package/src/security/tool-approval-digest.ts +3 -3
- package/src/sequence/analytics.ts +52 -27
- package/src/sequence/engine.ts +135 -72
- package/src/sequence/guardrails.ts +32 -20
- package/src/sequence/importer.ts +75 -37
- package/src/sequence/reply-matcher.ts +36 -18
- package/src/sequence/store.ts +137 -75
- package/src/sequence/types.ts +30 -16
- package/src/services/published-app-updater.ts +26 -16
- package/src/services/vercel-deploy.ts +19 -15
- package/src/skills/active-skill-tools.ts +3 -3
- package/src/skills/clawhub.ts +178 -90
- package/src/skills/include-graph.ts +24 -17
- package/src/skills/managed-store.ts +89 -42
- package/src/skills/path-classifier.ts +10 -10
- package/src/skills/remote-skill-policy.ts +31 -22
- package/src/skills/slash-commands.ts +36 -30
- package/src/skills/tool-manifest.ts +60 -31
- package/src/skills/version-hash.ts +25 -15
- package/src/slack/slack-webhook.ts +19 -15
- package/src/subagent/index.ts +4 -8
- package/src/subagent/manager.ts +119 -69
- package/src/subagent/types.ts +9 -12
- package/src/swarm/backend-claude-code.ts +124 -45
- package/src/swarm/checkpoint.ts +36 -16
- package/src/swarm/graph-utils.ts +1 -3
- package/src/swarm/index.ts +38 -19
- package/src/swarm/limits.ts +13 -4
- package/src/swarm/orchestrator.ts +108 -57
- package/src/swarm/plan-validator.ts +23 -17
- package/src/swarm/router-planner.ts +51 -22
- package/src/swarm/router-prompts.ts +4 -1
- package/src/swarm/synthesizer.ts +26 -18
- package/src/swarm/types.ts +14 -4
- package/src/swarm/worker-backend.ts +36 -26
- package/src/swarm/worker-prompts.ts +13 -9
- package/src/swarm/worker-runner.ts +40 -34
- package/src/tasks/candidate-store.ts +14 -6
- package/src/tasks/ephemeral-permissions.ts +9 -5
- package/src/tasks/task-compiler.ts +41 -38
- package/src/tasks/task-runner.ts +54 -26
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/task-store.ts +20 -7
- package/src/tasks/tool-sanitizer.ts +3 -3
- package/src/tools/apps/definitions.ts +23 -15
- package/src/tools/apps/executors.ts +118 -37
- package/src/tools/apps/open-proxy.ts +5 -5
- package/src/tools/apps/registry.ts +2 -2
- package/src/tools/assets/materialize.ts +59 -41
- package/src/tools/assets/search.ts +86 -48
- package/src/tools/browser/api-map.ts +52 -36
- package/src/tools/browser/auth-cache.ts +21 -18
- package/src/tools/browser/auth-detector.ts +43 -28
- package/src/tools/browser/auto-navigate.ts +149 -68
- package/src/tools/browser/browser-execution.ts +9 -3
- package/src/tools/browser/headless-browser.ts +287 -150
- package/src/tools/browser/jit-auth.ts +37 -21
- package/src/tools/browser/network-recorder.ts +138 -56
- package/src/tools/browser/recording-store.ts +22 -15
- package/src/tools/browser/runtime-check.ts +8 -5
- package/src/tools/browser/x-auto-navigate.ts +88 -47
- package/src/tools/calls/call-end.ts +9 -6
- package/src/tools/calls/call-start.ts +30 -20
- package/src/tools/calls/call-status.ts +8 -5
- package/src/tools/claude-code/claude-code.ts +301 -165
- package/src/tools/computer-use/definitions.ts +159 -130
- package/src/tools/computer-use/registry.ts +2 -2
- package/src/tools/computer-use/request-computer-control.ts +21 -13
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/credentials/account-registry.ts +52 -35
- package/src/tools/credentials/broker-types.ts +1 -1
- package/src/tools/credentials/broker.ts +97 -55
- package/src/tools/credentials/domain-policy.ts +5 -2
- package/src/tools/credentials/host-pattern-match.ts +15 -8
- package/src/tools/credentials/metadata-store.ts +93 -43
- package/src/tools/credentials/policy-types.ts +5 -2
- package/src/tools/credentials/policy-validate.ts +21 -14
- package/src/tools/credentials/post-connect-hooks.ts +18 -7
- package/src/tools/credentials/resolve.ts +11 -10
- package/src/tools/credentials/selection.ts +30 -25
- package/src/tools/credentials/tool-policy.ts +5 -2
- package/src/tools/credentials/vault.ts +452 -183
- package/src/tools/document/document-tool.ts +23 -17
- package/src/tools/document/editor-template.ts +12 -7
- package/src/tools/execution-target.ts +13 -10
- package/src/tools/execution-timeout.ts +6 -5
- package/src/tools/executor.ts +141 -74
- package/src/tools/filesystem/edit.ts +82 -45
- package/src/tools/filesystem/fuzzy-match.ts +70 -32
- package/src/tools/filesystem/read.ts +46 -28
- package/src/tools/filesystem/view-image.ts +86 -42
- package/src/tools/filesystem/write.ts +53 -32
- package/src/tools/followups/followup_create.ts +43 -17
- package/src/tools/followups/followup_list.ts +28 -13
- package/src/tools/followups/followup_resolve.ts +9 -6
- package/src/tools/guardian-control-plane-policy.ts +15 -14
- package/src/tools/host-filesystem/edit.ts +77 -42
- package/src/tools/host-filesystem/read.ts +52 -33
- package/src/tools/host-filesystem/write.ts +50 -29
- package/src/tools/host-terminal/host-shell.ts +97 -61
- package/src/tools/mcp/mcp-tool-factory.ts +21 -14
- package/src/tools/memory/definitions.ts +60 -28
- package/src/tools/memory/handlers.ts +149 -77
- package/src/tools/memory/register.ts +39 -16
- package/src/tools/network/__tests__/web-search.test.ts +236 -177
- package/src/tools/network/domain-normalize.ts +13 -9
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
- package/src/tools/network/script-proxy/index.ts +1 -17
- package/src/tools/network/script-proxy/session-manager.ts +151 -84
- package/src/tools/network/url-safety.ts +56 -34
- package/src/tools/network/web-fetch.ts +273 -155
- package/src/tools/network/web-search.ts +166 -81
- package/src/tools/permission-checker.ts +6 -25
- package/src/tools/policy-context.ts +8 -5
- package/src/tools/registry.ts +73 -46
- package/src/tools/reminder/reminder-store.ts +65 -44
- package/src/tools/reminder/reminder.ts +76 -35
- package/src/tools/schedule/create.ts +44 -21
- package/src/tools/schedule/delete.ts +8 -5
- package/src/tools/schedule/list.ts +39 -19
- package/src/tools/schedule/update.ts +49 -26
- package/src/tools/secret-detection-handler.ts +130 -49
- package/src/tools/sensitive-output-placeholders.ts +15 -8
- package/src/tools/shared/filesystem/edit-engine.ts +45 -14
- package/src/tools/shared/filesystem/errors.ts +18 -18
- package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
- package/src/tools/shared/filesystem/format-diff.ts +21 -11
- package/src/tools/shared/filesystem/path-policy.ts +17 -13
- package/src/tools/shared/filesystem/size-guard.ts +8 -4
- package/src/tools/shared/filesystem/types.ts +2 -2
- package/src/tools/shared/shell-output.ts +4 -3
- package/src/tools/side-effects.ts +36 -28
- package/src/tools/skills/delete-managed.ts +30 -17
- package/src/tools/skills/load.ts +88 -46
- package/src/tools/skills/sandbox-runner.ts +62 -46
- package/src/tools/skills/scaffold-managed.ts +98 -48
- package/src/tools/skills/script-contract.ts +5 -2
- package/src/tools/skills/skill-script-runner.ts +29 -13
- package/src/tools/skills/skill-tool-factory.ts +20 -10
- package/src/tools/subagent/abort.ts +10 -4
- package/src/tools/subagent/message.ts +14 -8
- package/src/tools/subagent/read.ts +20 -11
- package/src/tools/subagent/spawn.ts +14 -6
- package/src/tools/subagent/status.ts +7 -4
- package/src/tools/swarm/delegate.ts +75 -49
- package/src/tools/system/avatar-generator.ts +46 -33
- package/src/tools/system/navigate-settings.ts +29 -19
- package/src/tools/system/open-system-settings.ts +30 -20
- package/src/tools/system/request-permission.ts +59 -44
- package/src/tools/system/version.ts +27 -16
- package/src/tools/system/voice-config.ts +116 -53
- package/src/tools/tasks/index.ts +8 -8
- package/src/tools/tasks/task-delete.ts +61 -22
- package/src/tools/tasks/task-list.ts +23 -11
- package/src/tools/tasks/task-run.ts +41 -16
- package/src/tools/tasks/task-save.ts +27 -10
- package/src/tools/tasks/work-item-enqueue.ts +114 -48
- package/src/tools/tasks/work-item-list.ts +20 -10
- package/src/tools/tasks/work-item-remove.ts +49 -15
- package/src/tools/tasks/work-item-run.ts +34 -13
- package/src/tools/tasks/work-item-update.ts +84 -31
- package/src/tools/terminal/backends/native.ts +64 -35
- package/src/tools/terminal/backends/types.ts +6 -2
- package/src/tools/terminal/parser.ts +200 -125
- package/src/tools/terminal/safe-env.ts +27 -21
- package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
- package/src/tools/terminal/sandbox.ts +10 -6
- package/src/tools/terminal/shell.ts +124 -68
- package/src/tools/tool-approval-handler.ts +193 -138
- package/src/tools/types.ts +43 -23
- package/src/tools/ui-surface/definitions.ts +124 -89
- package/src/tools/ui-surface/registry.ts +2 -2
- package/src/tools/watch/screen-watch.ts +50 -32
- package/src/tools/watch/watch-state.ts +41 -15
- package/src/tools/watcher/create.ts +37 -15
- package/src/tools/watcher/delete.ts +9 -6
- package/src/tools/watcher/digest.ts +10 -6
- package/src/tools/watcher/list.ts +37 -14
- package/src/tools/watcher/update.ts +33 -18
- package/src/tools/weather/service.ts +331 -174
- package/src/twitter/client.ts +261 -138
- package/src/twitter/oauth-client.ts +17 -13
- package/src/twitter/router.ts +51 -23
- package/src/twitter/session.ts +27 -18
- package/src/types/qrcode.d.ts +6 -3
- package/src/usage/actors.ts +16 -16
- package/src/usage/types.ts +3 -3
- package/src/util/bundled-asset.ts +10 -6
- package/src/util/canonicalize-identity.ts +11 -4
- package/src/util/clipboard.ts +7 -7
- package/src/util/content-id.ts +3 -3
- package/src/util/debounce.ts +3 -2
- package/src/util/diff.ts +55 -33
- package/src/util/errors.ts +26 -26
- package/src/util/fs.ts +8 -2
- package/src/util/log-redact.ts +12 -12
- package/src/util/logger.ts +112 -51
- package/src/util/network-info.ts +13 -5
- package/src/util/object.ts +4 -2
- package/src/util/phone.ts +4 -4
- package/src/util/platform.ts +80 -58
- package/src/util/pricing.ts +49 -31
- package/src/util/retry.ts +18 -7
- package/src/util/row-mapper.ts +7 -4
- package/src/util/silently.ts +7 -4
- package/src/util/spawn.ts +48 -0
- package/src/util/spinner.ts +9 -7
- package/src/util/time.ts +16 -3
- package/src/util/truncate.ts +1 -1
- package/src/util/voice-code.ts +6 -4
- package/src/util/xml.ts +5 -1
- package/src/version.ts +12 -8
- package/src/watcher/engine.ts +71 -44
- package/src/watcher/provider-registry.ts +1 -1
- package/src/watcher/providers/github.ts +40 -23
- package/src/watcher/providers/gmail.ts +59 -38
- package/src/watcher/providers/google-calendar.ts +62 -48
- package/src/watcher/providers/linear.ts +219 -150
- package/src/watcher/providers/slack.ts +93 -27
- package/src/watcher/watcher-store.ts +75 -55
- package/src/work-items/work-item-runner.ts +62 -29
- package/src/work-items/work-item-store.ts +137 -47
- package/src/workspace/commit-message-enrichment-service.ts +65 -25
- package/src/workspace/commit-message-provider.ts +14 -12
- package/src/workspace/git-service.ts +355 -239
- package/src/workspace/heartbeat-service.ts +74 -37
- package/src/workspace/provider-commit-message-generator.ts +95 -70
- package/src/workspace/top-level-renderer.ts +10 -8
- package/src/workspace/top-level-scanner.ts +9 -3
- package/src/workspace/turn-commit.ts +63 -36
- package/src/__tests__/ingress-member-store.test.ts +0 -294
- package/src/__tests__/script-proxy-router.test.ts +0 -215
- package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
- package/src/memory/guardian-bindings.ts +0 -158
- package/src/memory/ingress-member-store.ts +0 -352
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
- package/src/tools/network/script-proxy/certs.ts +0 -7
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
- package/src/tools/network/script-proxy/logging.ts +0 -12
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
- package/src/tools/network/script-proxy/policy.ts +0 -4
- package/src/tools/network/script-proxy/router.ts +0 -2
- package/src/tools/network/script-proxy/server.ts +0 -5
- package/src/tools/network/script-proxy/types.ts +0 -19
|
@@ -1,38 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Route handlers for conversation messages and suggestions.
|
|
3
3
|
*/
|
|
4
|
-
import { existsSync, readdirSync, statSync } from
|
|
5
|
-
import { join, relative } from
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import
|
|
4
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
5
|
+
import { join, relative } from "node:path";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
createAssistantMessage,
|
|
9
|
+
createUserMessage,
|
|
10
|
+
} from "../../agent/message-types.js";
|
|
11
|
+
import {
|
|
12
|
+
CHANNEL_IDS,
|
|
13
|
+
INTERFACE_IDS,
|
|
14
|
+
parseChannelId,
|
|
15
|
+
parseInterfaceId,
|
|
16
|
+
} from "../../channels/types.js";
|
|
17
|
+
import {
|
|
18
|
+
mergeToolResults,
|
|
19
|
+
renderHistoryContent,
|
|
20
|
+
} from "../../daemon/handlers.js";
|
|
21
|
+
import type { ServerMessage } from "../../daemon/ipc-protocol.js";
|
|
22
|
+
import * as attachmentsStore from "../../memory/attachments-store.js";
|
|
12
23
|
import {
|
|
13
24
|
createCanonicalGuardianRequest,
|
|
14
25
|
generateCanonicalRequestCode,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} from '../../memory/canonical-guardian-store.js';
|
|
26
|
+
listPendingRequestsByConversationScope,
|
|
27
|
+
} from "../../memory/canonical-guardian-store.js";
|
|
18
28
|
import {
|
|
19
29
|
getConversationByKey,
|
|
20
30
|
getOrCreateConversation,
|
|
21
|
-
} from
|
|
22
|
-
import * as conversationStore from
|
|
23
|
-
import { getConfiguredProvider } from
|
|
24
|
-
import type { Provider } from
|
|
25
|
-
import { getLogger } from
|
|
26
|
-
import { buildAssistantEvent } from
|
|
27
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from
|
|
28
|
-
import type { AuthContext } from
|
|
29
|
-
import { bridgeConfirmationRequestToGuardian } from
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
toGuardianRuntimeContext,
|
|
33
|
-
} from '../guardian-context-resolver.js';
|
|
34
|
-
import { routeGuardianReply } from '../guardian-reply-router.js';
|
|
35
|
-
import { httpError } from '../http-errors.js';
|
|
31
|
+
} from "../../memory/conversation-key-store.js";
|
|
32
|
+
import * as conversationStore from "../../memory/conversation-store.js";
|
|
33
|
+
import { getConfiguredProvider } from "../../providers/provider-send-message.js";
|
|
34
|
+
import type { Provider } from "../../providers/types.js";
|
|
35
|
+
import { getLogger } from "../../util/logger.js";
|
|
36
|
+
import { buildAssistantEvent } from "../assistant-event.js";
|
|
37
|
+
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
38
|
+
import type { AuthContext } from "../auth/types.js";
|
|
39
|
+
import { bridgeConfirmationRequestToGuardian } from "../confirmation-request-guardian-bridge.js";
|
|
40
|
+
import { routeGuardianReply } from "../guardian-reply-router.js";
|
|
41
|
+
import { httpError } from "../http-errors.js";
|
|
36
42
|
import type {
|
|
37
43
|
ApprovalConversationGenerator,
|
|
38
44
|
MessageProcessor,
|
|
@@ -40,37 +46,33 @@ import type {
|
|
|
40
46
|
RuntimeAttachmentMetadata,
|
|
41
47
|
RuntimeMessagePayload,
|
|
42
48
|
SendMessageDeps,
|
|
43
|
-
} from
|
|
44
|
-
import * as pendingInteractions from
|
|
49
|
+
} from "../http-types.js";
|
|
50
|
+
import * as pendingInteractions from "../pending-interactions.js";
|
|
51
|
+
import {
|
|
52
|
+
resolveTrustContext,
|
|
53
|
+
withSourceChannel,
|
|
54
|
+
} from "../trust-context-resolver.js";
|
|
45
55
|
|
|
46
|
-
const log = getLogger(
|
|
56
|
+
const log = getLogger("conversation-routes");
|
|
47
57
|
|
|
48
58
|
const SUGGESTION_CACHE_MAX = 100;
|
|
49
59
|
|
|
50
60
|
function collectCanonicalGuardianRequestHintIds(
|
|
51
61
|
conversationId: string,
|
|
52
62
|
sourceChannel: string,
|
|
53
|
-
session: import(
|
|
63
|
+
session: import("../../daemon/session.js").Session,
|
|
54
64
|
): string[] {
|
|
55
|
-
const requests =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
status: 'pending',
|
|
60
|
-
conversationId,
|
|
61
|
-
}).map((request) => ({ id: request.id, kind: request.kind })),
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
const deduped = new Map<string, string>();
|
|
65
|
-
for (const request of requests) {
|
|
66
|
-
if (!deduped.has(request.id)) {
|
|
67
|
-
deduped.set(request.id, request.kind ?? '');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
65
|
+
const requests = listPendingRequestsByConversationScope(
|
|
66
|
+
conversationId,
|
|
67
|
+
sourceChannel,
|
|
68
|
+
);
|
|
70
69
|
|
|
71
|
-
return
|
|
72
|
-
.filter(
|
|
73
|
-
|
|
70
|
+
return requests
|
|
71
|
+
.filter(
|
|
72
|
+
(req) =>
|
|
73
|
+
req.kind !== "tool_approval" || session.hasPendingConfirmation(req.id),
|
|
74
|
+
)
|
|
75
|
+
.map((req) => req.id);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
async function tryConsumeCanonicalGuardianReply(params: {
|
|
@@ -84,7 +86,7 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
84
86
|
mimeType: string;
|
|
85
87
|
data: string;
|
|
86
88
|
}>;
|
|
87
|
-
session: import(
|
|
89
|
+
session: import("../../daemon/session.js").Session;
|
|
88
90
|
onEvent: (msg: ServerMessage) => void;
|
|
89
91
|
approvalConversationGenerator?: ApprovalConversationGenerator;
|
|
90
92
|
/** Verified actor identity from actor-token middleware. */
|
|
@@ -110,8 +112,13 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
110
112
|
return { consumed: false };
|
|
111
113
|
}
|
|
112
114
|
|
|
113
|
-
const pendingRequestHintIds = collectCanonicalGuardianRequestHintIds(
|
|
114
|
-
|
|
115
|
+
const pendingRequestHintIds = collectCanonicalGuardianRequestHintIds(
|
|
116
|
+
conversationId,
|
|
117
|
+
sourceChannel,
|
|
118
|
+
session,
|
|
119
|
+
);
|
|
120
|
+
const pendingRequestIds =
|
|
121
|
+
pendingRequestHintIds.length > 0 ? pendingRequestHintIds : undefined;
|
|
115
122
|
|
|
116
123
|
const routerResult = await routeGuardianReply({
|
|
117
124
|
messageText: trimmedContent,
|
|
@@ -125,12 +132,12 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
125
132
|
pendingRequestIds,
|
|
126
133
|
approvalConversationGenerator,
|
|
127
134
|
emissionContext: {
|
|
128
|
-
source:
|
|
135
|
+
source: "inline_nl",
|
|
129
136
|
decisionText: trimmedContent,
|
|
130
137
|
},
|
|
131
138
|
});
|
|
132
139
|
|
|
133
|
-
if (!routerResult.consumed || routerResult.type ===
|
|
140
|
+
if (!routerResult.consumed || routerResult.type === "nl_keep_pending") {
|
|
134
141
|
return { consumed: false };
|
|
135
142
|
}
|
|
136
143
|
|
|
@@ -142,8 +149,8 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
142
149
|
session.emitConfirmationStateChanged({
|
|
143
150
|
sessionId: conversationId,
|
|
144
151
|
requestId: routerResult.requestId,
|
|
145
|
-
state:
|
|
146
|
-
source:
|
|
152
|
+
state: "resolved_stale",
|
|
153
|
+
source: "inline_nl",
|
|
147
154
|
decisionText: trimmedContent,
|
|
148
155
|
});
|
|
149
156
|
}
|
|
@@ -158,24 +165,27 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
158
165
|
assistantMessageChannel: sourceChannel,
|
|
159
166
|
userMessageInterface: sourceInterface,
|
|
160
167
|
assistantMessageInterface: sourceInterface,
|
|
161
|
-
provenanceTrustClass:
|
|
168
|
+
provenanceTrustClass: "guardian" as const,
|
|
162
169
|
};
|
|
163
170
|
|
|
164
171
|
const userMessage = createUserMessage(content, attachments);
|
|
165
172
|
const persistedUser = await conversationStore.addMessage(
|
|
166
173
|
conversationId,
|
|
167
|
-
|
|
174
|
+
"user",
|
|
168
175
|
JSON.stringify(userMessage.content),
|
|
169
176
|
channelMeta,
|
|
170
177
|
);
|
|
171
178
|
messageId = persistedUser.id;
|
|
172
179
|
|
|
173
|
-
const replyText =
|
|
174
|
-
|
|
180
|
+
const replyText =
|
|
181
|
+
routerResult.replyText?.trim() ||
|
|
182
|
+
(routerResult.decisionApplied
|
|
183
|
+
? "Decision applied."
|
|
184
|
+
: "Request already resolved.");
|
|
175
185
|
const assistantMessage = createAssistantMessage(replyText);
|
|
176
186
|
await conversationStore.addMessage(
|
|
177
187
|
conversationId,
|
|
178
|
-
|
|
188
|
+
"assistant",
|
|
179
189
|
JSON.stringify(assistantMessage.content),
|
|
180
190
|
channelMeta,
|
|
181
191
|
);
|
|
@@ -183,27 +193,38 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
183
193
|
// Avoid mutating in-memory history / emitting stream deltas while a run is active.
|
|
184
194
|
if (!session.isProcessing()) {
|
|
185
195
|
session.getMessages().push(userMessage, assistantMessage);
|
|
186
|
-
onEvent({
|
|
187
|
-
|
|
196
|
+
onEvent({
|
|
197
|
+
type: "assistant_text_delta",
|
|
198
|
+
text: replyText,
|
|
199
|
+
sessionId: conversationId,
|
|
200
|
+
});
|
|
201
|
+
onEvent({ type: "message_complete", sessionId: conversationId });
|
|
188
202
|
}
|
|
189
203
|
} catch (err) {
|
|
190
|
-
log.warn(
|
|
204
|
+
log.warn(
|
|
205
|
+
{ err, conversationId },
|
|
206
|
+
"Failed to persist inline approval transcript entries",
|
|
207
|
+
);
|
|
191
208
|
}
|
|
192
209
|
|
|
193
210
|
return { consumed: true, messageId };
|
|
194
211
|
}
|
|
195
212
|
|
|
196
|
-
function resolveCanonicalRequestSourceType(
|
|
197
|
-
|
|
198
|
-
|
|
213
|
+
function resolveCanonicalRequestSourceType(
|
|
214
|
+
sourceChannel: string | undefined,
|
|
215
|
+
): "desktop" | "channel" | "voice" {
|
|
216
|
+
if (sourceChannel === "voice") {
|
|
217
|
+
return "voice";
|
|
199
218
|
}
|
|
200
|
-
if (sourceChannel ===
|
|
201
|
-
return
|
|
219
|
+
if (sourceChannel === "vellum") {
|
|
220
|
+
return "desktop";
|
|
202
221
|
}
|
|
203
|
-
return
|
|
222
|
+
return "channel";
|
|
204
223
|
}
|
|
205
224
|
|
|
206
|
-
function getInterfaceFilesWithMtimes(
|
|
225
|
+
function getInterfaceFilesWithMtimes(
|
|
226
|
+
interfacesDir: string | null,
|
|
227
|
+
): Array<{ path: string; mtimeMs: number }> {
|
|
207
228
|
if (!interfacesDir || !existsSync(interfacesDir)) return [];
|
|
208
229
|
const results: Array<{ path: string; mtimeMs: number }> = [];
|
|
209
230
|
const scan = (dir: string): void => {
|
|
@@ -227,8 +248,8 @@ export function handleListMessages(
|
|
|
227
248
|
url: URL,
|
|
228
249
|
interfacesDir: string | null,
|
|
229
250
|
): Response {
|
|
230
|
-
const conversationId = url.searchParams.get(
|
|
231
|
-
const conversationKey = url.searchParams.get(
|
|
251
|
+
const conversationId = url.searchParams.get("conversationId");
|
|
252
|
+
const conversationKey = url.searchParams.get("conversationKey");
|
|
232
253
|
|
|
233
254
|
let resolvedConversationId: string | undefined;
|
|
234
255
|
if (conversationId) {
|
|
@@ -237,7 +258,11 @@ export function handleListMessages(
|
|
|
237
258
|
const mapping = getConversationByKey(conversationKey);
|
|
238
259
|
resolvedConversationId = mapping?.conversationId;
|
|
239
260
|
} else {
|
|
240
|
-
return httpError(
|
|
261
|
+
return httpError(
|
|
262
|
+
"BAD_REQUEST",
|
|
263
|
+
"conversationKey or conversationId query parameter is required",
|
|
264
|
+
400,
|
|
265
|
+
);
|
|
241
266
|
}
|
|
242
267
|
|
|
243
268
|
if (!resolvedConversationId) {
|
|
@@ -248,7 +273,11 @@ export function handleListMessages(
|
|
|
248
273
|
// Parse content blocks and extract text + tool calls
|
|
249
274
|
const parsed = rawMessages.map((msg) => {
|
|
250
275
|
let content: unknown;
|
|
251
|
-
try {
|
|
276
|
+
try {
|
|
277
|
+
content = JSON.parse(msg.content);
|
|
278
|
+
} catch {
|
|
279
|
+
content = msg.content;
|
|
280
|
+
}
|
|
252
281
|
const rendered = renderHistoryContent(content);
|
|
253
282
|
return {
|
|
254
283
|
role: msg.role,
|
|
@@ -273,7 +302,7 @@ export function handleListMessages(
|
|
|
273
302
|
let prevAssistantTimestamp = 0;
|
|
274
303
|
const messages: RuntimeMessagePayload[] = merged.map((m) => {
|
|
275
304
|
let msgAttachments: RuntimeAttachmentMetadata[] = [];
|
|
276
|
-
if (m.role ===
|
|
305
|
+
if (m.role === "assistant" && m.id) {
|
|
277
306
|
const linked = attachmentsStore.getAttachmentMetadataForMessage(m.id);
|
|
278
307
|
if (linked.length > 0) {
|
|
279
308
|
msgAttachments = linked.map((a) => ({
|
|
@@ -287,10 +316,13 @@ export function handleListMessages(
|
|
|
287
316
|
}
|
|
288
317
|
|
|
289
318
|
let interfaces: string[] | undefined;
|
|
290
|
-
if (m.role ===
|
|
319
|
+
if (m.role === "assistant") {
|
|
291
320
|
const msgTimestamp = new Date(m.timestamp).getTime();
|
|
292
321
|
const dirtied = interfaceFiles
|
|
293
|
-
.filter(
|
|
322
|
+
.filter(
|
|
323
|
+
(f) =>
|
|
324
|
+
f.mtimeMs > prevAssistantTimestamp && f.mtimeMs <= msgTimestamp,
|
|
325
|
+
)
|
|
294
326
|
.map((f) => f.path);
|
|
295
327
|
if (dirtied.length > 0) {
|
|
296
328
|
interfaces = dirtied;
|
|
@@ -299,7 +331,7 @@ export function handleListMessages(
|
|
|
299
331
|
}
|
|
300
332
|
|
|
301
333
|
return {
|
|
302
|
-
id: m.id ??
|
|
334
|
+
id: m.id ?? "",
|
|
303
335
|
role: m.role,
|
|
304
336
|
content: m.text,
|
|
305
337
|
timestamp: new Date(m.timestamp).toISOString(),
|
|
@@ -323,16 +355,16 @@ export function handleListMessages(
|
|
|
323
355
|
function makeHubPublisher(
|
|
324
356
|
deps: SendMessageDeps,
|
|
325
357
|
conversationId: string,
|
|
326
|
-
session: import(
|
|
358
|
+
session: import("../../daemon/session.js").Session,
|
|
327
359
|
): (msg: ServerMessage) => void {
|
|
328
360
|
let hubChain: Promise<void> = Promise.resolve();
|
|
329
361
|
return (msg: ServerMessage) => {
|
|
330
362
|
// Register pending interactions for approval events
|
|
331
|
-
if (msg.type ===
|
|
363
|
+
if (msg.type === "confirmation_request") {
|
|
332
364
|
pendingInteractions.register(msg.requestId, {
|
|
333
365
|
session,
|
|
334
366
|
conversationId,
|
|
335
|
-
kind:
|
|
367
|
+
kind: "confirmation",
|
|
336
368
|
confirmationDetails: {
|
|
337
369
|
toolName: msg.toolName,
|
|
338
370
|
input: msg.input,
|
|
@@ -348,30 +380,30 @@ function makeHubPublisher(
|
|
|
348
380
|
// Create a canonical guardian request so IPC/HTTP handlers can find it
|
|
349
381
|
// via applyCanonicalGuardianDecision.
|
|
350
382
|
try {
|
|
351
|
-
const
|
|
352
|
-
const sourceChannel =
|
|
383
|
+
const trustContext = session.trustContext;
|
|
384
|
+
const sourceChannel = trustContext?.sourceChannel ?? "vellum";
|
|
353
385
|
const canonicalRequest = createCanonicalGuardianRequest({
|
|
354
386
|
id: msg.requestId,
|
|
355
|
-
kind:
|
|
387
|
+
kind: "tool_approval",
|
|
356
388
|
sourceType: resolveCanonicalRequestSourceType(sourceChannel),
|
|
357
389
|
sourceChannel,
|
|
358
390
|
conversationId,
|
|
359
|
-
requesterExternalUserId:
|
|
360
|
-
requesterChatId:
|
|
361
|
-
guardianExternalUserId:
|
|
362
|
-
guardianPrincipalId:
|
|
391
|
+
requesterExternalUserId: trustContext?.requesterExternalUserId,
|
|
392
|
+
requesterChatId: trustContext?.requesterChatId,
|
|
393
|
+
guardianExternalUserId: trustContext?.guardianExternalUserId,
|
|
394
|
+
guardianPrincipalId: trustContext?.guardianPrincipalId ?? undefined,
|
|
363
395
|
toolName: msg.toolName,
|
|
364
|
-
status:
|
|
396
|
+
status: "pending",
|
|
365
397
|
requestCode: generateCanonicalRequestCode(),
|
|
366
398
|
expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
|
|
367
399
|
});
|
|
368
400
|
|
|
369
401
|
// For trusted-contact sessions, bridge to guardian.question so the
|
|
370
402
|
// guardian gets notified and can approve via callback/request-code.
|
|
371
|
-
if (
|
|
403
|
+
if (trustContext) {
|
|
372
404
|
bridgeConfirmationRequestToGuardian({
|
|
373
405
|
canonicalRequest,
|
|
374
|
-
|
|
406
|
+
trustContext,
|
|
375
407
|
conversationId,
|
|
376
408
|
toolName: msg.toolName,
|
|
377
409
|
assistantId: session.assistantId ?? DAEMON_INTERNAL_ASSISTANT_ID,
|
|
@@ -380,30 +412,38 @@ function makeHubPublisher(
|
|
|
380
412
|
} catch (err) {
|
|
381
413
|
log.debug(
|
|
382
414
|
{ err, requestId: msg.requestId, conversationId },
|
|
383
|
-
|
|
415
|
+
"Failed to create canonical request from hub publisher",
|
|
384
416
|
);
|
|
385
417
|
}
|
|
386
|
-
} else if (msg.type ===
|
|
418
|
+
} else if (msg.type === "secret_request") {
|
|
387
419
|
pendingInteractions.register(msg.requestId, {
|
|
388
420
|
session,
|
|
389
421
|
conversationId,
|
|
390
|
-
kind:
|
|
422
|
+
kind: "secret",
|
|
391
423
|
});
|
|
392
424
|
}
|
|
393
425
|
|
|
394
426
|
// ServerMessage is a large union; sessionId exists on most but not all variants.
|
|
395
427
|
const msgSessionId =
|
|
396
|
-
|
|
428
|
+
"sessionId" in msg &&
|
|
429
|
+
typeof (msg as { sessionId?: unknown }).sessionId === "string"
|
|
397
430
|
? (msg as { sessionId: string }).sessionId
|
|
398
431
|
: undefined;
|
|
399
432
|
const resolvedSessionId = msgSessionId ?? conversationId;
|
|
400
|
-
const event = buildAssistantEvent(
|
|
433
|
+
const event = buildAssistantEvent(
|
|
434
|
+
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
435
|
+
msg,
|
|
436
|
+
resolvedSessionId,
|
|
437
|
+
);
|
|
401
438
|
hubChain = (async () => {
|
|
402
439
|
await hubChain;
|
|
403
440
|
try {
|
|
404
441
|
await deps.assistantEventHub.publish(event);
|
|
405
442
|
} catch (err) {
|
|
406
|
-
log.warn(
|
|
443
|
+
log.warn(
|
|
444
|
+
{ err },
|
|
445
|
+
"assistant-events hub subscriber threw during POST /messages",
|
|
446
|
+
);
|
|
407
447
|
}
|
|
408
448
|
})();
|
|
409
449
|
};
|
|
@@ -419,7 +459,7 @@ export async function handleSendMessage(
|
|
|
419
459
|
},
|
|
420
460
|
authContext: AuthContext,
|
|
421
461
|
): Promise<Response> {
|
|
422
|
-
const body = await req.json() as {
|
|
462
|
+
const body = (await req.json()) as {
|
|
423
463
|
conversationKey?: string;
|
|
424
464
|
content?: string;
|
|
425
465
|
attachmentIds?: string[];
|
|
@@ -428,37 +468,54 @@ export async function handleSendMessage(
|
|
|
428
468
|
};
|
|
429
469
|
|
|
430
470
|
const { conversationKey, content, attachmentIds } = body;
|
|
431
|
-
if (!body.sourceChannel || typeof body.sourceChannel !==
|
|
432
|
-
return httpError(
|
|
471
|
+
if (!body.sourceChannel || typeof body.sourceChannel !== "string") {
|
|
472
|
+
return httpError("BAD_REQUEST", "sourceChannel is required", 400);
|
|
433
473
|
}
|
|
434
474
|
const sourceChannel = parseChannelId(body.sourceChannel);
|
|
435
475
|
|
|
436
476
|
if (!sourceChannel) {
|
|
437
|
-
return httpError(
|
|
477
|
+
return httpError(
|
|
478
|
+
"BAD_REQUEST",
|
|
479
|
+
`Invalid sourceChannel: ${
|
|
480
|
+
body.sourceChannel
|
|
481
|
+
}. Valid values: ${CHANNEL_IDS.join(", ")}`,
|
|
482
|
+
400,
|
|
483
|
+
);
|
|
438
484
|
}
|
|
439
485
|
|
|
440
|
-
if (!body.interface || typeof body.interface !==
|
|
441
|
-
return httpError(
|
|
486
|
+
if (!body.interface || typeof body.interface !== "string") {
|
|
487
|
+
return httpError("BAD_REQUEST", "interface is required", 400);
|
|
442
488
|
}
|
|
443
489
|
const sourceInterface = parseInterfaceId(body.interface);
|
|
444
490
|
if (!sourceInterface) {
|
|
445
|
-
return httpError(
|
|
491
|
+
return httpError(
|
|
492
|
+
"BAD_REQUEST",
|
|
493
|
+
`Invalid interface: ${body.interface}. Valid values: ${INTERFACE_IDS.join(
|
|
494
|
+
", ",
|
|
495
|
+
)}`,
|
|
496
|
+
400,
|
|
497
|
+
);
|
|
446
498
|
}
|
|
447
499
|
|
|
448
500
|
if (!conversationKey) {
|
|
449
|
-
return httpError(
|
|
501
|
+
return httpError("BAD_REQUEST", "conversationKey is required", 400);
|
|
450
502
|
}
|
|
451
503
|
|
|
452
504
|
// Reject non-string content values (numbers, objects, etc.)
|
|
453
|
-
if (content != null && typeof content !==
|
|
454
|
-
return httpError(
|
|
505
|
+
if (content != null && typeof content !== "string") {
|
|
506
|
+
return httpError("BAD_REQUEST", "content must be a string", 400);
|
|
455
507
|
}
|
|
456
508
|
|
|
457
|
-
const trimmedContent = typeof content ===
|
|
458
|
-
const hasAttachments =
|
|
509
|
+
const trimmedContent = typeof content === "string" ? content.trim() : "";
|
|
510
|
+
const hasAttachments =
|
|
511
|
+
Array.isArray(attachmentIds) && attachmentIds.length > 0;
|
|
459
512
|
|
|
460
513
|
if (trimmedContent.length === 0 && !hasAttachments) {
|
|
461
|
-
return httpError(
|
|
514
|
+
return httpError(
|
|
515
|
+
"BAD_REQUEST",
|
|
516
|
+
"content or attachmentIds is required",
|
|
517
|
+
400,
|
|
518
|
+
);
|
|
462
519
|
}
|
|
463
520
|
|
|
464
521
|
// Validate that all attachment IDs resolve
|
|
@@ -467,7 +524,11 @@ export async function handleSendMessage(
|
|
|
467
524
|
if (resolved.length !== attachmentIds.length) {
|
|
468
525
|
const resolvedIds = new Set(resolved.map((a) => a.id));
|
|
469
526
|
const missing = attachmentIds.filter((id) => !resolvedIds.has(id));
|
|
470
|
-
return httpError(
|
|
527
|
+
return httpError(
|
|
528
|
+
"BAD_REQUEST",
|
|
529
|
+
`Attachment IDs not found: ${missing.join(", ")}`,
|
|
530
|
+
400,
|
|
531
|
+
);
|
|
471
532
|
}
|
|
472
533
|
}
|
|
473
534
|
|
|
@@ -483,17 +544,17 @@ export async function handleSendMessage(
|
|
|
483
544
|
// the same trust resolution pipeline that channel ingress uses.
|
|
484
545
|
if (authContext.actorPrincipalId) {
|
|
485
546
|
const assistantId = DAEMON_INTERNAL_ASSISTANT_ID;
|
|
486
|
-
const
|
|
547
|
+
const trustCtx = resolveTrustContext({
|
|
487
548
|
assistantId,
|
|
488
|
-
sourceChannel:
|
|
489
|
-
conversationExternalId:
|
|
549
|
+
sourceChannel: "vellum",
|
|
550
|
+
conversationExternalId: "local",
|
|
490
551
|
actorExternalId: authContext.actorPrincipalId,
|
|
491
552
|
});
|
|
492
|
-
session.
|
|
553
|
+
session.setTrustContext(withSourceChannel(sourceChannel, trustCtx));
|
|
493
554
|
} else {
|
|
494
555
|
// Service principals (svc_gateway) or tokens without an actor ID
|
|
495
556
|
// get a minimal guardian context so downstream code has something.
|
|
496
|
-
session.
|
|
557
|
+
session.setTrustContext({ trustClass: "guardian", sourceChannel });
|
|
497
558
|
}
|
|
498
559
|
|
|
499
560
|
const onEvent = makeHubPublisher(smDeps, mapping.conversationId, session);
|
|
@@ -509,8 +570,10 @@ export async function handleSendMessage(
|
|
|
509
570
|
|
|
510
571
|
// Resolve the verified actor's external user ID and principal for inline
|
|
511
572
|
// approval routing from the session's guardian context.
|
|
512
|
-
const verifiedActorExternalUserId =
|
|
513
|
-
|
|
573
|
+
const verifiedActorExternalUserId =
|
|
574
|
+
session.trustContext?.guardianExternalUserId;
|
|
575
|
+
const verifiedActorPrincipalId =
|
|
576
|
+
session.trustContext?.guardianPrincipalId ?? undefined;
|
|
514
577
|
|
|
515
578
|
// Try to consume the message as a canonical guardian approval/rejection reply.
|
|
516
579
|
// On failure, degrade to the existing queue/auto-deny path rather than
|
|
@@ -520,7 +583,7 @@ export async function handleSendMessage(
|
|
|
520
583
|
conversationId: mapping.conversationId,
|
|
521
584
|
sourceChannel,
|
|
522
585
|
sourceInterface,
|
|
523
|
-
content: content ??
|
|
586
|
+
content: content ?? "",
|
|
524
587
|
attachments,
|
|
525
588
|
session,
|
|
526
589
|
onEvent,
|
|
@@ -530,12 +593,20 @@ export async function handleSendMessage(
|
|
|
530
593
|
});
|
|
531
594
|
if (inlineReplyResult.consumed) {
|
|
532
595
|
return Response.json(
|
|
533
|
-
{
|
|
596
|
+
{
|
|
597
|
+
accepted: true,
|
|
598
|
+
...(inlineReplyResult.messageId
|
|
599
|
+
? { messageId: inlineReplyResult.messageId }
|
|
600
|
+
: {}),
|
|
601
|
+
},
|
|
534
602
|
{ status: 202 },
|
|
535
603
|
);
|
|
536
604
|
}
|
|
537
605
|
} catch (err) {
|
|
538
|
-
log.warn(
|
|
606
|
+
log.warn(
|
|
607
|
+
{ err, conversationId: mapping.conversationId },
|
|
608
|
+
"Inline approval consumption failed, falling through to normal send path",
|
|
609
|
+
);
|
|
539
610
|
}
|
|
540
611
|
|
|
541
612
|
if (session.isProcessing()) {
|
|
@@ -544,13 +615,18 @@ export async function handleSendMessage(
|
|
|
544
615
|
if (session.hasAnyPendingConfirmation()) {
|
|
545
616
|
// Emit authoritative denial state for each pending request.
|
|
546
617
|
// The onStateSignal listener routes these to the SSE hub automatically.
|
|
547
|
-
for (const interaction of pendingInteractions.getByConversation(
|
|
548
|
-
|
|
618
|
+
for (const interaction of pendingInteractions.getByConversation(
|
|
619
|
+
mapping.conversationId,
|
|
620
|
+
)) {
|
|
621
|
+
if (
|
|
622
|
+
interaction.session === session &&
|
|
623
|
+
interaction.kind === "confirmation"
|
|
624
|
+
) {
|
|
549
625
|
session.emitConfirmationStateChanged({
|
|
550
626
|
sessionId: mapping.conversationId,
|
|
551
627
|
requestId: interaction.requestId,
|
|
552
|
-
state:
|
|
553
|
-
source:
|
|
628
|
+
state: "denied" as const,
|
|
629
|
+
source: "auto_deny" as const,
|
|
554
630
|
});
|
|
555
631
|
}
|
|
556
632
|
}
|
|
@@ -561,7 +637,7 @@ export async function handleSendMessage(
|
|
|
561
637
|
// Queue the message so it's processed when the current turn completes
|
|
562
638
|
const requestId = crypto.randomUUID();
|
|
563
639
|
const result = session.enqueueMessage(
|
|
564
|
-
content ??
|
|
640
|
+
content ?? "",
|
|
565
641
|
attachments,
|
|
566
642
|
onEvent,
|
|
567
643
|
requestId,
|
|
@@ -576,7 +652,11 @@ export async function handleSendMessage(
|
|
|
576
652
|
{ isInteractive: false },
|
|
577
653
|
);
|
|
578
654
|
if (result.rejected) {
|
|
579
|
-
return httpError(
|
|
655
|
+
return httpError(
|
|
656
|
+
"RATE_LIMITED",
|
|
657
|
+
"Message queue is full. Please retry later.",
|
|
658
|
+
429,
|
|
659
|
+
);
|
|
580
660
|
}
|
|
581
661
|
return Response.json({ accepted: true, queued: true }, { status: 202 });
|
|
582
662
|
}
|
|
@@ -591,13 +671,25 @@ export async function handleSendMessage(
|
|
|
591
671
|
assistantMessageInterface: sourceInterface,
|
|
592
672
|
});
|
|
593
673
|
const requestId = crypto.randomUUID();
|
|
594
|
-
const messageId = await session.persistUserMessage(
|
|
674
|
+
const messageId = await session.persistUserMessage(
|
|
675
|
+
content ?? "",
|
|
676
|
+
attachments,
|
|
677
|
+
requestId,
|
|
678
|
+
);
|
|
595
679
|
|
|
596
680
|
// Fire-and-forget the agent loop; events flow to the hub via onEvent.
|
|
597
681
|
// Mark non-interactive so conflict clarification doesn't block the turn.
|
|
598
|
-
session
|
|
599
|
-
|
|
600
|
-
|
|
682
|
+
session
|
|
683
|
+
.runAgentLoop(content ?? "", messageId, onEvent, {
|
|
684
|
+
isInteractive: false,
|
|
685
|
+
isUserMessage: true,
|
|
686
|
+
})
|
|
687
|
+
.catch((err) => {
|
|
688
|
+
log.error(
|
|
689
|
+
{ err, conversationId: mapping.conversationId },
|
|
690
|
+
"Agent loop failed (POST /messages)",
|
|
691
|
+
);
|
|
692
|
+
});
|
|
601
693
|
|
|
602
694
|
return Response.json({ accepted: true, messageId }, { status: 202 });
|
|
603
695
|
}
|
|
@@ -605,61 +697,77 @@ export async function handleSendMessage(
|
|
|
605
697
|
// ── Legacy path (fallback when sendMessageDeps not wired) ───────────
|
|
606
698
|
const processor = deps.persistAndProcessMessage ?? deps.processMessage;
|
|
607
699
|
if (!processor) {
|
|
608
|
-
return httpError(
|
|
700
|
+
return httpError(
|
|
701
|
+
"SERVICE_UNAVAILABLE",
|
|
702
|
+
"Message processing not configured",
|
|
703
|
+
503,
|
|
704
|
+
);
|
|
609
705
|
}
|
|
610
706
|
|
|
611
707
|
// Resolve guardian context from AuthContext for the legacy path too.
|
|
612
|
-
let
|
|
708
|
+
let trustContext: import("../../daemon/session-runtime-assembly.js").TrustContext;
|
|
613
709
|
if (authContext.actorPrincipalId) {
|
|
614
|
-
const
|
|
710
|
+
const legacyTrustCtx = resolveTrustContext({
|
|
615
711
|
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
616
|
-
sourceChannel:
|
|
617
|
-
conversationExternalId:
|
|
712
|
+
sourceChannel: "vellum",
|
|
713
|
+
conversationExternalId: "local",
|
|
618
714
|
actorExternalId: authContext.actorPrincipalId,
|
|
619
715
|
});
|
|
620
|
-
|
|
716
|
+
trustContext = withSourceChannel(sourceChannel, legacyTrustCtx);
|
|
621
717
|
} else {
|
|
622
|
-
|
|
718
|
+
trustContext = { trustClass: "guardian" as const, sourceChannel };
|
|
623
719
|
}
|
|
624
720
|
|
|
625
721
|
try {
|
|
626
722
|
const result = await processor(
|
|
627
723
|
mapping.conversationId,
|
|
628
|
-
content ??
|
|
724
|
+
content ?? "",
|
|
629
725
|
hasAttachments ? attachmentIds : undefined,
|
|
630
|
-
{
|
|
726
|
+
{ trustContext },
|
|
631
727
|
sourceChannel,
|
|
632
728
|
sourceInterface,
|
|
633
729
|
);
|
|
634
|
-
return Response.json(
|
|
730
|
+
return Response.json(
|
|
731
|
+
{ accepted: true, messageId: result.messageId },
|
|
732
|
+
{ status: 202 },
|
|
733
|
+
);
|
|
635
734
|
} catch (err) {
|
|
636
|
-
if (
|
|
637
|
-
|
|
735
|
+
if (
|
|
736
|
+
err instanceof Error &&
|
|
737
|
+
err.message === "Session is already processing a message"
|
|
738
|
+
) {
|
|
739
|
+
return httpError(
|
|
740
|
+
"CONFLICT",
|
|
741
|
+
"Session is busy processing another message. Please retry.",
|
|
742
|
+
409,
|
|
743
|
+
);
|
|
638
744
|
}
|
|
639
745
|
throw err;
|
|
640
746
|
}
|
|
641
747
|
}
|
|
642
748
|
|
|
643
|
-
async function generateLlmSuggestion(
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
749
|
+
async function generateLlmSuggestion(
|
|
750
|
+
provider: Provider,
|
|
751
|
+
assistantText: string,
|
|
752
|
+
): Promise<string | null> {
|
|
753
|
+
const truncated =
|
|
754
|
+
assistantText.length > 2000 ? assistantText.slice(-2000) : assistantText;
|
|
647
755
|
|
|
648
756
|
const prompt = `Given this assistant message, write a very short tab-complete suggestion (max 50 chars) the user could send next to keep the conversation going. Be casual, curious, or actionable — like a quick reply, not a formal request. Reply with ONLY the suggestion text.\n\nAssistant's message:\n${truncated}`;
|
|
649
757
|
const response = await provider.sendMessage(
|
|
650
|
-
[{ role:
|
|
758
|
+
[{ role: "user", content: [{ type: "text", text: prompt }] }],
|
|
651
759
|
[], // no tools
|
|
652
760
|
undefined, // no system prompt
|
|
653
761
|
{ config: { max_tokens: 30 } },
|
|
654
762
|
);
|
|
655
763
|
|
|
656
|
-
const textBlock = response.content.find((b) => b.type ===
|
|
657
|
-
const raw = textBlock &&
|
|
764
|
+
const textBlock = response.content.find((b) => b.type === "text");
|
|
765
|
+
const raw = textBlock && "text" in textBlock ? textBlock.text.trim() : "";
|
|
658
766
|
|
|
659
767
|
if (!raw) return null;
|
|
660
768
|
|
|
661
769
|
// Take first line only, then enforce the length cap
|
|
662
|
-
const firstLine = raw.split(
|
|
770
|
+
const firstLine = raw.split("\n")[0].trim();
|
|
663
771
|
if (!firstLine || firstLine.length > 50) return null;
|
|
664
772
|
return firstLine;
|
|
665
773
|
}
|
|
@@ -671,31 +779,48 @@ export async function handleGetSuggestion(
|
|
|
671
779
|
suggestionInFlight: Map<string, Promise<string | null>>;
|
|
672
780
|
},
|
|
673
781
|
): Promise<Response> {
|
|
674
|
-
const conversationKey = url.searchParams.get(
|
|
782
|
+
const conversationKey = url.searchParams.get("conversationKey");
|
|
675
783
|
if (!conversationKey) {
|
|
676
|
-
return httpError(
|
|
784
|
+
return httpError(
|
|
785
|
+
"BAD_REQUEST",
|
|
786
|
+
"conversationKey query parameter is required",
|
|
787
|
+
400,
|
|
788
|
+
);
|
|
677
789
|
}
|
|
678
790
|
|
|
679
791
|
const mapping = getConversationByKey(conversationKey);
|
|
680
792
|
if (!mapping) {
|
|
681
|
-
return Response.json({
|
|
793
|
+
return Response.json({
|
|
794
|
+
suggestion: null,
|
|
795
|
+
messageId: null,
|
|
796
|
+
source: "none" as const,
|
|
797
|
+
});
|
|
682
798
|
}
|
|
683
799
|
|
|
684
800
|
const rawMessages = conversationStore.getMessages(mapping.conversationId);
|
|
685
801
|
if (rawMessages.length === 0) {
|
|
686
|
-
return Response.json({
|
|
802
|
+
return Response.json({
|
|
803
|
+
suggestion: null,
|
|
804
|
+
messageId: null,
|
|
805
|
+
source: "none" as const,
|
|
806
|
+
});
|
|
687
807
|
}
|
|
688
808
|
|
|
689
809
|
// Staleness check: compare requested messageId against the latest
|
|
690
810
|
// assistant message BEFORE filtering by text content. This ensures
|
|
691
811
|
// that a newer tool-only assistant turn (empty text) still causes
|
|
692
812
|
// older messageId requests to be correctly marked as stale.
|
|
693
|
-
const requestedMessageId = url.searchParams.get(
|
|
813
|
+
const requestedMessageId = url.searchParams.get("messageId");
|
|
694
814
|
if (requestedMessageId) {
|
|
695
815
|
for (let i = rawMessages.length - 1; i >= 0; i--) {
|
|
696
|
-
if (rawMessages[i].role ===
|
|
816
|
+
if (rawMessages[i].role === "assistant") {
|
|
697
817
|
if (rawMessages[i].id !== requestedMessageId) {
|
|
698
|
-
return Response.json({
|
|
818
|
+
return Response.json({
|
|
819
|
+
suggestion: null,
|
|
820
|
+
messageId: null,
|
|
821
|
+
source: "none" as const,
|
|
822
|
+
stale: true,
|
|
823
|
+
});
|
|
699
824
|
}
|
|
700
825
|
break;
|
|
701
826
|
}
|
|
@@ -703,15 +828,19 @@ export async function handleGetSuggestion(
|
|
|
703
828
|
}
|
|
704
829
|
|
|
705
830
|
const { suggestionCache, suggestionInFlight } = deps;
|
|
706
|
-
const log = (await import(
|
|
831
|
+
const log = (await import("../../util/logger.js")).getLogger("runtime-http");
|
|
707
832
|
|
|
708
833
|
// Walk backwards to find the last assistant message with text content
|
|
709
834
|
for (let i = rawMessages.length - 1; i >= 0; i--) {
|
|
710
835
|
const msg = rawMessages[i];
|
|
711
|
-
if (msg.role !==
|
|
836
|
+
if (msg.role !== "assistant") continue;
|
|
712
837
|
|
|
713
838
|
let content: unknown;
|
|
714
|
-
try {
|
|
839
|
+
try {
|
|
840
|
+
content = JSON.parse(msg.content);
|
|
841
|
+
} catch {
|
|
842
|
+
content = msg.content;
|
|
843
|
+
}
|
|
715
844
|
const rendered = renderHistoryContent(content);
|
|
716
845
|
const text = rendered.text.trim();
|
|
717
846
|
if (!text) continue;
|
|
@@ -719,7 +848,12 @@ export async function handleGetSuggestion(
|
|
|
719
848
|
// If a messageId was requested and the first text-bearing assistant
|
|
720
849
|
// message is a *different* message, the request is stale.
|
|
721
850
|
if (requestedMessageId && msg.id !== requestedMessageId) {
|
|
722
|
-
return Response.json({
|
|
851
|
+
return Response.json({
|
|
852
|
+
suggestion: null,
|
|
853
|
+
messageId: null,
|
|
854
|
+
source: "none" as const,
|
|
855
|
+
stale: true,
|
|
856
|
+
});
|
|
723
857
|
}
|
|
724
858
|
|
|
725
859
|
// Return cached suggestion if we already generated one for this message
|
|
@@ -728,7 +862,7 @@ export async function handleGetSuggestion(
|
|
|
728
862
|
return Response.json({
|
|
729
863
|
suggestion: cached,
|
|
730
864
|
messageId: msg.id,
|
|
731
|
-
source:
|
|
865
|
+
source: "llm" as const,
|
|
732
866
|
});
|
|
733
867
|
}
|
|
734
868
|
|
|
@@ -757,19 +891,27 @@ export async function handleGetSuggestion(
|
|
|
757
891
|
return Response.json({
|
|
758
892
|
suggestion: llmSuggestion,
|
|
759
893
|
messageId: msg.id,
|
|
760
|
-
source:
|
|
894
|
+
source: "llm" as const,
|
|
761
895
|
});
|
|
762
896
|
}
|
|
763
897
|
} catch (err) {
|
|
764
898
|
suggestionInFlight.delete(msg.id);
|
|
765
|
-
log.warn({ err },
|
|
899
|
+
log.warn({ err }, "LLM suggestion failed");
|
|
766
900
|
}
|
|
767
901
|
}
|
|
768
902
|
|
|
769
|
-
return Response.json({
|
|
903
|
+
return Response.json({
|
|
904
|
+
suggestion: null,
|
|
905
|
+
messageId: null,
|
|
906
|
+
source: "none" as const,
|
|
907
|
+
});
|
|
770
908
|
}
|
|
771
909
|
|
|
772
|
-
return Response.json({
|
|
910
|
+
return Response.json({
|
|
911
|
+
suggestion: null,
|
|
912
|
+
messageId: null,
|
|
913
|
+
source: "none" as const,
|
|
914
|
+
});
|
|
773
915
|
}
|
|
774
916
|
|
|
775
917
|
/**
|
|
@@ -779,21 +921,26 @@ export async function handleGetSuggestion(
|
|
|
779
921
|
* Returns ranked results grouped by conversation, each with matching message excerpts.
|
|
780
922
|
*/
|
|
781
923
|
export function handleSearchConversations(url: URL): Response {
|
|
782
|
-
const query = url.searchParams.get(
|
|
924
|
+
const query = url.searchParams.get("q") ?? "";
|
|
783
925
|
if (!query.trim()) {
|
|
784
|
-
return httpError(
|
|
926
|
+
return httpError("BAD_REQUEST", "q query parameter is required", 400);
|
|
785
927
|
}
|
|
786
928
|
|
|
787
|
-
const limit = url.searchParams.has(
|
|
788
|
-
? Number(url.searchParams.get(
|
|
929
|
+
const limit = url.searchParams.has("limit")
|
|
930
|
+
? Number(url.searchParams.get("limit"))
|
|
789
931
|
: undefined;
|
|
790
|
-
const maxMessagesPerConversation = url.searchParams.has(
|
|
791
|
-
|
|
932
|
+
const maxMessagesPerConversation = url.searchParams.has(
|
|
933
|
+
"maxMessagesPerConversation",
|
|
934
|
+
)
|
|
935
|
+
? Number(url.searchParams.get("maxMessagesPerConversation"))
|
|
792
936
|
: undefined;
|
|
793
937
|
|
|
794
938
|
const results = conversationStore.searchConversations(query, {
|
|
795
939
|
...(limit !== undefined && !isNaN(limit) ? { limit } : {}),
|
|
796
|
-
...(maxMessagesPerConversation !== undefined &&
|
|
940
|
+
...(maxMessagesPerConversation !== undefined &&
|
|
941
|
+
!isNaN(maxMessagesPerConversation)
|
|
942
|
+
? { maxMessagesPerConversation }
|
|
943
|
+
: {}),
|
|
797
944
|
});
|
|
798
945
|
|
|
799
946
|
return Response.json({ query, results });
|