@vellumai/assistant 0.11.3 → 0.11.4-dev.202608190019.b94dbf2
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/AGENTS.md +9 -3
- package/ARCHITECTURE.md +32 -10
- package/docs/architecture/memory.md +43 -5
- package/docs/architecture/security.md +96 -152
- package/docs/architecture/turn-actor.md +70 -0
- package/docs/browser-use-architecture-phase2.md +128 -56
- package/docs/flux-turn-detection-spike.md +248 -0
- package/docs/guardian-request-flow.md +35 -0
- package/docs/stt-provider-onboarding.md +3 -1
- package/knip.json +3 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
- package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/openapi.yaml +289 -113
- package/package.json +1 -1
- package/scripts/voice-ttft-spike.ts +3 -3
- package/scripts/write-plugin-api-shim.ts +10 -0
- package/src/__tests__/app-compiler.test.ts +38 -3
- package/src/__tests__/app-control-flow.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/assistant-feature-flag-guard.test.ts +25 -3
- package/src/__tests__/attachments-store.test.ts +21 -12
- package/src/__tests__/byok-default-profile-ensure.test.ts +17 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
- package/src/__tests__/call-site-routing-provider.test.ts +1 -1
- package/src/__tests__/channel-availability-routes.test.ts +14 -1
- package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
- package/src/__tests__/channel-delivery-store.test.ts +14 -14
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
- package/src/__tests__/channel-setup-panel-ack.test.ts +1 -1
- package/src/__tests__/checker.test.ts +20 -314
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
- package/src/__tests__/compaction-events.test.ts +8 -10
- package/src/__tests__/config-loader-backfill.test.ts +3 -3
- package/src/__tests__/config-schema.test.ts +25 -10
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop.test.ts +32 -21
- package/src/__tests__/conversation-attachments.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +63 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +112 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
- package/src/__tests__/conversation-fork-crud.test.ts +69 -0
- package/src/__tests__/conversation-fork-referential.test.ts +67 -0
- package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +209 -0
- package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
- package/src/__tests__/conversation-queue.test.ts +154 -4
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +9 -9
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +187 -102
- package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
- package/src/__tests__/conversation-slash-queue.test.ts +3 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-open.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +21 -14
- package/src/__tests__/conversation-surfaces-queued-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-state-update.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-table-action.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
- package/src/__tests__/credential-prompt-route.test.ts +7 -10
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +1 -0
- package/src/__tests__/custom-profile-ensure.test.ts +5 -1
- package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
- package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
- package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
- package/src/__tests__/document-append-idempotency.test.ts +233 -0
- package/src/__tests__/document-sync-tags.test.ts +0 -75
- package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
- package/src/__tests__/edit-propagation.test.ts +107 -11
- package/src/__tests__/file-ops-service.test.ts +163 -30
- package/src/__tests__/filesystem-tools.test.ts +23 -24
- package/src/__tests__/gateway-only-guard.test.ts +2 -5
- package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
- package/src/__tests__/helpers/mock-actor-context.ts +49 -0
- package/src/__tests__/helpers/mock-conversation.ts +13 -1
- package/src/__tests__/host-file-read-tool.test.ts +16 -19
- package/src/__tests__/http-user-message-parity.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +49 -0
- package/src/__tests__/injector-chain.test.ts +63 -41
- package/src/__tests__/injector-disk-pressure.test.ts +11 -23
- package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
- package/src/__tests__/llm-context-resolution.test.ts +73 -1
- package/src/__tests__/llm-schema.test.ts +5 -2
- package/src/__tests__/managed-skill-lifecycle.test.ts +7 -0
- package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
- package/src/__tests__/media-generate-image.test.ts +131 -21
- package/src/__tests__/memory-retrieval-hook.test.ts +100 -7
- package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
- package/src/__tests__/mtime-cache.test.ts +3 -1
- package/src/__tests__/non-member-access-request.test.ts +0 -20
- package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
- package/src/__tests__/plugin-api-store-credential.test.ts +261 -0
- package/src/__tests__/plugin-api-webhook-url.test.ts +10 -7
- package/src/__tests__/plugin-disabled-state.test.ts +2 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
- package/src/__tests__/plugin-execution-context.test.ts +73 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +7 -4
- package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
- package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
- package/src/__tests__/proxy-approval-callback.test.ts +1 -0
- package/src/__tests__/qdrant-manager.test.ts +14 -1
- package/src/__tests__/reaction-persistence.test.ts +200 -7
- package/src/__tests__/require-fresh-approval.test.ts +0 -4
- package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +460 -105
- package/src/__tests__/run-due-schedules.test.ts +21 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +187 -18
- package/src/__tests__/schedule-routes.test.ts +23 -0
- package/src/__tests__/schedule-store.test.ts +17 -0
- package/src/__tests__/scoped-approval-grants.test.ts +11 -6
- package/src/__tests__/secret-ingress-channel.test.ts +0 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -3
- package/src/__tests__/skills.test.ts +32 -0
- package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
- package/src/__tests__/starter-task-flow.test.ts +5 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
- package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
- package/src/__tests__/subagent-spawn-and-await.test.ts +18 -17
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +81 -101
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +1 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
- package/src/__tests__/tool-executor.test.ts +68 -39
- package/src/__tests__/turn-events-store.test.ts +43 -0
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
- package/src/__tests__/ui-shape-teaching.test.ts +33 -0
- package/src/__tests__/ui-visual-surface.test.ts +1 -1
- package/src/__tests__/ui-voice-picker-surface.test.ts +128 -0
- package/src/__tests__/ui-work-result-surface.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/visible-app-context.test.ts +16 -9
- package/src/__tests__/voice-config-update.test.ts +40 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +5 -3
- package/src/__tests__/voice-session-bridge.test.ts +85 -29
- package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
- package/src/__tests__/worker-plugin-surface.test.ts +77 -0
- package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
- package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
- package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
- package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
- package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +235 -0
- package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
- package/src/acp/__tests__/auth-required.test.ts +161 -0
- package/src/acp/acp-claude-oauth.ts +19 -2
- package/src/acp/agent-process.test.ts +100 -0
- package/src/acp/agent-process.ts +29 -26
- package/src/acp/auth-required.ts +102 -0
- package/src/acp/session-manager.test.ts +119 -0
- package/src/acp/session-manager.ts +76 -3
- package/src/api/events/acp-auth-required.ts +55 -0
- package/src/api/events/host-file.ts +2 -2
- package/src/api/index.ts +7 -0
- package/src/api/surfaces.ts +12 -3
- package/src/apps/app-store.ts +3 -0
- package/src/bundler/package-resolver.ts +2 -30
- package/src/calls/__tests__/voice-session-bridge.test.ts +194 -11
- package/src/calls/__tests__/voice-triage-escalate.test.ts +102 -0
- package/src/calls/call-controller.ts +19 -3
- package/src/calls/call-setup-flow.ts +0 -1
- package/src/calls/media-stream-stt-session.ts +15 -0
- package/src/calls/voice-session-bridge.ts +115 -41
- package/src/calls/voice-triage-escalate.ts +105 -2
- package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
- package/src/channels/config.ts +13 -0
- package/src/channels/plugin-channel-declarations.ts +108 -0
- package/src/channels/types.ts +30 -0
- package/src/cli/AGENTS.md +5 -2
- package/src/cli/bundled-modules.ts +29 -0
- package/src/cli/commands/credentials.help.ts +2 -2
- package/src/cli/commands/db/repair.ts +4 -8
- package/src/cli/commands/domain.ts +6 -3
- package/src/cli/commands/email.ts +6 -3
- package/src/cli/commands/inference-providers.ts +1 -1
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.help.ts +13 -4
- package/src/cli/commands/mcp.ts +9 -0
- package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
- package/src/cli/commands/memory/index.help.ts +84 -28
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-v2.ts +58 -54
- package/src/cli/commands/memory/memory-v3.ts +64 -0
- package/src/cli/commands/memory/memory-validate.ts +18 -0
- package/src/cli/commands/plugins.ts +85 -36
- package/src/cli/commands/schedules.ts +35 -1
- package/src/cli/commands/stt.help.ts +27 -2
- package/src/cli/commands/trust.ts +3 -14
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
- package/src/cli/lib/bundled-marketplace.json +14 -1
- package/src/cli/lib/upgrade-plugin.ts +42 -0
- package/src/config/__tests__/balanced-model-experiment.test.ts +278 -0
- package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
- package/src/config/__tests__/default-provider.test.ts +6 -1
- package/src/config/__tests__/profile-materialization.test.ts +75 -19
- package/src/config/assistant-feature-flags.ts +36 -15
- package/src/config/balanced-model-experiment.ts +35 -0
- package/src/config/bundled-skills/acp/SKILL.md +6 -7
- package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -4
- package/src/config/bundled-skills/image-studio/TOOLS.json +1 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +101 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.test.ts +65 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +7 -1
- package/src/config/bundled-skills/settings/tools/shared.ts +16 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -1
- package/src/config/bundled-skills/skill-management/TOOLS.json +9 -3
- package/src/config/bundled-skills/subagent/SKILL.md +17 -12
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -4
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
- package/src/config/call-site-defaults.ts +11 -5
- package/src/config/default-profile-catalog.ts +179 -16
- package/src/config/default-profile-names.ts +4 -1
- package/src/config/default-provider-resolution.ts +4 -0
- package/src/config/feature-flag-registry.json +12 -12
- package/src/config/llm-context-resolution.ts +11 -3
- package/src/config/llm-resolver.ts +28 -1
- package/src/config/profile-materialization.ts +70 -22
- package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
- package/src/config/schemas/call-site-catalog.ts +4 -4
- package/src/config/schemas/live-voice.ts +57 -23
- package/src/config/schemas/llm.ts +59 -32
- package/src/config/schemas/mcp.ts +23 -0
- package/src/config/schemas/plugin-updates.ts +6 -2
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/skills.ts +9 -2
- package/src/context/outbound-sanitize.ts +96 -1
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
- package/src/daemon/conversation-agent-loop.ts +31 -19
- package/src/daemon/conversation-messaging.ts +5 -1
- package/src/daemon/conversation-notifiers.ts +20 -10
- package/src/daemon/conversation-process.ts +20 -6
- package/src/daemon/conversation-runtime-assembly.ts +12 -6
- package/src/daemon/conversation-store.ts +14 -4
- package/src/daemon/conversation-surfaces.ts +75 -26
- package/src/daemon/conversation-tool-setup.ts +3 -6
- package/src/daemon/conversation.ts +154 -51
- package/src/daemon/doordash-steps.ts +2 -2
- package/src/daemon/lifecycle.ts +14 -1
- package/src/daemon/mcp-reload-service.ts +36 -6
- package/src/daemon/process-message.ts +13 -26
- package/src/daemon/providers-setup.ts +6 -3
- package/src/daemon/trust-context-types.ts +29 -0
- package/src/daemon/trust-context.ts +12 -7
- package/src/daemon/wake-conversation-ops.ts +3 -2
- package/src/daemon/windows-compiled-entry.ts +4 -0
- package/src/documents/document-store.ts +143 -240
- package/src/hooks/hook-loader.ts +3 -3
- package/src/hooks/registry.ts +103 -45
- package/src/hooks/types.ts +5 -0
- package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
- package/src/inbound/oauth-callback-url.ts +61 -0
- package/src/ipc/gateway-client.test.ts +1 -1
- package/src/ipc/gateway-client.ts +14 -21
- package/src/ipc/gateway-flag-listener.ts +17 -3
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
- package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +1050 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
- package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
- package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
- package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
- package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
- package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
- package/src/live-voice/live-voice-archive.ts +2 -0
- package/src/live-voice/live-voice-manager.ts +16 -3
- package/src/live-voice/live-voice-metrics.ts +57 -32
- package/src/live-voice/live-voice-photo.ts +1 -2
- package/src/live-voice/live-voice-session.ts +598 -323
- package/src/live-voice/progress-narration.ts +277 -0
- package/src/live-voice/protocol.ts +21 -1
- package/src/live-voice/windows-compiled-live-voice.ts +4 -0
- package/src/mcp/__tests__/effective-config.test.ts +238 -0
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
- package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
- package/src/mcp/client.ts +16 -11
- package/src/mcp/effective-config.ts +113 -0
- package/src/mcp/manager.ts +11 -6
- package/src/mcp/mcp-auth-orchestrator.ts +13 -22
- package/src/mcp/mcp-oauth-provider.ts +205 -240
- package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
- package/src/monitoring/control.ts +1 -0
- package/src/monitoring/db-integrity-sample.ts +4 -5
- package/src/monitoring/plugin-auto-update.ts +128 -24
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/approval-card-data.ts +33 -0
- package/src/notifications/signal.ts +1 -0
- package/src/permissions/AGENTS.md +16 -0
- package/src/permissions/checker.test.ts +75 -122
- package/src/permissions/checker.ts +44 -560
- package/src/permissions/confirmation-guardian-request.test.ts +15 -11
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/prompter.ts +1 -5
- package/src/permissions/question-guardian-request.test.ts +14 -6
- package/src/permissions/question-guardian-request.ts +1 -2
- package/src/persistence/attachments-store.ts +8 -1
- package/src/persistence/bookmark-crud.ts +3 -7
- package/src/persistence/conversation-attention-store.ts +16 -45
- package/src/persistence/conversation-crud.ts +33 -4
- package/src/persistence/conversation-lineage.ts +9 -0
- package/src/persistence/conversation-queries.ts +182 -52
- package/src/persistence/delivery-crud.ts +150 -36
- package/src/persistence/embeddings/qdrant-manager.ts +84 -49
- package/src/persistence/external-conversation-store.ts +32 -4
- package/src/persistence/llm-request-log-store.ts +4 -10
- package/src/persistence/llm-usage-store.ts +8 -3
- package/src/persistence/message-reads.test.ts +197 -0
- package/src/persistence/message-reads.ts +211 -0
- package/src/persistence/migrations/360-add-document-workspace-path.ts +5 -14
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
- package/src/persistence/real-user-turn-filter.ts +27 -3
- package/src/persistence/schema/documents.ts +4 -4
- package/src/persistence/steps.ts +9 -0
- package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
- package/src/plugin-api/constants.ts +8 -0
- package/src/plugin-api/conversation-turn.ts +195 -5
- package/src/plugin-api/index.ts +38 -6
- package/src/plugin-api/resolve-credential.ts +3 -2
- package/src/plugin-api/store-credential.ts +146 -0
- package/src/plugin-api/vision-support.test.ts +1 -1
- package/src/plugin-api/webhook-url.ts +13 -11
- package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
- package/src/plugins/defaults/main.ts +21 -7
- package/src/plugins/defaults/memory/AGENTS.md +15 -3
- package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
- package/src/plugins/defaults/memory/buffer-format.ts +165 -0
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +77 -0
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +24 -6
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +17 -24
- package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +53 -5
- package/src/plugins/defaults/memory/indexer.ts +3 -1
- package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +147 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
- package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
- package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
- package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
- package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
- package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +195 -58
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +93 -24
- package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
- package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
- package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
- package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
- package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
- package/src/plugins/defaults/memory/substrate/static-context.ts +160 -33
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
- package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +66 -1
- package/src/plugins/defaults/memory/v3/card.ts +9 -9
- package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
- package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
- package/src/plugins/defaults/memory/v3/edge.ts +13 -57
- package/src/plugins/defaults/memory/v3/injector.ts +8 -0
- package/src/plugins/defaults/memory/v3/prune.ts +2 -0
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +23 -9
- package/src/plugins/defaults/memory/worker-control.ts +1 -0
- package/src/plugins/defaults/memory/worker.ts +6 -3
- package/src/plugins/defaults/worker-entrypoints.ts +3 -0
- package/src/plugins/external-plugin-loader.ts +47 -0
- package/src/plugins/mcp-servers.ts +361 -0
- package/src/plugins/mtime-cache.ts +37 -46
- package/src/plugins/pipeline.ts +14 -7
- package/src/plugins/plugin-execution-context.ts +35 -11
- package/src/plugins/worker-plugin-surface.ts +33 -0
- package/src/prompts/templates/system-sections.ts +0 -7
- package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
- package/src/providers/__tests__/context-overflow-error.test.ts +24 -0
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
- package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -2
- package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
- package/src/providers/anthropic/client.ts +332 -241
- package/src/providers/call-site-routing.ts +30 -3
- package/src/providers/connection-resolution.ts +194 -11
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +4 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +6 -0
- package/src/providers/inference/connection-availability.ts +24 -2
- package/src/providers/inference/connections.ts +2 -0
- package/src/providers/model-catalog.ts +3 -3
- package/src/providers/model-intents.ts +28 -8
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +163 -40
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
- package/src/providers/openai/chat-completions-provider.ts +133 -36
- package/src/providers/openai/codex-models.ts +2 -1
- package/src/providers/provider-send-message.ts +32 -3
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +625 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +679 -0
- package/src/providers/speech-to-text/provider-catalog.ts +99 -8
- package/src/providers/speech-to-text/resolve.ts +25 -2
- package/src/routes/control.ts +1 -0
- package/src/routes/route-host-client.ts +1 -0
- package/src/routes/route-host-protocol.ts +7 -0
- package/src/routes/worker.ts +48 -15
- package/src/runtime/AGENTS.md +16 -17
- package/src/runtime/access-request-helper.ts +9 -12
- package/src/runtime/agent-wake.ts +18 -15
- package/src/runtime/effective-capabilities.test.ts +43 -0
- package/src/runtime/effective-capabilities.ts +27 -0
- package/src/runtime/guardian-reply-router.ts +6 -2
- package/src/runtime/pre-first-message-gate.ts +4 -0
- package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +522 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +132 -35
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +215 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +133 -1
- package/src/runtime/routes/channel-availability-routes.ts +32 -14
- package/src/runtime/routes/channel-route-shared.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
- package/src/runtime/routes/conversation-list-routes.ts +181 -23
- package/src/runtime/routes/conversation-management-routes.ts +17 -12
- package/src/runtime/routes/conversation-query-routes.ts +40 -27
- package/src/runtime/routes/conversation-routes.ts +43 -29
- package/src/runtime/routes/credential-prompt-routes.ts +4 -7
- package/src/runtime/routes/credential-routes.ts +26 -82
- package/src/runtime/routes/default-provider-routes.ts +15 -0
- package/src/runtime/routes/documents-routes.ts +3 -222
- package/src/runtime/routes/inbound-message-handler.ts +21 -45
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
- package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -79
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +12 -7
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -8
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -79
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
- package/src/runtime/routes/inference-profiles-routes.ts +20 -11
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
- package/src/runtime/routes/log-export-routes.ts +3 -0
- package/src/runtime/routes/mcp-auth-routes.ts +148 -57
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +2 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +3 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -2
- package/src/runtime/routes/playground/reset-circuit.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +38 -8
- package/src/runtime/routes/schedule-routes.ts +94 -7
- package/src/runtime/routes/settings-routes.ts +6 -6
- package/src/runtime/routes/stt-routes.ts +31 -25
- package/src/runtime/routes/surface-action-routes.ts +20 -19
- package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
- package/src/runtime/routes/user-route-dispatcher.ts +69 -15
- package/src/runtime/routes/user-route-import.ts +108 -0
- package/src/runtime/routes/user-route-resolution.ts +18 -1
- package/src/runtime/routes/workspace-routes.ts +0 -9
- package/src/runtime/routes/workspace-utils.ts +3 -13
- package/src/runtime/services/conversation-serializer.ts +7 -2
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +68 -5
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +81 -0
- package/src/schedule/plugin-schedule-availability.ts +58 -0
- package/src/schedule/plugin-schedule-declarations.ts +23 -27
- package/src/schedule/plugin-schedule-reconciler.ts +12 -3
- package/src/schedule/schedule-store.ts +5 -1
- package/src/schedule/scheduler.ts +9 -4
- package/src/schedule/worker-control.ts +1 -0
- package/src/schedule/worker.ts +6 -0
- package/src/security/oauth2.ts +6 -22
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
- package/src/stt/__tests__/types.test.ts +94 -0
- package/src/stt/daemon-batch-transcriber.ts +10 -0
- package/src/stt/stt-stream-session.ts +8 -4
- package/src/stt/types.ts +103 -0
- package/src/subagent/__tests__/consult-prompt.test.ts +26 -15
- package/src/subagent/consult-context.ts +11 -11
- package/src/subagent/consult-prompt.ts +26 -35
- package/src/subagent/manager.ts +21 -40
- package/src/subagent/notify.ts +7 -1
- package/src/subagent/types.ts +15 -12
- package/src/tools/__tests__/tool-input-schemas.test.ts +7 -7
- package/src/tools/acp/spawn.test.ts +97 -0
- package/src/tools/acp/spawn.ts +38 -4
- package/src/tools/credentials/ref-parse.ts +35 -0
- package/src/tools/credentials/resolve.ts +4 -10
- package/src/tools/credentials/store.ts +168 -0
- package/src/tools/document/document-tool.ts +12 -3
- package/src/tools/executor.ts +53 -15
- package/src/tools/filesystem/read.ts +27 -10
- package/src/tools/host-filesystem/read.ts +27 -15
- package/src/tools/network/url-safety.ts +9 -16
- package/src/tools/permission-checker.ts +43 -52
- package/src/tools/registry.ts +2 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +63 -35
- package/src/tools/shared/filesystem/legacy-read-args.ts +22 -0
- package/src/tools/shared/filesystem/types.ts +5 -5
- package/src/tools/skills/scaffold-managed.ts +25 -7
- package/src/tools/subagent/spawn.ts +28 -88
- package/src/tools/tool-types.ts +26 -13
- package/src/tools/types.ts +6 -6
- package/src/tools/ui-surface/surface-shape-docs.ts +12 -1
- package/src/tools/workflows/run-workflow.ts +1 -2
- package/src/tts/__tests__/reasoning-tag-filter.test.ts +78 -0
- package/src/tts/reasoning-tag-filter.ts +89 -0
- package/src/util/__tests__/worker-process-command.test.ts +37 -0
- package/src/util/logger.ts +16 -0
- package/src/util/think-tag-stream.ts +95 -0
- package/src/util/worker-process.ts +37 -4
- package/src/windows-compiled-cli.ts +32 -0
- package/src/windows-compiled-entry.ts +4 -0
- package/src/windows-compiled-logger.ts +6 -0
- package/src/windows-compiled-worker-entry.ts +29 -0
- package/src/workspace/byok-default-profile-ensure.ts +76 -24
- package/src/workspace/custom-profile-ensure.ts +4 -24
- package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
- package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
- package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
- package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
- package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +195 -0
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +7 -5
- package/src/__tests__/document-workspace-file.test.ts +0 -467
- package/src/live-voice/__tests__/front-decision.test.ts +0 -645
- package/src/live-voice/front-decision.ts +0 -476
- package/src/permissions/ipc-risk-types.ts +0 -143
- package/src/permissions/risk-types.ts +0 -76
- package/src/subagent/__tests__/consult-transcript.test.ts +0 -184
- package/src/subagent/consult-transcript.ts +0 -90
|
@@ -19,17 +19,19 @@ mock.module("../util/logger.js", () => ({
|
|
|
19
19
|
}));
|
|
20
20
|
|
|
21
21
|
mock.module("../daemon/conversation-registry.js", () => ({
|
|
22
|
-
findConversation: () =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
findConversation: () =>
|
|
23
|
+
asConversation({
|
|
24
|
+
assistantId: "self",
|
|
25
|
+
trustContext: {
|
|
26
|
+
trustClass: "trusted_contact",
|
|
27
|
+
sourceChannel: "telegram",
|
|
28
|
+
requesterExternalUserId: "tg-user-1",
|
|
29
|
+
requesterChatId: "tg-chat-1",
|
|
30
|
+
guardianExternalUserId: "tg-guardian-1",
|
|
31
|
+
guardianPrincipalId: "principal-1",
|
|
32
|
+
} satisfies TrustContext,
|
|
33
|
+
hasPendingConfirmation: () => confirmationPending,
|
|
34
|
+
}),
|
|
33
35
|
}));
|
|
34
36
|
|
|
35
37
|
mock.module("../channels/gateway-guardian-requests.js", () => ({
|
|
@@ -50,7 +52,9 @@ mock.module("../runtime/confirmation-request-guardian-bridge.js", () => ({
|
|
|
50
52
|
},
|
|
51
53
|
}));
|
|
52
54
|
|
|
55
|
+
import { asConversation } from "../__tests__/helpers/mock-conversation.js";
|
|
53
56
|
import type { AssistantEvent } from "../api/index.js";
|
|
57
|
+
import type { TrustContext } from "../daemon/trust-context-types.js";
|
|
54
58
|
import { createGuardianRequestForConfirmation } from "./confirmation-guardian-request.js";
|
|
55
59
|
|
|
56
60
|
const MSG = {
|
|
@@ -66,8 +66,8 @@ export async function createGuardianRequestForConfirmation(
|
|
|
66
66
|
|
|
67
67
|
const conversation = findConversation(conversationId);
|
|
68
68
|
const trustContext = opts?.preferTurnSnapshot
|
|
69
|
-
?
|
|
70
|
-
: conversation?.
|
|
69
|
+
? conversation?.getTurnOrRestingTrust()
|
|
70
|
+
: conversation?.getTrustContext();
|
|
71
71
|
const sourceChannel = trustContext?.sourceChannel ?? "vellum";
|
|
72
72
|
const inputRecord = msg.input as Record<string, unknown>;
|
|
73
73
|
const activityRaw =
|
|
@@ -36,7 +36,7 @@ export class PermissionPrompter {
|
|
|
36
36
|
* pendingInteractions, matching the host proxy pattern.
|
|
37
37
|
*/
|
|
38
38
|
private ownedIds = new Set<string>();
|
|
39
|
-
private sendToClient: (msg: AssistantEvent) => void;
|
|
39
|
+
private readonly sendToClient: (msg: AssistantEvent) => void;
|
|
40
40
|
private onStateChanged?: ConfirmationStateCallback;
|
|
41
41
|
|
|
42
42
|
constructor(sendToClient: (msg: AssistantEvent) => void) {
|
|
@@ -47,10 +47,6 @@ export class PermissionPrompter {
|
|
|
47
47
|
this.onStateChanged = cb;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
updateSender(sendToClient: (msg: AssistantEvent) => void): void {
|
|
51
|
-
this.sendToClient = sendToClient;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
50
|
async prompt(
|
|
55
51
|
toolName: string,
|
|
56
52
|
input: Record<string, unknown>,
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
9
9
|
|
|
10
|
+
import { mockTrustContext } from "../__tests__/helpers/mock-actor-context.js";
|
|
11
|
+
import { asConversation } from "../__tests__/helpers/mock-conversation.js";
|
|
10
12
|
import type { QuestionRequestEvent } from "../api/events/question-request.js";
|
|
13
|
+
import type { TrustContext } from "../daemon/trust-context-types.js";
|
|
11
14
|
|
|
12
15
|
const createGuardianRequestMock = mock(
|
|
13
16
|
(params: Record<string, unknown>): Promise<Record<string, unknown>> =>
|
|
@@ -21,13 +24,18 @@ const withdrawCardsMock = mock((_params: Record<string, unknown>) =>
|
|
|
21
24
|
Promise.resolve(),
|
|
22
25
|
);
|
|
23
26
|
|
|
24
|
-
let trustContext:
|
|
27
|
+
let trustContext: TrustContext | undefined;
|
|
25
28
|
let pendingInteraction: { kind: string } | undefined;
|
|
26
29
|
let rowAfterExpire: Record<string, unknown> | null = null;
|
|
27
30
|
|
|
28
31
|
mock.module("../daemon/conversation-registry.js", () => ({
|
|
29
32
|
findConversation: (_id: string) =>
|
|
30
|
-
trustContext
|
|
33
|
+
trustContext
|
|
34
|
+
? asConversation({
|
|
35
|
+
trustContext,
|
|
36
|
+
assistantId: "self",
|
|
37
|
+
})
|
|
38
|
+
: undefined,
|
|
31
39
|
}));
|
|
32
40
|
mock.module("../channels/gateway-guardian-requests.js", () => ({
|
|
33
41
|
createGuardianRequest: (params: Record<string, unknown>) =>
|
|
@@ -77,9 +85,9 @@ function makeEvent(
|
|
|
77
85
|
}
|
|
78
86
|
|
|
79
87
|
function guardianTrustContext(
|
|
80
|
-
overrides:
|
|
81
|
-
):
|
|
82
|
-
return {
|
|
88
|
+
overrides: Partial<TrustContext> = {},
|
|
89
|
+
): TrustContext {
|
|
90
|
+
return mockTrustContext({
|
|
83
91
|
trustClass: "guardian",
|
|
84
92
|
sourceChannel: "telegram",
|
|
85
93
|
guardianPrincipalId: "prin-guardian",
|
|
@@ -87,7 +95,7 @@ function guardianTrustContext(
|
|
|
87
95
|
requesterExternalUserId: "tg-guardian",
|
|
88
96
|
requesterChatId: "chat-1",
|
|
89
97
|
...overrides,
|
|
90
|
-
};
|
|
98
|
+
});
|
|
91
99
|
}
|
|
92
100
|
|
|
93
101
|
beforeEach(() => {
|
|
@@ -107,8 +107,7 @@ export async function createGuardianRequestForQuestion(
|
|
|
107
107
|
const conversation = findConversation(conversationId);
|
|
108
108
|
// The prompter runs inside the emitting turn — bind to the turn's trust
|
|
109
109
|
// snapshot so a concurrent context mutation can't repoint the request.
|
|
110
|
-
const trustContext =
|
|
111
|
-
conversation?.currentTurnTrustContext ?? conversation?.trustContext;
|
|
110
|
+
const trustContext = conversation?.getTurnOrRestingTrust();
|
|
112
111
|
if (!conversation || !trustContext) {
|
|
113
112
|
return;
|
|
114
113
|
}
|
|
@@ -137,6 +137,9 @@ function getAttachmentRow(attachmentId: string): AttachmentRow | null {
|
|
|
137
137
|
function getMessageConversationContext(
|
|
138
138
|
messageId: string,
|
|
139
139
|
): { conversationId: string; conversationCreatedAt: number } | null {
|
|
140
|
+
// Any-state read, deliberately: the id names a message the caller is
|
|
141
|
+
// already linking an attachment to, and a rendered row may still be
|
|
142
|
+
// streaming. Existence and ownership are the question, not completeness.
|
|
140
143
|
return (
|
|
141
144
|
rawGet<{ conversationId: string; conversationCreatedAt: number }>(
|
|
142
145
|
"attachments:getMessageConversationContext",
|
|
@@ -474,6 +477,11 @@ const ALLOWED_MIME_TYPES = new Set([
|
|
|
474
477
|
// Source code
|
|
475
478
|
"text/javascript",
|
|
476
479
|
"text/typescript",
|
|
480
|
+
// Shell scripts (browsers and OS file pickers report these for .sh files)
|
|
481
|
+
"application/x-sh",
|
|
482
|
+
"application/x-shellscript",
|
|
483
|
+
"text/x-sh",
|
|
484
|
+
"text/x-shellscript",
|
|
477
485
|
// Archives
|
|
478
486
|
"application/zip",
|
|
479
487
|
"application/gzip",
|
|
@@ -501,7 +509,6 @@ const ALLOWED_MIME_TYPES = new Set([
|
|
|
501
509
|
*/
|
|
502
510
|
const DANGEROUS_EXTENSIONS = new Set([
|
|
503
511
|
"exe",
|
|
504
|
-
"sh",
|
|
505
512
|
"bat",
|
|
506
513
|
"cmd",
|
|
507
514
|
"com",
|
|
@@ -3,6 +3,7 @@ import { v4 as uuid } from "uuid";
|
|
|
3
3
|
|
|
4
4
|
import type { DrizzleDb } from "./db-connection.js";
|
|
5
5
|
import { stringifyMessageContent } from "./message-content.js";
|
|
6
|
+
import { messageConversationId } from "./message-reads.js";
|
|
6
7
|
import { conversations, messageBookmarks, messages } from "./schema.js";
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -138,15 +139,10 @@ export function createBookmark(
|
|
|
138
139
|
params: { messageId: string },
|
|
139
140
|
): CreateBookmarkResult {
|
|
140
141
|
const { messageId } = params;
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
.from(messages)
|
|
144
|
-
.where(eq(messages.id, messageId))
|
|
145
|
-
.get();
|
|
146
|
-
if (!message) {
|
|
142
|
+
const conversationId = messageConversationId(messageId, { db });
|
|
143
|
+
if (conversationId === null) {
|
|
147
144
|
throw new Error(`Message ${messageId} not found`);
|
|
148
145
|
}
|
|
149
|
-
const conversationId = message.conversationId;
|
|
150
146
|
|
|
151
147
|
const existing = db
|
|
152
148
|
.select({ id: messageBookmarks.id })
|
|
@@ -21,11 +21,14 @@ import { v4 as uuid } from "uuid";
|
|
|
21
21
|
|
|
22
22
|
import { UserError } from "../util/errors.js";
|
|
23
23
|
import { getDb } from "./db-connection.js";
|
|
24
|
+
import {
|
|
25
|
+
latestAssistantMessage,
|
|
26
|
+
latestAssistantMessageBefore,
|
|
27
|
+
} from "./message-reads.js";
|
|
24
28
|
import {
|
|
25
29
|
conversationAssistantAttentionState,
|
|
26
30
|
conversationAttentionEvents,
|
|
27
31
|
conversations,
|
|
28
|
-
messages,
|
|
29
32
|
} from "./schema/index.js";
|
|
30
33
|
|
|
31
34
|
// ── Types ────────────────────────────────────────────────────────────
|
|
@@ -361,19 +364,11 @@ export function recordConversationSeenSignal(params: {
|
|
|
361
364
|
if (!state) {
|
|
362
365
|
// No state row yet — look up the conversation's latest assistant message so
|
|
363
366
|
// upgraded databases (with existing messages but no attention row) correctly
|
|
364
|
-
// initialize the full state on the first seen signal.
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
and(
|
|
370
|
-
eq(messages.conversationId, conversationId),
|
|
371
|
-
eq(messages.role, "assistant"),
|
|
372
|
-
),
|
|
373
|
-
)
|
|
374
|
-
.orderBy(desc(messages.createdAt))
|
|
375
|
-
.limit(1)
|
|
376
|
-
.get();
|
|
367
|
+
// initialize the full state on the first seen signal. Finalized-only via
|
|
368
|
+
// the accessor: a still-streaming reply is not a reply the user has seen,
|
|
369
|
+
// and anchoring the watermark on it would classify the finished reply as
|
|
370
|
+
// seen the moment it completes.
|
|
371
|
+
const latestMsg = latestAssistantMessage(conversationId, { db: tx });
|
|
377
372
|
|
|
378
373
|
const latestMsgId = latestMsg?.id ?? null;
|
|
379
374
|
const latestMsgAt = latestMsg?.createdAt ?? null;
|
|
@@ -461,26 +456,11 @@ function resolveAssistantCursor(params: {
|
|
|
461
456
|
latestAssistantMessageAt,
|
|
462
457
|
} = params;
|
|
463
458
|
|
|
464
|
-
// Unread classification compares timestamps strictly, so rewinding to a
|
|
465
|
-
// same-timestamp sibling would leave the latest reply classified as seen.
|
|
466
|
-
const previousAssistantMessageBefore = (before: number) =>
|
|
467
|
-
db
|
|
468
|
-
.select({ id: messages.id, createdAt: messages.createdAt })
|
|
469
|
-
.from(messages)
|
|
470
|
-
.where(
|
|
471
|
-
and(
|
|
472
|
-
eq(messages.conversationId, conversationId),
|
|
473
|
-
eq(messages.role, "assistant"),
|
|
474
|
-
lt(messages.createdAt, before),
|
|
475
|
-
),
|
|
476
|
-
)
|
|
477
|
-
.orderBy(desc(messages.createdAt), desc(messages.id))
|
|
478
|
-
.limit(1)
|
|
479
|
-
.get();
|
|
480
|
-
|
|
481
459
|
if (latestAssistantMessageId && latestAssistantMessageAt != null) {
|
|
482
|
-
const previousMessage =
|
|
460
|
+
const previousMessage = latestAssistantMessageBefore(
|
|
461
|
+
conversationId,
|
|
483
462
|
latestAssistantMessageAt,
|
|
463
|
+
{ db },
|
|
484
464
|
);
|
|
485
465
|
|
|
486
466
|
return {
|
|
@@ -491,25 +471,16 @@ function resolveAssistantCursor(params: {
|
|
|
491
471
|
};
|
|
492
472
|
}
|
|
493
473
|
|
|
494
|
-
const latestMessage = db
|
|
495
|
-
.select({ id: messages.id, createdAt: messages.createdAt })
|
|
496
|
-
.from(messages)
|
|
497
|
-
.where(
|
|
498
|
-
and(
|
|
499
|
-
eq(messages.conversationId, conversationId),
|
|
500
|
-
eq(messages.role, "assistant"),
|
|
501
|
-
),
|
|
502
|
-
)
|
|
503
|
-
.orderBy(desc(messages.createdAt), desc(messages.id))
|
|
504
|
-
.limit(1)
|
|
505
|
-
.get();
|
|
474
|
+
const latestMessage = latestAssistantMessage(conversationId, { db });
|
|
506
475
|
|
|
507
476
|
if (!latestMessage) {
|
|
508
477
|
return null;
|
|
509
478
|
}
|
|
510
479
|
|
|
511
|
-
const previousMessage =
|
|
480
|
+
const previousMessage = latestAssistantMessageBefore(
|
|
481
|
+
conversationId,
|
|
512
482
|
latestMessage.createdAt,
|
|
483
|
+
{ db },
|
|
513
484
|
);
|
|
514
485
|
return {
|
|
515
486
|
latestAssistantMessageId: latestMessage.id,
|
|
@@ -498,6 +498,25 @@ export function parseMessageMetadata(
|
|
|
498
498
|
}
|
|
499
499
|
}
|
|
500
500
|
|
|
501
|
+
/**
|
|
502
|
+
* Rows a fork may copy: finalized ones. A `finalized = 0` row is mid-write,
|
|
503
|
+
* its content a `{ ref }` into the source turn's in-flight delta file, which
|
|
504
|
+
* the source deletes when the turn completes. A copied row would point at a
|
|
505
|
+
* file another conversation is about to delete, leaving a permanently empty
|
|
506
|
+
* message that reads as final and is invisible to crash recovery (which scans
|
|
507
|
+
* `finalized = 0` only). Unfinalized is not "unsent": the message was sent
|
|
508
|
+
* and is still being written, so there is no completed content to copy. A
|
|
509
|
+
* fork reflects the conversation at a completed point.
|
|
510
|
+
*
|
|
511
|
+
* Callers apply this to `messagesToCopy` itself, upstream of the boundary
|
|
512
|
+
* timestamp, compaction inheritance, `forkParentMessageId`, and the id map,
|
|
513
|
+
* so every derivation describes the rows actually copied and the lineage
|
|
514
|
+
* anchor can never reference a row the fork does not hold.
|
|
515
|
+
*/
|
|
516
|
+
function dropUnfinalizedRows(rows: MessageRow[]): MessageRow[] {
|
|
517
|
+
return rows.filter((message) => message.finalized === 1);
|
|
518
|
+
}
|
|
519
|
+
|
|
501
520
|
function cloneForkMessageMetadata(
|
|
502
521
|
metadata: string | null,
|
|
503
522
|
sourceMessageId: string,
|
|
@@ -1336,7 +1355,7 @@ export function forkConversation(params: {
|
|
|
1336
1355
|
|
|
1337
1356
|
const messagesToCopy =
|
|
1338
1357
|
copyBoundaryIndex >= 0
|
|
1339
|
-
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
1358
|
+
? dropUnfinalizedRows(sourceMessages.slice(0, copyBoundaryIndex + 1))
|
|
1340
1359
|
: ([] as MessageRow[]);
|
|
1341
1360
|
|
|
1342
1361
|
// Inherit the history-strip marker only when the fork boundary is at-or-
|
|
@@ -1461,7 +1480,13 @@ export function forkConversation(params: {
|
|
|
1461
1480
|
messagesToCopy,
|
|
1462
1481
|
forkedMessageIds,
|
|
1463
1482
|
latestForkedAssistant,
|
|
1464
|
-
|
|
1483
|
+
// The wholesale memory-state carry requires the fork's window to equal
|
|
1484
|
+
// the source's rendered window; a boundary at the tip no longer
|
|
1485
|
+
// guarantees that when the unfinalized filter dropped rows from the
|
|
1486
|
+
// slice, so both conditions gate it.
|
|
1487
|
+
isFullHistoryFork:
|
|
1488
|
+
copyBoundaryIndex === sourceMessages.length - 1 &&
|
|
1489
|
+
messagesToCopy.length === copyBoundaryIndex + 1,
|
|
1465
1490
|
inheritedCompactedMessageCount:
|
|
1466
1491
|
inheritedCompaction?.compactedMessageCount ?? 0,
|
|
1467
1492
|
diskSyncQueue,
|
|
@@ -1772,7 +1797,7 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1772
1797
|
);
|
|
1773
1798
|
const messagesToCopy =
|
|
1774
1799
|
copyBoundaryIndex >= 0
|
|
1775
|
-
? sourceMessages.slice(0, copyBoundaryIndex + 1)
|
|
1800
|
+
? dropUnfinalizedRows(sourceMessages.slice(0, copyBoundaryIndex + 1))
|
|
1776
1801
|
: ([] as MessageRow[]);
|
|
1777
1802
|
|
|
1778
1803
|
const sourceHistoryStrippedAt = sourceConversation.historyStrippedAt ?? null;
|
|
@@ -1936,8 +1961,12 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1936
1961
|
messagesToCopy: rowsToCopy,
|
|
1937
1962
|
forkedMessageIds,
|
|
1938
1963
|
latestForkedAssistant,
|
|
1964
|
+
// Both conditions, for the same reason as `forkConversation`:
|
|
1965
|
+
// a tip boundary no longer implies an equal window once the
|
|
1966
|
+
// unfinalized filter dropped rows from the slice.
|
|
1939
1967
|
isFullHistoryFork:
|
|
1940
|
-
copyBoundaryIndex === sourceMessages.length - 1
|
|
1968
|
+
copyBoundaryIndex === sourceMessages.length - 1 &&
|
|
1969
|
+
messagesToCopy.length === copyBoundaryIndex + 1,
|
|
1941
1970
|
// The copied range already starts at the visible window.
|
|
1942
1971
|
inheritedCompactedMessageCount: forkCompactedMessageCount,
|
|
1943
1972
|
skipCompactionLedgerCopy: inheritedCompaction != null,
|
|
@@ -184,6 +184,14 @@ export function isSingleSegmentLineage(segments: LineageSegment[]): boolean {
|
|
|
184
184
|
* strictly-earlier `createdAt`, or an equal `createdAt` with an id that does
|
|
185
185
|
* not sort after the bound. The fork message itself is included, because a
|
|
186
186
|
* fork is taken THROUGH that message.
|
|
187
|
+
*
|
|
188
|
+
* Ancestor segments additionally exclude unfinalized rows. An ancestor's
|
|
189
|
+
* `finalized = 0` row is a message its own live turn is still writing; a
|
|
190
|
+
* descendant reading it would see partial content that the ancestor rewrites
|
|
191
|
+
* inline when the turn completes. The row enters the window on its own once
|
|
192
|
+
* it finalizes. A segment with no bound is the conversation's own tail and
|
|
193
|
+
* keeps its unfinalized rows: a conversation always sees its own in-flight
|
|
194
|
+
* message.
|
|
187
195
|
*/
|
|
188
196
|
export function lineageMessageFilter(segments: LineageSegment[]): SQL {
|
|
189
197
|
const clauses = segments.map((segment) => {
|
|
@@ -194,6 +202,7 @@ export function lineageMessageFilter(segments: LineageSegment[]): SQL {
|
|
|
194
202
|
const { createdAt, id } = segment.through;
|
|
195
203
|
return and(
|
|
196
204
|
owner,
|
|
205
|
+
eq(messages.finalized, 1),
|
|
197
206
|
or(
|
|
198
207
|
lt(messages.createdAt, createdAt),
|
|
199
208
|
and(
|