@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
|
@@ -18,7 +18,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
18
18
|
getWorkspaceHooksDir: () => join(TEST_DIR, "hooks"),
|
|
19
19
|
getWorkspacePromptPath: (file: string) => join(TEST_DIR, file),
|
|
20
20
|
ensureDataDir: () => {},
|
|
21
|
-
getSocketPath: () => join(TEST_DIR, "vellum.sock"),
|
|
22
21
|
getPidPath: () => join(TEST_DIR, "vellum.pid"),
|
|
23
22
|
getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
|
|
24
23
|
getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
|
|
@@ -85,17 +84,6 @@ const taskListAddDef = tasksToolsJson.tools.find(
|
|
|
85
84
|
(t: { name: string }) => t.name === "task_list_add",
|
|
86
85
|
);
|
|
87
86
|
|
|
88
|
-
// Load reminder_create description from the bundled skill TOOLS.json
|
|
89
|
-
const reminderToolsJson = JSON.parse(
|
|
90
|
-
readFileSync(
|
|
91
|
-
join(import.meta.dirname, "../config/bundled-skills/reminder/TOOLS.json"),
|
|
92
|
-
"utf-8",
|
|
93
|
-
),
|
|
94
|
-
);
|
|
95
|
-
const reminderCreateDef = reminderToolsJson.tools.find(
|
|
96
|
-
(t: { name: string }) => t.name === "reminder_create",
|
|
97
|
-
);
|
|
98
|
-
|
|
99
87
|
// Load schedule_create description from the bundled skill TOOLS.json
|
|
100
88
|
const scheduleToolsJson = JSON.parse(
|
|
101
89
|
readFileSync(
|
|
@@ -111,7 +99,7 @@ const scheduleCreateDef = scheduleToolsJson.tools.find(
|
|
|
111
99
|
// 1. System prompt: buildTaskScheduleReminderRoutingSection
|
|
112
100
|
// =====================================================================
|
|
113
101
|
|
|
114
|
-
describe("Task/Schedule
|
|
102
|
+
describe("Task/Schedule routing section in system prompt", () => {
|
|
115
103
|
beforeEach(() => {
|
|
116
104
|
mkdirSync(TEST_DIR, { recursive: true });
|
|
117
105
|
});
|
|
@@ -125,15 +113,14 @@ describe("Task/Schedule/Reminder routing section in system prompt", () => {
|
|
|
125
113
|
test("system prompt includes the routing section heading", () => {
|
|
126
114
|
const prompt = buildSystemPrompt();
|
|
127
115
|
expect(prompt).toContain(
|
|
128
|
-
"## Tool Routing: Tasks vs Schedules vs
|
|
116
|
+
"## Tool Routing: Tasks vs Schedules vs Notifications",
|
|
129
117
|
);
|
|
130
118
|
});
|
|
131
119
|
|
|
132
|
-
test("routing section lists all
|
|
120
|
+
test("routing section lists all three tools in the summary table", () => {
|
|
133
121
|
const prompt = buildSystemPrompt();
|
|
134
122
|
expect(prompt).toContain("`task_list_add`");
|
|
135
123
|
expect(prompt).toContain("`schedule_create`");
|
|
136
|
-
expect(prompt).toContain("`reminder_create`");
|
|
137
124
|
expect(prompt).toContain("`send_notification`");
|
|
138
125
|
});
|
|
139
126
|
|
|
@@ -168,7 +155,7 @@ describe("Task/Schedule/Reminder routing section in system prompt", () => {
|
|
|
168
155
|
test("routing section is present in the system prompt", () => {
|
|
169
156
|
const prompt = buildSystemPrompt();
|
|
170
157
|
const taskRoutingIdx = prompt.indexOf(
|
|
171
|
-
"## Tool Routing: Tasks vs Schedules vs
|
|
158
|
+
"## Tool Routing: Tasks vs Schedules vs Notifications",
|
|
172
159
|
);
|
|
173
160
|
expect(taskRoutingIdx).toBeGreaterThanOrEqual(0);
|
|
174
161
|
});
|
|
@@ -231,44 +218,18 @@ describe("schedule_create tool description", () => {
|
|
|
231
218
|
});
|
|
232
219
|
});
|
|
233
220
|
|
|
234
|
-
describe("reminder tool description", () => {
|
|
235
|
-
test("mentions time-based reminders", () => {
|
|
236
|
-
expect(reminderCreateDef.description).toContain("time-based reminder");
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test("scopes to time-triggered notifications only", () => {
|
|
240
|
-
expect(reminderCreateDef.description).toContain(
|
|
241
|
-
"ONLY when the user wants a time-triggered notification",
|
|
242
|
-
);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
test('warns against using for "add to my tasks" requests', () => {
|
|
246
|
-
expect(reminderCreateDef.description).toContain(
|
|
247
|
-
'Do NOT use this for "add to my tasks"',
|
|
248
|
-
);
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
test("redirects to task_list_add for task queue items", () => {
|
|
252
|
-
expect(reminderCreateDef.description).toContain("task_list_add");
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
|
|
256
221
|
// =====================================================================
|
|
257
|
-
// 3. Cross-tool consistency:
|
|
222
|
+
// 3. Cross-tool consistency: schedule and task tools agree on routing boundaries
|
|
258
223
|
// =====================================================================
|
|
259
224
|
|
|
260
225
|
describe("cross-tool routing consistency", () => {
|
|
261
|
-
test("
|
|
262
|
-
// task_list_add is the canonical name in all three descriptions
|
|
226
|
+
test("both tools reference task_list_add as the task-queue tool", () => {
|
|
263
227
|
expect(taskListAddDef.name).toBe("task_list_add");
|
|
264
228
|
expect(scheduleCreateDef.description).toContain("task_list_add");
|
|
265
|
-
expect(reminderCreateDef.description).toContain("task_list_add");
|
|
266
229
|
});
|
|
267
230
|
|
|
268
|
-
test('schedule_create
|
|
269
|
-
// Both should redirect away from task-queue requests
|
|
231
|
+
test('schedule_create rejects "add to my queue" usage', () => {
|
|
270
232
|
expect(scheduleCreateDef.description).toContain("add to my queue");
|
|
271
|
-
expect(reminderCreateDef.description).toContain("add to my queue");
|
|
272
233
|
});
|
|
273
234
|
});
|
|
274
235
|
|
|
@@ -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"),
|
|
@@ -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"),
|
|
@@ -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"),
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import { createHash } from "crypto";
|
|
4
|
+
|
|
3
5
|
// ---------------------------------------------------------------------------
|
|
4
6
|
// Mock dependencies โ must be before importing the module under test
|
|
5
7
|
// ---------------------------------------------------------------------------
|
|
@@ -40,10 +42,12 @@ let fetchResponse: {
|
|
|
40
42
|
ok: boolean;
|
|
41
43
|
status: number;
|
|
42
44
|
json: () => Promise<unknown>;
|
|
45
|
+
text: () => Promise<string>;
|
|
43
46
|
} = {
|
|
44
47
|
ok: true,
|
|
45
48
|
status: 200,
|
|
46
49
|
json: async () => ({}),
|
|
50
|
+
text: async () => "",
|
|
47
51
|
};
|
|
48
52
|
|
|
49
53
|
globalThis.fetch = (async (url: string, init: RequestInit) => {
|
|
@@ -56,6 +60,7 @@ import {
|
|
|
56
60
|
AVATAR_MAX_DECODED_BYTES,
|
|
57
61
|
AVATAR_PROMPT_MAX_LENGTH,
|
|
58
62
|
ManagedAvatarError,
|
|
63
|
+
VERTEX_IMAGE_DEFAULT_MODEL,
|
|
59
64
|
} from "../media/avatar-types.js";
|
|
60
65
|
import {
|
|
61
66
|
generateManagedAvatar,
|
|
@@ -66,18 +71,16 @@ import {
|
|
|
66
71
|
// Helpers
|
|
67
72
|
// ---------------------------------------------------------------------------
|
|
68
73
|
|
|
74
|
+
const SMALL_PNG_BASE64 = "iVBORw0KGgo=";
|
|
75
|
+
|
|
69
76
|
function successResponse() {
|
|
70
77
|
return {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
usage: { billable: true, class_name: "avatar" },
|
|
78
|
-
generation_source: "managed",
|
|
79
|
-
profile: "default",
|
|
80
|
-
correlation_id: "test-corr-id",
|
|
78
|
+
predictions: [
|
|
79
|
+
{
|
|
80
|
+
bytesBase64Encoded: SMALL_PNG_BASE64,
|
|
81
|
+
mimeType: "image/png",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
81
84
|
};
|
|
82
85
|
}
|
|
83
86
|
|
|
@@ -94,6 +97,7 @@ beforeEach(() => {
|
|
|
94
97
|
ok: true,
|
|
95
98
|
status: 200,
|
|
96
99
|
json: async () => successResponse(),
|
|
100
|
+
text: async () => JSON.stringify(successResponse()),
|
|
97
101
|
};
|
|
98
102
|
});
|
|
99
103
|
|
|
@@ -102,9 +106,57 @@ describe("generateManagedAvatar", () => {
|
|
|
102
106
|
const result = await generateManagedAvatar("a friendly robot avatar");
|
|
103
107
|
|
|
104
108
|
expect(result.image.mime_type).toBe("image/png");
|
|
105
|
-
expect(result.image.data_base64).toBe(
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
expect(result.image.data_base64).toBe(SMALL_PNG_BASE64);
|
|
110
|
+
// bytes is computed from base64 length, not from the server response
|
|
111
|
+
const padding = SMALL_PNG_BASE64.endsWith("==")
|
|
112
|
+
? 2
|
|
113
|
+
: SMALL_PNG_BASE64.endsWith("=")
|
|
114
|
+
? 1
|
|
115
|
+
: 0;
|
|
116
|
+
const expectedBytes =
|
|
117
|
+
Math.ceil((SMALL_PNG_BASE64.length * 3) / 4) - padding;
|
|
118
|
+
expect(result.image.bytes).toBe(expectedBytes);
|
|
119
|
+
const expectedSha256 = createHash("sha256")
|
|
120
|
+
.update(Buffer.from(SMALL_PNG_BASE64, "base64"))
|
|
121
|
+
.digest("hex");
|
|
122
|
+
expect(result.image.sha256).toBe(expectedSha256);
|
|
123
|
+
expect(result.correlation_id).toBeDefined();
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("fetch URL matches runtime proxy Vertex endpoint with default model", async () => {
|
|
127
|
+
await generateManagedAvatar("test prompt");
|
|
128
|
+
|
|
129
|
+
expect(lastFetchArgs).not.toBeNull();
|
|
130
|
+
const url = lastFetchArgs![0];
|
|
131
|
+
expect(url).toBe(
|
|
132
|
+
`https://platform.vellum.ai/v1/runtime-proxy/vertex/v1/models/${VERTEX_IMAGE_DEFAULT_MODEL}:predict`,
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("custom model is used in the URL path", async () => {
|
|
137
|
+
const customModel = "imagen-3.0-fast-generate-001";
|
|
138
|
+
await generateManagedAvatar("test prompt", { model: customModel });
|
|
139
|
+
|
|
140
|
+
expect(lastFetchArgs).not.toBeNull();
|
|
141
|
+
const url = lastFetchArgs![0];
|
|
142
|
+
expect(url).toBe(
|
|
143
|
+
`https://platform.vellum.ai/v1/runtime-proxy/vertex/v1/models/${customModel}:predict`,
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("request body uses Vertex Imagen format", async () => {
|
|
148
|
+
await generateManagedAvatar("a cool robot");
|
|
149
|
+
|
|
150
|
+
expect(lastFetchArgs).not.toBeNull();
|
|
151
|
+
const body = JSON.parse(lastFetchArgs![1].body as string);
|
|
152
|
+
expect(body).toEqual({
|
|
153
|
+
instances: [{ prompt: "a cool robot" }],
|
|
154
|
+
parameters: {
|
|
155
|
+
sampleCount: 1,
|
|
156
|
+
aspectRatio: "1:1",
|
|
157
|
+
outputOptions: { mimeType: "image/png" },
|
|
158
|
+
},
|
|
159
|
+
});
|
|
108
160
|
});
|
|
109
161
|
|
|
110
162
|
test("prompt exceeding max length throws ManagedAvatarError with code validation_error", async () => {
|
|
@@ -125,13 +177,8 @@ describe("generateManagedAvatar", () => {
|
|
|
125
177
|
fetchResponse = {
|
|
126
178
|
ok: false,
|
|
127
179
|
status: 429,
|
|
128
|
-
json: async () => ({
|
|
129
|
-
|
|
130
|
-
subcode: "too_many_requests",
|
|
131
|
-
detail: "Rate limit exceeded",
|
|
132
|
-
retryable: true,
|
|
133
|
-
correlation_id: "corr-429",
|
|
134
|
-
}),
|
|
180
|
+
json: async () => ({}),
|
|
181
|
+
text: async () => "Rate limit exceeded",
|
|
135
182
|
};
|
|
136
183
|
|
|
137
184
|
try {
|
|
@@ -142,20 +189,17 @@ describe("generateManagedAvatar", () => {
|
|
|
142
189
|
const avatarErr = err as ManagedAvatarError;
|
|
143
190
|
expect(avatarErr.retryable).toBe(true);
|
|
144
191
|
expect(avatarErr.statusCode).toBe(429);
|
|
192
|
+
expect(avatarErr.code).toBe("upstream_error");
|
|
193
|
+
expect(avatarErr.subcode).toBe("http_error");
|
|
145
194
|
}
|
|
146
195
|
});
|
|
147
196
|
|
|
148
|
-
test("HTTP 500 response throws ManagedAvatarError
|
|
197
|
+
test("HTTP 500 response throws retryable ManagedAvatarError", async () => {
|
|
149
198
|
fetchResponse = {
|
|
150
199
|
ok: false,
|
|
151
200
|
status: 500,
|
|
152
|
-
json: async () => ({
|
|
153
|
-
|
|
154
|
-
subcode: "server_fault",
|
|
155
|
-
detail: "Internal server error",
|
|
156
|
-
retryable: true,
|
|
157
|
-
correlation_id: "corr-500",
|
|
158
|
-
}),
|
|
201
|
+
json: async () => ({}),
|
|
202
|
+
text: async () => "Internal server error",
|
|
159
203
|
};
|
|
160
204
|
|
|
161
205
|
try {
|
|
@@ -164,20 +208,19 @@ describe("generateManagedAvatar", () => {
|
|
|
164
208
|
} catch (err) {
|
|
165
209
|
expect(err).toBeInstanceOf(ManagedAvatarError);
|
|
166
210
|
const avatarErr = err as ManagedAvatarError;
|
|
167
|
-
expect(avatarErr.code).toBe("
|
|
168
|
-
expect(avatarErr.subcode).toBe("
|
|
211
|
+
expect(avatarErr.code).toBe("upstream_error");
|
|
212
|
+
expect(avatarErr.subcode).toBe("http_error");
|
|
169
213
|
expect(avatarErr.statusCode).toBe(500);
|
|
214
|
+
expect(avatarErr.retryable).toBe(true);
|
|
170
215
|
}
|
|
171
216
|
});
|
|
172
217
|
|
|
173
|
-
test("
|
|
218
|
+
test("HTTP 400 response throws non-retryable ManagedAvatarError", async () => {
|
|
174
219
|
fetchResponse = {
|
|
175
|
-
ok:
|
|
176
|
-
status:
|
|
177
|
-
json: async () => ({
|
|
178
|
-
|
|
179
|
-
image: { ...successResponse().image, mime_type: "image/gif" },
|
|
180
|
-
}),
|
|
220
|
+
ok: false,
|
|
221
|
+
status: 400,
|
|
222
|
+
json: async () => ({}),
|
|
223
|
+
text: async () => "Model not allowed on this platform",
|
|
181
224
|
};
|
|
182
225
|
|
|
183
226
|
try {
|
|
@@ -186,22 +229,26 @@ describe("generateManagedAvatar", () => {
|
|
|
186
229
|
} catch (err) {
|
|
187
230
|
expect(err).toBeInstanceOf(ManagedAvatarError);
|
|
188
231
|
const avatarErr = err as ManagedAvatarError;
|
|
189
|
-
expect(avatarErr.code).toBe("
|
|
190
|
-
expect(avatarErr.subcode).toBe("
|
|
232
|
+
expect(avatarErr.code).toBe("upstream_error");
|
|
233
|
+
expect(avatarErr.subcode).toBe("http_error");
|
|
234
|
+
expect(avatarErr.statusCode).toBe(400);
|
|
235
|
+
expect(avatarErr.retryable).toBe(false);
|
|
191
236
|
}
|
|
192
237
|
});
|
|
193
238
|
|
|
194
|
-
test("response with
|
|
239
|
+
test("response with disallowed MIME type throws validation error", async () => {
|
|
195
240
|
fetchResponse = {
|
|
196
241
|
ok: true,
|
|
197
242
|
status: 200,
|
|
198
243
|
json: async () => ({
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
244
|
+
predictions: [
|
|
245
|
+
{
|
|
246
|
+
bytesBase64Encoded: SMALL_PNG_BASE64,
|
|
247
|
+
mimeType: "image/gif",
|
|
248
|
+
},
|
|
249
|
+
],
|
|
204
250
|
}),
|
|
251
|
+
text: async () => "",
|
|
205
252
|
};
|
|
206
253
|
|
|
207
254
|
try {
|
|
@@ -211,13 +258,11 @@ describe("generateManagedAvatar", () => {
|
|
|
211
258
|
expect(err).toBeInstanceOf(ManagedAvatarError);
|
|
212
259
|
const avatarErr = err as ManagedAvatarError;
|
|
213
260
|
expect(avatarErr.code).toBe("validation_error");
|
|
214
|
-
expect(avatarErr.subcode).toBe("
|
|
261
|
+
expect(avatarErr.subcode).toBe("disallowed_mime_type");
|
|
215
262
|
}
|
|
216
263
|
});
|
|
217
264
|
|
|
218
|
-
test("response with oversized
|
|
219
|
-
// Create a base64 string whose estimated decoded size exceeds the limit,
|
|
220
|
-
// even though the server-reported bytes field is under the limit
|
|
265
|
+
test("response with oversized image throws validation error", async () => {
|
|
221
266
|
const oversizedBase64 = "A".repeat(
|
|
222
267
|
Math.ceil(((AVATAR_MAX_DECODED_BYTES + 100) * 4) / 3),
|
|
223
268
|
);
|
|
@@ -225,13 +270,14 @@ describe("generateManagedAvatar", () => {
|
|
|
225
270
|
ok: true,
|
|
226
271
|
status: 200,
|
|
227
272
|
json: async () => ({
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
273
|
+
predictions: [
|
|
274
|
+
{
|
|
275
|
+
bytesBase64Encoded: oversizedBase64,
|
|
276
|
+
mimeType: "image/png",
|
|
277
|
+
},
|
|
278
|
+
],
|
|
234
279
|
}),
|
|
280
|
+
text: async () => "",
|
|
235
281
|
};
|
|
236
282
|
|
|
237
283
|
try {
|
|
@@ -32,7 +32,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
32
32
|
getWorkspaceSkillsDir: () => join(TEST_DIR, "skills"),
|
|
33
33
|
getDataDir: () => TEST_DIR,
|
|
34
34
|
ensureDataDir: () => {},
|
|
35
|
-
getSocketPath: () => join(TEST_DIR, "vellum.sock"),
|
|
36
35
|
getPidPath: () => join(TEST_DIR, "vellum.pid"),
|
|
37
36
|
getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
|
|
38
37
|
getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
|
|
@@ -72,19 +71,11 @@ mock.module("../tools/terminal/sandbox.js", () => ({
|
|
|
72
71
|
|
|
73
72
|
import { loadSkillCatalog } from "../config/skills.js";
|
|
74
73
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
75
|
-
import {
|
|
74
|
+
import { executeDeleteManagedSkill } from "../tools/skills/delete-managed.js";
|
|
76
75
|
import { SkillLoadTool } from "../tools/skills/load.js";
|
|
77
|
-
import {
|
|
76
|
+
import { executeScaffoldManagedSkill } from "../tools/skills/scaffold-managed.js";
|
|
78
77
|
import type { ToolContext } from "../tools/types.js";
|
|
79
78
|
|
|
80
|
-
const scaffoldTool = new (ScaffoldManagedSkillTool as any)() as InstanceType<
|
|
81
|
-
typeof ScaffoldManagedSkillTool
|
|
82
|
-
>;
|
|
83
|
-
|
|
84
|
-
const deleteTool = new (DeleteManagedSkillTool as any)() as InstanceType<
|
|
85
|
-
typeof DeleteManagedSkillTool
|
|
86
|
-
>;
|
|
87
|
-
|
|
88
79
|
function makeContext(): ToolContext {
|
|
89
80
|
return {
|
|
90
81
|
workingDir: "/tmp",
|
|
@@ -106,7 +97,7 @@ afterEach(() => {
|
|
|
106
97
|
describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete", () => {
|
|
107
98
|
test("full lifecycle: create skill, verify in catalog and prompt, then delete", async () => {
|
|
108
99
|
// Step 1: Scaffold a managed skill
|
|
109
|
-
const scaffoldResult = await
|
|
100
|
+
const scaffoldResult = await executeScaffoldManagedSkill(
|
|
110
101
|
{
|
|
111
102
|
skill_id: "lifecycle-test",
|
|
112
103
|
name: "Lifecycle Test",
|
|
@@ -143,7 +134,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
143
134
|
expect(prompt).toContain("## Dynamic Skill Authoring Workflow");
|
|
144
135
|
|
|
145
136
|
// Step 5: Delete the skill
|
|
146
|
-
const deleteResult = await
|
|
137
|
+
const deleteResult = await executeDeleteManagedSkill(
|
|
147
138
|
{
|
|
148
139
|
skill_id: "lifecycle-test",
|
|
149
140
|
},
|
|
@@ -173,7 +164,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
173
164
|
const ctx = makeContext();
|
|
174
165
|
|
|
175
166
|
// Create initial skill
|
|
176
|
-
await
|
|
167
|
+
await executeScaffoldManagedSkill(
|
|
177
168
|
{
|
|
178
169
|
skill_id: "overwrite-test",
|
|
179
170
|
name: "V1",
|
|
@@ -184,7 +175,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
184
175
|
);
|
|
185
176
|
|
|
186
177
|
// Overwrite with updated content
|
|
187
|
-
const result = await
|
|
178
|
+
const result = await executeScaffoldManagedSkill(
|
|
188
179
|
{
|
|
189
180
|
skill_id: "overwrite-test",
|
|
190
181
|
name: "V2",
|
|
@@ -215,7 +206,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
215
206
|
});
|
|
216
207
|
|
|
217
208
|
test("delete non-existent skill returns error", async () => {
|
|
218
|
-
const result = await
|
|
209
|
+
const result = await executeDeleteManagedSkill(
|
|
219
210
|
{
|
|
220
211
|
skill_id: "does-not-exist",
|
|
221
212
|
},
|
|
@@ -233,7 +224,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
233
224
|
>;
|
|
234
225
|
|
|
235
226
|
// Step 1: Scaffold a skill directly
|
|
236
|
-
const scaffoldResult = await
|
|
227
|
+
const scaffoldResult = await executeScaffoldManagedSkill(
|
|
237
228
|
{
|
|
238
229
|
skill_id: "chain-test",
|
|
239
230
|
name: "Chain Test",
|
|
@@ -262,7 +253,7 @@ describe("managed skill lifecycle: scaffold โ catalog โ prompt โ delete",
|
|
|
262
253
|
expect(loadContent).toContain("echo chain-test-ok");
|
|
263
254
|
|
|
264
255
|
// Step 3: Clean up
|
|
265
|
-
const deleteResult = await
|
|
256
|
+
const deleteResult = await executeDeleteManagedSkill(
|
|
266
257
|
{ skill_id: "chain-test" },
|
|
267
258
|
ctx,
|
|
268
259
|
);
|
|
@@ -20,6 +20,8 @@ import {
|
|
|
20
20
|
test,
|
|
21
21
|
} from "bun:test";
|
|
22
22
|
|
|
23
|
+
import { parse as parseYaml } from "yaml";
|
|
24
|
+
|
|
23
25
|
let TEST_DIR = "";
|
|
24
26
|
|
|
25
27
|
mock.module("../util/platform.js", () => ({
|
|
@@ -104,11 +106,9 @@ describe("buildSkillMarkdown", () => {
|
|
|
104
106
|
emoji: "๐งช",
|
|
105
107
|
});
|
|
106
108
|
expect(result).toContain("metadata:");
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const json = JSON.parse(metadataLine!.slice("metadata: ".length));
|
|
111
|
-
expect(json.vellum.emoji).toBe("๐งช");
|
|
109
|
+
const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
|
|
110
|
+
const parsed = parseYaml(fmMatch![1]);
|
|
111
|
+
expect(parsed.metadata.vellum.emoji).toBe("๐งช");
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
test("includes user-invocable=false in metadata.vellum", () => {
|
|
@@ -118,11 +118,9 @@ describe("buildSkillMarkdown", () => {
|
|
|
118
118
|
bodyMarkdown: "Body.",
|
|
119
119
|
userInvocable: false,
|
|
120
120
|
});
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const json = JSON.parse(metadataLine!.slice("metadata: ".length));
|
|
125
|
-
expect(json.vellum["user-invocable"]).toBe(false);
|
|
121
|
+
const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
|
|
122
|
+
const parsed = parseYaml(fmMatch![1]);
|
|
123
|
+
expect(parsed.metadata.vellum["user-invocable"]).toBe(false);
|
|
126
124
|
});
|
|
127
125
|
|
|
128
126
|
test("includes disable-model-invocation in metadata.vellum", () => {
|
|
@@ -132,11 +130,9 @@ describe("buildSkillMarkdown", () => {
|
|
|
132
130
|
bodyMarkdown: "Body.",
|
|
133
131
|
disableModelInvocation: true,
|
|
134
132
|
});
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const json = JSON.parse(metadataLine!.slice("metadata: ".length));
|
|
139
|
-
expect(json.vellum["disable-model-invocation"]).toBe(true);
|
|
133
|
+
const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
|
|
134
|
+
const parsed = parseYaml(fmMatch![1]);
|
|
135
|
+
expect(parsed.metadata.vellum["disable-model-invocation"]).toBe(true);
|
|
140
136
|
});
|
|
141
137
|
|
|
142
138
|
test("escapes double quotes in name and description", () => {
|
|
@@ -201,18 +197,16 @@ describe("buildSkillMarkdown", () => {
|
|
|
201
197
|
expect(skill!.name).toBe("path\\name");
|
|
202
198
|
});
|
|
203
199
|
|
|
204
|
-
test("includes field emits
|
|
200
|
+
test("includes field emits YAML list in metadata.vellum", () => {
|
|
205
201
|
const result = buildSkillMarkdown({
|
|
206
202
|
name: "Parent",
|
|
207
203
|
description: "Has children",
|
|
208
204
|
bodyMarkdown: "Body.",
|
|
209
205
|
includes: ["child-a", "child-b"],
|
|
210
206
|
});
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const json = JSON.parse(metadataLine!.slice("metadata: ".length));
|
|
215
|
-
expect(json.vellum.includes).toEqual(["child-a", "child-b"]);
|
|
207
|
+
const fmMatch = result.match(/^---\n([\s\S]*?)\n---/);
|
|
208
|
+
const parsed = parseYaml(fmMatch![1]);
|
|
209
|
+
expect(parsed.metadata.vellum.includes).toEqual(["child-a", "child-b"]);
|
|
216
210
|
});
|
|
217
211
|
|
|
218
212
|
test("omits metadata when no vellum fields provided", () => {
|
|
@@ -788,3 +782,82 @@ describe("validateManagedSkillId edge cases", () => {
|
|
|
788
782
|
expect(validateManagedSkillId("a1.b2-c3_d4")).toBeNull();
|
|
789
783
|
});
|
|
790
784
|
});
|
|
785
|
+
|
|
786
|
+
describe("YAML metadata round-trip", () => {
|
|
787
|
+
test("all vellum fields round-trip through write and load", () => {
|
|
788
|
+
// Create a managed skill with every vellum metadata field populated
|
|
789
|
+
createManagedSkill({
|
|
790
|
+
id: "yaml-roundtrip-all",
|
|
791
|
+
name: "Full Metadata Skill",
|
|
792
|
+
description: "Tests all vellum fields round-trip correctly",
|
|
793
|
+
bodyMarkdown: "Full metadata body.",
|
|
794
|
+
emoji: "๐ฌ",
|
|
795
|
+
userInvocable: false,
|
|
796
|
+
disableModelInvocation: true,
|
|
797
|
+
includes: ["child-a", "child-b"],
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
// Load it back via loadSkillCatalog
|
|
801
|
+
const catalog = loadSkillCatalog(undefined, [join(TEST_DIR, "skills")]);
|
|
802
|
+
const skill = catalog.find((s) => s.id === "yaml-roundtrip-all");
|
|
803
|
+
expect(skill).toBeDefined();
|
|
804
|
+
|
|
805
|
+
// Verify all fields are correctly preserved
|
|
806
|
+
expect(skill!.name).toBe("Full Metadata Skill");
|
|
807
|
+
expect(skill!.description).toBe(
|
|
808
|
+
"Tests all vellum fields round-trip correctly",
|
|
809
|
+
);
|
|
810
|
+
expect(skill!.emoji).toBe("๐ฌ");
|
|
811
|
+
expect(skill!.userInvocable).toBe(false);
|
|
812
|
+
expect(skill!.disableModelInvocation).toBe(true);
|
|
813
|
+
expect(skill!.includes).toEqual(["child-a", "child-b"]);
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
test("hand-authored YAML nested metadata parses correctly", () => {
|
|
817
|
+
// Manually write a SKILL.md with YAML-style nested metadata matching
|
|
818
|
+
// the format used in skills/ directory (bundled skills format)
|
|
819
|
+
const skillDir = join(TEST_DIR, "skills", "yaml-nested-test");
|
|
820
|
+
mkdirSync(skillDir, { recursive: true });
|
|
821
|
+
writeFileSync(
|
|
822
|
+
join(skillDir, "SKILL.md"),
|
|
823
|
+
[
|
|
824
|
+
"---",
|
|
825
|
+
"name: yaml-nested-skill",
|
|
826
|
+
"description: Hand-authored YAML nested metadata test",
|
|
827
|
+
'compatibility: "Designed for Vellum personal assistants"',
|
|
828
|
+
"metadata:",
|
|
829
|
+
' emoji: "๐งช"',
|
|
830
|
+
" vellum:",
|
|
831
|
+
' display-name: "YAML Nested Skill"',
|
|
832
|
+
" user-invocable: false",
|
|
833
|
+
" disable-model-invocation: true",
|
|
834
|
+
" os:",
|
|
835
|
+
` - "${process.platform}"`,
|
|
836
|
+
" includes:",
|
|
837
|
+
' - "child-a"',
|
|
838
|
+
' - "child-b"',
|
|
839
|
+
"---",
|
|
840
|
+
"",
|
|
841
|
+
"Hand-authored body content.",
|
|
842
|
+
"",
|
|
843
|
+
].join("\n"),
|
|
844
|
+
);
|
|
845
|
+
|
|
846
|
+
const catalog = loadSkillCatalog(undefined, [join(TEST_DIR, "skills")]);
|
|
847
|
+
const skill = catalog.find((s) => s.id === "yaml-nested-test");
|
|
848
|
+
expect(skill).toBeDefined();
|
|
849
|
+
|
|
850
|
+
// Verify all nested vellum fields are correctly parsed
|
|
851
|
+
expect(skill!.name).toBe("yaml-nested-skill");
|
|
852
|
+
expect(skill!.description).toBe("Hand-authored YAML nested metadata test");
|
|
853
|
+
expect(skill!.displayName).toBe("YAML Nested Skill");
|
|
854
|
+
expect(skill!.userInvocable).toBe(false);
|
|
855
|
+
expect(skill!.disableModelInvocation).toBe(true);
|
|
856
|
+
expect(skill!.emoji).toBe("๐งช");
|
|
857
|
+
expect(skill!.includes).toEqual(["child-a", "child-b"]);
|
|
858
|
+
|
|
859
|
+
// Verify os is parsed into metadata
|
|
860
|
+
expect(skill!.metadata).toBeDefined();
|
|
861
|
+
expect(skill!.metadata!.os).toEqual([process.platform]);
|
|
862
|
+
});
|
|
863
|
+
});
|
|
@@ -32,7 +32,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
32
32
|
isMacOS: () => process.platform === "darwin",
|
|
33
33
|
isLinux: () => process.platform === "linux",
|
|
34
34
|
isWindows: () => process.platform === "win32",
|
|
35
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
36
35
|
getPidPath: () => join(testDir, "test.pid"),
|
|
37
36
|
getDbPath: () => join(testDir, "test.db"),
|
|
38
37
|
getLogPath: () => join(testDir, "test.log"),
|