@vellumai/assistant 0.6.4 → 0.6.5
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/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for workspace migration `043-release-notes-latex-rendering`.
|
|
3
|
+
*
|
|
4
|
+
* Pins the four idempotency paths covered by the in-file HTML marker logic
|
|
5
|
+
* the migration uses to guard against duplicate appends (crash between
|
|
6
|
+
* `appendFileSync` and the runner's checkpoint promotion, or hand-edits to
|
|
7
|
+
* UPDATES.md after a partial prior run):
|
|
8
|
+
*
|
|
9
|
+
* (a) Empty workspace — UPDATES.md is created with the marker + body.
|
|
10
|
+
* (b) Existing UPDATES.md without the marker — append with one blank line
|
|
11
|
+
* between prior content and the new note.
|
|
12
|
+
* (c) Existing UPDATES.md with the marker already present — byte-identical
|
|
13
|
+
* re-run (asserted twice).
|
|
14
|
+
* (d) Existing UPDATES.md ending with `\n` vs `\n\n` — both produce exactly
|
|
15
|
+
* one blank line between old and new content (no triple-newline, no
|
|
16
|
+
* missing separator).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
existsSync,
|
|
21
|
+
mkdtempSync,
|
|
22
|
+
readFileSync,
|
|
23
|
+
rmSync,
|
|
24
|
+
writeFileSync,
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { tmpdir } from "node:os";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import {
|
|
29
|
+
afterAll,
|
|
30
|
+
afterEach,
|
|
31
|
+
beforeAll,
|
|
32
|
+
beforeEach,
|
|
33
|
+
describe,
|
|
34
|
+
expect,
|
|
35
|
+
test,
|
|
36
|
+
} from "bun:test";
|
|
37
|
+
|
|
38
|
+
import { releaseNotesLatexRenderingMigration } from "../workspace/migrations/043-release-notes-latex-rendering.js";
|
|
39
|
+
|
|
40
|
+
const MIGRATION_ID = "043-release-notes-latex-rendering";
|
|
41
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
42
|
+
|
|
43
|
+
let testRoot: string;
|
|
44
|
+
let workspaceDir: string;
|
|
45
|
+
|
|
46
|
+
beforeAll(() => {
|
|
47
|
+
testRoot = mkdtempSync(join(tmpdir(), "migration-043-test-"));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
afterAll(() => {
|
|
51
|
+
rmSync(testRoot, { recursive: true, force: true });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
workspaceDir = mkdtempSync(join(testRoot, "ws-"));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
rmSync(workspaceDir, { recursive: true, force: true });
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
function updatesPath(): string {
|
|
63
|
+
return join(workspaceDir, "UPDATES.md");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe("workspace migration 043-release-notes-latex-rendering", () => {
|
|
67
|
+
test("has the correct id and description", () => {
|
|
68
|
+
expect(releaseNotesLatexRenderingMigration.id).toBe(MIGRATION_ID);
|
|
69
|
+
expect(releaseNotesLatexRenderingMigration.description).toContain(
|
|
70
|
+
"LaTeX block-math rendering",
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// ─── (a) Empty workspace ──────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
test("creates UPDATES.md with marker and body when file is absent", () => {
|
|
77
|
+
expect(existsSync(updatesPath())).toBe(false);
|
|
78
|
+
|
|
79
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
80
|
+
|
|
81
|
+
expect(existsSync(updatesPath())).toBe(true);
|
|
82
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
83
|
+
expect(content).toContain(MARKER);
|
|
84
|
+
expect(content).toContain("## LaTeX math rendering in chat");
|
|
85
|
+
expect(content).toContain("$$...$$");
|
|
86
|
+
// First-time write has no leading separator — starts directly with the marker.
|
|
87
|
+
expect(content.startsWith(MARKER)).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// ─── (b) Existing UPDATES.md without the marker ───────────────────
|
|
91
|
+
|
|
92
|
+
test("appends to existing UPDATES.md when marker is absent, preserving prior content with one blank line between blocks", () => {
|
|
93
|
+
const priorContent =
|
|
94
|
+
"## Earlier note\n\nSomething the assistant wrote before.\n";
|
|
95
|
+
writeFileSync(updatesPath(), priorContent, "utf-8");
|
|
96
|
+
|
|
97
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
98
|
+
|
|
99
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
100
|
+
// Prior content preserved.
|
|
101
|
+
expect(content.startsWith(priorContent)).toBe(true);
|
|
102
|
+
// Marker present once.
|
|
103
|
+
expect(content.split(MARKER).length - 1).toBe(1);
|
|
104
|
+
// Exactly one blank line between old and new content: prior ends with
|
|
105
|
+
// `\n`, so we expect a single `\n` separator added, producing `\n\n`
|
|
106
|
+
// (one blank line) immediately before the marker.
|
|
107
|
+
expect(content).toBe(
|
|
108
|
+
`${priorContent}\n${content.slice(priorContent.length + 1)}`,
|
|
109
|
+
);
|
|
110
|
+
// The appended block starts at the marker.
|
|
111
|
+
expect(content.slice(priorContent.length)).toMatch(/^\n<!-- release-note-id:/);
|
|
112
|
+
// No triple-newline (would indicate a stray blank line).
|
|
113
|
+
expect(content).not.toContain("\n\n\n");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// ─── (c) Existing UPDATES.md with marker — byte-identical re-run ──
|
|
117
|
+
|
|
118
|
+
test("is a no-op when marker is already present, byte-identical across two runs", () => {
|
|
119
|
+
// Seed with a file that already contains the marker (prior successful run).
|
|
120
|
+
const seeded = `## Something pre-existing\n\n${MARKER}\n## LaTeX math rendering in chat\n\nBody.\n`;
|
|
121
|
+
writeFileSync(updatesPath(), seeded, "utf-8");
|
|
122
|
+
|
|
123
|
+
const before = readFileSync(updatesPath(), "utf-8");
|
|
124
|
+
|
|
125
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
126
|
+
const afterFirst = readFileSync(updatesPath(), "utf-8");
|
|
127
|
+
expect(afterFirst).toBe(before);
|
|
128
|
+
|
|
129
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
130
|
+
const afterSecond = readFileSync(updatesPath(), "utf-8");
|
|
131
|
+
expect(afterSecond).toBe(before);
|
|
132
|
+
|
|
133
|
+
// Marker still appears exactly once.
|
|
134
|
+
expect(afterSecond.split(MARKER).length - 1).toBe(1);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// ─── (d) Trailing-newline variations ──────────────────────────────
|
|
138
|
+
|
|
139
|
+
test("existing UPDATES.md ending with a single trailing newline produces exactly one blank line separator", () => {
|
|
140
|
+
const prior = "## Prior\n\nBody line.\n"; // ends with exactly one `\n`
|
|
141
|
+
expect(prior.endsWith("\n")).toBe(true);
|
|
142
|
+
expect(prior.endsWith("\n\n")).toBe(false);
|
|
143
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
144
|
+
|
|
145
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
146
|
+
|
|
147
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
148
|
+
// Prior preserved verbatim at the start.
|
|
149
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
150
|
+
// Exactly one blank line (i.e. `\n\n`) between prior content's final
|
|
151
|
+
// character (which is `\n`) and the marker. So the bytes immediately
|
|
152
|
+
// after `prior` must begin with `\n<!-- release-note-id:` — the extra
|
|
153
|
+
// `\n` combined with prior's trailing `\n` yields a single blank line.
|
|
154
|
+
expect(content.slice(prior.length)).toMatch(/^\n<!-- release-note-id:/);
|
|
155
|
+
// No triple-newline anywhere.
|
|
156
|
+
expect(content).not.toContain("\n\n\n");
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("existing UPDATES.md ending with two trailing newlines produces exactly one blank line separator (no extra padding)", () => {
|
|
160
|
+
const prior = "## Prior\n\nBody line.\n\n"; // ends with `\n\n`
|
|
161
|
+
expect(prior.endsWith("\n\n")).toBe(true);
|
|
162
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
163
|
+
|
|
164
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
165
|
+
|
|
166
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
167
|
+
// Prior preserved verbatim.
|
|
168
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
169
|
+
// Prior already ends with a blank line; the migration should append the
|
|
170
|
+
// marker directly with no additional separator. The bytes immediately
|
|
171
|
+
// after `prior` must begin with the marker itself.
|
|
172
|
+
expect(content.slice(prior.length).startsWith(MARKER)).toBe(true);
|
|
173
|
+
// No triple-newline anywhere.
|
|
174
|
+
expect(content).not.toContain("\n\n\n");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("existing UPDATES.md with no trailing newline produces exactly one blank line separator", () => {
|
|
178
|
+
const prior = "## Prior\n\nBody line."; // no trailing newline
|
|
179
|
+
expect(prior.endsWith("\n")).toBe(false);
|
|
180
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
181
|
+
|
|
182
|
+
releaseNotesLatexRenderingMigration.run(workspaceDir);
|
|
183
|
+
|
|
184
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
185
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
186
|
+
// Separator must be `\n\n` (blank line) before the marker since there
|
|
187
|
+
// was no trailing newline at all.
|
|
188
|
+
expect(content.slice(prior.length)).toMatch(/^\n\n<!-- release-note-id:/);
|
|
189
|
+
expect(content).not.toContain("\n\n\n");
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// ─── down() is a no-op ────────────────────────────────────────────
|
|
193
|
+
|
|
194
|
+
test("down() is a no-op and does not throw", () => {
|
|
195
|
+
writeFileSync(updatesPath(), `${MARKER}\nBody.\n`, "utf-8");
|
|
196
|
+
const before = readFileSync(updatesPath(), "utf-8");
|
|
197
|
+
|
|
198
|
+
releaseNotesLatexRenderingMigration.down(workspaceDir);
|
|
199
|
+
|
|
200
|
+
expect(readFileSync(updatesPath(), "utf-8")).toBe(before);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for workspace migration `045-release-notes-meet-avatar`.
|
|
3
|
+
*
|
|
4
|
+
* Pins the four idempotency paths covered by the in-file HTML marker logic
|
|
5
|
+
* the migration uses to guard against duplicate appends (crash between
|
|
6
|
+
* `appendFileSync` and the runner's checkpoint promotion, or hand-edits to
|
|
7
|
+
* UPDATES.md after a partial prior run):
|
|
8
|
+
*
|
|
9
|
+
* (a) Empty workspace — UPDATES.md is created with the marker + body.
|
|
10
|
+
* (b) Existing UPDATES.md without the marker — append with one blank line
|
|
11
|
+
* between prior content and the new note.
|
|
12
|
+
* (c) Existing UPDATES.md with the marker already present — byte-identical
|
|
13
|
+
* re-run (asserted twice).
|
|
14
|
+
* (d) Existing UPDATES.md ending with `\n` vs `\n\n` — both produce exactly
|
|
15
|
+
* one blank line between old and new content (no triple-newline, no
|
|
16
|
+
* missing separator).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
existsSync,
|
|
21
|
+
mkdtempSync,
|
|
22
|
+
readFileSync,
|
|
23
|
+
rmSync,
|
|
24
|
+
writeFileSync,
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { tmpdir } from "node:os";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import {
|
|
29
|
+
afterAll,
|
|
30
|
+
afterEach,
|
|
31
|
+
beforeAll,
|
|
32
|
+
beforeEach,
|
|
33
|
+
describe,
|
|
34
|
+
expect,
|
|
35
|
+
test,
|
|
36
|
+
} from "bun:test";
|
|
37
|
+
|
|
38
|
+
import { releaseNotesMeetAvatarMigration } from "../workspace/migrations/045-release-notes-meet-avatar.js";
|
|
39
|
+
|
|
40
|
+
const MIGRATION_ID = "045-release-notes-meet-avatar";
|
|
41
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
42
|
+
|
|
43
|
+
let testRoot: string;
|
|
44
|
+
let workspaceDir: string;
|
|
45
|
+
|
|
46
|
+
beforeAll(() => {
|
|
47
|
+
testRoot = mkdtempSync(join(tmpdir(), "migration-045-test-"));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
afterAll(() => {
|
|
51
|
+
rmSync(testRoot, { recursive: true, force: true });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
workspaceDir = mkdtempSync(join(testRoot, "ws-"));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
rmSync(workspaceDir, { recursive: true, force: true });
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
function updatesPath(): string {
|
|
63
|
+
return join(workspaceDir, "UPDATES.md");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe("workspace migration 045-release-notes-meet-avatar", () => {
|
|
67
|
+
test("has the correct id and description", () => {
|
|
68
|
+
expect(releaseNotesMeetAvatarMigration.id).toBe(MIGRATION_ID);
|
|
69
|
+
expect(releaseNotesMeetAvatarMigration.description).toContain(
|
|
70
|
+
"Meet video avatar",
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// ─── (a) Empty workspace ──────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
test("creates UPDATES.md with marker and body when file is absent", () => {
|
|
77
|
+
expect(existsSync(updatesPath())).toBe(false);
|
|
78
|
+
|
|
79
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
80
|
+
|
|
81
|
+
expect(existsSync(updatesPath())).toBe(true);
|
|
82
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
83
|
+
expect(content).toContain(MARKER);
|
|
84
|
+
expect(content).toContain("## Meet video avatar with lip-sync");
|
|
85
|
+
// Covers the key user-facing setup details so a regression that nukes
|
|
86
|
+
// critical instructions will fail loudly.
|
|
87
|
+
expect(content).toContain("v4l2loopback");
|
|
88
|
+
expect(content).toContain("VELLUM_MEET_AVATAR=1");
|
|
89
|
+
expect(content).toContain("default-avatar.glb");
|
|
90
|
+
expect(content).toContain("meet_enable_avatar");
|
|
91
|
+
expect(content).toContain("meet_disable_avatar");
|
|
92
|
+
// First-time write has no leading separator — starts directly with the marker.
|
|
93
|
+
expect(content.startsWith(MARKER)).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// ─── (b) Existing UPDATES.md without the marker ───────────────────
|
|
97
|
+
|
|
98
|
+
test("appends to existing UPDATES.md when marker is absent, preserving prior content with one blank line between blocks", () => {
|
|
99
|
+
const priorContent =
|
|
100
|
+
"## Earlier note\n\nSomething the assistant wrote before.\n";
|
|
101
|
+
writeFileSync(updatesPath(), priorContent, "utf-8");
|
|
102
|
+
|
|
103
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
104
|
+
|
|
105
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
106
|
+
// Prior content preserved.
|
|
107
|
+
expect(content.startsWith(priorContent)).toBe(true);
|
|
108
|
+
// Marker present once.
|
|
109
|
+
expect(content.split(MARKER).length - 1).toBe(1);
|
|
110
|
+
// Exactly one blank line between old and new content: prior ends with
|
|
111
|
+
// `\n`, so we expect a single `\n` separator added, producing `\n\n`
|
|
112
|
+
// (one blank line) immediately before the marker.
|
|
113
|
+
expect(content).toBe(
|
|
114
|
+
`${priorContent}\n${content.slice(priorContent.length + 1)}`,
|
|
115
|
+
);
|
|
116
|
+
// The appended block starts at the marker.
|
|
117
|
+
expect(content.slice(priorContent.length)).toMatch(
|
|
118
|
+
/^\n<!-- release-note-id:/,
|
|
119
|
+
);
|
|
120
|
+
// No triple-newline (would indicate a stray blank line).
|
|
121
|
+
expect(content).not.toContain("\n\n\n");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// ─── (c) Existing UPDATES.md with marker — byte-identical re-run ──
|
|
125
|
+
|
|
126
|
+
test("is a no-op when marker is already present, byte-identical across two runs", () => {
|
|
127
|
+
// Seed with a file that already contains the marker (prior successful run).
|
|
128
|
+
const seeded = `## Something pre-existing\n\n${MARKER}\n## Meet video avatar with lip-sync (v1)\n\nBody.\n`;
|
|
129
|
+
writeFileSync(updatesPath(), seeded, "utf-8");
|
|
130
|
+
|
|
131
|
+
const before = readFileSync(updatesPath(), "utf-8");
|
|
132
|
+
|
|
133
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
134
|
+
const afterFirst = readFileSync(updatesPath(), "utf-8");
|
|
135
|
+
expect(afterFirst).toBe(before);
|
|
136
|
+
|
|
137
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
138
|
+
const afterSecond = readFileSync(updatesPath(), "utf-8");
|
|
139
|
+
expect(afterSecond).toBe(before);
|
|
140
|
+
|
|
141
|
+
// Marker still appears exactly once.
|
|
142
|
+
expect(afterSecond.split(MARKER).length - 1).toBe(1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// ─── (d) Trailing-newline variations ──────────────────────────────
|
|
146
|
+
|
|
147
|
+
test("existing UPDATES.md ending with a single trailing newline produces exactly one blank line separator", () => {
|
|
148
|
+
const prior = "## Prior\n\nBody line.\n"; // ends with exactly one `\n`
|
|
149
|
+
expect(prior.endsWith("\n")).toBe(true);
|
|
150
|
+
expect(prior.endsWith("\n\n")).toBe(false);
|
|
151
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
152
|
+
|
|
153
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
154
|
+
|
|
155
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
156
|
+
// Prior preserved verbatim at the start.
|
|
157
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
158
|
+
// Exactly one blank line (i.e. `\n\n`) between prior content's final
|
|
159
|
+
// character (which is `\n`) and the marker. So the bytes immediately
|
|
160
|
+
// after `prior` must begin with `\n<!-- release-note-id:` — the extra
|
|
161
|
+
// `\n` combined with prior's trailing `\n` yields a single blank line.
|
|
162
|
+
expect(content.slice(prior.length)).toMatch(/^\n<!-- release-note-id:/);
|
|
163
|
+
// No triple-newline anywhere.
|
|
164
|
+
expect(content).not.toContain("\n\n\n");
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("existing UPDATES.md ending with two trailing newlines produces exactly one blank line separator (no extra padding)", () => {
|
|
168
|
+
const prior = "## Prior\n\nBody line.\n\n"; // ends with `\n\n`
|
|
169
|
+
expect(prior.endsWith("\n\n")).toBe(true);
|
|
170
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
171
|
+
|
|
172
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
173
|
+
|
|
174
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
175
|
+
// Prior preserved verbatim.
|
|
176
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
177
|
+
// Prior already ends with a blank line; the migration should append the
|
|
178
|
+
// marker directly with no additional separator. The bytes immediately
|
|
179
|
+
// after `prior` must begin with the marker itself.
|
|
180
|
+
expect(content.slice(prior.length).startsWith(MARKER)).toBe(true);
|
|
181
|
+
// No triple-newline anywhere.
|
|
182
|
+
expect(content).not.toContain("\n\n\n");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("existing UPDATES.md with no trailing newline produces exactly one blank line separator", () => {
|
|
186
|
+
const prior = "## Prior\n\nBody line."; // no trailing newline
|
|
187
|
+
expect(prior.endsWith("\n")).toBe(false);
|
|
188
|
+
writeFileSync(updatesPath(), prior, "utf-8");
|
|
189
|
+
|
|
190
|
+
releaseNotesMeetAvatarMigration.run(workspaceDir);
|
|
191
|
+
|
|
192
|
+
const content = readFileSync(updatesPath(), "utf-8");
|
|
193
|
+
expect(content.startsWith(prior)).toBe(true);
|
|
194
|
+
// Separator must be `\n\n` (blank line) before the marker since there
|
|
195
|
+
// was no trailing newline at all.
|
|
196
|
+
expect(content.slice(prior.length)).toMatch(/^\n\n<!-- release-note-id:/);
|
|
197
|
+
expect(content).not.toContain("\n\n\n");
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// ─── down() is a no-op ────────────────────────────────────────────
|
|
201
|
+
|
|
202
|
+
test("down() is a no-op and does not throw", () => {
|
|
203
|
+
writeFileSync(updatesPath(), `${MARKER}\nBody.\n`, "utf-8");
|
|
204
|
+
const before = readFileSync(updatesPath(), "utf-8");
|
|
205
|
+
|
|
206
|
+
releaseNotesMeetAvatarMigration.down(workspaceDir);
|
|
207
|
+
|
|
208
|
+
expect(readFileSync(updatesPath(), "utf-8")).toBe(before);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
@@ -144,8 +144,8 @@ function customizedContent(): string {
|
|
|
144
144
|
|
|
145
145
|
# USER.md
|
|
146
146
|
|
|
147
|
-
- Preferred name/reference:
|
|
148
|
-
- Pronouns:
|
|
147
|
+
- Preferred name/reference: Chris
|
|
148
|
+
- Pronouns: they/them
|
|
149
149
|
- Work role: Engineer
|
|
150
150
|
- Daily tools: Vellum, vim, tmux
|
|
151
151
|
`;
|
|
@@ -195,7 +195,7 @@ describe("workspace migration 031-drop-user-md", () => {
|
|
|
195
195
|
mockVellumGuardian = {
|
|
196
196
|
contact: {
|
|
197
197
|
id: "guardian-1",
|
|
198
|
-
displayName: "
|
|
198
|
+
displayName: "Chris",
|
|
199
199
|
userFile: null,
|
|
200
200
|
},
|
|
201
201
|
channel: { type: "vellum" },
|
|
@@ -210,10 +210,10 @@ describe("workspace migration 031-drop-user-md", () => {
|
|
|
210
210
|
// Backfill happened: drizzle update was called with the generated slug.
|
|
211
211
|
expect(updatedUserFiles).toHaveLength(1);
|
|
212
212
|
expect(updatedUserFiles[0].contactId).toBe("guardian-1");
|
|
213
|
-
expect(updatedUserFiles[0].userFile).toBe("
|
|
213
|
+
expect(updatedUserFiles[0].userFile).toBe("chris.md");
|
|
214
214
|
|
|
215
|
-
// Content was migrated into users/
|
|
216
|
-
const destPath = join(workspaceDir, "users", "
|
|
215
|
+
// Content was migrated into users/chris.md.
|
|
216
|
+
const destPath = join(workspaceDir, "users", "chris.md");
|
|
217
217
|
expect(existsSync(destPath)).toBe(true);
|
|
218
218
|
expect(readFileSync(destPath, "utf-8")).toBe(content);
|
|
219
219
|
|
|
@@ -226,8 +226,8 @@ describe("workspace migration 031-drop-user-md", () => {
|
|
|
226
226
|
mockVellumGuardian = {
|
|
227
227
|
contact: {
|
|
228
228
|
id: "guardian-2",
|
|
229
|
-
displayName: "
|
|
230
|
-
userFile: "
|
|
229
|
+
displayName: "Chris",
|
|
230
|
+
userFile: "chris.md",
|
|
231
231
|
},
|
|
232
232
|
channel: { type: "vellum" },
|
|
233
233
|
};
|
|
@@ -235,8 +235,8 @@ describe("workspace migration 031-drop-user-md", () => {
|
|
|
235
235
|
// Pre-populated persona file (post-017 state).
|
|
236
236
|
const usersDir = join(workspaceDir, "users");
|
|
237
237
|
mkdirSync(usersDir, { recursive: true });
|
|
238
|
-
const destPath = join(usersDir, "
|
|
239
|
-
const existingPersona = "#
|
|
238
|
+
const destPath = join(usersDir, "chris.md");
|
|
239
|
+
const existingPersona = "# Chris's Profile\n\n- Loves kayaking\n";
|
|
240
240
|
writeFileSync(destPath, existingPersona, "utf-8");
|
|
241
241
|
|
|
242
242
|
// Leftover template-shape USER.md at workspace root.
|
|
@@ -245,7 +245,7 @@ describe("workspace migration 031-drop-user-md", () => {
|
|
|
245
245
|
|
|
246
246
|
dropUserMdMigration.run(workspaceDir);
|
|
247
247
|
|
|
248
|
-
// users/
|
|
248
|
+
// users/chris.md is untouched.
|
|
249
249
|
expect(readFileSync(destPath, "utf-8")).toBe(existingPersona);
|
|
250
250
|
|
|
251
251
|
// USER.md is gone.
|