@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
|
@@ -31,6 +31,7 @@ import { buildVBundle } from "../vbundle-builder.js";
|
|
|
31
31
|
import { DefaultPathResolver } from "../vbundle-import-analyzer.js";
|
|
32
32
|
import { commitImport } from "../vbundle-importer.js";
|
|
33
33
|
import { streamCommitImport } from "../vbundle-streaming-importer.js";
|
|
34
|
+
import { defaultV1Options } from "./v1-test-helpers.js";
|
|
34
35
|
|
|
35
36
|
// ---------------------------------------------------------------------------
|
|
36
37
|
// Metadata helpers
|
|
@@ -138,6 +139,10 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
138
139
|
]);
|
|
139
140
|
const { archive } = buildVBundle({
|
|
140
141
|
files: [
|
|
142
|
+
{
|
|
143
|
+
path: "data/db/assistant.db",
|
|
144
|
+
data: new Uint8Array(),
|
|
145
|
+
},
|
|
141
146
|
{
|
|
142
147
|
path: "workspace/data/credentials/metadata.json",
|
|
143
148
|
data: encode(bundleMetadata),
|
|
@@ -145,6 +150,7 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
145
150
|
// Include at least one other workspace entry so Step 1b fires.
|
|
146
151
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
147
152
|
],
|
|
153
|
+
...defaultV1Options(),
|
|
148
154
|
});
|
|
149
155
|
|
|
150
156
|
const result = commitImport({
|
|
@@ -179,12 +185,17 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
179
185
|
]);
|
|
180
186
|
const { archive } = buildVBundle({
|
|
181
187
|
files: [
|
|
188
|
+
{
|
|
189
|
+
path: "data/db/assistant.db",
|
|
190
|
+
data: new Uint8Array(),
|
|
191
|
+
},
|
|
182
192
|
{
|
|
183
193
|
path: "workspace/data/credentials/metadata.json",
|
|
184
194
|
data: encode(bundleMetadata),
|
|
185
195
|
},
|
|
186
196
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
187
197
|
],
|
|
198
|
+
...defaultV1Options(),
|
|
188
199
|
});
|
|
189
200
|
|
|
190
201
|
const result = commitImport({
|
|
@@ -207,7 +218,11 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
207
218
|
const metadataPath = seedTargetMetadata(workspaceDir, vellumRecords());
|
|
208
219
|
|
|
209
220
|
const { archive } = buildVBundle({
|
|
210
|
-
files: [
|
|
221
|
+
files: [
|
|
222
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
223
|
+
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
224
|
+
],
|
|
225
|
+
...defaultV1Options(),
|
|
211
226
|
});
|
|
212
227
|
|
|
213
228
|
const result = commitImport({
|
|
@@ -228,6 +243,10 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
228
243
|
test("target without existing metadata.json → bundle's file lands verbatim", () => {
|
|
229
244
|
const { archive } = buildVBundle({
|
|
230
245
|
files: [
|
|
246
|
+
{
|
|
247
|
+
path: "data/db/assistant.db",
|
|
248
|
+
data: new Uint8Array(),
|
|
249
|
+
},
|
|
231
250
|
{
|
|
232
251
|
path: "workspace/data/credentials/metadata.json",
|
|
233
252
|
data: encode(
|
|
@@ -236,6 +255,7 @@ describe("commitImport — credential metadata merge", () => {
|
|
|
236
255
|
},
|
|
237
256
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
238
257
|
],
|
|
258
|
+
...defaultV1Options(),
|
|
239
259
|
});
|
|
240
260
|
|
|
241
261
|
const result = commitImport({
|
|
@@ -279,12 +299,17 @@ describe("streamCommitImport — credential metadata merge", () => {
|
|
|
279
299
|
]);
|
|
280
300
|
const { archive } = buildVBundle({
|
|
281
301
|
files: [
|
|
302
|
+
{
|
|
303
|
+
path: "data/db/assistant.db",
|
|
304
|
+
data: new Uint8Array(),
|
|
305
|
+
},
|
|
282
306
|
{
|
|
283
307
|
path: "workspace/data/credentials/metadata.json",
|
|
284
308
|
data: encode(bundleMetadata),
|
|
285
309
|
},
|
|
286
310
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
287
311
|
],
|
|
312
|
+
...defaultV1Options(),
|
|
288
313
|
});
|
|
289
314
|
|
|
290
315
|
const result = await streamCommitImport({
|
|
@@ -316,12 +341,17 @@ describe("streamCommitImport — credential metadata merge", () => {
|
|
|
316
341
|
]);
|
|
317
342
|
const { archive } = buildVBundle({
|
|
318
343
|
files: [
|
|
344
|
+
{
|
|
345
|
+
path: "data/db/assistant.db",
|
|
346
|
+
data: new Uint8Array(),
|
|
347
|
+
},
|
|
319
348
|
{
|
|
320
349
|
path: "workspace/data/credentials/metadata.json",
|
|
321
350
|
data: encode(bundleMetadata),
|
|
322
351
|
},
|
|
323
352
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
324
353
|
],
|
|
354
|
+
...defaultV1Options(),
|
|
325
355
|
});
|
|
326
356
|
|
|
327
357
|
const result = await streamCommitImport({
|
|
@@ -344,7 +374,11 @@ describe("streamCommitImport — credential metadata merge", () => {
|
|
|
344
374
|
const metadataPath = seedTargetMetadata(workspaceDir, vellumRecords());
|
|
345
375
|
|
|
346
376
|
const { archive } = buildVBundle({
|
|
347
|
-
files: [
|
|
377
|
+
files: [
|
|
378
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
379
|
+
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
380
|
+
],
|
|
381
|
+
...defaultV1Options(),
|
|
348
382
|
});
|
|
349
383
|
|
|
350
384
|
const result = await streamCommitImport({
|
|
@@ -365,6 +399,10 @@ describe("streamCommitImport — credential metadata merge", () => {
|
|
|
365
399
|
test("target with no metadata.json → bundle's file lands on disk verbatim", async () => {
|
|
366
400
|
const { archive } = buildVBundle({
|
|
367
401
|
files: [
|
|
402
|
+
{
|
|
403
|
+
path: "data/db/assistant.db",
|
|
404
|
+
data: new Uint8Array(),
|
|
405
|
+
},
|
|
368
406
|
{
|
|
369
407
|
path: "workspace/data/credentials/metadata.json",
|
|
370
408
|
data: encode(
|
|
@@ -373,6 +411,7 @@ describe("streamCommitImport — credential metadata merge", () => {
|
|
|
373
411
|
},
|
|
374
412
|
{ path: "workspace/noop.txt", data: encode("noop") },
|
|
375
413
|
],
|
|
414
|
+
...defaultV1Options(),
|
|
376
415
|
});
|
|
377
416
|
|
|
378
417
|
const result = await streamCommitImport({
|
|
@@ -41,6 +41,7 @@ import { DefaultPathResolver } from "../vbundle-import-analyzer.js";
|
|
|
41
41
|
import { commitImport } from "../vbundle-importer.js";
|
|
42
42
|
import { streamCommitImport } from "../vbundle-streaming-importer.js";
|
|
43
43
|
import { canonicalizeJson } from "../vbundle-validator.js";
|
|
44
|
+
import { defaultV1Options } from "./v1-test-helpers.js";
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
47
|
* Fixed "customized" guardian persona content used by the USER.md-skip
|
|
@@ -131,7 +132,7 @@ function removeEntry(archive: Uint8Array, entryName: string): Uint8Array {
|
|
|
131
132
|
|
|
132
133
|
/**
|
|
133
134
|
* Update manifest.json in place to drop the entry with the given archive
|
|
134
|
-
* path AND recompute
|
|
135
|
+
* path AND recompute the v1 `checksum` so the manifest itself stays valid.
|
|
135
136
|
* Used to craft the "extra entry" (manifest_mismatch) fixture — the tar
|
|
136
137
|
* has the file, but the manifest does not.
|
|
137
138
|
*/
|
|
@@ -149,15 +150,18 @@ function dropFromManifestAndRepack(
|
|
|
149
150
|
raw.subarray(512, 512 + origSize),
|
|
150
151
|
);
|
|
151
152
|
const manifest = JSON.parse(manifestJson) as {
|
|
152
|
-
|
|
153
|
-
|
|
153
|
+
contents: Array<{ path: string; sha256: string; size_bytes: number }>;
|
|
154
|
+
checksum: string;
|
|
154
155
|
[k: string]: unknown;
|
|
155
156
|
};
|
|
156
|
-
manifest.
|
|
157
|
-
// Recompute
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
157
|
+
manifest.contents = manifest.contents.filter((f) => f.path !== pathToDrop);
|
|
158
|
+
// Recompute checksum: place an empty-string placeholder in the canonical
|
|
159
|
+
// form, exactly mirroring the v1 emit-time canonicalization.
|
|
160
|
+
const withEmptyChecksum: Record<string, unknown> = {
|
|
161
|
+
...manifest,
|
|
162
|
+
checksum: "",
|
|
163
|
+
};
|
|
164
|
+
manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
|
|
161
165
|
|
|
162
166
|
const newJson = JSON.stringify(manifest);
|
|
163
167
|
const newBytes = new TextEncoder().encode(newJson);
|
|
@@ -218,11 +222,15 @@ describe("streamCommitImport — happy path", () => {
|
|
|
218
222
|
|
|
219
223
|
const { archive } = buildVBundle({
|
|
220
224
|
files: [
|
|
225
|
+
{
|
|
226
|
+
path: "data/db/assistant.db",
|
|
227
|
+
data: new Uint8Array(),
|
|
228
|
+
},
|
|
221
229
|
{ path: "workspace/a.txt", data: fileA },
|
|
222
230
|
{ path: "workspace/sub/b.txt", data: fileB },
|
|
223
231
|
{ path: "workspace/sub/c.txt", data: fileC },
|
|
224
232
|
],
|
|
225
|
-
|
|
233
|
+
...defaultV1Options(),
|
|
226
234
|
});
|
|
227
235
|
|
|
228
236
|
const result = await streamCommitImport({
|
|
@@ -246,9 +254,10 @@ describe("streamCommitImport — happy path", () => {
|
|
|
246
254
|
);
|
|
247
255
|
|
|
248
256
|
expect(result.report.success).toBe(true);
|
|
249
|
-
|
|
250
|
-
expect(result.report.summary.
|
|
251
|
-
expect(result.report.
|
|
257
|
+
// Includes the synthetic data/db/assistant.db entry plus a/b/c.txt.
|
|
258
|
+
expect(result.report.summary.total_files).toBe(4);
|
|
259
|
+
expect(result.report.summary.files_created).toBe(4);
|
|
260
|
+
expect(result.report.manifest.contents).toHaveLength(4);
|
|
252
261
|
for (const f of result.report.files) {
|
|
253
262
|
expect(f.action).toBe("created");
|
|
254
263
|
expect(f.backup_path).toBeNull();
|
|
@@ -260,6 +269,10 @@ describe("streamCommitImport — happy path", () => {
|
|
|
260
269
|
test("invokes onProgress after each file entry finishes", async () => {
|
|
261
270
|
const { archive } = buildVBundle({
|
|
262
271
|
files: [
|
|
272
|
+
{
|
|
273
|
+
path: "data/db/assistant.db",
|
|
274
|
+
data: new Uint8Array(),
|
|
275
|
+
},
|
|
263
276
|
{
|
|
264
277
|
path: "workspace/a.txt",
|
|
265
278
|
data: new TextEncoder().encode("one"),
|
|
@@ -269,6 +282,7 @@ describe("streamCommitImport — happy path", () => {
|
|
|
269
282
|
data: new TextEncoder().encode("two!"),
|
|
270
283
|
},
|
|
271
284
|
],
|
|
285
|
+
...defaultV1Options(),
|
|
272
286
|
});
|
|
273
287
|
|
|
274
288
|
const events: Array<{
|
|
@@ -285,17 +299,22 @@ describe("streamCommitImport — happy path", () => {
|
|
|
285
299
|
|
|
286
300
|
expect(result.ok).toBe(true);
|
|
287
301
|
expect(events.map((e) => e.archivePath)).toEqual([
|
|
302
|
+
"data/db/assistant.db",
|
|
288
303
|
"workspace/a.txt",
|
|
289
304
|
"workspace/b.txt",
|
|
290
305
|
]);
|
|
291
|
-
expect(events[
|
|
292
|
-
expect(events[
|
|
306
|
+
expect(events[1]?.bytesWritten).toBe(3);
|
|
307
|
+
expect(events[2]?.bytesWritten).toBe(4);
|
|
293
308
|
expect(events[0]?.entryIndex).toBeLessThan(events[1]?.entryIndex ?? -1);
|
|
294
309
|
});
|
|
295
310
|
|
|
296
311
|
test("forwards credentials to importCredentials callback but never writes them to disk", async () => {
|
|
297
312
|
const { archive } = buildVBundle({
|
|
298
313
|
files: [
|
|
314
|
+
{
|
|
315
|
+
path: "data/db/assistant.db",
|
|
316
|
+
data: new Uint8Array(),
|
|
317
|
+
},
|
|
299
318
|
{
|
|
300
319
|
path: "workspace/config.json",
|
|
301
320
|
data: new TextEncoder().encode("{}"),
|
|
@@ -309,6 +328,7 @@ describe("streamCommitImport — happy path", () => {
|
|
|
309
328
|
data: new TextEncoder().encode("sk-ant-2"),
|
|
310
329
|
},
|
|
311
330
|
],
|
|
331
|
+
...defaultV1Options(),
|
|
312
332
|
});
|
|
313
333
|
|
|
314
334
|
const received: Array<{ account: string; value: string }> = [];
|
|
@@ -380,11 +400,16 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
380
400
|
// workspace/ file as entry #1.
|
|
381
401
|
const { archive } = buildVBundle({
|
|
382
402
|
files: [
|
|
403
|
+
{
|
|
404
|
+
path: "data/db/assistant.db",
|
|
405
|
+
data: new Uint8Array(),
|
|
406
|
+
},
|
|
383
407
|
{
|
|
384
408
|
path: "workspace/a.txt",
|
|
385
409
|
data: new TextEncoder().encode("hello"),
|
|
386
410
|
},
|
|
387
411
|
],
|
|
412
|
+
...defaultV1Options(),
|
|
388
413
|
});
|
|
389
414
|
const noManifest = removeEntry(archive, "manifest.json");
|
|
390
415
|
|
|
@@ -412,20 +437,20 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
412
437
|
// Build a valid bundle with one file whose data is 32 bytes long.
|
|
413
438
|
const body = new TextEncoder().encode("x".repeat(32));
|
|
414
439
|
const { archive } = buildVBundle({
|
|
415
|
-
files: [
|
|
440
|
+
files: [
|
|
441
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
442
|
+
{ path: "workspace/victim.txt", data: body },
|
|
443
|
+
],
|
|
444
|
+
...defaultV1Options(),
|
|
416
445
|
});
|
|
417
446
|
|
|
418
|
-
// Tamper the
|
|
419
|
-
// one hex character. Keeps the manifest valid (
|
|
420
|
-
// same-length) — but because
|
|
421
|
-
// declared data, we ALSO need to
|
|
422
|
-
// manifest itself valid. Otherwise the
|
|
423
|
-
// self-checksum and the test exercises the wrong
|
|
424
|
-
//
|
|
425
|
-
// Easier approach: build a NEW valid manifest that declares the wrong
|
|
426
|
-
// hash for victim.txt. We hand-rebuild the archive via
|
|
427
|
-
// `dropFromManifestAndRepack`-style logic: replace the existing entry
|
|
428
|
-
// in manifest.files with a different sha256, recompute manifest_sha256.
|
|
447
|
+
// Tamper the per-file sha256 for workspace/victim.txt by substituting
|
|
448
|
+
// one hex character. Keeps the manifest schema-valid (substitution is
|
|
449
|
+
// same-length) — but because the v1 `checksum` is recomputed over the
|
|
450
|
+
// declared data, we ALSO need to recompute `checksum` (with the empty
|
|
451
|
+
// placeholder) to keep the manifest itself valid. Otherwise the
|
|
452
|
+
// manifest fails its self-checksum and the test exercises the wrong
|
|
453
|
+
// path.
|
|
429
454
|
const raw = gunzipSync(archive);
|
|
430
455
|
const sizeStr = new TextDecoder()
|
|
431
456
|
.decode(raw.subarray(124, 136))
|
|
@@ -436,11 +461,11 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
436
461
|
raw.subarray(512, 512 + origSize),
|
|
437
462
|
);
|
|
438
463
|
const manifest = JSON.parse(manifestJson) as {
|
|
439
|
-
|
|
440
|
-
|
|
464
|
+
contents: Array<{ path: string; sha256: string; size_bytes: number }>;
|
|
465
|
+
checksum: string;
|
|
441
466
|
[k: string]: unknown;
|
|
442
467
|
};
|
|
443
|
-
manifest.
|
|
468
|
+
manifest.contents = manifest.contents.map((f) =>
|
|
444
469
|
f.path === "workspace/victim.txt"
|
|
445
470
|
? {
|
|
446
471
|
...f,
|
|
@@ -449,9 +474,11 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
449
474
|
}
|
|
450
475
|
: f,
|
|
451
476
|
);
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
477
|
+
const withEmptyChecksum: Record<string, unknown> = {
|
|
478
|
+
...manifest,
|
|
479
|
+
checksum: "",
|
|
480
|
+
};
|
|
481
|
+
manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
|
|
455
482
|
|
|
456
483
|
const newJson = JSON.stringify(manifest);
|
|
457
484
|
const newBytes = new TextEncoder().encode(newJson);
|
|
@@ -488,6 +515,10 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
488
515
|
|
|
489
516
|
const { archive } = buildVBundle({
|
|
490
517
|
files: [
|
|
518
|
+
{
|
|
519
|
+
path: "data/db/assistant.db",
|
|
520
|
+
data: new Uint8Array(),
|
|
521
|
+
},
|
|
491
522
|
{
|
|
492
523
|
path: "workspace/present.txt",
|
|
493
524
|
data: new TextEncoder().encode("here"),
|
|
@@ -497,6 +528,7 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
497
528
|
data: new TextEncoder().encode("gone"),
|
|
498
529
|
},
|
|
499
530
|
],
|
|
531
|
+
...defaultV1Options(),
|
|
500
532
|
});
|
|
501
533
|
const stripped = removeEntry(archive, "workspace/missing.txt");
|
|
502
534
|
|
|
@@ -525,6 +557,10 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
525
557
|
|
|
526
558
|
const { archive } = buildVBundle({
|
|
527
559
|
files: [
|
|
560
|
+
{
|
|
561
|
+
path: "data/db/assistant.db",
|
|
562
|
+
data: new Uint8Array(),
|
|
563
|
+
},
|
|
528
564
|
{
|
|
529
565
|
path: "workspace/declared.txt",
|
|
530
566
|
data: new TextEncoder().encode("fine"),
|
|
@@ -534,6 +570,7 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
534
570
|
data: new TextEncoder().encode("surprise"),
|
|
535
571
|
},
|
|
536
572
|
],
|
|
573
|
+
...defaultV1Options(),
|
|
537
574
|
});
|
|
538
575
|
const extraPresent = dropFromManifestAndRepack(
|
|
539
576
|
archive,
|
|
@@ -569,11 +606,14 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
569
606
|
*/
|
|
570
607
|
function writeLargeFixtureToDisk(archivePath: string): void {
|
|
571
608
|
const CHUNK = 25 * 1024 * 1024;
|
|
572
|
-
const files = [
|
|
573
|
-
path:
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
609
|
+
const files = [
|
|
610
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
611
|
+
...[0, 1, 2, 3].map((i) => ({
|
|
612
|
+
path: `workspace/big-${i}.bin`,
|
|
613
|
+
data: new Uint8Array(CHUNK).fill(0x41 + i),
|
|
614
|
+
})),
|
|
615
|
+
];
|
|
616
|
+
const { archive } = buildVBundle({ files, ...defaultV1Options() });
|
|
577
617
|
writeFileSync(archivePath, archive);
|
|
578
618
|
}
|
|
579
619
|
|
|
@@ -640,6 +680,10 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
640
680
|
const streamWorkspace = freshWorkspace();
|
|
641
681
|
|
|
642
682
|
const files = [
|
|
683
|
+
{
|
|
684
|
+
path: "data/db/assistant.db",
|
|
685
|
+
data: new Uint8Array(),
|
|
686
|
+
},
|
|
643
687
|
{
|
|
644
688
|
path: "workspace/a.txt",
|
|
645
689
|
data: new TextEncoder().encode("alpha"),
|
|
@@ -649,7 +693,7 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
649
693
|
data: new TextEncoder().encode("beta beta"),
|
|
650
694
|
},
|
|
651
695
|
];
|
|
652
|
-
const { archive } = buildVBundle({ files });
|
|
696
|
+
const { archive } = buildVBundle({ files, ...defaultV1Options() });
|
|
653
697
|
|
|
654
698
|
// Buffer-based path.
|
|
655
699
|
mkdirSync(bufferWorkspace, { recursive: true });
|
|
@@ -689,8 +733,8 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
689
733
|
|
|
690
734
|
// Manifest payload itself should match — the streaming path parses it
|
|
691
735
|
// directly from the same bytes.
|
|
692
|
-
expect(streamResult.report.manifest.
|
|
693
|
-
bufferResult.report.manifest.
|
|
736
|
+
expect(streamResult.report.manifest.checksum).toBe(
|
|
737
|
+
bufferResult.report.manifest.checksum,
|
|
694
738
|
);
|
|
695
739
|
} finally {
|
|
696
740
|
for (const ws of [bufferWorkspace, streamWorkspace]) {
|
|
@@ -745,11 +789,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
745
789
|
// entirely of credentials therefore has zero workspace-targeted writes.
|
|
746
790
|
const { archive } = buildVBundle({
|
|
747
791
|
files: [
|
|
792
|
+
{
|
|
793
|
+
path: "data/db/assistant.db",
|
|
794
|
+
data: new Uint8Array(),
|
|
795
|
+
},
|
|
748
796
|
{
|
|
749
797
|
path: "credentials/openai-key",
|
|
750
798
|
data: new TextEncoder().encode("sk-test-creds-only"),
|
|
751
799
|
},
|
|
752
800
|
],
|
|
801
|
+
...defaultV1Options(),
|
|
753
802
|
});
|
|
754
803
|
|
|
755
804
|
const received: Array<{ account: string; value: string }> = [];
|
|
@@ -779,9 +828,14 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
779
828
|
{ account: "openai-key", value: "sk-test-creds-only" },
|
|
780
829
|
]);
|
|
781
830
|
|
|
782
|
-
// Report should reflect "
|
|
783
|
-
|
|
831
|
+
// Report should reflect "only the synthetic data/db/assistant.db
|
|
832
|
+
// landed; no `workspace/*` entries were written".
|
|
833
|
+
expect(result.report.summary.files_created).toBe(1);
|
|
784
834
|
expect(result.report.summary.files_overwritten).toBe(0);
|
|
835
|
+
expect(
|
|
836
|
+
result.report.files.find((f) => f.path === "data/db/assistant.db")
|
|
837
|
+
?.action,
|
|
838
|
+
).toBe("created");
|
|
785
839
|
|
|
786
840
|
// Cleanup removed the temp dir — no sibling left behind.
|
|
787
841
|
const parent = join(workspaceDir, "..");
|
|
@@ -817,11 +871,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
817
871
|
|
|
818
872
|
const { archive } = buildVBundle({
|
|
819
873
|
files: [
|
|
874
|
+
{
|
|
875
|
+
path: "data/db/assistant.db",
|
|
876
|
+
data: new Uint8Array(),
|
|
877
|
+
},
|
|
820
878
|
{
|
|
821
879
|
path: "workspace/something.txt",
|
|
822
880
|
data: new TextEncoder().encode("ignored"),
|
|
823
881
|
},
|
|
824
882
|
],
|
|
883
|
+
...defaultV1Options(),
|
|
825
884
|
});
|
|
826
885
|
|
|
827
886
|
try {
|
|
@@ -880,11 +939,16 @@ describe("streamCommitImport — config sanitization parity", () => {
|
|
|
880
939
|
|
|
881
940
|
const { archive } = buildVBundle({
|
|
882
941
|
files: [
|
|
942
|
+
{
|
|
943
|
+
path: "data/db/assistant.db",
|
|
944
|
+
data: new Uint8Array(),
|
|
945
|
+
},
|
|
883
946
|
{
|
|
884
947
|
path: "workspace/config.json",
|
|
885
948
|
data: new TextEncoder().encode(tainted),
|
|
886
949
|
},
|
|
887
950
|
],
|
|
951
|
+
...defaultV1Options(),
|
|
888
952
|
});
|
|
889
953
|
|
|
890
954
|
const result = await streamCommitImport({
|
|
@@ -969,6 +1033,10 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
|
|
|
969
1033
|
|
|
970
1034
|
const { archive } = buildVBundle({
|
|
971
1035
|
files: [
|
|
1036
|
+
{
|
|
1037
|
+
path: "data/db/assistant.db",
|
|
1038
|
+
data: new Uint8Array(),
|
|
1039
|
+
},
|
|
972
1040
|
{
|
|
973
1041
|
path: "prompts/USER.md",
|
|
974
1042
|
data: legacyContent,
|
|
@@ -981,6 +1049,7 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
|
|
|
981
1049
|
data: new TextEncoder().encode("other content"),
|
|
982
1050
|
},
|
|
983
1051
|
],
|
|
1052
|
+
...defaultV1Options(),
|
|
984
1053
|
});
|
|
985
1054
|
|
|
986
1055
|
const result = await streamCommitImport({
|
|
@@ -1049,43 +1118,11 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1049
1118
|
}
|
|
1050
1119
|
});
|
|
1051
1120
|
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
writeFileSync(join(workspaceDir, "data", "db", "assistant.db"), dbContent);
|
|
1058
|
-
|
|
1059
|
-
// A bundle that writes a config file but carries nothing under
|
|
1060
|
-
// workspace/data/db/.
|
|
1061
|
-
const { archive } = buildVBundle({
|
|
1062
|
-
files: [
|
|
1063
|
-
{
|
|
1064
|
-
path: "workspace/skills/example.md",
|
|
1065
|
-
data: new TextEncoder().encode("# skill\n"),
|
|
1066
|
-
},
|
|
1067
|
-
],
|
|
1068
|
-
});
|
|
1069
|
-
|
|
1070
|
-
const result = await streamCommitImport({
|
|
1071
|
-
source: readableFrom(archive),
|
|
1072
|
-
pathResolver: new DefaultPathResolver(workspaceDir),
|
|
1073
|
-
workspaceDir,
|
|
1074
|
-
});
|
|
1075
|
-
|
|
1076
|
-
expect(result.ok).toBe(true);
|
|
1077
|
-
if (!result.ok) throw new Error("unreachable");
|
|
1078
|
-
|
|
1079
|
-
// Live DB survived the atomic swap with its exact original bytes.
|
|
1080
|
-
const postDbPath = join(workspaceDir, "data", "db", "assistant.db");
|
|
1081
|
-
expect(existsSync(postDbPath)).toBe(true);
|
|
1082
|
-
expect(readFileSync(postDbPath)).toEqual(dbContent);
|
|
1083
|
-
|
|
1084
|
-
// The bundle-provided file also landed.
|
|
1085
|
-
expect(
|
|
1086
|
-
readFileSync(join(workspaceDir, "skills", "example.md"), "utf8"),
|
|
1087
|
-
).toBe("# skill\n");
|
|
1088
|
-
});
|
|
1121
|
+
// Note: the prior "bundle omits data/db/*" preserve test was retired
|
|
1122
|
+
// when the v1 manifest schema started requiring `data/db/assistant.db`
|
|
1123
|
+
// (or its `workspace/`-prefixed counterpart) to be present. Under v1
|
|
1124
|
+
// every bundle declares the DB, so the bundle-omits-DB scenario is no
|
|
1125
|
+
// longer reachable through the public emit path.
|
|
1089
1126
|
|
|
1090
1127
|
test("keeps the live data/qdrant/ directory when the bundle omits qdrant entries", async () => {
|
|
1091
1128
|
// Populate a fake qdrant store with a nested file.
|
|
@@ -1100,11 +1137,16 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1100
1137
|
|
|
1101
1138
|
const { archive } = buildVBundle({
|
|
1102
1139
|
files: [
|
|
1140
|
+
{
|
|
1141
|
+
path: "data/db/assistant.db",
|
|
1142
|
+
data: new Uint8Array(),
|
|
1143
|
+
},
|
|
1103
1144
|
{
|
|
1104
1145
|
path: "workspace/config.json",
|
|
1105
1146
|
data: new TextEncoder().encode("{}"),
|
|
1106
1147
|
},
|
|
1107
1148
|
],
|
|
1149
|
+
...defaultV1Options(),
|
|
1108
1150
|
});
|
|
1109
1151
|
|
|
1110
1152
|
const result = await streamCommitImport({
|
|
@@ -1145,6 +1187,7 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1145
1187
|
data: newDbBytes,
|
|
1146
1188
|
},
|
|
1147
1189
|
],
|
|
1190
|
+
...defaultV1Options(),
|
|
1148
1191
|
});
|
|
1149
1192
|
|
|
1150
1193
|
const result = await streamCommitImport({
|
|
@@ -1217,6 +1260,7 @@ describe("streamCommitImport — legacy-only bundle writes in place", () => {
|
|
|
1217
1260
|
data: newDbBytes,
|
|
1218
1261
|
},
|
|
1219
1262
|
],
|
|
1263
|
+
...defaultV1Options(),
|
|
1220
1264
|
});
|
|
1221
1265
|
|
|
1222
1266
|
const result = await streamCommitImport({
|
|
@@ -1313,6 +1357,10 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
|
|
|
1313
1357
|
const newMeta = new TextEncoder().encode('{"fresh":true}');
|
|
1314
1358
|
const { archive } = buildVBundle({
|
|
1315
1359
|
files: [
|
|
1360
|
+
{
|
|
1361
|
+
path: "data/db/assistant.db",
|
|
1362
|
+
data: new Uint8Array(),
|
|
1363
|
+
},
|
|
1316
1364
|
{
|
|
1317
1365
|
path: "workspace/data/qdrant/meta.json",
|
|
1318
1366
|
data: newMeta,
|
|
@@ -1322,6 +1370,7 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
|
|
|
1322
1370
|
data: new TextEncoder().encode("marker\n"),
|
|
1323
1371
|
},
|
|
1324
1372
|
],
|
|
1373
|
+
...defaultV1Options(),
|
|
1325
1374
|
});
|
|
1326
1375
|
|
|
1327
1376
|
const result = await streamCommitImport({
|
|
@@ -1408,10 +1457,15 @@ describe("streamCommitImport — bundle resource ceilings", () => {
|
|
|
1408
1457
|
// declared-count check trips before any tar entry is processed.
|
|
1409
1458
|
const { archive } = buildVBundle({
|
|
1410
1459
|
files: [
|
|
1460
|
+
{
|
|
1461
|
+
path: "data/db/assistant.db",
|
|
1462
|
+
data: new Uint8Array(),
|
|
1463
|
+
},
|
|
1411
1464
|
{ path: "workspace/a.txt", data: new TextEncoder().encode("a") },
|
|
1412
1465
|
{ path: "workspace/b.txt", data: new TextEncoder().encode("b") },
|
|
1413
1466
|
{ path: "workspace/c.txt", data: new TextEncoder().encode("c") },
|
|
1414
1467
|
],
|
|
1468
|
+
...defaultV1Options(),
|
|
1415
1469
|
});
|
|
1416
1470
|
|
|
1417
1471
|
const result = await streamCommitImport({
|
|
@@ -1443,9 +1497,14 @@ describe("streamCommitImport — bundle resource ceilings", () => {
|
|
|
1443
1497
|
const big = new Uint8Array(100).fill(0x41);
|
|
1444
1498
|
const { archive } = buildVBundle({
|
|
1445
1499
|
files: [
|
|
1500
|
+
{
|
|
1501
|
+
path: "data/db/assistant.db",
|
|
1502
|
+
data: new Uint8Array(),
|
|
1503
|
+
},
|
|
1446
1504
|
{ path: "workspace/big1.bin", data: big },
|
|
1447
1505
|
{ path: "workspace/big2.bin", data: big },
|
|
1448
1506
|
],
|
|
1507
|
+
...defaultV1Options(),
|
|
1449
1508
|
});
|
|
1450
1509
|
|
|
1451
1510
|
const result = await streamCommitImport({
|
|
@@ -1505,11 +1564,16 @@ describe("streamCommitImport — report.sha256 reflects post-sanitization bytes"
|
|
|
1505
1564
|
|
|
1506
1565
|
const { archive } = buildVBundle({
|
|
1507
1566
|
files: [
|
|
1567
|
+
{
|
|
1568
|
+
path: "data/db/assistant.db",
|
|
1569
|
+
data: new Uint8Array(),
|
|
1570
|
+
},
|
|
1508
1571
|
{
|
|
1509
1572
|
path: "workspace/config.json",
|
|
1510
1573
|
data: rawArchiveBytes,
|
|
1511
1574
|
},
|
|
1512
1575
|
],
|
|
1576
|
+
...defaultV1Options(),
|
|
1513
1577
|
});
|
|
1514
1578
|
|
|
1515
1579
|
const result = await streamCommitImport({
|