@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,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified registry of active client connections.
|
|
3
|
-
*
|
|
4
|
-
* Tracks all clients currently connected to the assistant — macOS desktop
|
|
5
|
-
* (SSE), iOS (SSE), web (SSE), chrome-extension (WebSocket), CLI, and
|
|
6
|
-
* channel interfaces. Each entry records the interface type, derived
|
|
7
|
-
* capabilities, and connection timestamps.
|
|
8
|
-
*
|
|
9
|
-
* The registry is populated by:
|
|
10
|
-
* - SSE /events route (events-routes.ts) — registers on connect,
|
|
11
|
-
* unregisters on disconnect, touches on heartbeat.
|
|
12
|
-
*
|
|
13
|
-
* Future enhancements:
|
|
14
|
-
* - Surface ChromeExtensionRegistry entries through `listAll()`
|
|
15
|
-
*
|
|
16
|
-
* Consumers:
|
|
17
|
-
* - `assistant clients list` CLI command (via `list_clients` IPC route)
|
|
18
|
-
* - Future: deferred host tool routing (Phase 2)
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import type { HostProxyCapability, InterfaceId } from "../channels/types.js";
|
|
22
|
-
import { supportsHostProxy } from "../channels/types.js";
|
|
23
|
-
import { getLogger } from "../util/logger.js";
|
|
24
|
-
|
|
25
|
-
const log = getLogger("client-registry");
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Default staleness threshold: entries not refreshed within this window are
|
|
29
|
-
* evicted on the next read. 30 minutes is generous — messages refresh the
|
|
30
|
-
* entry on every turn, so any actively used client stays well within this.
|
|
31
|
-
*/
|
|
32
|
-
const DEFAULT_STALE_AGE_MS = 30 * 60 * 1000;
|
|
33
|
-
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Types
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
|
|
38
|
-
/** All host-proxy capabilities checked against each interface on register. */
|
|
39
|
-
const ALL_CAPABILITIES: HostProxyCapability[] = [
|
|
40
|
-
"host_bash",
|
|
41
|
-
"host_file",
|
|
42
|
-
"host_cu",
|
|
43
|
-
"host_browser",
|
|
44
|
-
];
|
|
45
|
-
|
|
46
|
-
export interface ClientEntry {
|
|
47
|
-
/** Stable identifier for this client connection. */
|
|
48
|
-
clientId: string;
|
|
49
|
-
/** Interface type (e.g. "macos", "ios", "web", "chrome-extension"). */
|
|
50
|
-
interfaceId: InterfaceId;
|
|
51
|
-
/** Host-proxy capabilities this client supports. */
|
|
52
|
-
capabilities: HostProxyCapability[];
|
|
53
|
-
/** Wall-clock timestamp (ms) when the client first connected. */
|
|
54
|
-
connectedAt: number;
|
|
55
|
-
/** Wall-clock timestamp (ms) of the most recent activity. */
|
|
56
|
-
lastActiveAt: number;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** Serialized form returned by the IPC route / CLI command. */
|
|
60
|
-
export interface ClientEntryJSON {
|
|
61
|
-
clientId: string;
|
|
62
|
-
interfaceId: InterfaceId;
|
|
63
|
-
capabilities: HostProxyCapability[];
|
|
64
|
-
connectedAt: string;
|
|
65
|
-
lastActiveAt: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// Registry
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
export class ClientRegistry {
|
|
73
|
-
private clients = new Map<string, ClientEntry>();
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Register or refresh a client connection.
|
|
77
|
-
*
|
|
78
|
-
* If a client with the same `clientId` already exists, its `lastActiveAt`
|
|
79
|
-
* is updated. Otherwise a new entry is created with derived capabilities.
|
|
80
|
-
*/
|
|
81
|
-
register(opts: { clientId: string; interfaceId: InterfaceId }): ClientEntry {
|
|
82
|
-
const existing = this.clients.get(opts.clientId);
|
|
83
|
-
const now = Date.now();
|
|
84
|
-
|
|
85
|
-
if (existing) {
|
|
86
|
-
existing.lastActiveAt = now;
|
|
87
|
-
log.debug(
|
|
88
|
-
{ clientId: opts.clientId, interfaceId: opts.interfaceId },
|
|
89
|
-
"client refreshed",
|
|
90
|
-
);
|
|
91
|
-
return existing;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const capabilities = ALL_CAPABILITIES.filter((cap) =>
|
|
95
|
-
supportsHostProxy(opts.interfaceId, cap),
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
const entry: ClientEntry = {
|
|
99
|
-
clientId: opts.clientId,
|
|
100
|
-
interfaceId: opts.interfaceId,
|
|
101
|
-
capabilities,
|
|
102
|
-
connectedAt: now,
|
|
103
|
-
lastActiveAt: now,
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
this.clients.set(opts.clientId, entry);
|
|
107
|
-
log.info(
|
|
108
|
-
{
|
|
109
|
-
clientId: opts.clientId,
|
|
110
|
-
interfaceId: opts.interfaceId,
|
|
111
|
-
capabilities,
|
|
112
|
-
},
|
|
113
|
-
"client registered",
|
|
114
|
-
);
|
|
115
|
-
return entry;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Remove a client connection. No-op if the clientId is not registered.
|
|
120
|
-
*/
|
|
121
|
-
unregister(clientId: string): void {
|
|
122
|
-
const entry = this.clients.get(clientId);
|
|
123
|
-
if (!entry) return;
|
|
124
|
-
this.clients.delete(clientId);
|
|
125
|
-
log.info(
|
|
126
|
-
{ clientId, interfaceId: entry.interfaceId },
|
|
127
|
-
"client unregistered",
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Update `lastActiveAt` for a client without changing other fields.
|
|
133
|
-
* No-op if the clientId is not registered.
|
|
134
|
-
*/
|
|
135
|
-
touch(clientId: string): void {
|
|
136
|
-
const entry = this.clients.get(clientId);
|
|
137
|
-
if (entry) {
|
|
138
|
-
entry.lastActiveAt = Date.now();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Return a specific client entry, or `undefined` if not registered.
|
|
144
|
-
*/
|
|
145
|
-
get(clientId: string): ClientEntry | undefined {
|
|
146
|
-
return this.clients.get(clientId);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Return all registered clients, sorted by `lastActiveAt` descending
|
|
151
|
-
* (most recently active first). Lazily evicts stale entries before
|
|
152
|
-
* returning so disconnected clients don't linger indefinitely.
|
|
153
|
-
*/
|
|
154
|
-
listAll(): ClientEntry[] {
|
|
155
|
-
this.evictStale();
|
|
156
|
-
return Array.from(this.clients.values()).sort(
|
|
157
|
-
(a, b) => b.lastActiveAt - a.lastActiveAt,
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Return all registered clients that support the given capability,
|
|
163
|
-
* sorted by `lastActiveAt` descending.
|
|
164
|
-
*/
|
|
165
|
-
listByCapability(capability: HostProxyCapability): ClientEntry[] {
|
|
166
|
-
return this.listAll().filter((e) => e.capabilities.includes(capability));
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Return the most recently active client that supports the given
|
|
171
|
-
* capability, or `undefined` if none exists.
|
|
172
|
-
*/
|
|
173
|
-
getMostRecentByCapability(
|
|
174
|
-
capability: HostProxyCapability,
|
|
175
|
-
): ClientEntry | undefined {
|
|
176
|
-
return this.listByCapability(capability)[0];
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Return all registered clients with the given interface type,
|
|
181
|
-
* sorted by `lastActiveAt` descending.
|
|
182
|
-
*/
|
|
183
|
-
listByInterface(interfaceId: InterfaceId): ClientEntry[] {
|
|
184
|
-
return this.listAll().filter((e) => e.interfaceId === interfaceId);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Return the most recently active client with the given interface type,
|
|
189
|
-
* or `undefined` if none exists.
|
|
190
|
-
*/
|
|
191
|
-
getMostRecentByInterface(interfaceId: InterfaceId): ClientEntry | undefined {
|
|
192
|
-
return this.listByInterface(interfaceId)[0];
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Remove entries whose `lastActiveAt` is older than `maxAgeMs`.
|
|
197
|
-
* Called lazily before reads to prevent unbounded map growth from
|
|
198
|
-
* churning client IDs that are never explicitly unregistered.
|
|
199
|
-
*
|
|
200
|
-
* @returns Number of evicted entries.
|
|
201
|
-
*/
|
|
202
|
-
evictStale(maxAgeMs: number = DEFAULT_STALE_AGE_MS): number {
|
|
203
|
-
const cutoff = Date.now() - maxAgeMs;
|
|
204
|
-
let evicted = 0;
|
|
205
|
-
for (const [id, entry] of this.clients) {
|
|
206
|
-
if (entry.lastActiveAt < cutoff) {
|
|
207
|
-
this.clients.delete(id);
|
|
208
|
-
evicted++;
|
|
209
|
-
log.debug(
|
|
210
|
-
{ clientId: id, interfaceId: entry.interfaceId },
|
|
211
|
-
"client evicted (stale)",
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return evicted;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Number of currently registered clients.
|
|
220
|
-
*/
|
|
221
|
-
get size(): number {
|
|
222
|
-
return this.clients.size;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Serialize a client entry to JSON (ISO timestamps).
|
|
227
|
-
*/
|
|
228
|
-
static toJSON(entry: ClientEntry): ClientEntryJSON {
|
|
229
|
-
return {
|
|
230
|
-
clientId: entry.clientId,
|
|
231
|
-
interfaceId: entry.interfaceId,
|
|
232
|
-
capabilities: entry.capabilities,
|
|
233
|
-
connectedAt: new Date(entry.connectedAt).toISOString(),
|
|
234
|
-
lastActiveAt: new Date(entry.lastActiveAt).toISOString(),
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// ── Module-level singleton ────────────────────────────────────────────────
|
|
240
|
-
|
|
241
|
-
let instance: ClientRegistry | null = null;
|
|
242
|
-
|
|
243
|
-
export function getClientRegistry(): ClientRegistry {
|
|
244
|
-
if (!instance) instance = new ClientRegistry();
|
|
245
|
-
return instance;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Test helper: reset the module-level singleton so each test starts with a
|
|
250
|
-
* fresh registry.
|
|
251
|
-
*/
|
|
252
|
-
export function __resetClientRegistryForTests(): void {
|
|
253
|
-
instance = null;
|
|
254
|
-
}
|
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verification code intercept stage: validates and consumes verification
|
|
3
|
-
* codes, applies role-specific side effects (guardian binding creation,
|
|
4
|
-
* trusted-contact activation signals), upserts member records, and delivers
|
|
5
|
-
* deterministic template-driven replies.
|
|
6
|
-
*
|
|
7
|
-
* This is the dispatch point for channel-based post-verification side
|
|
8
|
-
* effects. Voice verification has its own dispatch in relay-server.ts.
|
|
9
|
-
* Both guardian and trusted-contact flows converge here after
|
|
10
|
-
* validateAndConsumeVerification() returns success.
|
|
11
|
-
*
|
|
12
|
-
* Verification code messages are short-circuited here and NEVER enter the
|
|
13
|
-
* agent pipeline. This prevents verification codes from producing
|
|
14
|
-
* agent-generated copy.
|
|
15
|
-
*/
|
|
16
|
-
import type { ChannelId } from "../../../channels/types.js";
|
|
17
|
-
import { findContactChannel } from "../../../contacts/contact-store.js";
|
|
18
|
-
import {
|
|
19
|
-
createGuardianBinding,
|
|
20
|
-
revokeGuardianBinding,
|
|
21
|
-
upsertContactChannel,
|
|
22
|
-
} from "../../../contacts/contacts-write.js";
|
|
23
|
-
import {
|
|
24
|
-
clearPendingVerificationReply,
|
|
25
|
-
storePendingVerificationReply,
|
|
26
|
-
} from "../../../memory/delivery-channels.js";
|
|
27
|
-
import { emitNotificationSignal } from "../../../notifications/emit-signal.js";
|
|
28
|
-
import type { NotificationSourceChannel } from "../../../notifications/signal.js";
|
|
29
|
-
import { canonicalizeInboundIdentity } from "../../../util/canonicalize-identity.js";
|
|
30
|
-
import { getLogger } from "../../../util/logger.js";
|
|
31
|
-
import {
|
|
32
|
-
findActiveSession,
|
|
33
|
-
getGuardianBinding,
|
|
34
|
-
getPendingSession,
|
|
35
|
-
validateAndConsumeVerification,
|
|
36
|
-
} from "../../channel-verification-service.js";
|
|
37
|
-
import { deliverChannelReply } from "../../gateway-client.js";
|
|
38
|
-
import {
|
|
39
|
-
composeChannelVerifyReply,
|
|
40
|
-
GUARDIAN_VERIFY_TEMPLATE_KEYS,
|
|
41
|
-
} from "../../verification-templates.js";
|
|
42
|
-
import { stripVerificationFailurePrefix } from "../channel-route-shared.js";
|
|
43
|
-
|
|
44
|
-
const log = getLogger("runtime-http");
|
|
45
|
-
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
// Public API
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
|
|
50
|
-
export interface VerificationInterceptParams {
|
|
51
|
-
isDuplicate: boolean;
|
|
52
|
-
guardianVerifyCode: string | undefined;
|
|
53
|
-
rawSenderId: string | undefined;
|
|
54
|
-
canonicalSenderId: string | null;
|
|
55
|
-
canonicalAssistantId: string;
|
|
56
|
-
sourceChannel: ChannelId;
|
|
57
|
-
conversationExternalId: string;
|
|
58
|
-
conversationId: string;
|
|
59
|
-
eventId: string;
|
|
60
|
-
replyCallbackUrl: string | undefined;
|
|
61
|
-
assistantId: string;
|
|
62
|
-
actorDisplayName: string | undefined;
|
|
63
|
-
actorUsername: string | undefined;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Intercept guardian verification codes and handle them deterministically.
|
|
68
|
-
*
|
|
69
|
-
* Bare 6-digit codes are only intercepted when there is actually a
|
|
70
|
-
* pending challenge or active outbound session for this channel.
|
|
71
|
-
* Without this guard, normal 6-digit messages (zip codes, PINs, etc.)
|
|
72
|
-
* would be swallowed by the verification handler and never reach the
|
|
73
|
-
* agent pipeline.
|
|
74
|
-
*
|
|
75
|
-
* Returns a Response if the verification was handled, or null to continue
|
|
76
|
-
* the pipeline.
|
|
77
|
-
*/
|
|
78
|
-
export async function handleVerificationIntercept(
|
|
79
|
-
params: VerificationInterceptParams,
|
|
80
|
-
): Promise<Record<string, unknown> | null> {
|
|
81
|
-
const {
|
|
82
|
-
isDuplicate,
|
|
83
|
-
guardianVerifyCode,
|
|
84
|
-
rawSenderId,
|
|
85
|
-
canonicalSenderId,
|
|
86
|
-
canonicalAssistantId,
|
|
87
|
-
sourceChannel,
|
|
88
|
-
conversationExternalId,
|
|
89
|
-
conversationId,
|
|
90
|
-
eventId,
|
|
91
|
-
replyCallbackUrl,
|
|
92
|
-
assistantId,
|
|
93
|
-
actorDisplayName,
|
|
94
|
-
actorUsername,
|
|
95
|
-
} = params;
|
|
96
|
-
|
|
97
|
-
// Only intercept when there is a pending challenge or active outbound session
|
|
98
|
-
const shouldIntercept =
|
|
99
|
-
guardianVerifyCode !== undefined &&
|
|
100
|
-
(!!getPendingSession(sourceChannel) || !!findActiveSession(sourceChannel));
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
isDuplicate ||
|
|
104
|
-
!shouldIntercept ||
|
|
105
|
-
guardianVerifyCode === undefined ||
|
|
106
|
-
!rawSenderId
|
|
107
|
-
) {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const verifyResult = validateAndConsumeVerification(
|
|
112
|
-
sourceChannel,
|
|
113
|
-
guardianVerifyCode,
|
|
114
|
-
canonicalSenderId ?? rawSenderId,
|
|
115
|
-
conversationExternalId,
|
|
116
|
-
actorUsername,
|
|
117
|
-
actorDisplayName,
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
const guardianVerifyOutcome: "verified" | "failed" = verifyResult.success
|
|
121
|
-
? "verified"
|
|
122
|
-
: "failed";
|
|
123
|
-
|
|
124
|
-
if (verifyResult.success) {
|
|
125
|
-
const existingContactResult =
|
|
126
|
-
(canonicalSenderId ?? rawSenderId)
|
|
127
|
-
? findContactChannel({
|
|
128
|
-
channelType: sourceChannel,
|
|
129
|
-
externalUserId: canonicalSenderId ?? rawSenderId,
|
|
130
|
-
externalChatId: conversationExternalId,
|
|
131
|
-
})
|
|
132
|
-
: null;
|
|
133
|
-
const existingChannel = existingContactResult?.channel ?? null;
|
|
134
|
-
const existingContact = existingContactResult?.contact ?? null;
|
|
135
|
-
const memberMatchesSender = existingChannel?.externalUserId
|
|
136
|
-
? canonicalizeInboundIdentity(
|
|
137
|
-
sourceChannel,
|
|
138
|
-
existingChannel.externalUserId,
|
|
139
|
-
) === (canonicalSenderId ?? rawSenderId)
|
|
140
|
-
: false;
|
|
141
|
-
const preservedDisplayName =
|
|
142
|
-
memberMatchesSender && existingContact?.displayName?.trim().length
|
|
143
|
-
? existingContact.displayName
|
|
144
|
-
: actorDisplayName;
|
|
145
|
-
|
|
146
|
-
upsertContactChannel({
|
|
147
|
-
sourceChannel,
|
|
148
|
-
externalUserId: canonicalSenderId ?? rawSenderId,
|
|
149
|
-
externalChatId: conversationExternalId,
|
|
150
|
-
status: "active",
|
|
151
|
-
policy: "allow",
|
|
152
|
-
// Keep guardian-curated member name stable across re-verification.
|
|
153
|
-
displayName: preservedDisplayName,
|
|
154
|
-
username: actorUsername,
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// Guardian-specific side effect: create/update the guardian binding.
|
|
158
|
-
// This was previously inside validateAndConsumeVerification but is now
|
|
159
|
-
// handled here so both verification types have symmetric dispatch.
|
|
160
|
-
if (verifyResult.verificationType === "guardian") {
|
|
161
|
-
// Reject if a different user already holds the guardian binding
|
|
162
|
-
const existingBinding = getGuardianBinding(
|
|
163
|
-
canonicalAssistantId,
|
|
164
|
-
sourceChannel,
|
|
165
|
-
);
|
|
166
|
-
if (
|
|
167
|
-
existingBinding &&
|
|
168
|
-
existingBinding.guardianExternalUserId !==
|
|
169
|
-
(canonicalSenderId ?? rawSenderId)
|
|
170
|
-
) {
|
|
171
|
-
// Edge case: another user already bound. Log and skip binding creation.
|
|
172
|
-
// The upsertContactChannel above already succeeded, so the sender is a known contact,
|
|
173
|
-
// but they won't get guardian role.
|
|
174
|
-
log.warn(
|
|
175
|
-
{
|
|
176
|
-
sourceChannel,
|
|
177
|
-
existingGuardian: existingBinding.guardianExternalUserId,
|
|
178
|
-
},
|
|
179
|
-
"Guardian binding conflict: another user already holds this channel binding",
|
|
180
|
-
);
|
|
181
|
-
} else {
|
|
182
|
-
// Revoke any existing active binding before creating a new one (same-user re-verification)
|
|
183
|
-
revokeGuardianBinding(sourceChannel);
|
|
184
|
-
|
|
185
|
-
const metadata: Record<string, string> = {};
|
|
186
|
-
if (actorUsername && actorUsername.trim().length > 0) {
|
|
187
|
-
metadata.username = actorUsername.trim();
|
|
188
|
-
}
|
|
189
|
-
if (actorDisplayName && actorDisplayName.trim().length > 0) {
|
|
190
|
-
metadata.displayName = actorDisplayName.trim();
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Unify all channel bindings onto the canonical (vellum) principal
|
|
194
|
-
const vellumBinding = getGuardianBinding(
|
|
195
|
-
canonicalAssistantId,
|
|
196
|
-
"vellum",
|
|
197
|
-
);
|
|
198
|
-
const canonicalPrincipal =
|
|
199
|
-
vellumBinding?.guardianPrincipalId ??
|
|
200
|
-
canonicalSenderId ??
|
|
201
|
-
rawSenderId;
|
|
202
|
-
|
|
203
|
-
createGuardianBinding({
|
|
204
|
-
channel: sourceChannel,
|
|
205
|
-
guardianExternalUserId: canonicalSenderId ?? rawSenderId,
|
|
206
|
-
guardianDeliveryChatId: conversationExternalId,
|
|
207
|
-
guardianPrincipalId: canonicalPrincipal,
|
|
208
|
-
verifiedVia: "challenge",
|
|
209
|
-
metadataJson:
|
|
210
|
-
Object.keys(metadata).length > 0 ? JSON.stringify(metadata) : null,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const verifyLogLabel =
|
|
216
|
-
verifyResult.verificationType === "trusted_contact"
|
|
217
|
-
? "Trusted contact verified"
|
|
218
|
-
: "Guardian verified";
|
|
219
|
-
log.info(
|
|
220
|
-
{
|
|
221
|
-
sourceChannel,
|
|
222
|
-
externalUserId: canonicalSenderId,
|
|
223
|
-
verificationType: verifyResult.verificationType,
|
|
224
|
-
},
|
|
225
|
-
`${verifyLogLabel}: auto-upserted ingress member`,
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// Emit activated signal when a trusted contact completes verification.
|
|
229
|
-
// Member record is persisted above before this event fires, satisfying
|
|
230
|
-
// the persistence-before-event ordering invariant.
|
|
231
|
-
if (verifyResult.verificationType === "trusted_contact") {
|
|
232
|
-
void emitNotificationSignal({
|
|
233
|
-
sourceEventName: "ingress.trusted_contact.activated",
|
|
234
|
-
sourceChannel: sourceChannel as NotificationSourceChannel,
|
|
235
|
-
sourceContextId: conversationId,
|
|
236
|
-
attentionHints: {
|
|
237
|
-
requiresAction: false,
|
|
238
|
-
urgency: "low",
|
|
239
|
-
isAsyncBackground: false,
|
|
240
|
-
visibleInSourceNow: false,
|
|
241
|
-
},
|
|
242
|
-
contextPayload: {
|
|
243
|
-
sourceChannel,
|
|
244
|
-
actorExternalId: canonicalSenderId ?? rawSenderId,
|
|
245
|
-
conversationExternalId,
|
|
246
|
-
actorDisplayName: actorDisplayName ?? null,
|
|
247
|
-
actorUsername: actorUsername ?? null,
|
|
248
|
-
},
|
|
249
|
-
dedupeKey: `trusted-contact:activated:${canonicalAssistantId}:${sourceChannel}:${
|
|
250
|
-
canonicalSenderId ?? rawSenderId
|
|
251
|
-
}`,
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Deliver a deterministic template-driven reply and short-circuit.
|
|
257
|
-
// Verification code messages must never produce agent-generated copy.
|
|
258
|
-
if (replyCallbackUrl) {
|
|
259
|
-
let replyText: string;
|
|
260
|
-
if (!verifyResult.success) {
|
|
261
|
-
replyText = composeChannelVerifyReply(
|
|
262
|
-
GUARDIAN_VERIFY_TEMPLATE_KEYS.CHANNEL_VERIFY_FAILED,
|
|
263
|
-
{ failureReason: stripVerificationFailurePrefix(verifyResult.reason) },
|
|
264
|
-
);
|
|
265
|
-
} else {
|
|
266
|
-
replyText = composeChannelVerifyReply(
|
|
267
|
-
GUARDIAN_VERIFY_TEMPLATE_KEYS.CHANNEL_VERIFY_SUCCESS,
|
|
268
|
-
{ verificationType: verifyResult.verificationType },
|
|
269
|
-
);
|
|
270
|
-
}
|
|
271
|
-
try {
|
|
272
|
-
await deliverChannelReply(replyCallbackUrl, {
|
|
273
|
-
chatId: conversationExternalId,
|
|
274
|
-
text: replyText,
|
|
275
|
-
assistantId,
|
|
276
|
-
});
|
|
277
|
-
} catch (err) {
|
|
278
|
-
// The challenge is already consumed and side effects applied, so
|
|
279
|
-
// we cannot simply re-throw and let the gateway retry the full
|
|
280
|
-
// flow. Instead, persist the reply so that gateway retries
|
|
281
|
-
// (which arrive as duplicates) can re-attempt delivery.
|
|
282
|
-
log.error(
|
|
283
|
-
{ err, conversationExternalId },
|
|
284
|
-
"Failed to deliver deterministic verification reply; persisting for retry",
|
|
285
|
-
);
|
|
286
|
-
storePendingVerificationReply(eventId, {
|
|
287
|
-
chatId: conversationExternalId,
|
|
288
|
-
text: replyText,
|
|
289
|
-
assistantId,
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// Self-retry after a short delay. The gateway deduplicates
|
|
293
|
-
// inbound webhooks after a successful forward, so duplicate
|
|
294
|
-
// retries may never arrive. This fire-and-forget retry ensures
|
|
295
|
-
// delivery is re-attempted even without a gateway duplicate.
|
|
296
|
-
setTimeout(async () => {
|
|
297
|
-
try {
|
|
298
|
-
await deliverChannelReply(replyCallbackUrl, {
|
|
299
|
-
chatId: conversationExternalId,
|
|
300
|
-
text: replyText,
|
|
301
|
-
assistantId,
|
|
302
|
-
});
|
|
303
|
-
log.info({ eventId }, "Verification reply delivered on self-retry");
|
|
304
|
-
clearPendingVerificationReply(eventId);
|
|
305
|
-
} catch (retryErr) {
|
|
306
|
-
log.error(
|
|
307
|
-
{ err: retryErr, eventId },
|
|
308
|
-
"Verification reply self-retry also failed; pending reply remains as fallback",
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
}, 3000);
|
|
312
|
-
|
|
313
|
-
return ({
|
|
314
|
-
accepted: true,
|
|
315
|
-
duplicate: false,
|
|
316
|
-
eventId,
|
|
317
|
-
verificationOutcome: guardianVerifyOutcome,
|
|
318
|
-
deliveryPending: true,
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return ({
|
|
324
|
-
accepted: true,
|
|
325
|
-
duplicate: false,
|
|
326
|
-
eventId,
|
|
327
|
-
verificationOutcome: guardianVerifyOutcome,
|
|
328
|
-
});
|
|
329
|
-
}
|