@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
|
@@ -1,31 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getTwilioCredentials,
|
|
3
|
-
hasTwilioCredentials,
|
|
4
|
-
updatePhoneNumberWebhooks,
|
|
5
|
-
} from "../../calls/twilio-rest.js";
|
|
1
|
+
import { updatePhoneNumberWebhooks } from "../../calls/twilio-rest.js";
|
|
6
2
|
import {
|
|
7
3
|
getGatewayInternalBaseUrl,
|
|
8
4
|
getPlatformAssistantId,
|
|
9
5
|
getPlatformBaseUrl,
|
|
10
|
-
setIngressPublicBaseUrl,
|
|
11
6
|
} from "../../config/env.js";
|
|
12
7
|
import { getIsPlatform } from "../../config/env-registry.js";
|
|
13
|
-
import { loadRawConfig
|
|
14
|
-
import {
|
|
15
|
-
registerCallbackRoute,
|
|
16
|
-
resolveCallbackUrl,
|
|
17
|
-
} from "../../inbound/platform-callback-registration.js";
|
|
8
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
9
|
+
import { resolveCallbackUrl } from "../../inbound/platform-callback-registration.js";
|
|
18
10
|
import {
|
|
19
11
|
getTwilioStatusCallbackUrl,
|
|
20
12
|
getTwilioVoiceWebhookUrl,
|
|
21
13
|
type IngressConfig,
|
|
22
14
|
} from "../../inbound/public-ingress-urls.js";
|
|
23
|
-
import
|
|
24
|
-
import {
|
|
25
|
-
CONFIG_RELOAD_DEBOUNCE_MS,
|
|
26
|
-
type HandlerContext,
|
|
27
|
-
log,
|
|
28
|
-
} from "./shared.js";
|
|
15
|
+
import { log } from "./shared.js";
|
|
29
16
|
|
|
30
17
|
export function computeGatewayTarget(): string {
|
|
31
18
|
return getGatewayInternalBaseUrl();
|
|
@@ -117,151 +104,3 @@ export async function syncTwilioWebhooks(
|
|
|
117
104
|
};
|
|
118
105
|
}
|
|
119
106
|
}
|
|
120
|
-
|
|
121
|
-
export async function handleIngressConfig(
|
|
122
|
-
msg: IngressConfigRequest,
|
|
123
|
-
ctx: HandlerContext,
|
|
124
|
-
): Promise<void> {
|
|
125
|
-
const localGatewayTarget = computeGatewayTarget();
|
|
126
|
-
try {
|
|
127
|
-
if (msg.action === "get") {
|
|
128
|
-
const result = getIngressConfigResult();
|
|
129
|
-
ctx.send({
|
|
130
|
-
type: "ingress_config_response",
|
|
131
|
-
...result,
|
|
132
|
-
});
|
|
133
|
-
} else if (msg.action === "set") {
|
|
134
|
-
const value = (msg.publicBaseUrl ?? "").trim().replace(/\/+$/, "");
|
|
135
|
-
const raw = loadRawConfig();
|
|
136
|
-
|
|
137
|
-
// Update ingress.publicBaseUrl — this is the single source of truth for
|
|
138
|
-
// the canonical public ingress URL. The gateway reads this value from
|
|
139
|
-
// the workspace config file via ConfigFileCache.
|
|
140
|
-
// The gateway also validates Twilio signatures against forwarded public
|
|
141
|
-
// URL headers, so local tunnel updates generally apply without restarts.
|
|
142
|
-
const ingress = (raw?.ingress ?? {}) as Record<string, unknown>;
|
|
143
|
-
ingress.publicBaseUrl = value || undefined;
|
|
144
|
-
if (msg.enabled !== undefined) {
|
|
145
|
-
ingress.enabled = msg.enabled;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const wasSuppressed = ctx.suppressConfigReload;
|
|
149
|
-
ctx.setSuppressConfigReload(true);
|
|
150
|
-
try {
|
|
151
|
-
saveRawConfig({ ...raw, ingress });
|
|
152
|
-
} catch (err) {
|
|
153
|
-
ctx.setSuppressConfigReload(wasSuppressed);
|
|
154
|
-
throw err;
|
|
155
|
-
}
|
|
156
|
-
ctx.debounceTimers.schedule(
|
|
157
|
-
"__suppress_reset__",
|
|
158
|
-
() => {
|
|
159
|
-
ctx.setSuppressConfigReload(false);
|
|
160
|
-
},
|
|
161
|
-
CONFIG_RELOAD_DEBOUNCE_MS,
|
|
162
|
-
);
|
|
163
|
-
|
|
164
|
-
// Propagate to module-level state so the assistant's in-process URL
|
|
165
|
-
// resolution stays in sync. The gateway reads from the workspace config
|
|
166
|
-
// file directly via ConfigFileCache, so no env var propagation is needed.
|
|
167
|
-
// Only set the URL when ingress is enabled; clearing it when
|
|
168
|
-
// disabled ensures the gateway stops accepting inbound webhooks.
|
|
169
|
-
const isEnabled = (ingress.enabled as boolean | undefined) ?? false;
|
|
170
|
-
if (value && isEnabled) {
|
|
171
|
-
setIngressPublicBaseUrl(value);
|
|
172
|
-
} else {
|
|
173
|
-
// Ingress is disabled or no URL is configured — clear the module-level
|
|
174
|
-
// URL so the gateway stops accepting webhooks.
|
|
175
|
-
setIngressPublicBaseUrl(undefined);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
ctx.send({
|
|
179
|
-
type: "ingress_config_response",
|
|
180
|
-
enabled: isEnabled,
|
|
181
|
-
publicBaseUrl: value,
|
|
182
|
-
localGatewayTarget,
|
|
183
|
-
success: true,
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// When containerized with a platform, register the Telegram callback
|
|
187
|
-
// route so the platform knows how to forward Telegram webhooks.
|
|
188
|
-
// This must happen independently of ingress URL — in containerized
|
|
189
|
-
// deployments without ingress.publicBaseUrl, platform callbacks are the
|
|
190
|
-
// only way to receive Telegram webhooks.
|
|
191
|
-
if (getIsPlatform()) {
|
|
192
|
-
registerCallbackRoute("webhooks/telegram", "telegram").catch((err) => {
|
|
193
|
-
log.warn(
|
|
194
|
-
{ err },
|
|
195
|
-
"Failed to register Telegram platform callback route",
|
|
196
|
-
);
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Best-effort Twilio webhook reconciliation: when ingress is being
|
|
201
|
-
// enabled/updated and Twilio numbers are assigned with valid credentials,
|
|
202
|
-
// push the new webhook URLs to Twilio so calls route correctly.
|
|
203
|
-
if (isEnabled && (await hasTwilioCredentials())) {
|
|
204
|
-
const currentConfig = loadRawConfig();
|
|
205
|
-
const twilioConfig = (currentConfig?.twilio ?? {}) as Record<
|
|
206
|
-
string,
|
|
207
|
-
unknown
|
|
208
|
-
>;
|
|
209
|
-
const assignedNumbers = new Set<string>();
|
|
210
|
-
const primaryNumber = (twilioConfig.phoneNumber as string) ?? "";
|
|
211
|
-
if (primaryNumber) assignedNumbers.add(primaryNumber);
|
|
212
|
-
|
|
213
|
-
const assistantPhoneNumbers = twilioConfig.assistantPhoneNumbers;
|
|
214
|
-
if (
|
|
215
|
-
assistantPhoneNumbers &&
|
|
216
|
-
typeof assistantPhoneNumbers === "object" &&
|
|
217
|
-
!Array.isArray(assistantPhoneNumbers)
|
|
218
|
-
) {
|
|
219
|
-
for (const number of Object.values(
|
|
220
|
-
assistantPhoneNumbers as Record<string, unknown>,
|
|
221
|
-
)) {
|
|
222
|
-
if (typeof number === "string" && number) {
|
|
223
|
-
assignedNumbers.add(number);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (assignedNumbers.size > 0) {
|
|
229
|
-
const { accountSid: acctSid, authToken: acctToken } =
|
|
230
|
-
await getTwilioCredentials();
|
|
231
|
-
// Fire-and-forget: webhook sync failure must not block the ingress save.
|
|
232
|
-
// Reconcile every assigned number so assistant-scoped mappings do not
|
|
233
|
-
// retain stale Twilio webhook URLs after ingress URL changes.
|
|
234
|
-
for (const assignedNumber of assignedNumbers) {
|
|
235
|
-
syncTwilioWebhooks(
|
|
236
|
-
assignedNumber,
|
|
237
|
-
acctSid,
|
|
238
|
-
acctToken,
|
|
239
|
-
currentConfig as IngressConfig,
|
|
240
|
-
).catch(() => {
|
|
241
|
-
// Already logged inside syncTwilioWebhooks
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
} else {
|
|
247
|
-
ctx.send({
|
|
248
|
-
type: "ingress_config_response",
|
|
249
|
-
enabled: false,
|
|
250
|
-
publicBaseUrl: "",
|
|
251
|
-
localGatewayTarget,
|
|
252
|
-
success: false,
|
|
253
|
-
error: `Unknown action: ${String(msg.action)}`,
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
} catch (err) {
|
|
257
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
258
|
-
ctx.send({
|
|
259
|
-
type: "ingress_config_response",
|
|
260
|
-
enabled: false,
|
|
261
|
-
publicBaseUrl: "",
|
|
262
|
-
localGatewayTarget,
|
|
263
|
-
success: false,
|
|
264
|
-
error: message,
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
}
|
|
@@ -100,7 +100,7 @@ export async function getModelInfo(): Promise<ModelInfo> {
|
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
102
|
* Minimal interface for the side-effects needed by setModel / setImageGenModel.
|
|
103
|
-
* Keeps the business logic decoupled from transport-specific
|
|
103
|
+
* Keeps the business logic decoupled from transport-specific server context.
|
|
104
104
|
*/
|
|
105
105
|
export interface ModelSetContext {
|
|
106
106
|
suppressConfigReload: boolean;
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
import type { VoiceConfigUpdateRequest } from "../message-types/settings.js";
|
|
2
|
-
import { type HandlerContext, log } from "./shared.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Send a client_settings_update message to all connected clients.
|
|
6
|
-
* Used to push configuration changes (e.g. activation key) from the daemon
|
|
7
|
-
* to macOS/iOS clients so they can apply settings immediately.
|
|
8
|
-
*/
|
|
9
|
-
function broadcastClientSettingsUpdate(
|
|
10
|
-
key: string,
|
|
11
|
-
value: string,
|
|
12
|
-
ctx: HandlerContext,
|
|
13
|
-
): void {
|
|
14
|
-
ctx.broadcast({
|
|
15
|
-
type: "client_settings_update",
|
|
16
|
-
key,
|
|
17
|
-
value,
|
|
18
|
-
});
|
|
19
|
-
log.info({ key, value }, "Broadcast client_settings_update");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
1
|
// ── Activation key validation ────────────────────────────────────────
|
|
23
2
|
|
|
24
3
|
const VALID_ACTIVATION_KEYS = ["fn", "ctrl", "fn_shift", "none"] as const;
|
|
@@ -192,24 +171,3 @@ export function normalizeActivationKey(
|
|
|
192
171
|
reason: `Invalid activation key "${input}". Valid values: fn (Fn/Globe key), ctrl (Control key), fn_shift (Fn+Shift), none (disable PTT), or a PTTActivator JSON object.`,
|
|
193
172
|
};
|
|
194
173
|
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Process a voice configuration update request from a conversation or client.
|
|
198
|
-
* Validates the activation key and broadcasts the change to all connected clients.
|
|
199
|
-
*/
|
|
200
|
-
export function handleVoiceConfigUpdate(
|
|
201
|
-
msg: VoiceConfigUpdateRequest,
|
|
202
|
-
ctx: HandlerContext,
|
|
203
|
-
): void {
|
|
204
|
-
const result = normalizeActivationKey(msg.activationKey);
|
|
205
|
-
if (!result.ok) {
|
|
206
|
-
log.warn({ input: msg.activationKey }, result.reason);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
broadcastClientSettingsUpdate("activationKey", result.value, ctx);
|
|
211
|
-
log.info(
|
|
212
|
-
{ activationKey: result.value },
|
|
213
|
-
"Voice config updated: activation key",
|
|
214
|
-
);
|
|
215
|
-
}
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
createCanonicalGuardianRequest,
|
|
5
|
-
generateCanonicalRequestCode,
|
|
6
|
-
} from "../../memory/canonical-guardian-store.js";
|
|
7
|
-
import {
|
|
8
|
-
clearAll,
|
|
9
|
-
getConversation,
|
|
10
|
-
updateConversationTitle,
|
|
11
|
-
} from "../../memory/conversation-crud.js";
|
|
3
|
+
import { clearAll, getConversation } from "../../memory/conversation-crud.js";
|
|
12
4
|
import { resolveConversationId } from "../../memory/conversation-key-store.js";
|
|
5
|
+
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
13
6
|
import * as pendingInteractions from "../../runtime/pending-interactions.js";
|
|
14
|
-
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
15
7
|
import { getSubagentManager } from "../../subagent/index.js";
|
|
16
|
-
import { summarizeToolInput } from "../../tools/tool-input-summary.js";
|
|
17
8
|
import { createAbortReason } from "../../util/abort-reasons.js";
|
|
18
9
|
import { truncate } from "../../util/truncate.js";
|
|
19
|
-
import
|
|
10
|
+
import { regenerate } from "../conversation-history.js";
|
|
20
11
|
import {
|
|
21
12
|
clearAllActiveConversations,
|
|
22
13
|
conversationEntries,
|
|
@@ -24,125 +15,11 @@ import {
|
|
|
24
15
|
getOrCreateConversation,
|
|
25
16
|
touchConversation,
|
|
26
17
|
} from "../conversation-store.js";
|
|
27
|
-
import type {
|
|
28
|
-
ConfirmationResponse,
|
|
29
|
-
SecretResponse,
|
|
30
|
-
ServerMessage,
|
|
31
|
-
} from "../message-protocol.js";
|
|
18
|
+
import type { ConfirmationResponse } from "../message-protocol.js";
|
|
32
19
|
import { normalizeConversationType } from "../message-protocol.js";
|
|
33
|
-
import {
|
|
34
|
-
type HandlerContext,
|
|
35
|
-
log,
|
|
36
|
-
pendingStandaloneSecrets,
|
|
37
|
-
} from "./shared.js";
|
|
38
|
-
|
|
39
|
-
export function makeEventSender(params: {
|
|
40
|
-
ctx: HandlerContext;
|
|
41
|
-
conversation: Conversation;
|
|
42
|
-
conversationId: string;
|
|
43
|
-
sourceChannel: string;
|
|
44
|
-
}): (event: ServerMessage) => void {
|
|
45
|
-
const { ctx, conversation, conversationId, sourceChannel } = params;
|
|
46
|
-
|
|
47
|
-
return (event: ServerMessage) => {
|
|
48
|
-
if (event.type === "confirmation_request") {
|
|
49
|
-
// ACP permission requests are handled by client-handler.ts — skip
|
|
50
|
-
// the normal registration and guardian request creation for them.
|
|
51
|
-
// The ACP handler registers its own entry with directResolve after
|
|
52
|
-
// this callback returns.
|
|
53
|
-
const isAcpPermission = "acpToolKind" in event && !!event.acpToolKind;
|
|
54
|
-
|
|
55
|
-
if (!isAcpPermission) {
|
|
56
|
-
pendingInteractions.register(event.requestId, {
|
|
57
|
-
conversation,
|
|
58
|
-
conversationId,
|
|
59
|
-
kind: "confirmation",
|
|
60
|
-
confirmationDetails: {
|
|
61
|
-
toolName: event.toolName,
|
|
62
|
-
input: event.input,
|
|
63
|
-
riskLevel: event.riskLevel,
|
|
64
|
-
executionTarget: event.executionTarget,
|
|
65
|
-
allowlistOptions: event.allowlistOptions,
|
|
66
|
-
scopeOptions: event.scopeOptions,
|
|
67
|
-
persistentDecisionsAllowed: event.persistentDecisionsAllowed,
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
const trustContext = conversation.trustContext;
|
|
73
|
-
const inputRecord = event.input as Record<string, unknown>;
|
|
74
|
-
const activityRaw =
|
|
75
|
-
(typeof inputRecord.activity === "string"
|
|
76
|
-
? inputRecord.activity
|
|
77
|
-
: undefined) ??
|
|
78
|
-
(typeof inputRecord.reason === "string"
|
|
79
|
-
? inputRecord.reason
|
|
80
|
-
: undefined);
|
|
81
|
-
createCanonicalGuardianRequest({
|
|
82
|
-
id: event.requestId,
|
|
83
|
-
kind: "tool_approval",
|
|
84
|
-
sourceType: "desktop",
|
|
85
|
-
sourceChannel,
|
|
86
|
-
conversationId,
|
|
87
|
-
guardianPrincipalId: trustContext?.guardianPrincipalId ?? undefined,
|
|
88
|
-
toolName: event.toolName,
|
|
89
|
-
commandPreview:
|
|
90
|
-
redactSecrets(summarizeToolInput(event.toolName, inputRecord)) ||
|
|
91
|
-
undefined,
|
|
92
|
-
riskLevel: event.riskLevel,
|
|
93
|
-
activityText: activityRaw ? redactSecrets(activityRaw) : undefined,
|
|
94
|
-
executionTarget: event.executionTarget,
|
|
95
|
-
status: "pending",
|
|
96
|
-
requestCode: generateCanonicalRequestCode(),
|
|
97
|
-
expiresAt: Date.now() + 5 * 60 * 1000,
|
|
98
|
-
});
|
|
99
|
-
} catch (err) {
|
|
100
|
-
log.debug(
|
|
101
|
-
{ err, requestId: event.requestId, conversationId },
|
|
102
|
-
"Failed to create canonical request from local confirmation event",
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
} else if (event.type === "secret_request") {
|
|
107
|
-
pendingInteractions.register(event.requestId, {
|
|
108
|
-
conversation,
|
|
109
|
-
conversationId,
|
|
110
|
-
kind: "secret",
|
|
111
|
-
});
|
|
112
|
-
} else if (event.type === "host_bash_request") {
|
|
113
|
-
pendingInteractions.register(event.requestId, {
|
|
114
|
-
conversation,
|
|
115
|
-
conversationId,
|
|
116
|
-
kind: "host_bash",
|
|
117
|
-
});
|
|
118
|
-
} else if (event.type === "host_browser_request") {
|
|
119
|
-
pendingInteractions.register(event.requestId, {
|
|
120
|
-
conversation,
|
|
121
|
-
conversationId,
|
|
122
|
-
kind: "host_browser",
|
|
123
|
-
});
|
|
124
|
-
} else if (event.type === "host_file_request") {
|
|
125
|
-
pendingInteractions.register(event.requestId, {
|
|
126
|
-
conversation,
|
|
127
|
-
conversationId,
|
|
128
|
-
kind: "host_file",
|
|
129
|
-
});
|
|
130
|
-
} else if (event.type === "host_cu_request") {
|
|
131
|
-
pendingInteractions.register(event.requestId, {
|
|
132
|
-
conversation,
|
|
133
|
-
conversationId,
|
|
134
|
-
kind: "host_cu",
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
ctx.send(event);
|
|
139
|
-
};
|
|
140
|
-
}
|
|
20
|
+
import { log } from "./shared.js";
|
|
141
21
|
|
|
142
|
-
export function handleConfirmationResponse(
|
|
143
|
-
msg: ConfirmationResponse,
|
|
144
|
-
ctx: HandlerContext,
|
|
145
|
-
): void {
|
|
22
|
+
export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
146
23
|
// Route by requestId to the conversation that originated the prompt, not by
|
|
147
24
|
// the current conversation binding which may have changed since the
|
|
148
25
|
// request was issued (e.g. after a conversation switch).
|
|
@@ -150,7 +27,7 @@ export function handleConfirmationResponse(
|
|
|
150
27
|
|
|
151
28
|
for (const [conversationId, conversation] of conversationEntries()) {
|
|
152
29
|
if (conversation.hasPendingConfirmation(msg.requestId)) {
|
|
153
|
-
|
|
30
|
+
touchConversation(conversationId);
|
|
154
31
|
conversation.handleConfirmationResponse(
|
|
155
32
|
msg.requestId,
|
|
156
33
|
decision,
|
|
@@ -169,42 +46,6 @@ export function handleConfirmationResponse(
|
|
|
169
46
|
"No conversation found with pending confirmation for requestId",
|
|
170
47
|
);
|
|
171
48
|
}
|
|
172
|
-
|
|
173
|
-
export function handleSecretResponse(
|
|
174
|
-
msg: SecretResponse,
|
|
175
|
-
ctx: HandlerContext,
|
|
176
|
-
): void {
|
|
177
|
-
// Check standalone (non-conversation) prompts first, since they use a dedicated
|
|
178
|
-
// requestId that won't collide with conversation prompts.
|
|
179
|
-
const standalone = pendingStandaloneSecrets.get(msg.requestId);
|
|
180
|
-
if (standalone) {
|
|
181
|
-
clearTimeout(standalone.timer);
|
|
182
|
-
pendingStandaloneSecrets.delete(msg.requestId);
|
|
183
|
-
standalone.resolve({
|
|
184
|
-
value: msg.value ?? null,
|
|
185
|
-
delivery: msg.delivery ?? "store",
|
|
186
|
-
});
|
|
187
|
-
pendingInteractions.resolve(msg.requestId);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Route by requestId to the conversation that originated the prompt, not by
|
|
192
|
-
// the current conversation binding which may have changed since the
|
|
193
|
-
// request was issued (e.g. after a conversation switch).
|
|
194
|
-
for (const [conversationId, conversation] of conversationEntries()) {
|
|
195
|
-
if (conversation.hasPendingSecret(msg.requestId)) {
|
|
196
|
-
ctx.touchConversation(conversationId);
|
|
197
|
-
conversation.handleSecretResponse(msg.requestId, msg.value, msg.delivery);
|
|
198
|
-
pendingInteractions.resolve(msg.requestId);
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
log.warn(
|
|
203
|
-
{ requestId: msg.requestId },
|
|
204
|
-
"No conversation found with pending secret prompt for requestId",
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
49
|
/**
|
|
209
50
|
* Clear all conversations and DB conversations. Returns the number of conversations cleared.
|
|
210
51
|
*/
|
|
@@ -222,9 +63,7 @@ export function clearAllConversations(): number {
|
|
|
222
63
|
* Switch to an existing conversation. Returns conversation info on success,
|
|
223
64
|
* or throws/returns an error result when the conversation is not found.
|
|
224
65
|
*/
|
|
225
|
-
export async function switchConversation(
|
|
226
|
-
conversationId: string,
|
|
227
|
-
): Promise<{
|
|
66
|
+
export async function switchConversation(conversationId: string): Promise<{
|
|
228
67
|
conversationId: string;
|
|
229
68
|
title: string;
|
|
230
69
|
conversationType: ReturnType<typeof normalizeConversationType>;
|
|
@@ -245,27 +84,10 @@ export async function switchConversation(
|
|
|
245
84
|
inferenceProfile: conversation.inferenceProfile ?? undefined,
|
|
246
85
|
};
|
|
247
86
|
}
|
|
248
|
-
/**
|
|
249
|
-
* Rename a conversation. Returns true on success, false if not found.
|
|
250
|
-
*/
|
|
251
|
-
export function renameConversation(
|
|
252
|
-
conversationId: string,
|
|
253
|
-
name: string,
|
|
254
|
-
): boolean {
|
|
255
|
-
const conversation = getConversation(conversationId);
|
|
256
|
-
if (!conversation) {
|
|
257
|
-
return false;
|
|
258
|
-
}
|
|
259
|
-
updateConversationTitle(conversationId, name, 0);
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
87
|
/**
|
|
264
88
|
* Cancel generation for a conversation. Returns true if a conversation was found and cancelled.
|
|
265
89
|
*/
|
|
266
|
-
export function cancelGeneration(
|
|
267
|
-
conversationId: string,
|
|
268
|
-
): boolean {
|
|
90
|
+
export function cancelGeneration(conversationId: string): boolean {
|
|
269
91
|
const conversation = findConversation(conversationId);
|
|
270
92
|
if (!conversation) {
|
|
271
93
|
return false;
|
|
@@ -307,7 +129,6 @@ export async function undoLastMessage(
|
|
|
307
129
|
*/
|
|
308
130
|
export async function regenerateResponse(
|
|
309
131
|
conversationId: string,
|
|
310
|
-
sendEvent: (event: ServerMessage) => void,
|
|
311
132
|
): Promise<{ requestId: string } | null> {
|
|
312
133
|
// The caller may pass a conversation key (e.g. the macOS client's local
|
|
313
134
|
// conversation ID) instead of the daemon's internal conversation ID. Resolve
|
|
@@ -319,7 +140,7 @@ export async function regenerateResponse(
|
|
|
319
140
|
conversationId = resolvedId;
|
|
320
141
|
const conversation = await getOrCreateConversation(conversationId);
|
|
321
142
|
touchConversation(conversationId);
|
|
322
|
-
conversation.updateClient(
|
|
143
|
+
conversation.updateClient(broadcastMessage, false);
|
|
323
144
|
const requestId = uuid();
|
|
324
145
|
conversation.traceEmitter.emit("request_received", "Regenerate requested", {
|
|
325
146
|
requestId,
|
|
@@ -327,7 +148,7 @@ export async function regenerateResponse(
|
|
|
327
148
|
attributes: { source: "regenerate" },
|
|
328
149
|
});
|
|
329
150
|
try {
|
|
330
|
-
await
|
|
151
|
+
await regenerate(conversation, requestId);
|
|
331
152
|
} catch (err) {
|
|
332
153
|
const message = err instanceof Error ? err.message : String(err);
|
|
333
154
|
log.error({ err, conversationId }, "Error regenerating message");
|