@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
|
@@ -23,13 +23,8 @@ export type AssistantEvent = BaseAssistantEvent<ServerMessage>;
|
|
|
23
23
|
|
|
24
24
|
/** Daemon-side wrapper preserving the original `ServerMessage`-typed signature. */
|
|
25
25
|
export function buildAssistantEvent(
|
|
26
|
-
assistantId: string,
|
|
27
26
|
message: ServerMessage,
|
|
28
27
|
conversationId?: string,
|
|
29
28
|
): AssistantEvent {
|
|
30
|
-
return baseBuildAssistantEvent<ServerMessage>(
|
|
31
|
-
assistantId,
|
|
32
|
-
message,
|
|
33
|
-
conversationId,
|
|
34
|
-
);
|
|
29
|
+
return baseBuildAssistantEvent<ServerMessage>(message, conversationId);
|
|
35
30
|
}
|
|
@@ -61,12 +61,3 @@ export function buildAuthContext(claims: TokenClaims): BuildAuthContextResult {
|
|
|
61
61
|
|
|
62
62
|
return { ok: true, context };
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* True when the request was authenticated as the gateway service.
|
|
67
|
-
* Used at endpoints that gate platform-only or trust-mediated behavior
|
|
68
|
-
* on the caller being the gateway rather than an end-user actor.
|
|
69
|
-
*/
|
|
70
|
-
export function isServiceGatewayPrincipal(authContext: AuthContext): boolean {
|
|
71
|
-
return authContext.principalType === "svc_gateway";
|
|
72
|
-
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Replaces both the legacy bearer shared-secret check and the
|
|
18
18
|
* actor-token HMAC middleware with a single JWT verification path.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
20
|
+
* When DISABLE_HTTP_AUTH is set (platform-managed deployments), JWT
|
|
21
21
|
* verification is skipped and a synthetic AuthContext is constructed
|
|
22
22
|
* so downstream code always has a typed context to consume.
|
|
23
23
|
*/
|
|
@@ -221,10 +221,6 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
221
221
|
endpoint: "integrations/slack/channel/config:DELETE",
|
|
222
222
|
scopes: ["settings.write"],
|
|
223
223
|
},
|
|
224
|
-
{
|
|
225
|
-
endpoint: "integrations/slack/channel/oauth-install:POST",
|
|
226
|
-
scopes: ["settings.write"],
|
|
227
|
-
},
|
|
228
224
|
{ endpoint: "channel-verification-sessions", scopes: ["settings.write"] },
|
|
229
225
|
{
|
|
230
226
|
endpoint: "channel-verification-sessions:DELETE",
|
|
@@ -317,12 +313,14 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
317
313
|
{ endpoint: "usage/totals", scopes: ["settings.read"] },
|
|
318
314
|
{ endpoint: "usage/daily", scopes: ["settings.read"] },
|
|
319
315
|
{ endpoint: "usage/breakdown", scopes: ["settings.read"] },
|
|
316
|
+
{ endpoint: "usage/series", scopes: ["settings.read"] },
|
|
320
317
|
|
|
321
318
|
// Lifecycle telemetry
|
|
322
319
|
{ endpoint: "telemetry/lifecycle", scopes: ["settings.write"] },
|
|
323
320
|
|
|
324
321
|
// Debug / introspection
|
|
325
322
|
{ endpoint: "clients", scopes: ["settings.read"] },
|
|
323
|
+
{ endpoint: "clients/disconnect", scopes: ["settings.write"] },
|
|
326
324
|
{ endpoint: "debug", scopes: ["settings.read"] },
|
|
327
325
|
|
|
328
326
|
// Workspace file browsing
|
|
@@ -376,6 +374,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
376
374
|
{ endpoint: "config:GET", scopes: ["settings.read"] },
|
|
377
375
|
{ endpoint: "config:PATCH", scopes: ["settings.write"] },
|
|
378
376
|
|
|
377
|
+
// LLM call site catalog
|
|
378
|
+
{ endpoint: "config/llm/call-sites:GET", scopes: ["settings.read"] },
|
|
379
|
+
|
|
379
380
|
// Conversation management
|
|
380
381
|
{ endpoint: "conversations:DELETE", scopes: ["chat.write"] },
|
|
381
382
|
{ endpoint: "conversations/wipe", scopes: ["chat.write"] },
|
|
@@ -423,11 +424,8 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
423
424
|
{ endpoint: "memory/v2/validate:POST", scopes: ["settings.read"] },
|
|
424
425
|
{ endpoint: "memory/v2/reembed-skills:POST", scopes: ["settings.write"] },
|
|
425
426
|
|
|
426
|
-
// Trust rule
|
|
427
|
+
// Trust rule listing
|
|
427
428
|
{ endpoint: "trust-rules/manage:GET", scopes: ["settings.read"] },
|
|
428
|
-
{ endpoint: "trust-rules/manage:POST", scopes: ["settings.write"] },
|
|
429
|
-
{ endpoint: "trust-rules/manage:DELETE", scopes: ["settings.write"] },
|
|
430
|
-
{ endpoint: "trust-rules/manage:PATCH", scopes: ["settings.write"] },
|
|
431
429
|
|
|
432
430
|
// Computer use
|
|
433
431
|
{ endpoint: "computer-use/sessions", scopes: ["chat.write"] },
|
|
@@ -488,6 +486,10 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
488
486
|
{ endpoint: "filing", scopes: ["settings.read"] },
|
|
489
487
|
{ endpoint: "filing:POST", scopes: ["settings.write"] },
|
|
490
488
|
|
|
489
|
+
// Consolidation (memory v2 counterpart to Filing)
|
|
490
|
+
{ endpoint: "consolidation", scopes: ["settings.read"] },
|
|
491
|
+
{ endpoint: "consolidation:POST", scopes: ["settings.write"] },
|
|
492
|
+
|
|
491
493
|
// Heartbeat (config, runs, checklist — all share the "heartbeat" policyKey)
|
|
492
494
|
{ endpoint: "heartbeat:GET", scopes: ["settings.read"] },
|
|
493
495
|
{ endpoint: "heartbeat", scopes: ["settings.write"] },
|
|
@@ -699,7 +701,7 @@ registerPolicy("conversations/wipe", {
|
|
|
699
701
|
|
|
700
702
|
registerPolicy("trust-rules/suggest", {
|
|
701
703
|
requiredScopes: ["settings.write"],
|
|
702
|
-
allowedPrincipalTypes: ["local"],
|
|
704
|
+
allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
|
|
703
705
|
});
|
|
704
706
|
|
|
705
707
|
// Notification pipeline: local-only (CLI / IPC callers)
|
|
@@ -215,17 +215,6 @@ export function initAuthSigningKey(key: Buffer): void {
|
|
|
215
215
|
_authSigningKey = key;
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
/**
|
|
219
|
-
* Check whether the auth signing key has been initialized.
|
|
220
|
-
*
|
|
221
|
-
* Useful for out-of-process contexts (CLI) that may run without
|
|
222
|
-
* daemon startup, where callers need to decide whether they can
|
|
223
|
-
* mint JWTs or must fall back to the legacy shared-secret token.
|
|
224
|
-
*/
|
|
225
|
-
export function isSigningKeyInitialized(): boolean {
|
|
226
|
-
return _authSigningKey !== undefined;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
218
|
/**
|
|
230
219
|
* Reset the signing key to undefined. **Test-only** — used to simulate a
|
|
231
220
|
* fresh CLI subprocess where initAuthSigningKey() was never called.
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* 3. Consume user decisions and apply them to the underlying session
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { findConversation } from "../daemon/conversation-store.js";
|
|
12
13
|
import type { UserDecision } from "../permissions/types.js";
|
|
13
14
|
import { composeApprovalMessage } from "./approval-message-composer.js";
|
|
14
15
|
import type {
|
|
@@ -165,13 +166,16 @@ export function handleChannelDecision(
|
|
|
165
166
|
|
|
166
167
|
// Map channel-level action to the permission system's UserDecision type.
|
|
167
168
|
const userDecision = mapApprovalActionToUserDecision(decision.action);
|
|
169
|
+
const conversation = findConversation(resolved.conversationId);
|
|
170
|
+
if (!conversation) return { applied: false };
|
|
171
|
+
|
|
168
172
|
if (decisionContext === undefined) {
|
|
169
|
-
|
|
173
|
+
conversation.handleConfirmationResponse(
|
|
170
174
|
info.requestId,
|
|
171
175
|
userDecision,
|
|
172
176
|
);
|
|
173
177
|
} else {
|
|
174
|
-
|
|
178
|
+
conversation.handleConfirmationResponse(
|
|
175
179
|
info.requestId,
|
|
176
180
|
userDecision,
|
|
177
181
|
undefined,
|
|
@@ -153,9 +153,8 @@ export function createInboundVerificationSession(
|
|
|
153
153
|
* validates the secret against pending challenges, verifies identity
|
|
154
154
|
* binding, and consumes the challenge. It returns the verification type
|
|
155
155
|
* (guardian or trusted_contact) but does NOT create bindings or apply
|
|
156
|
-
* role-specific side effects — those are handled by
|
|
157
|
-
* verification
|
|
158
|
-
* relay-server.ts (voice verification).
|
|
156
|
+
* role-specific side effects — those are handled by the gateway's
|
|
157
|
+
* text-verification.ts and voice verification intercepts.
|
|
159
158
|
*
|
|
160
159
|
* On failure the invalid-attempt counter is incremented; after
|
|
161
160
|
* exceeding the threshold the actor is locked out for a cooldown
|
|
@@ -308,8 +307,7 @@ export function validateAndConsumeVerification(
|
|
|
308
307
|
resetRateLimit(channel, actorExternalUserId, actorChatId);
|
|
309
308
|
|
|
310
309
|
// Return the verification type — role-specific side effects are
|
|
311
|
-
// handled by
|
|
312
|
-
// relay-server (voice).
|
|
310
|
+
// handled by the gateway's verification intercepts.
|
|
313
311
|
return {
|
|
314
312
|
success: true,
|
|
315
313
|
verificationType:
|
|
@@ -73,37 +73,3 @@ export function httpError(
|
|
|
73
73
|
};
|
|
74
74
|
return Response.json(body, { status });
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Derive the appropriate `HttpErrorCode` from an HTTP status code.
|
|
79
|
-
* Useful when domain functions return a numeric status and a generic error
|
|
80
|
-
* message — this maps the status to a semantically correct error code.
|
|
81
|
-
*/
|
|
82
|
-
export function httpErrorCodeFromStatus(status: number): HttpErrorCode {
|
|
83
|
-
switch (status) {
|
|
84
|
-
case 400:
|
|
85
|
-
return "BAD_REQUEST";
|
|
86
|
-
case 401:
|
|
87
|
-
return "UNAUTHORIZED";
|
|
88
|
-
case 403:
|
|
89
|
-
return "FORBIDDEN";
|
|
90
|
-
case 404:
|
|
91
|
-
return "NOT_FOUND";
|
|
92
|
-
case 409:
|
|
93
|
-
return "CONFLICT";
|
|
94
|
-
case 410:
|
|
95
|
-
return "GONE";
|
|
96
|
-
case 422:
|
|
97
|
-
return "UNPROCESSABLE_ENTITY";
|
|
98
|
-
case 424:
|
|
99
|
-
return "FAILED_DEPENDENCY";
|
|
100
|
-
case 429:
|
|
101
|
-
return "RATE_LIMITED";
|
|
102
|
-
case 501:
|
|
103
|
-
return "NOT_IMPLEMENTED";
|
|
104
|
-
case 503:
|
|
105
|
-
return "SERVICE_UNAVAILABLE";
|
|
106
|
-
default:
|
|
107
|
-
return "INTERNAL_ERROR";
|
|
108
|
-
}
|
|
109
|
-
}
|
|
@@ -16,6 +16,8 @@ import { enforcePolicy, getPolicy } from "./auth/route-policy.js";
|
|
|
16
16
|
import type { AuthContext } from "./auth/types.js";
|
|
17
17
|
import { httpError } from "./http-errors.js";
|
|
18
18
|
import { withErrorHandling } from "./middleware/error-handler.js";
|
|
19
|
+
import { routeDefinitionsToHTTPRoutes } from "./routes/http-adapter.js";
|
|
20
|
+
import { ROUTES } from "./routes/index.js";
|
|
19
21
|
import type { RoutePathParam } from "./routes/types.js";
|
|
20
22
|
|
|
21
23
|
// ---------------------------------------------------------------------------
|
|
@@ -147,8 +149,8 @@ interface CompiledRoute {
|
|
|
147
149
|
export class HttpRouter {
|
|
148
150
|
private compiledRoutes: CompiledRoute[] = [];
|
|
149
151
|
|
|
150
|
-
constructor(
|
|
151
|
-
for (const def of
|
|
152
|
+
constructor() {
|
|
153
|
+
for (const def of routeDefinitionsToHTTPRoutes(ROUTES)) {
|
|
152
154
|
this.compiledRoutes.push(compileRoute(def));
|
|
153
155
|
}
|
|
154
156
|
}
|
|
@@ -219,7 +221,8 @@ export class HttpRouter {
|
|
|
219
221
|
// Path-param type → regex fragment
|
|
220
222
|
// ---------------------------------------------------------------------------
|
|
221
223
|
|
|
222
|
-
const UUID_PATTERN =
|
|
224
|
+
const UUID_PATTERN =
|
|
225
|
+
"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
|
|
223
226
|
|
|
224
227
|
/** Map of param type → regex capture group (without the surrounding parens). */
|
|
225
228
|
const PARAM_TYPE_PATTERNS: Record<string, string> = {
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* configured port (default: 7821).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
import type { ServerWebSocket } from "bun";
|
|
10
9
|
|
|
11
10
|
import {
|
|
@@ -26,10 +25,8 @@ import {
|
|
|
26
25
|
handleStatusCallback,
|
|
27
26
|
handleVoiceWebhook,
|
|
28
27
|
} from "../calls/twilio-routes.js";
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
isHttpAuthDisabled,
|
|
32
|
-
} from "../config/env.js";
|
|
28
|
+
import { isHttpAuthDisabled } from "../config/env.js";
|
|
29
|
+
import { getIsPlatform } from "../config/env-registry.js";
|
|
33
30
|
import { getConfig } from "../config/loader.js";
|
|
34
31
|
import { processMessage } from "../daemon/process-message.js";
|
|
35
32
|
import { createLiveVoiceSession } from "../live-voice/live-voice-session.js";
|
|
@@ -57,9 +54,7 @@ import { parseSub } from "./auth/subject.js";
|
|
|
57
54
|
import { verifyToken } from "./auth/token-service.js";
|
|
58
55
|
import { verifyHostBrowserCapability } from "./capability-tokens.js";
|
|
59
56
|
import { sweepFailedEvents } from "./channel-retry-sweep.js";
|
|
60
|
-
import { getChromeExtensionRegistry } from "./chrome-extension-registry.js";
|
|
61
57
|
import { httpError, type HttpErrorCode } from "./http-errors.js";
|
|
62
|
-
import type { HTTPRouteDefinition } from "./http-router.js";
|
|
63
58
|
import { HttpRouter } from "./http-router.js";
|
|
64
59
|
// Middleware
|
|
65
60
|
import {
|
|
@@ -101,9 +96,7 @@ import {
|
|
|
101
96
|
resolveHostBrowserResultByRequestId,
|
|
102
97
|
resolveHostBrowserSessionInvalidated,
|
|
103
98
|
} from "./routes/host-browser-routes.js";
|
|
104
|
-
import { routeDefinitionsToHTTPRoutes } from "./routes/http-adapter.js";
|
|
105
99
|
import { handleHealth, handleReadyz } from "./routes/identity-routes.js";
|
|
106
|
-
import { ROUTES } from "./routes/index.js";
|
|
107
100
|
import { matchSkillRoute } from "./skill-route-registry.js";
|
|
108
101
|
|
|
109
102
|
// Re-export for consumers
|
|
@@ -140,9 +133,8 @@ const MAX_REQUEST_BODY_BYTES = 512 * 1024 * 1024;
|
|
|
140
133
|
/**
|
|
141
134
|
* WebSocket data attached to `/v1/browser-relay` connections. The route
|
|
142
135
|
* is used exclusively by the chrome-extension CDP proxy — outbound
|
|
143
|
-
* `host_browser_request` frames are pushed through the
|
|
144
|
-
*
|
|
145
|
-
* frames are dispatched through
|
|
136
|
+
* `host_browser_request` frames are pushed through the assistant event
|
|
137
|
+
* hub, and inbound `host_browser_result` frames are dispatched through
|
|
146
138
|
* `resolveHostBrowserResultByRequestId`. The extension may also submit
|
|
147
139
|
* results via `POST /v1/host-browser-result` (both transports resolve
|
|
148
140
|
* through the same core function).
|
|
@@ -152,21 +144,16 @@ interface BrowserRelayWebSocketData {
|
|
|
152
144
|
connectionId: string;
|
|
153
145
|
/**
|
|
154
146
|
* Guardian identity derived from the JWT claims at WebSocket upgrade
|
|
155
|
-
* time.
|
|
156
|
-
*
|
|
157
|
-
* HTTP auth is disabled (dev bypass) or when the token's sub cannot be
|
|
158
|
-
* parsed into an actor principal.
|
|
147
|
+
* time. Undefined when HTTP auth is disabled (dev bypass) or when the
|
|
148
|
+
* token's sub cannot be parsed into an actor principal.
|
|
159
149
|
*/
|
|
160
150
|
guardianId?: string;
|
|
161
151
|
/**
|
|
162
152
|
* Stable per-extension-install identifier supplied by the client on
|
|
163
153
|
* the WebSocket handshake (via the `clientInstanceId` query param or
|
|
164
|
-
* the `x-client-instance-id` header).
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* other on register/unregister. Undefined on older extension builds
|
|
168
|
-
* — the registry synthesizes a connection-scoped fallback key in
|
|
169
|
-
* that case for backwards-compatible single-instance semantics.
|
|
154
|
+
* the `x-client-instance-id` header). Allows multiple parallel installs
|
|
155
|
+
* for the same guardian (e.g. two Chrome profiles, two desktops) to
|
|
156
|
+
* coexist. Undefined on older extension builds.
|
|
170
157
|
*/
|
|
171
158
|
clientInstanceId?: string;
|
|
172
159
|
}
|
|
@@ -243,7 +230,7 @@ export class RuntimeHttpServer {
|
|
|
243
230
|
this.liveVoiceSessionManager = new LiveVoiceSessionManager({
|
|
244
231
|
createSession: (context) => createLiveVoiceSession(context),
|
|
245
232
|
});
|
|
246
|
-
this.router = new HttpRouter(
|
|
233
|
+
this.router = new HttpRouter();
|
|
247
234
|
}
|
|
248
235
|
|
|
249
236
|
/** The port the server is actually listening on (resolved after start). */
|
|
@@ -267,23 +254,6 @@ export class RuntimeHttpServer {
|
|
|
267
254
|
websocket: {
|
|
268
255
|
open: (ws) => {
|
|
269
256
|
const data = ws.data as AllWebSocketData;
|
|
270
|
-
if ("wsType" in data && data.wsType === "browser-relay") {
|
|
271
|
-
// When the JWT sub resolved to a guardian principal at upgrade
|
|
272
|
-
// time, register this connection with the chrome-extension
|
|
273
|
-
// registry so host_browser_request frames can be routed to it.
|
|
274
|
-
if (data.guardianId) {
|
|
275
|
-
const now = Date.now();
|
|
276
|
-
getChromeExtensionRegistry().register({
|
|
277
|
-
id: data.connectionId,
|
|
278
|
-
guardianId: data.guardianId,
|
|
279
|
-
clientInstanceId: data.clientInstanceId,
|
|
280
|
-
ws,
|
|
281
|
-
connectedAt: now,
|
|
282
|
-
lastActiveAt: now,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
257
|
if ("wsType" in data && data.wsType === "media-stream") {
|
|
288
258
|
const msData = data as MediaStreamWebSocketData;
|
|
289
259
|
log.info(
|
|
@@ -499,11 +469,7 @@ export class RuntimeHttpServer {
|
|
|
499
469
|
return;
|
|
500
470
|
}
|
|
501
471
|
case "keepalive": {
|
|
502
|
-
// Extension keepalive
|
|
503
|
-
// activity timestamp without producing log noise or
|
|
504
|
-
// altering routing semantics. Unknown extra keys on
|
|
505
|
-
// the frame are silently ignored (lenient validation).
|
|
506
|
-
getChromeExtensionRegistry().touch(data.connectionId);
|
|
472
|
+
// Extension keepalive — acknowledged, no action needed.
|
|
507
473
|
return;
|
|
508
474
|
}
|
|
509
475
|
default: {
|
|
@@ -564,15 +530,6 @@ export class RuntimeHttpServer {
|
|
|
564
530
|
},
|
|
565
531
|
close: (ws, code, reason) => {
|
|
566
532
|
const data = ws.data as AllWebSocketData;
|
|
567
|
-
if ("wsType" in data && data.wsType === "browser-relay") {
|
|
568
|
-
// Always attempt to unregister — the registry uses connectionId
|
|
569
|
-
// as the key and no-ops if the entry is absent (e.g. when the
|
|
570
|
-
// connection was never registered because guardianId was
|
|
571
|
-
// undefined, or when it was superseded by a newer registration
|
|
572
|
-
// for the same guardian).
|
|
573
|
-
getChromeExtensionRegistry().unregister(data.connectionId);
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
533
|
if ("wsType" in data && data.wsType === "media-stream") {
|
|
577
534
|
const msData = data as MediaStreamWebSocketData;
|
|
578
535
|
log.info(
|
|
@@ -661,14 +618,16 @@ export class RuntimeHttpServer {
|
|
|
661
618
|
);
|
|
662
619
|
}
|
|
663
620
|
|
|
664
|
-
if (
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
621
|
+
if (isHttpAuthDisabled()) {
|
|
622
|
+
if (getIsPlatform()) {
|
|
623
|
+
log.info(
|
|
624
|
+
"DISABLE_HTTP_AUTH is set — HTTP auth disabled (expected: platform handles auth)",
|
|
625
|
+
);
|
|
626
|
+
} else {
|
|
627
|
+
log.warn(
|
|
628
|
+
"DISABLE_HTTP_AUTH is set — HTTP API authentication is DISABLED. All API endpoints are accessible without a bearer token.",
|
|
629
|
+
);
|
|
630
|
+
}
|
|
672
631
|
}
|
|
673
632
|
|
|
674
633
|
log.info(
|
|
@@ -1058,9 +1017,7 @@ export class RuntimeHttpServer {
|
|
|
1058
1017
|
guardianId = fallbackGuardianId;
|
|
1059
1018
|
} else {
|
|
1060
1019
|
// Fail closed: a service-token relay upgrade without a
|
|
1061
|
-
// guardian context cannot be routed safely.
|
|
1062
|
-
// upgrade to proceed creates an unscoped socket that never
|
|
1063
|
-
// registers in the ChromeExtensionRegistry.
|
|
1020
|
+
// guardian context cannot be routed safely.
|
|
1064
1021
|
log.warn(
|
|
1065
1022
|
{
|
|
1066
1023
|
principalType: subResult.ok
|
|
@@ -1446,21 +1403,4 @@ export class RuntimeHttpServer {
|
|
|
1446
1403
|
|
|
1447
1404
|
return null;
|
|
1448
1405
|
}
|
|
1449
|
-
|
|
1450
|
-
// ---------------------------------------------------------------------------
|
|
1451
|
-
// Declarative route table
|
|
1452
|
-
// ---------------------------------------------------------------------------
|
|
1453
|
-
|
|
1454
|
-
/**
|
|
1455
|
-
* Build the full set of route definitions. Routes are matched in order,
|
|
1456
|
-
* so more specific patterns (e.g. `calls/:id/cancel`) must precede
|
|
1457
|
-
* more general ones (e.g. `calls/:id`).
|
|
1458
|
-
*
|
|
1459
|
-
* Each domain's routes are defined in their own module under
|
|
1460
|
-
* `./routes/` and composed here via spread. The composition order
|
|
1461
|
-
* preserves the original top-to-bottom matching semantics.
|
|
1462
|
-
*/
|
|
1463
|
-
private buildRouteTable(): HTTPRouteDefinition[] {
|
|
1464
|
-
return [...routeDefinitionsToHTTPRoutes(ROUTES)];
|
|
1465
|
-
}
|
|
1466
1406
|
}
|
|
@@ -118,6 +118,8 @@ export interface RuntimeMessageConversationOptions {
|
|
|
118
118
|
isInteractive?: boolean;
|
|
119
119
|
/** Channel command intent metadata (e.g. Telegram /start). */
|
|
120
120
|
commandIntent?: { type: string; payload?: string; languageCode?: string };
|
|
121
|
+
/** Slack-only non-persisted notice injected into the active model turn. */
|
|
122
|
+
slackRuntimeContextNotice?: string;
|
|
121
123
|
/** Optional callback to receive real-time agent loop events (text deltas, tool starts, etc.). */
|
|
122
124
|
onEvent?: (msg: ServerMessage) => void;
|
|
123
125
|
/**
|
|
@@ -206,6 +208,9 @@ export interface RuntimeMessagePayload {
|
|
|
206
208
|
riskLevel?: string;
|
|
207
209
|
riskReason?: string;
|
|
208
210
|
autoApproved?: boolean;
|
|
211
|
+
approvalMode?: string;
|
|
212
|
+
approvalReason?: string;
|
|
213
|
+
riskThreshold?: string;
|
|
209
214
|
}>;
|
|
210
215
|
interfaces?: string[];
|
|
211
216
|
surfaces?: Array<{
|
|
@@ -12,26 +12,6 @@ export function isLoopbackHost(hostname: string): boolean {
|
|
|
12
12
|
);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
/**
|
|
16
|
-
* Stricter loopback-only check: accepts only 127.0.0.0/8, ::1, and their
|
|
17
|
-
* IPv4-mapped IPv6 forms (::ffff:127.x.x.x). Use this instead of
|
|
18
|
-
* isPrivateAddress for endpoints that must be restricted to the local
|
|
19
|
-
* machine in non-containerized deployments.
|
|
20
|
-
*/
|
|
21
|
-
export function isLoopbackAddress(addr: string): boolean {
|
|
22
|
-
const v4Mapped = addr.match(/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i);
|
|
23
|
-
const normalized = v4Mapped ? v4Mapped[1] : addr;
|
|
24
|
-
|
|
25
|
-
if (normalized.includes(".")) {
|
|
26
|
-
const parts = normalized.split(".").map(Number);
|
|
27
|
-
if (parts.length !== 4 || parts.some((p) => isNaN(p) || p < 0 || p > 255))
|
|
28
|
-
return false;
|
|
29
|
-
return parts[0] === 127;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return normalized.toLowerCase() === "::1";
|
|
33
|
-
}
|
|
34
|
-
|
|
35
15
|
/**
|
|
36
16
|
* @internal Exported for testing.
|
|
37
17
|
*
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test helpers for vbundle v1 manifest fixture builders.
|
|
3
|
+
*
|
|
4
|
+
* Most tests don't care about the specific values of the assistant identity,
|
|
5
|
+
* origin, compatibility, or export-options blocks — they just need the
|
|
6
|
+
* builder/validator to accept their fixtures. Centralizing the defaults
|
|
7
|
+
* keeps every test from re-spelling the same six required option fields.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
|
+
|
|
12
|
+
import type {
|
|
13
|
+
BuildVBundleOptions,
|
|
14
|
+
VBundleAssistantInfo,
|
|
15
|
+
VBundleCompatibility,
|
|
16
|
+
VBundleExportOptions,
|
|
17
|
+
VBundleOriginInfo,
|
|
18
|
+
} from "../vbundle-builder.js";
|
|
19
|
+
import {
|
|
20
|
+
computeManifestChecksum,
|
|
21
|
+
type ManifestFileEntryType,
|
|
22
|
+
type ManifestType,
|
|
23
|
+
} from "../vbundle-validator.js";
|
|
24
|
+
|
|
25
|
+
export interface DefaultV1Options {
|
|
26
|
+
assistant: VBundleAssistantInfo;
|
|
27
|
+
origin: VBundleOriginInfo;
|
|
28
|
+
compatibility: VBundleCompatibility;
|
|
29
|
+
exportOptions: VBundleExportOptions;
|
|
30
|
+
secretsRedacted: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Sensible defaults for the six caller-required v1 manifest options.
|
|
35
|
+
*
|
|
36
|
+
* `secretsRedacted` defaults to false to match the runtime's typical
|
|
37
|
+
* "credentials included by design" path; tests that exercise the managed
|
|
38
|
+
* cross-field refine override `origin.mode` and `secretsRedacted` directly.
|
|
39
|
+
*/
|
|
40
|
+
export function defaultV1Options(): DefaultV1Options {
|
|
41
|
+
return {
|
|
42
|
+
assistant: {
|
|
43
|
+
id: "self",
|
|
44
|
+
name: "Test",
|
|
45
|
+
runtime_version: "0.0.0-test",
|
|
46
|
+
},
|
|
47
|
+
origin: {
|
|
48
|
+
mode: "self-hosted-local",
|
|
49
|
+
},
|
|
50
|
+
compatibility: {
|
|
51
|
+
min_runtime_version: "0.0.0-test",
|
|
52
|
+
max_runtime_version: null,
|
|
53
|
+
},
|
|
54
|
+
exportOptions: {
|
|
55
|
+
include_logs: false,
|
|
56
|
+
include_browser_state: false,
|
|
57
|
+
include_memory_vectors: false,
|
|
58
|
+
},
|
|
59
|
+
secretsRedacted: false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Convenience: spread `defaultV1Options()` into a `BuildVBundleOptions`
|
|
65
|
+
* with the supplied `files`. Saves repeating the spread at every call site.
|
|
66
|
+
*/
|
|
67
|
+
export function buildVBundleTestOptions(
|
|
68
|
+
files: BuildVBundleOptions["files"],
|
|
69
|
+
overrides: Partial<DefaultV1Options> = {},
|
|
70
|
+
): BuildVBundleOptions {
|
|
71
|
+
return {
|
|
72
|
+
files,
|
|
73
|
+
...defaultV1Options(),
|
|
74
|
+
...overrides,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Build a v1 ManifestType for tests, mirroring buildManifestObject() in
|
|
80
|
+
* vbundle-builder.ts. Use this in test fixtures that need a synthetic
|
|
81
|
+
* manifest rather than calling buildVBundle (e.g. cross-version compat
|
|
82
|
+
* tests that need to mutate fields between emit and validate).
|
|
83
|
+
*
|
|
84
|
+
* Pass `overrides` to override any field after the defaults are applied —
|
|
85
|
+
* useful for negative-path tests that exercise specific schema rejections.
|
|
86
|
+
* `schema_version` is widened to `number` so negative tests can write 0/2/etc.
|
|
87
|
+
* The checksum is computed on the merged shape so overrides take effect.
|
|
88
|
+
*/
|
|
89
|
+
export type BuildTestManifestOverrides = Partial<
|
|
90
|
+
Omit<ManifestType, "schema_version">
|
|
91
|
+
> & { schema_version?: number };
|
|
92
|
+
|
|
93
|
+
export function buildTestManifest(input: {
|
|
94
|
+
contents: ManifestFileEntryType[];
|
|
95
|
+
overrides?: BuildTestManifestOverrides;
|
|
96
|
+
}): ManifestType {
|
|
97
|
+
const base = defaultV1Options();
|
|
98
|
+
const merged = {
|
|
99
|
+
schema_version: 1,
|
|
100
|
+
bundle_id: randomUUID(),
|
|
101
|
+
created_at: new Date().toISOString(),
|
|
102
|
+
assistant: base.assistant,
|
|
103
|
+
origin: base.origin,
|
|
104
|
+
compatibility: base.compatibility,
|
|
105
|
+
contents: input.contents,
|
|
106
|
+
checksum: "",
|
|
107
|
+
secrets_redacted: base.secretsRedacted,
|
|
108
|
+
export_options: base.exportOptions,
|
|
109
|
+
...(input.overrides ?? {}),
|
|
110
|
+
} as ManifestType;
|
|
111
|
+
return { ...merged, checksum: computeManifestChecksum(merged) };
|
|
112
|
+
}
|