@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,267 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { parseArgs } from "node:util";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
compareInfluencers,
|
|
6
|
-
getInfluencerProfile,
|
|
7
|
-
type InfluencerSearchCriteria,
|
|
8
|
-
searchInfluencers,
|
|
9
|
-
} from "./client.js";
|
|
10
|
-
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// Helpers
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
|
|
15
|
-
const isJson = process.argv.includes("--json");
|
|
16
|
-
|
|
17
|
-
function output(data: unknown): void {
|
|
18
|
-
process.stdout.write(
|
|
19
|
-
isJson ? JSON.stringify(data) + "\n" : JSON.stringify(data, null, 2) + "\n",
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function outputError(message: string, code = 1): void {
|
|
24
|
-
output({ ok: false, error: message });
|
|
25
|
-
process.exitCode = code;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async function run(fn: () => Promise<unknown>): Promise<void> {
|
|
29
|
-
try {
|
|
30
|
-
const result = await fn();
|
|
31
|
-
output({ ok: true, ...(result as Record<string, unknown>) });
|
|
32
|
-
} catch (err) {
|
|
33
|
-
outputError(err instanceof Error ? err.message : String(err));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// Utilities
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Parse human-friendly numbers like "10k", "1.5m", "100000" into integers.
|
|
43
|
-
*/
|
|
44
|
-
function parseHumanNumber(text: string): number {
|
|
45
|
-
const cleaned = text.toLowerCase().replace(/,/g, "").trim();
|
|
46
|
-
const match = cleaned.match(/^([\d.]+)\s*([kmbt]?)$/);
|
|
47
|
-
if (!match) return parseInt(text, 10) || 0;
|
|
48
|
-
|
|
49
|
-
const num = parseFloat(match[1]);
|
|
50
|
-
const suffix = match[2];
|
|
51
|
-
const multipliers: Record<string, number> = {
|
|
52
|
-
"": 1,
|
|
53
|
-
k: 1_000,
|
|
54
|
-
m: 1_000_000,
|
|
55
|
-
b: 1_000_000_000,
|
|
56
|
-
t: 1_000_000_000_000,
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
return Math.round(num * (multipliers[suffix] || 1));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// Help
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
|
|
66
|
-
const USAGE = `influencer — Research influencers on Instagram, TikTok, and X/Twitter
|
|
67
|
-
|
|
68
|
-
Uses the Chrome extension relay to browse each platform. Requires the user to
|
|
69
|
-
be logged in on each platform in Chrome.
|
|
70
|
-
|
|
71
|
-
USAGE
|
|
72
|
-
influencer <subcommand> [options]
|
|
73
|
-
|
|
74
|
-
SUBCOMMANDS
|
|
75
|
-
search <query> Search for influencers matching criteria
|
|
76
|
-
profile <username> Get detailed profile data for one influencer
|
|
77
|
-
compare <platform:user ...> Compare multiple influencers side by side
|
|
78
|
-
|
|
79
|
-
GLOBAL OPTIONS
|
|
80
|
-
--json Machine-readable JSON output (compact, one line)
|
|
81
|
-
--help, -h Show this help message
|
|
82
|
-
|
|
83
|
-
SEARCH OPTIONS
|
|
84
|
-
--platforms <list> Comma-separated platforms (default: instagram,tiktok,twitter)
|
|
85
|
-
--min-followers <n> Minimum follower count (e.g. 10k, 1.5m, 50000)
|
|
86
|
-
--max-followers <n> Maximum follower count
|
|
87
|
-
--limit <n> Max results per platform (default: 10)
|
|
88
|
-
--verified Only return verified accounts
|
|
89
|
-
|
|
90
|
-
PROFILE OPTIONS
|
|
91
|
-
--platform <name> Platform to look up (default: instagram)
|
|
92
|
-
|
|
93
|
-
EXAMPLES
|
|
94
|
-
influencer search "fitness coach" --platforms instagram,tiktok
|
|
95
|
-
influencer search "vegan food" --min-followers 10k --max-followers 1m --json
|
|
96
|
-
influencer profile natgeo --platform instagram
|
|
97
|
-
influencer compare instagram:nike twitter:nike tiktok:nike
|
|
98
|
-
`;
|
|
99
|
-
|
|
100
|
-
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
101
|
-
process.stdout.write(USAGE);
|
|
102
|
-
process.exit(0);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// Subcommand routing
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
|
|
109
|
-
const subcommand = process.argv[2];
|
|
110
|
-
|
|
111
|
-
switch (subcommand) {
|
|
112
|
-
case "search": {
|
|
113
|
-
// Strip the subcommand and --json from argv for parseArgs
|
|
114
|
-
const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
|
|
115
|
-
|
|
116
|
-
const { values, positionals } = parseArgs({
|
|
117
|
-
args: filteredArgs,
|
|
118
|
-
options: {
|
|
119
|
-
platforms: { type: "string", default: "instagram,tiktok,twitter" },
|
|
120
|
-
"min-followers": { type: "string" },
|
|
121
|
-
"max-followers": { type: "string" },
|
|
122
|
-
limit: { type: "string", default: "10" },
|
|
123
|
-
verified: { type: "boolean", default: false },
|
|
124
|
-
},
|
|
125
|
-
allowPositionals: true,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const query = positionals[0];
|
|
129
|
-
if (!query) {
|
|
130
|
-
outputError("Missing required argument: <query>");
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const platforms = (values.platforms as string)
|
|
135
|
-
.split(",")
|
|
136
|
-
.map((p) => p.trim().toLowerCase())
|
|
137
|
-
.filter((p): p is "instagram" | "tiktok" | "twitter" =>
|
|
138
|
-
["instagram", "tiktok", "twitter"].includes(p),
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
const criteria: InfluencerSearchCriteria = {
|
|
142
|
-
query,
|
|
143
|
-
platforms,
|
|
144
|
-
minFollowers: values["min-followers"]
|
|
145
|
-
? parseHumanNumber(values["min-followers"] as string)
|
|
146
|
-
: undefined,
|
|
147
|
-
maxFollowers: values["max-followers"]
|
|
148
|
-
? parseHumanNumber(values["max-followers"] as string)
|
|
149
|
-
: undefined,
|
|
150
|
-
limit: parseInt(values.limit as string, 10),
|
|
151
|
-
verifiedOnly: values.verified as boolean,
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
await run(async () => {
|
|
155
|
-
const results = await searchInfluencers(criteria);
|
|
156
|
-
const totalProfiles = results.reduce((sum, r) => sum + r.count, 0);
|
|
157
|
-
return {
|
|
158
|
-
results,
|
|
159
|
-
totalProfiles,
|
|
160
|
-
platforms: platforms.length,
|
|
161
|
-
query,
|
|
162
|
-
};
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
case "profile": {
|
|
169
|
-
const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
|
|
170
|
-
|
|
171
|
-
const { values, positionals } = parseArgs({
|
|
172
|
-
args: filteredArgs,
|
|
173
|
-
options: {
|
|
174
|
-
platform: { type: "string", default: "instagram" },
|
|
175
|
-
},
|
|
176
|
-
allowPositionals: true,
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
const username = positionals[0];
|
|
180
|
-
if (!username) {
|
|
181
|
-
outputError("Missing required argument: <username>");
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const platform = (values.platform as string).toLowerCase() as
|
|
186
|
-
| "instagram"
|
|
187
|
-
| "tiktok"
|
|
188
|
-
| "twitter";
|
|
189
|
-
if (!["instagram", "tiktok", "twitter"].includes(platform)) {
|
|
190
|
-
outputError(
|
|
191
|
-
`Invalid platform: ${values.platform}. Use instagram, tiktok, or twitter.`,
|
|
192
|
-
);
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const cleanUsername = username.replace(/^@/, "");
|
|
197
|
-
|
|
198
|
-
await run(async () => {
|
|
199
|
-
const profile = await getInfluencerProfile(platform, cleanUsername);
|
|
200
|
-
if (!profile) {
|
|
201
|
-
throw new Error(
|
|
202
|
-
`Could not find profile @${cleanUsername} on ${platform}`,
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
return { profile };
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
break;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
case "compare": {
|
|
212
|
-
const filteredArgs = process.argv.slice(3).filter((a) => a !== "--json");
|
|
213
|
-
|
|
214
|
-
const { positionals } = parseArgs({
|
|
215
|
-
args: filteredArgs,
|
|
216
|
-
options: {},
|
|
217
|
-
allowPositionals: true,
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
if (positionals.length === 0) {
|
|
221
|
-
outputError("Missing required arguments: <platform:username ...>");
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const parsed = positionals.map((inf) => {
|
|
226
|
-
const [platform, username] = inf.includes(":")
|
|
227
|
-
? inf.split(":", 2)
|
|
228
|
-
: ["instagram", inf];
|
|
229
|
-
|
|
230
|
-
const cleanPlatform = platform.toLowerCase() as
|
|
231
|
-
| "instagram"
|
|
232
|
-
| "tiktok"
|
|
233
|
-
| "twitter";
|
|
234
|
-
if (!["instagram", "tiktok", "twitter"].includes(cleanPlatform)) {
|
|
235
|
-
throw new Error(
|
|
236
|
-
`Invalid platform "${platform}" in "${inf}". Use instagram, tiktok, or twitter.`,
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return {
|
|
241
|
-
platform: cleanPlatform,
|
|
242
|
-
username: username.replace(/^@/, ""),
|
|
243
|
-
};
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
await run(async () => {
|
|
247
|
-
const profiles = await compareInfluencers(parsed);
|
|
248
|
-
return {
|
|
249
|
-
profiles,
|
|
250
|
-
count: profiles.length,
|
|
251
|
-
requested: parsed.length,
|
|
252
|
-
};
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
default: {
|
|
259
|
-
process.stderr.write(
|
|
260
|
-
subcommand
|
|
261
|
-
? `Unknown subcommand: ${subcommand}\n\n`
|
|
262
|
-
: "No subcommand provided.\n\n",
|
|
263
|
-
);
|
|
264
|
-
process.stderr.write(USAGE);
|
|
265
|
-
process.exitCode = 1;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: macos-automation
|
|
3
|
-
description: Automate native macOS apps and system interactions via osascript (AppleScript)
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"🍎","vellum":{"display-name":"macOS Automation","user-invocable":false,"os":["darwin"]}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Use this skill to interact with native macOS apps and system-level features via `osascript` (AppleScript) through `host_bash`. Always prefer osascript over browser automation or computer-use for anything involving a native macOS app.
|
|
9
|
-
|
|
10
|
-
## Supported Apps
|
|
11
|
-
|
|
12
|
-
**Communication:** Messages, Mail, Microsoft Outlook, FaceTime
|
|
13
|
-
**Contacts & Calendar:** Contacts, Calendar, Reminders
|
|
14
|
-
**Notes & Writing:** Notes, TextEdit, Pages, BBEdit, CotEditor
|
|
15
|
-
**Files:** Finder, Path Finder
|
|
16
|
-
**Browsers:** Safari, Google Chrome
|
|
17
|
-
**Music & Media:** Music (iTunes), Spotify, VLC, Podcasts, TV
|
|
18
|
-
**Productivity:** OmniFocus, Things 3, OmniOutliner, OmniPlan, OmniGraffle
|
|
19
|
-
**Office:** Microsoft Word, Microsoft Excel, Numbers, Keynote
|
|
20
|
-
**Developer tools:** Xcode, Terminal, iTerm2, Script Editor
|
|
21
|
-
**System:** System Events (UI scripting for any app), System Settings
|
|
22
|
-
**Automation:** Keyboard Maestro, Alfred, Automator
|
|
23
|
-
**Creative:** Adobe Photoshop, Final Cut Pro
|
|
24
|
-
|
|
25
|
-
For any unlisted app, check scriptability first:
|
|
26
|
-
```bash
|
|
27
|
-
osascript -e 'tell application "AppName" to get name'
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Examples
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
# Send an iMessage
|
|
34
|
-
osascript -e 'tell application "Messages" to send "Hello!" to buddy "user@example.com"'
|
|
35
|
-
|
|
36
|
-
# Look up a contact
|
|
37
|
-
osascript -e 'tell application "Contacts" to get {name, phones} of every person whose name contains "Marina"'
|
|
38
|
-
|
|
39
|
-
# Read upcoming calendar events
|
|
40
|
-
osascript -e 'tell application "Calendar" to get summary of every event of calendar "Home" whose start date > (current date)'
|
|
41
|
-
|
|
42
|
-
# Create a reminder
|
|
43
|
-
osascript -e 'tell application "Reminders" to make new reminder with properties {name:"Buy milk", due date:((current date) + 1 * hours)}'
|
|
44
|
-
|
|
45
|
-
# Send an email
|
|
46
|
-
osascript -e 'tell application "Mail" to send (make new outgoing message with properties {subject:"Hi", content:"Hello", visible:true})'
|
|
47
|
-
|
|
48
|
-
# Create a note
|
|
49
|
-
osascript -e 'tell application "Notes" to make new note at folder "Notes" with properties {body:"My note"}'
|
|
50
|
-
|
|
51
|
-
# Open a URL in Safari
|
|
52
|
-
osascript -e 'tell application "Safari" to open location "https://example.com"'
|
|
53
|
-
|
|
54
|
-
# Play/pause Music
|
|
55
|
-
osascript -e 'tell application "Music" to playpause'
|
|
56
|
-
|
|
57
|
-
# Display a system notification
|
|
58
|
-
osascript -e 'display notification "Done!" with title "Vellum"'
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Tips
|
|
62
|
-
|
|
63
|
-
- For multi-line scripts, write them to a `.applescript` file and run with `osascript path/to/script.applescript`
|
|
64
|
-
- Use `System Events` for UI scripting apps that don't have their own AppleScript dictionary
|
|
65
|
-
- AppleScript permissions are gated by macOS TCC — if a command fails with a permission error, use `request_system_permission` to prompt the user
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<rect x="2" y="2" width="12" height="11" fill="#e8e8e8" stroke="#333" stroke-width="1"/>
|
|
3
|
-
<rect x="3" y="3" width="10" height="9" fill="#f5f5f5"/>
|
|
4
|
-
<circle cx="8" cy="7" r="2" fill="#0071e3"/>
|
|
5
|
-
<rect x="5" y="5" width="1" height="1" fill="#333"/>
|
|
6
|
-
<rect x="10" y="5" width="1" height="1" fill="#333"/>
|
|
7
|
-
<rect x="5" y="9" width="1" height="1" fill="#333"/>
|
|
8
|
-
<rect x="10" y="9" width="1" height="1" fill="#333"/>
|
|
9
|
-
<path d="M 8 4 L 8 6 M 6 7 L 8 7 M 8 8 L 8 10 M 8 7 L 10 7" stroke="#0071e3" stroke-width="1" fill="none"/>
|
|
10
|
-
<rect x="3" y="13" width="10" height="1" fill="#333"/>
|
|
11
|
-
<rect x="4" y="14" width="8" height="1" fill="#0071e3"/>
|
|
12
|
-
</svg>
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: mcp-setup
|
|
3
|
-
description: Add, authenticate, list, and remove MCP (Model Context Protocol) servers
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata: {"emoji":"🔌","vellum":{"display-name":"MCP Setup","user-invocable":false}}
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Help users configure MCP servers so external tools (e.g. Linear, GitHub, Notion) become available in conversations.
|
|
9
|
-
|
|
10
|
-
## CLI Commands
|
|
11
|
-
|
|
12
|
-
All commands use `assistant mcp`. Run them via `host_bash`.
|
|
13
|
-
|
|
14
|
-
### List servers
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
assistant mcp list
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Shows all configured servers with connection status, transport type, and URL.
|
|
21
|
-
|
|
22
|
-
### Add a server
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
assistant mcp add <name> -t <transport-type> -u <url> [-r <risk>] [--disabled]
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
- `<name>` — unique identifier (e.g. `linear`, `github`)
|
|
29
|
-
- `-t` — transport type: `stdio`, `sse`, or `streamable-http`
|
|
30
|
-
- `-u` — server URL (required for `sse`/`streamable-http`)
|
|
31
|
-
- `-c` — command (required for `stdio`), `-a` for args
|
|
32
|
-
- `-r` — risk level: `low`, `medium`, or `high` (default: `high`)
|
|
33
|
-
|
|
34
|
-
Examples:
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
assistant mcp add linear -t streamable-http -u https://mcp.linear.app/mcp
|
|
38
|
-
assistant mcp add context7 -t streamable-http -u https://mcp.context7.com/mcp -r low
|
|
39
|
-
assistant mcp add local-db -t stdio -c npx -a -y @my/mcp-server
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Authenticate (OAuth)
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
assistant mcp auth <name>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Opens the user's browser for OAuth authorization. Only works for `sse`/`streamable-http` servers that require authentication. After the user completes login in the browser, tokens are saved automatically.
|
|
49
|
-
|
|
50
|
-
Use this when:
|
|
51
|
-
|
|
52
|
-
- A server shows `! Needs authentication` in `assistant mcp list`
|
|
53
|
-
- An MCP tool call fails with an auth/token error
|
|
54
|
-
- Setting up a new OAuth-protected server for the first time
|
|
55
|
-
|
|
56
|
-
### Remove a server
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
assistant mcp remove <name>
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Removes the server config and cleans up any stored OAuth credentials.
|
|
63
|
-
|
|
64
|
-
## After Changes
|
|
65
|
-
|
|
66
|
-
After adding, removing, or authenticating a server, the user must **quit and relaunch the Vellum app** for changes to take effect. The app runs its own assistant process — `assistant daemon restart` only restarts the CLI assistant, which is a separate process.
|
|
67
|
-
|
|
68
|
-
Tell the user: "Please quit and relaunch the Vellum app, then start a new conversation."
|
|
69
|
-
|
|
70
|
-
## When to Use
|
|
71
|
-
|
|
72
|
-
- User asks to connect/set up an external service via MCP
|
|
73
|
-
- User asks "what MCP servers do I have?"
|
|
74
|
-
- An MCP tool returns an auth error — offer to run `assistant mcp auth <name>`
|
|
75
|
-
- User wants to remove an MCP integration
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Media diagnostics tool.
|
|
3
|
-
*
|
|
4
|
-
* Surfaces processing stats, per-stage timing, failure reasons,
|
|
5
|
-
* and cost estimation for a media asset.
|
|
6
|
-
* All metrics are generic media-processing infrastructure.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { readFile } from "node:fs/promises";
|
|
10
|
-
import { dirname, join } from "node:path";
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
getKeyframesForAsset,
|
|
14
|
-
getMediaAssetById,
|
|
15
|
-
getProcessingStagesForAsset,
|
|
16
|
-
type ProcessingStage,
|
|
17
|
-
} from "../../../../memory/media-store.js";
|
|
18
|
-
import type {
|
|
19
|
-
ToolContext,
|
|
20
|
-
ToolExecutionResult,
|
|
21
|
-
} from "../../../../tools/types.js";
|
|
22
|
-
import type { PreprocessManifest } from "../services/preprocess.js";
|
|
23
|
-
import type { ReduceCostData } from "../services/reduce.js";
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Cost estimation constants (Gemini 2.5 Flash pricing)
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
/** Estimated cost per segment Map call (Gemini 2.5 Flash with ~10 frames). */
|
|
29
|
-
const ESTIMATED_COST_PER_SEGMENT_USD = 0.001;
|
|
30
|
-
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Types
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
interface StageDiagnostic {
|
|
36
|
-
stage: string;
|
|
37
|
-
status: string;
|
|
38
|
-
progress: number;
|
|
39
|
-
durationMs: number | null;
|
|
40
|
-
lastError: string | null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
interface DiagnosticReport {
|
|
44
|
-
assetId: string;
|
|
45
|
-
assetTitle: string;
|
|
46
|
-
assetStatus: string;
|
|
47
|
-
mediaType: string;
|
|
48
|
-
durationSeconds: number | null;
|
|
49
|
-
processingStats: {
|
|
50
|
-
totalKeyframes: number;
|
|
51
|
-
};
|
|
52
|
-
stages: StageDiagnostic[];
|
|
53
|
-
costEstimate: {
|
|
54
|
-
mapPhase: {
|
|
55
|
-
keyframeCount: number;
|
|
56
|
-
estimatedSegments: number;
|
|
57
|
-
estimatedCostPerSegment: number;
|
|
58
|
-
estimatedMapCost: number;
|
|
59
|
-
};
|
|
60
|
-
reduceCost: ReduceCostData | null;
|
|
61
|
-
estimatedTotalCost: number;
|
|
62
|
-
currency: string;
|
|
63
|
-
note: string;
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// ---------------------------------------------------------------------------
|
|
68
|
-
// Helpers
|
|
69
|
-
// ---------------------------------------------------------------------------
|
|
70
|
-
|
|
71
|
-
function computeStageDuration(stage: ProcessingStage): number | null {
|
|
72
|
-
if (stage.startedAt == null) return null;
|
|
73
|
-
if (stage.completedAt != null) return stage.completedAt - stage.startedAt;
|
|
74
|
-
// Only use Date.now() as a fallback for currently running stages
|
|
75
|
-
if (stage.status === "running") return Date.now() - stage.startedAt;
|
|
76
|
-
// For failed/pending stages without completedAt, duration is unknown
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
// Main entry point
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
export async function run(
|
|
85
|
-
input: Record<string, unknown>,
|
|
86
|
-
_context: ToolContext,
|
|
87
|
-
): Promise<ToolExecutionResult> {
|
|
88
|
-
const assetId = input.asset_id as string | undefined;
|
|
89
|
-
if (!assetId) {
|
|
90
|
-
return { content: "asset_id is required.", isError: true };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const asset = getMediaAssetById(assetId);
|
|
94
|
-
if (!asset) {
|
|
95
|
-
return { content: `Media asset not found: ${assetId}`, isError: true };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Gather processing stats
|
|
99
|
-
const keyframes = getKeyframesForAsset(assetId);
|
|
100
|
-
|
|
101
|
-
// Per-stage diagnostics (new pipeline: preprocess, map, reduce)
|
|
102
|
-
const stages = getProcessingStagesForAsset(assetId);
|
|
103
|
-
const stageDiagnostics: StageDiagnostic[] = stages.map((s) => ({
|
|
104
|
-
stage: s.stage,
|
|
105
|
-
status: s.status,
|
|
106
|
-
progress: s.progress,
|
|
107
|
-
durationMs: computeStageDuration(s),
|
|
108
|
-
lastError: s.lastError,
|
|
109
|
-
}));
|
|
110
|
-
|
|
111
|
-
// Cost estimation: Gemini 2.5 Flash is ~$0.001 per segment (~10 frames each)
|
|
112
|
-
const keyframeCount = keyframes.length;
|
|
113
|
-
|
|
114
|
-
// Prefer actual segment count from preprocess manifest when available
|
|
115
|
-
let estimatedSegments: number;
|
|
116
|
-
const manifestPath = join(
|
|
117
|
-
dirname(asset.filePath),
|
|
118
|
-
"pipeline",
|
|
119
|
-
asset.id,
|
|
120
|
-
"manifest.json",
|
|
121
|
-
);
|
|
122
|
-
try {
|
|
123
|
-
const raw = await readFile(manifestPath, "utf-8");
|
|
124
|
-
const manifest: PreprocessManifest = JSON.parse(raw);
|
|
125
|
-
estimatedSegments = manifest.segments.length;
|
|
126
|
-
} catch {
|
|
127
|
-
// Manifest doesn't exist yet (preprocess hasn't run) — fall back to estimation
|
|
128
|
-
estimatedSegments = Math.ceil(keyframeCount / 10);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const estimatedMapCost = estimatedSegments * ESTIMATED_COST_PER_SEGMENT_USD;
|
|
132
|
-
|
|
133
|
-
// Load reduce cost data if available
|
|
134
|
-
const reduceCostPath = join(
|
|
135
|
-
dirname(asset.filePath),
|
|
136
|
-
"pipeline",
|
|
137
|
-
asset.id,
|
|
138
|
-
"reduce-cost.json",
|
|
139
|
-
);
|
|
140
|
-
let reduceCost: ReduceCostData | null = null;
|
|
141
|
-
try {
|
|
142
|
-
const raw = await readFile(reduceCostPath, "utf-8");
|
|
143
|
-
reduceCost = JSON.parse(raw) as ReduceCostData;
|
|
144
|
-
} catch {
|
|
145
|
-
// No reduce cost data yet
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Combine map + reduce costs for the total estimate
|
|
149
|
-
// Reduce cost is token-based; use a rough estimate of $3/M input + $15/M output (Claude Sonnet-class)
|
|
150
|
-
const reduceEstimatedCost = reduceCost
|
|
151
|
-
? (reduceCost.totalInputTokens * 3 + reduceCost.totalOutputTokens * 15) /
|
|
152
|
-
1_000_000
|
|
153
|
-
: 0;
|
|
154
|
-
const estimatedTotalCost = estimatedMapCost + reduceEstimatedCost;
|
|
155
|
-
|
|
156
|
-
const report: DiagnosticReport = {
|
|
157
|
-
assetId: asset.id,
|
|
158
|
-
assetTitle: asset.title,
|
|
159
|
-
assetStatus: asset.status,
|
|
160
|
-
mediaType: asset.mediaType,
|
|
161
|
-
durationSeconds: asset.durationSeconds,
|
|
162
|
-
processingStats: {
|
|
163
|
-
totalKeyframes: keyframeCount,
|
|
164
|
-
},
|
|
165
|
-
stages: stageDiagnostics,
|
|
166
|
-
costEstimate: {
|
|
167
|
-
mapPhase: {
|
|
168
|
-
keyframeCount,
|
|
169
|
-
estimatedSegments,
|
|
170
|
-
estimatedCostPerSegment: ESTIMATED_COST_PER_SEGMENT_USD,
|
|
171
|
-
estimatedMapCost: Math.round(estimatedMapCost * 1000) / 1000,
|
|
172
|
-
},
|
|
173
|
-
reduceCost,
|
|
174
|
-
estimatedTotalCost: Math.round(estimatedTotalCost * 1000000) / 1000000,
|
|
175
|
-
currency: "USD",
|
|
176
|
-
note: "Map: Gemini 2.5 Flash per segment. Reduce: Claude token-based ($3/M input, $15/M output).",
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
return {
|
|
181
|
-
content: JSON.stringify(report, null, 2),
|
|
182
|
-
isError: false,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
batchModifyMessages,
|
|
3
|
-
listMessages,
|
|
4
|
-
} from "../../../../messaging/providers/gmail/client.js";
|
|
5
|
-
import { getMessagingProvider } from "../../../../messaging/registry.js";
|
|
6
|
-
import { withValidToken } from "../../../../security/token-manager.js";
|
|
7
|
-
import type {
|
|
8
|
-
ToolContext,
|
|
9
|
-
ToolExecutionResult,
|
|
10
|
-
} from "../../../../tools/types.js";
|
|
11
|
-
import { err, ok } from "./shared.js";
|
|
12
|
-
|
|
13
|
-
const BATCH_MODIFY_LIMIT = 1000;
|
|
14
|
-
const MAX_MESSAGES = 5000;
|
|
15
|
-
|
|
16
|
-
export async function run(
|
|
17
|
-
input: Record<string, unknown>,
|
|
18
|
-
context: ToolContext,
|
|
19
|
-
): Promise<ToolExecutionResult> {
|
|
20
|
-
if (!context.triggeredBySurfaceAction) {
|
|
21
|
-
return err(
|
|
22
|
-
"This tool requires user confirmation via a surface action. Present results in a selection table with action buttons and wait for the user to click before proceeding.",
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const query = input.query as string;
|
|
27
|
-
|
|
28
|
-
if (!query) {
|
|
29
|
-
return err("query is required.");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
const provider = getMessagingProvider("gmail");
|
|
34
|
-
return withValidToken(provider.credentialService, async (token) => {
|
|
35
|
-
// Paginate through matching messages, capped to prevent unbounded API/memory usage
|
|
36
|
-
const allMessageIds: string[] = [];
|
|
37
|
-
let pageToken: string | undefined;
|
|
38
|
-
let truncated = false;
|
|
39
|
-
|
|
40
|
-
while (allMessageIds.length < MAX_MESSAGES) {
|
|
41
|
-
const listResp = await listMessages(
|
|
42
|
-
token,
|
|
43
|
-
query,
|
|
44
|
-
Math.min(500, MAX_MESSAGES - allMessageIds.length),
|
|
45
|
-
pageToken,
|
|
46
|
-
);
|
|
47
|
-
const ids = (listResp.messages ?? []).map((m) => m.id);
|
|
48
|
-
if (ids.length === 0) break;
|
|
49
|
-
allMessageIds.push(...ids);
|
|
50
|
-
pageToken = listResp.nextPageToken ?? undefined;
|
|
51
|
-
if (!pageToken) break;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// If we stopped because we hit the cap while more pages existed, flag truncation
|
|
55
|
-
if (allMessageIds.length >= MAX_MESSAGES && pageToken) {
|
|
56
|
-
truncated = true;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (allMessageIds.length === 0) {
|
|
60
|
-
return ok("No messages matched the query. Nothing archived.");
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Archive in chunks of BATCH_MODIFY_LIMIT (Gmail's per-call limit)
|
|
64
|
-
for (let i = 0; i < allMessageIds.length; i += BATCH_MODIFY_LIMIT) {
|
|
65
|
-
const chunk = allMessageIds.slice(i, i + BATCH_MODIFY_LIMIT);
|
|
66
|
-
await batchModifyMessages(token, chunk, { removeLabelIds: ["INBOX"] });
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const summary = `Archived ${allMessageIds.length} message(s) matching query: ${query}`;
|
|
70
|
-
if (truncated) {
|
|
71
|
-
return ok(
|
|
72
|
-
`${summary}\n\nNote: this operation was capped at ${MAX_MESSAGES} messages. Additional messages matching the query may remain in the inbox. Run the command again to archive more.`,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
return ok(summary);
|
|
76
|
-
});
|
|
77
|
-
} catch (e) {
|
|
78
|
-
return err(e instanceof Error ? e.message : String(e));
|
|
79
|
-
}
|
|
80
|
-
}
|