vellum 0.0.16 → 0.2.0
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/.dockerignore +27 -0
- package/.env.example +22 -0
- package/Dockerfile +99 -0
- package/Dockerfile.sandbox +5 -0
- package/README.md +150 -3
- package/bun.lock +1768 -0
- package/bunfig.toml +2 -0
- package/docs/skills.md +158 -0
- package/drizzle/0000_dizzy_maggott.sql +301 -0
- package/drizzle/meta/0000_snapshot.json +1999 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/eslint.config.mjs +17 -0
- package/hook-templates/debug-prompt-logger/hook.json +7 -0
- package/hook-templates/debug-prompt-logger/run.sh +68 -0
- package/knip.json +9 -0
- package/package.json +60 -10
- package/scripts/ipc/check-contract-inventory.ts +104 -0
- package/scripts/ipc/check-swift-decoder-drift.ts +163 -0
- package/scripts/ipc/generate-swift.ts +492 -0
- package/scripts/test-filesystem-tools.sh +48 -0
- package/scripts/test.sh +122 -0
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +2079 -0
- package/src/__tests__/account-registry.test.ts +244 -0
- package/src/__tests__/active-skill-tools.test.ts +378 -0
- package/src/__tests__/agent-loop-thinking.test.ts +81 -0
- package/src/__tests__/agent-loop.test.ts +1135 -0
- package/src/__tests__/anthropic-provider.test.ts +778 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +290 -0
- package/src/__tests__/app-bundler.test.ts +313 -0
- package/src/__tests__/app-executors.test.ts +613 -0
- package/src/__tests__/app-open-proxy.test.ts +62 -0
- package/src/__tests__/asset-materialize-tool.test.ts +451 -0
- package/src/__tests__/asset-search-tool.test.ts +476 -0
- package/src/__tests__/assistant-attachment-directive.test.ts +401 -0
- package/src/__tests__/assistant-attachments.test.ts +437 -0
- package/src/__tests__/assistant-event-hub.test.ts +226 -0
- package/src/__tests__/assistant-event.test.ts +123 -0
- package/src/__tests__/attachments-store.test.ts +547 -0
- package/src/__tests__/attachments.test.ts +134 -0
- package/src/__tests__/audit-log-rotation.test.ts +154 -0
- package/src/__tests__/browser-fill-credential.test.ts +309 -0
- package/src/__tests__/browser-manager.test.ts +203 -0
- package/src/__tests__/browser-runtime-check.test.ts +55 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +67 -0
- package/src/__tests__/browser-skill-endstate.test.ts +198 -0
- package/src/__tests__/bundle-scanner.test.ts +313 -0
- package/src/__tests__/checker.test.ts +3856 -0
- package/src/__tests__/clarification-resolver.test.ts +159 -0
- package/src/__tests__/classifier.test.ts +67 -0
- package/src/__tests__/claude-code-skill-regression.test.ts +127 -0
- package/src/__tests__/claude-code-tool-profiles.test.ts +88 -0
- package/src/__tests__/cli-discover.test.ts +85 -0
- package/src/__tests__/cli.test.ts +81 -0
- package/src/__tests__/clipboard.test.ts +80 -0
- package/src/__tests__/commit-guarantee.test.ts +335 -0
- package/src/__tests__/computer-use-session-compaction.test.ts +132 -0
- package/src/__tests__/computer-use-session-lifecycle.test.ts +293 -0
- package/src/__tests__/computer-use-session-working-dir.test.ts +117 -0
- package/src/__tests__/computer-use-skill-baseline.test.ts +74 -0
- package/src/__tests__/computer-use-skill-endstate.test.ts +89 -0
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +217 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +107 -0
- package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +54 -0
- package/src/__tests__/config-schema.test.ts +720 -0
- package/src/__tests__/conflict-store.test.ts +329 -0
- package/src/__tests__/connection-policy.test.ts +102 -0
- package/src/__tests__/context-memory-e2e.test.ts +434 -0
- package/src/__tests__/context-token-estimator.test.ts +135 -0
- package/src/__tests__/context-window-manager.test.ts +376 -0
- package/src/__tests__/contradiction-checker.test.ts +216 -0
- package/src/__tests__/conversation-store.test.ts +614 -0
- package/src/__tests__/credential-broker-browser-fill.test.ts +517 -0
- package/src/__tests__/credential-broker-server-use.test.ts +554 -0
- package/src/__tests__/credential-broker.test.ts +167 -0
- package/src/__tests__/credential-host-pattern-match.test.ts +104 -0
- package/src/__tests__/credential-metadata-store.test.ts +779 -0
- package/src/__tests__/credential-policy-validate.test.ts +121 -0
- package/src/__tests__/credential-resolve.test.ts +328 -0
- package/src/__tests__/credential-security-e2e.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +563 -0
- package/src/__tests__/credential-selection.test.ts +354 -0
- package/src/__tests__/credential-vault.test.ts +852 -0
- package/src/__tests__/daemon-assistant-events.test.ts +164 -0
- package/src/__tests__/daemon-server-session-init.test.ts +522 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +97 -0
- package/src/__tests__/diff.test.ts +121 -0
- package/src/__tests__/domain-normalize.test.ts +112 -0
- package/src/__tests__/domain-policy.test.ts +124 -0
- package/src/__tests__/doordash-client.test.ts +186 -0
- package/src/__tests__/doordash-session.test.ts +143 -0
- package/src/__tests__/dynamic-page-surface.test.ts +91 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +132 -0
- package/src/__tests__/edit-engine.test.ts +180 -0
- package/src/__tests__/email-cli.test.ts +283 -0
- package/src/__tests__/encrypted-store.test.ts +332 -0
- package/src/__tests__/entity-extractor.test.ts +190 -0
- package/src/__tests__/ephemeral-permissions.test.ts +312 -0
- package/src/__tests__/evaluate-typescript-tool.test.ts +286 -0
- package/src/__tests__/event-bus.test.ts +222 -0
- package/src/__tests__/file-edit-tool.test.ts +122 -0
- package/src/__tests__/file-ops-service.test.ts +330 -0
- package/src/__tests__/file-read-tool.test.ts +75 -0
- package/src/__tests__/file-write-tool.test.ts +113 -0
- package/src/__tests__/fixtures/credential-security-fixtures.ts +181 -0
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +126 -0
- package/src/__tests__/fixtures/mock-signup-server.ts +387 -0
- package/src/__tests__/fixtures/proxy-fixtures.ts +147 -0
- package/src/__tests__/fuzzy-match-property.test.ts +216 -0
- package/src/__tests__/fuzzy-match.test.ts +138 -0
- package/src/__tests__/gemini-image-service.test.ts +261 -0
- package/src/__tests__/gemini-provider.test.ts +651 -0
- package/src/__tests__/get-weather.test.ts +318 -0
- package/src/__tests__/gmail-integration.test.ts +73 -0
- package/src/__tests__/handlers-cu-observation-blob.test.ts +351 -0
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +190 -0
- package/src/__tests__/handlers-slack-config.test.ts +199 -0
- package/src/__tests__/handlers-task-submit-slash.test.ts +38 -0
- package/src/__tests__/headless-browser-interactions.test.ts +536 -0
- package/src/__tests__/headless-browser-navigate.test.ts +211 -0
- package/src/__tests__/headless-browser-read-tools.test.ts +261 -0
- package/src/__tests__/headless-browser-snapshot.test.ts +185 -0
- package/src/__tests__/history-repair-observability.test.ts +56 -0
- package/src/__tests__/history-repair.test.ts +510 -0
- package/src/__tests__/home-base-bootstrap.test.ts +77 -0
- package/src/__tests__/hooks-blocking.test.ts +128 -0
- package/src/__tests__/hooks-cli.test.ts +144 -0
- package/src/__tests__/hooks-config.test.ts +93 -0
- package/src/__tests__/hooks-discovery.test.ts +199 -0
- package/src/__tests__/hooks-integration.test.ts +189 -0
- package/src/__tests__/hooks-manager.test.ts +187 -0
- package/src/__tests__/hooks-runner.test.ts +178 -0
- package/src/__tests__/hooks-settings.test.ts +154 -0
- package/src/__tests__/hooks-templates.test.ts +137 -0
- package/src/__tests__/hooks-ts-runner.test.ts +125 -0
- package/src/__tests__/hooks-watch.test.ts +100 -0
- package/src/__tests__/host-file-edit-tool.test.ts +104 -0
- package/src/__tests__/host-file-read-tool.test.ts +61 -0
- package/src/__tests__/host-file-write-tool.test.ts +77 -0
- package/src/__tests__/host-shell-tool.test.ts +311 -0
- package/src/__tests__/intent-routing.test.ts +255 -0
- package/src/__tests__/ipc-blob-store.test.ts +315 -0
- package/src/__tests__/ipc-contract-inventory.test.ts +54 -0
- package/src/__tests__/ipc-contract.test.ts +74 -0
- package/src/__tests__/ipc-protocol.test.ts +113 -0
- package/src/__tests__/ipc-snapshot.test.ts +1560 -0
- package/src/__tests__/ipc-validate.test.ts +357 -0
- package/src/__tests__/key-migration.test.ts +183 -0
- package/src/__tests__/keychain.test.ts +258 -0
- package/src/__tests__/llm-usage-store.test.ts +226 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +257 -0
- package/src/__tests__/managed-store.test.ts +608 -0
- package/src/__tests__/media-generate-image.test.ts +238 -0
- package/src/__tests__/media-reuse-story.e2e.test.ts +676 -0
- package/src/__tests__/media-visibility-policy.test.ts +141 -0
- package/src/__tests__/memory-context-benchmark.test.ts +235 -0
- package/src/__tests__/memory-lifecycle-e2e.test.ts +481 -0
- package/src/__tests__/memory-query-builder.test.ts +59 -0
- package/src/__tests__/memory-recall-quality.test.ts +846 -0
- package/src/__tests__/memory-regressions.experimental.test.ts +538 -0
- package/src/__tests__/memory-regressions.test.ts +4238 -0
- package/src/__tests__/memory-retrieval-budget.test.ts +49 -0
- package/src/__tests__/migration-cli-flows.test.ts +169 -0
- package/src/__tests__/migration-ordering.test.ts +249 -0
- package/src/__tests__/mock-signup-server.test.ts +528 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +166 -0
- package/src/__tests__/onboarding-template-contract.test.ts +58 -0
- package/src/__tests__/openai-provider.test.ts +753 -0
- package/src/__tests__/parser.test.ts +472 -0
- package/src/__tests__/path-classifier.test.ts +73 -0
- package/src/__tests__/path-policy.test.ts +435 -0
- package/src/__tests__/platform-move-helper.test.ts +99 -0
- package/src/__tests__/platform-socket-path.test.ts +52 -0
- package/src/__tests__/platform-workspace-migration.test.ts +1000 -0
- package/src/__tests__/platform.test.ts +131 -0
- package/src/__tests__/prebuilt-home-base-seed.test.ts +71 -0
- package/src/__tests__/pricing.test.ts +256 -0
- package/src/__tests__/profile-compiler.test.ts +373 -0
- package/src/__tests__/provider-registry-ollama.test.ts +16 -0
- package/src/__tests__/proxy-approval-callback.test.ts +601 -0
- package/src/__tests__/ratelimit.test.ts +297 -0
- package/src/__tests__/registry.test.ts +487 -0
- package/src/__tests__/reminder-store.test.ts +220 -0
- package/src/__tests__/reminder.test.ts +263 -0
- package/src/__tests__/request-file-tool.test.ts +158 -0
- package/src/__tests__/run-orchestrator.test.ts +200 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +190 -0
- package/src/__tests__/runtime-runs-http.test.ts +451 -0
- package/src/__tests__/runtime-runs.test.ts +273 -0
- package/src/__tests__/sandbox-diagnostics.test.ts +408 -0
- package/src/__tests__/sandbox-host-parity.test.ts +950 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +253 -0
- package/src/__tests__/script-proxy-certs.test.ts +90 -0
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +177 -0
- package/src/__tests__/script-proxy-decision-trace.test.ts +156 -0
- package/src/__tests__/script-proxy-http-forwarder.test.ts +281 -0
- package/src/__tests__/script-proxy-injection-runtime.test.ts +401 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +407 -0
- package/src/__tests__/script-proxy-policy-runtime.test.ts +287 -0
- package/src/__tests__/script-proxy-policy.test.ts +310 -0
- package/src/__tests__/script-proxy-rewrite-specificity.test.ts +135 -0
- package/src/__tests__/script-proxy-router.test.ts +180 -0
- package/src/__tests__/script-proxy-session-manager.test.ts +382 -0
- package/src/__tests__/script-proxy-session-runtime.test.ts +113 -0
- package/src/__tests__/secret-allowlist.test.ts +229 -0
- package/src/__tests__/secret-ingress-handler.test.ts +99 -0
- package/src/__tests__/secret-onetime-send.test.ts +130 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +106 -0
- package/src/__tests__/secret-response-routing.test.ts +93 -0
- package/src/__tests__/secret-scanner-executor.test.ts +348 -0
- package/src/__tests__/secret-scanner.test.ts +857 -0
- package/src/__tests__/secure-keys.test.ts +323 -0
- package/src/__tests__/server-history-render.test.ts +430 -0
- package/src/__tests__/session-abort-tool-results.test.ts +240 -0
- package/src/__tests__/session-conflict-gate.test.ts +697 -0
- package/src/__tests__/session-error.test.ts +341 -0
- package/src/__tests__/session-evictor.test.ts +188 -0
- package/src/__tests__/session-load-history-repair.test.ts +222 -0
- package/src/__tests__/session-pre-run-repair.test.ts +213 -0
- package/src/__tests__/session-profile-injection.test.ts +444 -0
- package/src/__tests__/session-provider-retry-repair.test.ts +306 -0
- package/src/__tests__/session-queue.test.ts +1462 -0
- package/src/__tests__/session-runtime-assembly.test.ts +315 -0
- package/src/__tests__/session-runtime-workspace.test.ts +183 -0
- package/src/__tests__/session-skill-tools.test.ts +2431 -0
- package/src/__tests__/session-slash-known.test.ts +368 -0
- package/src/__tests__/session-slash-queue.test.ts +288 -0
- package/src/__tests__/session-slash-unknown.test.ts +271 -0
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +473 -0
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +140 -0
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +140 -0
- package/src/__tests__/session-undo.test.ts +75 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +246 -0
- package/src/__tests__/session-workspace-injection.test.ts +327 -0
- package/src/__tests__/session-workspace-tool-tracking.test.ts +240 -0
- package/src/__tests__/shared-filesystem-errors.test.ts +78 -0
- package/src/__tests__/shell-credential-ref.test.ts +187 -0
- package/src/__tests__/shell-parser-fuzz.test.ts +544 -0
- package/src/__tests__/shell-parser-property.test.ts +433 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +272 -0
- package/src/__tests__/signup-e2e.test.ts +352 -0
- package/src/__tests__/size-guard.test.ts +117 -0
- package/src/__tests__/skill-include-graph.test.ts +303 -0
- package/src/__tests__/skill-load-tool.test.ts +409 -0
- package/src/__tests__/skill-script-runner-host.test.ts +489 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +349 -0
- package/src/__tests__/skill-tool-factory.test.ts +252 -0
- package/src/__tests__/skill-tool-manifest.test.ts +658 -0
- package/src/__tests__/skill-version-hash.test.ts +182 -0
- package/src/__tests__/skills.test.ts +597 -0
- package/src/__tests__/slash-commands-catalog.test.ts +86 -0
- package/src/__tests__/slash-commands-parser.test.ts +119 -0
- package/src/__tests__/slash-commands-resolver.test.ts +193 -0
- package/src/__tests__/slash-commands-rewrite.test.ts +39 -0
- package/src/__tests__/starter-bundle.test.ts +136 -0
- package/src/__tests__/starter-task-flow.test.ts +143 -0
- package/src/__tests__/subagent-manager-notify.test.ts +372 -0
- package/src/__tests__/subagent-tools.test.ts +118 -0
- package/src/__tests__/subagent-types.test.ts +78 -0
- package/src/__tests__/swarm-orchestrator.test.ts +428 -0
- package/src/__tests__/swarm-plan-validator.test.ts +330 -0
- package/src/__tests__/swarm-recursion.test.ts +165 -0
- package/src/__tests__/swarm-router-planner.test.ts +208 -0
- package/src/__tests__/swarm-session-integration.test.ts +274 -0
- package/src/__tests__/swarm-tool.test.ts +145 -0
- package/src/__tests__/swarm-worker-backend.test.ts +129 -0
- package/src/__tests__/swarm-worker-runner.test.ts +272 -0
- package/src/__tests__/system-prompt.test.ts +461 -0
- package/src/__tests__/task-compiler.test.ts +283 -0
- package/src/__tests__/task-runner.test.ts +215 -0
- package/src/__tests__/task-scheduler.test.ts +216 -0
- package/src/__tests__/task-tools.test.ts +602 -0
- package/src/__tests__/terminal-sandbox-docker.test.ts +1064 -0
- package/src/__tests__/terminal-sandbox.integration.test.ts +178 -0
- package/src/__tests__/terminal-sandbox.test.ts +202 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +90 -0
- package/src/__tests__/test-support/computer-use-skill-harness.ts +45 -0
- package/src/__tests__/tool-audit-listener.test.ts +112 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +251 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +516 -0
- package/src/__tests__/tool-executor-redaction.test.ts +289 -0
- package/src/__tests__/tool-executor.test.ts +1971 -0
- package/src/__tests__/tool-metrics-listener.test.ts +225 -0
- package/src/__tests__/tool-notification-listener.test.ts +49 -0
- package/src/__tests__/tool-policy.test.ts +54 -0
- package/src/__tests__/tool-profiling-listener.test.ts +268 -0
- package/src/__tests__/tool-result-truncation.test.ts +217 -0
- package/src/__tests__/tool-trace-listener.test.ts +226 -0
- package/src/__tests__/top-level-renderer.test.ts +121 -0
- package/src/__tests__/top-level-scanner.test.ts +141 -0
- package/src/__tests__/trace-emitter.test.ts +173 -0
- package/src/__tests__/trust-store.test.ts +2030 -0
- package/src/__tests__/turn-commit.test.ts +219 -0
- package/src/__tests__/url-safety.test.ts +418 -0
- package/src/__tests__/weather-skill-regression.test.ts +225 -0
- package/src/__tests__/web-fetch.test.ts +869 -0
- package/src/__tests__/web-search.test.ts +584 -0
- package/src/__tests__/workspace-git-service.test.ts +750 -0
- package/src/__tests__/workspace-heartbeat-service.test.ts +347 -0
- package/src/__tests__/workspace-lifecycle.test.ts +292 -0
- package/src/agent/attachments.ts +35 -0
- package/src/agent/loop.ts +500 -0
- package/src/agent/message-types.ts +17 -0
- package/src/autonomy/autonomy-resolver.ts +60 -0
- package/src/autonomy/autonomy-store.ts +122 -0
- package/src/autonomy/disposition-mapper.ts +31 -0
- package/src/autonomy/index.ts +11 -0
- package/src/autonomy/types.ts +39 -0
- package/src/bundler/app-bundler.ts +274 -0
- package/src/bundler/bundle-scanner.ts +535 -0
- package/src/bundler/bundle-signer.ts +124 -0
- package/src/bundler/manifest.ts +21 -0
- package/src/bundler/signature-verifier.ts +184 -0
- package/src/cli/autonomy.ts +188 -0
- package/src/cli/contacts.ts +149 -0
- package/src/cli/doordash.ts +824 -0
- package/src/cli/email-guardrails.ts +200 -0
- package/src/cli/email.ts +405 -0
- package/src/cli/main-screen.tsx +155 -0
- package/src/cli.ts +935 -0
- package/src/config/bundled-skills/.gitkeep +0 -0
- package/src/config/bundled-skills/agentmail/SKILL.md +128 -0
- package/src/config/bundled-skills/agentmail/icon.svg +21 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +1348 -0
- package/src/config/bundled-skills/app-builder/TOOLS.json +279 -0
- package/src/config/bundled-skills/app-builder/icon.svg +9 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +15 -0
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +11 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +18 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +11 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +20 -0
- package/src/config/bundled-skills/browser/SKILL.md +28 -0
- package/src/config/bundled-skills/browser/TOOLS.json +234 -0
- package/src/config/bundled-skills/browser/tools/browser-click.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-close.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-type.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +9 -0
- package/src/config/bundled-skills/claude-code/SKILL.md +50 -0
- package/src/config/bundled-skills/claude-code/TOOLS.json +40 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +9 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +17 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +326 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +9 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +51 -0
- package/src/config/bundled-skills/google-calendar/TOOLS.json +108 -0
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +165 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +21 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +42 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +13 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +30 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +41 -0
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +18 -0
- package/src/config/bundled-skills/google-calendar/types.ts +97 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +32 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +42 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +137 -0
- package/src/config/bundled-skills/messaging/SKILL.md +126 -0
- package/src/config/bundled-skills/messaging/TOOLS.json +357 -0
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +26 -0
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +84 -0
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +18 -0
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +124 -0
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +16 -0
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +49 -0
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +21 -0
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +28 -0
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +29 -0
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +22 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +27 -0
- package/src/config/bundled-skills/messaging/tools/shared.ts +71 -0
- package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +23 -0
- package/src/config/bundled-skills/self-upgrade/SKILL.md +74 -0
- package/src/config/bundled-skills/start-the-day/SKILL.md +70 -0
- package/src/config/bundled-skills/start-the-day/icon.svg +13 -0
- package/src/config/bundled-skills/weather/SKILL.md +37 -0
- package/src/config/bundled-skills/weather/TOOLS.json +32 -0
- package/src/config/bundled-skills/weather/icon.svg +24 -0
- package/src/config/bundled-skills/weather/tools/get-weather.ts +9 -0
- package/src/config/computer-use-prompt.ts +97 -0
- package/src/config/defaults.ts +186 -0
- package/src/config/loader.ts +336 -0
- package/src/config/schema.ts +1004 -0
- package/src/config/skill-state.ts +95 -0
- package/src/config/skills.ts +972 -0
- package/src/config/system-prompt.ts +927 -0
- package/src/config/templates/BOOTSTRAP.md +70 -0
- package/src/config/templates/IDENTITY.md +18 -0
- package/src/config/templates/LOOKS.md +25 -0
- package/src/config/templates/SOUL.md +37 -0
- package/src/config/templates/USER.md +19 -0
- package/src/config/types.ts +32 -0
- package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +179 -0
- package/src/config/vellum-skills/document-writer/SKILL.md +195 -0
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +194 -0
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +147 -0
- package/src/config/vellum-skills/telegram-setup/SKILL.md +105 -0
- package/src/contacts/contact-store.ts +410 -0
- package/src/contacts/index.ts +11 -0
- package/src/contacts/types.ts +28 -0
- package/src/context/token-estimator.ts +108 -0
- package/src/context/tool-result-truncation.ts +128 -0
- package/src/context/window-manager.ts +531 -0
- package/src/daemon/assistant-attachments.ts +679 -0
- package/src/daemon/classifier.ts +108 -0
- package/src/daemon/computer-use-session.ts +900 -0
- package/src/daemon/connection-policy.ts +41 -0
- package/src/daemon/handlers/apps.ts +446 -0
- package/src/daemon/handlers/computer-use.ts +181 -0
- package/src/daemon/handlers/config.ts +434 -0
- package/src/daemon/handlers/diagnostics.ts +334 -0
- package/src/daemon/handlers/documents.ts +184 -0
- package/src/daemon/handlers/home-base.ts +73 -0
- package/src/daemon/handlers/index.ts +355 -0
- package/src/daemon/handlers/misc.ts +323 -0
- package/src/daemon/handlers/open-bundle-handler.ts +80 -0
- package/src/daemon/handlers/publish.ts +182 -0
- package/src/daemon/handlers/sessions.ts +486 -0
- package/src/daemon/handlers/shared.ts +533 -0
- package/src/daemon/handlers/skills.ts +487 -0
- package/src/daemon/handlers/subagents.ts +122 -0
- package/src/daemon/handlers/work-items.ts +176 -0
- package/src/daemon/handlers.ts +17 -0
- package/src/daemon/history-repair.ts +214 -0
- package/src/daemon/ipc-blob-store.ts +231 -0
- package/src/daemon/ipc-contract-inventory.json +407 -0
- package/src/daemon/ipc-contract-inventory.ts +126 -0
- package/src/daemon/ipc-contract.ts +2102 -0
- package/src/daemon/ipc-protocol.ts +70 -0
- package/src/daemon/ipc-validate.ts +171 -0
- package/src/daemon/lifecycle.ts +503 -0
- package/src/daemon/main.ts +15 -0
- package/src/daemon/media-visibility-policy.ts +57 -0
- package/src/daemon/ride-shotgun-handler.ts +244 -0
- package/src/daemon/server.ts +1085 -0
- package/src/daemon/session-attachments.ts +173 -0
- package/src/daemon/session-conflict-gate.ts +219 -0
- package/src/daemon/session-dynamic-profile.ts +63 -0
- package/src/daemon/session-error.ts +269 -0
- package/src/daemon/session-evictor.ts +196 -0
- package/src/daemon/session-history.ts +437 -0
- package/src/daemon/session-memory.ts +212 -0
- package/src/daemon/session-process.ts +264 -0
- package/src/daemon/session-queue-manager.ts +81 -0
- package/src/daemon/session-runtime-assembly.ts +395 -0
- package/src/daemon/session-skill-tools.ts +237 -0
- package/src/daemon/session-slash.ts +302 -0
- package/src/daemon/session-surfaces.ts +624 -0
- package/src/daemon/session-tool-setup.ts +286 -0
- package/src/daemon/session-usage.ts +74 -0
- package/src/daemon/session-workspace.ts +19 -0
- package/src/daemon/session.ts +1651 -0
- package/src/daemon/trace-emitter.ts +82 -0
- package/src/daemon/watch-handler.ts +274 -0
- package/src/doordash/client.ts +905 -0
- package/src/doordash/queries.ts +1312 -0
- package/src/doordash/query-extractor.ts +93 -0
- package/src/doordash/session.ts +82 -0
- package/src/email/provider.ts +117 -0
- package/src/email/providers/agentmail.ts +317 -0
- package/src/email/providers/index.ts +58 -0
- package/src/email/service.ts +303 -0
- package/src/email/types.ts +126 -0
- package/src/events/bus.ts +157 -0
- package/src/events/domain-events.ts +83 -0
- package/src/events/index.ts +18 -0
- package/src/events/tool-audit-listener.ts +80 -0
- package/src/events/tool-domain-event-publisher.ts +111 -0
- package/src/events/tool-metrics-listener.ts +159 -0
- package/src/events/tool-notification-listener.ts +17 -0
- package/src/events/tool-profiling-listener.ts +158 -0
- package/src/events/tool-trace-listener.ts +75 -0
- package/src/export/formatter.ts +96 -0
- package/src/followups/followup-store.ts +166 -0
- package/src/followups/index.ts +10 -0
- package/src/followups/types.ts +23 -0
- package/src/gallery/default-gallery.ts +795 -0
- package/src/gallery/gallery-manifest.ts +24 -0
- package/src/home-base/app-link-store.ts +82 -0
- package/src/home-base/bootstrap.ts +66 -0
- package/src/home-base/prebuilt/index.html +662 -0
- package/src/home-base/prebuilt/seed-metadata.json +21 -0
- package/src/home-base/prebuilt/seed.ts +101 -0
- package/src/home-base/prebuilt-home-base-updater.ts +30 -0
- package/src/hooks/cli.ts +163 -0
- package/src/hooks/config.ts +88 -0
- package/src/hooks/discovery.ts +110 -0
- package/src/hooks/manager.ts +128 -0
- package/src/hooks/runner.ts +123 -0
- package/src/hooks/templates.ts +52 -0
- package/src/hooks/types.ts +72 -0
- package/src/index.ts +1194 -0
- package/src/instrument.ts +60 -0
- package/src/logfire.ts +99 -0
- package/src/media/gemini-image-service.ts +136 -0
- package/src/memory/account-store.ts +108 -0
- package/src/memory/admin.ts +211 -0
- package/src/memory/app-store.ts +556 -0
- package/src/memory/attachments-store.ts +453 -0
- package/src/memory/channel-delivery-store.ts +368 -0
- package/src/memory/checkpoints.ts +52 -0
- package/src/memory/clarification-resolver.ts +297 -0
- package/src/memory/conflict-store.ts +342 -0
- package/src/memory/contradiction-checker.ts +329 -0
- package/src/memory/conversation-key-store.ts +127 -0
- package/src/memory/conversation-store.ts +469 -0
- package/src/memory/db.ts +1105 -0
- package/src/memory/embedding-backend.ts +229 -0
- package/src/memory/embedding-gemini.ts +52 -0
- package/src/memory/embedding-local.ts +75 -0
- package/src/memory/embedding-ollama.ts +55 -0
- package/src/memory/embedding-openai.ts +25 -0
- package/src/memory/entity-extractor.ts +471 -0
- package/src/memory/fingerprint.ts +20 -0
- package/src/memory/indexer.ts +156 -0
- package/src/memory/items-extractor.ts +460 -0
- package/src/memory/job-handlers/backfill.ts +139 -0
- package/src/memory/job-handlers/cleanup.ts +58 -0
- package/src/memory/job-handlers/conflict.ts +99 -0
- package/src/memory/job-handlers/embedding.ts +61 -0
- package/src/memory/job-handlers/extraction.ts +123 -0
- package/src/memory/job-handlers/index-maintenance.ts +54 -0
- package/src/memory/job-handlers/summarization.ts +286 -0
- package/src/memory/job-utils.ts +170 -0
- package/src/memory/jobs-store.ts +400 -0
- package/src/memory/jobs-worker.ts +274 -0
- package/src/memory/llm-request-log-store.ts +45 -0
- package/src/memory/llm-usage-store.ts +62 -0
- package/src/memory/message-content.ts +54 -0
- package/src/memory/profile-compiler.ts +160 -0
- package/src/memory/published-pages-store.ts +137 -0
- package/src/memory/qdrant-client.ts +366 -0
- package/src/memory/qdrant-manager.ts +242 -0
- package/src/memory/query-builder.ts +45 -0
- package/src/memory/retrieval-budget.ts +30 -0
- package/src/memory/retriever.ts +653 -0
- package/src/memory/runs-store.ts +211 -0
- package/src/memory/schema.ts +529 -0
- package/src/memory/search/entity.ts +298 -0
- package/src/memory/search/formatting.ts +207 -0
- package/src/memory/search/lexical.ts +227 -0
- package/src/memory/search/ranking.ts +401 -0
- package/src/memory/search/semantic.ts +121 -0
- package/src/memory/search/types.ts +137 -0
- package/src/memory/segmenter.ts +68 -0
- package/src/memory/shared-app-links-store.ts +138 -0
- package/src/memory/tool-usage-store.ts +62 -0
- package/src/messaging/activity-analyzer.ts +76 -0
- package/src/messaging/draft-store.ts +88 -0
- package/src/messaging/index.ts +3 -0
- package/src/messaging/provider-types.ts +80 -0
- package/src/messaging/provider.ts +43 -0
- package/src/messaging/providers/gmail/adapter.ts +193 -0
- package/src/messaging/providers/gmail/client.ts +204 -0
- package/src/messaging/providers/gmail/types.ts +90 -0
- package/src/messaging/providers/slack/adapter.ts +202 -0
- package/src/messaging/providers/slack/client.ts +198 -0
- package/src/messaging/providers/slack/types.ts +119 -0
- package/src/messaging/registry.ts +34 -0
- package/src/messaging/style-analyzer.ts +158 -0
- package/src/messaging/thread-summarizer.ts +310 -0
- package/src/messaging/triage-engine.ts +321 -0
- package/src/messaging/types.ts +55 -0
- package/src/permissions/checker.ts +636 -0
- package/src/permissions/defaults.ts +243 -0
- package/src/permissions/prompter.ts +102 -0
- package/src/permissions/secret-prompter.ts +114 -0
- package/src/permissions/trust-store.ts +584 -0
- package/src/permissions/types.ts +62 -0
- package/src/playbooks/index.ts +2 -0
- package/src/playbooks/playbook-compiler.ts +90 -0
- package/src/playbooks/types.ts +55 -0
- package/src/providers/anthropic/client.ts +751 -0
- package/src/providers/failover.ts +129 -0
- package/src/providers/fireworks/client.ts +20 -0
- package/src/providers/gemini/client.ts +285 -0
- package/src/providers/ollama/client.ts +30 -0
- package/src/providers/openai/client.ts +337 -0
- package/src/providers/ratelimit.ts +93 -0
- package/src/providers/registry.ts +138 -0
- package/src/providers/retry.ts +106 -0
- package/src/providers/stream-timeout.ts +38 -0
- package/src/providers/types.ts +109 -0
- package/src/runtime/assistant-event-hub.ts +120 -0
- package/src/runtime/assistant-event.ts +82 -0
- package/src/runtime/http-server.ts +478 -0
- package/src/runtime/http-types.ts +68 -0
- package/src/runtime/routes/app-routes.ts +174 -0
- package/src/runtime/routes/attachment-routes.ts +134 -0
- package/src/runtime/routes/channel-routes.ts +342 -0
- package/src/runtime/routes/conversation-routes.ts +349 -0
- package/src/runtime/routes/run-routes.ts +223 -0
- package/src/runtime/routes/secret-routes.ts +76 -0
- package/src/runtime/run-orchestrator.ts +206 -0
- package/src/schedule/schedule-store.ts +452 -0
- package/src/schedule/scheduler.ts +168 -0
- package/src/security/encrypted-store.ts +238 -0
- package/src/security/keychain.ts +252 -0
- package/src/security/oauth2.ts +241 -0
- package/src/security/redaction.ts +89 -0
- package/src/security/secret-allowlist.ts +118 -0
- package/src/security/secret-ingress.ts +57 -0
- package/src/security/secret-scanner.ts +543 -0
- package/src/security/secure-keys.ts +180 -0
- package/src/security/token-manager.ts +141 -0
- package/src/services/published-app-updater.ts +69 -0
- package/src/services/vercel-deploy.ts +73 -0
- package/src/skills/active-skill-tools.ts +81 -0
- package/src/skills/clawhub.ts +414 -0
- package/src/skills/include-graph.ts +146 -0
- package/src/skills/managed-store.ts +233 -0
- package/src/skills/path-classifier.ts +128 -0
- package/src/skills/slash-commands.ts +174 -0
- package/src/skills/tool-manifest.ts +165 -0
- package/src/skills/version-hash.ts +110 -0
- package/src/slack/slack-webhook.ts +61 -0
- package/src/subagent/index.ts +19 -0
- package/src/subagent/manager.ts +477 -0
- package/src/subagent/types.ts +69 -0
- package/src/swarm/backend-claude-code.ts +90 -0
- package/src/swarm/index.ts +44 -0
- package/src/swarm/limits.ts +37 -0
- package/src/swarm/orchestrator.ts +279 -0
- package/src/swarm/plan-validator.ts +151 -0
- package/src/swarm/router-planner.ts +100 -0
- package/src/swarm/router-prompts.ts +36 -0
- package/src/swarm/synthesizer.ts +62 -0
- package/src/swarm/types.ts +62 -0
- package/src/swarm/worker-backend.ts +121 -0
- package/src/swarm/worker-prompts.ts +78 -0
- package/src/swarm/worker-runner.ts +164 -0
- package/src/tasks/SPEC.md +133 -0
- package/src/tasks/candidate-store.ts +86 -0
- package/src/tasks/ephemeral-permissions.ts +41 -0
- package/src/tasks/task-compiler.ts +198 -0
- package/src/tasks/task-runner.ts +85 -0
- package/src/tasks/task-scheduler.ts +20 -0
- package/src/tasks/task-store.ts +127 -0
- package/src/tools/apps/definitions.ts +59 -0
- package/src/tools/apps/executors.ts +313 -0
- package/src/tools/apps/open-proxy.ts +43 -0
- package/src/tools/apps/registry.ts +16 -0
- package/src/tools/assets/materialize.ts +218 -0
- package/src/tools/assets/search.ts +396 -0
- package/src/tools/browser/__tests__/auth-cache.test.ts +219 -0
- package/src/tools/browser/__tests__/auth-detector.test.ts +362 -0
- package/src/tools/browser/__tests__/jit-auth.test.ts +189 -0
- package/src/tools/browser/auth-cache.ts +149 -0
- package/src/tools/browser/auth-detector.ts +347 -0
- package/src/tools/browser/browser-execution.ts +979 -0
- package/src/tools/browser/browser-handoff.ts +79 -0
- package/src/tools/browser/browser-manager.ts +715 -0
- package/src/tools/browser/browser-screencast.ts +217 -0
- package/src/tools/browser/headless-browser.ts +450 -0
- package/src/tools/browser/jit-auth.ts +51 -0
- package/src/tools/browser/network-recorder.ts +348 -0
- package/src/tools/browser/network-recording-types.ts +49 -0
- package/src/tools/browser/recording-store.ts +49 -0
- package/src/tools/browser/runtime-check.ts +43 -0
- package/src/tools/claude-code/claude-code.ts +232 -0
- package/src/tools/computer-use/definitions.ts +443 -0
- package/src/tools/computer-use/registry.ts +22 -0
- package/src/tools/computer-use/request-computer-control.ts +53 -0
- package/src/tools/computer-use/skill-proxy-bridge.ts +28 -0
- package/src/tools/contacts/contact-merge.ts +87 -0
- package/src/tools/contacts/contact-search.ts +102 -0
- package/src/tools/contacts/contact-upsert.ts +137 -0
- package/src/tools/contacts/index.ts +4 -0
- package/src/tools/credentials/account-registry.ts +127 -0
- package/src/tools/credentials/broker-types.ts +107 -0
- package/src/tools/credentials/broker.ts +372 -0
- package/src/tools/credentials/domain-policy.ts +51 -0
- package/src/tools/credentials/host-pattern-match.ts +60 -0
- package/src/tools/credentials/metadata-store.ts +335 -0
- package/src/tools/credentials/policy-types.ts +52 -0
- package/src/tools/credentials/policy-validate.ts +80 -0
- package/src/tools/credentials/resolve.ts +122 -0
- package/src/tools/credentials/selection.ts +159 -0
- package/src/tools/credentials/tool-policy.ts +25 -0
- package/src/tools/credentials/vault.ts +641 -0
- package/src/tools/document/document-tool.ts +165 -0
- package/src/tools/document/editor-template.ts +237 -0
- package/src/tools/document/index.ts +5 -0
- package/src/tools/executor.ts +825 -0
- package/src/tools/filesystem/edit.ts +127 -0
- package/src/tools/filesystem/fuzzy-match.ts +202 -0
- package/src/tools/filesystem/read.ts +71 -0
- package/src/tools/filesystem/view-image.ts +199 -0
- package/src/tools/filesystem/write.ts +79 -0
- package/src/tools/followups/followup_create.ts +118 -0
- package/src/tools/followups/followup_list.ts +100 -0
- package/src/tools/followups/followup_resolve.ts +91 -0
- package/src/tools/followups/index.ts +3 -0
- package/src/tools/host-filesystem/edit.ts +125 -0
- package/src/tools/host-filesystem/read.ts +80 -0
- package/src/tools/host-filesystem/write.ts +76 -0
- package/src/tools/host-terminal/cli-discover.ts +179 -0
- package/src/tools/host-terminal/host-shell.ts +181 -0
- package/src/tools/memory/definitions.ts +69 -0
- package/src/tools/memory/handlers.ts +245 -0
- package/src/tools/memory/register.ts +66 -0
- package/src/tools/network/domain-normalize.ts +85 -0
- package/src/tools/network/script-proxy/certs.ts +237 -0
- package/src/tools/network/script-proxy/connect-tunnel.ts +82 -0
- package/src/tools/network/script-proxy/http-forwarder.ts +151 -0
- package/src/tools/network/script-proxy/index.ts +28 -0
- package/src/tools/network/script-proxy/logging.ts +196 -0
- package/src/tools/network/script-proxy/mitm-handler.ts +269 -0
- package/src/tools/network/script-proxy/policy.ts +152 -0
- package/src/tools/network/script-proxy/router.ts +60 -0
- package/src/tools/network/script-proxy/server.ts +136 -0
- package/src/tools/network/script-proxy/session-manager.ts +534 -0
- package/src/tools/network/script-proxy/types.ts +125 -0
- package/src/tools/network/url-safety.ts +227 -0
- package/src/tools/network/web-fetch.ts +701 -0
- package/src/tools/network/web-search.ts +319 -0
- package/src/tools/playbooks/index.ts +5 -0
- package/src/tools/playbooks/playbook-create.ts +140 -0
- package/src/tools/playbooks/playbook-delete.ts +76 -0
- package/src/tools/playbooks/playbook-list.ts +101 -0
- package/src/tools/playbooks/playbook-update.ts +159 -0
- package/src/tools/registry.ts +297 -0
- package/src/tools/reminder/reminder-store.ts +148 -0
- package/src/tools/reminder/reminder.ts +153 -0
- package/src/tools/schedule/create.ts +86 -0
- package/src/tools/schedule/delete.ts +54 -0
- package/src/tools/schedule/list.ts +88 -0
- package/src/tools/schedule/update.ts +97 -0
- package/src/tools/shared/filesystem/edit-engine.ts +56 -0
- package/src/tools/shared/filesystem/errors.ts +85 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +215 -0
- package/src/tools/shared/filesystem/format-diff.ts +35 -0
- package/src/tools/shared/filesystem/path-policy.ts +125 -0
- package/src/tools/shared/filesystem/size-guard.ts +41 -0
- package/src/tools/shared/filesystem/types.ts +80 -0
- package/src/tools/shared/shell-output.ts +52 -0
- package/src/tools/skills/delete-managed.ts +60 -0
- package/src/tools/skills/load.ts +139 -0
- package/src/tools/skills/sandbox-runner.ts +279 -0
- package/src/tools/skills/scaffold-managed.ts +150 -0
- package/src/tools/skills/script-contract.ts +6 -0
- package/src/tools/skills/skill-script-runner.ts +86 -0
- package/src/tools/skills/skill-tool-factory.ts +64 -0
- package/src/tools/skills/vellum-catalog.ts +217 -0
- package/src/tools/subagent/abort.ts +62 -0
- package/src/tools/subagent/index.ts +5 -0
- package/src/tools/subagent/message.ts +72 -0
- package/src/tools/subagent/read.ts +98 -0
- package/src/tools/subagent/spawn.ts +85 -0
- package/src/tools/subagent/status.ts +74 -0
- package/src/tools/swarm/delegate.ts +182 -0
- package/src/tools/system/request-permission.ts +98 -0
- package/src/tools/tasks/index.ts +25 -0
- package/src/tools/tasks/task-delete.ts +69 -0
- package/src/tools/tasks/task-list.ts +65 -0
- package/src/tools/tasks/task-run.ts +125 -0
- package/src/tools/tasks/task-save.ts +79 -0
- package/src/tools/tasks/work-item-enqueue.ts +176 -0
- package/src/tools/tasks/work-item-list.ts +86 -0
- package/src/tools/terminal/backends/docker.ts +372 -0
- package/src/tools/terminal/backends/native.ts +188 -0
- package/src/tools/terminal/backends/types.ts +26 -0
- package/src/tools/terminal/evaluate-typescript.ts +275 -0
- package/src/tools/terminal/parser.ts +393 -0
- package/src/tools/terminal/safe-env.ts +37 -0
- package/src/tools/terminal/sandbox-diagnostics.ts +149 -0
- package/src/tools/terminal/sandbox.ts +44 -0
- package/src/tools/terminal/shell.ts +257 -0
- package/src/tools/tool-manifest.ts +250 -0
- package/src/tools/types.ts +177 -0
- package/src/tools/ui-surface/definitions.ts +232 -0
- package/src/tools/ui-surface/registry.ts +14 -0
- package/src/tools/watch/screen-watch.ts +128 -0
- package/src/tools/watch/watch-state.ts +119 -0
- package/src/tools/watcher/create.ts +110 -0
- package/src/tools/watcher/delete.ts +53 -0
- package/src/tools/watcher/digest.ts +84 -0
- package/src/tools/watcher/list.ts +90 -0
- package/src/tools/watcher/update.ts +102 -0
- package/src/tools/weather/service.ts +551 -0
- package/src/usage/actors.ts +24 -0
- package/src/usage/types.ts +38 -0
- package/src/util/clipboard.ts +33 -0
- package/src/util/content-id.ts +16 -0
- package/src/util/diff.ts +181 -0
- package/src/util/errors.ts +129 -0
- package/src/util/logger.ts +243 -0
- package/src/util/platform.ts +607 -0
- package/src/util/pricing.ts +150 -0
- package/src/util/spinner.ts +51 -0
- package/src/util/time.ts +16 -0
- package/src/util/xml.ts +4 -0
- package/src/version.ts +3 -0
- package/src/watcher/constants.ts +11 -0
- package/src/watcher/engine.ts +199 -0
- package/src/watcher/provider-registry.ts +15 -0
- package/src/watcher/provider-types.ts +48 -0
- package/src/watcher/providers/gmail.ts +198 -0
- package/src/watcher/providers/google-calendar.ts +228 -0
- package/src/watcher/providers/slack.ts +128 -0
- package/src/watcher/watcher-store.ts +418 -0
- package/src/work-items/work-item-store.ts +91 -0
- package/src/workspace/git-service.ts +620 -0
- package/src/workspace/heartbeat-service.ts +288 -0
- package/src/workspace/top-level-renderer.ts +19 -0
- package/src/workspace/top-level-scanner.ts +41 -0
- package/src/workspace/turn-commit.ts +122 -0
- package/tsconfig.json +21 -0
- package/LICENSE +0 -674
- package/dist/cli.js +0 -569
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { withValidToken } from '../../../../security/token-manager.js';
|
|
3
|
+
import { getMessagingProvider } from '../../../../messaging/registry.js';
|
|
4
|
+
import { getMessage, sendMessage } from '../../../../messaging/providers/gmail/client.js';
|
|
5
|
+
import { isPrivateOrLocalHost, resolveHostAddresses, resolveRequestAddress } from '../../../../tools/network/url-safety.js';
|
|
6
|
+
import { ok, err, pinnedHttpsRequest } from './shared.js';
|
|
7
|
+
|
|
8
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
9
|
+
const messageId = input.message_id as string;
|
|
10
|
+
|
|
11
|
+
if (!messageId) {
|
|
12
|
+
return err('message_id is required.');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const provider = getMessagingProvider('gmail');
|
|
17
|
+
return withValidToken(provider.credentialService, async (token) => {
|
|
18
|
+
const message = await getMessage(token, messageId, 'metadata', ['List-Unsubscribe', 'List-Unsubscribe-Post']);
|
|
19
|
+
const headers = message.payload?.headers ?? [];
|
|
20
|
+
const unsubHeader = headers.find((h) => h.name.toLowerCase() === 'list-unsubscribe')?.value;
|
|
21
|
+
|
|
22
|
+
if (!unsubHeader) {
|
|
23
|
+
return err('No List-Unsubscribe header found. Manual unsubscribe may be required.');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const httpsMatch = unsubHeader.match(/<(https:\/\/[^>]+)>/);
|
|
27
|
+
const mailtoMatch = unsubHeader.match(/<mailto:([^>]+)>/);
|
|
28
|
+
const postHeader = headers.find((h) => h.name.toLowerCase() === 'list-unsubscribe-post')?.value;
|
|
29
|
+
|
|
30
|
+
if (httpsMatch) {
|
|
31
|
+
const url = httpsMatch[1];
|
|
32
|
+
let parsed: URL;
|
|
33
|
+
let validatedAddresses: string[];
|
|
34
|
+
try {
|
|
35
|
+
parsed = new URL(url);
|
|
36
|
+
if (parsed.protocol !== 'https:') {
|
|
37
|
+
return err('Unsubscribe URL must use HTTPS.');
|
|
38
|
+
}
|
|
39
|
+
if (isPrivateOrLocalHost(parsed.hostname)) {
|
|
40
|
+
return err('Unsubscribe URL points to a private or local address.');
|
|
41
|
+
}
|
|
42
|
+
const { addresses, blockedAddress } = await resolveRequestAddress(parsed.hostname, resolveHostAddresses, false);
|
|
43
|
+
if (blockedAddress) {
|
|
44
|
+
return err('Unsubscribe URL resolves to a private or local address.');
|
|
45
|
+
}
|
|
46
|
+
if (addresses.length === 0) {
|
|
47
|
+
return err('Unable to resolve unsubscribe URL hostname.');
|
|
48
|
+
}
|
|
49
|
+
validatedAddresses = addresses;
|
|
50
|
+
} catch {
|
|
51
|
+
return err('Invalid unsubscribe URL.');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const method = postHeader ? 'POST' : 'GET';
|
|
55
|
+
const reqOpts = postHeader
|
|
56
|
+
? { method: 'POST' as const, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: postHeader }
|
|
57
|
+
: undefined;
|
|
58
|
+
|
|
59
|
+
let lastStatus = 0;
|
|
60
|
+
for (const address of validatedAddresses) {
|
|
61
|
+
try {
|
|
62
|
+
lastStatus = await pinnedHttpsRequest(parsed, address, reqOpts);
|
|
63
|
+
if (lastStatus >= 200 && lastStatus < 400) {
|
|
64
|
+
return ok(`Successfully unsubscribed via HTTPS ${method}.`);
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return err(`Unsubscribe request failed: ${lastStatus}`);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (mailtoMatch) {
|
|
74
|
+
const mailtoAddr = mailtoMatch[1].split('?')[0];
|
|
75
|
+
await sendMessage(token, mailtoAddr, 'Unsubscribe', 'Unsubscribe');
|
|
76
|
+
return ok(`Unsubscribe email sent to ${mailtoAddr}.`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return err('No supported unsubscribe method found (requires https: or mailto: URL).');
|
|
80
|
+
});
|
|
81
|
+
} catch (e) {
|
|
82
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { classifyActivity } from '../../../../messaging/activity-analyzer.js';
|
|
3
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
4
|
+
|
|
5
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
6
|
+
const platform = input.platform as string | undefined;
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
const provider = resolveProvider(platform);
|
|
10
|
+
return withProviderToken(provider, async (token) => {
|
|
11
|
+
const conversations = await provider.listConversations(token);
|
|
12
|
+
const summary = classifyActivity(conversations, provider.id);
|
|
13
|
+
return ok(JSON.stringify(summary, null, 2));
|
|
14
|
+
});
|
|
15
|
+
} catch (e) {
|
|
16
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { and, eq } from 'drizzle-orm';
|
|
2
|
+
import { v4 as uuid } from 'uuid';
|
|
3
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
4
|
+
import { getDb } from '../../../../memory/db.js';
|
|
5
|
+
import { computeMemoryFingerprint } from '../../../../memory/fingerprint.js';
|
|
6
|
+
import { memoryItems } from '../../../../memory/schema.js';
|
|
7
|
+
import { enqueueMemoryJob } from '../../../../memory/jobs-store.js';
|
|
8
|
+
import { extractStylePatterns } from '../../../../messaging/style-analyzer.js';
|
|
9
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
10
|
+
|
|
11
|
+
function clamp(value: number, min: number, max: number): number {
|
|
12
|
+
return Math.min(max, Math.max(min, value));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function upsertMemoryItem(opts: {
|
|
16
|
+
kind: string;
|
|
17
|
+
subject: string;
|
|
18
|
+
statement: string;
|
|
19
|
+
importance: number;
|
|
20
|
+
scopeId: string;
|
|
21
|
+
}): void {
|
|
22
|
+
const db = getDb();
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const fingerprint = computeMemoryFingerprint(opts.scopeId, opts.kind, opts.subject, opts.statement);
|
|
25
|
+
|
|
26
|
+
const existing = db
|
|
27
|
+
.select()
|
|
28
|
+
.from(memoryItems)
|
|
29
|
+
.where(and(eq(memoryItems.fingerprint, fingerprint), eq(memoryItems.scopeId, opts.scopeId)))
|
|
30
|
+
.get();
|
|
31
|
+
|
|
32
|
+
if (existing) {
|
|
33
|
+
db.update(memoryItems)
|
|
34
|
+
.set({
|
|
35
|
+
statement: opts.statement,
|
|
36
|
+
status: 'active',
|
|
37
|
+
importance: Math.max(existing.importance ?? 0, opts.importance),
|
|
38
|
+
lastSeenAt: now,
|
|
39
|
+
verificationState: 'assistant_inferred',
|
|
40
|
+
})
|
|
41
|
+
.where(eq(memoryItems.id, existing.id))
|
|
42
|
+
.run();
|
|
43
|
+
enqueueMemoryJob('embed_item', { itemId: existing.id });
|
|
44
|
+
} else {
|
|
45
|
+
const id = uuid();
|
|
46
|
+
db.insert(memoryItems).values({
|
|
47
|
+
id,
|
|
48
|
+
kind: opts.kind,
|
|
49
|
+
subject: opts.subject,
|
|
50
|
+
statement: opts.statement,
|
|
51
|
+
status: 'active',
|
|
52
|
+
confidence: 0.8,
|
|
53
|
+
importance: opts.importance,
|
|
54
|
+
fingerprint,
|
|
55
|
+
verificationState: 'assistant_inferred',
|
|
56
|
+
scopeId: opts.scopeId,
|
|
57
|
+
firstSeenAt: now,
|
|
58
|
+
lastSeenAt: now,
|
|
59
|
+
lastUsedAt: null,
|
|
60
|
+
}).run();
|
|
61
|
+
enqueueMemoryJob('embed_item', { itemId: id });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function run(input: Record<string, unknown>, context: ToolContext): Promise<ToolExecutionResult> {
|
|
66
|
+
const platform = input.platform as string | undefined;
|
|
67
|
+
const maxMessages = Math.min(Math.max((input.max_messages as number) ?? 50, 1), 100);
|
|
68
|
+
const queryFilter = input.query_filter as string | undefined;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const provider = resolveProvider(platform);
|
|
72
|
+
return withProviderToken(provider, async (token) => {
|
|
73
|
+
// Search for sent messages using the platform's search
|
|
74
|
+
const query = queryFilter ?? (provider.id === 'gmail' ? 'in:sent' : 'from:me');
|
|
75
|
+
const searchResult = await provider.search(token, query, { count: maxMessages });
|
|
76
|
+
|
|
77
|
+
if (searchResult.messages.length === 0) {
|
|
78
|
+
return err('No sent messages found. Send some messages first, then try again.');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const result = await extractStylePatterns(searchResult.messages);
|
|
82
|
+
|
|
83
|
+
if (result.stylePatterns.length === 0) {
|
|
84
|
+
return err('No style patterns were extracted. Try with more messages.');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const scopeId = context.memoryScopeId ?? 'default';
|
|
88
|
+
let savedCount = 0;
|
|
89
|
+
|
|
90
|
+
for (const pattern of result.stylePatterns) {
|
|
91
|
+
const subject = `${provider.id} writing style: ${pattern.aspect}`;
|
|
92
|
+
const importance = clamp(pattern.importance ?? 0.65, 0.55, 0.85);
|
|
93
|
+
upsertMemoryItem({ kind: 'style', subject, statement: pattern.summary, importance, scopeId });
|
|
94
|
+
savedCount++;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
for (const contact of result.contactObservations) {
|
|
98
|
+
if (!contact.name || !contact.toneNote) continue;
|
|
99
|
+
const subject = `${provider.id} relationship: ${contact.name}`;
|
|
100
|
+
upsertMemoryItem({
|
|
101
|
+
kind: 'relationship',
|
|
102
|
+
subject,
|
|
103
|
+
statement: `${contact.name} (${contact.email}): ${contact.toneNote}`.slice(0, 500),
|
|
104
|
+
importance: 0.6,
|
|
105
|
+
scopeId,
|
|
106
|
+
});
|
|
107
|
+
savedCount++;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const aspects = result.stylePatterns.map((p) => p.aspect).join(', ');
|
|
111
|
+
const contactCount = result.contactObservations.length;
|
|
112
|
+
const summary = [
|
|
113
|
+
`Analyzed ${searchResult.messages.length} messages on ${provider.displayName}.`,
|
|
114
|
+
`Extracted ${result.stylePatterns.length} style patterns (${aspects}).`,
|
|
115
|
+
contactCount > 0 ? `Noted ${contactCount} recurring contact relationship(s).` : '',
|
|
116
|
+
`Saved ${savedCount} memory items. Future drafts will automatically reflect your writing style.`,
|
|
117
|
+
].filter(Boolean).join(' ');
|
|
118
|
+
|
|
119
|
+
return ok(summary);
|
|
120
|
+
});
|
|
121
|
+
} catch (e) {
|
|
122
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
|
|
7
|
+
try {
|
|
8
|
+
const provider = resolveProvider(platform);
|
|
9
|
+
return withProviderToken(provider, async (token) => {
|
|
10
|
+
const info = await provider.testConnection(token);
|
|
11
|
+
return ok(JSON.stringify(info, null, 2));
|
|
12
|
+
});
|
|
13
|
+
} catch (e) {
|
|
14
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { createDraft, listDrafts, deleteDraft } from '../../../../messaging/draft-store.js';
|
|
3
|
+
import { ok, err } from './shared.js';
|
|
4
|
+
|
|
5
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
6
|
+
const action = input.action as string;
|
|
7
|
+
|
|
8
|
+
switch (action) {
|
|
9
|
+
case 'create': {
|
|
10
|
+
const platform = input.platform as string | undefined;
|
|
11
|
+
const conversationId = input.conversation_id as string | undefined;
|
|
12
|
+
const text = input.text as string | undefined;
|
|
13
|
+
|
|
14
|
+
if (!platform) return err('platform is required for creating a draft.');
|
|
15
|
+
if (!conversationId) return err('conversation_id is required for creating a draft.');
|
|
16
|
+
if (!text) return err('text is required for creating a draft.');
|
|
17
|
+
|
|
18
|
+
const draft = createDraft({
|
|
19
|
+
platform,
|
|
20
|
+
conversationId,
|
|
21
|
+
text,
|
|
22
|
+
threadId: input.thread_id as string | undefined,
|
|
23
|
+
subject: input.subject as string | undefined,
|
|
24
|
+
});
|
|
25
|
+
return ok(`Draft created (ID: ${draft.id}). Stored locally for review.`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
case 'list': {
|
|
29
|
+
const platform = input.platform as string | undefined;
|
|
30
|
+
if (!platform) return err('platform is required for listing drafts.');
|
|
31
|
+
const drafts = listDrafts(platform);
|
|
32
|
+
if (drafts.length === 0) return ok('No drafts found.');
|
|
33
|
+
return ok(JSON.stringify(drafts, null, 2));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
case 'delete': {
|
|
37
|
+
const draftId = input.draft_id as string | undefined;
|
|
38
|
+
const platform = input.platform as string | undefined;
|
|
39
|
+
if (!draftId) return err('draft_id is required for deleting a draft.');
|
|
40
|
+
if (!platform) return err('platform is required for deleting a draft.');
|
|
41
|
+
const deleted = deleteDraft(platform, draftId);
|
|
42
|
+
if (!deleted) return err('Draft not found.');
|
|
43
|
+
return ok('Draft deleted.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
default:
|
|
47
|
+
return err(`Unknown action "${action}". Use "create", "list", or "delete".`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const types = input.types as string[] | undefined;
|
|
7
|
+
const limit = input.limit as number | undefined;
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
const provider = resolveProvider(platform);
|
|
11
|
+
return withProviderToken(provider, async (token) => {
|
|
12
|
+
const conversations = await provider.listConversations(token, {
|
|
13
|
+
types: types as Array<'channel' | 'dm' | 'group' | 'inbox'> | undefined,
|
|
14
|
+
limit,
|
|
15
|
+
});
|
|
16
|
+
return ok(JSON.stringify(conversations, null, 2));
|
|
17
|
+
});
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const conversationId = input.conversation_id as string;
|
|
7
|
+
const messageId = input.message_id as string | undefined;
|
|
8
|
+
|
|
9
|
+
if (!conversationId) {
|
|
10
|
+
return err('conversation_id is required.');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
const provider = resolveProvider(platform);
|
|
15
|
+
if (!provider.markRead) {
|
|
16
|
+
return err(`${provider.displayName} does not support marking messages as read.`);
|
|
17
|
+
}
|
|
18
|
+
return withProviderToken(provider, async (token) => {
|
|
19
|
+
await provider.markRead!(token, conversationId, messageId);
|
|
20
|
+
return ok('Marked as read.');
|
|
21
|
+
});
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const conversationId = input.conversation_id as string;
|
|
7
|
+
const limit = input.limit as number | undefined;
|
|
8
|
+
const threadId = input.thread_id as string | undefined;
|
|
9
|
+
|
|
10
|
+
if (!conversationId) {
|
|
11
|
+
return err('conversation_id is required.');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const provider = resolveProvider(platform);
|
|
16
|
+
return withProviderToken(provider, async (token) => {
|
|
17
|
+
let messages;
|
|
18
|
+
if (threadId && provider.getThreadReplies) {
|
|
19
|
+
messages = await provider.getThreadReplies(token, conversationId, threadId, { limit });
|
|
20
|
+
} else {
|
|
21
|
+
messages = await provider.getHistory(token, conversationId, { limit });
|
|
22
|
+
}
|
|
23
|
+
return ok(JSON.stringify(messages, null, 2));
|
|
24
|
+
});
|
|
25
|
+
} catch (e) {
|
|
26
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const conversationId = input.conversation_id as string;
|
|
7
|
+
const threadId = input.thread_id as string;
|
|
8
|
+
const text = input.text as string;
|
|
9
|
+
|
|
10
|
+
if (!conversationId) {
|
|
11
|
+
return err('conversation_id is required.');
|
|
12
|
+
}
|
|
13
|
+
if (!threadId) {
|
|
14
|
+
return err('thread_id is required.');
|
|
15
|
+
}
|
|
16
|
+
if (!text) {
|
|
17
|
+
return err('text is required.');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const provider = resolveProvider(platform);
|
|
22
|
+
return withProviderToken(provider, async (token) => {
|
|
23
|
+
const result = await provider.sendMessage(token, conversationId, text, { threadId });
|
|
24
|
+
return ok(`Reply sent (ID: ${result.id}).`);
|
|
25
|
+
});
|
|
26
|
+
} catch (e) {
|
|
27
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const query = input.query as string;
|
|
7
|
+
const maxResults = input.max_results as number | undefined;
|
|
8
|
+
|
|
9
|
+
if (!query) {
|
|
10
|
+
return err('query is required.');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
const provider = resolveProvider(platform);
|
|
15
|
+
return withProviderToken(provider, async (token) => {
|
|
16
|
+
const result = await provider.search(token, query, { count: maxResults });
|
|
17
|
+
return ok(JSON.stringify(result, null, 2));
|
|
18
|
+
});
|
|
19
|
+
} catch (e) {
|
|
20
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { resolveProvider, withProviderToken, ok, err } from './shared.js';
|
|
3
|
+
|
|
4
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
5
|
+
const platform = input.platform as string | undefined;
|
|
6
|
+
const conversationId = input.conversation_id as string;
|
|
7
|
+
const text = input.text as string;
|
|
8
|
+
const subject = input.subject as string | undefined;
|
|
9
|
+
const inReplyTo = input.in_reply_to as string | undefined;
|
|
10
|
+
|
|
11
|
+
if (!conversationId) {
|
|
12
|
+
return err('conversation_id is required.');
|
|
13
|
+
}
|
|
14
|
+
if (!text) {
|
|
15
|
+
return err('text is required.');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const provider = resolveProvider(platform);
|
|
20
|
+
return withProviderToken(provider, async (token) => {
|
|
21
|
+
const result = await provider.sendMessage(token, conversationId, text, { subject, inReplyTo });
|
|
22
|
+
return ok(`Message sent (ID: ${result.id}).`);
|
|
23
|
+
});
|
|
24
|
+
} catch (e) {
|
|
25
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for messaging skill tools.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { request as httpsRequest, type RequestOptions as HttpsRequestOptions } from 'node:https';
|
|
6
|
+
import { withValidToken } from '../../../../security/token-manager.js';
|
|
7
|
+
import { getMessagingProvider, getConnectedProviders } from '../../../../messaging/registry.js';
|
|
8
|
+
import type { MessagingProvider } from '../../../../messaging/provider.js';
|
|
9
|
+
import type { ToolExecutionResult } from '../../../../tools/types.js';
|
|
10
|
+
|
|
11
|
+
export function ok(content: string): ToolExecutionResult {
|
|
12
|
+
return { content, isError: false };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function err(message: string): ToolExecutionResult {
|
|
16
|
+
return { content: message, isError: true };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the messaging provider from user input.
|
|
21
|
+
* If platform is specified, look it up directly.
|
|
22
|
+
* If only one provider is connected, auto-select it.
|
|
23
|
+
* Otherwise, throw asking the user to specify.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveProvider(platformInput?: string): MessagingProvider {
|
|
26
|
+
if (platformInput) return getMessagingProvider(platformInput);
|
|
27
|
+
|
|
28
|
+
const connected = getConnectedProviders();
|
|
29
|
+
if (connected.length === 1) return connected[0];
|
|
30
|
+
if (connected.length === 0) {
|
|
31
|
+
throw new Error('No messaging platforms are connected. Use messaging_auth_test to check connection status, then set up a platform.');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const names = connected.map((p) => `"${p.id}"`).join(', ');
|
|
35
|
+
throw new Error(`Multiple platforms connected (${names}). Specify platform parameter.`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Execute a callback with a valid OAuth token for the given provider.
|
|
40
|
+
*/
|
|
41
|
+
export async function withProviderToken<T>(
|
|
42
|
+
provider: MessagingProvider,
|
|
43
|
+
fn: (token: string) => Promise<T>,
|
|
44
|
+
): Promise<T> {
|
|
45
|
+
return withValidToken(provider.credentialService, fn);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Make an HTTPS request pinned to a specific resolved IP to prevent DNS rebinding. */
|
|
49
|
+
export function pinnedHttpsRequest(
|
|
50
|
+
target: URL,
|
|
51
|
+
resolvedAddress: string,
|
|
52
|
+
options?: { method?: string; headers?: Record<string, string>; body?: string },
|
|
53
|
+
): Promise<number> {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const reqOpts: HttpsRequestOptions = {
|
|
56
|
+
method: options?.method ?? 'GET',
|
|
57
|
+
hostname: resolvedAddress,
|
|
58
|
+
port: target.port ? Number(target.port) : undefined,
|
|
59
|
+
path: `${target.pathname}${target.search}`,
|
|
60
|
+
headers: { host: target.host, ...options?.headers },
|
|
61
|
+
servername: target.hostname,
|
|
62
|
+
};
|
|
63
|
+
const req = httpsRequest(reqOpts, (res) => {
|
|
64
|
+
res.resume();
|
|
65
|
+
resolve(res.statusCode ?? 0);
|
|
66
|
+
});
|
|
67
|
+
req.once('error', reject);
|
|
68
|
+
if (options?.body) req.write(options.body);
|
|
69
|
+
req.end();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { withValidToken } from '../../../../security/token-manager.js';
|
|
3
|
+
import { getMessagingProvider } from '../../../../messaging/registry.js';
|
|
4
|
+
import { addReaction } from '../../../../messaging/providers/slack/client.js';
|
|
5
|
+
import { ok, err } from './shared.js';
|
|
6
|
+
|
|
7
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
8
|
+
const channel = input.channel as string;
|
|
9
|
+
const timestamp = input.timestamp as string;
|
|
10
|
+
const emoji = input.emoji as string;
|
|
11
|
+
|
|
12
|
+
if (!channel || !timestamp || !emoji) {
|
|
13
|
+
return err('channel, timestamp, and emoji are all required.');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const provider = getMessagingProvider('slack');
|
|
18
|
+
return withValidToken(provider.credentialService, async (token) => {
|
|
19
|
+
await addReaction(token, channel, timestamp, emoji);
|
|
20
|
+
return ok(`Added :${emoji}: reaction.`);
|
|
21
|
+
});
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
|
|
2
|
+
import { withValidToken } from '../../../../security/token-manager.js';
|
|
3
|
+
import { getMessagingProvider } from '../../../../messaging/registry.js';
|
|
4
|
+
import { leaveConversation } from '../../../../messaging/providers/slack/client.js';
|
|
5
|
+
import { ok, err } from './shared.js';
|
|
6
|
+
|
|
7
|
+
export async function run(input: Record<string, unknown>, _context: ToolContext): Promise<ToolExecutionResult> {
|
|
8
|
+
const channel = input.channel as string;
|
|
9
|
+
|
|
10
|
+
if (!channel) {
|
|
11
|
+
return err('channel is required.');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const provider = getMessagingProvider('slack');
|
|
16
|
+
return withValidToken(provider.credentialService, async (token) => {
|
|
17
|
+
await leaveConversation(token, channel);
|
|
18
|
+
return ok('Left channel.');
|
|
19
|
+
});
|
|
20
|
+
} catch (e) {
|
|
21
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Self Upgrade"
|
|
3
|
+
description: "Upgrade velly to the latest version, restart the daemon, and restart the gateway"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
metadata: {"vellum": {"emoji": "⬆️"}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are performing a self-upgrade of the Vellum assistant. Follow these steps **in order**. Use the `bash` tool to run each command. Confirm each step succeeds before moving to the next.
|
|
9
|
+
|
|
10
|
+
## Step 1: Record the current version
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
vellum --version
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Save this value to report later.
|
|
17
|
+
|
|
18
|
+
## Step 2: Install the latest velly
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bun update -g velly
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If `velly` was not installed globally via bun, try:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm update -g velly
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
After updating, verify the new version:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
vellum --version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Step 3: Restart the gateway
|
|
37
|
+
|
|
38
|
+
If a gateway process is running, restart it so it picks up any protocol or dependency changes from the new version:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pgrep -f 'vellum-gateway|gateway/src/index.ts' || echo "No gateway process found"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If a gateway PID is found, send it SIGTERM so it drains gracefully:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pkill -TERM -f 'vellum-gateway|gateway/src/index.ts'
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Then start the gateway again using whatever method the user's deployment uses (e.g. `bun run gateway/src/index.ts`, a systemd service, or a container orchestrator). If you are unsure how the gateway is deployed, ask the user.
|
|
51
|
+
|
|
52
|
+
## Step 4: Restart the daemon
|
|
53
|
+
|
|
54
|
+
Use `vellum daemon restart` which stops the old daemon and starts a new one from the updated binary in a single command:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
vellum daemon restart
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Verify it is running:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
vellum daemon status
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Important:** This is the last step because the current daemon process is the one executing this conversation. After the restart, the new daemon takes over and this session ends gracefully.
|
|
67
|
+
|
|
68
|
+
## After Upgrade
|
|
69
|
+
|
|
70
|
+
Report back to the user with:
|
|
71
|
+
- The previous and new velly version
|
|
72
|
+
- Daemon status (running, PID)
|
|
73
|
+
- Gateway status (restarted or not found)
|
|
74
|
+
- Any errors encountered during the process
|