@vellumai/assistant 0.7.0 → 0.7.2
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 +38 -56
- package/Dockerfile +2 -0
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +88 -142
- package/bun.lock +29 -26
- package/docs/architecture/security.md +38 -16
- package/docs/plugins.md +7 -9
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -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 +9 -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/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +869 -129
- package/package.json +8 -3
- 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-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +374 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +29 -23
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +235 -79
- package/src/__tests__/assistant-event.test.ts +10 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +44 -17
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -36
- package/src/__tests__/background-shell-host-bash.test.ts +46 -56
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +50 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- 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__/channel-readiness-service.test.ts +59 -1
- package/src/__tests__/checker.test.ts +23 -38
- 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-loader-backfill.test.ts +90 -155
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +14 -2
- 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-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- 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-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +40 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- 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 +7 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -104
- package/src/__tests__/conversation-routes-slash-commands.test.ts +76 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -8
- 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-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
- 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-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- 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__/credentials-cli.test.ts +5 -12
- package/src/__tests__/cu-unified-flow.test.ts +206 -27
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +102 -17
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -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__/dynamic-skill-workflow-prompt.test.ts +0 -1
- 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__/gateway-only-enforcement.test.ts +0 -1
- 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__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +30 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -84
- 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 +1007 -8
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-app-control-proxy.test.ts +602 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +270 -147
- package/src/__tests__/host-bash-routes.test.ts +294 -0
- package/src/__tests__/host-browser-proxy.test.ts +126 -198
- package/src/__tests__/host-browser-routes.test.ts +50 -54
- package/src/__tests__/host-cu-proxy.test.ts +78 -144
- package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
- package/src/__tests__/host-file-proxy.test.ts +62 -122
- package/src/__tests__/host-file-read-tool.test.ts +59 -21
- package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +53 -70
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
- package/src/__tests__/host-transfer-proxy.test.ts +145 -56
- package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
- package/src/__tests__/http-user-message-parity.test.ts +1 -6
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- 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 -67
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -13
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- 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 -11
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -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 +172 -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__/mock-gateway-ipc.ts +1 -0
- 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-cli.test.ts +0 -2
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +26 -21
- package/src/__tests__/prechat-onboarding-contract.test.ts +34 -8
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +333 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- 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__/public-ingress-urls.test.ts +97 -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 -23
- package/src/__tests__/retry-backoff.test.ts +87 -0
- 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 +13 -18
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- 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 +1 -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 +12 -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 -57
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -12
- 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-channel-config.test.ts +9 -14
- 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-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +115 -14
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -7
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -17
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -8
- package/src/__tests__/tool-executor.test.ts +12 -20
- 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__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- 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 +47 -138
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -11
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- 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-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- 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__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +94 -177
- package/src/backup/paths.ts +2 -15
- package/src/backup/restore.ts +107 -231
- package/src/browser-session/events.ts +0 -9
- package/src/bundler/app-bundler.ts +51 -3
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +4 -68
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +31 -141
- package/src/calls/twilio-routes.ts +12 -13
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +8 -42
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +18 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +64 -7
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +304 -76
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +15 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +13 -7
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +320 -53
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +0 -18
- 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 +115 -19
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +67 -10
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -44
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +12 -4
- package/src/config/env.ts +22 -26
- package/src/config/feature-flag-registry.json +40 -152
- 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 +76 -102
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +8 -4
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -14
- package/src/config/schemas/heartbeat.ts +63 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +11 -7
- package/src/config/schemas/llm.ts +34 -11
- package/src/config/schemas/memory-lifecycle.ts +77 -24
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +57 -4
- package/src/config/schemas/platform.ts +6 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +7 -21
- package/src/config/schemas/skills.ts +5 -11
- 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 -47
- package/src/contacts/contacts-write.ts +1 -132
- package/src/context/window-manager.ts +43 -5
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +46 -51
- 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__/conversation-tool-setup.test.ts +126 -5
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +4 -3
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +74 -7
- package/src/daemon/conversation-agent-loop.ts +309 -64
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +8 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +97 -172
- 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 +144 -29
- package/src/daemon/conversation-tool-setup.ts +18 -87
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +134 -231
- 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/doordash-steps.ts +1 -1
- 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 +27 -72
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-app-control-proxy.ts +293 -0
- package/src/daemon/host-bash-proxy.ts +124 -92
- package/src/daemon/host-browser-proxy.ts +111 -88
- package/src/daemon/host-cu-proxy.ts +100 -104
- package/src/daemon/host-file-proxy.ts +136 -91
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +303 -147
- package/src/daemon/lifecycle.ts +164 -132
- package/src/daemon/message-protocol.ts +3 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +18 -8
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +5 -0
- package/src/daemon/message-types/host-cu.ts +3 -0
- package/src/daemon/message-types/host-file.ts +5 -0
- package/src/daemon/message-types/host-transfer.ts +4 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +119 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -5
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +126 -108
- 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 +5 -2
- 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 +21 -9
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
- package/src/heartbeat/heartbeat-run-store.ts +236 -0
- package/src/heartbeat/heartbeat-service.ts +303 -54
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +41 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +33 -95
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +17 -11
- package/src/ipc/cli-client.ts +32 -1
- 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/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/manager.ts +0 -5
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -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/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +32 -7
- package/src/memory/context-search/sources/memory-v2.ts +590 -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 +30 -5
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +18 -0
- package/src/memory/embedding-backend.ts +12 -42
- 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 +49 -8
- package/src/memory/graph/conversation-graph-memory.ts +35 -36
- package/src/memory/graph/graph-search.ts +8 -0
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/graph/retriever.ts +28 -0
- package/src/memory/graph/tools.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/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +66 -23
- package/src/memory/jobs-worker.ts +114 -79
- 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/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +32 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +50 -20
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +40 -0
- package/src/memory/search/semantic.ts +12 -16
- package/src/memory/sparse-tokenize.ts +49 -0
- 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 +361 -180
- 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 +424 -33
- 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__/sim.test.ts +166 -6
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +152 -0
- package/src/memory/v2/activation.ts +215 -163
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +17 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +241 -84
- 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 +385 -88
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/qdrant.ts +99 -1
- package/src/memory/v2/sim.ts +126 -16
- package/src/memory/v2/skill-qdrant.ts +12 -3
- package/src/memory/v2/skill-store.ts +71 -8
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +63 -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/gmail/types.ts +0 -49
- 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 +123 -52
- 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 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/oauth/connect-orchestrator.ts +4 -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 +95 -0
- package/src/oauth/manual-token-connection.ts +26 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/index.ts +1 -59
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +7 -18
- package/src/permissions/gateway-threshold-reader.ts +6 -1
- package/src/permissions/prompter.ts +43 -3
- package/src/permissions/secret-prompter.ts +25 -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/bootstrap-cleanup.ts +27 -0
- package/src/prompts/system-prompt.ts +37 -88
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/templates/SOUL.md +13 -1
- 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/speech-to-text/provider-catalog.ts +7 -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 +570 -52
- package/src/runtime/assistant-event.ts +2 -6
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -97
- package/src/runtime/auth/route-policy.ts +30 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- 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 +16 -402
- package/src/runtime/http-types.ts +5 -5
- 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-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- 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 +296 -80
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +421 -0
- package/src/runtime/migrations/migration-transport.ts +49 -16
- 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 +457 -136
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -11
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +251 -74
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +329 -38
- package/src/runtime/migrations/vbundle-streaming-validator.ts +203 -28
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +328 -41
- package/src/runtime/pending-interactions.ts +48 -13
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +49 -168
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +333 -0
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -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-interception-types.ts +13 -0
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/btw-routes.ts +14 -37
- 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 +46 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/contact-prompt-routes.ts +183 -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 +156 -9
- package/src/runtime/routes/conversation-routes.ts +72 -539
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/document-pdf-renderer.ts +165 -0
- package/src/runtime/routes/documents-routes.ts +83 -18
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +68 -94
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +37 -6
- package/src/runtime/routes/host-browser-routes.ts +96 -25
- package/src/runtime/routes/host-cu-routes.ts +48 -13
- package/src/runtime/routes/host-file-routes.ts +35 -11
- package/src/runtime/routes/host-transfer-routes.ts +73 -37
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +93 -49
- package/src/runtime/routes/inbound-message-handler.ts +581 -146
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -95
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +12 -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/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +451 -16
- package/src/runtime/routes/migration-routes.ts +284 -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 +10 -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/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -18
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +63 -38
- package/src/security/oauth-callback-registry.ts +8 -0
- 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/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- 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-files.ts +2 -8
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/skills/remote-skill-policy.ts +5 -5
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +8 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +59 -15
- package/src/telemetry/usage-telemetry-reporter.ts +4 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/browser/__tests__/browser-status.test.ts +55 -135
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +145 -70
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +62 -91
- package/src/tools/browser/cdp-client/index.ts +1 -27
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +46 -31
- package/src/tools/host-filesystem/edit.ts +29 -2
- package/src/tools/host-filesystem/read.ts +29 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +35 -4
- package/src/tools/host-filesystem/write.ts +29 -2
- package/src/tools/host-terminal/host-shell.ts +62 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- 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/tool-approval-handler.ts +1 -5
- package/src/tools/types.ts +16 -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/hatched-date.ts +86 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +6 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +54 -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/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -904
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -296
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -431
- 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/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -754
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -438
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- 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/daemon/message-types/pairing.ts +0 -58
- 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/outbound-proxy/config.ts +0 -94
- package/src/outbound-proxy/health.ts +0 -62
- package/src/outbound-proxy/types.ts +0 -150
- 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/capability-tokens.ts +0 -190
- 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/signals/mcp-reload.ts +0 -18
- 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
|
@@ -36,11 +36,18 @@ import { Readable } from "node:stream";
|
|
|
36
36
|
import { gunzipSync, gzipSync } from "node:zlib";
|
|
37
37
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
38
38
|
|
|
39
|
+
import { APP_VERSION } from "../../../version.js";
|
|
39
40
|
import { buildVBundle } from "../vbundle-builder.js";
|
|
40
41
|
import { DefaultPathResolver } from "../vbundle-import-analyzer.js";
|
|
42
|
+
import { LEGACY_RUNTIME_VERSION_SENTINEL } from "../vbundle-import-policy.js";
|
|
41
43
|
import { commitImport } from "../vbundle-importer.js";
|
|
42
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
IMPORT_BACKUP_PREFIX,
|
|
46
|
+
IMPORT_TEMP_PREFIX,
|
|
47
|
+
streamCommitImport,
|
|
48
|
+
} from "../vbundle-streaming-importer.js";
|
|
43
49
|
import { canonicalizeJson } from "../vbundle-validator.js";
|
|
50
|
+
import { defaultV1Options } from "./v1-test-helpers.js";
|
|
44
51
|
|
|
45
52
|
/**
|
|
46
53
|
* Fixed "customized" guardian persona content used by the USER.md-skip
|
|
@@ -131,7 +138,7 @@ function removeEntry(archive: Uint8Array, entryName: string): Uint8Array {
|
|
|
131
138
|
|
|
132
139
|
/**
|
|
133
140
|
* Update manifest.json in place to drop the entry with the given archive
|
|
134
|
-
* path AND recompute
|
|
141
|
+
* path AND recompute the v1 `checksum` so the manifest itself stays valid.
|
|
135
142
|
* Used to craft the "extra entry" (manifest_mismatch) fixture — the tar
|
|
136
143
|
* has the file, but the manifest does not.
|
|
137
144
|
*/
|
|
@@ -149,15 +156,18 @@ function dropFromManifestAndRepack(
|
|
|
149
156
|
raw.subarray(512, 512 + origSize),
|
|
150
157
|
);
|
|
151
158
|
const manifest = JSON.parse(manifestJson) as {
|
|
152
|
-
|
|
153
|
-
|
|
159
|
+
contents: Array<{ path: string; sha256: string; size_bytes: number }>;
|
|
160
|
+
checksum: string;
|
|
154
161
|
[k: string]: unknown;
|
|
155
162
|
};
|
|
156
|
-
manifest.
|
|
157
|
-
// Recompute
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
163
|
+
manifest.contents = manifest.contents.filter((f) => f.path !== pathToDrop);
|
|
164
|
+
// Recompute checksum: place an empty-string placeholder in the canonical
|
|
165
|
+
// form, exactly mirroring the v1 emit-time canonicalization.
|
|
166
|
+
const withEmptyChecksum: Record<string, unknown> = {
|
|
167
|
+
...manifest,
|
|
168
|
+
checksum: "",
|
|
169
|
+
};
|
|
170
|
+
manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
|
|
161
171
|
|
|
162
172
|
const newJson = JSON.stringify(manifest);
|
|
163
173
|
const newBytes = new TextEncoder().encode(newJson);
|
|
@@ -218,11 +228,15 @@ describe("streamCommitImport — happy path", () => {
|
|
|
218
228
|
|
|
219
229
|
const { archive } = buildVBundle({
|
|
220
230
|
files: [
|
|
231
|
+
{
|
|
232
|
+
path: "data/db/assistant.db",
|
|
233
|
+
data: new Uint8Array(),
|
|
234
|
+
},
|
|
221
235
|
{ path: "workspace/a.txt", data: fileA },
|
|
222
236
|
{ path: "workspace/sub/b.txt", data: fileB },
|
|
223
237
|
{ path: "workspace/sub/c.txt", data: fileC },
|
|
224
238
|
],
|
|
225
|
-
|
|
239
|
+
...defaultV1Options(),
|
|
226
240
|
});
|
|
227
241
|
|
|
228
242
|
const result = await streamCommitImport({
|
|
@@ -246,9 +260,10 @@ describe("streamCommitImport — happy path", () => {
|
|
|
246
260
|
);
|
|
247
261
|
|
|
248
262
|
expect(result.report.success).toBe(true);
|
|
249
|
-
|
|
250
|
-
expect(result.report.summary.
|
|
251
|
-
expect(result.report.
|
|
263
|
+
// Includes the synthetic data/db/assistant.db entry plus a/b/c.txt.
|
|
264
|
+
expect(result.report.summary.total_files).toBe(4);
|
|
265
|
+
expect(result.report.summary.files_created).toBe(4);
|
|
266
|
+
expect(result.report.manifest.contents).toHaveLength(4);
|
|
252
267
|
for (const f of result.report.files) {
|
|
253
268
|
expect(f.action).toBe("created");
|
|
254
269
|
expect(f.backup_path).toBeNull();
|
|
@@ -260,6 +275,10 @@ describe("streamCommitImport — happy path", () => {
|
|
|
260
275
|
test("invokes onProgress after each file entry finishes", async () => {
|
|
261
276
|
const { archive } = buildVBundle({
|
|
262
277
|
files: [
|
|
278
|
+
{
|
|
279
|
+
path: "data/db/assistant.db",
|
|
280
|
+
data: new Uint8Array(),
|
|
281
|
+
},
|
|
263
282
|
{
|
|
264
283
|
path: "workspace/a.txt",
|
|
265
284
|
data: new TextEncoder().encode("one"),
|
|
@@ -269,6 +288,7 @@ describe("streamCommitImport — happy path", () => {
|
|
|
269
288
|
data: new TextEncoder().encode("two!"),
|
|
270
289
|
},
|
|
271
290
|
],
|
|
291
|
+
...defaultV1Options(),
|
|
272
292
|
});
|
|
273
293
|
|
|
274
294
|
const events: Array<{
|
|
@@ -285,17 +305,22 @@ describe("streamCommitImport — happy path", () => {
|
|
|
285
305
|
|
|
286
306
|
expect(result.ok).toBe(true);
|
|
287
307
|
expect(events.map((e) => e.archivePath)).toEqual([
|
|
308
|
+
"data/db/assistant.db",
|
|
288
309
|
"workspace/a.txt",
|
|
289
310
|
"workspace/b.txt",
|
|
290
311
|
]);
|
|
291
|
-
expect(events[
|
|
292
|
-
expect(events[
|
|
312
|
+
expect(events[1]?.bytesWritten).toBe(3);
|
|
313
|
+
expect(events[2]?.bytesWritten).toBe(4);
|
|
293
314
|
expect(events[0]?.entryIndex).toBeLessThan(events[1]?.entryIndex ?? -1);
|
|
294
315
|
});
|
|
295
316
|
|
|
296
317
|
test("forwards credentials to importCredentials callback but never writes them to disk", async () => {
|
|
297
318
|
const { archive } = buildVBundle({
|
|
298
319
|
files: [
|
|
320
|
+
{
|
|
321
|
+
path: "data/db/assistant.db",
|
|
322
|
+
data: new Uint8Array(),
|
|
323
|
+
},
|
|
299
324
|
{
|
|
300
325
|
path: "workspace/config.json",
|
|
301
326
|
data: new TextEncoder().encode("{}"),
|
|
@@ -309,6 +334,7 @@ describe("streamCommitImport — happy path", () => {
|
|
|
309
334
|
data: new TextEncoder().encode("sk-ant-2"),
|
|
310
335
|
},
|
|
311
336
|
],
|
|
337
|
+
...defaultV1Options(),
|
|
312
338
|
});
|
|
313
339
|
|
|
314
340
|
const received: Array<{ account: string; value: string }> = [];
|
|
@@ -380,11 +406,16 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
380
406
|
// workspace/ file as entry #1.
|
|
381
407
|
const { archive } = buildVBundle({
|
|
382
408
|
files: [
|
|
409
|
+
{
|
|
410
|
+
path: "data/db/assistant.db",
|
|
411
|
+
data: new Uint8Array(),
|
|
412
|
+
},
|
|
383
413
|
{
|
|
384
414
|
path: "workspace/a.txt",
|
|
385
415
|
data: new TextEncoder().encode("hello"),
|
|
386
416
|
},
|
|
387
417
|
],
|
|
418
|
+
...defaultV1Options(),
|
|
388
419
|
});
|
|
389
420
|
const noManifest = removeEntry(archive, "manifest.json");
|
|
390
421
|
|
|
@@ -412,20 +443,20 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
412
443
|
// Build a valid bundle with one file whose data is 32 bytes long.
|
|
413
444
|
const body = new TextEncoder().encode("x".repeat(32));
|
|
414
445
|
const { archive } = buildVBundle({
|
|
415
|
-
files: [
|
|
446
|
+
files: [
|
|
447
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
448
|
+
{ path: "workspace/victim.txt", data: body },
|
|
449
|
+
],
|
|
450
|
+
...defaultV1Options(),
|
|
416
451
|
});
|
|
417
452
|
|
|
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.
|
|
453
|
+
// Tamper the per-file sha256 for workspace/victim.txt by substituting
|
|
454
|
+
// one hex character. Keeps the manifest schema-valid (substitution is
|
|
455
|
+
// same-length) — but because the v1 `checksum` is recomputed over the
|
|
456
|
+
// declared data, we ALSO need to recompute `checksum` (with the empty
|
|
457
|
+
// placeholder) to keep the manifest itself valid. Otherwise the
|
|
458
|
+
// manifest fails its self-checksum and the test exercises the wrong
|
|
459
|
+
// path.
|
|
429
460
|
const raw = gunzipSync(archive);
|
|
430
461
|
const sizeStr = new TextDecoder()
|
|
431
462
|
.decode(raw.subarray(124, 136))
|
|
@@ -436,11 +467,11 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
436
467
|
raw.subarray(512, 512 + origSize),
|
|
437
468
|
);
|
|
438
469
|
const manifest = JSON.parse(manifestJson) as {
|
|
439
|
-
|
|
440
|
-
|
|
470
|
+
contents: Array<{ path: string; sha256: string; size_bytes: number }>;
|
|
471
|
+
checksum: string;
|
|
441
472
|
[k: string]: unknown;
|
|
442
473
|
};
|
|
443
|
-
manifest.
|
|
474
|
+
manifest.contents = manifest.contents.map((f) =>
|
|
444
475
|
f.path === "workspace/victim.txt"
|
|
445
476
|
? {
|
|
446
477
|
...f,
|
|
@@ -449,9 +480,11 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
449
480
|
}
|
|
450
481
|
: f,
|
|
451
482
|
);
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
483
|
+
const withEmptyChecksum: Record<string, unknown> = {
|
|
484
|
+
...manifest,
|
|
485
|
+
checksum: "",
|
|
486
|
+
};
|
|
487
|
+
manifest.checksum = sha256Hex(canonicalizeJson(withEmptyChecksum));
|
|
455
488
|
|
|
456
489
|
const newJson = JSON.stringify(manifest);
|
|
457
490
|
const newBytes = new TextEncoder().encode(newJson);
|
|
@@ -488,6 +521,10 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
488
521
|
|
|
489
522
|
const { archive } = buildVBundle({
|
|
490
523
|
files: [
|
|
524
|
+
{
|
|
525
|
+
path: "data/db/assistant.db",
|
|
526
|
+
data: new Uint8Array(),
|
|
527
|
+
},
|
|
491
528
|
{
|
|
492
529
|
path: "workspace/present.txt",
|
|
493
530
|
data: new TextEncoder().encode("here"),
|
|
@@ -497,6 +534,7 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
497
534
|
data: new TextEncoder().encode("gone"),
|
|
498
535
|
},
|
|
499
536
|
],
|
|
537
|
+
...defaultV1Options(),
|
|
500
538
|
});
|
|
501
539
|
const stripped = removeEntry(archive, "workspace/missing.txt");
|
|
502
540
|
|
|
@@ -525,6 +563,10 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
525
563
|
|
|
526
564
|
const { archive } = buildVBundle({
|
|
527
565
|
files: [
|
|
566
|
+
{
|
|
567
|
+
path: "data/db/assistant.db",
|
|
568
|
+
data: new Uint8Array(),
|
|
569
|
+
},
|
|
528
570
|
{
|
|
529
571
|
path: "workspace/declared.txt",
|
|
530
572
|
data: new TextEncoder().encode("fine"),
|
|
@@ -534,6 +576,7 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
534
576
|
data: new TextEncoder().encode("surprise"),
|
|
535
577
|
},
|
|
536
578
|
],
|
|
579
|
+
...defaultV1Options(),
|
|
537
580
|
});
|
|
538
581
|
const extraPresent = dropFromManifestAndRepack(
|
|
539
582
|
archive,
|
|
@@ -557,6 +600,152 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
557
600
|
});
|
|
558
601
|
});
|
|
559
602
|
|
|
603
|
+
// ---------------------------------------------------------------------------
|
|
604
|
+
// Runtime-version compat gate — the streaming importer must refuse to
|
|
605
|
+
// populate the temp tree when the bundle's compat range excludes APP_VERSION.
|
|
606
|
+
// ---------------------------------------------------------------------------
|
|
607
|
+
|
|
608
|
+
describe("streamCommitImport — runtime-version compat gate", () => {
|
|
609
|
+
let workspaceDir: string;
|
|
610
|
+
beforeEach(() => {
|
|
611
|
+
workspaceDir = freshWorkspace();
|
|
612
|
+
});
|
|
613
|
+
afterEach(() => {
|
|
614
|
+
const parent = join(workspaceDir, "..");
|
|
615
|
+
try {
|
|
616
|
+
rmSync(parent, { recursive: true, force: true });
|
|
617
|
+
} catch {
|
|
618
|
+
// best-effort
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* The streaming importer creates scratch dirs `${workspaceDir}/.import-<uuid>`
|
|
624
|
+
* and `${workspaceDir}/.pre-import-<ts>-<uuid>` INSIDE workspaceDir (so every
|
|
625
|
+
* rename during the content-level swap stays on the same filesystem). Scan
|
|
626
|
+
* for orphan entries with those prefixes inside workspaceDir using the
|
|
627
|
+
* importer's own constants so this assertion stays in sync with the
|
|
628
|
+
* importer's actual layout.
|
|
629
|
+
*/
|
|
630
|
+
function assertNoLeftoverTempDirs(): void {
|
|
631
|
+
if (!existsSync(workspaceDir)) return;
|
|
632
|
+
const entries = readdirSync(workspaceDir);
|
|
633
|
+
const leftover = entries.filter(
|
|
634
|
+
(name) =>
|
|
635
|
+
name.startsWith(IMPORT_TEMP_PREFIX) ||
|
|
636
|
+
name.startsWith(IMPORT_BACKUP_PREFIX),
|
|
637
|
+
);
|
|
638
|
+
expect(leftover).toEqual([]);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
test("incompatible bundle returns version_incompatible without writing the temp tree", async () => {
|
|
642
|
+
const { archive } = buildVBundle({
|
|
643
|
+
files: [
|
|
644
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
645
|
+
{
|
|
646
|
+
path: "workspace/a.txt",
|
|
647
|
+
data: new TextEncoder().encode("never-written"),
|
|
648
|
+
},
|
|
649
|
+
],
|
|
650
|
+
...defaultV1Options(),
|
|
651
|
+
compatibility: {
|
|
652
|
+
min_runtime_version: "99.0.0",
|
|
653
|
+
max_runtime_version: null,
|
|
654
|
+
},
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
// Pre-condition: workspace dir does NOT exist on a fresh filesystem.
|
|
658
|
+
// The plan invariant requires that the streaming importer gate on
|
|
659
|
+
// runtime-version compat BEFORE any state mutation, so an
|
|
660
|
+
// incompatible bundle must leave the filesystem untouched.
|
|
661
|
+
expect(existsSync(workspaceDir)).toBe(false);
|
|
662
|
+
|
|
663
|
+
const result = await streamCommitImport({
|
|
664
|
+
source: readableFrom(archive),
|
|
665
|
+
pathResolver: new DefaultPathResolver(workspaceDir),
|
|
666
|
+
workspaceDir,
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
if (result.ok || result.reason !== "version_incompatible") {
|
|
670
|
+
throw new Error(
|
|
671
|
+
`expected version_incompatible, got ${JSON.stringify(result)}`,
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
expect(result.bundle_compat.min_runtime_version).toBe("99.0.0");
|
|
675
|
+
expect(result.bundle_compat.max_runtime_version).toBeNull();
|
|
676
|
+
expect(result.runtime_version).toBe(APP_VERSION);
|
|
677
|
+
|
|
678
|
+
// Post-condition: workspace dir STILL does not exist. The version
|
|
679
|
+
// gate now runs before the temp-staging mkdir, so rejecting an
|
|
680
|
+
// incompatible bundle leaves zero filesystem trace.
|
|
681
|
+
expect(existsSync(workspaceDir)).toBe(false);
|
|
682
|
+
assertNoLeftoverTempDirs();
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
test("legacy sentinel passes through the streaming path", async () => {
|
|
686
|
+
const fileA = new TextEncoder().encode("legacy-import\n");
|
|
687
|
+
const { archive } = buildVBundle({
|
|
688
|
+
files: [
|
|
689
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
690
|
+
{ path: "workspace/a.txt", data: fileA },
|
|
691
|
+
],
|
|
692
|
+
...defaultV1Options(),
|
|
693
|
+
compatibility: {
|
|
694
|
+
min_runtime_version: LEGACY_RUNTIME_VERSION_SENTINEL,
|
|
695
|
+
max_runtime_version: null,
|
|
696
|
+
},
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
const result = await streamCommitImport({
|
|
700
|
+
source: readableFrom(archive),
|
|
701
|
+
pathResolver: new DefaultPathResolver(workspaceDir),
|
|
702
|
+
workspaceDir,
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
expect(result.ok).toBe(true);
|
|
706
|
+
expect(readFileSync(join(workspaceDir, "a.txt"))).toEqual(
|
|
707
|
+
Buffer.from(fileA),
|
|
708
|
+
);
|
|
709
|
+
assertNoLeftoverTempDirs();
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
test("pre-existing workspace files stay untouched on incompatibility", async () => {
|
|
713
|
+
mkdirSync(workspaceDir, { recursive: true });
|
|
714
|
+
const seedBytes = new TextEncoder().encode("preserve-me\n");
|
|
715
|
+
writeFileSync(join(workspaceDir, "seed.txt"), seedBytes);
|
|
716
|
+
|
|
717
|
+
const { archive } = buildVBundle({
|
|
718
|
+
files: [
|
|
719
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
720
|
+
{
|
|
721
|
+
path: "workspace/a.txt",
|
|
722
|
+
data: new TextEncoder().encode("never-written"),
|
|
723
|
+
},
|
|
724
|
+
],
|
|
725
|
+
...defaultV1Options(),
|
|
726
|
+
compatibility: {
|
|
727
|
+
min_runtime_version: "99.0.0",
|
|
728
|
+
max_runtime_version: null,
|
|
729
|
+
},
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
const result = await streamCommitImport({
|
|
733
|
+
source: readableFrom(archive),
|
|
734
|
+
pathResolver: new DefaultPathResolver(workspaceDir),
|
|
735
|
+
workspaceDir,
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
expect(result.ok).toBe(false);
|
|
739
|
+
if (result.ok) throw new Error("unreachable");
|
|
740
|
+
expect(result.reason).toBe("version_incompatible");
|
|
741
|
+
|
|
742
|
+
expect(readFileSync(join(workspaceDir, "seed.txt"))).toEqual(
|
|
743
|
+
Buffer.from(seedBytes),
|
|
744
|
+
);
|
|
745
|
+
assertNoLeftoverTempDirs();
|
|
746
|
+
});
|
|
747
|
+
});
|
|
748
|
+
|
|
560
749
|
// ---------------------------------------------------------------------------
|
|
561
750
|
// Memory ceiling — the point of the streaming path.
|
|
562
751
|
// ---------------------------------------------------------------------------
|
|
@@ -569,11 +758,14 @@ describe("streamCommitImport — failure modes", () => {
|
|
|
569
758
|
*/
|
|
570
759
|
function writeLargeFixtureToDisk(archivePath: string): void {
|
|
571
760
|
const CHUNK = 25 * 1024 * 1024;
|
|
572
|
-
const files = [
|
|
573
|
-
path:
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
761
|
+
const files = [
|
|
762
|
+
{ path: "data/db/assistant.db", data: new Uint8Array() },
|
|
763
|
+
...[0, 1, 2, 3].map((i) => ({
|
|
764
|
+
path: `workspace/big-${i}.bin`,
|
|
765
|
+
data: new Uint8Array(CHUNK).fill(0x41 + i),
|
|
766
|
+
})),
|
|
767
|
+
];
|
|
768
|
+
const { archive } = buildVBundle({ files, ...defaultV1Options() });
|
|
577
769
|
writeFileSync(archivePath, archive);
|
|
578
770
|
}
|
|
579
771
|
|
|
@@ -640,6 +832,10 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
640
832
|
const streamWorkspace = freshWorkspace();
|
|
641
833
|
|
|
642
834
|
const files = [
|
|
835
|
+
{
|
|
836
|
+
path: "data/db/assistant.db",
|
|
837
|
+
data: new Uint8Array(),
|
|
838
|
+
},
|
|
643
839
|
{
|
|
644
840
|
path: "workspace/a.txt",
|
|
645
841
|
data: new TextEncoder().encode("alpha"),
|
|
@@ -649,7 +845,7 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
649
845
|
data: new TextEncoder().encode("beta beta"),
|
|
650
846
|
},
|
|
651
847
|
];
|
|
652
|
-
const { archive } = buildVBundle({ files });
|
|
848
|
+
const { archive } = buildVBundle({ files, ...defaultV1Options() });
|
|
653
849
|
|
|
654
850
|
// Buffer-based path.
|
|
655
851
|
mkdirSync(bufferWorkspace, { recursive: true });
|
|
@@ -689,8 +885,8 @@ describe("streamCommitImport — report parity with commitImport", () => {
|
|
|
689
885
|
|
|
690
886
|
// Manifest payload itself should match — the streaming path parses it
|
|
691
887
|
// directly from the same bytes.
|
|
692
|
-
expect(streamResult.report.manifest.
|
|
693
|
-
bufferResult.report.manifest.
|
|
888
|
+
expect(streamResult.report.manifest.checksum).toBe(
|
|
889
|
+
bufferResult.report.manifest.checksum,
|
|
694
890
|
);
|
|
695
891
|
} finally {
|
|
696
892
|
for (const ws of [bufferWorkspace, streamWorkspace]) {
|
|
@@ -745,11 +941,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
745
941
|
// entirely of credentials therefore has zero workspace-targeted writes.
|
|
746
942
|
const { archive } = buildVBundle({
|
|
747
943
|
files: [
|
|
944
|
+
{
|
|
945
|
+
path: "data/db/assistant.db",
|
|
946
|
+
data: new Uint8Array(),
|
|
947
|
+
},
|
|
748
948
|
{
|
|
749
949
|
path: "credentials/openai-key",
|
|
750
950
|
data: new TextEncoder().encode("sk-test-creds-only"),
|
|
751
951
|
},
|
|
752
952
|
],
|
|
953
|
+
...defaultV1Options(),
|
|
753
954
|
});
|
|
754
955
|
|
|
755
956
|
const received: Array<{ account: string; value: string }> = [];
|
|
@@ -779,9 +980,14 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
779
980
|
{ account: "openai-key", value: "sk-test-creds-only" },
|
|
780
981
|
]);
|
|
781
982
|
|
|
782
|
-
// Report should reflect "
|
|
783
|
-
|
|
983
|
+
// Report should reflect "only the synthetic data/db/assistant.db
|
|
984
|
+
// landed; no `workspace/*` entries were written".
|
|
985
|
+
expect(result.report.summary.files_created).toBe(1);
|
|
784
986
|
expect(result.report.summary.files_overwritten).toBe(0);
|
|
987
|
+
expect(
|
|
988
|
+
result.report.files.find((f) => f.path === "data/db/assistant.db")
|
|
989
|
+
?.action,
|
|
990
|
+
).toBe("created");
|
|
785
991
|
|
|
786
992
|
// Cleanup removed the temp dir — no sibling left behind.
|
|
787
993
|
const parent = join(workspaceDir, "..");
|
|
@@ -817,11 +1023,16 @@ describe("streamCommitImport — no workspace entries means no swap", () => {
|
|
|
817
1023
|
|
|
818
1024
|
const { archive } = buildVBundle({
|
|
819
1025
|
files: [
|
|
1026
|
+
{
|
|
1027
|
+
path: "data/db/assistant.db",
|
|
1028
|
+
data: new Uint8Array(),
|
|
1029
|
+
},
|
|
820
1030
|
{
|
|
821
1031
|
path: "workspace/something.txt",
|
|
822
1032
|
data: new TextEncoder().encode("ignored"),
|
|
823
1033
|
},
|
|
824
1034
|
],
|
|
1035
|
+
...defaultV1Options(),
|
|
825
1036
|
});
|
|
826
1037
|
|
|
827
1038
|
try {
|
|
@@ -880,11 +1091,16 @@ describe("streamCommitImport — config sanitization parity", () => {
|
|
|
880
1091
|
|
|
881
1092
|
const { archive } = buildVBundle({
|
|
882
1093
|
files: [
|
|
1094
|
+
{
|
|
1095
|
+
path: "data/db/assistant.db",
|
|
1096
|
+
data: new Uint8Array(),
|
|
1097
|
+
},
|
|
883
1098
|
{
|
|
884
1099
|
path: "workspace/config.json",
|
|
885
1100
|
data: new TextEncoder().encode(tainted),
|
|
886
1101
|
},
|
|
887
1102
|
],
|
|
1103
|
+
...defaultV1Options(),
|
|
888
1104
|
});
|
|
889
1105
|
|
|
890
1106
|
const result = await streamCommitImport({
|
|
@@ -969,6 +1185,10 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
|
|
|
969
1185
|
|
|
970
1186
|
const { archive } = buildVBundle({
|
|
971
1187
|
files: [
|
|
1188
|
+
{
|
|
1189
|
+
path: "data/db/assistant.db",
|
|
1190
|
+
data: new Uint8Array(),
|
|
1191
|
+
},
|
|
972
1192
|
{
|
|
973
1193
|
path: "prompts/USER.md",
|
|
974
1194
|
data: legacyContent,
|
|
@@ -981,6 +1201,7 @@ describe("streamCommitImport — legacy USER.md skip on customized persona", ()
|
|
|
981
1201
|
data: new TextEncoder().encode("other content"),
|
|
982
1202
|
},
|
|
983
1203
|
],
|
|
1204
|
+
...defaultV1Options(),
|
|
984
1205
|
});
|
|
985
1206
|
|
|
986
1207
|
const result = await streamCommitImport({
|
|
@@ -1049,43 +1270,11 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1049
1270
|
}
|
|
1050
1271
|
});
|
|
1051
1272
|
|
|
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
|
-
});
|
|
1273
|
+
// Note: the prior "bundle omits data/db/*" preserve test was retired
|
|
1274
|
+
// when the v1 manifest schema started requiring `data/db/assistant.db`
|
|
1275
|
+
// (or its `workspace/`-prefixed counterpart) to be present. Under v1
|
|
1276
|
+
// every bundle declares the DB, so the bundle-omits-DB scenario is no
|
|
1277
|
+
// longer reachable through the public emit path.
|
|
1089
1278
|
|
|
1090
1279
|
test("keeps the live data/qdrant/ directory when the bundle omits qdrant entries", async () => {
|
|
1091
1280
|
// Populate a fake qdrant store with a nested file.
|
|
@@ -1100,11 +1289,16 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1100
1289
|
|
|
1101
1290
|
const { archive } = buildVBundle({
|
|
1102
1291
|
files: [
|
|
1292
|
+
{
|
|
1293
|
+
path: "data/db/assistant.db",
|
|
1294
|
+
data: new Uint8Array(),
|
|
1295
|
+
},
|
|
1103
1296
|
{
|
|
1104
1297
|
path: "workspace/config.json",
|
|
1105
1298
|
data: new TextEncoder().encode("{}"),
|
|
1106
1299
|
},
|
|
1107
1300
|
],
|
|
1301
|
+
...defaultV1Options(),
|
|
1108
1302
|
});
|
|
1109
1303
|
|
|
1110
1304
|
const result = await streamCommitImport({
|
|
@@ -1145,6 +1339,7 @@ describe("streamCommitImport — preserves live workspace paths when bundle omit
|
|
|
1145
1339
|
data: newDbBytes,
|
|
1146
1340
|
},
|
|
1147
1341
|
],
|
|
1342
|
+
...defaultV1Options(),
|
|
1148
1343
|
});
|
|
1149
1344
|
|
|
1150
1345
|
const result = await streamCommitImport({
|
|
@@ -1217,6 +1412,7 @@ describe("streamCommitImport — legacy-only bundle writes in place", () => {
|
|
|
1217
1412
|
data: newDbBytes,
|
|
1218
1413
|
},
|
|
1219
1414
|
],
|
|
1415
|
+
...defaultV1Options(),
|
|
1220
1416
|
});
|
|
1221
1417
|
|
|
1222
1418
|
const result = await streamCommitImport({
|
|
@@ -1313,6 +1509,10 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
|
|
|
1313
1509
|
const newMeta = new TextEncoder().encode('{"fresh":true}');
|
|
1314
1510
|
const { archive } = buildVBundle({
|
|
1315
1511
|
files: [
|
|
1512
|
+
{
|
|
1513
|
+
path: "data/db/assistant.db",
|
|
1514
|
+
data: new Uint8Array(),
|
|
1515
|
+
},
|
|
1316
1516
|
{
|
|
1317
1517
|
path: "workspace/data/qdrant/meta.json",
|
|
1318
1518
|
data: newMeta,
|
|
@@ -1322,6 +1522,7 @@ describe("streamCommitImport — preserved-path carry-over is per-file", () => {
|
|
|
1322
1522
|
data: new TextEncoder().encode("marker\n"),
|
|
1323
1523
|
},
|
|
1324
1524
|
],
|
|
1525
|
+
...defaultV1Options(),
|
|
1325
1526
|
});
|
|
1326
1527
|
|
|
1327
1528
|
const result = await streamCommitImport({
|
|
@@ -1408,10 +1609,15 @@ describe("streamCommitImport — bundle resource ceilings", () => {
|
|
|
1408
1609
|
// declared-count check trips before any tar entry is processed.
|
|
1409
1610
|
const { archive } = buildVBundle({
|
|
1410
1611
|
files: [
|
|
1612
|
+
{
|
|
1613
|
+
path: "data/db/assistant.db",
|
|
1614
|
+
data: new Uint8Array(),
|
|
1615
|
+
},
|
|
1411
1616
|
{ path: "workspace/a.txt", data: new TextEncoder().encode("a") },
|
|
1412
1617
|
{ path: "workspace/b.txt", data: new TextEncoder().encode("b") },
|
|
1413
1618
|
{ path: "workspace/c.txt", data: new TextEncoder().encode("c") },
|
|
1414
1619
|
],
|
|
1620
|
+
...defaultV1Options(),
|
|
1415
1621
|
});
|
|
1416
1622
|
|
|
1417
1623
|
const result = await streamCommitImport({
|
|
@@ -1443,9 +1649,14 @@ describe("streamCommitImport — bundle resource ceilings", () => {
|
|
|
1443
1649
|
const big = new Uint8Array(100).fill(0x41);
|
|
1444
1650
|
const { archive } = buildVBundle({
|
|
1445
1651
|
files: [
|
|
1652
|
+
{
|
|
1653
|
+
path: "data/db/assistant.db",
|
|
1654
|
+
data: new Uint8Array(),
|
|
1655
|
+
},
|
|
1446
1656
|
{ path: "workspace/big1.bin", data: big },
|
|
1447
1657
|
{ path: "workspace/big2.bin", data: big },
|
|
1448
1658
|
],
|
|
1659
|
+
...defaultV1Options(),
|
|
1449
1660
|
});
|
|
1450
1661
|
|
|
1451
1662
|
const result = await streamCommitImport({
|
|
@@ -1505,11 +1716,16 @@ describe("streamCommitImport — report.sha256 reflects post-sanitization bytes"
|
|
|
1505
1716
|
|
|
1506
1717
|
const { archive } = buildVBundle({
|
|
1507
1718
|
files: [
|
|
1719
|
+
{
|
|
1720
|
+
path: "data/db/assistant.db",
|
|
1721
|
+
data: new Uint8Array(),
|
|
1722
|
+
},
|
|
1508
1723
|
{
|
|
1509
1724
|
path: "workspace/config.json",
|
|
1510
1725
|
data: rawArchiveBytes,
|
|
1511
1726
|
},
|
|
1512
1727
|
],
|
|
1728
|
+
...defaultV1Options(),
|
|
1513
1729
|
});
|
|
1514
1730
|
|
|
1515
1731
|
const result = await streamCommitImport({
|