@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
|
@@ -64,16 +64,43 @@ export interface ValidationError {
|
|
|
64
64
|
export interface ManifestFileEntry {
|
|
65
65
|
path: string;
|
|
66
66
|
sha256: string;
|
|
67
|
-
|
|
67
|
+
size_bytes: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ManifestAssistantInfo {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
runtime_version: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ManifestOrigin {
|
|
77
|
+
mode: "managed" | "self-hosted-remote" | "self-hosted-local";
|
|
78
|
+
platform_version?: string;
|
|
79
|
+
hostname?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface ManifestCompatibility {
|
|
83
|
+
min_runtime_version: string;
|
|
84
|
+
max_runtime_version: string | null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface ManifestExportOptions {
|
|
88
|
+
include_logs: boolean;
|
|
89
|
+
include_browser_state: boolean;
|
|
90
|
+
include_memory_vectors: boolean;
|
|
68
91
|
}
|
|
69
92
|
|
|
70
93
|
export interface Manifest {
|
|
71
|
-
schema_version:
|
|
94
|
+
schema_version: number;
|
|
95
|
+
bundle_id: string;
|
|
72
96
|
created_at: string;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
assistant: ManifestAssistantInfo;
|
|
98
|
+
origin: ManifestOrigin;
|
|
99
|
+
compatibility: ManifestCompatibility;
|
|
100
|
+
contents: ManifestFileEntry[];
|
|
101
|
+
checksum: string;
|
|
102
|
+
secrets_redacted: boolean;
|
|
103
|
+
export_options: ManifestExportOptions;
|
|
77
104
|
}
|
|
78
105
|
|
|
79
106
|
// ---------------------------------------------------------------------------
|
|
@@ -104,8 +131,8 @@ export interface ExportRuntimeResult {
|
|
|
104
131
|
ok: true;
|
|
105
132
|
archive: ArrayBuffer;
|
|
106
133
|
filename: string;
|
|
107
|
-
schemaVersion:
|
|
108
|
-
|
|
134
|
+
schemaVersion: number;
|
|
135
|
+
checksum: string;
|
|
109
136
|
}
|
|
110
137
|
|
|
111
138
|
/** Managed export initiates an async job and returns a job ID. */
|
|
@@ -398,8 +425,14 @@ export async function exportBundle(
|
|
|
398
425
|
} as ExportManagedResult;
|
|
399
426
|
}
|
|
400
427
|
|
|
401
|
-
// Runtime returns the binary archive
|
|
428
|
+
// Runtime returns the binary archive. The legacy
|
|
429
|
+
// `X-Vbundle-Manifest-Sha256` response header name is preserved for
|
|
430
|
+
// cross-version client compat — its value is now sourced from the
|
|
431
|
+
// renamed manifest `checksum` field.
|
|
402
432
|
const archive = await response.arrayBuffer();
|
|
433
|
+
const schemaVersionHeader =
|
|
434
|
+
response.headers.get("X-Vbundle-Schema-Version") ?? "";
|
|
435
|
+
const parsedSchemaVersion = Number.parseInt(schemaVersionHeader, 10);
|
|
403
436
|
return {
|
|
404
437
|
ok: true,
|
|
405
438
|
archive,
|
|
@@ -407,10 +440,10 @@ export async function exportBundle(
|
|
|
407
440
|
response.headers
|
|
408
441
|
.get("Content-Disposition")
|
|
409
442
|
?.match(/filename="?(.+?)"?$/)?.[1] ?? "export.vbundle",
|
|
410
|
-
schemaVersion:
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
443
|
+
schemaVersion: Number.isFinite(parsedSchemaVersion)
|
|
444
|
+
? parsedSchemaVersion
|
|
445
|
+
: 0,
|
|
446
|
+
checksum: response.headers.get("X-Vbundle-Manifest-Sha256") ?? "",
|
|
414
447
|
} as ExportRuntimeResult;
|
|
415
448
|
}
|
|
416
449
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Origin-mode derivation for vbundle exports.
|
|
3
|
+
*
|
|
4
|
+
* The vbundle manifest v1 schema's `origin.mode` enum captures the deployment
|
|
5
|
+
* shape that produced the bundle. The runtime's two underlying signals are:
|
|
6
|
+
*
|
|
7
|
+
* - `hasManagedProxyPrereqs()` — true when the daemon has the credentials
|
|
8
|
+
* it needs to act as a managed-proxy client, i.e. this is a managed
|
|
9
|
+
* deployment.
|
|
10
|
+
* - `getDaemonRuntimeMode()` — `"docker"` vs `"bare-metal"`, identifying
|
|
11
|
+
* where the daemon process is running.
|
|
12
|
+
*
|
|
13
|
+
* Folding both into a single helper keeps callers from repeating the
|
|
14
|
+
* combination logic.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { hasManagedProxyPrereqs } from "../../providers/managed-proxy/context.js";
|
|
18
|
+
import { getDaemonRuntimeMode } from "../runtime-mode.js";
|
|
19
|
+
|
|
20
|
+
export type VBundleOriginMode =
|
|
21
|
+
| "managed"
|
|
22
|
+
| "self-hosted-remote"
|
|
23
|
+
| "self-hosted-local";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns the origin mode for the current daemon.
|
|
27
|
+
*
|
|
28
|
+
* Managed-proxy prereqs win first (a managed deployment is always
|
|
29
|
+
* "managed" regardless of where the daemon process runs); otherwise docker
|
|
30
|
+
* → "self-hosted-remote", bare-metal → "self-hosted-local".
|
|
31
|
+
*/
|
|
32
|
+
export async function getOriginMode(): Promise<VBundleOriginMode> {
|
|
33
|
+
if (await hasManagedProxyPrereqs()) {
|
|
34
|
+
return "managed";
|
|
35
|
+
}
|
|
36
|
+
if (getDaemonRuntimeMode() === "docker") {
|
|
37
|
+
return "self-hosted-remote";
|
|
38
|
+
}
|
|
39
|
+
return "self-hosted-local";
|
|
40
|
+
}
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* - workspace/: the entire ~/.vellum/workspace/ directory tree (DB, config,
|
|
7
7
|
* skills, prompts, attachments, etc.) — excluding large/regenerable
|
|
8
8
|
* dirs (embedding-models/, data/qdrant/)
|
|
9
|
-
* - trust/trust.json: trust rules (optional)
|
|
10
9
|
*/
|
|
11
10
|
|
|
12
11
|
import { createHash, randomUUID } from "node:crypto";
|
|
@@ -29,6 +28,7 @@ import { pipeline } from "node:stream/promises";
|
|
|
29
28
|
import { createGzip, gzipSync } from "node:zlib";
|
|
30
29
|
|
|
31
30
|
import { sanitizeConfigForTransfer } from "../../config/sanitize-for-transfer.js";
|
|
31
|
+
import type { VBundleOriginMode } from "./origin-mode.js";
|
|
32
32
|
import type {
|
|
33
33
|
ManifestFileEntryType,
|
|
34
34
|
ManifestType,
|
|
@@ -43,15 +43,50 @@ export interface VBundleFileEntry {
|
|
|
43
43
|
data: Uint8Array;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/** v1 manifest `assistant` block. */
|
|
47
|
+
export interface VBundleAssistantInfo {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
runtime_version: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** v1 manifest `origin` block. */
|
|
54
|
+
export interface VBundleOriginInfo {
|
|
55
|
+
mode: VBundleOriginMode;
|
|
56
|
+
platform_version?: string;
|
|
57
|
+
hostname?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** v1 manifest `compatibility` block. */
|
|
61
|
+
export interface VBundleCompatibility {
|
|
62
|
+
min_runtime_version: string;
|
|
63
|
+
max_runtime_version: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** v1 manifest `export_options` block. */
|
|
67
|
+
export interface VBundleExportOptions {
|
|
68
|
+
include_logs: boolean;
|
|
69
|
+
include_browser_state: boolean;
|
|
70
|
+
include_memory_vectors: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
46
73
|
export interface BuildVBundleOptions {
|
|
47
74
|
/** Files to include in the archive. Must include data/db/assistant.db. */
|
|
48
75
|
files: VBundleFileEntry[];
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
|
|
76
|
+
/** Identity of the assistant that produced this bundle. */
|
|
77
|
+
assistant: VBundleAssistantInfo;
|
|
78
|
+
/** Where this bundle was produced. */
|
|
79
|
+
origin: VBundleOriginInfo;
|
|
80
|
+
/** Runtime-version compatibility window for importers. */
|
|
81
|
+
compatibility: VBundleCompatibility;
|
|
82
|
+
/** Which optional bundle contents this export carries. */
|
|
83
|
+
exportOptions: VBundleExportOptions;
|
|
84
|
+
/**
|
|
85
|
+
* Whether secrets were stripped from the bundle before archiving.
|
|
86
|
+
* Required at the type level — defaulting silently is exactly how the
|
|
87
|
+
* prior schema mismatch went unnoticed.
|
|
88
|
+
*/
|
|
89
|
+
secretsRedacted: boolean;
|
|
55
90
|
}
|
|
56
91
|
|
|
57
92
|
export interface BuildVBundleResult {
|
|
@@ -284,45 +319,77 @@ function createTarArchive(
|
|
|
284
319
|
// Core builder
|
|
285
320
|
// ---------------------------------------------------------------------------
|
|
286
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Build the v1 manifest object and its serialized JSON bytes for a vbundle.
|
|
324
|
+
*
|
|
325
|
+
* Shared by the buffered (`buildVBundle`) and streaming
|
|
326
|
+
* (`streamExportVBundle`) emit sites so the manifest shape and self-checksum
|
|
327
|
+
* computation live in exactly one place.
|
|
328
|
+
*
|
|
329
|
+
* The checksum is computed over the canonicalized manifest with the
|
|
330
|
+
* `checksum` field set to the empty string (per the schema spec) — both
|
|
331
|
+
* producers and the validator agree on this exact wire shape.
|
|
332
|
+
*/
|
|
333
|
+
function buildManifestObject(input: {
|
|
334
|
+
contents: ManifestFileEntryType[];
|
|
335
|
+
assistant: VBundleAssistantInfo;
|
|
336
|
+
origin: VBundleOriginInfo;
|
|
337
|
+
compatibility: VBundleCompatibility;
|
|
338
|
+
exportOptions: VBundleExportOptions;
|
|
339
|
+
secretsRedacted: boolean;
|
|
340
|
+
now: Date;
|
|
341
|
+
}): { manifest: ManifestType; manifestData: Uint8Array } {
|
|
342
|
+
const manifestWithEmptyChecksum = {
|
|
343
|
+
schema_version: 1 as const,
|
|
344
|
+
bundle_id: randomUUID(),
|
|
345
|
+
created_at: input.now.toISOString(),
|
|
346
|
+
assistant: input.assistant,
|
|
347
|
+
origin: input.origin,
|
|
348
|
+
compatibility: input.compatibility,
|
|
349
|
+
contents: input.contents,
|
|
350
|
+
checksum: "",
|
|
351
|
+
secrets_redacted: input.secretsRedacted,
|
|
352
|
+
export_options: input.exportOptions,
|
|
353
|
+
};
|
|
354
|
+
const checksum = sha256Hex(canonicalizeJson(manifestWithEmptyChecksum));
|
|
355
|
+
const manifest: ManifestType = { ...manifestWithEmptyChecksum, checksum };
|
|
356
|
+
const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
|
|
357
|
+
return { manifest, manifestData };
|
|
358
|
+
}
|
|
359
|
+
|
|
287
360
|
/**
|
|
288
361
|
* Build a .vbundle archive from the given files and metadata.
|
|
289
362
|
*
|
|
290
363
|
* Generates a valid manifest with SHA-256 checksums for all files and
|
|
291
|
-
* a self-referencing
|
|
364
|
+
* a self-referencing `checksum`. The archive is returned
|
|
292
365
|
* as gzip-compressed tar bytes.
|
|
293
366
|
*/
|
|
294
367
|
export function buildVBundle(options: BuildVBundleOptions): BuildVBundleResult {
|
|
295
368
|
const {
|
|
296
369
|
files,
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
370
|
+
assistant,
|
|
371
|
+
origin,
|
|
372
|
+
compatibility,
|
|
373
|
+
exportOptions,
|
|
374
|
+
secretsRedacted,
|
|
300
375
|
} = options;
|
|
301
376
|
|
|
302
377
|
// Build file entries for the manifest
|
|
303
378
|
const fileEntries: ManifestFileEntryType[] = files.map((f) => ({
|
|
304
379
|
path: f.path,
|
|
305
380
|
sha256: sha256Hex(f.data),
|
|
306
|
-
|
|
381
|
+
size_bytes: f.data.length,
|
|
307
382
|
}));
|
|
308
383
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
// Compute the manifest self-checksum
|
|
319
|
-
const manifestSha256 = sha256Hex(canonicalizeJson(manifestWithoutChecksum));
|
|
320
|
-
const manifest: ManifestType = {
|
|
321
|
-
...manifestWithoutChecksum,
|
|
322
|
-
manifest_sha256: manifestSha256,
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
|
|
384
|
+
const { manifest, manifestData } = buildManifestObject({
|
|
385
|
+
contents: fileEntries,
|
|
386
|
+
assistant,
|
|
387
|
+
origin,
|
|
388
|
+
compatibility,
|
|
389
|
+
exportOptions,
|
|
390
|
+
secretsRedacted,
|
|
391
|
+
now: new Date(),
|
|
392
|
+
});
|
|
326
393
|
|
|
327
394
|
// Build tar entries: manifest first, then all files
|
|
328
395
|
const tarEntries = [
|
|
@@ -423,12 +490,16 @@ function walkDirectory(
|
|
|
423
490
|
// ---------------------------------------------------------------------------
|
|
424
491
|
|
|
425
492
|
export interface BuildExportVBundleOptions {
|
|
426
|
-
/**
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
|
|
493
|
+
/** Identity of the assistant that produced this bundle. */
|
|
494
|
+
assistant: VBundleAssistantInfo;
|
|
495
|
+
/** Where this bundle was produced. */
|
|
496
|
+
origin: VBundleOriginInfo;
|
|
497
|
+
/** Runtime-version compatibility window for importers. */
|
|
498
|
+
compatibility: VBundleCompatibility;
|
|
499
|
+
/** Which optional bundle contents this export carries. */
|
|
500
|
+
exportOptions: VBundleExportOptions;
|
|
501
|
+
/** Whether secrets were stripped from the bundle before archiving. */
|
|
502
|
+
secretsRedacted: boolean;
|
|
432
503
|
/**
|
|
433
504
|
* Absolute path to the workspace directory (~/.vellum/workspace/).
|
|
434
505
|
* When provided and exists, the entire directory tree is walked and
|
|
@@ -455,7 +526,7 @@ export interface BuildExportVBundleOptions {
|
|
|
455
526
|
* Walks the entire workspace directory (~/.vellum/workspace/) and includes
|
|
456
527
|
* all files in the archive, skipping only large/regenerable directories
|
|
457
528
|
* (embedding-models/, data/qdrant/). Binary files (SQLite DB, attachments)
|
|
458
|
-
* are included.
|
|
529
|
+
* are included.
|
|
459
530
|
*
|
|
460
531
|
* The WAL is checkpointed before the walk so the exported DB file contains
|
|
461
532
|
* all committed rows.
|
|
@@ -464,10 +535,12 @@ export function buildExportVBundle(
|
|
|
464
535
|
options: BuildExportVBundleOptions,
|
|
465
536
|
): BuildVBundleResult {
|
|
466
537
|
const {
|
|
467
|
-
|
|
468
|
-
|
|
538
|
+
assistant,
|
|
539
|
+
origin,
|
|
540
|
+
compatibility,
|
|
541
|
+
exportOptions,
|
|
542
|
+
secretsRedacted,
|
|
469
543
|
checkpoint,
|
|
470
|
-
trustPath,
|
|
471
544
|
workspaceDir,
|
|
472
545
|
credentials,
|
|
473
546
|
} = options;
|
|
@@ -504,12 +577,6 @@ export function buildExportVBundle(
|
|
|
504
577
|
configEntry.data = new TextEncoder().encode(sanitized);
|
|
505
578
|
}
|
|
506
579
|
|
|
507
|
-
// Include trust rules if the file exists.
|
|
508
|
-
if (trustPath && existsSync(trustPath)) {
|
|
509
|
-
const trustData = new Uint8Array(readFileSync(trustPath));
|
|
510
|
-
files.push({ path: "trust/trust.json", data: trustData });
|
|
511
|
-
}
|
|
512
|
-
|
|
513
580
|
// Include credential entries if provided
|
|
514
581
|
if (credentials?.length) {
|
|
515
582
|
for (const { account, value } of credentials) {
|
|
@@ -520,8 +587,11 @@ export function buildExportVBundle(
|
|
|
520
587
|
|
|
521
588
|
return buildVBundle({
|
|
522
589
|
files,
|
|
523
|
-
|
|
524
|
-
|
|
590
|
+
assistant,
|
|
591
|
+
origin,
|
|
592
|
+
compatibility,
|
|
593
|
+
exportOptions,
|
|
594
|
+
secretsRedacted,
|
|
525
595
|
});
|
|
526
596
|
}
|
|
527
597
|
|
|
@@ -799,10 +869,12 @@ export async function streamExportVBundle(
|
|
|
799
869
|
options: BuildExportVBundleOptions,
|
|
800
870
|
): Promise<StreamExportVBundleResult> {
|
|
801
871
|
const {
|
|
802
|
-
|
|
803
|
-
|
|
872
|
+
assistant,
|
|
873
|
+
origin,
|
|
874
|
+
compatibility,
|
|
875
|
+
exportOptions,
|
|
876
|
+
secretsRedacted,
|
|
804
877
|
checkpoint,
|
|
805
|
-
trustPath,
|
|
806
878
|
workspaceDir,
|
|
807
879
|
credentials,
|
|
808
880
|
} = options;
|
|
@@ -828,18 +900,6 @@ export async function streamExportVBundle(
|
|
|
828
900
|
);
|
|
829
901
|
}
|
|
830
902
|
|
|
831
|
-
// Include trust rules if the file exists
|
|
832
|
-
if (trustPath && existsSync(trustPath)) {
|
|
833
|
-
const trustStat = lstatSync(trustPath);
|
|
834
|
-
if (trustStat.isFile()) {
|
|
835
|
-
allFileMetadata.push({
|
|
836
|
-
archivePath: "trust/trust.json",
|
|
837
|
-
diskPath: trustPath,
|
|
838
|
-
size: trustStat.size,
|
|
839
|
-
});
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
|
|
843
903
|
// Sanitize workspace/config.json: read from disk, sanitize, and replace the
|
|
844
904
|
// disk-backed metadata entry with an in-memory entry so the streaming tar
|
|
845
905
|
// writes sanitized content instead of the raw file.
|
|
@@ -886,7 +946,7 @@ export async function streamExportVBundle(
|
|
|
886
946
|
fileEntries.push({
|
|
887
947
|
path: file.archivePath,
|
|
888
948
|
sha256,
|
|
889
|
-
|
|
949
|
+
size_bytes: file.size,
|
|
890
950
|
});
|
|
891
951
|
}
|
|
892
952
|
|
|
@@ -896,25 +956,19 @@ export async function streamExportVBundle(
|
|
|
896
956
|
fileEntries.push({
|
|
897
957
|
path: entry.archivePath,
|
|
898
958
|
sha256,
|
|
899
|
-
|
|
959
|
+
size_bytes: entry.size,
|
|
900
960
|
});
|
|
901
961
|
}
|
|
902
962
|
|
|
903
|
-
const
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
const manifest: ManifestType = {
|
|
913
|
-
...manifestWithoutChecksum,
|
|
914
|
-
manifest_sha256: manifestSha256,
|
|
915
|
-
};
|
|
916
|
-
|
|
917
|
-
const manifestData = new TextEncoder().encode(JSON.stringify(manifest));
|
|
963
|
+
const { manifest, manifestData } = buildManifestObject({
|
|
964
|
+
contents: fileEntries,
|
|
965
|
+
assistant,
|
|
966
|
+
origin,
|
|
967
|
+
compatibility,
|
|
968
|
+
exportOptions,
|
|
969
|
+
secretsRedacted,
|
|
970
|
+
now: new Date(),
|
|
971
|
+
});
|
|
918
972
|
|
|
919
973
|
// ------------------------------------------------------------------
|
|
920
974
|
// Pass 2: Stream tar through gzip into a temp file
|
|
@@ -112,7 +112,9 @@ export class DefaultPathResolver implements PathResolver {
|
|
|
112
112
|
constructor(
|
|
113
113
|
private workspaceDir?: string,
|
|
114
114
|
private hooksDir?: string,
|
|
115
|
-
private guardianPersonaPathResolver: () =>
|
|
115
|
+
private guardianPersonaPathResolver: () =>
|
|
116
|
+
| string
|
|
117
|
+
| null = resolveGuardianPersonaPath,
|
|
116
118
|
) {}
|
|
117
119
|
|
|
118
120
|
resolve(archivePath: string): string | null {
|
|
@@ -247,7 +249,7 @@ export function analyzeImport(
|
|
|
247
249
|
const files: ImportFileReport[] = [];
|
|
248
250
|
const conflicts: ImportConflict[] = [];
|
|
249
251
|
|
|
250
|
-
for (const fileEntry of manifest.
|
|
252
|
+
for (const fileEntry of manifest.contents) {
|
|
251
253
|
const diskPath = pathResolver.resolve(fileEntry.path);
|
|
252
254
|
|
|
253
255
|
// Credential entries are handled separately by the credential import
|
|
@@ -256,7 +258,7 @@ export function analyzeImport(
|
|
|
256
258
|
files.push({
|
|
257
259
|
path: fileEntry.path,
|
|
258
260
|
action: "skip",
|
|
259
|
-
bundle_size: fileEntry.
|
|
261
|
+
bundle_size: fileEntry.size_bytes,
|
|
260
262
|
bundle_sha256: fileEntry.sha256,
|
|
261
263
|
current_size: null,
|
|
262
264
|
current_sha256: null,
|
|
@@ -278,7 +280,7 @@ export function analyzeImport(
|
|
|
278
280
|
files.push({
|
|
279
281
|
path: fileEntry.path,
|
|
280
282
|
action: "skip",
|
|
281
|
-
bundle_size: fileEntry.
|
|
283
|
+
bundle_size: fileEntry.size_bytes,
|
|
282
284
|
bundle_sha256: fileEntry.sha256,
|
|
283
285
|
current_size: null,
|
|
284
286
|
current_sha256: null,
|
|
@@ -295,7 +297,7 @@ export function analyzeImport(
|
|
|
295
297
|
files.push({
|
|
296
298
|
path: fileEntry.path,
|
|
297
299
|
action: "skip",
|
|
298
|
-
bundle_size: fileEntry.
|
|
300
|
+
bundle_size: fileEntry.size_bytes,
|
|
299
301
|
bundle_sha256: fileEntry.sha256,
|
|
300
302
|
current_size: null,
|
|
301
303
|
current_sha256: null,
|
|
@@ -324,7 +326,7 @@ export function analyzeImport(
|
|
|
324
326
|
files.push({
|
|
325
327
|
path: fileEntry.path,
|
|
326
328
|
action,
|
|
327
|
-
bundle_size: fileEntry.
|
|
329
|
+
bundle_size: fileEntry.size_bytes,
|
|
328
330
|
bundle_sha256: fileEntry.sha256,
|
|
329
331
|
current_size: currentSize,
|
|
330
332
|
current_sha256: currentSha256,
|
|
@@ -344,7 +346,7 @@ export function analyzeImport(
|
|
|
344
346
|
files.push({
|
|
345
347
|
path: fileEntry.path,
|
|
346
348
|
action,
|
|
347
|
-
bundle_size: fileEntry.
|
|
349
|
+
bundle_size: fileEntry.size_bytes,
|
|
348
350
|
bundle_sha256: fileEntry.sha256,
|
|
349
351
|
current_size: currentSize,
|
|
350
352
|
current_sha256: currentSha256,
|
|
@@ -246,7 +246,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
246
246
|
// valid disk path. This prevents path-traversal entries (e.g.
|
|
247
247
|
// "workspace/../../etc/passwd") from triggering a workspace purge while
|
|
248
248
|
// resolving to nothing.
|
|
249
|
-
const hasWorkspaceEntries = manifest.
|
|
249
|
+
const hasWorkspaceEntries = manifest.contents.some(
|
|
250
250
|
(f) => f.path.startsWith("workspace/") && !!pathResolver.resolve(f.path),
|
|
251
251
|
);
|
|
252
252
|
|
|
@@ -314,7 +314,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
314
314
|
const warnings: string[] = [];
|
|
315
315
|
let backupsCreated = 0;
|
|
316
316
|
|
|
317
|
-
for (const fileEntry of manifest.
|
|
317
|
+
for (const fileEntry of manifest.contents) {
|
|
318
318
|
// Credential entries are handled separately by extractCredentialsFromBundle()
|
|
319
319
|
// in migration-routes.ts — skip them silently without warnings or skip counts.
|
|
320
320
|
if (fileEntry.path.startsWith("credentials/")) {
|
|
@@ -329,7 +329,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
329
329
|
path: fileEntry.path,
|
|
330
330
|
disk_path: "",
|
|
331
331
|
action: "skipped",
|
|
332
|
-
size: fileEntry.
|
|
332
|
+
size: fileEntry.size_bytes,
|
|
333
333
|
sha256: fileEntry.sha256,
|
|
334
334
|
backup_path: null,
|
|
335
335
|
});
|
|
@@ -347,7 +347,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
347
347
|
path: fileEntry.path,
|
|
348
348
|
disk_path: diskPath,
|
|
349
349
|
action: "skipped",
|
|
350
|
-
size: fileEntry.
|
|
350
|
+
size: fileEntry.size_bytes,
|
|
351
351
|
sha256: fileEntry.sha256,
|
|
352
352
|
backup_path: null,
|
|
353
353
|
});
|
|
@@ -377,7 +377,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
377
377
|
path: fileEntry.path,
|
|
378
378
|
disk_path: diskPath,
|
|
379
379
|
action: "skipped",
|
|
380
|
-
size: fileEntry.
|
|
380
|
+
size: fileEntry.size_bytes,
|
|
381
381
|
sha256: fileEntry.sha256,
|
|
382
382
|
backup_path: null,
|
|
383
383
|
});
|
|
@@ -536,7 +536,7 @@ export function commitImport(options: ImportCommitOptions): ImportCommitResult {
|
|
|
536
536
|
// run (e.g. workspaceDir unset) the live metadata.json is still on
|
|
537
537
|
// disk untouched — we must not rewrite it here or we would drop the
|
|
538
538
|
// non-vellum entries the caller chose to keep.
|
|
539
|
-
const bundleHadMetadata = manifest.
|
|
539
|
+
const bundleHadMetadata = manifest.contents.some(
|
|
540
540
|
(f) => f.path === CREDENTIAL_METADATA_ARCHIVE_PATH,
|
|
541
541
|
);
|
|
542
542
|
if (
|
|
@@ -595,7 +595,7 @@ export function extractCredentialsFromBundle(
|
|
|
595
595
|
entries: Map<string, VBundleTarEntry>,
|
|
596
596
|
manifest: ManifestType,
|
|
597
597
|
): Array<{ account: string; value: string }> {
|
|
598
|
-
const manifestPaths = new Set(manifest.
|
|
598
|
+
const manifestPaths = new Set(manifest.contents.map((f) => f.path));
|
|
599
599
|
const credentials: Array<{ account: string; value: string }> = [];
|
|
600
600
|
for (const [path, entry] of entries) {
|
|
601
601
|
if (path.startsWith("credentials/") && manifestPaths.has(path)) {
|
|
@@ -314,10 +314,10 @@ export async function streamCommitImport(
|
|
|
314
314
|
// Entry-count ceiling check. The manifest declares every file the
|
|
315
315
|
// bundle claims to contain, so one check here bounds the work the
|
|
316
316
|
// importer is willing to do for this bundle.
|
|
317
|
-
if (manifest.
|
|
317
|
+
if (manifest.contents.length > bundleEntryCap) {
|
|
318
318
|
throw new StreamingValidationError(
|
|
319
319
|
"bundle_too_many_entries",
|
|
320
|
-
`bundle contains more than ${bundleEntryCap} entries (declared: ${manifest.
|
|
320
|
+
`bundle contains more than ${bundleEntryCap} entries (declared: ${manifest.contents.length})`,
|
|
321
321
|
);
|
|
322
322
|
}
|
|
323
323
|
entryIndex += 1;
|
|
@@ -350,7 +350,7 @@ export async function streamCommitImport(
|
|
|
350
350
|
// Non-file entries are either directory markers (empty body) or
|
|
351
351
|
// pax-header / other metadata payloads we don't consume. Apply the
|
|
352
352
|
// bundle byte cap to their tar-header size too — an attacker could
|
|
353
|
-
// otherwise keep `manifest.
|
|
353
|
+
// otherwise keep `manifest.contents` small while stuffing huge pax/other
|
|
354
354
|
// entry bodies, draining the importer for free. Directory bodies are
|
|
355
355
|
// reliably zero-sized; pax headers are measured in bytes, so this
|
|
356
356
|
// check is effectively free in the happy path.
|