@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
|
@@ -55,14 +55,11 @@ const CredentialPromptParams = z.object({
|
|
|
55
55
|
*
|
|
56
56
|
* The prompt blocks until the user answers, so by the time a caller reads the
|
|
57
57
|
* result the secure input is already gone from the UI. A bare `ok: true` reads
|
|
58
|
-
* as "the prompt opened successfully", which
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* that never reappears, and the flow loops. State the close explicitly so the
|
|
62
|
-
* only available reading is the correct one.
|
|
58
|
+
* as "the prompt opened successfully", which invites a follow-up telling the
|
|
59
|
+
* user to paste into a surface that has already closed. Stating the close
|
|
60
|
+
* leaves only the correct reading.
|
|
63
61
|
*/
|
|
64
|
-
const PROMPT_CLOSED_NOTICE =
|
|
65
|
-
"The secure prompt has closed — do not ask the user to enter this value again.";
|
|
62
|
+
const PROMPT_CLOSED_NOTICE = "The secure prompt has closed.";
|
|
66
63
|
|
|
67
64
|
export type CredentialPromptResult = {
|
|
68
65
|
ok: boolean;
|
|
@@ -16,22 +16,13 @@
|
|
|
16
16
|
|
|
17
17
|
import { z } from "zod";
|
|
18
18
|
|
|
19
|
-
import {
|
|
20
|
-
ACP_SERVICE,
|
|
21
|
-
AcpCredentialFormatError,
|
|
22
|
-
assertAcpCredentialFormat,
|
|
23
|
-
} from "../../acp/acp-credentials.js";
|
|
19
|
+
import { AcpCredentialFormatError } from "../../acp/acp-credentials.js";
|
|
24
20
|
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
25
21
|
import {
|
|
26
22
|
fetchManagedCatalog,
|
|
27
23
|
type ManagedCredentialDescriptor,
|
|
28
24
|
} from "../../credential-execution/managed-catalog.js";
|
|
29
25
|
import { buildForChatSentinel } from "../../daemon/chat-credential-redaction.js";
|
|
30
|
-
import {
|
|
31
|
-
isNonSecretPlatformField,
|
|
32
|
-
scrubStoredCredentialFromTranscripts,
|
|
33
|
-
} from "../../daemon/credential-transcript-scrub.js";
|
|
34
|
-
import { syncManualTokenConnection } from "../../oauth/manual-token-connection.js";
|
|
35
26
|
import {
|
|
36
27
|
disconnectOAuthProvider,
|
|
37
28
|
getConnectionByProvider,
|
|
@@ -39,14 +30,11 @@ import {
|
|
|
39
30
|
type OAuthConnectionRow,
|
|
40
31
|
} from "../../oauth/oauth-store.js";
|
|
41
32
|
import { credentialKey } from "../../security/credential-key.js";
|
|
42
|
-
import { normalizeSecretValue } from "../../security/secret-normalize.js";
|
|
43
33
|
import {
|
|
44
34
|
deleteSecureKeyAsync,
|
|
45
35
|
getActiveBackendInfoAsync,
|
|
46
|
-
getActiveBackendName,
|
|
47
36
|
getSecureKeyAsync,
|
|
48
37
|
getSecureKeyResultAsync,
|
|
49
|
-
setSecureKeyAsync,
|
|
50
38
|
} from "../../security/secure-keys.js";
|
|
51
39
|
import {
|
|
52
40
|
assertMetadataWritable,
|
|
@@ -55,10 +43,13 @@ import {
|
|
|
55
43
|
getCredentialMetadata,
|
|
56
44
|
getCredentialMetadataById,
|
|
57
45
|
listCredentialMetadata,
|
|
58
|
-
upsertCredentialMetadata,
|
|
59
46
|
} from "../../tools/credentials/metadata-store.js";
|
|
60
47
|
import type { CredentialInjectionTemplate } from "../../tools/credentials/policy-types.js";
|
|
61
|
-
import {
|
|
48
|
+
import {
|
|
49
|
+
CredentialStorageError,
|
|
50
|
+
InvalidCredentialInputError,
|
|
51
|
+
storeCredentialValue,
|
|
52
|
+
} from "../../tools/credentials/store.js";
|
|
62
53
|
import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
|
|
63
54
|
import { recordForChatMint } from "../for-chat-mint-registry.js";
|
|
64
55
|
import { recordRevealSuccess } from "../reveal-success-registry.js";
|
|
@@ -66,8 +57,6 @@ import { InjectionTemplateSchema } from "./credential-prompt-routes.js";
|
|
|
66
57
|
import { BadRequestError, InternalError } from "./errors.js";
|
|
67
58
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
68
59
|
|
|
69
|
-
const log = getLogger("credential-routes");
|
|
70
|
-
|
|
71
60
|
// ---------------------------------------------------------------------------
|
|
72
61
|
// Shared helpers
|
|
73
62
|
// ---------------------------------------------------------------------------
|
|
@@ -458,74 +447,29 @@ async function handleCredentialsSet({ body }: RouteHandlerArgs) {
|
|
|
458
447
|
throw new BadRequestError("value is required");
|
|
459
448
|
}
|
|
460
449
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
450
|
+
try {
|
|
451
|
+
return await storeCredentialValue({
|
|
452
|
+
service,
|
|
453
|
+
field,
|
|
454
|
+
value,
|
|
455
|
+
alias: label,
|
|
456
|
+
usageDescription: description,
|
|
457
|
+
allowedTools,
|
|
458
|
+
allowedDomains,
|
|
459
|
+
injectionTemplates,
|
|
460
|
+
});
|
|
461
|
+
} catch (err) {
|
|
462
|
+
if (
|
|
463
|
+
err instanceof InvalidCredentialInputError ||
|
|
464
|
+
err instanceof AcpCredentialFormatError
|
|
465
|
+
) {
|
|
466
|
+
throw new BadRequestError(err.message);
|
|
476
467
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
assertMetadataWritable();
|
|
480
|
-
|
|
481
|
-
const key = credentialKey(service, field);
|
|
482
|
-
const stored = await setSecureKeyAsync(key, normalizedValue);
|
|
483
|
-
if (!stored) {
|
|
484
|
-
throw new InternalError(
|
|
485
|
-
`Failed to store credential in secure storage (backend: ${getActiveBackendName()})`,
|
|
486
|
-
);
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// The stored plaintext may already sit in recent transcripts: the user
|
|
490
|
-
// message that pasted it, the persisted tool_use input, the tool result
|
|
491
|
-
// echoing the command. This route is the scrub seam — not
|
|
492
|
-
// setSecureKeyAsync, which also fires on OAuth refresh rotations and MCP
|
|
493
|
-
// header writes whose values never transited a transcript. The scrub runs
|
|
494
|
-
// immediately after the secure-store write, BEFORE the metadata upsert and
|
|
495
|
-
// connection sync: those side effects can throw (oauth-store work), and a
|
|
496
|
-
// stored-but-unscrubbed secret must not depend on them succeeding. The
|
|
497
|
-
// credential IS stored at this point; the scrub is best-effort hygiene and
|
|
498
|
-
// must stay invisible to the caller.
|
|
499
|
-
if (!isNonSecretPlatformField(service, field)) {
|
|
500
|
-
try {
|
|
501
|
-
const scrubbed =
|
|
502
|
-
await scrubStoredCredentialFromTranscripts(normalizedValue);
|
|
503
|
-
log.info(
|
|
504
|
-
{ service, field, ...scrubbed },
|
|
505
|
-
"Credential stored; scrubbed value from recent transcripts",
|
|
506
|
-
);
|
|
507
|
-
} catch (err) {
|
|
508
|
-
log.warn(
|
|
509
|
-
{ err, service, field },
|
|
510
|
-
"Credential stored, but transcript scrub failed",
|
|
511
|
-
);
|
|
468
|
+
if (err instanceof CredentialStorageError) {
|
|
469
|
+
throw new InternalError(err.message);
|
|
512
470
|
}
|
|
471
|
+
throw err;
|
|
513
472
|
}
|
|
514
|
-
|
|
515
|
-
const metadata = upsertCredentialMetadata(service, field, {
|
|
516
|
-
alias: label,
|
|
517
|
-
usageDescription: description,
|
|
518
|
-
allowedTools,
|
|
519
|
-
allowedDomains,
|
|
520
|
-
injectionTemplates,
|
|
521
|
-
});
|
|
522
|
-
await syncManualTokenConnection(service);
|
|
523
|
-
|
|
524
|
-
return {
|
|
525
|
-
credentialId: metadata.credentialId,
|
|
526
|
-
service,
|
|
527
|
-
field,
|
|
528
|
-
};
|
|
529
473
|
}
|
|
530
474
|
|
|
531
475
|
async function handleCredentialsDelete({ body }: RouteHandlerArgs) {
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
DEFAULT_PROVIDER_CHOICES,
|
|
26
26
|
DefaultProviderSchema,
|
|
27
27
|
} from "../../config/schemas/llm.js";
|
|
28
|
+
import { ROUTING_IDENTITY_PROVIDERS } from "../../providers/inference/auth.js";
|
|
28
29
|
import {
|
|
29
30
|
computeConnectionAvailability,
|
|
30
31
|
CONNECTION_AVAILABILITY_STATUSES,
|
|
@@ -93,6 +94,20 @@ async function handlePutDefaultProvider({
|
|
|
93
94
|
)}; "connectionName" is optional and must be a non-empty string.`,
|
|
94
95
|
);
|
|
95
96
|
}
|
|
97
|
+
// Routing identities dispatch through their canonical row regardless of
|
|
98
|
+
// any stored pin (`resolveRoutingIdentity`), so a noncanonical
|
|
99
|
+
// connectionName would be judged by availability and the deletion guards
|
|
100
|
+
// while inference uses a different row. Reject it here rather than
|
|
101
|
+
// persisting a pin that status and dispatch disagree about.
|
|
102
|
+
const { provider, connectionName } = result.data;
|
|
103
|
+
if (connectionName != null && ROUTING_IDENTITY_PROVIDERS.has(provider)) {
|
|
104
|
+
const canonical = resolveDefaultConnectionName({ provider });
|
|
105
|
+
if (connectionName !== canonical) {
|
|
106
|
+
throw new BadRequestError(
|
|
107
|
+
`Provider "${provider}" always dispatches through its canonical connection "${canonical}". Omit "connectionName" or pass "${canonical}".`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
96
111
|
setDefaultProvider(result.data);
|
|
97
112
|
return handleGetDefaultProvider();
|
|
98
113
|
}
|
|
@@ -4,20 +4,12 @@
|
|
|
4
4
|
* Exposes document CRUD over HTTP, sharing business logic with the
|
|
5
5
|
* handlers in `daemon/handlers/documents.ts`.
|
|
6
6
|
*/
|
|
7
|
-
import { randomUUID } from "node:crypto";
|
|
8
|
-
import { readFileSync, statSync } from "node:fs";
|
|
9
|
-
import { basename, extname } from "node:path";
|
|
10
|
-
|
|
11
7
|
import { z } from "zod";
|
|
12
8
|
|
|
13
9
|
import {
|
|
14
10
|
addDocumentConversation,
|
|
15
|
-
createFileBackedDocument,
|
|
16
11
|
getDocumentById,
|
|
17
|
-
getDocumentByWorkspacePath,
|
|
18
12
|
getDocumentsForConversation,
|
|
19
|
-
isDocumentAssociatedWithConversation,
|
|
20
|
-
refreshDocumentContentFromFile,
|
|
21
13
|
saveDocument,
|
|
22
14
|
} from "../../documents/document-store.js";
|
|
23
15
|
import { rawAll } from "../../persistence/raw-query.js";
|
|
@@ -28,18 +20,9 @@ import {
|
|
|
28
20
|
publishDocumentsChanged,
|
|
29
21
|
} from "../sync/resource-sync-events.js";
|
|
30
22
|
import { renderMarkdownToPDF } from "./document-pdf-renderer.js";
|
|
31
|
-
import {
|
|
32
|
-
|
|
33
|
-
InternalError,
|
|
34
|
-
NotFoundError,
|
|
35
|
-
UnprocessableEntityError,
|
|
36
|
-
} from "./errors.js";
|
|
37
|
-
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
23
|
+
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
24
|
+
import type { RouteDefinition } from "./types.js";
|
|
38
25
|
import { RouteResponse } from "./types.js";
|
|
39
|
-
import {
|
|
40
|
-
resolveWorkspacePath,
|
|
41
|
-
toWorkspaceRelativePath,
|
|
42
|
-
} from "./workspace-utils.js";
|
|
43
26
|
|
|
44
27
|
const log = getLogger("documents-routes");
|
|
45
28
|
|
|
@@ -85,14 +68,7 @@ function listAllDocuments(): Array<{
|
|
|
85
68
|
}
|
|
86
69
|
}
|
|
87
70
|
|
|
88
|
-
|
|
89
|
-
// File-backed documents
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
|
|
92
|
-
/** Extensions the document editor round-trips faithfully as markdown. */
|
|
93
|
-
const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown"]);
|
|
94
|
-
|
|
95
|
-
/** The document payload shape shared by `GET documents/{id}` and its siblings. */
|
|
71
|
+
/** The document payload shape returned by `GET documents/{id}`. */
|
|
96
72
|
const documentPayloadSchema = z.object({
|
|
97
73
|
success: z.boolean(),
|
|
98
74
|
surfaceId: z.string(),
|
|
@@ -102,173 +78,8 @@ const documentPayloadSchema = z.object({
|
|
|
102
78
|
wordCount: z.number(),
|
|
103
79
|
createdAt: z.number(),
|
|
104
80
|
updatedAt: z.number(),
|
|
105
|
-
workspacePath: z
|
|
106
|
-
.string()
|
|
107
|
-
.nullable()
|
|
108
|
-
.describe("Workspace-relative file this document is bound to, or null"),
|
|
109
81
|
});
|
|
110
82
|
|
|
111
|
-
/**
|
|
112
|
-
* Resolve a client-supplied workspace path to the markdown file it names.
|
|
113
|
-
*
|
|
114
|
-
* Uses the same resolution as the workspace file routes, so a path that
|
|
115
|
-
* escapes the workspace (traversal, absolute, symlinked out, dot-segment) is
|
|
116
|
-
* rejected here exactly as it would be there.
|
|
117
|
-
*/
|
|
118
|
-
function resolveWorkspaceMarkdownFile(path: string): {
|
|
119
|
-
absolutePath: string;
|
|
120
|
-
relativePath: string;
|
|
121
|
-
} {
|
|
122
|
-
const resolved = resolveWorkspacePath(path);
|
|
123
|
-
if (resolved === undefined) {
|
|
124
|
-
throw new BadRequestError("Invalid path");
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (!MARKDOWN_EXTENSIONS.has(extname(resolved).toLowerCase())) {
|
|
128
|
-
throw new UnprocessableEntityError(
|
|
129
|
-
"Only markdown files (.md, .markdown) can back a document",
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
absolutePath: resolved,
|
|
135
|
-
relativePath: toWorkspaceRelativePath(resolved),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** Current text of a workspace file, or `null` when it is gone or not a file. */
|
|
140
|
-
function readWorkspaceFileText(absolutePath: string): string | null {
|
|
141
|
-
try {
|
|
142
|
-
if (!statSync(absolutePath).isFile()) {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
return readFileSync(absolutePath, "utf-8");
|
|
146
|
-
} catch {
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/** Load a document by surface ID for a response, or fail loudly if it vanished. */
|
|
152
|
-
function loadDocumentPayload(surfaceId: string): Record<string, unknown> {
|
|
153
|
-
const doc = getDocumentById(surfaceId);
|
|
154
|
-
if (!doc) {
|
|
155
|
-
throw new InternalError("Document could not be loaded after persisting");
|
|
156
|
-
}
|
|
157
|
-
return { success: true, ...doc };
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Find or create the document bound to a workspace markdown file.
|
|
162
|
-
*
|
|
163
|
-
* The file is the source of truth at open time: when a bound document's stored
|
|
164
|
-
* content has drifted from the bytes on disk (the file was edited outside the
|
|
165
|
-
* editor), the row is refreshed from the file before it is returned. Writes go
|
|
166
|
-
* the other way — the document store writes through to the file.
|
|
167
|
-
*
|
|
168
|
-
* The publishes here carry no origin client id on purpose. The only caller,
|
|
169
|
-
* `viewer-store.loadWorkspaceFileDocument`, opens the file and never
|
|
170
|
-
* invalidates its own document queries, so the client that creates the row is
|
|
171
|
-
* the one that most needs to hear about it: suppressing its own echo would
|
|
172
|
-
* leave its assets pill and Library without the document it just opened.
|
|
173
|
-
*/
|
|
174
|
-
function handleDocumentForWorkspaceFile({
|
|
175
|
-
body,
|
|
176
|
-
}: RouteHandlerArgs): Record<string, unknown> {
|
|
177
|
-
const { path, conversationId } = (body ?? {}) as {
|
|
178
|
-
path?: string;
|
|
179
|
-
conversationId?: string;
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
if (!path || typeof path !== "string") {
|
|
183
|
-
throw new BadRequestError("path is required");
|
|
184
|
-
}
|
|
185
|
-
if (!conversationId || typeof conversationId !== "string") {
|
|
186
|
-
throw new BadRequestError("conversationId is required");
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const { absolutePath, relativePath } = resolveWorkspaceMarkdownFile(path);
|
|
190
|
-
const existing = getDocumentByWorkspacePath(relativePath);
|
|
191
|
-
const fileText = readWorkspaceFileText(absolutePath);
|
|
192
|
-
|
|
193
|
-
if (fileText === null) {
|
|
194
|
-
// A bound document whose file is gone is reported distinctly: the client
|
|
195
|
-
// needs to tell "this file was deleted" apart from "no such file", and the
|
|
196
|
-
// document must never be used to resurrect the file.
|
|
197
|
-
if (existing) {
|
|
198
|
-
throw new NotFoundError(
|
|
199
|
-
`The file backing this document no longer exists: ${relativePath}`,
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
throw new NotFoundError("File not found");
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (existing) {
|
|
206
|
-
// Opening the file from another conversation grants that conversation
|
|
207
|
-
// access, the same association the link route writes.
|
|
208
|
-
const alreadyLinked = isDocumentAssociatedWithConversation(
|
|
209
|
-
existing.surfaceId,
|
|
210
|
-
conversationId,
|
|
211
|
-
);
|
|
212
|
-
addDocumentConversation(existing.surfaceId, conversationId);
|
|
213
|
-
|
|
214
|
-
let refreshed = false;
|
|
215
|
-
if (existing.content !== fileText) {
|
|
216
|
-
const refresh = refreshDocumentContentFromFile(
|
|
217
|
-
existing.surfaceId,
|
|
218
|
-
fileText,
|
|
219
|
-
);
|
|
220
|
-
if (!refresh.success) {
|
|
221
|
-
throw new InternalError(refresh.error);
|
|
222
|
-
}
|
|
223
|
-
refreshed = true;
|
|
224
|
-
log.info(
|
|
225
|
-
{ surfaceId: existing.surfaceId, workspacePath: relativePath },
|
|
226
|
-
"Refreshed file-backed document from disk",
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Reopening an unchanged, already-linked file writes nothing, so it must
|
|
231
|
-
// not invalidate every client's document list on each open.
|
|
232
|
-
if (!alreadyLinked || refreshed) {
|
|
233
|
-
publishDocumentsChanged();
|
|
234
|
-
}
|
|
235
|
-
return loadDocumentPayload(existing.surfaceId);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const surfaceId = `doc-${randomUUID()}`;
|
|
239
|
-
const created = createFileBackedDocument({
|
|
240
|
-
surfaceId,
|
|
241
|
-
conversationId,
|
|
242
|
-
title: basename(relativePath),
|
|
243
|
-
content: fileText,
|
|
244
|
-
workspacePath: relativePath,
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
if (!created.success) {
|
|
248
|
-
// A concurrent request may have won the unique index on workspace_path.
|
|
249
|
-
const raced = getDocumentByWorkspacePath(relativePath);
|
|
250
|
-
if (!raced) {
|
|
251
|
-
throw new InternalError(created.error);
|
|
252
|
-
}
|
|
253
|
-
const racedAlreadyLinked = isDocumentAssociatedWithConversation(
|
|
254
|
-
raced.surfaceId,
|
|
255
|
-
conversationId,
|
|
256
|
-
);
|
|
257
|
-
addDocumentConversation(raced.surfaceId, conversationId);
|
|
258
|
-
if (!racedAlreadyLinked) {
|
|
259
|
-
publishDocumentsChanged();
|
|
260
|
-
}
|
|
261
|
-
return loadDocumentPayload(raced.surfaceId);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
log.info(
|
|
265
|
-
{ surfaceId, workspacePath: relativePath, conversationId },
|
|
266
|
-
"Bound workspace file to a new document",
|
|
267
|
-
);
|
|
268
|
-
publishDocumentsChanged();
|
|
269
|
-
return loadDocumentPayload(surfaceId);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
83
|
// ---------------------------------------------------------------------------
|
|
273
84
|
// Route definitions
|
|
274
85
|
// ---------------------------------------------------------------------------
|
|
@@ -403,36 +214,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
403
214
|
},
|
|
404
215
|
},
|
|
405
216
|
|
|
406
|
-
{
|
|
407
|
-
operationId: "documentForWorkspaceFile",
|
|
408
|
-
endpoint: "documents/for-workspace-file",
|
|
409
|
-
method: "POST",
|
|
410
|
-
policy: {
|
|
411
|
-
requiredScopes: ["settings.write"],
|
|
412
|
-
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
413
|
-
},
|
|
414
|
-
summary: "Get or create the document for a workspace markdown file",
|
|
415
|
-
description:
|
|
416
|
-
"Return the document bound to a workspace markdown file, creating it on " +
|
|
417
|
-
"first open. The file is the source of truth at open time: stored " +
|
|
418
|
-
"content that has drifted from the file is refreshed from disk before " +
|
|
419
|
-
"the document is returned.",
|
|
420
|
-
tags: ["documents"],
|
|
421
|
-
requestBody: z.object({
|
|
422
|
-
path: z
|
|
423
|
-
.string()
|
|
424
|
-
.describe("Workspace-relative path to a .md/.markdown file"),
|
|
425
|
-
conversationId: z
|
|
426
|
-
.string()
|
|
427
|
-
.describe("Conversation the document is opened from"),
|
|
428
|
-
}),
|
|
429
|
-
responseBody: documentPayloadSchema,
|
|
430
|
-
additionalResponses: {
|
|
431
|
-
"422": { description: "Path is not a markdown file" },
|
|
432
|
-
},
|
|
433
|
-
handler: handleDocumentForWorkspaceFile,
|
|
434
|
-
},
|
|
435
|
-
|
|
436
217
|
{
|
|
437
218
|
operationId: "linkDocumentConversation",
|
|
438
219
|
endpoint: "documents/:id/conversations",
|
|
@@ -101,7 +101,6 @@ import {
|
|
|
101
101
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
102
102
|
import { deliverChannelReply } from "../gateway-client.js";
|
|
103
103
|
import { trustContextFromVerdict } from "../trust-verdict-consumer.js";
|
|
104
|
-
import { canonicalChannelAssistantId } from "./channel-route-shared.js";
|
|
105
104
|
import { BadRequestError } from "./errors.js";
|
|
106
105
|
import { handleApprovalInterception } from "./guardian-approval-interception.js";
|
|
107
106
|
import {
|
|
@@ -371,16 +370,6 @@ export async function handleChannelInbound({
|
|
|
371
370
|
throw new BadRequestError("content or attachmentIds is required");
|
|
372
371
|
}
|
|
373
372
|
|
|
374
|
-
// Canonicalize the assistant ID so all DB-facing operations use the
|
|
375
|
-
// consistent 'self' key regardless of what the gateway sent.
|
|
376
|
-
const canonicalAssistantId = canonicalChannelAssistantId(assistantId);
|
|
377
|
-
if (canonicalAssistantId !== assistantId) {
|
|
378
|
-
log.debug(
|
|
379
|
-
{ raw: assistantId, canonical: canonicalAssistantId },
|
|
380
|
-
"Canonicalized channel assistant ID",
|
|
381
|
-
);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
373
|
// Coerce actorExternalId to a string at the boundary — the field
|
|
385
374
|
// comes from unvalidated JSON and may be a number, object, or other
|
|
386
375
|
// non-string type. Non-string truthy values would throw inside
|
|
@@ -428,9 +417,10 @@ export async function handleChannelInbound({
|
|
|
428
417
|
// 👍 never triggers a verification handshake or an access-request
|
|
429
418
|
// notification, and a stranger's reaction creates no conversation/binding.
|
|
430
419
|
// The interceptor drops strangers, records known contacts' reactions as
|
|
431
|
-
// transcript signals
|
|
432
|
-
//
|
|
433
|
-
// agent
|
|
420
|
+
// transcript signals in the conversation of the reacted message, and routes
|
|
421
|
+
// a guardian's reaction on an approval card through the guardian decision
|
|
422
|
+
// pipeline. Reactions never mint a conversation and never drive an agent
|
|
423
|
+
// turn.
|
|
434
424
|
if (isSlackReactionEvent(body)) {
|
|
435
425
|
return handleSlackReactionIntercept({
|
|
436
426
|
callbackData: body.callbackData!,
|
|
@@ -438,14 +428,12 @@ export async function handleChannelInbound({
|
|
|
438
428
|
sourceInterface,
|
|
439
429
|
conversationExternalId,
|
|
440
430
|
externalMessageId,
|
|
441
|
-
canonicalAssistantId,
|
|
442
431
|
rawSenderId,
|
|
443
432
|
canonicalSenderId,
|
|
444
433
|
actorDisplayName: body.actorDisplayName,
|
|
445
434
|
actorUsername: body.actorUsername,
|
|
446
435
|
replyCallbackUrl: body.replyCallbackUrl,
|
|
447
436
|
sourceMetadata: body.sourceMetadata,
|
|
448
|
-
slackChannelName,
|
|
449
437
|
approvalConversationGenerator,
|
|
450
438
|
});
|
|
451
439
|
}
|
|
@@ -486,7 +474,6 @@ export async function handleChannelInbound({
|
|
|
486
474
|
rawSenderId,
|
|
487
475
|
sourceChannel,
|
|
488
476
|
conversationExternalId,
|
|
489
|
-
canonicalAssistantId,
|
|
490
477
|
trimmedContent,
|
|
491
478
|
sourceMetadata: body.sourceMetadata,
|
|
492
479
|
actorDisplayName: body.actorDisplayName,
|
|
@@ -709,7 +696,6 @@ export async function handleChannelInbound({
|
|
|
709
696
|
externalMessageId,
|
|
710
697
|
sourceMessageId,
|
|
711
698
|
sourceThreadId: channelThreadId,
|
|
712
|
-
canonicalAssistantId,
|
|
713
699
|
assistantId,
|
|
714
700
|
content,
|
|
715
701
|
channelId: resolvedMember?.channelId,
|
|
@@ -723,28 +709,24 @@ export async function handleChannelInbound({
|
|
|
723
709
|
externalMessageId,
|
|
724
710
|
{
|
|
725
711
|
sourceMessageId,
|
|
726
|
-
assistantId: canonicalAssistantId,
|
|
727
712
|
sourceThreadId: channelThreadId,
|
|
728
713
|
},
|
|
729
714
|
);
|
|
730
715
|
|
|
731
716
|
const replyCallbackUrl = body.replyCallbackUrl;
|
|
732
717
|
|
|
733
|
-
// external_conversation_bindings is assistant-agnostic
|
|
734
|
-
//
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
username: body.actorUsername ?? null,
|
|
746
|
-
});
|
|
747
|
-
}
|
|
718
|
+
// `external_conversation_bindings` is assistant-agnostic: one row per chat,
|
|
719
|
+
// whichever caller writes it.
|
|
720
|
+
upsertBinding({
|
|
721
|
+
conversationId: result.conversationId,
|
|
722
|
+
sourceChannel,
|
|
723
|
+
externalChatId: conversationExternalId,
|
|
724
|
+
externalChatName: slackChannelName,
|
|
725
|
+
externalThreadId: channelThreadId ?? null,
|
|
726
|
+
externalUserId: canonicalSenderId ?? rawSenderId ?? null,
|
|
727
|
+
displayName: body.actorDisplayName ?? null,
|
|
728
|
+
username: body.actorUsername ?? null,
|
|
729
|
+
});
|
|
748
730
|
|
|
749
731
|
// ── Actor role resolution ──
|
|
750
732
|
// Built from the gateway-stamped trust verdict (ACL + identity). An absent
|
|
@@ -844,7 +826,6 @@ export async function handleChannelInbound({
|
|
|
844
826
|
if (isCallbackInteraction) {
|
|
845
827
|
if (floorSenderId) {
|
|
846
828
|
handshakeInProgress = await isApprovalHandshakeInProgress({
|
|
847
|
-
canonicalAssistantId,
|
|
848
829
|
sourceChannel,
|
|
849
830
|
actorExternalId: floorSenderId,
|
|
850
831
|
});
|
|
@@ -852,7 +833,6 @@ export async function handleChannelInbound({
|
|
|
852
833
|
} else {
|
|
853
834
|
try {
|
|
854
835
|
const accessResult = await notifyGuardianOfAccessRequest({
|
|
855
|
-
canonicalAssistantId,
|
|
856
836
|
sourceChannel,
|
|
857
837
|
conversationExternalId,
|
|
858
838
|
actorExternalId: floorSenderId,
|
|
@@ -925,7 +905,7 @@ export async function handleChannelInbound({
|
|
|
925
905
|
const replyPayload: Parameters<typeof deliverChannelReply>[1] = {
|
|
926
906
|
chatId: conversationExternalId,
|
|
927
907
|
text: replyText,
|
|
928
|
-
assistantId:
|
|
908
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
929
909
|
};
|
|
930
910
|
if (sourceChannel === "slack" && (canonicalSenderId ?? rawSenderId)) {
|
|
931
911
|
replyPayload.ephemeral = true;
|
|
@@ -987,7 +967,7 @@ export async function handleChannelInbound({
|
|
|
987
967
|
const replyPayload: Parameters<typeof deliverChannelReply>[1] = {
|
|
988
968
|
chatId: conversationExternalId,
|
|
989
969
|
text: DISK_PRESSURE_REMOTE_BLOCK_REPLY,
|
|
990
|
-
assistantId:
|
|
970
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
991
971
|
};
|
|
992
972
|
if (sourceChannel === "slack" && (canonicalSenderId ?? rawSenderId)) {
|
|
993
973
|
replyPayload.ephemeral = true;
|
|
@@ -1059,7 +1039,6 @@ export async function handleChannelInbound({
|
|
|
1059
1039
|
isDuplicate: result.duplicate,
|
|
1060
1040
|
commandIntent,
|
|
1061
1041
|
rawSenderId,
|
|
1062
|
-
canonicalAssistantId,
|
|
1063
1042
|
sourceChannel,
|
|
1064
1043
|
conversationExternalId,
|
|
1065
1044
|
eventId: result.eventId,
|
|
@@ -1081,7 +1060,6 @@ export async function handleChannelInbound({
|
|
|
1081
1060
|
callbackData: body.callbackData,
|
|
1082
1061
|
rawSenderId,
|
|
1083
1062
|
canonicalSenderId,
|
|
1084
|
-
canonicalAssistantId,
|
|
1085
1063
|
sourceChannel,
|
|
1086
1064
|
conversationExternalId,
|
|
1087
1065
|
conversationId: result.conversationId,
|
|
@@ -1123,7 +1101,7 @@ export async function handleChannelInbound({
|
|
|
1123
1101
|
actorExternalId: canonicalSenderId ?? rawSenderId,
|
|
1124
1102
|
replyCallbackUrl,
|
|
1125
1103
|
trustCtx,
|
|
1126
|
-
assistantId:
|
|
1104
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
1127
1105
|
approvalCopyGenerator,
|
|
1128
1106
|
approvalConversationGenerator,
|
|
1129
1107
|
approvalMessageTs,
|
|
@@ -1219,7 +1197,7 @@ export async function handleChannelInbound({
|
|
|
1219
1197
|
chatId: conversationExternalId,
|
|
1220
1198
|
text: "This approval request has been resolved.",
|
|
1221
1199
|
messageTs: approvalMessageTs,
|
|
1222
|
-
assistantId:
|
|
1200
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
1223
1201
|
}).catch((err) => {
|
|
1224
1202
|
log.error(
|
|
1225
1203
|
{ err, conversationId: result.conversationId },
|
|
@@ -1255,7 +1233,6 @@ export async function handleChannelInbound({
|
|
|
1255
1233
|
actorUsername: body.actorUsername,
|
|
1256
1234
|
trustCtx,
|
|
1257
1235
|
replyCallbackUrl,
|
|
1258
|
-
canonicalAssistantId,
|
|
1259
1236
|
});
|
|
1260
1237
|
|
|
1261
1238
|
if (ingressResult.blocked) {
|
|
@@ -1296,7 +1273,6 @@ export async function handleChannelInbound({
|
|
|
1296
1273
|
const admittedSenderId = canonicalSenderId ?? rawSenderId;
|
|
1297
1274
|
if (admittedSenderId) {
|
|
1298
1275
|
void maybeNotifyGuardianOfAdmittedContact({
|
|
1299
|
-
canonicalAssistantId,
|
|
1300
1276
|
sourceChannel,
|
|
1301
1277
|
conversationExternalId,
|
|
1302
1278
|
actorExternalId: admittedSenderId,
|
|
@@ -1497,7 +1473,7 @@ export async function handleChannelInbound({
|
|
|
1497
1473
|
commandIntent,
|
|
1498
1474
|
sourceLanguageCode,
|
|
1499
1475
|
replyCallbackUrl,
|
|
1500
|
-
assistantId:
|
|
1476
|
+
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
1501
1477
|
approvalCopyGenerator,
|
|
1502
1478
|
chatType: sourceChatType,
|
|
1503
1479
|
clientTimezone: inboundClientTimezone,
|