@vellumai/assistant 0.4.44 → 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 +34 -31
- package/README.md +4 -4
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -197
- 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 -1
- 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-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 +4 -11
- 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 +25 -1
- 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 +7 -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__/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__/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-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 -2
- 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 +0 -1
- 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__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -3
- 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 +80 -4
- 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 -1
- 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 -1
- 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-create.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-cancel.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 +25 -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 +1 -1
- 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 +49 -24
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- 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 -67
- 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 +2 -1
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/ride-shotgun-handler.ts +2 -42
- package/src/daemon/server.ts +43 -10
- package/src/daemon/session-agent-loop-handlers.ts +48 -7
- 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 -0
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +19 -97
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +77 -13
- 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/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 -29
- 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 +10 -14
- 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 +29 -30
- 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 +2 -2
- 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 +2 -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 +7 -7
- 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 -4
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +0 -23
- 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/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +2 -3
- package/src/runtime/routes/approval-routes.ts +1 -3
- 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 +230 -46
- package/src/runtime/routes/diagnostics-routes.ts +63 -29
- 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 -261
- 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 +0 -1
- 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/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 +0 -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__/managed-twitter-guardrails.test.ts +0 -357
- 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 -475
- 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 -885
- 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 -108
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
- package/src/cli/commands/twitter/index.ts +0 -420
- package/src/cli/commands/twitter/oauth-client.ts +0 -60
- package/src/cli/commands/twitter/router.ts +0 -351
- package/src/cli/commands/twitter/types.ts +0 -30
- 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 -136
- 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 -206
- 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/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 -408
- /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
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: twitter
|
|
3
|
-
description: Read and post on X (formerly Twitter) via OAuth or managed mode
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"𝕏","vellum":{"display-name":"X","user-invocable":true}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You are an X (formerly Twitter) assistant. Use the `bash` tool to run `assistant x`, `assistant config`, and `assistant oauth` CLI commands.
|
|
9
|
-
|
|
10
|
-
## Connection Options
|
|
11
|
-
|
|
12
|
-
There are two supported ways to connect to X. Choose whichever fits the user's situation.
|
|
13
|
-
|
|
14
|
-
### Managed mode (platform-hosted credentials)
|
|
15
|
-
|
|
16
|
-
When `twitter.integrationMode` is set to `managed`, the platform holds the OAuth credentials and proxies Twitter API calls on behalf of the assistant. No local OAuth setup is needed.
|
|
17
|
-
|
|
18
|
-
- Supports: **post**, **reply**, and **read** operations (routed through the platform proxy)
|
|
19
|
-
- Prerequisites: The assistant must be registered with the platform (`PLATFORM_ASSISTANT_ID`), have an API key (`credential:vellum:assistant_api_key`), and the assistant owner must have connected their Twitter account on the platform.
|
|
20
|
-
|
|
21
|
-
**Error scenarios in managed mode:**
|
|
22
|
-
- *"Assistant not bootstrapped"* -- The assistant API key is missing. Run setup.
|
|
23
|
-
- *"Local assistant not registered with platform"* -- `PLATFORM_ASSISTANT_ID` is not set.
|
|
24
|
-
- *"Connect Twitter in Settings as the assistant owner"* -- The owner hasn't connected their X account on the platform yet.
|
|
25
|
-
- *"Sign in as the assistant owner"* -- The current user is not the assistant owner.
|
|
26
|
-
- *"Reconnect Twitter or retry"* -- The platform's OAuth token may have expired. Reconnect on the platform.
|
|
27
|
-
|
|
28
|
-
**Architecture notes for managed mode:**
|
|
29
|
-
|
|
30
|
-
- **Assistant hosting mode and Twitter credential mode are separate concepts.** An assistant can be self-hosted (local daemon) yet use managed Twitter credentials, or platform-hosted yet use local BYO OAuth. The `twitter.integrationMode` config controls credential mode; the assistant's hosting mode is determined by its lockfile entry.
|
|
31
|
-
- **Managed Twitter is bound to the assistant owner.** Only the owner of the assistant (as determined by the platform) can connect or disconnect the Twitter account. Non-owner users receive a `403` with an `owner_only` or `owner_credential_required` error code.
|
|
32
|
-
- **Connect/disconnect/status uses desktop authentication.** The macOS Settings UI calls the platform's Twitter OAuth endpoints using the user's WorkOS-issued token. This authenticates the human user, not the assistant.
|
|
33
|
-
- **Actual Twitter API calls use assistant-level API key authentication.** At runtime, the proxy client sends `Authorization: Api-Key {assistant_api_key}` -- it never includes user-level tokens. This ensures the assistant's identity is what the platform uses for token lookup and rate limiting.
|
|
34
|
-
- **The platform proxy handles token storage and refresh.** OAuth tokens are stored server-side by the platform. The assistant never sees or stores the Twitter OAuth access/refresh tokens in managed mode. Token refresh is handled transparently by the proxy.
|
|
35
|
-
- **The daemon auth handler never starts local OAuth in managed mode.** When `integrationMode` is `managed`, `handleTwitterAuthStart` returns a managed-specific error code (`managed_auth_via_platform` or `managed_missing_api_key`) and never calls `orchestrateOAuthConnect`. This is a critical guardrail to prevent credential confusion.
|
|
36
|
-
|
|
37
|
-
### OAuth (recommended with X developer credentials)
|
|
38
|
-
|
|
39
|
-
OAuth uses the official X API v2. It is the most reliable local connection method.
|
|
40
|
-
|
|
41
|
-
- Supports: **post** and **reply**
|
|
42
|
-
- Setup: Collect the OAuth Client ID (and optional Client Secret) from the user in chat using `credential_store` with `action: "prompt"` (canonical field names: `client_id`, `client_secret`), then initiate the `twitter_auth_start` flow. See the **First-Use Decision Flow** for the full sequence.
|
|
43
|
-
|
|
44
|
-
## First-Use Decision Flow
|
|
45
|
-
|
|
46
|
-
When the user triggers a Twitter operation and no connection has been configured yet, follow these steps:
|
|
47
|
-
|
|
48
|
-
1. **Check current status:**
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
# Check if OAuth token is available
|
|
52
|
-
assistant oauth token twitter --json
|
|
53
|
-
|
|
54
|
-
# Check integration mode
|
|
55
|
-
assistant config get twitter.integrationMode
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
2. **Determine the best path:**
|
|
59
|
-
- If managed mode prerequisites are met (integration mode is `managed`, assistant is registered with the platform, API key is present, and the owner has connected their Twitter account), use managed mode.
|
|
60
|
-
- Otherwise, guide the user through OAuth setup.
|
|
61
|
-
|
|
62
|
-
3. **Execute setup for the chosen path:**
|
|
63
|
-
- If managed: Confirm prerequisites are satisfied. Managed mode requires no local setup beyond platform registration.
|
|
64
|
-
- If OAuth: Collect the credentials in-chat using the secure credential prompt, then connect. Follow the **OAuth Setup Sequence** below.
|
|
65
|
-
|
|
66
|
-
### OAuth Setup Sequence
|
|
67
|
-
|
|
68
|
-
When the user chooses OAuth, collect their X developer credentials conversationally using the secure UI. The OAuth flow delegates to the generic connect orchestrator, which resolves the Twitter provider profile, computes scopes via policy, opens the X authorization page, verifies the user's identity, and stores tokens. The orchestrator also manages stale refresh-token cleanup and enforces integration-mode guards.
|
|
69
|
-
|
|
70
|
-
1. **Collect the Client ID securely:**
|
|
71
|
-
Call `credential_store` with `action: "prompt"`, `service: "integration:twitter"`, `field: "client_id"`, `label: "X (Twitter) OAuth Client ID"`, `description: "Enter the Client ID from your X Developer App"`, and `placeholder: "your-client-id"`.
|
|
72
|
-
|
|
73
|
-
2. **Collect the Client Secret (if applicable):**
|
|
74
|
-
Ask the user if their X app uses a confidential client (has a Client Secret). If yes, call `credential_store` with `action: "prompt"`, `service: "integration:twitter"`, `field: "client_secret"`, `label: "X (Twitter) OAuth Client Secret"`, `description: "Enter the Client Secret from your X Developer App (leave blank if using a public client)"`, and `placeholder: "your-client-secret"`.
|
|
75
|
-
|
|
76
|
-
3. **Initiate the OAuth flow:**
|
|
77
|
-
Trigger the Twitter auth start flow. The connect orchestrator resolves the Twitter provider profile, computes scopes via policy, opens the X authorization page, verifies the user's identity, and stores tokens. Wait for the auth result.
|
|
78
|
-
|
|
79
|
-
4. **Confirm success:**
|
|
80
|
-
Tell the user: "Great, your X account is connected! You can always update these credentials from the Settings page."
|
|
81
|
-
|
|
82
|
-
## Failure Recovery Flow
|
|
83
|
-
|
|
84
|
-
When a Twitter operation fails, follow these steps:
|
|
85
|
-
|
|
86
|
-
1. **Detect the failure type from the error output:**
|
|
87
|
-
- `OAuth is not configured` -- the user chose OAuth but credentials are not set up.
|
|
88
|
-
- `Twitter API error (401)` -- OAuth token may be expired or revoked.
|
|
89
|
-
- `Cannot connect to assistant` -- the Vellum assistant is not running.
|
|
90
|
-
- `proxyErrorCode: "owner_credential_required"` -- managed mode: the assistant owner has not connected their X account on the platform.
|
|
91
|
-
- `proxyErrorCode: "owner_only"` -- managed mode: the current user is not the assistant owner.
|
|
92
|
-
- `proxyErrorCode: "auth_failure"` or `"upstream_failure"` -- managed mode: platform token issue, reconnect Twitter on the platform.
|
|
93
|
-
- `proxyErrorCode: "missing_assistant_api_key"` -- managed mode: the assistant is not bootstrapped.
|
|
94
|
-
- `proxyErrorCode: "missing_platform_assistant_id"` -- managed mode: the assistant is not registered with the platform.
|
|
95
|
-
|
|
96
|
-
2. **Explain the likely cause clearly** to the user.
|
|
97
|
-
|
|
98
|
-
3. **Suggest recovery steps:**
|
|
99
|
-
- If OAuth failed or is not configured: suggest reconnecting OAuth credentials or checking that the X developer app credentials are correct.
|
|
100
|
-
- If managed mode failed with a credential or ownership error: explain the specific issue and guide the user to resolve it on the platform (connect Twitter, sign in as owner, etc.).
|
|
101
|
-
|
|
102
|
-
## Posting
|
|
103
|
-
|
|
104
|
-
Before posting, check the integration mode:
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
MODE=$(assistant config get twitter.integrationMode)
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Then post based on the mode:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
# Managed mode -- route through platform proxy (no local token needed):
|
|
114
|
-
assistant x post "The post text here" --managed
|
|
115
|
-
|
|
116
|
-
# With OAuth token:
|
|
117
|
-
TOKEN=$(assistant oauth token twitter)
|
|
118
|
-
assistant x post "The post text here" --oauth-token "$TOKEN"
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
When `twitter.integrationMode` is `managed`, always use `--managed`. The platform proxy handles authentication.
|
|
122
|
-
|
|
123
|
-
Returns JSON with `ok`, `tweetId`, `text`, `url`, and `pathUsed` fields. Share the URL with the user so they can verify the post. For managed mode errors, the response includes `proxyErrorCode` and `retryable` fields.
|
|
124
|
-
|
|
125
|
-
## Replying
|
|
126
|
-
|
|
127
|
-
Same setup as posting -- check integration mode first, then:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
# Managed mode:
|
|
131
|
-
assistant x reply <tweetUrl> "The reply text here" --managed
|
|
132
|
-
|
|
133
|
-
# Local OAuth:
|
|
134
|
-
TOKEN=$(assistant oauth token twitter)
|
|
135
|
-
assistant x reply <tweetUrl> "The reply text here" --oauth-token "$TOKEN"
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
The first argument is a tweet URL (e.g. `https://x.com/user/status/123456`) or a bare tweet ID.
|
|
139
|
-
|
|
140
|
-
## Reading
|
|
141
|
-
|
|
142
|
-
Read operations are available in managed mode. They route through the platform proxy.
|
|
143
|
-
|
|
144
|
-
### User timeline
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
assistant x timeline <screenName> [--count N]
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Returns `user` and `tweets` array.
|
|
151
|
-
|
|
152
|
-
### Single tweet + replies
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
assistant x tweet <tweetIdOrUrl>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Returns the focal tweet and its reply thread.
|
|
159
|
-
|
|
160
|
-
### Search
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
assistant x search "query" [--product Top|Latest|People|Media]
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Workflows
|
|
167
|
-
|
|
168
|
-
### Check Mentions
|
|
169
|
-
|
|
170
|
-
When the user asks to check mentions, check X, or see what's happening:
|
|
171
|
-
|
|
172
|
-
1. Fetch their recent tweets to see replies: `assistant x timeline <theirScreenName> --count 10 --json`
|
|
173
|
-
2. Summarize what needs attention:
|
|
174
|
-
- Group by type: replies to their tweets, mentions
|
|
175
|
-
- For anything that looks like it needs a reply, fetch the full thread with `assistant x tweet <tweetId>` to understand context
|
|
176
|
-
- Prioritize: direct questions > mentions > engagement
|
|
177
|
-
3. For items that need replies, draft a response and ask the user to approve before sending with `assistant x reply`
|
|
178
|
-
|
|
179
|
-
Present the summary as a scannable list, not a wall of text. Lead with action items.
|
|
180
|
-
|
|
181
|
-
### Research a Topic
|
|
182
|
-
|
|
183
|
-
When the user wants to understand what people are saying about something:
|
|
184
|
-
|
|
185
|
-
1. Search: `assistant x search "topic" --count 20 --json`
|
|
186
|
-
2. For the most interesting tweets, fetch threads: `assistant x tweet <tweetId>`
|
|
187
|
-
3. Summarize: key themes, notable voices, sentiment, and any emerging consensus
|
|
188
|
-
4. If the user wants to engage, draft a post or reply that adds to the conversation
|
|
189
|
-
|
|
190
|
-
### Engagement Check
|
|
191
|
-
|
|
192
|
-
When the user wants to see how their posts are performing:
|
|
193
|
-
|
|
194
|
-
1. Fetch their recent tweets: `assistant x timeline <screenName> --count 20 --json`
|
|
195
|
-
2. For each tweet, note engagement signals from the text/metadata
|
|
196
|
-
3. Summarize: which posts got traction, who's engaging, any conversations worth continuing
|
|
197
|
-
|
|
198
|
-
## Tips
|
|
199
|
-
|
|
200
|
-
- Keep posts under 280 characters
|
|
201
|
-
- All `screenName` arguments should be without the `@` prefix
|
|
202
|
-
- All commands return JSON with an `ok` field
|
|
203
|
-
- When drafting replies, match the tone of the conversation -- casual threads get casual replies
|
|
204
|
-
- Always show the user what you're about to post and get approval before sending
|
|
205
|
-
- If an operation fails, check `assistant x status --json` to diagnose the issue before retrying
|
|
206
|
-
- The `post` and `reply` commands include a `pathUsed` field in their response so you can tell the user which connection method was used
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<rect width="16" height="16" fill="#ffffff"/>
|
|
3
|
-
<rect x="2" y="2" width="12" height="12" fill="#000000"/>
|
|
4
|
-
<rect x="4" y="5" width="2" height="1" fill="#ffffff"/>
|
|
5
|
-
<rect x="5" y="4" width="1" height="3" fill="#ffffff"/>
|
|
6
|
-
<rect x="6" y="5" width="2" height="1" fill="#ffffff"/>
|
|
7
|
-
<rect x="10" y="5" width="2" height="1" fill="#ffffff"/>
|
|
8
|
-
<rect x="11" y="4" width="1" height="3" fill="#ffffff"/>
|
|
9
|
-
<rect x="12" y="5" width="2" height="1" fill="#ffffff"/>
|
|
10
|
-
<rect x="4" y="9" width="1" height="2" fill="#ffffff"/>
|
|
11
|
-
<rect x="5" y="8" width="6" height="1" fill="#ffffff"/>
|
|
12
|
-
<rect x="11" y="9" width="1" height="2" fill="#ffffff"/>
|
|
13
|
-
<rect x="5" y="11" width="6" height="1" fill="#ffffff"/>
|
|
14
|
-
</svg>
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: typescript-eval
|
|
3
|
-
description: Test TypeScript code snippets before persisting as skills
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"🧪","vellum":{"display-name":"TypeScript Evaluation","user-invocable":false}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# TypeScript Evaluation
|
|
9
|
-
|
|
10
|
-
When you need to test a TypeScript snippet before persisting it as a managed skill, use `bash` directly.
|
|
11
|
-
|
|
12
|
-
## Workflow
|
|
13
|
-
|
|
14
|
-
### 1. Write the snippet to a temp file
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
bash command="mkdir -p /tmp/vellum-eval && cat > /tmp/vellum-eval/snippet.ts << 'SNIPPET_EOF'
|
|
18
|
-
<your code here>
|
|
19
|
-
SNIPPET_EOF"
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### 2. Run it with bun
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
bash command="bun run /tmp/vellum-eval/snippet.ts" timeout_seconds=10
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 3. For function-based testing
|
|
29
|
-
|
|
30
|
-
If the snippet exports a `default` or `run` function, write a runner script:
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
bash command="cat > /tmp/vellum-eval/runner.ts << 'RUNNER_EOF'
|
|
34
|
-
import * as mod from './snippet.ts';
|
|
35
|
-
const fn = (mod as any).default ?? (mod as any).run;
|
|
36
|
-
const input = {}; // mock input
|
|
37
|
-
const result = await fn(input);
|
|
38
|
-
console.log(JSON.stringify(result, null, 2));
|
|
39
|
-
RUNNER_EOF"
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Then run the runner:
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
bash command="bun run /tmp/vellum-eval/runner.ts" timeout_seconds=10
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 4. Clean up
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
bash command="rm -rf /tmp/vellum-eval/"
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Guidelines
|
|
55
|
-
|
|
56
|
-
- **Iteration limit:** Max 3 attempts before asking the user for guidance.
|
|
57
|
-
- **After successful test:** Persist with `scaffold_managed_skill` only after explicit user consent.
|
|
58
|
-
- **Timeout:** Use `timeout_seconds=10` (or up to 20 for complex snippets).
|
|
59
|
-
- **Error handling:** Read stdout/stderr from the bash output to diagnose failures.
|
|
60
|
-
- **Never persist or delete skills without explicit user confirmation.**
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: vercel-token-setup
|
|
3
|
-
description: Set up a Vercel API token for publishing apps using browser automation
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"▲","vellum":{"display-name":"Vercel Token Setup","includes":["browser"],"credential-setup-for":"vercel:api_token"}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You are helping your user set up a Vercel API token so they can publish apps to the web.
|
|
9
|
-
|
|
10
|
-
## Client Check
|
|
11
|
-
|
|
12
|
-
Determine whether the user has browser automation available (macOS desktop app) or is on a non-interactive channel (Telegram, SMS, etc.).
|
|
13
|
-
|
|
14
|
-
- **macOS desktop app**: Follow the **Automated Setup** path below.
|
|
15
|
-
- **Telegram or other channel** (no browser automation): Follow the **Manual Setup for Channels** path below.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# Path A: Manual Setup for Channels (Telegram, SMS, etc.)
|
|
20
|
-
|
|
21
|
-
When the user is on Telegram or any non-macOS client, walk them through a text-based setup. No browser automation is used — the user follows links and performs each action manually.
|
|
22
|
-
|
|
23
|
-
### Channel Step 1: Confirm and Explain
|
|
24
|
-
|
|
25
|
-
Tell the user:
|
|
26
|
-
|
|
27
|
-
> **Setting up Vercel API Token**
|
|
28
|
-
>
|
|
29
|
-
> Since I can't automate the browser from here, I'll walk you through each step with direct links. You'll need:
|
|
30
|
-
> 1. A Vercel account (free tier works)
|
|
31
|
-
> 2. About 2 minutes
|
|
32
|
-
>
|
|
33
|
-
> Ready to start?
|
|
34
|
-
|
|
35
|
-
If the user declines, acknowledge and stop.
|
|
36
|
-
|
|
37
|
-
### Channel Step 2: Create the Token
|
|
38
|
-
|
|
39
|
-
Tell the user:
|
|
40
|
-
|
|
41
|
-
> **Step 1: Create an API token**
|
|
42
|
-
>
|
|
43
|
-
> Open this link to go to your Vercel tokens page:
|
|
44
|
-
> https://vercel.com/account/tokens
|
|
45
|
-
>
|
|
46
|
-
> 1. Click **"Create"** (or **"Create Token"**)
|
|
47
|
-
> 2. Set the token name to **"Vellum Assistant"**
|
|
48
|
-
> 3. Select scope: **"Full Account"**
|
|
49
|
-
> 4. Set expiration to the longest option available (or **"No Expiration"** if offered)
|
|
50
|
-
> 5. Click **"Create Token"**
|
|
51
|
-
>
|
|
52
|
-
> A token value will appear — **copy it now**, as it's only shown once.
|
|
53
|
-
|
|
54
|
-
### Channel Step 3: Store the Token
|
|
55
|
-
|
|
56
|
-
Tell the user:
|
|
57
|
-
|
|
58
|
-
> **Step 2: Send me the token**
|
|
59
|
-
>
|
|
60
|
-
> Please paste the token value into the secure prompt below.
|
|
61
|
-
|
|
62
|
-
Present the secure prompt:
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
credential_store prompt:
|
|
66
|
-
service: "vercel"
|
|
67
|
-
field: "api_token"
|
|
68
|
-
label: "Vercel API Token"
|
|
69
|
-
description: "Paste the API token you just created on vercel.com"
|
|
70
|
-
placeholder: "Enter your Vercel API token"
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Wait for the user to complete the prompt. Once received, store it:
|
|
74
|
-
|
|
75
|
-
```
|
|
76
|
-
credential_store store:
|
|
77
|
-
service: "vercel"
|
|
78
|
-
field: "api_token"
|
|
79
|
-
value: "<the token the user provided>"
|
|
80
|
-
allowedTools: ["publish_page", "unpublish_page"]
|
|
81
|
-
allowedDomains: ["api.vercel.com"]
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### Channel Step 4: Done!
|
|
85
|
-
|
|
86
|
-
> **Vercel is connected!** You can now publish apps to the web. Try clicking Publish on any app you've built.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
# Path B: Automated Setup (macOS Desktop App)
|
|
91
|
-
|
|
92
|
-
You will automate Vercel token creation via the browser while the user watches. The user's only manual action is signing in to Vercel (if needed) and one copy-paste for the token value.
|
|
93
|
-
|
|
94
|
-
## Browser Interaction Principles
|
|
95
|
-
|
|
96
|
-
Vercel's UI may change over time. Do NOT memorize or depend on specific element IDs, CSS selectors, or DOM structures. Instead:
|
|
97
|
-
|
|
98
|
-
1. **Screenshot first, act second.** Before every interaction, take a `browser_screenshot` to see the current visual state. Use `browser_snapshot` to find interactive elements.
|
|
99
|
-
2. **Adapt to what you see.** If a button's label or position differs from what you expect, use the screenshot to find the correct element.
|
|
100
|
-
3. **Verify after every action.** After clicking, typing, or navigating, take a new screenshot to confirm the action succeeded.
|
|
101
|
-
4. **Never assume DOM structure.** Use the snapshot to identify what's on the page and interact accordingly.
|
|
102
|
-
5. **When stuck, screenshot and describe.** If you cannot find an expected element after 2 attempts, take a screenshot, describe what you see to the user, and ask for guidance.
|
|
103
|
-
|
|
104
|
-
## Anti-Loop Guardrails
|
|
105
|
-
|
|
106
|
-
Each step has a **retry budget of 3 attempts**. An attempt is one try at the step's primary action (e.g., clicking a button, filling a form). If a step fails after 3 attempts:
|
|
107
|
-
|
|
108
|
-
1. **Stop trying.** Do not continue retrying the same approach.
|
|
109
|
-
2. **Fall back to manual.** Tell the user what you were trying to do and ask them to complete that step manually in the browser. Give them the direct URL and clear text instructions.
|
|
110
|
-
3. **Resume automation** at the next step once the user confirms the manual step is done.
|
|
111
|
-
|
|
112
|
-
If **two or more steps** require manual fallback, abandon the automated flow entirely and switch to giving the user the remaining steps as clear text instructions with links.
|
|
113
|
-
|
|
114
|
-
## Things That Do Not Work — Do Not Attempt
|
|
115
|
-
|
|
116
|
-
These actions are technically impossible in the browser automation environment:
|
|
117
|
-
|
|
118
|
-
- **Downloading files.** `browser_click` on a Download button does not save files to disk.
|
|
119
|
-
- **Reading the token value from a screenshot.** The token IS visible in the creation dialog, but you MUST NOT attempt to read it from a screenshot — it is too easy to misread characters, and the value must be exact. Always use the `credential_store prompt` approach to let the user copy-paste it accurately.
|
|
120
|
-
- **Clipboard operations.** You cannot copy/paste via browser automation.
|
|
121
|
-
|
|
122
|
-
## Step 1: Single Upfront Confirmation
|
|
123
|
-
|
|
124
|
-
Tell the user:
|
|
125
|
-
|
|
126
|
-
> **Setting up your Vercel API token so we can publish your app...**
|
|
127
|
-
>
|
|
128
|
-
> Here's what will happen:
|
|
129
|
-
> 1. **A browser opens** to your Vercel account settings
|
|
130
|
-
> 2. **You sign in** (if not already signed in)
|
|
131
|
-
> 3. **I create the token** — you just watch
|
|
132
|
-
> 4. **One quick copy-paste** — I'll ask you to copy the token value into a secure prompt
|
|
133
|
-
>
|
|
134
|
-
> Takes about a minute. Ready?
|
|
135
|
-
|
|
136
|
-
If the user declines, acknowledge and stop. No further confirmations are needed after this point.
|
|
137
|
-
|
|
138
|
-
## Step 2: Open Vercel and Sign In
|
|
139
|
-
|
|
140
|
-
**Goal:** The user is signed in and the Vercel tokens page is loaded.
|
|
141
|
-
|
|
142
|
-
Navigate to `https://vercel.com/account/tokens`.
|
|
143
|
-
|
|
144
|
-
Take a screenshot and snapshot to check the page state:
|
|
145
|
-
- **Sign-in page:** Tell the user: "Please sign in to your Vercel account in the browser." Then auto-detect sign-in completion by polling screenshots every 5-10 seconds. Check if the current URL has moved away from the login/sign-in page to the tokens page. Do NOT ask the user to "let me know when you're done" — detect it automatically. Once sign-in is detected, tell the user: "Signed in! Creating your API token now..."
|
|
146
|
-
- **Already signed in:** Tell the user: "Already signed in — creating your API token now..." and continue immediately.
|
|
147
|
-
|
|
148
|
-
**Verify:** URL contains `vercel.com/account/tokens` and no sign-in overlay is visible.
|
|
149
|
-
|
|
150
|
-
## Step 3: Create Token
|
|
151
|
-
|
|
152
|
-
**Goal:** A new API token named "Vellum Assistant" is created.
|
|
153
|
-
|
|
154
|
-
Take a screenshot and snapshot. Find and click the button to create a new token (typically labeled "Create" or "Create Token").
|
|
155
|
-
|
|
156
|
-
On the creation form:
|
|
157
|
-
- Token name: **"Vellum Assistant"**
|
|
158
|
-
- Scope: Select **"Full Account"** (or the broadest scope available)
|
|
159
|
-
- Expiration: Select the longest option available, or **"No Expiration"** if offered
|
|
160
|
-
- Click create/submit
|
|
161
|
-
|
|
162
|
-
**Verify:** Take a screenshot. A dialog or section should now display the newly created token value.
|
|
163
|
-
|
|
164
|
-
## Step 4: Capture Token via Secure Prompt
|
|
165
|
-
|
|
166
|
-
**Goal:** The token value is securely captured and stored.
|
|
167
|
-
|
|
168
|
-
### CRITICAL — Token Capture Protocol
|
|
169
|
-
|
|
170
|
-
After token creation, Vercel shows the token value **once**. You MUST follow this exact sequence — **no improvisation**:
|
|
171
|
-
|
|
172
|
-
1. Tell the user: "Your token has been created! Please copy the token value shown on screen and paste it into the secure prompt below."
|
|
173
|
-
2. **IMMEDIATELY** present a `credential_store prompt` for the token. This is your ONLY next action.
|
|
174
|
-
3. Wait for the user to paste the token.
|
|
175
|
-
|
|
176
|
-
**Absolute prohibitions during this step:**
|
|
177
|
-
- Do NOT try to read the token value from the screenshot. It must come from the user via secure prompt to ensure accuracy.
|
|
178
|
-
- Do NOT navigate away from the page until the user has pasted the token.
|
|
179
|
-
- Do NOT click any download or copy buttons.
|
|
180
|
-
|
|
181
|
-
Present the secure prompt:
|
|
182
|
-
|
|
183
|
-
```
|
|
184
|
-
credential_store prompt:
|
|
185
|
-
service: "vercel"
|
|
186
|
-
field: "api_token"
|
|
187
|
-
label: "Vercel API Token"
|
|
188
|
-
description: "Copy the token value shown on the Vercel page and paste it here."
|
|
189
|
-
placeholder: "Enter your Vercel API token"
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
Wait for the user to complete the prompt. Once received, store it:
|
|
193
|
-
|
|
194
|
-
```
|
|
195
|
-
credential_store store:
|
|
196
|
-
service: "vercel"
|
|
197
|
-
field: "api_token"
|
|
198
|
-
value: "<the token the user provided>"
|
|
199
|
-
allowedTools: ["publish_page", "unpublish_page"]
|
|
200
|
-
allowedDomains: ["api.vercel.com"]
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
**Verify:** `credential_store list` shows `api_token` for `vercel`.
|
|
204
|
-
|
|
205
|
-
## Step 5: Done!
|
|
206
|
-
|
|
207
|
-
"**Vercel is connected!** Your API token is set up and ready to go. You can now publish apps to the web."
|
|
208
|
-
|
|
209
|
-
## Error Handling
|
|
210
|
-
|
|
211
|
-
- **Page load failures:** Retry navigation once. If it still fails, tell the user and ask them to check their internet connection.
|
|
212
|
-
- **Element not found:** Take a fresh screenshot to re-assess. The Vercel UI may have changed. Describe what you see and try alternative approaches. If stuck after 2 attempts, ask the user for guidance.
|
|
213
|
-
- **Token already exists with same name:** This is fine — Vercel allows multiple tokens with the same name. Proceed with creation.
|
|
214
|
-
- **Any unexpected state:** Take a `browser_screenshot`, describe what you see, and ask the user for guidance.
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: voice-setup
|
|
3
|
-
description: Complete voice configuration in chat — PTT key, wake word, microphone permissions, ElevenLabs TTS, and troubleshooting
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"🎙️","vellum":{"display-name":"Voice Setup","user-invocable":true,"includes":["elevenlabs-voice"],"os":["darwin"]}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You are helping the user set up and troubleshoot voice features (push-to-talk, wake word, text-to-speech) entirely within this conversation. Do NOT direct the user to the Settings page for initial setup — handle everything in-chat using the tools below.
|
|
9
|
-
|
|
10
|
-
## Available Tools
|
|
11
|
-
|
|
12
|
-
- `voice_config_update` — Change any voice setting (PTT key, wake word enabled/keyword/timeout, TTS voice ID)
|
|
13
|
-
- `open_system_settings` — Open macOS System Settings to a specific privacy pane
|
|
14
|
-
- `navigate_settings_tab` — Open the Vellum settings panel to the Voice tab
|
|
15
|
-
- `credential_store` — Collect API keys securely (for ElevenLabs TTS)
|
|
16
|
-
|
|
17
|
-
## Setup Flow
|
|
18
|
-
|
|
19
|
-
Walk the user through each section in order. Skip sections they don't need. Ask before proceeding to the next section.
|
|
20
|
-
|
|
21
|
-
### 1. Microphone Permission
|
|
22
|
-
|
|
23
|
-
Check `<channel_capabilities>` for `microphone_permission_granted`.
|
|
24
|
-
|
|
25
|
-
**If `false` or missing:**
|
|
26
|
-
|
|
27
|
-
1. Explain that macOS requires microphone permission for voice features.
|
|
28
|
-
2. Use `open_system_settings` with `pane: "microphone"` to open the right System Settings pane.
|
|
29
|
-
3. Tell the user: "I've opened System Settings to the Microphone section. Please toggle **Vellum Assistant** on, then come back here."
|
|
30
|
-
4. After they confirm, verify by checking capabilities on the next turn.
|
|
31
|
-
|
|
32
|
-
**If `true`:** Tell them microphone is already granted and move on.
|
|
33
|
-
|
|
34
|
-
### 2. Push-to-Talk Activation Key
|
|
35
|
-
|
|
36
|
-
Present common PTT key options:
|
|
37
|
-
|
|
38
|
-
- **Right Option** — Default, good general choice
|
|
39
|
-
- **Fn** — Dedicated key on most Mac keyboards
|
|
40
|
-
- **Right Command** — Easy to reach
|
|
41
|
-
- **Right Control** — Familiar from gaming
|
|
42
|
-
|
|
43
|
-
Ask which key they prefer, then use `voice_config_update` with `setting: "activation_key"` and the chosen value.
|
|
44
|
-
|
|
45
|
-
**Common issues to mention:**
|
|
46
|
-
|
|
47
|
-
- If they pick a key that conflicts with their emoji picker (Fn or Globe on newer Macs), warn them and suggest an alternative.
|
|
48
|
-
- If they use a terminal app heavily, warn that some keys may be captured by the terminal.
|
|
49
|
-
|
|
50
|
-
### 3. Wake Word (Optional)
|
|
51
|
-
|
|
52
|
-
Ask if they want to enable wake word detection (hands-free activation by saying a keyword).
|
|
53
|
-
|
|
54
|
-
**If yes:**
|
|
55
|
-
|
|
56
|
-
1. Use `voice_config_update` with `setting: "wake_word_enabled"`, `value: true`.
|
|
57
|
-
2. Ask what wake word they want. Common choices: "Hey Vellum", "Computer", "Jarvis", their assistant's name.
|
|
58
|
-
3. Use `voice_config_update` with `setting: "wake_word_keyword"` and their chosen word.
|
|
59
|
-
4. Ask about timeout (how long the mic stays active after wake word). Options: 5s, 10s (default), 15s, 30s, 60s.
|
|
60
|
-
5. Use `voice_config_update` with `setting: "wake_word_timeout"` and their chosen value.
|
|
61
|
-
|
|
62
|
-
**Speech Recognition permission:** Wake word requires Speech Recognition access. Check capabilities — if not granted, use `open_system_settings` with `pane: "speech_recognition"`.
|
|
63
|
-
|
|
64
|
-
### 4. Text-to-Speech / ElevenLabs (Optional)
|
|
65
|
-
|
|
66
|
-
Ask if they want high-quality text-to-speech voices via ElevenLabs (optional — standard TTS works without it).
|
|
67
|
-
|
|
68
|
-
If yes, the included **ElevenLabs Voice** skill (automatically appended below via `includes`) provides the full setup flow: curated voice list, API key collection, advanced voice selection, and tuning parameters. Follow the instructions there.
|
|
69
|
-
|
|
70
|
-
Note: The shared config key `elevenlabs.voiceId` controls the voice for both in-app TTS and phone calls. If the user sets up phone calls later, they will automatically use the same voice for a consistent experience.
|
|
71
|
-
|
|
72
|
-
### 5. Verification
|
|
73
|
-
|
|
74
|
-
After setup is complete:
|
|
75
|
-
|
|
76
|
-
1. Summarize what was configured.
|
|
77
|
-
2. Suggest they test by pressing their PTT key (or saying their wake word) and speaking.
|
|
78
|
-
3. Offer to open the Voice settings tab if they want to review: use `navigate_settings_tab` with `tab: "Voice"`.
|
|
79
|
-
|
|
80
|
-
## Troubleshooting Decision Trees
|
|
81
|
-
|
|
82
|
-
When the user reports a problem, follow the appropriate decision tree:
|
|
83
|
-
|
|
84
|
-
### "PTT isn't working" / "Can't record"
|
|
85
|
-
|
|
86
|
-
1. **Microphone permission** — Check `microphone_permission_granted` in capabilities. If false, guide through granting it.
|
|
87
|
-
2. **Key check** — Ask what key they're using. Confirm it matches their configured PTT key.
|
|
88
|
-
3. **Emoji picker conflict** — On newer Macs, Fn/Globe opens the emoji picker. If they're using Fn, suggest switching to Right Option or Right Command.
|
|
89
|
-
4. **Speech Recognition permission** — Some voice features need this. Use `open_system_settings` with `pane: "speech_recognition"`.
|
|
90
|
-
5. **App focus** — PTT may not work when Vellum is not the frontmost app or if another app has captured the key.
|
|
91
|
-
|
|
92
|
-
### "Recording but no text" / "Transcription not working"
|
|
93
|
-
|
|
94
|
-
1. **Speech Recognition permission** — Must be granted for transcription.
|
|
95
|
-
2. **Microphone input** — Ask if they see the recording indicator. If yes, the mic works but transcription is failing.
|
|
96
|
-
3. **Locale/language** — Speech recognition works best with the system language. Ask if they're speaking in a different language.
|
|
97
|
-
4. **Background noise** — Excessive noise can prevent transcription. Suggest a quieter environment or a closer microphone.
|
|
98
|
-
|
|
99
|
-
### "Wake word not detecting"
|
|
100
|
-
|
|
101
|
-
1. **Enabled check** — Confirm wake word is enabled in their settings.
|
|
102
|
-
2. **Keyword** — Confirm what keyword they're using. Shorter or common words may have lower accuracy.
|
|
103
|
-
3. **Ambient noise** — Wake word detection is sensitive to background noise.
|
|
104
|
-
4. **Permissions** — Both Microphone and Speech Recognition permissions are required.
|
|
105
|
-
5. **Timeout** — If wake word activates but cuts off too quickly, increase the timeout.
|
|
106
|
-
|
|
107
|
-
### "Changed a setting but it didn't work"
|
|
108
|
-
|
|
109
|
-
1. **IPC broadcast** — The setting should take effect immediately. If it didn't, suggest restarting the assistant.
|
|
110
|
-
2. **Verify** — Open the Voice settings tab with `navigate_settings_tab` to confirm the setting was persisted.
|
|
111
|
-
|
|
112
|
-
## Deep Debugging
|
|
113
|
-
|
|
114
|
-
For persistent issues, suggest checking system logs:
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
log stream --predicate 'subsystem == "com.vellum.assistant"' --level debug
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Key log categories:
|
|
121
|
-
|
|
122
|
-
- `voice` — PTT activation, recording state
|
|
123
|
-
- `wake-word` — Wake word detection events
|
|
124
|
-
- `speech` — Speech recognition results
|
|
125
|
-
|
|
126
|
-
## Rules
|
|
127
|
-
|
|
128
|
-
- Always handle setup conversationally in-chat. Do NOT tell the user to go to Settings for initial configuration.
|
|
129
|
-
- Use `navigate_settings_tab` only for review/verification after in-chat setup, not as the primary setup method.
|
|
130
|
-
- Be concise. Don't explain every option exhaustively — present the most common choices and let the user ask for more.
|
|
131
|
-
- If a permission is denied, acknowledge it gracefully and explain what features won't work without it.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<rect x="7" y="1" width="2" height="2" fill="#4A90E2"/>
|
|
3
|
-
<rect x="6" y="3" width="4" height="1" fill="#4A90E2"/>
|
|
4
|
-
<rect x="5" y="4" width="6" height="1" fill="#7B68EE"/>
|
|
5
|
-
<rect x="4" y="5" width="8" height="1" fill="#7B68EE"/>
|
|
6
|
-
<rect x="4" y="6" width="8" height="1" fill="#4A90E2"/>
|
|
7
|
-
<rect x="5" y="7" width="6" height="1" fill="#4A90E2"/>
|
|
8
|
-
<rect x="6" y="8" width="4" height="1" fill="#7B68EE"/>
|
|
9
|
-
<rect x="7" y="9" width="2" height="1" fill="#7B68EE"/>
|
|
10
|
-
<rect x="3" y="10" width="2" height="4" fill="#50C878"/>
|
|
11
|
-
<rect x="4" y="10" width="1" height="1" fill="#50C878"/>
|
|
12
|
-
<rect x="5" y="11" width="1" height="1" fill="#50C878"/>
|
|
13
|
-
<rect x="11" y="10" width="2" height="4" fill="#E74C3C"/>
|
|
14
|
-
<rect x="10" y="10" width="1" height="1" fill="#E74C3C"/>
|
|
15
|
-
<rect x="9" y="11" width="1" height="1" fill="#E74C3C"/>
|
|
16
|
-
<rect x="6" y="11" width="4" height="1" fill="#FFD700"/>
|
|
17
|
-
<rect x="5" y="12" width="6" height="1" fill="#FFD700"/>
|
|
18
|
-
<rect x="4" y="13" width="8" height="1" fill="#FFD700"/>
|
|
19
|
-
<rect x="7" y="14" width="2" height="2" fill="#4A90E2"/>
|
|
20
|
-
</svg>
|