@vellumai/assistant 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +6 -7
- package/Dockerfile +1 -0
- package/README.md +2 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
- package/bun.lock +3 -0
- package/docs/architecture/security.md +18 -16
- package/knip.json +1 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/openapi.yaml +294 -107
- package/package.json +4 -2
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +6 -17
- package/src/__tests__/assistant-event-hub.test.ts +126 -77
- package/src/__tests__/assistant-event.test.ts +0 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
- package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
- package/src/__tests__/background-shell-host-bash.test.ts +34 -43
- package/src/__tests__/call-controller.test.ts +1 -1
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/checker.test.ts +20 -34
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-watcher.test.ts +12 -0
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-lifecycle.test.ts +4 -4
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
- package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -4
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/cu-unified-flow.test.ts +33 -16
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +4 -1
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +289 -7
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-bash-proxy.test.ts +46 -122
- package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
- package/src/__tests__/host-browser-proxy.test.ts +111 -185
- package/src/__tests__/host-browser-routes.test.ts +45 -75
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
- package/src/__tests__/host-cu-proxy.test.ts +56 -111
- package/src/__tests__/host-file-proxy.test.ts +44 -98
- package/src/__tests__/host-file-read-tool.test.ts +42 -21
- package/src/__tests__/host-shell-tool.test.ts +33 -68
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy.test.ts +43 -53
- package/src/__tests__/http-user-message-parity.test.ts +0 -6
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -66
- package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +66 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
- package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +331 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -22
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +3 -12
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +0 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +9 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt.test.ts +115 -13
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor.test.ts +12 -19
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/backup-worker.test.ts +36 -8
- package/src/backup/__tests__/paths.test.ts +2 -2
- package/src/backup/__tests__/restore.test.ts +45 -28
- package/src/backup/backup-worker.ts +36 -2
- package/src/backup/paths.ts +9 -6
- package/src/browser-session/events.ts +0 -9
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +0 -24
- package/src/calls/twilio-rest.ts +0 -38
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +1 -36
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/backup.ts +4 -4
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +63 -5
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +231 -76
- package/src/cli/commands/keys.ts +4 -1
- package/src/cli/commands/memory-v2.ts +24 -52
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +14 -0
- package/src/cli/program.ts +2 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
- package/src/config/env-registry.ts +12 -2
- package/src/config/env.ts +3 -14
- package/src/config/feature-flag-registry.json +30 -30
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +3 -3
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -5
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +31 -3
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +9 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +6 -6
- package/src/config/schemas/skills.ts +5 -5
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -17
- package/src/contacts/contacts-write.ts +1 -105
- package/src/context/window-manager.ts +44 -5
- package/src/credential-execution/process-manager.ts +34 -10
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
- package/src/daemon/conversation-agent-loop.ts +277 -36
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +83 -163
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +22 -28
- package/src/daemon/conversation-tool-setup.ts +3 -33
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +117 -233
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +23 -71
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-bash-proxy.ts +67 -45
- package/src/daemon/host-browser-proxy.ts +65 -27
- package/src/daemon/host-cu-proxy.ts +40 -39
- package/src/daemon/host-file-proxy.ts +58 -37
- package/src/daemon/host-transfer-proxy.ts +84 -46
- package/src/daemon/lifecycle.ts +49 -15
- package/src/daemon/message-types/conversations.ts +7 -0
- package/src/daemon/message-types/host-bash.ts +1 -0
- package/src/daemon/message-types/host-cu.ts +1 -0
- package/src/daemon/message-types/host-file.ts +1 -0
- package/src/daemon/message-types/host-transfer.ts +1 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +102 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -2
- package/src/daemon/tool-side-effects.ts +125 -107
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +3 -1
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
- package/src/heartbeat/heartbeat-service.ts +23 -5
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/relationship-state-writer.ts +16 -3
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +3 -10
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/manager.ts +0 -5
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/context-search/sources/memory-v2.ts +578 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +29 -4
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +3 -21
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
- package/src/memory/graph/conversation-graph-memory.ts +35 -13
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs-store.ts +0 -1
- package/src/memory/jobs-worker.ts +2 -16
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +24 -0
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +25 -0
- package/src/memory/search/semantic.ts +5 -16
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +289 -90
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +384 -15
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/static-context.test.ts +153 -0
- package/src/memory/v2/activation.ts +168 -97
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +14 -12
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +182 -58
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +118 -42
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/skill-store.ts +55 -7
- package/src/memory/v2/static-context.ts +62 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +122 -21
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +97 -0
- package/src/oauth/manual-token-connection.ts +30 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/config.ts +0 -74
- package/src/outbound-proxy/health.ts +0 -44
- package/src/outbound-proxy/index.ts +0 -22
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.ts +4 -1
- package/src/permissions/gateway-threshold-reader.ts +4 -1
- package/src/permissions/prompter.ts +9 -2
- package/src/permissions/secret-prompter.ts +21 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/system-prompt.ts +34 -70
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +541 -45
- package/src/runtime/assistant-event.ts +1 -6
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/route-policy.ts +11 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +22 -82
- package/src/runtime/http-types.ts +5 -0
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
- package/src/runtime/migrations/migration-transport.ts +46 -13
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +133 -79
- package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
- package/src/runtime/migrations/vbundle-importer.ts +7 -7
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
- package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
- package/src/runtime/migrations/vbundle-validator.ts +214 -41
- package/src/runtime/pending-interactions.ts +13 -4
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +45 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +120 -8
- package/src/runtime/routes/conversation-routes.ts +44 -528
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/documents-routes.ts +53 -18
- package/src/runtime/routes/events-routes.ts +59 -91
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/host-bash-routes.ts +3 -2
- package/src/runtime/routes/host-browser-routes.ts +9 -33
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +3 -2
- package/src/runtime/routes/host-transfer-routes.ts +11 -15
- package/src/runtime/routes/identity-routes.ts +78 -6
- package/src/runtime/routes/inbound-message-handler.ts +580 -137
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/index.ts +4 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/memory-v2-routes.ts +10 -15
- package/src/runtime/routes/migration-routes.ts +188 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +3 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/schedule/schedule-store.ts +0 -16
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +6 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
- package/src/telemetry/usage-telemetry-reporter.ts +3 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
- package/src/tools/browser/cdp-client/factory.ts +48 -76
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/executor.ts +44 -31
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +4 -3
- package/src/tools/host-filesystem/write.ts +3 -2
- package/src/tools/host-terminal/host-shell.ts +4 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/types.ts +12 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -9,7 +9,6 @@ import { getLogger } from "../../util/logger.js";
|
|
|
9
9
|
import { getAvatarImagePath } from "../../util/platform.js";
|
|
10
10
|
import { buildAssistantEvent } from "../assistant-event.js";
|
|
11
11
|
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
12
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
13
12
|
import {
|
|
14
13
|
BadRequestError,
|
|
15
14
|
RouteError,
|
|
@@ -19,11 +18,11 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
|
19
18
|
|
|
20
19
|
const log = getLogger("avatar-routes");
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
function publishAvatarUpdated(): void {
|
|
23
22
|
const avatarPath = getAvatarImagePath();
|
|
24
23
|
assistantEventHub
|
|
25
24
|
.publish(
|
|
26
|
-
buildAssistantEvent(
|
|
25
|
+
buildAssistantEvent({
|
|
27
26
|
type: "avatar_updated",
|
|
28
27
|
avatarPath,
|
|
29
28
|
}),
|
|
@@ -105,8 +104,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
105
104
|
return { ok: true };
|
|
106
105
|
},
|
|
107
106
|
summary: "Notify avatar updated",
|
|
108
|
-
description:
|
|
109
|
-
"Publish an avatar_updated SSE event to connected clients.",
|
|
107
|
+
description: "Publish an avatar_updated SSE event to connected clients.",
|
|
110
108
|
tags: ["avatar"],
|
|
111
109
|
responseBody: z.object({
|
|
112
110
|
ok: z.boolean(),
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
} from "../../browser/types.js";
|
|
19
19
|
import { findConversation } from "../../daemon/conversation-store.js";
|
|
20
20
|
import type { ContentBlock } from "../../providers/types.js";
|
|
21
|
-
import { getClientRegistry } from "../client-registry.js";
|
|
22
21
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
23
22
|
|
|
24
23
|
// ── Param validation ─────────────────────────────────────────────────
|
|
@@ -70,8 +69,7 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
|
|
|
70
69
|
|
|
71
70
|
// When the caller passes a live conversation ID (e.g. from
|
|
72
71
|
// __CONVERSATION_ID in a nested bash invocation), reuse that
|
|
73
|
-
// conversation's
|
|
74
|
-
// see extension connectivity from the parent turn.
|
|
72
|
+
// conversation's trust context and transport interface.
|
|
75
73
|
const conversation = conversationId
|
|
76
74
|
? findConversation(conversationId)
|
|
77
75
|
: undefined;
|
|
@@ -80,12 +78,6 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
|
|
|
80
78
|
? conversationId!
|
|
81
79
|
: browserCliConversationKey(sessionId);
|
|
82
80
|
|
|
83
|
-
// When there's no conversation context (e.g. `assistant browser status`
|
|
84
|
-
// from the CLI), check the client registry for connected host_browser
|
|
85
|
-
// clients so the status command can report accurate extension availability.
|
|
86
|
-
const registry = getClientRegistry();
|
|
87
|
-
const browserClients = registry.listByCapability("host_browser");
|
|
88
|
-
|
|
89
81
|
const result = await executeBrowserOperation(
|
|
90
82
|
operation as BrowserOperation,
|
|
91
83
|
input,
|
|
@@ -93,13 +85,7 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
|
|
|
93
85
|
workingDir: process.cwd(),
|
|
94
86
|
conversationId: resolvedConversationId,
|
|
95
87
|
trustClass: conversation?.trustContext?.trustClass ?? "unknown",
|
|
96
|
-
hostBrowserProxy: conversation?.hostBrowserProxy,
|
|
97
88
|
transportInterface: conversation?.transportInterface,
|
|
98
|
-
hostBrowserRegistryRouted: !!conversation?.hostBrowserSenderOverride,
|
|
99
|
-
connectedBrowserClients: browserClients.map((c) => ({
|
|
100
|
-
clientId: c.clientId,
|
|
101
|
-
interfaceId: c.interfaceId,
|
|
102
|
-
})),
|
|
103
89
|
},
|
|
104
90
|
);
|
|
105
91
|
|
|
@@ -10,12 +10,8 @@
|
|
|
10
10
|
export {
|
|
11
11
|
type ApprovalInterceptionParams,
|
|
12
12
|
type ApprovalInterceptionResult,
|
|
13
|
-
handleApprovalInterception,
|
|
14
13
|
} from "./guardian-approval-interception.js";
|
|
15
|
-
export {
|
|
16
|
-
deliverGeneratedApprovalPrompt,
|
|
17
|
-
type DeliverGeneratedApprovalPromptParams,
|
|
18
|
-
} from "./guardian-approval-prompt.js";
|
|
14
|
+
export { type DeliverGeneratedApprovalPromptParams } from "./guardian-approval-prompt.js";
|
|
19
15
|
export {
|
|
20
16
|
startGuardianExpirySweep,
|
|
21
17
|
stopGuardianExpirySweep,
|
|
@@ -45,7 +45,7 @@ async function enrichSnapshots(
|
|
|
45
45
|
/**
|
|
46
46
|
* GET /v1/channels/readiness
|
|
47
47
|
*/
|
|
48
|
-
|
|
48
|
+
async function handleGetChannelReadiness({
|
|
49
49
|
queryParams = {},
|
|
50
50
|
}: RouteHandlerArgs) {
|
|
51
51
|
const channel = (queryParams.channel as ChannelId | undefined) ?? undefined;
|
|
@@ -61,9 +61,7 @@ export async function handleGetChannelReadiness({
|
|
|
61
61
|
/**
|
|
62
62
|
* POST /v1/channels/readiness/refresh
|
|
63
63
|
*/
|
|
64
|
-
|
|
65
|
-
body = {},
|
|
66
|
-
}: RouteHandlerArgs) {
|
|
64
|
+
async function handleRefreshChannelReadiness({ body = {} }: RouteHandlerArgs) {
|
|
67
65
|
const channel = (body.channel as ChannelId | undefined) ?? undefined;
|
|
68
66
|
const includeRemote =
|
|
69
67
|
body.includeRemote !== undefined ? Boolean(body.includeRemote) : true;
|
|
@@ -130,9 +128,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
130
128
|
}),
|
|
131
129
|
responseBody: z.object({
|
|
132
130
|
success: z.boolean(),
|
|
133
|
-
snapshots: z
|
|
134
|
-
.array(z.unknown())
|
|
135
|
-
.describe("Refreshed readiness snapshots"),
|
|
131
|
+
snapshots: z.array(z.unknown()).describe("Refreshed readiness snapshots"),
|
|
136
132
|
}),
|
|
137
133
|
},
|
|
138
134
|
];
|
|
@@ -119,39 +119,13 @@ export function buildGuardianDenyContext(
|
|
|
119
119
|
return `Permission denied for "${toolName}": guardian approval was required, but no guardian is configured for this channel. In your next assistant reply, explain this and offer guardian setup. Mention that setup provides a verification code that the user replies with in the channel.`;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
export function buildPromptDeliveryFailureContext(toolName: string): string {
|
|
123
|
-
return `Permission denied for "${toolName}": approval UI delivery failed and no plain-text fallback could be delivered. In your next assistant reply, apologize briefly, explain approval delivery failed, and ask the user to retry.`;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
122
|
export function stripVerificationFailurePrefix(reason: string): string {
|
|
127
123
|
const trimmed = reason.trim();
|
|
128
124
|
return trimmed.replace(/^verification failed\.?\s*/i, "").trim() || trimmed;
|
|
129
125
|
}
|
|
130
|
-
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Poll constants
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
|
|
135
|
-
export const RUN_POLL_INTERVAL_MS = 500;
|
|
136
|
-
const RUN_POLL_MAX_WAIT_MS = 300_000; // 5 minutes
|
|
137
|
-
|
|
138
|
-
/** Post-decision delivery poll: uses the same budget as the main poll since
|
|
139
|
-
* this is the only delivery path for late approvals after the main poll exits. */
|
|
140
|
-
export const POST_DECISION_POLL_INTERVAL_MS = 500;
|
|
141
|
-
export const POST_DECISION_POLL_MAX_WAIT_MS = RUN_POLL_MAX_WAIT_MS;
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Override the poll max-wait for tests. When set, used in place of
|
|
145
|
-
* RUN_POLL_MAX_WAIT_MS so tests can exercise timeout paths without
|
|
146
|
-
* waiting 5 minutes.
|
|
147
|
-
*/
|
|
148
|
-
let testPollMaxWaitOverride: number | null = null;
|
|
126
|
+
let _testPollMaxWaitOverride: number | null = null;
|
|
149
127
|
|
|
150
128
|
/** @internal — test-only: set an override for the poll max-wait. */
|
|
151
129
|
export function _setTestPollMaxWait(ms: number | null): void {
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export function getEffectivePollMaxWait(): number {
|
|
156
|
-
return testPollMaxWaitOverride ?? RUN_POLL_MAX_WAIT_MS;
|
|
130
|
+
_testPollMaxWaitOverride = ms;
|
|
157
131
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Client registry routes — list connected clients and their capabilities.
|
|
3
|
+
*
|
|
4
|
+
* Queries the assistant event hub's client subscribers rather than a
|
|
5
|
+
* separate registry. Clients register as hub subscribers via SSE /events.
|
|
3
6
|
*/
|
|
4
7
|
|
|
5
8
|
import { z } from "zod";
|
|
6
9
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "
|
|
10
|
+
import type { HostProxyCapability } from "../../channels/types.js";
|
|
11
|
+
import { datesToISO } from "../../util/json.js";
|
|
12
|
+
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
13
|
+
import { NotFoundError } from "./errors.js";
|
|
11
14
|
import type { RouteDefinition } from "./types.js";
|
|
12
15
|
|
|
13
16
|
export const ROUTES: RouteDefinition[] = [
|
|
@@ -31,18 +34,48 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
31
34
|
clients: z.array(z.object({}).passthrough()),
|
|
32
35
|
}),
|
|
33
36
|
handler: ({ queryParams }) => {
|
|
34
|
-
const
|
|
35
|
-
|
|
37
|
+
const capability = queryParams?.capability as
|
|
38
|
+
| HostProxyCapability
|
|
39
|
+
| undefined;
|
|
36
40
|
|
|
37
|
-
const
|
|
38
|
-
?
|
|
39
|
-
|
|
40
|
-
)
|
|
41
|
-
: registry.listAll();
|
|
41
|
+
const clients = capability
|
|
42
|
+
? assistantEventHub.listClientsByCapability(capability)
|
|
43
|
+
: assistantEventHub.listClients();
|
|
42
44
|
|
|
43
45
|
return {
|
|
44
|
-
clients:
|
|
46
|
+
clients: clients.map((c) =>
|
|
47
|
+
datesToISO({
|
|
48
|
+
clientId: c.clientId,
|
|
49
|
+
interfaceId: c.interfaceId,
|
|
50
|
+
capabilities: c.capabilities,
|
|
51
|
+
connectedAt: c.connectedAt,
|
|
52
|
+
lastActiveAt: c.lastActiveAt,
|
|
53
|
+
}),
|
|
54
|
+
),
|
|
45
55
|
};
|
|
46
56
|
},
|
|
47
57
|
},
|
|
58
|
+
{
|
|
59
|
+
operationId: "disconnect_client",
|
|
60
|
+
endpoint: "clients/disconnect",
|
|
61
|
+
method: "POST",
|
|
62
|
+
summary: "Force-disconnect a client",
|
|
63
|
+
description:
|
|
64
|
+
"Dispose all hub subscribers for the given clientId, forcibly closing their SSE streams.",
|
|
65
|
+
tags: ["clients"],
|
|
66
|
+
requestBody: z.object({
|
|
67
|
+
clientId: z.string().describe("The client UUID to disconnect."),
|
|
68
|
+
}),
|
|
69
|
+
responseBody: z.object({
|
|
70
|
+
disconnected: z.number().describe("Number of disposed subscribers."),
|
|
71
|
+
}),
|
|
72
|
+
handler: ({ body }) => {
|
|
73
|
+
const { clientId } = body as { clientId: string };
|
|
74
|
+
const count = assistantEventHub.disposeClient(clientId);
|
|
75
|
+
if (count === 0) {
|
|
76
|
+
throw new NotFoundError(`No connected client with id "${clientId}"`);
|
|
77
|
+
}
|
|
78
|
+
return { disconnected: count };
|
|
79
|
+
},
|
|
80
|
+
},
|
|
48
81
|
];
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route handlers for the memory v2 consolidation job.
|
|
3
|
+
*
|
|
4
|
+
* Consolidation is the v2 counterpart to filing: an interval-based background
|
|
5
|
+
* pass that routes accumulated `memory/buffer.md` entries into concept pages.
|
|
6
|
+
* The job itself is enqueued by the memory jobs worker (see
|
|
7
|
+
* `maybeEnqueueGraphMaintenanceJobs` in `memory/jobs-worker.ts`); these routes
|
|
8
|
+
* only surface its config and provide an on-demand trigger for the Settings UI.
|
|
9
|
+
*
|
|
10
|
+
* `available` mirrors the filing route's `available` field: it reflects which
|
|
11
|
+
* background memory job is active for this instance. When `memory-v2-enabled`
|
|
12
|
+
* is off, consolidation returns `available: false` and the UI hides the row.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
|
|
17
|
+
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
18
|
+
import { getConfig } from "../../config/loader.js";
|
|
19
|
+
import { getMemoryCheckpoint } from "../../memory/checkpoints.js";
|
|
20
|
+
import {
|
|
21
|
+
enqueueMemoryJob,
|
|
22
|
+
hasActiveJobOfType,
|
|
23
|
+
} from "../../memory/jobs-store.js";
|
|
24
|
+
import { GRAPH_MAINTENANCE_CHECKPOINTS } from "../../memory/jobs-worker.js";
|
|
25
|
+
import { BadRequestError } from "./errors.js";
|
|
26
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
27
|
+
|
|
28
|
+
function isConsolidationAvailable(): boolean {
|
|
29
|
+
return isAssistantFeatureFlagEnabled("memory-v2-enabled", getConfig());
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function consolidationIntervalMs(): number {
|
|
33
|
+
return getConfig().memory.v2.consolidation_interval_hours * 60 * 60 * 1000;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function readLastRunAt(): number | null {
|
|
37
|
+
const raw = getMemoryCheckpoint(
|
|
38
|
+
GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
39
|
+
);
|
|
40
|
+
if (!raw) return null;
|
|
41
|
+
const parsed = Number.parseInt(raw, 10);
|
|
42
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Shared ROUTES
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
export const ROUTES: RouteDefinition[] = [
|
|
50
|
+
{
|
|
51
|
+
operationId: "getConsolidationConfig",
|
|
52
|
+
endpoint: "consolidation/config",
|
|
53
|
+
method: "GET",
|
|
54
|
+
policyKey: "consolidation",
|
|
55
|
+
requirePolicyEnforcement: true,
|
|
56
|
+
summary: "Get consolidation config",
|
|
57
|
+
description:
|
|
58
|
+
"Return the current memory v2 consolidation schedule configuration.",
|
|
59
|
+
tags: ["consolidation"],
|
|
60
|
+
responseBody: z.object({
|
|
61
|
+
available: z.boolean(),
|
|
62
|
+
enabled: z.boolean(),
|
|
63
|
+
intervalMs: z.number(),
|
|
64
|
+
nextRunAt: z.number().nullable(),
|
|
65
|
+
lastRunAt: z.number().nullable(),
|
|
66
|
+
success: z.boolean(),
|
|
67
|
+
}),
|
|
68
|
+
handler: async (_args: RouteHandlerArgs) => {
|
|
69
|
+
const available = isConsolidationAvailable();
|
|
70
|
+
const v2Config = getConfig().memory.v2;
|
|
71
|
+
const intervalMs = consolidationIntervalMs();
|
|
72
|
+
const lastRunAt = readLastRunAt();
|
|
73
|
+
const nextRunAt = lastRunAt != null ? lastRunAt + intervalMs : null;
|
|
74
|
+
return {
|
|
75
|
+
available,
|
|
76
|
+
enabled: available && v2Config.enabled,
|
|
77
|
+
intervalMs,
|
|
78
|
+
nextRunAt,
|
|
79
|
+
lastRunAt,
|
|
80
|
+
success: true,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
operationId: "runConsolidationNow",
|
|
86
|
+
endpoint: "consolidation/run-now",
|
|
87
|
+
method: "POST",
|
|
88
|
+
policyKey: "consolidation",
|
|
89
|
+
requirePolicyEnforcement: true,
|
|
90
|
+
summary: "Run consolidation now",
|
|
91
|
+
description:
|
|
92
|
+
"Enqueue an immediate memory v2 consolidation job. Returns once the job is queued; the job itself runs through the memory jobs worker.",
|
|
93
|
+
tags: ["consolidation"],
|
|
94
|
+
responseBody: z.object({
|
|
95
|
+
success: z.boolean(),
|
|
96
|
+
ran: z.boolean().describe("Whether a job was enqueued"),
|
|
97
|
+
jobId: z.string().nullable(),
|
|
98
|
+
}),
|
|
99
|
+
handler: async (_args: RouteHandlerArgs) => {
|
|
100
|
+
if (!isConsolidationAvailable()) {
|
|
101
|
+
throw new BadRequestError(
|
|
102
|
+
"Consolidation is not available (memory-v2-enabled is off)",
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
// Coalesce: don't pile up duplicate jobs if the worker hasn't picked up
|
|
106
|
+
// the previous one yet. The consolidation job's own lock catches the
|
|
107
|
+
// overlapping-window case but does not prevent queue depth from growing.
|
|
108
|
+
if (hasActiveJobOfType("memory_v2_consolidate")) {
|
|
109
|
+
return { success: true, ran: false, jobId: null };
|
|
110
|
+
}
|
|
111
|
+
const jobId = enqueueMemoryJob("memory_v2_consolidate", {});
|
|
112
|
+
return { success: true, ran: true, jobId };
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
];
|
|
@@ -30,7 +30,6 @@ import { UserError } from "../../util/errors.js";
|
|
|
30
30
|
import { getLogger } from "../../util/logger.js";
|
|
31
31
|
import { buildAssistantEvent } from "../assistant-event.js";
|
|
32
32
|
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
33
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
34
33
|
import {
|
|
35
34
|
buildConversationDetailResponse,
|
|
36
35
|
serializeConversationSummary,
|
|
@@ -58,7 +57,7 @@ function resolveOrThrow(rawId: string): string {
|
|
|
58
57
|
function publishListInvalidated(): void {
|
|
59
58
|
assistantEventHub
|
|
60
59
|
.publish(
|
|
61
|
-
buildAssistantEvent(
|
|
60
|
+
buildAssistantEvent({
|
|
62
61
|
type: "conversation_list_invalidated",
|
|
63
62
|
reason: "seen_changed",
|
|
64
63
|
}),
|
|
@@ -75,9 +74,7 @@ function publishListInvalidated(): void {
|
|
|
75
74
|
// Handlers
|
|
76
75
|
// ---------------------------------------------------------------------------
|
|
77
76
|
|
|
78
|
-
function handleListConversations({
|
|
79
|
-
queryParams = {},
|
|
80
|
-
}: RouteHandlerArgs) {
|
|
77
|
+
function handleListConversations({ queryParams = {} }: RouteHandlerArgs) {
|
|
81
78
|
const limit = Number(queryParams.limit ?? 50);
|
|
82
79
|
const offset = Number(queryParams.offset ?? 0);
|
|
83
80
|
const backgroundOnly = queryParams.conversationType === "background";
|
|
@@ -99,8 +96,7 @@ function handleListConversations({
|
|
|
99
96
|
const conversationIds = rows.map((c) => c.id);
|
|
100
97
|
const displayMeta = getDisplayMetaForConversations(conversationIds);
|
|
101
98
|
const bindings = getBindingsForConversations(conversationIds);
|
|
102
|
-
const attentionStates =
|
|
103
|
-
getAttentionStateByConversationIds(conversationIds);
|
|
99
|
+
const attentionStates = getAttentionStateByConversationIds(conversationIds);
|
|
104
100
|
const parentCache = new Map<string, ConversationRow | null>();
|
|
105
101
|
const nextOffset = offset + limit;
|
|
106
102
|
|
|
@@ -140,9 +136,9 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
|
140
136
|
const conversationId = resolveOrThrow(rawConversationId);
|
|
141
137
|
|
|
142
138
|
try {
|
|
143
|
-
const priorState = getAttentionStateByConversationIds([
|
|
139
|
+
const priorState = getAttentionStateByConversationIds([conversationId]).get(
|
|
144
140
|
conversationId,
|
|
145
|
-
|
|
141
|
+
);
|
|
146
142
|
const wasUnseen =
|
|
147
143
|
priorState != null &&
|
|
148
144
|
priorState.latestAssistantMessageAt != null &&
|
|
@@ -155,8 +151,7 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
|
155
151
|
sourceChannel: (body.sourceChannel as string) ?? "vellum",
|
|
156
152
|
signalType: ((body.signalType as string) ??
|
|
157
153
|
"macos_conversation_opened") as SignalType,
|
|
158
|
-
confidence: ((body.confidence as string) ??
|
|
159
|
-
"explicit") as Confidence,
|
|
154
|
+
confidence: ((body.confidence as string) ?? "explicit") as Confidence,
|
|
160
155
|
source: (body.source as string) ?? "http-api",
|
|
161
156
|
evidenceText: body.evidenceText as string | undefined,
|
|
162
157
|
metadata: body.metadata as Record<string, unknown> | undefined,
|
|
@@ -169,10 +164,7 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
|
|
|
169
164
|
|
|
170
165
|
return { ok: true };
|
|
171
166
|
} catch (err) {
|
|
172
|
-
log.error(
|
|
173
|
-
{ err, conversationId },
|
|
174
|
-
"POST /v1/conversations/seen: failed",
|
|
175
|
-
);
|
|
167
|
+
log.error({ err, conversationId }, "POST /v1/conversations/seen: failed");
|
|
176
168
|
throw new InternalError("Failed to record seen signal");
|
|
177
169
|
}
|
|
178
170
|
}
|
|
@@ -194,22 +186,15 @@ function handleMarkUnread({ body = {} }: RouteHandlerArgs) {
|
|
|
194
186
|
if (err instanceof UserError) {
|
|
195
187
|
throw new UnprocessableEntityError(err.message);
|
|
196
188
|
}
|
|
197
|
-
log.error(
|
|
198
|
-
{ err, conversationId },
|
|
199
|
-
"POST /v1/conversations/unread: failed",
|
|
200
|
-
);
|
|
189
|
+
log.error({ err, conversationId }, "POST /v1/conversations/unread: failed");
|
|
201
190
|
throw new InternalError("Failed to mark conversation unread");
|
|
202
191
|
}
|
|
203
192
|
}
|
|
204
193
|
|
|
205
|
-
function handleGetConversation({
|
|
206
|
-
pathParams = {},
|
|
207
|
-
}: RouteHandlerArgs) {
|
|
194
|
+
function handleGetConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
208
195
|
const detail = buildConversationDetailResponse(pathParams.id!);
|
|
209
196
|
if (!detail) {
|
|
210
|
-
throw new NotFoundError(
|
|
211
|
-
`Conversation ${pathParams.id} not found`,
|
|
212
|
-
);
|
|
197
|
+
throw new NotFoundError(`Conversation ${pathParams.id} not found`);
|
|
213
198
|
}
|
|
214
199
|
return detail;
|
|
215
200
|
}
|
|
@@ -236,8 +221,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
236
221
|
method: "POST",
|
|
237
222
|
policyKey: "conversations/seen",
|
|
238
223
|
summary: "Record a seen signal",
|
|
239
|
-
description:
|
|
240
|
-
"Mark a conversation as seen, advancing the attention cursor.",
|
|
224
|
+
description: "Mark a conversation as seen, advancing the attention cursor.",
|
|
241
225
|
tags: ["conversations"],
|
|
242
226
|
handler: handleRecordSeen,
|
|
243
227
|
},
|
|
@@ -247,8 +231,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
247
231
|
method: "POST",
|
|
248
232
|
policyKey: "conversations/unread",
|
|
249
233
|
summary: "Mark conversation unread",
|
|
250
|
-
description:
|
|
251
|
-
"Reset the seen cursor so the conversation appears unread.",
|
|
234
|
+
description: "Reset the seen cursor so the conversation appears unread.",
|
|
252
235
|
tags: ["conversations"],
|
|
253
236
|
handler: handleMarkUnread,
|
|
254
237
|
},
|
|
@@ -28,7 +28,6 @@ import {
|
|
|
28
28
|
switchConversation,
|
|
29
29
|
undoLastMessage,
|
|
30
30
|
} from "../../daemon/handlers/conversations.js";
|
|
31
|
-
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
32
31
|
import type { ConversationListInvalidatedReason } from "../../daemon/message-types/conversations.js";
|
|
33
32
|
import { normalizeConversationType } from "../../daemon/message-types/shared.js";
|
|
34
33
|
import {
|
|
@@ -54,13 +53,8 @@ import { UserError } from "../../util/errors.js";
|
|
|
54
53
|
import { getLogger } from "../../util/logger.js";
|
|
55
54
|
import { buildAssistantEvent } from "../assistant-event.js";
|
|
56
55
|
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
57
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
58
56
|
import { buildConversationDetailResponse } from "../services/conversation-serializer.js";
|
|
59
|
-
import {
|
|
60
|
-
BadRequestError,
|
|
61
|
-
InternalError,
|
|
62
|
-
NotFoundError,
|
|
63
|
-
} from "./errors.js";
|
|
57
|
+
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
64
58
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
65
59
|
|
|
66
60
|
const log = getLogger("conversation-management-routes");
|
|
@@ -75,10 +69,12 @@ function resolveOrThrow(rawId: string): string {
|
|
|
75
69
|
return id;
|
|
76
70
|
}
|
|
77
71
|
|
|
78
|
-
function publishListInvalidated(
|
|
72
|
+
function publishListInvalidated(
|
|
73
|
+
reason: ConversationListInvalidatedReason,
|
|
74
|
+
): void {
|
|
79
75
|
assistantEventHub
|
|
80
76
|
.publish(
|
|
81
|
-
buildAssistantEvent(
|
|
77
|
+
buildAssistantEvent({
|
|
82
78
|
type: "conversation_list_invalidated",
|
|
83
79
|
reason,
|
|
84
80
|
}),
|
|
@@ -191,8 +187,7 @@ function handleSetInferenceProfile({
|
|
|
191
187
|
pathParams = {},
|
|
192
188
|
body = {},
|
|
193
189
|
}: RouteHandlerArgs) {
|
|
194
|
-
const resolvedId =
|
|
195
|
-
resolveConversationId(pathParams.id!) ?? pathParams.id!;
|
|
190
|
+
const resolvedId = resolveConversationId(pathParams.id!) ?? pathParams.id!;
|
|
196
191
|
const conversation = getConversation(resolvedId);
|
|
197
192
|
if (!conversation) {
|
|
198
193
|
throw new NotFoundError(`Conversation ${pathParams.id} not found`);
|
|
@@ -200,12 +195,9 @@ function handleSetInferenceProfile({
|
|
|
200
195
|
|
|
201
196
|
if (
|
|
202
197
|
body.profile !== null &&
|
|
203
|
-
(typeof body.profile !== "string" ||
|
|
204
|
-
(body.profile as string).length === 0)
|
|
198
|
+
(typeof body.profile !== "string" || (body.profile as string).length === 0)
|
|
205
199
|
) {
|
|
206
|
-
throw new BadRequestError(
|
|
207
|
-
"profile must be a non-empty string or null",
|
|
208
|
-
);
|
|
200
|
+
throw new BadRequestError("profile must be a non-empty string or null");
|
|
209
201
|
}
|
|
210
202
|
|
|
211
203
|
const profile = body.profile as string | null;
|
|
@@ -223,7 +215,6 @@ function handleSetInferenceProfile({
|
|
|
223
215
|
assistantEventHub
|
|
224
216
|
.publish(
|
|
225
217
|
buildAssistantEvent(
|
|
226
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
227
218
|
{
|
|
228
219
|
type: "conversation_inference_profile_updated",
|
|
229
220
|
conversationId: resolvedId,
|
|
@@ -260,7 +251,6 @@ function handleRenameConversation({
|
|
|
260
251
|
assistantEventHub
|
|
261
252
|
.publish(
|
|
262
253
|
buildAssistantEvent(
|
|
263
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
264
254
|
{
|
|
265
255
|
type: "conversation_title_updated",
|
|
266
256
|
conversationId: pathParams.id!,
|
|
@@ -381,9 +371,7 @@ function handleCancelGeneration({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
381
371
|
async function handleUndoLastMessage({ pathParams = {} }: RouteHandlerArgs) {
|
|
382
372
|
const result = await undoLastMessage(pathParams.id!);
|
|
383
373
|
if (!result) {
|
|
384
|
-
throw new NotFoundError(
|
|
385
|
-
`No active conversation for ${pathParams.id}`,
|
|
386
|
-
);
|
|
374
|
+
throw new NotFoundError(`No active conversation for ${pathParams.id}`);
|
|
387
375
|
}
|
|
388
376
|
return {
|
|
389
377
|
removedCount: result.removedCount,
|
|
@@ -393,32 +381,10 @@ async function handleUndoLastMessage({ pathParams = {} }: RouteHandlerArgs) {
|
|
|
393
381
|
|
|
394
382
|
async function handleRegenerateResponse({ pathParams = {} }: RouteHandlerArgs) {
|
|
395
383
|
const conversationId = pathParams.id!;
|
|
396
|
-
const resolvedId = resolveConversationId(conversationId) ?? conversationId;
|
|
397
|
-
let hubChain: Promise<void> = Promise.resolve();
|
|
398
|
-
const sendEvent = (event: ServerMessage) => {
|
|
399
|
-
const ae = buildAssistantEvent(
|
|
400
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
401
|
-
event,
|
|
402
|
-
resolvedId,
|
|
403
|
-
);
|
|
404
|
-
hubChain = (async () => {
|
|
405
|
-
await hubChain;
|
|
406
|
-
try {
|
|
407
|
-
await assistantEventHub.publish(ae);
|
|
408
|
-
} catch (err) {
|
|
409
|
-
log.warn(
|
|
410
|
-
{ err },
|
|
411
|
-
"assistant-events hub subscriber threw during regenerate",
|
|
412
|
-
);
|
|
413
|
-
}
|
|
414
|
-
})();
|
|
415
|
-
};
|
|
416
384
|
try {
|
|
417
|
-
const result = await regenerateResponse(conversationId
|
|
385
|
+
const result = await regenerateResponse(conversationId);
|
|
418
386
|
if (!result) {
|
|
419
|
-
throw new NotFoundError(
|
|
420
|
-
`No active conversation for ${pathParams.id}`,
|
|
421
|
-
);
|
|
387
|
+
throw new NotFoundError(`No active conversation for ${pathParams.id}`);
|
|
422
388
|
}
|
|
423
389
|
return undefined;
|
|
424
390
|
} catch (err) {
|
|
@@ -566,8 +532,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
566
532
|
method: "DELETE",
|
|
567
533
|
policyKey: "conversations/clear-all",
|
|
568
534
|
summary: "Clear all conversations",
|
|
569
|
-
description:
|
|
570
|
-
"Permanently delete ALL conversations, messages, and memory.",
|
|
535
|
+
description: "Permanently delete ALL conversations, messages, and memory.",
|
|
571
536
|
tags: ["conversations"],
|
|
572
537
|
responseStatus: "204",
|
|
573
538
|
handler: handleClearAllConversations,
|
|
@@ -631,8 +596,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
631
596
|
method: "POST",
|
|
632
597
|
policyKey: "conversations/cancel",
|
|
633
598
|
summary: "Cancel generation",
|
|
634
|
-
description:
|
|
635
|
-
"Abort the in-progress assistant response for a conversation.",
|
|
599
|
+
description: "Abort the in-progress assistant response for a conversation.",
|
|
636
600
|
tags: ["conversations"],
|
|
637
601
|
pathParams: [{ name: "id" }],
|
|
638
602
|
responseStatus: "202",
|
|
@@ -673,8 +637,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
673
637
|
method: "POST",
|
|
674
638
|
policyKey: "conversations/reorder",
|
|
675
639
|
summary: "Reorder conversations",
|
|
676
|
-
description:
|
|
677
|
-
"Batch-update display order and pin state for conversations.",
|
|
640
|
+
description: "Batch-update display order and pin state for conversations.",
|
|
678
641
|
tags: ["conversations"],
|
|
679
642
|
requestBody: z.object({
|
|
680
643
|
updates: z
|