@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
|
@@ -3,13 +3,12 @@ import * as path from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import { v4 as uuid } from "uuid";
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
attachFileBackedAttachmentToMessage,
|
|
8
|
-
} from "../../memory/attachments-store.js";
|
|
6
|
+
import { attachFileBackedAttachmentToMessage } from "../../memory/attachments-store.js";
|
|
9
7
|
import { addMessage, getConversation } from "../../memory/conversation-crud.js";
|
|
10
8
|
import { syncMessageToDisk } from "../../memory/conversation-disk-view.js";
|
|
9
|
+
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
11
10
|
import type { RecordingOptions, RecordingStatus } from "../message-protocol.js";
|
|
12
|
-
import {
|
|
11
|
+
import { log } from "./shared.js";
|
|
13
12
|
|
|
14
13
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
15
14
|
|
|
@@ -79,7 +78,6 @@ const deferredRestartByConversation = new Map<string, DeferredRestartParams>();
|
|
|
79
78
|
export function handleRecordingStart(
|
|
80
79
|
conversationId: string,
|
|
81
80
|
options: RecordingOptions | undefined,
|
|
82
|
-
ctx: HandlerContext,
|
|
83
81
|
operationToken?: string,
|
|
84
82
|
): string | null {
|
|
85
83
|
const existingRecordingId = recordingOwnerByConversation.get(conversationId);
|
|
@@ -112,7 +110,7 @@ export function handleRecordingStart(
|
|
|
112
110
|
standaloneRecordingConversationId.set(recordingId, conversationId);
|
|
113
111
|
recordingOwnerByConversation.set(conversationId, recordingId);
|
|
114
112
|
|
|
115
|
-
|
|
113
|
+
broadcastMessage({
|
|
116
114
|
type: "recording_start",
|
|
117
115
|
recordingId,
|
|
118
116
|
attachToConversationId: conversationId,
|
|
@@ -141,7 +139,6 @@ export function handleRecordingStart(
|
|
|
141
139
|
*/
|
|
142
140
|
export function handleRecordingStop(
|
|
143
141
|
conversationId: string,
|
|
144
|
-
ctx: HandlerContext,
|
|
145
142
|
): string | undefined {
|
|
146
143
|
let recordingId = recordingOwnerByConversation.get(conversationId);
|
|
147
144
|
let ownerConversationId = conversationId;
|
|
@@ -165,7 +162,7 @@ export function handleRecordingStop(
|
|
|
165
162
|
return undefined;
|
|
166
163
|
}
|
|
167
164
|
|
|
168
|
-
|
|
165
|
+
broadcastMessage({
|
|
169
166
|
type: "recording_stop",
|
|
170
167
|
recordingId,
|
|
171
168
|
});
|
|
@@ -204,116 +201,6 @@ export function handleRecordingStop(
|
|
|
204
201
|
return recordingId;
|
|
205
202
|
}
|
|
206
203
|
|
|
207
|
-
// ─── Restart ─────────────────────────────────────────────────────────────────
|
|
208
|
-
|
|
209
|
-
export interface RecordingRestartResult {
|
|
210
|
-
/** Whether the restart was initiated. false if no recording was active to stop. */
|
|
211
|
-
initiated: boolean;
|
|
212
|
-
/** The operation token threaded through the stop+start cycle. */
|
|
213
|
-
operationToken?: string;
|
|
214
|
-
/** Response text for the user. */
|
|
215
|
-
responseText: string;
|
|
216
|
-
/** When initiated is false, explains why the restart could not proceed. */
|
|
217
|
-
reason?: "no_active_recording" | "restart_in_progress";
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Restart the active recording: stop the current one, then defer starting a
|
|
222
|
-
* new one until the client acknowledges the stop via a 'stopped' status
|
|
223
|
-
* callback.
|
|
224
|
-
*
|
|
225
|
-
* This prevents a race condition where the macOS client processes
|
|
226
|
-
* recording_stop asynchronously — if recording_start arrives before the
|
|
227
|
-
* async stop completes, RecordingManager.start() rejects because state is
|
|
228
|
-
* still active.
|
|
229
|
-
*
|
|
230
|
-
* Uses an operation token to guard against stale async completions from
|
|
231
|
-
* a previous restart cycle. The token is:
|
|
232
|
-
* 1. Generated here and stored as `activeRestartToken`
|
|
233
|
-
* 2. Stored in `deferredRestartByConversation` for later use
|
|
234
|
-
* 3. Threaded through to the new `recording_start` message when the stop ack arrives
|
|
235
|
-
* 4. Validated when `recording_status` callbacks arrive
|
|
236
|
-
*
|
|
237
|
-
* If the stop fails or times out, the deferred restart state is cleaned up.
|
|
238
|
-
*/
|
|
239
|
-
export function handleRecordingRestart(
|
|
240
|
-
conversationId: string,
|
|
241
|
-
ctx: HandlerContext,
|
|
242
|
-
): RecordingRestartResult {
|
|
243
|
-
// Generate a restart operation token for race hardening
|
|
244
|
-
const operationToken = uuid();
|
|
245
|
-
|
|
246
|
-
// Stop current recording (if any)
|
|
247
|
-
const stoppedRecordingId = handleRecordingStop(conversationId, ctx);
|
|
248
|
-
|
|
249
|
-
if (!stoppedRecordingId) {
|
|
250
|
-
// No active recording — check if mid-restart (state is not truly idle)
|
|
251
|
-
if (pendingRestartByConversation.has(conversationId)) {
|
|
252
|
-
log.info(
|
|
253
|
-
{ conversationId },
|
|
254
|
-
"Restart requested while another restart is pending",
|
|
255
|
-
);
|
|
256
|
-
return {
|
|
257
|
-
initiated: false,
|
|
258
|
-
reason: "restart_in_progress",
|
|
259
|
-
responseText: "A restart is already in progress.",
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
log.info(
|
|
264
|
-
{ conversationId },
|
|
265
|
-
"Restart requested but no active recording to stop",
|
|
266
|
-
);
|
|
267
|
-
return {
|
|
268
|
-
initiated: false,
|
|
269
|
-
reason: "no_active_recording",
|
|
270
|
-
responseText: "No active recording to restart.",
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Resolve the actual owner conversation ID. When conversation B requests
|
|
275
|
-
// a restart but the recording is owned by conversation A (cross-conversation
|
|
276
|
-
// restart via global fallback), the deferred restart must be keyed by A's
|
|
277
|
-
// conversationId because the stopped callback resolves the conversationId
|
|
278
|
-
// from standaloneRecordingConversationId (which maps to A, the owner).
|
|
279
|
-
// This lookup must happen BEFORE cleanupMaps removes the entry.
|
|
280
|
-
const ownerConversationId =
|
|
281
|
-
standaloneRecordingConversationId.get(stoppedRecordingId) ?? conversationId;
|
|
282
|
-
if (ownerConversationId !== conversationId) {
|
|
283
|
-
log.info(
|
|
284
|
-
{ conversationId, ownerConversationId, stoppedRecordingId },
|
|
285
|
-
"Cross-conversation restart: keying deferred restart by owner conversation",
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Atomically set the restart token and pending state so that:
|
|
290
|
-
// 1. Stale completions from a previous cycle are rejected
|
|
291
|
-
// 2. "no active recording" checks know we're mid-restart
|
|
292
|
-
activeRestartToken = operationToken;
|
|
293
|
-
pendingRestartByConversation.set(ownerConversationId, operationToken);
|
|
294
|
-
|
|
295
|
-
// Store the deferred restart parameters. The actual recording_start will
|
|
296
|
-
// be sent when the 'stopped' status callback arrives in handleRecordingStatus,
|
|
297
|
-
// ensuring the client has fully completed the async stop before we start.
|
|
298
|
-
// Keyed by ownerConversationId so the stopped handler (which resolves
|
|
299
|
-
// conversationId from the recording's owner) can find this entry.
|
|
300
|
-
deferredRestartByConversation.set(ownerConversationId, {
|
|
301
|
-
conversationId,
|
|
302
|
-
operationToken,
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
log.info(
|
|
306
|
-
{ conversationId, ownerConversationId, operationToken, stoppedRecordingId },
|
|
307
|
-
"Recording restart initiated — start deferred until stop-ack",
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
return {
|
|
311
|
-
initiated: true,
|
|
312
|
-
operationToken,
|
|
313
|
-
responseText: "Restarting screen recording.",
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
204
|
// ─── Pause ───────────────────────────────────────────────────────────────────
|
|
318
205
|
|
|
319
206
|
/**
|
|
@@ -325,7 +212,6 @@ export function handleRecordingRestart(
|
|
|
325
212
|
*/
|
|
326
213
|
export function handleRecordingPause(
|
|
327
214
|
conversationId: string,
|
|
328
|
-
ctx: HandlerContext,
|
|
329
215
|
): string | undefined {
|
|
330
216
|
let recordingId = recordingOwnerByConversation.get(conversationId);
|
|
331
217
|
|
|
@@ -342,7 +228,7 @@ export function handleRecordingPause(
|
|
|
342
228
|
return undefined;
|
|
343
229
|
}
|
|
344
230
|
|
|
345
|
-
|
|
231
|
+
broadcastMessage({
|
|
346
232
|
type: "recording_pause",
|
|
347
233
|
recordingId,
|
|
348
234
|
});
|
|
@@ -362,7 +248,6 @@ export function handleRecordingPause(
|
|
|
362
248
|
*/
|
|
363
249
|
export function handleRecordingResume(
|
|
364
250
|
conversationId: string,
|
|
365
|
-
ctx: HandlerContext,
|
|
366
251
|
): string | undefined {
|
|
367
252
|
let recordingId = recordingOwnerByConversation.get(conversationId);
|
|
368
253
|
|
|
@@ -379,7 +264,7 @@ export function handleRecordingResume(
|
|
|
379
264
|
return undefined;
|
|
380
265
|
}
|
|
381
266
|
|
|
382
|
-
|
|
267
|
+
broadcastMessage({
|
|
383
268
|
type: "recording_resume",
|
|
384
269
|
recordingId,
|
|
385
270
|
});
|
|
@@ -448,9 +333,8 @@ async function finalizeAndPublishRecording(params: {
|
|
|
448
333
|
conversationId: string;
|
|
449
334
|
filePath?: string;
|
|
450
335
|
durationMs?: number;
|
|
451
|
-
ctx: HandlerContext;
|
|
452
336
|
}): Promise<{ success: boolean; messageId?: string }> {
|
|
453
|
-
const { recordingId, conversationId, filePath
|
|
337
|
+
const { recordingId, conversationId, filePath } = params;
|
|
454
338
|
|
|
455
339
|
// Idempotency guard: prevent double-finalization.
|
|
456
340
|
// Mark as finalized eagerly (before any async work) so concurrent calls
|
|
@@ -484,12 +368,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
484
368
|
"Failed to persist recording error message",
|
|
485
369
|
);
|
|
486
370
|
}
|
|
487
|
-
|
|
371
|
+
broadcastMessage({
|
|
488
372
|
type: "assistant_text_delta",
|
|
489
373
|
text: errorText,
|
|
490
374
|
conversationId: conversationId,
|
|
491
375
|
});
|
|
492
|
-
|
|
376
|
+
broadcastMessage({
|
|
493
377
|
type: "message_complete",
|
|
494
378
|
conversationId: conversationId,
|
|
495
379
|
});
|
|
@@ -537,12 +421,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
537
421
|
"Failed to persist recording error message",
|
|
538
422
|
);
|
|
539
423
|
}
|
|
540
|
-
|
|
424
|
+
broadcastMessage({
|
|
541
425
|
type: "assistant_text_delta",
|
|
542
426
|
text: errorText,
|
|
543
427
|
conversationId: conversationId,
|
|
544
428
|
});
|
|
545
|
-
|
|
429
|
+
broadcastMessage({
|
|
546
430
|
type: "message_complete",
|
|
547
431
|
conversationId: conversationId,
|
|
548
432
|
});
|
|
@@ -565,12 +449,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
565
449
|
"Failed to persist recording error message",
|
|
566
450
|
);
|
|
567
451
|
}
|
|
568
|
-
|
|
452
|
+
broadcastMessage({
|
|
569
453
|
type: "assistant_text_delta",
|
|
570
454
|
text: errorText,
|
|
571
455
|
conversationId: conversationId,
|
|
572
456
|
});
|
|
573
|
-
|
|
457
|
+
broadcastMessage({
|
|
574
458
|
type: "message_complete",
|
|
575
459
|
conversationId: conversationId,
|
|
576
460
|
});
|
|
@@ -598,12 +482,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
598
482
|
"Failed to persist recording error message",
|
|
599
483
|
);
|
|
600
484
|
}
|
|
601
|
-
|
|
485
|
+
broadcastMessage({
|
|
602
486
|
type: "assistant_text_delta",
|
|
603
487
|
text: errorText,
|
|
604
488
|
conversationId: conversationId,
|
|
605
489
|
});
|
|
606
|
-
|
|
490
|
+
broadcastMessage({
|
|
607
491
|
type: "message_complete",
|
|
608
492
|
conversationId: conversationId,
|
|
609
493
|
});
|
|
@@ -665,12 +549,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
665
549
|
const thumbnailData: string | undefined = undefined;
|
|
666
550
|
|
|
667
551
|
// Notify the client via broadcast
|
|
668
|
-
|
|
552
|
+
broadcastMessage({
|
|
669
553
|
type: "assistant_text_delta",
|
|
670
554
|
text: msgText,
|
|
671
555
|
conversationId: conversationId,
|
|
672
556
|
});
|
|
673
|
-
|
|
557
|
+
broadcastMessage({
|
|
674
558
|
type: "message_complete",
|
|
675
559
|
conversationId: conversationId,
|
|
676
560
|
attachments: [
|
|
@@ -705,12 +589,12 @@ async function finalizeAndPublishRecording(params: {
|
|
|
705
589
|
"Failed to persist recording error message",
|
|
706
590
|
);
|
|
707
591
|
}
|
|
708
|
-
|
|
592
|
+
broadcastMessage({
|
|
709
593
|
type: "assistant_text_delta",
|
|
710
594
|
text: errorText,
|
|
711
595
|
conversationId: conversationId,
|
|
712
596
|
});
|
|
713
|
-
|
|
597
|
+
broadcastMessage({
|
|
714
598
|
type: "message_complete",
|
|
715
599
|
conversationId: conversationId,
|
|
716
600
|
});
|
|
@@ -730,7 +614,6 @@ async function finalizeAndPublishRecording(params: {
|
|
|
730
614
|
*/
|
|
731
615
|
export async function handleRecordingStatusCore(
|
|
732
616
|
msg: RecordingStatus,
|
|
733
|
-
ctx: HandlerContext,
|
|
734
617
|
): Promise<void> {
|
|
735
618
|
const recordingId = msg.conversationId;
|
|
736
619
|
let conversationId = standaloneRecordingConversationId.get(recordingId);
|
|
@@ -830,12 +713,12 @@ export async function handleRecordingStatusCore(
|
|
|
830
713
|
activeRestartToken = null;
|
|
831
714
|
}
|
|
832
715
|
|
|
833
|
-
|
|
716
|
+
broadcastMessage({
|
|
834
717
|
type: "assistant_text_delta",
|
|
835
718
|
text: "Recording restart cancelled.",
|
|
836
719
|
conversationId: conversationId,
|
|
837
720
|
});
|
|
838
|
-
|
|
721
|
+
broadcastMessage({
|
|
839
722
|
type: "message_complete",
|
|
840
723
|
conversationId: conversationId,
|
|
841
724
|
});
|
|
@@ -884,7 +767,6 @@ export async function handleRecordingStatusCore(
|
|
|
884
767
|
const newRecordingId = handleRecordingStart(
|
|
885
768
|
deferred.conversationId,
|
|
886
769
|
{ promptForSource: true },
|
|
887
|
-
ctx,
|
|
888
770
|
deferred.operationToken,
|
|
889
771
|
);
|
|
890
772
|
|
|
@@ -955,19 +837,18 @@ export async function handleRecordingStatusCore(
|
|
|
955
837
|
conversationId,
|
|
956
838
|
filePath: msg.filePath,
|
|
957
839
|
durationMs: msg.durationMs,
|
|
958
|
-
ctx,
|
|
959
840
|
});
|
|
960
841
|
|
|
961
842
|
// Handle old-success + new-start-failure: the old recording saved
|
|
962
843
|
// but the new one couldn't start. Send explicit follow-up text so
|
|
963
844
|
// the user knows the state.
|
|
964
845
|
if (!newRecordingId && finResult.success) {
|
|
965
|
-
|
|
846
|
+
broadcastMessage({
|
|
966
847
|
type: "assistant_text_delta",
|
|
967
848
|
text: "Previous recording saved. New recording failed to start.",
|
|
968
849
|
conversationId: deferred.conversationId,
|
|
969
850
|
});
|
|
970
|
-
|
|
851
|
+
broadcastMessage({
|
|
971
852
|
type: "message_complete",
|
|
972
853
|
conversationId: deferred.conversationId,
|
|
973
854
|
});
|
|
@@ -984,7 +865,6 @@ export async function handleRecordingStatusCore(
|
|
|
984
865
|
conversationId,
|
|
985
866
|
filePath: msg.filePath,
|
|
986
867
|
durationMs: msg.durationMs,
|
|
987
|
-
ctx,
|
|
988
868
|
});
|
|
989
869
|
|
|
990
870
|
break;
|
|
@@ -996,12 +876,12 @@ export async function handleRecordingStatusCore(
|
|
|
996
876
|
"Standalone recording failed",
|
|
997
877
|
);
|
|
998
878
|
|
|
999
|
-
|
|
879
|
+
broadcastMessage({
|
|
1000
880
|
type: "assistant_text_delta",
|
|
1001
881
|
text: `Recording failed: ${msg.error ?? "unknown error"}`,
|
|
1002
882
|
conversationId: conversationId,
|
|
1003
883
|
});
|
|
1004
|
-
|
|
884
|
+
broadcastMessage({
|
|
1005
885
|
type: "message_complete",
|
|
1006
886
|
conversationId: conversationId,
|
|
1007
887
|
});
|
|
@@ -1025,18 +905,6 @@ export async function handleRecordingStatusCore(
|
|
|
1025
905
|
|
|
1026
906
|
// ─── Test helpers ────────────────────────────────────────────────────────────
|
|
1027
907
|
|
|
1028
|
-
/**
|
|
1029
|
-
* Inject a recording owner entry. Only for use in tests.
|
|
1030
|
-
* This allows tests to simulate a second active recording that blocks
|
|
1031
|
-
* handleRecordingStart's global single-active guard.
|
|
1032
|
-
*/
|
|
1033
|
-
export function __injectRecordingOwner(
|
|
1034
|
-
conversationId: string,
|
|
1035
|
-
recordingId: string,
|
|
1036
|
-
): void {
|
|
1037
|
-
recordingOwnerByConversation.set(conversationId, recordingId);
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
908
|
/** Reset module-level state. Only for use in tests. */
|
|
1041
909
|
export function __resetRecordingState(): void {
|
|
1042
910
|
for (const handle of pendingStopTimeouts.values()) {
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
|
-
import { broadcastToAllClients } from "../../acp/index.js";
|
|
4
3
|
import { getConfig } from "../../config/loader.js";
|
|
5
4
|
import type { LLMCallSite, Speed } from "../../config/schemas/llm.js";
|
|
6
5
|
import type { SecretPromptResult } from "../../permissions/secret-prompter.js";
|
|
7
6
|
import { isPlaceholderSentinelText } from "../../providers/anthropic/client.js";
|
|
7
|
+
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
8
8
|
import type { AuthContext } from "../../runtime/auth/types.js";
|
|
9
|
-
import type { DebouncerMap } from "../../util/debounce.js";
|
|
10
9
|
import { getLogger } from "../../util/logger.js";
|
|
11
10
|
import { estimateBase64Bytes } from "../assistant-attachments.js";
|
|
12
|
-
import {
|
|
13
|
-
import type {
|
|
14
|
-
ConversationTransportMetadata,
|
|
15
|
-
ServerMessage,
|
|
16
|
-
} from "../message-protocol.js";
|
|
11
|
+
import type { ConversationTransportMetadata } from "../message-protocol.js";
|
|
17
12
|
import type { TrustContext } from "../trust-context.js";
|
|
18
13
|
|
|
19
14
|
const log = getLogger("handlers");
|
|
@@ -26,7 +21,7 @@ export const CONFIG_RELOAD_DEBOUNCE_MS = 300;
|
|
|
26
21
|
const HISTORY_ATTACHMENT_TEXT_LIMIT = 500;
|
|
27
22
|
|
|
28
23
|
// Module-level map for non-conversation secret prompts (e.g. publish_page)
|
|
29
|
-
|
|
24
|
+
const pendingStandaloneSecrets = new Map<
|
|
30
25
|
string,
|
|
31
26
|
{
|
|
32
27
|
resolve: (result: SecretPromptResult) => void;
|
|
@@ -34,18 +29,6 @@ export const pendingStandaloneSecrets = new Map<
|
|
|
34
29
|
}
|
|
35
30
|
>();
|
|
36
31
|
|
|
37
|
-
// Pending signing responses (bundle signing orchestration), keyed by unique requestId
|
|
38
|
-
interface PendingSigningResolve {
|
|
39
|
-
resolve: (result: {
|
|
40
|
-
signature: string;
|
|
41
|
-
keyId: string;
|
|
42
|
-
publicKey: string;
|
|
43
|
-
}) => void;
|
|
44
|
-
reject: (err: Error) => void;
|
|
45
|
-
timer: ReturnType<typeof setTimeout>;
|
|
46
|
-
}
|
|
47
|
-
const pendingSignBundlePayload = new Map<string, PendingSigningResolve>();
|
|
48
|
-
|
|
49
32
|
export interface HistoryToolCall {
|
|
50
33
|
name: string;
|
|
51
34
|
input: Record<string, unknown>;
|
|
@@ -67,8 +50,16 @@ export interface HistoryToolCall {
|
|
|
67
50
|
riskLevel?: string;
|
|
68
51
|
/** Human-readable reason for the risk classification. */
|
|
69
52
|
riskReason?: string;
|
|
53
|
+
/** ID of the trust rule that matched this invocation (if any). */
|
|
54
|
+
matchedTrustRuleId?: string;
|
|
70
55
|
/** Whether the tool was auto-approved (true) or required explicit user input (false). */
|
|
71
56
|
autoApproved?: boolean;
|
|
57
|
+
/** How the approval decision was reached: prompted, auto, blocked, or unknown (legacy). */
|
|
58
|
+
approvalMode?: string;
|
|
59
|
+
/** Why the approval decision was reached (stable enum for client display). */
|
|
60
|
+
approvalReason?: string;
|
|
61
|
+
/** Snapshot of the auto-approve threshold at execution time. */
|
|
62
|
+
riskThreshold?: string;
|
|
72
63
|
}
|
|
73
64
|
|
|
74
65
|
export interface HistorySurface {
|
|
@@ -133,11 +124,12 @@ export interface ConversationCreateOptions {
|
|
|
133
124
|
authContext?: AuthContext;
|
|
134
125
|
/** Whether this turn can block on interactive approval prompts. */
|
|
135
126
|
isInteractive?: boolean;
|
|
127
|
+
/** Slack-only non-persisted notice injected into the active model turn. */
|
|
128
|
+
slackRuntimeContextNotice?: string;
|
|
136
129
|
memoryScopeId?: string;
|
|
137
130
|
/** Channel command intent metadata (e.g. Telegram /start). */
|
|
138
131
|
commandIntent?: { type: string; payload?: string; languageCode?: string };
|
|
139
|
-
|
|
140
|
-
onEvent?: (msg: ServerMessage) => void;
|
|
132
|
+
|
|
141
133
|
/**
|
|
142
134
|
* Optional explicit model override (provider/model string) for this
|
|
143
135
|
* conversation's agent loop. Used by the auto-analyze loop to pin the
|
|
@@ -160,27 +152,6 @@ export interface ConversationCreateOptions {
|
|
|
160
152
|
slackInbound?: SlackInboundMessageMetadata;
|
|
161
153
|
}
|
|
162
154
|
|
|
163
|
-
/**
|
|
164
|
-
* Shared context that handlers need from the DaemonServer.
|
|
165
|
-
* Keeps handlers decoupled from the server class itself.
|
|
166
|
-
*/
|
|
167
|
-
export interface HandlerContext {
|
|
168
|
-
sharedRequestTimestamps: number[];
|
|
169
|
-
debounceTimers: DebouncerMap;
|
|
170
|
-
suppressConfigReload: boolean;
|
|
171
|
-
setSuppressConfigReload(value: boolean): void;
|
|
172
|
-
updateConfigFingerprint(): void;
|
|
173
|
-
send(msg: ServerMessage): void;
|
|
174
|
-
broadcast(msg: ServerMessage): void;
|
|
175
|
-
clearAllConversations(): number;
|
|
176
|
-
getOrCreateConversation(
|
|
177
|
-
conversationId: string,
|
|
178
|
-
options?: ConversationCreateOptions,
|
|
179
|
-
): Promise<Conversation>;
|
|
180
|
-
/** Refresh the eviction timestamp for a conversation that was accessed directly. */
|
|
181
|
-
touchConversation(conversationId: string): void;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
155
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
185
156
|
return typeof value === "object" && value != null;
|
|
186
157
|
}
|
|
@@ -385,8 +356,16 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
385
356
|
entry.riskLevel = block._riskLevel;
|
|
386
357
|
if (typeof block._riskReason === "string")
|
|
387
358
|
entry.riskReason = block._riskReason;
|
|
359
|
+
if (typeof block._matchedTrustRuleId === "string")
|
|
360
|
+
entry.matchedTrustRuleId = block._matchedTrustRuleId;
|
|
388
361
|
if (typeof block._autoApproved === "boolean")
|
|
389
362
|
entry.autoApproved = block._autoApproved;
|
|
363
|
+
if (typeof block._approvalMode === "string")
|
|
364
|
+
entry.approvalMode = block._approvalMode;
|
|
365
|
+
if (typeof block._approvalReason === "string")
|
|
366
|
+
entry.approvalReason = block._approvalReason;
|
|
367
|
+
if (typeof block._riskThreshold === "string")
|
|
368
|
+
entry.riskThreshold = block._riskThreshold;
|
|
390
369
|
toolCalls.push(entry);
|
|
391
370
|
if (id) pendingToolUses.set(id, entry);
|
|
392
371
|
contentOrder.push(`tool:${toolCalls.length - 1}`);
|
|
@@ -543,10 +522,6 @@ export function requestSecretStandalone(params: {
|
|
|
543
522
|
allowedTools?: string[];
|
|
544
523
|
allowedDomains?: string[];
|
|
545
524
|
}): Promise<SecretPromptResult> {
|
|
546
|
-
const broadcast = broadcastToAllClients;
|
|
547
|
-
if (!broadcast) {
|
|
548
|
-
return Promise.resolve({ value: null, delivery: "store" });
|
|
549
|
-
}
|
|
550
525
|
const requestId = uuid();
|
|
551
526
|
const config = getConfig();
|
|
552
527
|
return new Promise((resolve) => {
|
|
@@ -555,7 +530,7 @@ export function requestSecretStandalone(params: {
|
|
|
555
530
|
resolve({ value: null, delivery: "store" });
|
|
556
531
|
}, config.timeouts.permissionTimeoutSec * 1000);
|
|
557
532
|
pendingStandaloneSecrets.set(requestId, { resolve, timer });
|
|
558
|
-
|
|
533
|
+
broadcastMessage({
|
|
559
534
|
type: "secret_request",
|
|
560
535
|
requestId,
|
|
561
536
|
service: params.service,
|
|
@@ -571,29 +546,6 @@ export function requestSecretStandalone(params: {
|
|
|
571
546
|
});
|
|
572
547
|
}
|
|
573
548
|
|
|
574
|
-
const SIGNING_TIMEOUT_MS = 30_000;
|
|
575
|
-
|
|
576
|
-
/**
|
|
577
|
-
* Create a SigningCallback that sends `sign_bundle_payload` to the Swift client
|
|
578
|
-
* over HTTP and waits for the `sign_bundle_payload_response`.
|
|
579
|
-
*/
|
|
580
|
-
export function createSigningCallback(
|
|
581
|
-
ctx: HandlerContext,
|
|
582
|
-
): (
|
|
583
|
-
payload: string,
|
|
584
|
-
) => Promise<{ signature: string; keyId: string; publicKey: string }> {
|
|
585
|
-
return (payload: string) =>
|
|
586
|
-
new Promise((resolve, reject) => {
|
|
587
|
-
const requestId = uuid();
|
|
588
|
-
const timer = setTimeout(() => {
|
|
589
|
-
pendingSignBundlePayload.delete(requestId);
|
|
590
|
-
reject(new Error("Signing request timed out"));
|
|
591
|
-
}, SIGNING_TIMEOUT_MS);
|
|
592
|
-
pendingSignBundlePayload.set(requestId, { resolve, reject, timer });
|
|
593
|
-
ctx.send({ type: "sign_bundle_payload", requestId, payload });
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
|
|
597
549
|
/** Get or create the skill entry object for a given skill name, creating intermediate objects as needed.
|
|
598
550
|
* Guards against malformed config (e.g. skills or entries being a string, array, or null)
|
|
599
551
|
* by resetting non-object intermediates to {}, restoring self-healing behavior. */
|