@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
|
@@ -32,7 +32,6 @@ import { listConnections } from "../oauth/oauth-store.js";
|
|
|
32
32
|
import { resolveGuardianPersonaPath } from "../prompts/persona-resolver.js";
|
|
33
33
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
34
34
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
35
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
36
35
|
import type { OnboardingContext } from "../types/onboarding-context.js";
|
|
37
36
|
import { getLogger } from "../util/logger.js";
|
|
38
37
|
import {
|
|
@@ -318,7 +317,7 @@ export async function writeRelationshipState(): Promise<void> {
|
|
|
318
317
|
function publishRelationshipStateUpdated(updatedAt: string): void {
|
|
319
318
|
assistantEventHub
|
|
320
319
|
.publish(
|
|
321
|
-
buildAssistantEvent(
|
|
320
|
+
buildAssistantEvent({
|
|
322
321
|
type: "relationship_state_updated",
|
|
323
322
|
updatedAt,
|
|
324
323
|
}),
|
|
@@ -423,6 +422,20 @@ function safeRead(path: string): string {
|
|
|
423
422
|
}
|
|
424
423
|
}
|
|
425
424
|
|
|
425
|
+
/**
|
|
426
|
+
* Map personality-group tone IDs (from onboarding) to human-readable
|
|
427
|
+
* voice descriptions displayed as relationship-state facts.
|
|
428
|
+
* Unrecognized values (e.g. legacy `"balanced"` or free-text tones from
|
|
429
|
+
* older clients) fall through via the `?? tone` fallback in
|
|
430
|
+
* `extractFacts`.
|
|
431
|
+
*/
|
|
432
|
+
const TONE_VOICE_MAP: Record<string, string> = {
|
|
433
|
+
grounded: "Calm and precise",
|
|
434
|
+
warm: "Warm and easy",
|
|
435
|
+
energetic: "Fast and direct",
|
|
436
|
+
poetic: "Quiet and observant",
|
|
437
|
+
};
|
|
438
|
+
|
|
426
439
|
/**
|
|
427
440
|
* Walk the workspace prompt files and emit a flat list of inferred
|
|
428
441
|
* facts. This is deliberately a simple bullet/heading parser — the TDD
|
|
@@ -478,7 +491,7 @@ function extractFacts(input: {
|
|
|
478
491
|
facts.push({
|
|
479
492
|
id: nextId("onboarding"),
|
|
480
493
|
category: "voice",
|
|
481
|
-
text: tone,
|
|
494
|
+
text: TONE_VOICE_MAP[tone] ?? tone,
|
|
482
495
|
confidence: "strong",
|
|
483
496
|
source: "onboarding",
|
|
484
497
|
});
|
|
@@ -23,16 +23,13 @@ let mockOperationCalls: Array<{
|
|
|
23
23
|
input: Record<string, unknown>;
|
|
24
24
|
conversationId: string;
|
|
25
25
|
trustClass?: string;
|
|
26
|
-
hostBrowserProxy?: unknown;
|
|
27
26
|
transportInterface?: string;
|
|
28
27
|
}> = [];
|
|
29
28
|
|
|
30
29
|
/** When set, findConversation returns a fake conversation object. */
|
|
31
30
|
let mockConversation: {
|
|
32
31
|
trustContext?: { trustClass: string };
|
|
33
|
-
hostBrowserProxy?: unknown;
|
|
34
32
|
transportInterface?: string;
|
|
35
|
-
hostBrowserSenderOverride?: unknown;
|
|
36
33
|
} | null = null;
|
|
37
34
|
|
|
38
35
|
let mockFindConversationCalls: string[] = [];
|
|
@@ -44,7 +41,6 @@ mock.module("../../browser/operations.js", () => ({
|
|
|
44
41
|
context: {
|
|
45
42
|
conversationId: string;
|
|
46
43
|
trustClass?: string;
|
|
47
|
-
hostBrowserProxy?: unknown;
|
|
48
44
|
transportInterface?: string;
|
|
49
45
|
},
|
|
50
46
|
) => {
|
|
@@ -53,7 +49,6 @@ mock.module("../../browser/operations.js", () => ({
|
|
|
53
49
|
input,
|
|
54
50
|
conversationId: context.conversationId,
|
|
55
51
|
trustClass: context.trustClass,
|
|
56
|
-
hostBrowserProxy: context.hostBrowserProxy,
|
|
57
52
|
transportInterface: context.transportInterface,
|
|
58
53
|
});
|
|
59
54
|
return mockOperationResult;
|
|
@@ -68,9 +63,8 @@ mock.module("../../daemon/conversation-store.js", () => ({
|
|
|
68
63
|
}));
|
|
69
64
|
|
|
70
65
|
// Import after mocking — now from the shared routes location
|
|
71
|
-
const { ROUTES, browserCliConversationKey } =
|
|
72
|
-
"../../runtime/routes/browser-routes.js"
|
|
73
|
-
);
|
|
66
|
+
const { ROUTES, browserCliConversationKey } =
|
|
67
|
+
await import("../../runtime/routes/browser-routes.js");
|
|
74
68
|
|
|
75
69
|
const browserExecuteHandler = ROUTES.find(
|
|
76
70
|
(r) => r.operationId === "browser_execute",
|
|
@@ -190,12 +184,9 @@ describe("browser_execute route", () => {
|
|
|
190
184
|
});
|
|
191
185
|
|
|
192
186
|
test("uses live conversation context fields when found", async () => {
|
|
193
|
-
const fakeProxy = { isAvailable: () => true };
|
|
194
187
|
mockConversation = {
|
|
195
188
|
trustContext: { trustClass: "trusted" },
|
|
196
|
-
hostBrowserProxy: fakeProxy,
|
|
197
189
|
transportInterface: "chrome-extension",
|
|
198
|
-
hostBrowserSenderOverride: { some: "sender" },
|
|
199
190
|
};
|
|
200
191
|
|
|
201
192
|
await callHandler({
|
|
@@ -209,7 +200,6 @@ describe("browser_execute route", () => {
|
|
|
209
200
|
expect(mockOperationCalls[0]).toMatchObject({
|
|
210
201
|
conversationId: "conv-live-456",
|
|
211
202
|
trustClass: "trusted",
|
|
212
|
-
hostBrowserProxy: fakeProxy,
|
|
213
203
|
transportInterface: "chrome-extension",
|
|
214
204
|
});
|
|
215
205
|
});
|
|
@@ -84,7 +84,6 @@ async function startPair(): Promise<{
|
|
|
84
84
|
skillId: "bidir-test",
|
|
85
85
|
});
|
|
86
86
|
// Stub the routes the contracts client prefetches at connect-time.
|
|
87
|
-
srv.registerMethod("host.identity.getInternalAssistantId", () => "self");
|
|
88
87
|
srv.registerMethod("host.identity.getAssistantName", () => null);
|
|
89
88
|
srv.registerMethod("host.platform.workspaceDir", () => "/tmp/workspace");
|
|
90
89
|
srv.registerMethod("host.platform.vellumRoot", () => "/tmp/vellum");
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
writeStreamChunk,
|
|
45
45
|
writeStreamEnd,
|
|
46
46
|
} from "./ipc-framing.js";
|
|
47
|
-
import { type DbProxyParams,handleDbProxy } from "./routes/db-proxy.js";
|
|
47
|
+
import { type DbProxyParams, handleDbProxy } from "./routes/db-proxy.js";
|
|
48
48
|
import { routeDefinitionsToIpcMethods } from "./routes/route-adapter.js";
|
|
49
49
|
import { ensureSocketPathFree } from "./socket-cleanup.js";
|
|
50
50
|
import { resolveIpcSocketPath } from "./socket-path.js";
|
|
@@ -73,9 +73,6 @@ export type IpcResponse = {
|
|
|
73
73
|
headers?: Record<string, string>;
|
|
74
74
|
};
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
76
|
/**
|
|
80
77
|
* Wrapper returned by route handlers that produce a streaming response.
|
|
81
78
|
* The IPC server detects this and pipes the ReadableStream as chunked
|
|
@@ -95,9 +92,7 @@ export interface IpcBinaryResponse {
|
|
|
95
92
|
headers: Record<string, string>;
|
|
96
93
|
}
|
|
97
94
|
|
|
98
|
-
|
|
99
|
-
value: unknown,
|
|
100
|
-
): value is IpcStreamingResponse {
|
|
95
|
+
function isIpcStreamingResponse(value: unknown): value is IpcStreamingResponse {
|
|
101
96
|
return (
|
|
102
97
|
value != null &&
|
|
103
98
|
typeof value === "object" &&
|
|
@@ -108,9 +103,7 @@ export function isIpcStreamingResponse(
|
|
|
108
103
|
);
|
|
109
104
|
}
|
|
110
105
|
|
|
111
|
-
|
|
112
|
-
value: unknown,
|
|
113
|
-
): value is IpcBinaryResponse {
|
|
106
|
+
function isIpcBinaryResponse(value: unknown): value is IpcBinaryResponse {
|
|
114
107
|
return (
|
|
115
108
|
value != null &&
|
|
116
109
|
typeof value === "object" &&
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Coverage:
|
|
9
9
|
* 1. method name is the public verb expected by the CLI.
|
|
10
10
|
* 2. unknown params are rejected (defensive — the schema is `.strict()`).
|
|
11
|
-
* 3. each of the
|
|
11
|
+
* 3. each of the three ops dispatches to the correct `MemoryJobType`.
|
|
12
12
|
* 4. `migrate` with `force: true` propagates the flag in the payload.
|
|
13
13
|
* 5. `migrate` without `force` (and ops that ignore `force`) sends an
|
|
14
14
|
* empty payload — the `false` default never reaches the queue.
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
19
19
|
|
|
20
|
+
import * as realJobsStore from "../../../memory/jobs-store.js";
|
|
21
|
+
|
|
20
22
|
// ---------------------------------------------------------------------------
|
|
21
23
|
// Module-level mock — capture every enqueue call so each test can assert the
|
|
22
24
|
// route forwarded the correct (type, payload) tuple. The route file is
|
|
@@ -29,15 +31,35 @@ const enqueueCalls: Array<{
|
|
|
29
31
|
}> = [];
|
|
30
32
|
let nextJobId = 0;
|
|
31
33
|
|
|
34
|
+
// Spread the real module's exports so transitive importers (e.g.
|
|
35
|
+
// memory/auto-analysis-enqueue.ts pulled in via the CLI program → memory
|
|
36
|
+
// indexer chain) get every named export they bind to at module-load time;
|
|
37
|
+
// only `enqueueMemoryJob` is overridden so the route under test forwards
|
|
38
|
+
// to the test stub. jobs-store.ts has no side-effecting top-level
|
|
39
|
+
// statements, so loading it for the spread is safe.
|
|
32
40
|
mock.module("../../../memory/jobs-store.js", () => ({
|
|
41
|
+
...realJobsStore,
|
|
33
42
|
enqueueMemoryJob: (type: string, payload: Record<string, unknown>) => {
|
|
34
43
|
enqueueCalls.push({ type, payload });
|
|
35
44
|
nextJobId += 1;
|
|
36
45
|
return `test-job-${nextJobId}`;
|
|
37
46
|
},
|
|
47
|
+
upsertAutoAnalysisJob: () => {},
|
|
48
|
+
upsertDebouncedJob: () => `test-debounced-${++nextJobId}`,
|
|
49
|
+
hasActiveJobOfType: () => false,
|
|
50
|
+
enqueuePruneOldLlmRequestLogsJob: () => `test-prune-${++nextJobId}`,
|
|
51
|
+
enqueuePruneOldConversationsJob: () => `test-prune-conv-${++nextJobId}`,
|
|
52
|
+
claimMemoryJobs: () => [],
|
|
53
|
+
completeMemoryJob: () => {},
|
|
54
|
+
deferMemoryJob: () => "deferred",
|
|
55
|
+
failMemoryJob: () => {},
|
|
56
|
+
resetRunningJobsToPending: () => 0,
|
|
57
|
+
failStalledJobs: () => 0,
|
|
58
|
+
getMemoryJobCounts: () => ({}),
|
|
38
59
|
}));
|
|
39
60
|
|
|
40
|
-
const { ROUTES: memoryV2Routes } =
|
|
61
|
+
const { ROUTES: memoryV2Routes } =
|
|
62
|
+
await import("../../../runtime/routes/memory-v2-routes.js");
|
|
41
63
|
|
|
42
64
|
// ---------------------------------------------------------------------------
|
|
43
65
|
// Helpers
|
|
@@ -45,7 +67,9 @@ const { ROUTES: memoryV2Routes } = await import("../../../runtime/routes/memory-
|
|
|
45
67
|
|
|
46
68
|
type BackfillResult = { jobId: string };
|
|
47
69
|
|
|
48
|
-
const backfillRoute = memoryV2Routes.find(
|
|
70
|
+
const backfillRoute = memoryV2Routes.find(
|
|
71
|
+
(r) => r.operationId === "memory_v2_backfill",
|
|
72
|
+
)!;
|
|
49
73
|
|
|
50
74
|
async function runRoute(
|
|
51
75
|
params: Record<string, unknown>,
|
|
@@ -109,27 +133,22 @@ describe("memory_v2_backfill route", () => {
|
|
|
109
133
|
expect(enqueueCalls).toEqual([{ type: "memory_v2_migrate", payload: {} }]);
|
|
110
134
|
});
|
|
111
135
|
|
|
112
|
-
test("rebuild-edges
|
|
113
|
-
await runRoute({ op: "rebuild-edges" });
|
|
136
|
+
test("rebuild-edges op is rejected (no longer supported)", async () => {
|
|
137
|
+
await expect(runRoute({ op: "rebuild-edges" })).rejects.toThrow();
|
|
138
|
+
expect(enqueueCalls).toEqual([]);
|
|
139
|
+
});
|
|
114
140
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
141
|
+
test("reembed enqueues memory_v2_reembed with empty payload", async () => {
|
|
142
|
+
await runRoute({ op: "reembed" });
|
|
143
|
+
|
|
144
|
+
expect(enqueueCalls).toEqual([{ type: "memory_v2_reembed", payload: {} }]);
|
|
118
145
|
});
|
|
119
146
|
|
|
120
|
-
test("
|
|
147
|
+
test("reembed ignores force flag", async () => {
|
|
121
148
|
// `force` only has meaning for `migrate`. For other ops we still accept
|
|
122
149
|
// the field (so a single CLI flag works across all ops without
|
|
123
150
|
// branching) but never forward it to the queue.
|
|
124
|
-
await runRoute({ op: "
|
|
125
|
-
|
|
126
|
-
expect(enqueueCalls).toEqual([
|
|
127
|
-
{ type: "memory_v2_rebuild_edges", payload: {} },
|
|
128
|
-
]);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
test("reembed enqueues memory_v2_reembed with empty payload", async () => {
|
|
132
|
-
await runRoute({ op: "reembed" });
|
|
151
|
+
await runRoute({ op: "reembed", force: true });
|
|
133
152
|
|
|
134
153
|
expect(enqueueCalls).toEqual([{ type: "memory_v2_reembed", payload: {} }]);
|
|
135
154
|
});
|
|
@@ -143,8 +162,8 @@ describe("memory_v2_backfill route", () => {
|
|
|
143
162
|
});
|
|
144
163
|
|
|
145
164
|
test("returns the jobId emitted by enqueueMemoryJob", async () => {
|
|
146
|
-
const first = await runRoute({ op: "
|
|
147
|
-
const second = await runRoute({ op: "
|
|
165
|
+
const first = await runRoute({ op: "reembed" });
|
|
166
|
+
const second = await runRoute({ op: "activation-recompute" });
|
|
148
167
|
|
|
149
168
|
expect(first.jobId).toBe("test-job-1");
|
|
150
169
|
expect(second.jobId).toBe("test-job-2");
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { RouteDefinition } from "../../runtime/routes/types.js";
|
|
7
7
|
|
|
8
8
|
function isIpcEligible(r: RouteDefinition): boolean {
|
|
9
|
-
return !r.requireGuardian && !r.isPublic
|
|
9
|
+
return !r.requireGuardian && !r.isPublic;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export function routeDefinitionsToIpcMethods(
|
|
@@ -3,9 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Covers:
|
|
5
5
|
* - trust_rules_list: no params, tool filter, include_all, origin filter
|
|
6
|
-
* - trust_rules_create: correct POST URL and JSON body
|
|
7
|
-
* - trust_rules_update: PATCH URL, partial body, throws when id missing
|
|
8
|
-
* - trust_rules_remove: DELETE URL, throws when id missing
|
|
9
6
|
* - error path: non-OK gateway response surfaces body .error message
|
|
10
7
|
*/
|
|
11
8
|
|
|
@@ -111,98 +108,6 @@ describe("trustRuleRoutes", () => {
|
|
|
111
108
|
});
|
|
112
109
|
});
|
|
113
110
|
|
|
114
|
-
describe("trust_rules_create", () => {
|
|
115
|
-
test("POSTs to /v1/trust-rules with correct JSON body", async () => {
|
|
116
|
-
mockFetchResponse = {
|
|
117
|
-
ok: true,
|
|
118
|
-
status: 201,
|
|
119
|
-
json: async () => ({ rule: { id: "rule-1" } }),
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const route = findRoute("trust_rules_create");
|
|
123
|
-
await route.handler({ body: {
|
|
124
|
-
tool: "bash",
|
|
125
|
-
pattern: "rm -rf *",
|
|
126
|
-
risk: "high",
|
|
127
|
-
description: "Dangerous remove",
|
|
128
|
-
} });
|
|
129
|
-
|
|
130
|
-
expect(capturedFetchCalls).toHaveLength(1);
|
|
131
|
-
const call = capturedFetchCalls[0];
|
|
132
|
-
expect(call.url).toBe("http://localhost:7822/v1/trust-rules");
|
|
133
|
-
expect(call.init?.method).toBe("POST");
|
|
134
|
-
expect((call.init?.headers as Record<string, string>)["Content-Type"]).toBe(
|
|
135
|
-
"application/json",
|
|
136
|
-
);
|
|
137
|
-
const body = JSON.parse(call.init?.body as string) as Record<
|
|
138
|
-
string,
|
|
139
|
-
unknown
|
|
140
|
-
>;
|
|
141
|
-
expect(body).toEqual({
|
|
142
|
-
tool: "bash",
|
|
143
|
-
pattern: "rm -rf *",
|
|
144
|
-
risk: "high",
|
|
145
|
-
description: "Dangerous remove",
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
describe("trust_rules_update", () => {
|
|
151
|
-
test("PATCHes /v1/trust-rules/abc-123", async () => {
|
|
152
|
-
const route = findRoute("trust_rules_update");
|
|
153
|
-
await route.handler({ body: { id: "abc-123", risk: "low", description: "Safe" } });
|
|
154
|
-
|
|
155
|
-
expect(capturedFetchCalls).toHaveLength(1);
|
|
156
|
-
const call = capturedFetchCalls[0];
|
|
157
|
-
expect(call.url).toBe("http://localhost:7822/v1/trust-rules/abc-123");
|
|
158
|
-
expect(call.init?.method).toBe("PATCH");
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test("body contains only fields present in params (partial update)", async () => {
|
|
162
|
-
const route = findRoute("trust_rules_update");
|
|
163
|
-
await route.handler({ body: { id: "abc-123", risk: "low" } });
|
|
164
|
-
|
|
165
|
-
const body = JSON.parse(
|
|
166
|
-
capturedFetchCalls[0].init?.body as string,
|
|
167
|
-
) as Record<string, unknown>;
|
|
168
|
-
expect(body.risk).toBe("low");
|
|
169
|
-
expect("description" in body).toBe(false);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
test("throws when id is missing", async () => {
|
|
173
|
-
const route = findRoute("trust_rules_update");
|
|
174
|
-
await expect(
|
|
175
|
-
route.handler({ body: { risk: "low" } }),
|
|
176
|
-
).rejects.toThrow("id is required");
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test("throws when id is empty string", async () => {
|
|
180
|
-
const route = findRoute("trust_rules_update");
|
|
181
|
-
await expect(
|
|
182
|
-
route.handler({ body: { id: "", risk: "low" } }),
|
|
183
|
-
).rejects.toThrow("id is required");
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe("trust_rules_remove", () => {
|
|
188
|
-
test("DELETEs /v1/trust-rules/abc-123", async () => {
|
|
189
|
-
const route = findRoute("trust_rules_remove");
|
|
190
|
-
await route.handler({ body: { id: "abc-123" } });
|
|
191
|
-
|
|
192
|
-
expect(capturedFetchCalls).toHaveLength(1);
|
|
193
|
-
const call = capturedFetchCalls[0];
|
|
194
|
-
expect(call.url).toBe("http://localhost:7822/v1/trust-rules/abc-123");
|
|
195
|
-
expect(call.init?.method).toBe("DELETE");
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
test("throws when id is missing", async () => {
|
|
199
|
-
const route = findRoute("trust_rules_remove");
|
|
200
|
-
await expect(
|
|
201
|
-
route.handler({ body: {} }),
|
|
202
|
-
).rejects.toThrow("id is required");
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
|
|
206
111
|
describe("error path", () => {
|
|
207
112
|
test("non-OK response surfaces body .error message", async () => {
|
|
208
113
|
mockFetchResponse = {
|
|
@@ -11,3 +11,44 @@ export type SkillIpcRoute = {
|
|
|
11
11
|
method: string;
|
|
12
12
|
handler: SkillMethodHandler;
|
|
13
13
|
};
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Streaming types
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
export interface SkillIpcStream {
|
|
20
|
+
/** The original request id that opened this stream (used as the stream id). */
|
|
21
|
+
readonly id: string;
|
|
22
|
+
/**
|
|
23
|
+
* Send a delivery frame to the client. No-op after the stream has been
|
|
24
|
+
* closed (client disconnect, explicit close, or server shutdown).
|
|
25
|
+
*/
|
|
26
|
+
send(payload: unknown): void;
|
|
27
|
+
/**
|
|
28
|
+
* Terminate the stream from the server side. Sends a final error frame to
|
|
29
|
+
* the client (if `errorMessage` is provided and the socket is still
|
|
30
|
+
* writable), invokes the handler-returned dispose, and unregisters the
|
|
31
|
+
* stream from the per-socket subscription map. Idempotent — subsequent
|
|
32
|
+
* calls are no-ops.
|
|
33
|
+
*/
|
|
34
|
+
close(errorMessage?: string): void;
|
|
35
|
+
/** True until the stream has been disposed. */
|
|
36
|
+
readonly active: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Handler signature for long-lived streaming methods (e.g.
|
|
41
|
+
* `host.events.subscribe`). Runs synchronously with the opening request and
|
|
42
|
+
* returns a dispose callback that the server invokes on client disconnect,
|
|
43
|
+
* explicit close, or server shutdown.
|
|
44
|
+
*/
|
|
45
|
+
export type SkillIpcStreamingHandler = (
|
|
46
|
+
stream: SkillIpcStream,
|
|
47
|
+
params?: Record<string, unknown>,
|
|
48
|
+
) => () => void;
|
|
49
|
+
|
|
50
|
+
/** Long-lived streaming route — method name + handler function. */
|
|
51
|
+
export type SkillIpcStreamingRoute = {
|
|
52
|
+
method: string;
|
|
53
|
+
handler: SkillIpcStreamingHandler;
|
|
54
|
+
};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - `host.events.publish` — publishes an event and verifies it reaches the
|
|
8
8
|
* daemon's `assistantEventHub` exactly as an in-process publish would.
|
|
9
9
|
* - `host.events.buildEvent` — verifies deterministic envelope construction
|
|
10
|
-
*
|
|
10
|
+
* with the expected shape.
|
|
11
11
|
* - `host.events.subscribe` — long-lived stream: confirms open ack, filtered
|
|
12
12
|
* delivery (match vs. mismatch), explicit close, and cleanup on client
|
|
13
13
|
* disconnect (including that the hub releases its subscription slot).
|
|
@@ -21,7 +21,6 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
21
21
|
|
|
22
22
|
import type { AssistantEvent } from "../../../runtime/assistant-event.js";
|
|
23
23
|
import { assistantEventHub } from "../../../runtime/assistant-event-hub.js";
|
|
24
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../../../runtime/assistant-scope.js";
|
|
25
24
|
import { SkillIpcServer } from "../../skill-server.js";
|
|
26
25
|
|
|
27
26
|
// ---------------------------------------------------------------------------
|
|
@@ -144,18 +143,17 @@ async function waitForSubscriberCount(
|
|
|
144
143
|
describe("host.events.publish", () => {
|
|
145
144
|
test("publish round-trip reaches assistantEventHub subscribers", async () => {
|
|
146
145
|
const received: AssistantEvent[] = [];
|
|
147
|
-
const subscription = assistantEventHub.subscribe(
|
|
148
|
-
|
|
149
|
-
(evt) => {
|
|
146
|
+
const subscription = assistantEventHub.subscribe({
|
|
147
|
+
type: "process",
|
|
148
|
+
callback: (evt) => {
|
|
150
149
|
received.push(evt);
|
|
151
150
|
},
|
|
152
|
-
);
|
|
151
|
+
});
|
|
153
152
|
|
|
154
153
|
try {
|
|
155
154
|
const client = await openClient();
|
|
156
155
|
const event = {
|
|
157
156
|
id: "evt-1",
|
|
158
|
-
assistantId: "test-asst",
|
|
159
157
|
conversationId: "conv-1",
|
|
160
158
|
emittedAt: new Date().toISOString(),
|
|
161
159
|
message: { type: "test_message", foo: "bar" },
|
|
@@ -171,7 +169,6 @@ describe("host.events.publish", () => {
|
|
|
171
169
|
|
|
172
170
|
expect(received).toHaveLength(1);
|
|
173
171
|
expect(received[0]?.id).toBe("evt-1");
|
|
174
|
-
expect(received[0]?.assistantId).toBe("test-asst");
|
|
175
172
|
expect((received[0]?.message as unknown as { foo: string }).foo).toBe(
|
|
176
173
|
"bar",
|
|
177
174
|
);
|
|
@@ -198,7 +195,7 @@ describe("host.events.publish", () => {
|
|
|
198
195
|
});
|
|
199
196
|
|
|
200
197
|
describe("host.events.buildEvent", () => {
|
|
201
|
-
test("returns
|
|
198
|
+
test("returns a well-formed event envelope", async () => {
|
|
202
199
|
const client = await openClient();
|
|
203
200
|
const conversationId = "conv-xyz";
|
|
204
201
|
const message = { type: "assistant_text_delta", text: "hi" };
|
|
@@ -211,7 +208,6 @@ describe("host.events.buildEvent", () => {
|
|
|
211
208
|
const frame = await client.nextFrame();
|
|
212
209
|
expect("result" in frame).toBe(true);
|
|
213
210
|
const built = (frame as { result: AssistantEvent }).result;
|
|
214
|
-
expect(built.assistantId).toBe(DAEMON_INTERNAL_ASSISTANT_ID);
|
|
215
211
|
expect(built.conversationId).toBe(conversationId);
|
|
216
212
|
expect(typeof built.id).toBe("string");
|
|
217
213
|
expect(typeof built.emittedAt).toBe("string");
|
|
@@ -222,7 +218,7 @@ describe("host.events.buildEvent", () => {
|
|
|
222
218
|
});
|
|
223
219
|
|
|
224
220
|
describe("host.events.subscribe", () => {
|
|
225
|
-
test("opens ack, delivers matching events, filters non-matching", async () => {
|
|
221
|
+
test("opens ack, delivers matching events, filters non-matching conversations", async () => {
|
|
226
222
|
const baseSubscribers = assistantEventHub.subscriberCount();
|
|
227
223
|
const client = await openClient();
|
|
228
224
|
client.send({
|
|
@@ -230,7 +226,6 @@ describe("host.events.subscribe", () => {
|
|
|
230
226
|
method: "host.events.subscribe",
|
|
231
227
|
params: {
|
|
232
228
|
filter: {
|
|
233
|
-
assistantId: "asst-a",
|
|
234
229
|
conversationId: "conv-a",
|
|
235
230
|
},
|
|
236
231
|
},
|
|
@@ -265,16 +260,7 @@ describe("host.events.subscribe", () => {
|
|
|
265
260
|
message: { type: "t2" },
|
|
266
261
|
} as never);
|
|
267
262
|
|
|
268
|
-
//
|
|
269
|
-
await assistantEventHub.publish({
|
|
270
|
-
id: "e3",
|
|
271
|
-
assistantId: "asst-b",
|
|
272
|
-
conversationId: "conv-a",
|
|
273
|
-
emittedAt: new Date().toISOString(),
|
|
274
|
-
message: { type: "t3" },
|
|
275
|
-
} as never);
|
|
276
|
-
|
|
277
|
-
// Confirm no delivery frame arrives for the non-matching events by
|
|
263
|
+
// Confirm no delivery frame arrives for the non-matching event by
|
|
278
264
|
// publishing another matching event and asserting ordering.
|
|
279
265
|
await assistantEventHub.publish({
|
|
280
266
|
id: "e4",
|
|
@@ -300,7 +286,7 @@ describe("host.events.subscribe", () => {
|
|
|
300
286
|
client.send({
|
|
301
287
|
id: "sub-2",
|
|
302
288
|
method: "host.events.subscribe",
|
|
303
|
-
params: { filter: {
|
|
289
|
+
params: { filter: {} },
|
|
304
290
|
});
|
|
305
291
|
await client.nextFrame(); // ack
|
|
306
292
|
expect(assistantEventHub.subscriberCount()).toBe(baseSubscribers + 1);
|
|
@@ -324,7 +310,7 @@ describe("host.events.subscribe", () => {
|
|
|
324
310
|
client.send({
|
|
325
311
|
id: "sub-3",
|
|
326
312
|
method: "host.events.subscribe",
|
|
327
|
-
params: { filter: {
|
|
313
|
+
params: { filter: {} },
|
|
328
314
|
});
|
|
329
315
|
await client.nextFrame(); // ack
|
|
330
316
|
expect(assistantEventHub.subscriberCount()).toBe(baseSubscribers + 1);
|
|
@@ -352,7 +338,7 @@ describe("host.events.subscribe", () => {
|
|
|
352
338
|
client.send({
|
|
353
339
|
id: "sub-4",
|
|
354
340
|
method: "host.events.subscribe",
|
|
355
|
-
params: { filter: {
|
|
341
|
+
params: { filter: {} },
|
|
356
342
|
});
|
|
357
343
|
await client.nextFrame(); // ack
|
|
358
344
|
expect(assistantEventHub.subscriberCount()).toBe(baseSubscribers + 1);
|
|
@@ -371,7 +357,7 @@ describe("host.events.subscribe", () => {
|
|
|
371
357
|
client.send({
|
|
372
358
|
id: "sub-dup",
|
|
373
359
|
method: "host.events.subscribe",
|
|
374
|
-
params: { filter: {
|
|
360
|
+
params: { filter: {} },
|
|
375
361
|
});
|
|
376
362
|
const ack = await client.nextFrame();
|
|
377
363
|
expect("result" in ack && ack.result).toEqual({ subscribed: true });
|
|
@@ -379,7 +365,7 @@ describe("host.events.subscribe", () => {
|
|
|
379
365
|
client.send({
|
|
380
366
|
id: "sub-dup",
|
|
381
367
|
method: "host.events.subscribe",
|
|
382
|
-
params: { filter: {
|
|
368
|
+
params: { filter: {} },
|
|
383
369
|
});
|
|
384
370
|
const err = await client.nextFrame();
|
|
385
371
|
expect("error" in err && err.error).toContain("sub-dup");
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for the `host.identity.*` skill IPC routes. Mocks
|
|
3
3
|
* `getAssistantName()` so we can assert both the resolved-name and
|
|
4
|
-
* missing-name paths
|
|
5
|
-
* canonical "self" constant.
|
|
4
|
+
* missing-name paths.
|
|
6
5
|
*/
|
|
7
6
|
|
|
8
7
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
@@ -17,11 +16,8 @@ mock.module("../../../daemon/identity-helpers.js", () => ({
|
|
|
17
16
|
getAssistantName: () => mockName,
|
|
18
17
|
}));
|
|
19
18
|
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
hostIdentityGetInternalAssistantIdRoute,
|
|
23
|
-
identityRoutes,
|
|
24
|
-
} = await import("../identity.js");
|
|
19
|
+
const { hostIdentityGetAssistantNameRoute, identityRoutes } =
|
|
20
|
+
await import("../identity.js");
|
|
25
21
|
|
|
26
22
|
// ---------------------------------------------------------------------------
|
|
27
23
|
// Tests
|
|
@@ -59,23 +55,8 @@ describe("host.identity.getAssistantName IPC route", () => {
|
|
|
59
55
|
});
|
|
60
56
|
});
|
|
61
57
|
|
|
62
|
-
describe("host.identity.getInternalAssistantId IPC route", () => {
|
|
63
|
-
test("method is host.identity.getInternalAssistantId", () => {
|
|
64
|
-
expect(hostIdentityGetInternalAssistantIdRoute.method).toBe(
|
|
65
|
-
"host.identity.getInternalAssistantId",
|
|
66
|
-
);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test("returns the daemon internal assistant id constant", async () => {
|
|
70
|
-
const result = await hostIdentityGetInternalAssistantIdRoute.handler();
|
|
71
|
-
|
|
72
|
-
expect(result).toBe("self");
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
|
|
76
58
|
describe("identityRoutes", () => {
|
|
77
|
-
test("exports
|
|
59
|
+
test("exports the identity route", () => {
|
|
78
60
|
expect(identityRoutes).toContain(hostIdentityGetAssistantNameRoute);
|
|
79
|
-
expect(identityRoutes).toContain(hostIdentityGetInternalAssistantIdRoute);
|
|
80
61
|
});
|
|
81
62
|
});
|