@vellumai/assistant 0.4.43 → 0.4.45
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 +4 -0
- package/ARCHITECTURE.md +46 -44
- package/README.md +15 -16
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -215
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -3
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-asset.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +32 -36
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +0 -10
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -5
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +7 -46
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/starter-task-flow.test.ts +9 -19
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +7 -7
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +84 -8
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -2
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
- package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +33 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +42 -10
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +53 -41
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/apps.ts +0 -25
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -73
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +8 -2
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/ride-shotgun-handler.ts +35 -43
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +45 -28
- package/src/daemon/session-agent-loop-handlers.ts +72 -9
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -7
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +192 -118
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +75 -37
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/app-store.ts +0 -18
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -37
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +13 -17
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +33 -35
- package/src/prompts/templates/BOOTSTRAP.md +0 -3
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +4 -6
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -8
- package/src/runtime/auth/scopes.ts +2 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +1 -24
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/http-types.ts +10 -0
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/middleware/error-handler.ts +14 -1
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +63 -67
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +234 -47
- package/src/runtime/routes/diagnostics-routes.ts +154 -43
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -351
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +37 -0
- package/src/tools/apps/executors.ts +0 -6
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/document/editor-template.ts +10 -8
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +12 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/home-base-bootstrap.test.ts +0 -84
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -920
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -116
- package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
- package/src/cli/commands/twitter/client.ts +0 -989
- package/src/cli/commands/twitter/index.ts +0 -1160
- package/src/cli/commands/twitter/oauth-client.ts +0 -94
- package/src/cli/commands/twitter/router.ts +0 -396
- package/src/cli/commands/twitter/session.ts +0 -121
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -137
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -319
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -405
- package/src/util/cookie-session.ts +0 -98
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -21,7 +21,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
21
21
|
isMacOS: () => process.platform === "darwin",
|
|
22
22
|
isLinux: () => process.platform === "linux",
|
|
23
23
|
isWindows: () => process.platform === "win32",
|
|
24
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
25
24
|
getPidPath: () => join(testDir, "test.pid"),
|
|
26
25
|
getDbPath: () => join(testDir, "test.db"),
|
|
27
26
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -56,8 +56,6 @@ function loadRegistry(): Registry {
|
|
|
56
56
|
* exercising legacy paths.
|
|
57
57
|
*/
|
|
58
58
|
const LEGACY_KEY_ALLOWLIST = new Set([
|
|
59
|
-
// Legacy wrapper (deprecated, kept for migration)
|
|
60
|
-
"assistant/src/config/skill-state.ts",
|
|
61
59
|
// Type definitions documenting the legacy format
|
|
62
60
|
"assistant/src/config/types.ts",
|
|
63
61
|
// macOS client: fallback reads from legacy config section
|
|
@@ -32,7 +32,8 @@ let currentConfig: Record<string, unknown> = {
|
|
|
32
32
|
sandbox: { enabled: false, backend: "native" },
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
const
|
|
35
|
+
const DECLARED_FLAG_ID = "hatch-new-assistant";
|
|
36
|
+
const DECLARED_FLAG_KEY = `feature_flags.${DECLARED_FLAG_ID}.enabled`;
|
|
36
37
|
const DECLARED_SKILL_ID = "hatch-new-assistant";
|
|
37
38
|
|
|
38
39
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
@@ -47,7 +48,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
47
48
|
getWorkspaceHooksDir: () => join(TEST_DIR, "hooks"),
|
|
48
49
|
getWorkspacePromptPath: (file: string) => join(TEST_DIR, file),
|
|
49
50
|
ensureDataDir: () => {},
|
|
50
|
-
getSocketPath: () => join(TEST_DIR, "vellum.sock"),
|
|
51
51
|
getPidPath: () => join(TEST_DIR, "vellum.pid"),
|
|
52
52
|
getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
|
|
53
53
|
getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
|
|
@@ -138,12 +138,16 @@ function createSkillOnDisk(
|
|
|
138
138
|
id: string,
|
|
139
139
|
name: string,
|
|
140
140
|
description: string,
|
|
141
|
+
featureFlag?: string,
|
|
141
142
|
): void {
|
|
142
143
|
const skillsDir = join(TEST_DIR, "skills");
|
|
143
144
|
mkdirSync(join(skillsDir, id), { recursive: true });
|
|
145
|
+
const ffBlock = featureFlag
|
|
146
|
+
? `\nmetadata: {"vellum":{"feature-flag":"${featureFlag}"}}`
|
|
147
|
+
: "";
|
|
144
148
|
writeFileSync(
|
|
145
149
|
join(skillsDir, id, "SKILL.md"),
|
|
146
|
-
`---\nname: "${name}"\ndescription: "${description}"\n---\n\nInstructions for ${id}.\n`,
|
|
150
|
+
`---\nname: "${name}"\ndescription: "${description}"${ffBlock}\n---\n\nInstructions for ${id}.\n`,
|
|
147
151
|
);
|
|
148
152
|
const indexPath = join(skillsDir, "SKILLS.md");
|
|
149
153
|
const existing = existsSync(indexPath)
|
|
@@ -162,21 +166,27 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
162
166
|
DECLARED_SKILL_ID,
|
|
163
167
|
"Hatch New Assistant",
|
|
164
168
|
"Toggle hatch new assistant behavior",
|
|
169
|
+
DECLARED_FLAG_ID,
|
|
170
|
+
);
|
|
171
|
+
createSkillOnDisk(
|
|
172
|
+
"browser",
|
|
173
|
+
"Browser",
|
|
174
|
+
"Web browsing automation",
|
|
175
|
+
"browser",
|
|
165
176
|
);
|
|
166
|
-
createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
|
|
167
177
|
|
|
168
178
|
currentConfig = {
|
|
169
179
|
sandbox: { enabled: false, backend: "native" },
|
|
170
180
|
assistantFeatureFlagValues: {
|
|
171
181
|
[DECLARED_FLAG_KEY]: false,
|
|
172
|
-
"feature_flags.
|
|
182
|
+
"feature_flags.browser.enabled": true,
|
|
173
183
|
},
|
|
174
184
|
};
|
|
175
185
|
|
|
176
186
|
const result = buildSystemPrompt();
|
|
177
187
|
|
|
178
|
-
//
|
|
179
|
-
expect(result).toContain('id="
|
|
188
|
+
// browser is explicitly enabled, declared flagged skill is explicitly off
|
|
189
|
+
expect(result).toContain('id="browser"');
|
|
180
190
|
expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
|
|
181
191
|
});
|
|
182
192
|
|
|
@@ -185,8 +195,14 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
185
195
|
DECLARED_SKILL_ID,
|
|
186
196
|
"Hatch New Assistant",
|
|
187
197
|
"Toggle hatch new assistant behavior",
|
|
198
|
+
DECLARED_FLAG_ID,
|
|
199
|
+
);
|
|
200
|
+
createSkillOnDisk(
|
|
201
|
+
"contacts",
|
|
202
|
+
"Contacts",
|
|
203
|
+
"View and manage contacts",
|
|
204
|
+
"contacts",
|
|
188
205
|
);
|
|
189
|
-
createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
|
|
190
206
|
|
|
191
207
|
currentConfig = {
|
|
192
208
|
sandbox: { enabled: false, backend: "native" },
|
|
@@ -194,9 +210,9 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
194
210
|
|
|
195
211
|
const result = buildSystemPrompt();
|
|
196
212
|
|
|
197
|
-
// Both skills
|
|
213
|
+
// Both skills declare feature flags with registry defaultEnabled: false
|
|
198
214
|
expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
|
|
199
|
-
expect(result).not.toContain('id="
|
|
215
|
+
expect(result).not.toContain('id="contacts"');
|
|
200
216
|
});
|
|
201
217
|
|
|
202
218
|
test("flagged-off skills hidden when all flags are OFF", () => {
|
|
@@ -204,21 +220,27 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
204
220
|
DECLARED_SKILL_ID,
|
|
205
221
|
"Hatch New Assistant",
|
|
206
222
|
"Toggle hatch new assistant behavior",
|
|
223
|
+
DECLARED_FLAG_ID,
|
|
224
|
+
);
|
|
225
|
+
createSkillOnDisk(
|
|
226
|
+
"contacts",
|
|
227
|
+
"Contacts",
|
|
228
|
+
"View and manage contacts",
|
|
229
|
+
"contacts",
|
|
207
230
|
);
|
|
208
|
-
createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
|
|
209
231
|
|
|
210
232
|
currentConfig = {
|
|
211
233
|
sandbox: { enabled: false, backend: "native" },
|
|
212
234
|
assistantFeatureFlagValues: {
|
|
213
235
|
[DECLARED_FLAG_KEY]: false,
|
|
214
|
-
"feature_flags.
|
|
236
|
+
"feature_flags.contacts.enabled": false,
|
|
215
237
|
},
|
|
216
238
|
};
|
|
217
239
|
|
|
218
240
|
const result = buildSystemPrompt();
|
|
219
241
|
|
|
220
242
|
expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
|
|
221
|
-
expect(result).not.toContain('id="
|
|
243
|
+
expect(result).not.toContain('id="contacts"');
|
|
222
244
|
});
|
|
223
245
|
|
|
224
246
|
test("assistantFeatureFlagValues overrides control visibility", () => {
|
|
@@ -226,6 +248,7 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
226
248
|
DECLARED_SKILL_ID,
|
|
227
249
|
"Hatch New Assistant",
|
|
228
250
|
"Toggle hatch new assistant behavior",
|
|
251
|
+
DECLARED_FLAG_ID,
|
|
229
252
|
);
|
|
230
253
|
|
|
231
254
|
currentConfig = {
|
|
@@ -239,7 +262,12 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
239
262
|
});
|
|
240
263
|
|
|
241
264
|
test("persisted overrides for undeclared flags are respected", () => {
|
|
242
|
-
createSkillOnDisk(
|
|
265
|
+
createSkillOnDisk(
|
|
266
|
+
"browser",
|
|
267
|
+
"Browser",
|
|
268
|
+
"Web browsing automation",
|
|
269
|
+
"browser",
|
|
270
|
+
);
|
|
243
271
|
|
|
244
272
|
currentConfig = {
|
|
245
273
|
sandbox: { enabled: false, backend: "native" },
|
|
@@ -248,13 +276,18 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
248
276
|
|
|
249
277
|
const result = buildSystemPrompt();
|
|
250
278
|
|
|
251
|
-
//
|
|
279
|
+
// browser declares featureFlag: "browser" and the user
|
|
252
280
|
// explicitly disabled it — that override must be honored.
|
|
253
281
|
expect(result).not.toContain('id="browser"');
|
|
254
282
|
});
|
|
255
283
|
|
|
256
284
|
test("declared flags with no persisted override use registry default", () => {
|
|
257
|
-
createSkillOnDisk(
|
|
285
|
+
createSkillOnDisk(
|
|
286
|
+
"browser",
|
|
287
|
+
"Browser",
|
|
288
|
+
"Web browsing automation",
|
|
289
|
+
"browser",
|
|
290
|
+
);
|
|
258
291
|
|
|
259
292
|
currentConfig = {
|
|
260
293
|
sandbox: { enabled: false, backend: "native" },
|
|
@@ -265,6 +298,19 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
|
|
|
265
298
|
// browser is declared in the registry with defaultEnabled: true
|
|
266
299
|
expect(result).toContain('id="browser"');
|
|
267
300
|
});
|
|
301
|
+
|
|
302
|
+
test("skill without featureFlag is never flag-gated", () => {
|
|
303
|
+
createSkillOnDisk("my-skill", "My Skill", "A skill without feature flag");
|
|
304
|
+
|
|
305
|
+
currentConfig = {
|
|
306
|
+
sandbox: { enabled: false, backend: "native" },
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
const result = buildSystemPrompt();
|
|
310
|
+
|
|
311
|
+
// Skills without featureFlag declared are never gated — always pass through
|
|
312
|
+
expect(result).toContain('id="my-skill"');
|
|
313
|
+
});
|
|
268
314
|
});
|
|
269
315
|
|
|
270
316
|
// ---------------------------------------------------------------------------
|
|
@@ -329,7 +375,10 @@ describe("isAssistantFeatureFlagEnabled with skillFlagKey", () => {
|
|
|
329
375
|
} as any;
|
|
330
376
|
|
|
331
377
|
expect(
|
|
332
|
-
isAssistantFeatureFlagEnabled(
|
|
378
|
+
isAssistantFeatureFlagEnabled(
|
|
379
|
+
skillFlagKey({ featureFlag: DECLARED_FLAG_ID })!,
|
|
380
|
+
config,
|
|
381
|
+
),
|
|
333
382
|
).toBe(false);
|
|
334
383
|
});
|
|
335
384
|
|
|
@@ -337,7 +386,10 @@ describe("isAssistantFeatureFlagEnabled with skillFlagKey", () => {
|
|
|
337
386
|
const config = {} as any;
|
|
338
387
|
|
|
339
388
|
expect(
|
|
340
|
-
isAssistantFeatureFlagEnabled(
|
|
389
|
+
isAssistantFeatureFlagEnabled(
|
|
390
|
+
skillFlagKey({ featureFlag: DECLARED_FLAG_ID })!,
|
|
391
|
+
config,
|
|
392
|
+
),
|
|
341
393
|
).toBe(false);
|
|
342
394
|
});
|
|
343
395
|
});
|
|
@@ -244,7 +244,7 @@ describe("assistant ID boundary", () => {
|
|
|
244
244
|
// Excluded:
|
|
245
245
|
// - Test files (they may legitimately assert against the value)
|
|
246
246
|
// - Migration files (SQL literals like DEFAULT 'self' are fine)
|
|
247
|
-
// -
|
|
247
|
+
// - Message contract files (comments documenting default values are fine)
|
|
248
248
|
// - CSP headers ('self' in Content-Security-Policy has nothing to do with assistant IDs)
|
|
249
249
|
const pattern = `(assistantId|assistant_id).*['"]self['"]`;
|
|
250
250
|
|
|
@@ -307,21 +307,21 @@ describe("assistant ID boundary", () => {
|
|
|
307
307
|
// -------------------------------------------------------------------------
|
|
308
308
|
// Rule (e): No assistantId on daemon control-plane request/param types
|
|
309
309
|
//
|
|
310
|
-
// Daemon
|
|
310
|
+
// Daemon message contracts and guardian outbound param interfaces must not
|
|
311
311
|
// accept an assistantId field -- the daemon always uses
|
|
312
312
|
// DAEMON_INTERNAL_ASSISTANT_ID internally. Accepting assistantId on these
|
|
313
313
|
// surfaces invites callers to pass external IDs into daemon scoping.
|
|
314
314
|
// -------------------------------------------------------------------------
|
|
315
315
|
|
|
316
|
-
test("
|
|
317
|
-
const
|
|
316
|
+
test("message contract types do not contain assistantId for guardian requests", () => {
|
|
317
|
+
const contractPath = join(
|
|
318
318
|
import.meta.dir,
|
|
319
319
|
"..",
|
|
320
320
|
"daemon",
|
|
321
321
|
"message-types",
|
|
322
322
|
"integrations.ts",
|
|
323
323
|
);
|
|
324
|
-
const content = readFileSync(
|
|
324
|
+
const content = readFileSync(contractPath, "utf-8");
|
|
325
325
|
|
|
326
326
|
// Extract the interface blocks for the request types and verify
|
|
327
327
|
// none of them declare an assistantId property.
|
|
@@ -334,7 +334,7 @@ describe("assistant ID boundary", () => {
|
|
|
334
334
|
const typeIndex = content.indexOf(typeName);
|
|
335
335
|
expect(
|
|
336
336
|
typeIndex,
|
|
337
|
-
`Expected to find ${typeName} in
|
|
337
|
+
`Expected to find ${typeName} in message contract`,
|
|
338
338
|
).toBeGreaterThan(-1);
|
|
339
339
|
|
|
340
340
|
// Extract from the type declaration to the next '}' line
|
|
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
10
10
|
isMacOS: () => process.platform === "darwin",
|
|
11
11
|
isLinux: () => process.platform === "linux",
|
|
12
12
|
isWindows: () => process.platform === "win32",
|
|
13
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
14
13
|
getPidPath: () => join(testDir, "test.pid"),
|
|
15
14
|
getDbPath: () => join(testDir, "test.db"),
|
|
16
15
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -4,7 +4,6 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
4
4
|
// Mock state — mutable variables control per-test behavior
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
let mockStrategy: string = "local_only";
|
|
8
7
|
let mockGeminiKey: string | undefined = "test-gemini-key";
|
|
9
8
|
let mockApiKey: string | undefined = "test-api-key-123";
|
|
10
9
|
let mockBaseUrl = "https://platform.test.vellum.ai";
|
|
@@ -33,7 +32,6 @@ const geminiGenerateContentFn = mock(async () => geminiGenerateContentResult);
|
|
|
33
32
|
mock.module("../config/loader.js", () => ({
|
|
34
33
|
getConfig: () => ({
|
|
35
34
|
apiKeys: { gemini: mockGeminiKey },
|
|
36
|
-
avatar: { generationStrategy: mockStrategy },
|
|
37
35
|
platform: { baseUrl: mockBaseUrl },
|
|
38
36
|
imageGenModel: "gemini-2.5-flash-image",
|
|
39
37
|
}),
|
|
@@ -125,19 +123,15 @@ function executeAvatar(description: string) {
|
|
|
125
123
|
);
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
/** Standard successful
|
|
126
|
+
/** Standard successful Vertex predictions response. */
|
|
129
127
|
function managedPlatformResponse() {
|
|
130
128
|
return {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
usage: { billable: true, class_name: "assistant_avatar_system" },
|
|
138
|
-
generation_source: "vertex",
|
|
139
|
-
profile: "avatar_v1",
|
|
140
|
-
correlation_id: "managed-corr-id-123",
|
|
129
|
+
predictions: [
|
|
130
|
+
{
|
|
131
|
+
bytesBase64Encoded: "iVBORw0KGgoAAAANSUhEUg==",
|
|
132
|
+
mimeType: "image/png",
|
|
133
|
+
},
|
|
134
|
+
],
|
|
141
135
|
};
|
|
142
136
|
}
|
|
143
137
|
|
|
@@ -171,6 +165,10 @@ function mockFetchReturning(response: {
|
|
|
171
165
|
ok: response.ok,
|
|
172
166
|
status: response.status,
|
|
173
167
|
json: async () => response.body,
|
|
168
|
+
text: async () =>
|
|
169
|
+
typeof response.body === "string"
|
|
170
|
+
? response.body
|
|
171
|
+
: JSON.stringify(response.body),
|
|
174
172
|
}),
|
|
175
173
|
) as unknown as typeof globalThis.fetch;
|
|
176
174
|
}
|
|
@@ -189,7 +187,6 @@ describe("avatar E2E integration", () => {
|
|
|
189
187
|
const originalGeminiKey = process.env.GEMINI_API_KEY;
|
|
190
188
|
|
|
191
189
|
beforeEach(() => {
|
|
192
|
-
mockStrategy = "local_only";
|
|
193
190
|
mockGeminiKey = "test-gemini-key";
|
|
194
191
|
mockApiKey = "test-api-key-123";
|
|
195
192
|
mockBaseUrl = "https://platform.test.vellum.ai";
|
|
@@ -225,8 +222,7 @@ describe("avatar E2E integration", () => {
|
|
|
225
222
|
// 1. Managed success E2E
|
|
226
223
|
// -----------------------------------------------------------------------
|
|
227
224
|
|
|
228
|
-
test("
|
|
229
|
-
mockStrategy = "managed_required";
|
|
225
|
+
test("managed success — file written, correct content, success message", async () => {
|
|
230
226
|
mockFetchReturning({
|
|
231
227
|
ok: true,
|
|
232
228
|
status: 200,
|
|
@@ -261,43 +257,10 @@ describe("avatar E2E integration", () => {
|
|
|
261
257
|
});
|
|
262
258
|
|
|
263
259
|
// -----------------------------------------------------------------------
|
|
264
|
-
// 2. Managed
|
|
265
|
-
// -----------------------------------------------------------------------
|
|
266
|
-
|
|
267
|
-
test("managed_required failure — error surfaced, no file written, no fallback", async () => {
|
|
268
|
-
mockStrategy = "managed_required";
|
|
269
|
-
mockFetchReturning({
|
|
270
|
-
ok: false,
|
|
271
|
-
status: 500,
|
|
272
|
-
body: {
|
|
273
|
-
code: "internal_error",
|
|
274
|
-
subcode: "server_fault",
|
|
275
|
-
detail: "Internal server error",
|
|
276
|
-
retryable: true,
|
|
277
|
-
correlation_id: "corr-500",
|
|
278
|
-
},
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
const result = await executeAvatar("a friendly robot");
|
|
282
|
-
|
|
283
|
-
// Verify error is surfaced
|
|
284
|
-
expect(result.isError).toBe(true);
|
|
285
|
-
expect(result.content).toContain("failed");
|
|
286
|
-
|
|
287
|
-
// Verify no file was written
|
|
288
|
-
expect(writeFileSyncFn).not.toHaveBeenCalled();
|
|
289
|
-
expect(renameSyncFn).not.toHaveBeenCalled();
|
|
290
|
-
|
|
291
|
-
// Verify Gemini was never called (no fallback)
|
|
292
|
-
expect(geminiGenerateContentFn).not.toHaveBeenCalled();
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
// -----------------------------------------------------------------------
|
|
296
|
-
// 3. Managed-prefer fallback E2E
|
|
260
|
+
// 2. Managed failure — falls back to local
|
|
297
261
|
// -----------------------------------------------------------------------
|
|
298
262
|
|
|
299
|
-
test("
|
|
300
|
-
mockStrategy = "managed_prefer";
|
|
263
|
+
test("managed failure — falls back to local Gemini, file written", async () => {
|
|
301
264
|
mockFetchReturning({
|
|
302
265
|
ok: false,
|
|
303
266
|
status: 502,
|
|
@@ -325,11 +288,10 @@ describe("avatar E2E integration", () => {
|
|
|
325
288
|
});
|
|
326
289
|
|
|
327
290
|
// -----------------------------------------------------------------------
|
|
328
|
-
//
|
|
291
|
+
// 3. No managed prerequisites — goes straight to local
|
|
329
292
|
// -----------------------------------------------------------------------
|
|
330
293
|
|
|
331
|
-
test("
|
|
332
|
-
mockStrategy = "managed_prefer";
|
|
294
|
+
test("no managed API key — goes straight to local Gemini", async () => {
|
|
333
295
|
mockApiKey = undefined; // No managed API key available
|
|
334
296
|
|
|
335
297
|
const result = await executeAvatar("a cute cat");
|
|
@@ -347,81 +309,76 @@ describe("avatar E2E integration", () => {
|
|
|
347
309
|
});
|
|
348
310
|
|
|
349
311
|
// -----------------------------------------------------------------------
|
|
350
|
-
//
|
|
312
|
+
// 4. No managed prerequisites and no local key — error
|
|
351
313
|
// -----------------------------------------------------------------------
|
|
352
314
|
|
|
353
|
-
test("
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
Promise.resolve({ ok: true, status: 200, json: async () => ({}) }),
|
|
357
|
-
);
|
|
358
|
-
globalThis.fetch = fetchMock as unknown as typeof globalThis.fetch;
|
|
315
|
+
test("no managed API key and no Gemini key — error surfaced", async () => {
|
|
316
|
+
mockApiKey = undefined;
|
|
317
|
+
mockGeminiKey = undefined;
|
|
359
318
|
|
|
360
319
|
const result = await executeAvatar("a whimsical owl");
|
|
361
320
|
|
|
362
|
-
|
|
363
|
-
expect(result.
|
|
364
|
-
expect(result.content).toContain("Avatar updated");
|
|
365
|
-
|
|
366
|
-
// Verify Gemini was called
|
|
367
|
-
expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
|
|
368
|
-
|
|
369
|
-
// Verify managed endpoint was never contacted
|
|
370
|
-
expect(fetchMock).not.toHaveBeenCalled();
|
|
371
|
-
|
|
372
|
-
// Verify file was written
|
|
373
|
-
expect(writeFileSyncFn).toHaveBeenCalledTimes(1);
|
|
374
|
-
expect(renameSyncFn).toHaveBeenCalledTimes(1);
|
|
321
|
+
expect(result.isError).toBe(true);
|
|
322
|
+
expect(result.content).toContain("failed");
|
|
375
323
|
});
|
|
376
324
|
|
|
377
325
|
// -----------------------------------------------------------------------
|
|
378
|
-
//
|
|
326
|
+
// 5. Response validation — bad MIME type
|
|
379
327
|
// -----------------------------------------------------------------------
|
|
380
328
|
|
|
381
|
-
test("managed response with disallowed MIME type —
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
329
|
+
test("managed response with disallowed MIME type — falls back to local", async () => {
|
|
330
|
+
mockFetchReturning({
|
|
331
|
+
ok: true,
|
|
332
|
+
status: 200,
|
|
333
|
+
body: {
|
|
334
|
+
predictions: [
|
|
335
|
+
{
|
|
336
|
+
bytesBase64Encoded: "iVBORw0KGgoAAAANSUhEUg==",
|
|
337
|
+
mimeType: "image/gif",
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
},
|
|
341
|
+
});
|
|
386
342
|
|
|
387
343
|
const result = await executeAvatar("a cat");
|
|
388
344
|
|
|
389
|
-
//
|
|
390
|
-
expect(result.isError).toBe(
|
|
391
|
-
expect(result.content).toContain("
|
|
392
|
-
|
|
393
|
-
// Verify no file was written
|
|
394
|
-
expect(writeFileSyncFn).not.toHaveBeenCalled();
|
|
395
|
-
expect(renameSyncFn).not.toHaveBeenCalled();
|
|
345
|
+
// Managed fails validation, falls back to local Gemini
|
|
346
|
+
expect(result.isError).toBe(false);
|
|
347
|
+
expect(result.content).toContain("Avatar updated");
|
|
348
|
+
expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
|
|
396
349
|
});
|
|
397
350
|
|
|
398
351
|
// -----------------------------------------------------------------------
|
|
399
|
-
//
|
|
352
|
+
// 6. Response validation — oversized image
|
|
400
353
|
// -----------------------------------------------------------------------
|
|
401
354
|
|
|
402
|
-
test("managed response with oversized data —
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
mockFetchReturning({
|
|
355
|
+
test("managed response with oversized data — falls back to local", async () => {
|
|
356
|
+
const oversizedBase64 = "A".repeat(
|
|
357
|
+
Math.ceil(((AVATAR_MAX_DECODED_BYTES + 100) * 4) / 3),
|
|
358
|
+
);
|
|
359
|
+
mockFetchReturning({
|
|
360
|
+
ok: true,
|
|
361
|
+
status: 200,
|
|
362
|
+
body: {
|
|
363
|
+
predictions: [
|
|
364
|
+
{ bytesBase64Encoded: oversizedBase64, mimeType: "image/png" },
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
|
+
});
|
|
407
368
|
|
|
408
369
|
const result = await executeAvatar("a cat");
|
|
409
370
|
|
|
410
|
-
//
|
|
411
|
-
expect(result.isError).toBe(
|
|
412
|
-
expect(result.content).toContain("
|
|
413
|
-
|
|
414
|
-
// Verify no file was written
|
|
415
|
-
expect(writeFileSyncFn).not.toHaveBeenCalled();
|
|
416
|
-
expect(renameSyncFn).not.toHaveBeenCalled();
|
|
371
|
+
// Managed fails validation, falls back to local Gemini
|
|
372
|
+
expect(result.isError).toBe(false);
|
|
373
|
+
expect(result.content).toContain("Avatar updated");
|
|
374
|
+
expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
|
|
417
375
|
});
|
|
418
376
|
|
|
419
377
|
// -----------------------------------------------------------------------
|
|
420
|
-
//
|
|
378
|
+
// 7. Rate limit — falls back to local
|
|
421
379
|
// -----------------------------------------------------------------------
|
|
422
380
|
|
|
423
|
-
test("managed 429 response —
|
|
424
|
-
mockStrategy = "managed_required";
|
|
381
|
+
test("managed 429 response — falls back to local Gemini", async () => {
|
|
425
382
|
mockFetchReturning({
|
|
426
383
|
ok: false,
|
|
427
384
|
status: 429,
|
|
@@ -436,19 +393,22 @@ describe("avatar E2E integration", () => {
|
|
|
436
393
|
|
|
437
394
|
const result = await executeAvatar("a cat");
|
|
438
395
|
|
|
439
|
-
|
|
440
|
-
expect(result.
|
|
396
|
+
// Falls back to local successfully
|
|
397
|
+
expect(result.isError).toBe(false);
|
|
398
|
+
expect(result.content).toContain("Avatar updated");
|
|
399
|
+
expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
|
|
441
400
|
});
|
|
442
401
|
|
|
443
402
|
// -----------------------------------------------------------------------
|
|
444
|
-
//
|
|
403
|
+
// 8. Correlation ID propagation
|
|
445
404
|
// -----------------------------------------------------------------------
|
|
446
405
|
|
|
447
|
-
test("managed success — correlation ID
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
406
|
+
test("managed success — correlation ID is propagated through the pipeline", async () => {
|
|
407
|
+
mockFetchReturning({
|
|
408
|
+
ok: true,
|
|
409
|
+
status: 200,
|
|
410
|
+
body: managedPlatformResponse(),
|
|
411
|
+
});
|
|
452
412
|
|
|
453
413
|
const result = await executeAvatar("a robot");
|
|
454
414
|
|
|
@@ -456,15 +416,14 @@ describe("avatar E2E integration", () => {
|
|
|
456
416
|
expect(result.isError).toBe(false);
|
|
457
417
|
expect(writeFileSyncFn).toHaveBeenCalled();
|
|
458
418
|
|
|
419
|
+
// Correlation ID is now generated client-side, so just verify one is logged
|
|
459
420
|
const correlationLogged = logInfoCalls.some(([meta, message]) => {
|
|
460
421
|
if (message !== "Avatar saved successfully") return false;
|
|
461
422
|
if (!meta || typeof meta !== "object" || !("correlationId" in meta)) {
|
|
462
423
|
return false;
|
|
463
424
|
}
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
"unique-corr-id-xyz"
|
|
467
|
-
);
|
|
425
|
+
const cid = (meta as { correlationId?: unknown }).correlationId;
|
|
426
|
+
return typeof cid === "string" && cid.length > 0;
|
|
468
427
|
});
|
|
469
428
|
|
|
470
429
|
expect(correlationLogged).toBe(true);
|