@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
|
@@ -129,7 +129,7 @@ describe("SSE assistant-events endpoint", () => {
|
|
|
129
129
|
|
|
130
130
|
// start() is called synchronously during ReadableStream construction, so the
|
|
131
131
|
// hub subscription is already registered before we publish.
|
|
132
|
-
const event = buildAssistantEvent(
|
|
132
|
+
const event = buildAssistantEvent({ type: "pong" }, conversationId);
|
|
133
133
|
await assistantEventHub.publish(event);
|
|
134
134
|
|
|
135
135
|
// Read the first frame directly from the stream.
|
|
@@ -147,7 +147,6 @@ describe("SSE assistant-events endpoint", () => {
|
|
|
147
147
|
expect(done).toBe(false);
|
|
148
148
|
const frame = new TextDecoder().decode(value);
|
|
149
149
|
expect(frame).toContain("event: assistant_event");
|
|
150
|
-
expect(frame).toContain(`"assistantId":"self"`);
|
|
151
150
|
expect(frame).toContain(`"conversationId":"${conversationId}"`);
|
|
152
151
|
expect(frame).toContain('"type":"pong"');
|
|
153
152
|
});
|
|
@@ -177,16 +176,8 @@ describe("SSE assistant-events endpoint", () => {
|
|
|
177
176
|
expect(new TextDecoder().decode(heartbeat.value)).toBe(": heartbeat\n\n");
|
|
178
177
|
|
|
179
178
|
// Publish events with two different conversationIds.
|
|
180
|
-
const eventA = buildAssistantEvent(
|
|
181
|
-
|
|
182
|
-
{ type: "pong" },
|
|
183
|
-
"conversation-aaa",
|
|
184
|
-
);
|
|
185
|
-
const eventB = buildAssistantEvent(
|
|
186
|
-
"self",
|
|
187
|
-
{ type: "pong" },
|
|
188
|
-
"conversation-bbb",
|
|
189
|
-
);
|
|
179
|
+
const eventA = buildAssistantEvent({ type: "pong" }, "conversation-aaa");
|
|
180
|
+
const eventB = buildAssistantEvent({ type: "pong" }, "conversation-bbb");
|
|
190
181
|
await testHub.publish(eventA);
|
|
191
182
|
await testHub.publish(eventB);
|
|
192
183
|
|
|
@@ -165,12 +165,6 @@ import { searchSkills } from "../daemon/handlers/skills.js";
|
|
|
165
165
|
// Helpers
|
|
166
166
|
// ---------------------------------------------------------------------------
|
|
167
167
|
|
|
168
|
-
const dummyCtx = {
|
|
169
|
-
debounceTimers: { schedule: () => {} },
|
|
170
|
-
setSuppressConfigReload: () => {},
|
|
171
|
-
updateConfigFingerprint: () => {},
|
|
172
|
-
broadcast: () => {},
|
|
173
|
-
} as unknown as Parameters<typeof searchSkills>[1];
|
|
174
168
|
|
|
175
169
|
// ---------------------------------------------------------------------------
|
|
176
170
|
// Tests
|
|
@@ -224,7 +218,7 @@ describe("searchSkills (unified)", () => {
|
|
|
224
218
|
},
|
|
225
219
|
]);
|
|
226
220
|
|
|
227
|
-
const result = await searchSkills("e"
|
|
221
|
+
const result = await searchSkills("e");
|
|
228
222
|
expect(result.success).toBe(true);
|
|
229
223
|
if (!result.success) throw new Error("Expected success");
|
|
230
224
|
|
|
@@ -284,7 +278,7 @@ describe("searchSkills (unified)", () => {
|
|
|
284
278
|
},
|
|
285
279
|
]);
|
|
286
280
|
|
|
287
|
-
const result = await searchSkills("shared"
|
|
281
|
+
const result = await searchSkills("shared");
|
|
288
282
|
expect(result.success).toBe(true);
|
|
289
283
|
if (!result.success) throw new Error("Expected success");
|
|
290
284
|
|
|
@@ -326,7 +320,7 @@ describe("searchSkills (unified)", () => {
|
|
|
326
320
|
},
|
|
327
321
|
]);
|
|
328
322
|
|
|
329
|
-
const result = await searchSkills("overlap"
|
|
323
|
+
const result = await searchSkills("overlap");
|
|
330
324
|
expect(result.success).toBe(true);
|
|
331
325
|
if (!result.success) throw new Error("Expected success");
|
|
332
326
|
|
|
@@ -357,7 +351,7 @@ describe("searchSkills (unified)", () => {
|
|
|
357
351
|
});
|
|
358
352
|
mockSkillsshSearch.mockRejectedValue(new Error("skills.sh is down"));
|
|
359
353
|
|
|
360
|
-
const result = await searchSkills("clawhub"
|
|
354
|
+
const result = await searchSkills("clawhub");
|
|
361
355
|
expect(result.success).toBe(true);
|
|
362
356
|
if (!result.success) throw new Error("Expected success");
|
|
363
357
|
|
|
@@ -379,7 +373,7 @@ describe("searchSkills (unified)", () => {
|
|
|
379
373
|
},
|
|
380
374
|
]);
|
|
381
375
|
|
|
382
|
-
const result = await searchSkills("skillssh"
|
|
376
|
+
const result = await searchSkills("skillssh");
|
|
383
377
|
expect(result.success).toBe(true);
|
|
384
378
|
if (!result.success) throw new Error("Expected success");
|
|
385
379
|
|
|
@@ -400,7 +394,7 @@ describe("searchSkills (unified)", () => {
|
|
|
400
394
|
mockClawhubSearch.mockRejectedValue(new Error("clawhub down"));
|
|
401
395
|
mockSkillsshSearch.mockRejectedValue(new Error("skillssh down"));
|
|
402
396
|
|
|
403
|
-
const result = await searchSkills("my"
|
|
397
|
+
const result = await searchSkills("my");
|
|
404
398
|
expect(result.success).toBe(true);
|
|
405
399
|
if (!result.success) throw new Error("Expected success");
|
|
406
400
|
|
|
@@ -422,7 +416,7 @@ describe("searchSkills (unified)", () => {
|
|
|
422
416
|
},
|
|
423
417
|
]);
|
|
424
418
|
|
|
425
|
-
const result = await searchSkills("test"
|
|
419
|
+
const result = await searchSkills("test");
|
|
426
420
|
expect(result.success).toBe(true);
|
|
427
421
|
if (!result.success) throw new Error("Expected success");
|
|
428
422
|
|
|
@@ -474,7 +468,7 @@ describe("searchSkills (unified)", () => {
|
|
|
474
468
|
},
|
|
475
469
|
});
|
|
476
470
|
|
|
477
|
-
const result = await searchSkills("lint"
|
|
471
|
+
const result = await searchSkills("lint");
|
|
478
472
|
expect(result.success).toBe(true);
|
|
479
473
|
if (!result.success) throw new Error("Expected success");
|
|
480
474
|
|
|
@@ -526,7 +520,7 @@ describe("searchSkills (unified)", () => {
|
|
|
526
520
|
]);
|
|
527
521
|
mockFetchSkillAudits.mockRejectedValue(new Error("audit service down"));
|
|
528
522
|
|
|
529
|
-
const result = await searchSkills("my-skill"
|
|
523
|
+
const result = await searchSkills("my-skill");
|
|
530
524
|
expect(result.success).toBe(true);
|
|
531
525
|
if (!result.success) throw new Error("Expected success");
|
|
532
526
|
|
|
@@ -25,11 +25,8 @@ mock.module("../util/logger.js", () => ({
|
|
|
25
25
|
}));
|
|
26
26
|
|
|
27
27
|
// ---------------------------------------------------------------------------
|
|
28
|
-
// Test: CLI signal path
|
|
29
|
-
// checkIngressForSecrets before
|
|
30
|
-
//
|
|
31
|
-
// We test the callback behavior directly rather than the full signal file
|
|
32
|
-
// flow, since the signal handler is just file I/O around the callback.
|
|
28
|
+
// Test: CLI signal path (user-message signal handler) calls
|
|
29
|
+
// checkIngressForSecrets before dispatching through processMessageInBackground.
|
|
33
30
|
// ---------------------------------------------------------------------------
|
|
34
31
|
|
|
35
32
|
import { resetAllowlist } from "../security/secret-allowlist.js";
|
|
@@ -211,11 +211,7 @@ function makeSendMessageDeps() {
|
|
|
211
211
|
assistantId: "self",
|
|
212
212
|
trustContext: undefined,
|
|
213
213
|
hasPendingConfirmation: () => false,
|
|
214
|
-
setHostBashProxy: () => {},
|
|
215
214
|
setHostBrowserProxy: () => {},
|
|
216
|
-
setHostFileProxy: () => {},
|
|
217
|
-
setHostTransferProxy: () => {},
|
|
218
|
-
getHostTransferProxy: () => undefined,
|
|
219
215
|
setHostCuProxy: () => {},
|
|
220
216
|
addPreactivatedSkillId: () => {},
|
|
221
217
|
} as unknown as import("../daemon/conversation.js").Conversation;
|
|
@@ -7,8 +7,6 @@ import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
7
7
|
const mockConfig = {
|
|
8
8
|
secretDetection: {
|
|
9
9
|
enabled: true,
|
|
10
|
-
action: "block" as "redact" | "warn" | "block",
|
|
11
|
-
entropyThreshold: 4.0,
|
|
12
10
|
allowOneTimeSend: false,
|
|
13
11
|
},
|
|
14
12
|
timeouts: { permissionTimeoutSec: 300 },
|
|
@@ -63,6 +61,10 @@ mock.module("../security/secure-keys.js", () => {
|
|
|
63
61
|
};
|
|
64
62
|
return {
|
|
65
63
|
getSecureKeyAsync: async (key: string) => storedKeys.get(key) ?? undefined,
|
|
64
|
+
getSecureKeyResultAsync: async (account: string) => ({
|
|
65
|
+
value: storedKeys.get(account),
|
|
66
|
+
unreachable: false,
|
|
67
|
+
}),
|
|
66
68
|
setSecureKeyAsync: async (key: string, value: string) =>
|
|
67
69
|
syncSet(key, value),
|
|
68
70
|
deleteSecureKeyAsync: async (key: string) => syncDelete(key),
|
|
@@ -30,6 +30,26 @@ mock.module("../util/logger.js", () => ({
|
|
|
30
30
|
}),
|
|
31
31
|
}));
|
|
32
32
|
|
|
33
|
+
// Capture broadcastMessage calls
|
|
34
|
+
const broadcastedMessages: ServerMessage[] = [];
|
|
35
|
+
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
36
|
+
broadcastMessage: (msg: ServerMessage) => {
|
|
37
|
+
broadcastedMessages.push(msg);
|
|
38
|
+
},
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
// Stub pendingInteractions — SecretPrompter registers/resolves there now
|
|
42
|
+
mock.module("../runtime/pending-interactions.js", () => ({
|
|
43
|
+
register: () => {},
|
|
44
|
+
resolve: () => undefined,
|
|
45
|
+
get: () => undefined,
|
|
46
|
+
getAll: () => [],
|
|
47
|
+
getByConversation: () => [],
|
|
48
|
+
getByKind: () => [],
|
|
49
|
+
removeByConversation: () => {},
|
|
50
|
+
clear: () => {},
|
|
51
|
+
}));
|
|
52
|
+
|
|
33
53
|
// Use a tiny timeout so the setTimeout branch fires quickly in tests
|
|
34
54
|
const mockConfig = {
|
|
35
55
|
timeouts: { permissionTimeoutSec: 0.01 },
|
|
@@ -51,20 +71,17 @@ function logContainsValue(secret: string): boolean {
|
|
|
51
71
|
|
|
52
72
|
describe("secret prompt log hygiene", () => {
|
|
53
73
|
let prompter: InstanceType<typeof SecretPrompter>;
|
|
54
|
-
let sentMessages: ServerMessage[];
|
|
55
74
|
|
|
56
75
|
beforeEach(() => {
|
|
57
76
|
logCalls.length = 0;
|
|
58
|
-
|
|
59
|
-
prompter = new SecretPrompter(
|
|
60
|
-
sentMessages.push(msg);
|
|
61
|
-
});
|
|
77
|
+
broadcastedMessages.length = 0;
|
|
78
|
+
prompter = new SecretPrompter();
|
|
62
79
|
});
|
|
63
80
|
|
|
64
81
|
test("resolveSecret never logs the secret value", async () => {
|
|
65
82
|
const secret = "sv42";
|
|
66
83
|
const promise = prompter.prompt("myservice", "apikey", "API Key");
|
|
67
|
-
const requestId = (
|
|
84
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
68
85
|
prompter.resolveSecret(requestId, secret, "store");
|
|
69
86
|
const result = await promise;
|
|
70
87
|
|
|
@@ -105,7 +122,7 @@ describe("secret prompt log hygiene", () => {
|
|
|
105
122
|
|
|
106
123
|
test("sent message contains value=undefined (value flows through event, not logs)", async () => {
|
|
107
124
|
const promise = prompter.prompt("svc", "tok", "Token");
|
|
108
|
-
const msg =
|
|
125
|
+
const msg = broadcastedMessages[0] as SecretRequest & { value?: unknown };
|
|
109
126
|
// The message should NOT contain a value field
|
|
110
127
|
expect(msg.value).toBeUndefined();
|
|
111
128
|
prompter.resolveSecret(msg.requestId, undefined);
|
|
@@ -33,37 +33,31 @@ mock.module("../util/logger.js", () => ({
|
|
|
33
33
|
}),
|
|
34
34
|
}));
|
|
35
35
|
|
|
36
|
+
let broadcastMessages: ServerMessage[] = [];
|
|
37
|
+
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
38
|
+
broadcastMessage: (msg: ServerMessage) => broadcastMessages.push(msg),
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
mock.module("../runtime/pending-interactions.js", () => ({
|
|
42
|
+
register: () => {},
|
|
43
|
+
resolve: () => undefined,
|
|
44
|
+
get: () => undefined,
|
|
45
|
+
getAll: () => [],
|
|
46
|
+
getByConversation: () => [],
|
|
47
|
+
getByKind: () => [],
|
|
48
|
+
removeByConversation: () => {},
|
|
49
|
+
clear: () => {},
|
|
50
|
+
}));
|
|
51
|
+
|
|
36
52
|
const { SecretPrompter } = await import("../permissions/secret-prompter.js");
|
|
37
53
|
|
|
38
54
|
describe("secret prompter channel fallback", () => {
|
|
39
|
-
let sentMessages: ServerMessage[];
|
|
40
|
-
let broadcastMessages: ServerMessage[];
|
|
41
|
-
|
|
42
55
|
beforeEach(() => {
|
|
43
|
-
sentMessages = [];
|
|
44
56
|
broadcastMessages = [];
|
|
45
57
|
});
|
|
46
58
|
|
|
47
|
-
test("
|
|
48
|
-
const prompter = new SecretPrompter(
|
|
49
|
-
prompter.setChannelContext({
|
|
50
|
-
channel: "slack",
|
|
51
|
-
supportsDynamicUi: false,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const result = await prompter.prompt("myservice", "apikey", "API Key");
|
|
55
|
-
|
|
56
|
-
expect(result.value).toBeNull();
|
|
57
|
-
expect(result.error).toBe("unsupported_channel");
|
|
58
|
-
// No message should have been sent since we failed fast
|
|
59
|
-
expect(sentMessages).toHaveLength(0);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("broadcasts secret_request via SSE hub when channel lacks dynamic UI but broadcast is available", async () => {
|
|
63
|
-
const prompter = new SecretPrompter(
|
|
64
|
-
(msg) => sentMessages.push(msg),
|
|
65
|
-
(msg) => broadcastMessages.push(msg),
|
|
66
|
-
);
|
|
59
|
+
test("broadcasts secret_request when channel lacks dynamic UI", async () => {
|
|
60
|
+
const prompter = new SecretPrompter();
|
|
67
61
|
prompter.setChannelContext({
|
|
68
62
|
channel: "slack",
|
|
69
63
|
supportsDynamicUi: false,
|
|
@@ -71,24 +65,17 @@ describe("secret prompter channel fallback", () => {
|
|
|
71
65
|
|
|
72
66
|
const promise = prompter.prompt("myservice", "apikey", "API Key");
|
|
73
67
|
|
|
74
|
-
// Should have broadcast the message, not sent via per-channel sender
|
|
75
|
-
expect(sentMessages).toHaveLength(0);
|
|
76
68
|
expect(broadcastMessages).toHaveLength(1);
|
|
77
69
|
expect(broadcastMessages[0]!.type).toBe("secret_request");
|
|
78
70
|
|
|
79
|
-
// Resolve the prompt so it doesn't hang
|
|
80
71
|
const requestId = (broadcastMessages[0] as SecretRequest).requestId;
|
|
81
72
|
prompter.resolveSecret(requestId, "test-secret", "store");
|
|
82
73
|
const result = await promise;
|
|
83
74
|
expect(result.value).toBe("test-secret");
|
|
84
|
-
expect(result.error).toBeUndefined();
|
|
85
75
|
});
|
|
86
76
|
|
|
87
|
-
test("
|
|
88
|
-
const prompter = new SecretPrompter(
|
|
89
|
-
(msg) => sentMessages.push(msg),
|
|
90
|
-
(msg) => broadcastMessages.push(msg),
|
|
91
|
-
);
|
|
77
|
+
test("broadcasts secret_request when channel supports dynamic UI", async () => {
|
|
78
|
+
const prompter = new SecretPrompter();
|
|
92
79
|
prompter.setChannelContext({
|
|
93
80
|
channel: "macos",
|
|
94
81
|
supportsDynamicUi: true,
|
|
@@ -96,30 +83,38 @@ describe("secret prompter channel fallback", () => {
|
|
|
96
83
|
|
|
97
84
|
const promise = prompter.prompt("myservice", "apikey", "API Key");
|
|
98
85
|
|
|
99
|
-
|
|
100
|
-
expect(
|
|
101
|
-
expect(broadcastMessages).toHaveLength(0);
|
|
102
|
-
expect(sentMessages[0]!.type).toBe("secret_request");
|
|
86
|
+
expect(broadcastMessages).toHaveLength(1);
|
|
87
|
+
expect(broadcastMessages[0]!.type).toBe("secret_request");
|
|
103
88
|
|
|
104
|
-
const requestId = (
|
|
89
|
+
const requestId = (broadcastMessages[0] as SecretRequest).requestId;
|
|
105
90
|
prompter.resolveSecret(requestId, "test-secret", "store");
|
|
106
91
|
await promise;
|
|
107
92
|
});
|
|
108
93
|
|
|
109
|
-
test("
|
|
110
|
-
const prompter = new SecretPrompter(
|
|
111
|
-
(msg) => sentMessages.push(msg),
|
|
112
|
-
(msg) => broadcastMessages.push(msg),
|
|
113
|
-
);
|
|
114
|
-
// No setChannelContext call — desktop default
|
|
94
|
+
test("broadcasts secret_request when no channel context is set (desktop default)", async () => {
|
|
95
|
+
const prompter = new SecretPrompter();
|
|
115
96
|
|
|
116
97
|
const promise = prompter.prompt("myservice", "apikey", "API Key");
|
|
117
98
|
|
|
118
|
-
expect(
|
|
119
|
-
expect(broadcastMessages).
|
|
99
|
+
expect(broadcastMessages).toHaveLength(1);
|
|
100
|
+
expect(broadcastMessages[0]!.type).toBe("secret_request");
|
|
120
101
|
|
|
121
|
-
const requestId = (
|
|
102
|
+
const requestId = (broadcastMessages[0] as SecretRequest).requestId;
|
|
122
103
|
prompter.resolveSecret(requestId, "val", "store");
|
|
123
104
|
await promise;
|
|
124
105
|
});
|
|
106
|
+
|
|
107
|
+
test("resolveSecret cleans up pending state", async () => {
|
|
108
|
+
const prompter = new SecretPrompter();
|
|
109
|
+
|
|
110
|
+
const promise = prompter.prompt("myservice", "apikey", "API Key");
|
|
111
|
+
const requestId = (broadcastMessages[0] as SecretRequest).requestId;
|
|
112
|
+
|
|
113
|
+
expect(prompter.hasPendingRequest(requestId)).toBe(true);
|
|
114
|
+
|
|
115
|
+
prompter.resolveSecret(requestId, "secret", "store");
|
|
116
|
+
expect(prompter.hasPendingRequest(requestId)).toBe(false);
|
|
117
|
+
|
|
118
|
+
await promise;
|
|
119
|
+
});
|
|
125
120
|
});
|
|
@@ -1,26 +1,40 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
1
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
3
|
import type {
|
|
4
4
|
SecretRequest,
|
|
5
5
|
ServerMessage,
|
|
6
6
|
} from "../daemon/message-protocol.js";
|
|
7
7
|
import type { SecretPromptResult } from "../permissions/secret-prompter.js";
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
let broadcastedMessages: ServerMessage[] = [];
|
|
10
|
+
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
11
|
+
broadcastMessage: (msg: ServerMessage) => broadcastedMessages.push(msg),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
mock.module("../runtime/pending-interactions.js", () => ({
|
|
15
|
+
register: () => {},
|
|
16
|
+
resolve: () => undefined,
|
|
17
|
+
get: () => undefined,
|
|
18
|
+
getAll: () => [],
|
|
19
|
+
getByConversation: () => [],
|
|
20
|
+
getByKind: () => [],
|
|
21
|
+
removeByConversation: () => {},
|
|
22
|
+
clear: () => {},
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
const { SecretPrompter } = await import("../permissions/secret-prompter.js");
|
|
9
26
|
|
|
10
27
|
describe("secret response routing", () => {
|
|
11
|
-
let prompter: SecretPrompter
|
|
12
|
-
let sentMessages: ServerMessage[];
|
|
28
|
+
let prompter: InstanceType<typeof SecretPrompter>;
|
|
13
29
|
|
|
14
30
|
beforeEach(() => {
|
|
15
|
-
|
|
16
|
-
prompter = new SecretPrompter(
|
|
17
|
-
sentMessages.push(msg);
|
|
18
|
-
});
|
|
31
|
+
broadcastedMessages = [];
|
|
32
|
+
prompter = new SecretPrompter();
|
|
19
33
|
});
|
|
20
34
|
|
|
21
35
|
test("resolveSecret defaults delivery to store when omitted", async () => {
|
|
22
36
|
const promise = prompter.prompt("github", "token", "GitHub Token");
|
|
23
|
-
const requestId = (
|
|
37
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
24
38
|
prompter.resolveSecret(requestId, "test-value");
|
|
25
39
|
const result: SecretPromptResult = await promise;
|
|
26
40
|
expect(result.value).toBe("test-value");
|
|
@@ -29,7 +43,7 @@ describe("secret response routing", () => {
|
|
|
29
43
|
|
|
30
44
|
test("resolveSecret passes store delivery", async () => {
|
|
31
45
|
const promise = prompter.prompt("github", "token", "GitHub Token");
|
|
32
|
-
const requestId = (
|
|
46
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
33
47
|
prompter.resolveSecret(requestId, "test-value", "store");
|
|
34
48
|
const result = await promise;
|
|
35
49
|
expect(result.value).toBe("test-value");
|
|
@@ -38,7 +52,7 @@ describe("secret response routing", () => {
|
|
|
38
52
|
|
|
39
53
|
test("resolveSecret passes transient_send delivery", async () => {
|
|
40
54
|
const promise = prompter.prompt("github", "token", "GitHub Token");
|
|
41
|
-
const requestId = (
|
|
55
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
42
56
|
prompter.resolveSecret(requestId, "one-time-value", "transient_send");
|
|
43
57
|
const result = await promise;
|
|
44
58
|
expect(result.value).toBe("one-time-value");
|
|
@@ -47,7 +61,7 @@ describe("secret response routing", () => {
|
|
|
47
61
|
|
|
48
62
|
test("resolveSecret with cancelled value defaults delivery to store", async () => {
|
|
49
63
|
const promise = prompter.prompt("github", "token", "GitHub Token");
|
|
50
|
-
const requestId = (
|
|
64
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
51
65
|
prompter.resolveSecret(requestId, undefined);
|
|
52
66
|
const result = await promise;
|
|
53
67
|
expect(result.value).toBeNull();
|
|
@@ -58,7 +72,7 @@ describe("secret response routing", () => {
|
|
|
58
72
|
// We can't easily test the full timeout, but we verify the structure
|
|
59
73
|
// by resolving immediately (the timeout path also returns { value: null, delivery: 'store' })
|
|
60
74
|
const promise = prompter.prompt("github", "token", "GitHub Token");
|
|
61
|
-
const requestId = (
|
|
75
|
+
const requestId = (broadcastedMessages[0] as SecretRequest).requestId;
|
|
62
76
|
prompter.resolveSecret(requestId, undefined, undefined);
|
|
63
77
|
const result = await promise;
|
|
64
78
|
expect(result.value).toBeNull();
|
|
@@ -74,8 +88,8 @@ describe("secret response routing", () => {
|
|
|
74
88
|
"placeholder",
|
|
75
89
|
"session-1",
|
|
76
90
|
);
|
|
77
|
-
expect(
|
|
78
|
-
const msg =
|
|
91
|
+
expect(broadcastedMessages.length).toBe(1);
|
|
92
|
+
const msg = broadcastedMessages[0] as SecretRequest;
|
|
79
93
|
expect(msg.type).toBe("secret_request");
|
|
80
94
|
expect(msg.service).toBe("github");
|
|
81
95
|
expect(msg.field).toBe("token");
|
|
@@ -77,6 +77,10 @@ mock.module("../config/loader.js", () => ({
|
|
|
77
77
|
|
|
78
78
|
mock.module("../security/secure-keys.js", () => ({
|
|
79
79
|
getSecureKeyAsync: async (key: string) => secureKeyStore[key],
|
|
80
|
+
getSecureKeyResultAsync: async (key: string) => ({
|
|
81
|
+
value: secureKeyStore[key],
|
|
82
|
+
unreachable: false,
|
|
83
|
+
}),
|
|
80
84
|
setSecureKeyAsync: async (key: string, value: string) => {
|
|
81
85
|
secureKeyStore[key] = value;
|
|
82
86
|
return true;
|
|
@@ -187,7 +191,7 @@ describe("secret routes managed proxy registry sync", () => {
|
|
|
187
191
|
test("provider API key writes notify live-conversation refresh listeners", async () => {
|
|
188
192
|
await addApiKey("fireworks", "fw-key");
|
|
189
193
|
|
|
190
|
-
expect(secureKeyStore
|
|
194
|
+
expect(secureKeyStore[credentialKey("fireworks", "api_key")]).toBe("fw-key");
|
|
191
195
|
expect(providerRefreshCalls).toBe(1);
|
|
192
196
|
|
|
193
197
|
await deleteApiKey("fireworks");
|