@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
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MIME type guessing for Gmail attachment support.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { extname } from "node:path";
|
|
6
|
+
|
|
7
|
+
export const MIME_MAP: Record<string, string> = {
|
|
8
|
+
".pdf": "application/pdf",
|
|
9
|
+
".zip": "application/zip",
|
|
10
|
+
".gz": "application/gzip",
|
|
11
|
+
".tar": "application/x-tar",
|
|
12
|
+
".doc": "application/msword",
|
|
13
|
+
".docx":
|
|
14
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
15
|
+
".xls": "application/vnd.ms-excel",
|
|
16
|
+
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
17
|
+
".ppt": "application/vnd.ms-powerpoint",
|
|
18
|
+
".pptx":
|
|
19
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
20
|
+
".png": "image/png",
|
|
21
|
+
".jpg": "image/jpeg",
|
|
22
|
+
".jpeg": "image/jpeg",
|
|
23
|
+
".gif": "image/gif",
|
|
24
|
+
".svg": "image/svg+xml",
|
|
25
|
+
".webp": "image/webp",
|
|
26
|
+
".mp3": "audio/mpeg",
|
|
27
|
+
".mp4": "video/mp4",
|
|
28
|
+
".wav": "audio/wav",
|
|
29
|
+
".txt": "text/plain",
|
|
30
|
+
".html": "text/html",
|
|
31
|
+
".css": "text/css",
|
|
32
|
+
".js": "text/javascript",
|
|
33
|
+
".json": "application/json",
|
|
34
|
+
".xml": "application/xml",
|
|
35
|
+
".csv": "text/csv",
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export function guessMimeType(filePath: string): string {
|
|
39
|
+
return (
|
|
40
|
+
MIME_MAP[extname(filePath).toLowerCase()] ?? "application/octet-stream"
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -1,9 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
batchGetMessages,
|
|
6
|
+
createDraft,
|
|
7
|
+
createDraftRaw,
|
|
8
|
+
getProfile,
|
|
9
|
+
listMessages,
|
|
10
|
+
} from "../../../../messaging/providers/gmail/client.js";
|
|
11
|
+
import { buildMultipartMime } from "../../../../messaging/providers/gmail/mime-builder.js";
|
|
2
12
|
import type {
|
|
3
13
|
ToolContext,
|
|
4
14
|
ToolExecutionResult,
|
|
5
15
|
} from "../../../../tools/types.js";
|
|
6
|
-
import {
|
|
16
|
+
import { guessMimeType } from "./gmail-mime-helpers.js";
|
|
17
|
+
import {
|
|
18
|
+
err,
|
|
19
|
+
extractEmail,
|
|
20
|
+
extractHeader,
|
|
21
|
+
ok,
|
|
22
|
+
parseAddressList,
|
|
23
|
+
resolveProvider,
|
|
24
|
+
withProviderToken,
|
|
25
|
+
} from "./shared.js";
|
|
7
26
|
|
|
8
27
|
export async function run(
|
|
9
28
|
input: Record<string, unknown>,
|
|
@@ -14,6 +33,8 @@ export async function run(
|
|
|
14
33
|
const text = input.text as string;
|
|
15
34
|
const subject = input.subject as string | undefined;
|
|
16
35
|
const inReplyTo = input.in_reply_to as string | undefined;
|
|
36
|
+
const attachmentPaths = input.attachment_paths as string[] | undefined;
|
|
37
|
+
const threadId = input.thread_id as string | undefined;
|
|
17
38
|
|
|
18
39
|
if (!conversationId) {
|
|
19
40
|
return err("conversation_id is required.");
|
|
@@ -25,15 +46,155 @@ export async function run(
|
|
|
25
46
|
try {
|
|
26
47
|
const provider = resolveProvider(platform);
|
|
27
48
|
|
|
49
|
+
// Non-Gmail platforms: reject attachment_paths
|
|
50
|
+
if (provider.id !== "gmail" && attachmentPaths?.length) {
|
|
51
|
+
return err("Attachments are only supported on Gmail.");
|
|
52
|
+
}
|
|
53
|
+
|
|
28
54
|
// Gmail: create a draft instead of sending directly
|
|
29
55
|
if (provider.id === "gmail") {
|
|
30
56
|
return withProviderToken(provider, async (token) => {
|
|
57
|
+
// Reply mode: thread_id provided — create a threaded draft with reply-all recipients
|
|
58
|
+
if (threadId) {
|
|
59
|
+
// Fetch thread messages to extract recipients and threading headers
|
|
60
|
+
const list = await listMessages(token, `thread:${threadId}`, 10);
|
|
61
|
+
if (!list.messages?.length) {
|
|
62
|
+
return err("No messages found in this thread.");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const messages = await batchGetMessages(
|
|
66
|
+
token,
|
|
67
|
+
list.messages.map((m) => m.id),
|
|
68
|
+
"metadata",
|
|
69
|
+
["From", "To", "Cc", "Message-ID", "Subject"],
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
// Use the latest message for threading and recipient extraction
|
|
73
|
+
const latest = messages[messages.length - 1];
|
|
74
|
+
const latestHeaders = latest.payload?.headers ?? [];
|
|
75
|
+
|
|
76
|
+
const messageIdHeader = extractHeader(latestHeaders, "Message-ID");
|
|
77
|
+
let replySubject = extractHeader(latestHeaders, "Subject");
|
|
78
|
+
if (replySubject && !replySubject.startsWith("Re:")) {
|
|
79
|
+
replySubject = `Re: ${replySubject}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Build reply-all recipient list, excluding the user's own email
|
|
83
|
+
const profile = await getProfile(token);
|
|
84
|
+
const userEmail = profile.emailAddress.toLowerCase();
|
|
85
|
+
|
|
86
|
+
const allRecipients = new Set<string>();
|
|
87
|
+
const allCc = new Set<string>();
|
|
88
|
+
|
|
89
|
+
// From the latest message: From goes to To, original To/Cc go to Cc
|
|
90
|
+
const fromAddr = extractHeader(latestHeaders, "From");
|
|
91
|
+
const toAddrs = extractHeader(latestHeaders, "To");
|
|
92
|
+
const ccAddrs = extractHeader(latestHeaders, "Cc");
|
|
93
|
+
|
|
94
|
+
if (fromAddr) allRecipients.add(fromAddr);
|
|
95
|
+
for (const addr of parseAddressList(toAddrs)) {
|
|
96
|
+
allRecipients.add(addr);
|
|
97
|
+
}
|
|
98
|
+
for (const addr of parseAddressList(ccAddrs)) {
|
|
99
|
+
allCc.add(addr);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Remove user's own email from recipients using exact email comparison
|
|
103
|
+
const filterSelf = (addr: string) => extractEmail(addr) !== userEmail;
|
|
104
|
+
const toList = [...allRecipients].filter(filterSelf);
|
|
105
|
+
const ccList = [...allCc].filter(filterSelf);
|
|
106
|
+
|
|
107
|
+
if (toList.length === 0) {
|
|
108
|
+
return err("Could not determine reply recipients from thread.");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// With attachments: build multipart MIME for threaded reply
|
|
112
|
+
if (attachmentPaths?.length) {
|
|
113
|
+
const attachments = await Promise.all(
|
|
114
|
+
attachmentPaths.map(async (filePath) => {
|
|
115
|
+
const data = await readFile(filePath);
|
|
116
|
+
const filename = basename(filePath);
|
|
117
|
+
const mimeType = guessMimeType(filePath);
|
|
118
|
+
return { filename, mimeType, data };
|
|
119
|
+
}),
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const raw = buildMultipartMime({
|
|
123
|
+
to: toList.join(", "),
|
|
124
|
+
subject: replySubject,
|
|
125
|
+
body: text,
|
|
126
|
+
inReplyTo: messageIdHeader || undefined,
|
|
127
|
+
cc: ccList.length > 0 ? ccList.join(", ") : undefined,
|
|
128
|
+
attachments,
|
|
129
|
+
});
|
|
130
|
+
const draft = await createDraftRaw(token, raw, threadId);
|
|
131
|
+
|
|
132
|
+
const filenames = attachments.map((a) => a.filename).join(", ");
|
|
133
|
+
const recipientSummary =
|
|
134
|
+
ccList.length > 0
|
|
135
|
+
? `To: ${toList.join(", ")}; Cc: ${ccList.join(", ")}`
|
|
136
|
+
: `To: ${toList.join(", ")}`;
|
|
137
|
+
return ok(
|
|
138
|
+
`Gmail draft created with ${attachments.length} attachment(s): ${filenames} (Draft ID: ${draft.id}). ${recipientSummary}. Review in Gmail Drafts, then tell me to send it or send it yourself.`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const draft = await createDraft(
|
|
143
|
+
token,
|
|
144
|
+
toList.join(", "),
|
|
145
|
+
replySubject,
|
|
146
|
+
text,
|
|
147
|
+
messageIdHeader || undefined,
|
|
148
|
+
ccList.length > 0 ? ccList.join(", ") : undefined,
|
|
149
|
+
undefined,
|
|
150
|
+
threadId,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const recipientSummary =
|
|
154
|
+
ccList.length > 0
|
|
155
|
+
? `To: ${toList.join(", ")}; Cc: ${ccList.join(", ")}`
|
|
156
|
+
: `To: ${toList.join(", ")}`;
|
|
157
|
+
return ok(
|
|
158
|
+
`Gmail draft created (ID: ${draft.id}). ${recipientSummary}. Review in Gmail Drafts, then tell me to send it or send it yourself.`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// With attachments: build multipart MIME and use createDraftRaw
|
|
163
|
+
if (attachmentPaths?.length) {
|
|
164
|
+
const attachments = await Promise.all(
|
|
165
|
+
attachmentPaths.map(async (filePath) => {
|
|
166
|
+
const data = await readFile(filePath);
|
|
167
|
+
const filename = basename(filePath);
|
|
168
|
+
const mimeType = guessMimeType(filePath);
|
|
169
|
+
return { filename, mimeType, data };
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const raw = buildMultipartMime({
|
|
174
|
+
to: conversationId,
|
|
175
|
+
subject: subject ?? "",
|
|
176
|
+
body: text,
|
|
177
|
+
inReplyTo,
|
|
178
|
+
attachments,
|
|
179
|
+
});
|
|
180
|
+
const draft = await createDraftRaw(token, raw, threadId);
|
|
181
|
+
|
|
182
|
+
const filenames = attachments.map((a) => a.filename).join(", ");
|
|
183
|
+
return ok(
|
|
184
|
+
`Gmail draft created with ${attachments.length} attachment(s): ${filenames} (Draft ID: ${draft.id}). Review in Gmail Drafts, then tell me to send it or send it yourself.`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Without attachments: use standard createDraft
|
|
31
189
|
const draft = await createDraft(
|
|
32
190
|
token,
|
|
33
191
|
conversationId,
|
|
34
192
|
subject ?? "",
|
|
35
193
|
text,
|
|
36
194
|
inReplyTo,
|
|
195
|
+
undefined,
|
|
196
|
+
undefined,
|
|
197
|
+
threadId,
|
|
37
198
|
);
|
|
38
199
|
return ok(
|
|
39
200
|
`Gmail draft created (ID: ${draft.id}). Review it in your Gmail Drafts, then tell me to send it or send it yourself from Gmail.`,
|
|
@@ -41,10 +202,12 @@ export async function run(
|
|
|
41
202
|
});
|
|
42
203
|
}
|
|
43
204
|
|
|
205
|
+
// Non-Gmail platforms
|
|
44
206
|
return withProviderToken(provider, async (token) => {
|
|
45
207
|
const result = await provider.sendMessage(token, conversationId, text, {
|
|
46
208
|
subject,
|
|
47
209
|
inReplyTo,
|
|
210
|
+
threadId,
|
|
48
211
|
assistantId: context.assistantId,
|
|
49
212
|
});
|
|
50
213
|
|
|
@@ -2,7 +2,6 @@ import type {
|
|
|
2
2
|
ToolContext,
|
|
3
3
|
ToolExecutionResult,
|
|
4
4
|
} from "../../../../tools/types.js";
|
|
5
|
-
import { storeScanResult } from "./scan-result-store.js";
|
|
6
5
|
import { err, ok, resolveProvider, withProviderToken } from "./shared.js";
|
|
7
6
|
|
|
8
7
|
export async function run(
|
|
@@ -55,24 +54,13 @@ export async function run(
|
|
|
55
54
|
search_query: s.searchQuery,
|
|
56
55
|
}));
|
|
57
56
|
|
|
58
|
-
// Store message IDs server-side to keep them out of LLM context
|
|
59
|
-
const scanId = storeScanResult(
|
|
60
|
-
result.senders.map((s) => ({
|
|
61
|
-
id: s.id,
|
|
62
|
-
messageIds: s.messageIds,
|
|
63
|
-
newestMessageId: s.newestMessageId,
|
|
64
|
-
newestUnsubscribableMessageId: null,
|
|
65
|
-
})),
|
|
66
|
-
);
|
|
67
|
-
|
|
68
57
|
return ok(
|
|
69
58
|
JSON.stringify({
|
|
70
|
-
scan_id: scanId,
|
|
71
59
|
senders,
|
|
72
60
|
total_scanned: result.totalScanned,
|
|
73
61
|
query_used: result.queryUsed,
|
|
74
62
|
...(result.truncated ? { truncated: true } : {}),
|
|
75
|
-
note: `message_count reflects emails found per sender within the ${result.totalScanned} messages scanned. Use
|
|
63
|
+
note: `message_count reflects emails found per sender within the ${result.totalScanned} messages scanned. Use messaging_archive_by_sender with the sender's search_query to archive their messages.`,
|
|
76
64
|
}),
|
|
77
65
|
);
|
|
78
66
|
});
|
|
@@ -2,11 +2,6 @@
|
|
|
2
2
|
* Shared utilities for messaging skill tools.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
request as httpsRequest,
|
|
7
|
-
type RequestOptions as HttpsRequestOptions,
|
|
8
|
-
} from "node:https";
|
|
9
|
-
|
|
10
5
|
import type { MessagingProvider } from "../../../../messaging/provider.js";
|
|
11
6
|
import {
|
|
12
7
|
getConnectedProviders,
|
|
@@ -24,6 +19,87 @@ export function err(message: string): ToolExecutionResult {
|
|
|
24
19
|
return { content: message, isError: true };
|
|
25
20
|
}
|
|
26
21
|
|
|
22
|
+
// ── RFC 5322 address helpers ──────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
export function extractHeader(
|
|
25
|
+
headers: Array<{ name: string; value: string }> | undefined,
|
|
26
|
+
name: string,
|
|
27
|
+
): string {
|
|
28
|
+
return (
|
|
29
|
+
headers?.find((h) => h.name.toLowerCase() === name.toLowerCase())?.value ??
|
|
30
|
+
""
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* RFC 5322-aware address list parser. Splits a header value like
|
|
36
|
+
* `"Doe, Jane" <jane@example.com>, bob@example.com` into individual
|
|
37
|
+
* addresses without breaking on commas inside quoted display names.
|
|
38
|
+
*/
|
|
39
|
+
export function parseAddressList(header: string): string[] {
|
|
40
|
+
const addresses: string[] = [];
|
|
41
|
+
let current = "";
|
|
42
|
+
let inQuotes = false;
|
|
43
|
+
let inAngle = false;
|
|
44
|
+
|
|
45
|
+
for (let i = 0; i < header.length; i++) {
|
|
46
|
+
const ch = header[i];
|
|
47
|
+
|
|
48
|
+
if (ch === '"' && !inAngle) {
|
|
49
|
+
inQuotes = !inQuotes;
|
|
50
|
+
current += ch;
|
|
51
|
+
} else if (ch === "<" && !inQuotes) {
|
|
52
|
+
inAngle = true;
|
|
53
|
+
current += ch;
|
|
54
|
+
} else if (ch === ">" && !inQuotes) {
|
|
55
|
+
inAngle = false;
|
|
56
|
+
current += ch;
|
|
57
|
+
} else if (ch === "," && !inQuotes && !inAngle) {
|
|
58
|
+
const trimmed = current.trim();
|
|
59
|
+
if (trimmed) addresses.push(trimmed);
|
|
60
|
+
current = "";
|
|
61
|
+
} else {
|
|
62
|
+
current += ch;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const trimmed = current.trim();
|
|
67
|
+
if (trimmed) addresses.push(trimmed);
|
|
68
|
+
|
|
69
|
+
return addresses;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Extracts the bare email from an address that may be in any of these forms:
|
|
74
|
+
* - `user@example.com`
|
|
75
|
+
* - `<user@example.com>`
|
|
76
|
+
* - `"Display Name" <user@example.com>`
|
|
77
|
+
* - `Display Name <user@example.com>`
|
|
78
|
+
* - `"Team <Ops>" <user@example.com>`
|
|
79
|
+
* - `user@example.com (team <ops>)`
|
|
80
|
+
*
|
|
81
|
+
* Extracts all angle-bracketed segments and picks the last one containing `@`,
|
|
82
|
+
* preferring the actual mailbox over display-name fragments like
|
|
83
|
+
* `"Acme <support@acme.com>" <owner@example.com>`. If no segment contains `@`,
|
|
84
|
+
* strips angle-bracketed portions and parenthetical comments, returning the
|
|
85
|
+
* remaining text. This handles display names with angle brackets and trailing
|
|
86
|
+
* RFC 5322 comments.
|
|
87
|
+
*/
|
|
88
|
+
export function extractEmail(address: string): string {
|
|
89
|
+
// Strip parenthetical comments first to avoid matching addresses inside them
|
|
90
|
+
const cleaned = address.replace(/\(.*?\)/g, "");
|
|
91
|
+
const segments = [...cleaned.matchAll(/<([^>]+)>/g)].map((m) => m[1]);
|
|
92
|
+
if (segments.length > 0) {
|
|
93
|
+
const emailSegment = [...segments].reverse().find((s) => s.includes("@"));
|
|
94
|
+
if (emailSegment) return emailSegment.trim().toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
return address
|
|
97
|
+
.replace(/<[^>]+>/g, "")
|
|
98
|
+
.replace(/\(.*?\)/g, "")
|
|
99
|
+
.trim()
|
|
100
|
+
.toLowerCase();
|
|
101
|
+
}
|
|
102
|
+
|
|
27
103
|
/**
|
|
28
104
|
* Resolve the messaging provider from user input.
|
|
29
105
|
* If platform is specified, look it up directly.
|
|
@@ -63,32 +139,3 @@ export async function withProviderToken<T>(
|
|
|
63
139
|
}
|
|
64
140
|
return withValidToken(provider.credentialService, fn);
|
|
65
141
|
}
|
|
66
|
-
|
|
67
|
-
/** Make an HTTPS request pinned to a specific resolved IP to prevent DNS rebinding. */
|
|
68
|
-
export function pinnedHttpsRequest(
|
|
69
|
-
target: URL,
|
|
70
|
-
resolvedAddress: string,
|
|
71
|
-
options?: {
|
|
72
|
-
method?: string;
|
|
73
|
-
headers?: Record<string, string>;
|
|
74
|
-
body?: string;
|
|
75
|
-
},
|
|
76
|
-
): Promise<number> {
|
|
77
|
-
return new Promise((resolve, reject) => {
|
|
78
|
-
const reqOpts: HttpsRequestOptions = {
|
|
79
|
-
method: options?.method ?? "GET",
|
|
80
|
-
hostname: resolvedAddress,
|
|
81
|
-
port: target.port ? Number(target.port) : undefined,
|
|
82
|
-
path: `${target.pathname}${target.search}`,
|
|
83
|
-
headers: { host: target.host, ...options?.headers },
|
|
84
|
-
servername: target.hostname,
|
|
85
|
-
};
|
|
86
|
-
const req = httpsRequest(reqOpts, (res) => {
|
|
87
|
-
res.resume();
|
|
88
|
-
resolve(res.statusCode ?? 0);
|
|
89
|
-
});
|
|
90
|
-
req.once("error", reject);
|
|
91
|
-
if (options?.body) req.write(options.body);
|
|
92
|
-
req.end();
|
|
93
|
-
});
|
|
94
|
-
}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
name: notifications
|
|
3
3
|
description: Send notifications through the unified notification router
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata:
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "🔔"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "Notifications"
|
|
9
|
+
user-invocable: true
|
|
6
10
|
---
|
|
7
11
|
|
|
8
12
|
Use `send_notification` for user-facing alerts and notifications. This tool routes through the unified notification pipeline, which handles channel selection, delivery, deduplication, and audit logging.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orchestration
|
|
3
|
+
description: Decompose complex tasks into parallel specialist subtasks
|
|
4
|
+
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "\U0001F500"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "Orchestration"
|
|
9
|
+
user-invocable: true
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Use `swarm_delegate` when facing complex multi-part tasks that benefit from parallel execution. The tool decomposes an objective into independent specialist subtasks, runs them concurrently, and synthesises the results.
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
- The request involves **multiple independent work streams** (e.g. research + coding + review).
|
|
17
|
+
- Tasks can run in parallel without sequential dependencies.
|
|
18
|
+
- The combined work would take significantly longer if done serially.
|
|
19
|
+
|
|
20
|
+
## When NOT to use
|
|
21
|
+
|
|
22
|
+
- Simple single-step requests — just do them directly.
|
|
23
|
+
- Tasks that are inherently sequential (each step depends on the previous result).
|
|
24
|
+
- Requests where the user is asking for a quick answer, not a deep workflow.
|
|
25
|
+
|
|
26
|
+
## Tips
|
|
27
|
+
|
|
28
|
+
- Provide a clear, specific `objective`. The planner uses it to decompose the work.
|
|
29
|
+
- Pass relevant `context` about the codebase or project when available.
|
|
30
|
+
- The `max_workers` parameter caps concurrency (1-6); the default comes from config.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"tools": [
|
|
4
|
+
{
|
|
5
|
+
"name": "swarm_delegate",
|
|
6
|
+
"description": "Decompose a complex task into parallel specialist subtasks and execute them concurrently. Use this for multi-part tasks that benefit from parallel research, coding, and review.",
|
|
7
|
+
"category": "orchestration",
|
|
8
|
+
"risk": "medium",
|
|
9
|
+
"input_schema": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"objective": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "The complex task to decompose and execute in parallel"
|
|
15
|
+
},
|
|
16
|
+
"context": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Optional additional context about the task or codebase"
|
|
19
|
+
},
|
|
20
|
+
"max_workers": {
|
|
21
|
+
"type": "number",
|
|
22
|
+
"description": "Maximum concurrent workers (1-6, default from config)"
|
|
23
|
+
},
|
|
24
|
+
"reason": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"description": "Brief non-technical explanation of what you are doing and why, shown to the user as a status update. Use simple language a non-technical person would understand."
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": ["objective"]
|
|
30
|
+
},
|
|
31
|
+
"executor": "tools/swarm-delegate.ts",
|
|
32
|
+
"execution_target": "host"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { swarmDelegateTool } from "../../../../tools/swarm/delegate.js";
|
|
2
2
|
import type {
|
|
3
3
|
ToolContext,
|
|
4
4
|
ToolExecutionResult,
|
|
@@ -6,7 +6,7 @@ import type {
|
|
|
6
6
|
|
|
7
7
|
export async function run(
|
|
8
8
|
input: Record<string, unknown>,
|
|
9
|
-
|
|
9
|
+
context: ToolContext,
|
|
10
10
|
): Promise<ToolExecutionResult> {
|
|
11
|
-
return
|
|
11
|
+
return swarmDelegateTool.execute(input, context);
|
|
12
12
|
}
|
|
@@ -2,7 +2,15 @@
|
|
|
2
2
|
name: phone-calls
|
|
3
3
|
description: Set up Twilio for AI-powered voice calls — both outgoing calls on behalf of the user and incoming calls where the assistant answers as a receptionist
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata:
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "📞"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "Phone Calls"
|
|
9
|
+
user-invocable: true
|
|
10
|
+
includes:
|
|
11
|
+
- "twilio-setup"
|
|
12
|
+
- "public-ingress"
|
|
13
|
+
- "elevenlabs-voice"
|
|
6
14
|
---
|
|
7
15
|
|
|
8
16
|
You are helping the user set up and manage phone calls via Twilio. This skill covers enabling the calls feature, placing outbound calls, receiving inbound calls, and interacting with live calls. Twilio credential storage, phone number provisioning, and public ingress are handled by the **twilio-setup** skill.
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
name: playbooks
|
|
3
3
|
description: Trigger-action automation rules for handling incoming messages
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata:
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "📖"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "Playbooks"
|
|
6
9
|
---
|
|
7
10
|
|
|
8
11
|
Playbooks are trigger-action automation rules that tell the assistant how to handle incoming messages matching a pattern.
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: schedule
|
|
3
|
-
description: Recurring
|
|
3
|
+
description: Recurring and one-shot scheduling — cron, RRULE, or single fire-at time
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata:
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "📅"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "Schedule"
|
|
6
9
|
---
|
|
7
10
|
|
|
8
|
-
Manage
|
|
11
|
+
Manage scheduled automations. Schedules can be **recurring** (cron or RRULE expression) or **one-shot** (a single `fire_at` timestamp). Both recurring and one-shot schedules support two modes: **execute** (run a message through the assistant) and **notify** (send a notification to the user).
|
|
9
12
|
|
|
10
13
|
## Schedule Syntax
|
|
11
14
|
|
|
@@ -62,19 +65,78 @@ Exclusions (EXDATE, EXRULE) always take precedence over inclusions (RRULE, RDATE
|
|
|
62
65
|
- `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1\nRDATE:20250704T090000Z` — 1st of each month plus July 4th
|
|
63
66
|
- `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=TU\nRRULE:FREQ=WEEKLY;BYDAY=TH` — union of Tuesdays and Thursdays
|
|
64
67
|
|
|
68
|
+
## One-Shot Schedules (Reminders)
|
|
69
|
+
|
|
70
|
+
To create a one-time schedule that fires once and is done, pass `fire_at` (an ISO 8601 timestamp) instead of an `expression`. This replaces the old reminder concept — "remind me at 3pm" becomes a one-shot schedule with `fire_at`.
|
|
71
|
+
|
|
72
|
+
One-shot schedules:
|
|
73
|
+
- Fire once at the specified time, then are marked as `fired` and disabled.
|
|
74
|
+
- Support both `execute` and `notify` modes (see below).
|
|
75
|
+
- Can be cancelled before they fire.
|
|
76
|
+
|
|
77
|
+
Examples:
|
|
78
|
+
- "remind me at 3pm" → `schedule_create` with `fire_at: "2025-03-15T15:00:00-05:00"`, `mode: "notify"`
|
|
79
|
+
- "at 5pm, check my email and summarize it" → `schedule_create` with `fire_at`, `mode: "execute"`
|
|
80
|
+
|
|
81
|
+
## Mode
|
|
82
|
+
|
|
83
|
+
The `mode` parameter controls what happens when a schedule fires:
|
|
84
|
+
|
|
85
|
+
- **execute** (default) — sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
|
|
86
|
+
- **notify** — sends a notification to the user via the notification pipeline. No assistant processing occurs.
|
|
87
|
+
|
|
88
|
+
Use `notify` for simple reminders ("remind me to take medicine at 9am") and `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest").
|
|
89
|
+
|
|
90
|
+
## Routing (notify mode)
|
|
91
|
+
|
|
92
|
+
Control how notify-mode schedules are delivered at trigger time with `routing_intent`:
|
|
93
|
+
|
|
94
|
+
- **single_channel** — deliver to one best channel
|
|
95
|
+
- **multi_channel** — deliver to a subset of channels
|
|
96
|
+
- **all_channels** (default) — deliver to every available channel
|
|
97
|
+
|
|
98
|
+
Optionally pass `routing_hints` (a JSON object) to influence routing decisions (e.g. preferred channels, exclusions).
|
|
99
|
+
|
|
100
|
+
### Routing Defaults
|
|
101
|
+
|
|
102
|
+
- **Default to `all_channels`** for most notifications. Users usually want to be notified wherever they are.
|
|
103
|
+
- **Use `single_channel`** only when the user explicitly specifies a single channel (e.g. "remind me on Telegram").
|
|
104
|
+
- **Check `user_message_channel`** from the turn context. If the user is currently active on a specific channel, include it as a routing hint:
|
|
105
|
+
```
|
|
106
|
+
routing_hints: { preferred_channels: ["vellum"] }
|
|
107
|
+
routing_intent: "all_channels"
|
|
108
|
+
```
|
|
109
|
+
|
|
65
110
|
## Tool Input
|
|
66
111
|
|
|
67
|
-
Use `syntax` + `expression` to specify the schedule type explicitly, or just `expression` to auto-detect.
|
|
112
|
+
Use `syntax` + `expression` to specify the schedule type explicitly, or just `expression` to auto-detect. For one-shot schedules, use `fire_at` instead of `expression`.
|
|
68
113
|
|
|
69
114
|
## Lifecycle
|
|
70
115
|
|
|
71
|
-
1. Create a schedule with a name
|
|
72
|
-
2. At each trigger time, the message is dispatched to the assistant
|
|
73
|
-
3. Schedules can be enabled/disabled, updated, or deleted.
|
|
116
|
+
1. Create a schedule with a name and either an expression (recurring) or fire_at (one-shot), plus a message.
|
|
117
|
+
2. At each trigger time, the message is dispatched to the assistant (execute mode) or a notification is sent (notify mode).
|
|
118
|
+
3. Schedules can be enabled/disabled, updated, or deleted. One-shot schedules are automatically disabled after firing.
|
|
74
119
|
|
|
75
120
|
## Tips
|
|
76
121
|
|
|
77
|
-
-
|
|
122
|
+
- Use `schedule_create` for both recurring automation ("every day at 9am") and one-time reminders ("remind me at 3pm").
|
|
123
|
+
- For task tracking ("add to my tasks", "add to my queue"), use task_list_add instead.
|
|
124
|
+
- `fire_at` must be a strict ISO 8601 timestamp with timezone offset or Z (e.g. `2025-03-15T09:00:00-05:00`).
|
|
125
|
+
|
|
126
|
+
### Anchored & Ambiguous Relative Time
|
|
127
|
+
|
|
128
|
+
Phrases like "at the 45 minute mark", "at the top of the hour", "at noon", or "20 minutes in" are **clock-position or anchored relative time** expressions. Do NOT treat them as offsets from now.
|
|
129
|
+
|
|
130
|
+
**Resolution rules (in priority order):**
|
|
131
|
+
|
|
132
|
+
1. **Session-anchored expressions** — if the user mentioned a start time earlier in conversation ("I got here at 9", "meeting started at 2:10"), interpret offset-style phrases ("the 45 minute mark", "20 minutes in") as `start_time + offset`.
|
|
133
|
+
|
|
134
|
+
2. **Clock-position expressions** — when no start time is in context, map directly to a wall-clock time:
|
|
135
|
+
- "top of the hour" → next :00
|
|
136
|
+
- "the X minute mark" → current hour's :XX; if already past, advance one hour
|
|
137
|
+
- "noon" / "midnight" → 12:00 PM or 12:00 AM today; if past, tomorrow
|
|
138
|
+
|
|
139
|
+
3. **Ask only if truly ambiguous** — if neither rule resolves, ask for clarification. Never silently default to "from now."
|
|
78
140
|
- Timezones default to the system timezone if omitted. Use IANA timezone identifiers (e.g. "America/Los_Angeles").
|
|
79
141
|
- Prefer RRULE for complex patterns that cron cannot express (e.g. "every other Tuesday", "last weekday of the month").
|
|
80
142
|
|
|
@@ -85,7 +147,6 @@ Before confirming a schedule to the user, you MUST verify that you have the capa
|
|
|
85
147
|
When `schedule_create` returns, it includes an integration status summary. Cross-reference the scheduled task's requirements against the available integrations:
|
|
86
148
|
|
|
87
149
|
- If the task involves **email** (reading, sending, OTP verification): an email integration must be connected (check the "email" category)
|
|
88
|
-
- If the task involves **tweeting or reading Twitter**: Twitter must be connected
|
|
89
150
|
- If the task involves **sending SMS or making calls**: SMS/Twilio must be connected
|
|
90
151
|
- If the task involves **web browsing or form-filling**: browser automation must be available (check client type)
|
|
91
152
|
- If the task involves a **multi-step workflow** (e.g., book appointment → read confirmation email), trace the full dependency chain
|