@vellumai/assistant 0.4.26 → 0.4.29
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/.env.example +2 -2
- package/AGENTS.md +5 -0
- package/ARCHITECTURE.md +169 -69
- package/Dockerfile +1 -1
- package/README.md +111 -112
- package/bun.lock +0 -3
- package/docs/architecture/integrations.md +0 -1
- package/docs/architecture/memory.md +100 -63
- package/docs/error-handling.md +71 -0
- package/docs/runbook-trusted-contacts.md +10 -9
- package/docs/trusted-contact-access.md +48 -46
- package/package.json +3 -3
- package/scripts/compare-benchmarks.sh +12 -5
- package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
- package/scripts/test.sh +89 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/account-registry.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +36 -23
- package/src/__tests__/agent-loop-thinking.test.ts +29 -13
- package/src/__tests__/agent-loop.test.ts +2 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/asset-materialize-tool.test.ts +7 -7
- package/src/__tests__/asset-search-tool.test.ts +7 -7
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
- package/src/__tests__/call-controller.test.ts +99 -69
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +113 -70
- package/src/__tests__/channel-guardian.test.ts +173 -282
- package/src/__tests__/channel-readiness-service.test.ts +6 -2
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +14 -14
- package/src/__tests__/checker.test.ts +12 -31
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
- package/src/__tests__/compaction.benchmark.test.ts +6 -2
- package/src/__tests__/computer-use-tools.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +66 -7
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
- package/src/__tests__/contacts-tools.test.ts +63 -2
- package/src/__tests__/context-overflow-approval.test.ts +141 -0
- package/src/__tests__/context-overflow-policy.test.ts +171 -0
- package/src/__tests__/context-overflow-reducer.test.ts +533 -0
- package/src/__tests__/context-window-manager.test.ts +97 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
- package/src/__tests__/conversation-routes.test.ts +4 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
- package/src/__tests__/credential-security-e2e.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/credential-vault-unit.test.ts +1 -1
- package/src/__tests__/credential-vault.test.ts +11 -8
- package/src/__tests__/daemon-lifecycle.test.ts +2 -2
- package/src/__tests__/daemon-server-session-init.test.ts +6 -6
- package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
- package/src/__tests__/encrypted-store.test.ts +10 -7
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/file-edit-tool.test.ts +1 -1
- package/src/__tests__/file-read-tool.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +1 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
- package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
- package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -0
- package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
- package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +79 -1
- package/src/__tests__/guardian-grant-minting.test.ts +14 -14
- package/src/__tests__/guardian-outbound-http.test.ts +1 -2
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
- package/src/__tests__/guardian-routing-state.test.ts +36 -52
- package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
- package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
- package/src/__tests__/handlers-telegram-config.test.ts +14 -14
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +45 -2
- package/src/__tests__/host-file-edit-tool.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +1 -1
- package/src/__tests__/host-file-write-tool.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
- package/src/__tests__/ingress-reconcile.test.ts +2 -2
- package/src/__tests__/ingress-routes-http.test.ts +2 -1
- package/src/__tests__/integrations-cli.test.ts +256 -0
- package/src/__tests__/intent-routing.test.ts +4 -5
- package/src/__tests__/invite-redemption-service.test.ts +4 -3
- package/src/__tests__/ipc-snapshot.test.ts +28 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +136 -57
- package/src/__tests__/mcp-client-auth.test.ts +95 -0
- package/src/__tests__/media-generate-image.test.ts +2 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
- package/src/__tests__/memory-regressions.test.ts +6 -6
- package/src/__tests__/messaging-send-tool.test.ts +1 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
- package/src/__tests__/migration-export-http.test.ts +540 -0
- package/src/__tests__/migration-import-commit-http.test.ts +823 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
- package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
- package/src/__tests__/migration-transport.test.ts +904 -0
- package/src/__tests__/migration-validate-http.test.ts +698 -0
- package/src/__tests__/migration-wizard.test.ts +1289 -0
- package/src/__tests__/non-member-access-request.test.ts +17 -17
- package/src/__tests__/notification-decision-strategy.test.ts +110 -2
- package/src/__tests__/notification-deep-link.test.ts +18 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
- package/src/__tests__/proxy-approval-callback.test.ts +1 -1
- package/src/__tests__/qdrant-manager.test.ts +40 -11
- package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/recording-intent-handler.test.ts +3 -3
- package/src/__tests__/recording-state-machine.test.ts +2 -2
- package/src/__tests__/relay-server.test.ts +506 -227
- package/src/__tests__/reminder-store.test.ts +8 -0
- package/src/__tests__/reminder.test.ts +8 -0
- package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
- package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
- package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
- package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
- package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
- package/src/__tests__/script-proxy-policy.test.ts +2 -2
- package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
- package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
- package/src/__tests__/secret-onetime-send.test.ts +4 -4
- package/src/__tests__/secret-scanner-executor.test.ts +2 -2
- package/src/__tests__/send-endpoint-busy.test.ts +11 -9
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +17 -2
- package/src/__tests__/session-agent-loop.test.ts +456 -35
- package/src/__tests__/session-confirmation-signals.test.ts +3 -2
- package/src/__tests__/session-conflict-gate.test.ts +20 -3
- package/src/__tests__/session-init.benchmark.test.ts +2 -2
- package/src/__tests__/session-load-history-repair.test.ts +7 -7
- package/src/__tests__/session-pre-run-repair.test.ts +17 -2
- package/src/__tests__/session-profile-injection.test.ts +20 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
- package/src/__tests__/session-queue.test.ts +33 -18
- package/src/__tests__/session-runtime-assembly.test.ts +147 -1
- package/src/__tests__/session-runtime-workspace.test.ts +40 -0
- package/src/__tests__/session-slash-known.test.ts +21 -3
- package/src/__tests__/session-slash-queue.test.ts +17 -2
- package/src/__tests__/session-slash-unknown.test.ts +17 -2
- package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
- package/src/__tests__/session-workspace-injection.test.ts +17 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
- package/src/__tests__/shell-credential-ref.test.ts +1 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-script-runner-host.test.ts +1 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
- package/src/__tests__/skill-script-runner.test.ts +1 -1
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +3 -2
- package/src/__tests__/subagent-tools.test.ts +3 -3
- package/src/__tests__/swarm-recursion.test.ts +1 -1
- package/src/__tests__/swarm-session-integration.test.ts +1 -1
- package/src/__tests__/swarm-tool.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-tools.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
- package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +23 -182
- package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
- package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
- package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
- package/src/__tests__/trust-context-guards.test.ts +25 -29
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
- package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
- package/src/__tests__/trusted-contact-verification.test.ts +63 -77
- package/src/__tests__/turn-commit.test.ts +18 -18
- package/src/__tests__/twilio-provider.test.ts +7 -7
- package/src/__tests__/validation-results-screen.test.ts +1107 -0
- package/src/__tests__/view-image-tool.test.ts +1 -1
- package/src/__tests__/voice-invite-redemption.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
- package/src/__tests__/voice-session-bridge.test.ts +24 -24
- package/src/agent/attachments.ts +3 -1
- package/src/agent/loop.ts +13 -13
- package/src/agent/message-types.ts +13 -7
- package/src/amazon/cart.ts +59 -32
- package/src/amazon/checkout.ts +25 -14
- package/src/amazon/client.ts +68 -48
- package/src/amazon/product-details.ts +3 -3
- package/src/amazon/request-extractor.ts +46 -31
- package/src/amazon/search.ts +6 -4
- package/src/amazon/session.ts +33 -24
- package/src/approvals/AGENTS.md +26 -0
- package/src/approvals/approval-primitive.ts +87 -64
- package/src/approvals/guardian-decision-primitive.ts +172 -81
- package/src/approvals/guardian-request-resolvers.ts +262 -155
- package/src/autonomy/autonomy-resolver.ts +7 -5
- package/src/autonomy/autonomy-store.ts +34 -19
- package/src/autonomy/disposition-mapper.ts +5 -5
- package/src/autonomy/index.ts +6 -6
- package/src/autonomy/types.ts +7 -3
- package/src/browser-extension-relay/client.ts +50 -19
- package/src/browser-extension-relay/protocol.ts +11 -11
- package/src/browser-extension-relay/server.ts +45 -20
- package/src/bundler/app-bundler.ts +75 -50
- package/src/bundler/bundle-scanner.ts +145 -41
- package/src/bundler/bundle-signer.ts +16 -14
- package/src/bundler/signature-verifier.ts +36 -33
- package/src/calls/call-constants.ts +10 -3
- package/src/calls/call-controller.ts +473 -214
- package/src/calls/call-conversation-messages.ts +25 -15
- package/src/calls/call-domain.ts +401 -148
- package/src/calls/call-pointer-message-composer.ts +26 -21
- package/src/calls/call-pointer-messages.ts +52 -28
- package/src/calls/call-recovery.ts +53 -37
- package/src/calls/call-state-machine.ts +37 -7
- package/src/calls/call-state.ts +35 -13
- package/src/calls/call-store.ts +165 -77
- package/src/calls/elevenlabs-client.ts +39 -20
- package/src/calls/guardian-action-sweep.ts +42 -24
- package/src/calls/guardian-dispatch.ts +79 -56
- package/src/calls/guardian-question-copy.ts +28 -23
- package/src/calls/relay-server.ts +1121 -532
- package/src/calls/speaker-identification.ts +21 -15
- package/src/calls/twilio-config.ts +34 -17
- package/src/calls/twilio-provider.ts +108 -55
- package/src/calls/twilio-rest.ts +212 -100
- package/src/calls/twilio-routes.ts +165 -92
- package/src/calls/types.ts +55 -7
- package/src/calls/voice-quality.ts +6 -4
- package/src/calls/voice-session-bridge.ts +181 -133
- package/src/channels/config.ts +17 -13
- package/src/channels/types.ts +38 -10
- package/src/cli/amazon.ts +333 -227
- package/src/cli/config-commands.ts +236 -146
- package/src/cli/core-commands.ts +403 -329
- package/src/cli/email-guardrails.ts +38 -19
- package/src/cli/email.ts +207 -153
- package/src/cli/influencer.ts +58 -56
- package/src/cli/integrations.ts +362 -0
- package/src/cli/ipc-client.ts +24 -19
- package/src/cli/map.ts +176 -129
- package/src/cli/mcp.ts +260 -152
- package/src/cli/sequence.ts +165 -107
- package/src/cli/twitter.ts +302 -218
- package/src/cli.ts +418 -279
- package/src/commands/cc-command-registry.ts +52 -27
- package/src/config/agent-schema.ts +217 -134
- package/src/config/assistant-feature-flags.ts +23 -18
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
- package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
- package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
- package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
- package/src/config/bundled-skills/contacts/SKILL.md +446 -15
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
- package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
- package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
- package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
- package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
- package/src/config/bundled-skills/google-calendar/types.ts +3 -3
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
- package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
- package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
- package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
- package/src/config/bundled-skills/messaging/SKILL.md +7 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
- package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
- package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
- package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
- package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
- package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
- package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
- package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
- package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
- package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
- package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
- package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
- package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
- package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
- package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
- package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
- package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
- package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
- package/src/config/bundled-skills/slack/TOOLS.json +33 -15
- package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
- package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
- package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
- package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
- package/src/config/bundled-skills/twitter/SKILL.md +19 -2
- package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
- package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
- package/src/config/calls-schema.ts +108 -63
- package/src/config/computer-use-prompt.ts +7 -7
- package/src/config/core-schema.ts +239 -155
- package/src/config/defaults.ts +2 -2
- package/src/config/elevenlabs-schema.ts +15 -15
- package/src/config/env-registry.ts +33 -33
- package/src/config/feature-flag-registry.json +31 -7
- package/src/config/loader.ts +118 -58
- package/src/config/mcp-schema.ts +29 -15
- package/src/config/memory-schema.ts +434 -229
- package/src/config/notifications-schema.ts +4 -4
- package/src/config/sandbox-schema.ts +2 -2
- package/src/config/schema.ts +12 -2
- package/src/config/skill-state.ts +27 -15
- package/src/config/skills-schema.ts +72 -23
- package/src/config/skills.ts +303 -143
- package/src/config/system-prompt.ts +25 -6
- package/src/config/types.ts +1 -1
- package/src/config/update-bulletin-format.ts +3 -3
- package/src/config/update-bulletin-state.ts +15 -6
- package/src/config/update-bulletin-template-path.ts +8 -4
- package/src/config/update-bulletin.ts +33 -14
- package/src/config/user-reference.ts +8 -8
- package/src/contacts/contact-events.ts +21 -0
- package/src/contacts/contact-store.ts +622 -100
- package/src/contacts/contacts-write.ts +287 -0
- package/src/contacts/index.ts +13 -4
- package/src/contacts/startup-migration.ts +21 -0
- package/src/contacts/types.ts +47 -2
- package/src/context/token-estimator.ts +54 -31
- package/src/context/tool-result-truncation.ts +41 -7
- package/src/context/window-manager.ts +225 -120
- package/src/daemon/approval-generators.ts +83 -55
- package/src/daemon/approved-devices-store.ts +33 -20
- package/src/daemon/assistant-attachments.ts +134 -98
- package/src/daemon/auth-manager.ts +17 -15
- package/src/daemon/classifier.ts +117 -46
- package/src/daemon/computer-use-session.ts +316 -187
- package/src/daemon/config-watcher.ts +91 -44
- package/src/daemon/connection-policy.ts +18 -10
- package/src/daemon/context-overflow-approval.ts +48 -0
- package/src/daemon/context-overflow-policy.ts +50 -0
- package/src/daemon/context-overflow-reducer.ts +300 -0
- package/src/daemon/daemon-control.ts +79 -51
- package/src/daemon/date-context.ts +119 -69
- package/src/daemon/dictation-profile-store.ts +94 -48
- package/src/daemon/dictation-text-processing.ts +33 -12
- package/src/daemon/doordash-steps.ts +92 -49
- package/src/daemon/guardian-action-generators.ts +62 -46
- package/src/daemon/guardian-verification-intent.ts +31 -18
- package/src/daemon/handlers/apps.ts +257 -111
- package/src/daemon/handlers/avatar.ts +20 -15
- package/src/daemon/handlers/computer-use.ts +82 -39
- package/src/daemon/handlers/config-channels.ts +146 -69
- package/src/daemon/handlers/config-heartbeat.ts +114 -59
- package/src/daemon/handlers/config-inbox.ts +277 -106
- package/src/daemon/handlers/config-ingress.ts +127 -55
- package/src/daemon/handlers/config-integrations.ts +145 -88
- package/src/daemon/handlers/config-model.ts +58 -22
- package/src/daemon/handlers/config-platform.ts +40 -16
- package/src/daemon/handlers/config-scheduling.ts +109 -48
- package/src/daemon/handlers/config-slack-channel.ts +67 -35
- package/src/daemon/handlers/config-slack.ts +21 -20
- package/src/daemon/handlers/config-telegram.ts +100 -70
- package/src/daemon/handlers/config-tools.ts +103 -55
- package/src/daemon/handlers/config-trust.ts +50 -20
- package/src/daemon/handlers/config.ts +72 -24
- package/src/daemon/handlers/contacts.ts +163 -0
- package/src/daemon/handlers/diagnostics.ts +90 -48
- package/src/daemon/handlers/documents.ts +74 -46
- package/src/daemon/handlers/guardian-actions.ts +118 -71
- package/src/daemon/handlers/home-base.ts +19 -16
- package/src/daemon/handlers/identity.ts +65 -45
- package/src/daemon/handlers/index.ts +78 -54
- package/src/daemon/handlers/misc.ts +664 -234
- package/src/daemon/handlers/navigate-settings.ts +14 -11
- package/src/daemon/handlers/oauth-connect.ts +48 -35
- package/src/daemon/handlers/open-bundle-handler.ts +31 -24
- package/src/daemon/handlers/pairing.ts +51 -25
- package/src/daemon/handlers/publish.ts +55 -33
- package/src/daemon/handlers/recording.ts +378 -162
- package/src/daemon/handlers/sessions.ts +923 -423
- package/src/daemon/handlers/shared.ts +202 -117
- package/src/daemon/handlers/signing.ts +25 -6
- package/src/daemon/handlers/subagents.ts +117 -56
- package/src/daemon/handlers/twitter-auth.ts +70 -49
- package/src/daemon/handlers/work-items.ts +264 -112
- package/src/daemon/handlers/workspace-files.ts +27 -20
- package/src/daemon/handlers.ts +2 -2
- package/src/daemon/history-repair.ts +16 -15
- package/src/daemon/identity-helpers.ts +4 -4
- package/src/daemon/install-cli-launchers.ts +33 -22
- package/src/daemon/ipc-blob-store.ts +38 -24
- package/src/daemon/ipc-contract/apps.ts +61 -49
- package/src/daemon/ipc-contract/computer-use.ts +47 -37
- package/src/daemon/ipc-contract/contacts.ts +69 -0
- package/src/daemon/ipc-contract/diagnostics.ts +14 -14
- package/src/daemon/ipc-contract/documents.ts +8 -8
- package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
- package/src/daemon/ipc-contract/inbox.ts +16 -16
- package/src/daemon/ipc-contract/integrations.ts +57 -44
- package/src/daemon/ipc-contract/memory.ts +3 -5
- package/src/daemon/ipc-contract/messages.ts +95 -69
- package/src/daemon/ipc-contract/notifications.ts +10 -6
- package/src/daemon/ipc-contract/pairing.ts +8 -8
- package/src/daemon/ipc-contract/schedules.ts +20 -20
- package/src/daemon/ipc-contract/sessions.ts +88 -57
- package/src/daemon/ipc-contract/settings.ts +12 -7
- package/src/daemon/ipc-contract/shared.ts +9 -7
- package/src/daemon/ipc-contract/skills.ts +46 -26
- package/src/daemon/ipc-contract/subagents.ts +9 -9
- package/src/daemon/ipc-contract/trust.ts +11 -11
- package/src/daemon/ipc-contract/work-items.ts +33 -28
- package/src/daemon/ipc-contract/workspace.ts +28 -21
- package/src/daemon/ipc-contract-inventory.json +8 -0
- package/src/daemon/ipc-contract-inventory.ts +29 -26
- package/src/daemon/ipc-contract.ts +111 -44
- package/src/daemon/ipc-handler.ts +27 -19
- package/src/daemon/ipc-protocol.ts +22 -12
- package/src/daemon/ipc-validate.ts +91 -46
- package/src/daemon/lifecycle.ts +25 -1
- package/src/daemon/main.ts +10 -8
- package/src/daemon/media-visibility-policy.ts +3 -1
- package/src/daemon/pairing-store.ts +72 -40
- package/src/daemon/providers-setup.ts +35 -25
- package/src/daemon/recording-executor.ts +37 -30
- package/src/daemon/recording-intent-fallback.ts +58 -28
- package/src/daemon/recording-intent.ts +71 -61
- package/src/daemon/ride-shotgun-handler.ts +201 -121
- package/src/daemon/seed-files.ts +28 -17
- package/src/daemon/server.ts +23 -14
- package/src/daemon/session-agent-loop-handlers.ts +261 -135
- package/src/daemon/session-agent-loop.ts +795 -253
- package/src/daemon/session-attachments.ts +104 -39
- package/src/daemon/session-conflict-gate.ts +72 -28
- package/src/daemon/session-dynamic-profile.ts +36 -22
- package/src/daemon/session-error.ts +50 -45
- package/src/daemon/session-evictor.ts +17 -10
- package/src/daemon/session-history.ts +201 -89
- package/src/daemon/session-lifecycle.ts +79 -42
- package/src/daemon/session-media-retry.ts +89 -41
- package/src/daemon/session-memory.ts +77 -55
- package/src/daemon/session-messaging.ts +261 -111
- package/src/daemon/session-notifiers.ts +57 -45
- package/src/daemon/session-process.ts +370 -154
- package/src/daemon/session-queue-manager.ts +30 -13
- package/src/daemon/session-runtime-assembly.ts +61 -15
- package/src/daemon/session-skill-tools.ts +84 -36
- package/src/daemon/session-slash.ts +178 -113
- package/src/daemon/session-surfaces.ts +498 -211
- package/src/daemon/session-tool-setup.ts +22 -17
- package/src/daemon/session-usage.ts +26 -13
- package/src/daemon/session-workspace.ts +7 -4
- package/src/daemon/session.ts +18 -19
- package/src/daemon/shutdown-handlers.ts +36 -33
- package/src/daemon/tls-certs.ts +90 -57
- package/src/daemon/tool-side-effects.ts +97 -65
- package/src/daemon/trace-emitter.ts +8 -7
- package/src/daemon/video-thumbnail.ts +55 -25
- package/src/daemon/watch-handler.ts +164 -86
- package/src/email/provider.ts +1 -1
- package/src/email/providers/agentmail.ts +87 -45
- package/src/email/providers/index.ts +19 -14
- package/src/email/service.ts +52 -24
- package/src/email/types.ts +2 -2
- package/src/errors.ts +1 -1
- package/src/events/bus.ts +30 -10
- package/src/events/domain-events.ts +19 -13
- package/src/events/index.ts +6 -6
- package/src/events/tool-audit-listener.ts +34 -20
- package/src/events/tool-domain-event-publisher.ts +22 -20
- package/src/events/tool-metrics-listener.ts +26 -21
- package/src/events/tool-notification-listener.ts +5 -5
- package/src/events/tool-profiling-listener.ts +33 -23
- package/src/events/tool-trace-listener.ts +70 -46
- package/src/export/formatter.ts +38 -32
- package/src/followups/followup-store.ts +43 -36
- package/src/followups/index.ts +2 -2
- package/src/followups/types.ts +1 -1
- package/src/gallery/default-gallery.ts +37 -34
- package/src/gallery/gallery-manifest.ts +9 -9
- package/src/heartbeat/heartbeat-service.ts +59 -37
- package/src/home-base/app-link-store.ts +14 -12
- package/src/home-base/bootstrap.ts +14 -8
- package/src/home-base/prebuilt/seed.ts +35 -26
- package/src/home-base/prebuilt-home-base-updater.ts +14 -8
- package/src/hooks/cli.ts +56 -43
- package/src/hooks/config.ts +27 -14
- package/src/hooks/discovery.ts +53 -33
- package/src/hooks/manager.ts +50 -26
- package/src/hooks/runner.ts +35 -29
- package/src/hooks/templates.ts +38 -15
- package/src/hooks/types.ts +13 -13
- package/src/inbound/platform-callback-registration.ts +21 -15
- package/src/inbound/public-ingress-urls.ts +9 -6
- package/src/index.ts +20 -19
- package/src/influencer/client.ts +269 -108
- package/src/instrument.ts +3 -1
- package/src/logfire.ts +64 -39
- package/src/mcp/client.ts +107 -55
- package/src/mcp/manager.ts +45 -18
- package/src/mcp/mcp-oauth-provider.ts +114 -62
- package/src/media/gemini-image-service.ts +28 -21
- package/src/memory/account-store.ts +16 -9
- package/src/memory/admin.ts +87 -57
- package/src/memory/app-git-service.ts +77 -47
- package/src/memory/app-store.ts +151 -77
- package/src/memory/attachments-store.ts +123 -53
- package/src/memory/canonical-guardian-store.ts +190 -48
- package/src/memory/channel-delivery-store.ts +5 -5
- package/src/memory/channel-guardian-store.ts +31 -16
- package/src/memory/checkpoints.ts +14 -7
- package/src/memory/clarification-resolver.ts +219 -104
- package/src/memory/conflict-intent.ts +74 -23
- package/src/memory/conflict-policy.ts +20 -7
- package/src/memory/conflict-store.ts +144 -94
- package/src/memory/contradiction-checker.ts +257 -132
- package/src/memory/conversation-attention-store.ts +72 -32
- package/src/memory/conversation-bootstrap.ts +28 -0
- package/src/memory/conversation-crud.ts +12 -5
- package/src/memory/conversation-display-order-migration.ts +7 -7
- package/src/memory/conversation-key-store.ts +18 -13
- package/src/memory/conversation-queries.ts +130 -52
- package/src/memory/conversation-store.ts +43 -26
- package/src/memory/conversation-title-service.ts +89 -66
- package/src/memory/db-init.ts +90 -2
- package/src/memory/db.ts +10 -3
- package/src/memory/delivery-channels.ts +12 -6
- package/src/memory/delivery-crud.ts +26 -12
- package/src/memory/delivery-status.ts +19 -16
- package/src/memory/embedding-backend.ts +205 -77
- package/src/memory/embedding-gemini.ts +23 -10
- package/src/memory/embedding-local.ts +89 -44
- package/src/memory/embedding-ollama.ts +25 -13
- package/src/memory/embedding-openai.ts +20 -11
- package/src/memory/embedding-runtime-manager.ts +163 -90
- package/src/memory/entity-extractor.ts +185 -123
- package/src/memory/external-conversation-store.ts +30 -12
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/fts-reconciler.ts +57 -28
- package/src/memory/guardian-action-store.ts +162 -100
- package/src/memory/guardian-approvals.ts +63 -129
- package/src/memory/guardian-rate-limits.ts +20 -9
- package/src/memory/guardian-verification.ts +82 -35
- package/src/memory/indexer.ts +96 -55
- package/src/memory/ingress-invite-store.ts +28 -169
- package/src/memory/items-extractor.ts +313 -157
- package/src/memory/job-handlers/backfill.ts +116 -63
- package/src/memory/job-handlers/cleanup.ts +64 -41
- package/src/memory/job-handlers/conflict.ts +90 -49
- package/src/memory/job-handlers/embedding.ts +32 -17
- package/src/memory/job-handlers/extraction.ts +58 -33
- package/src/memory/job-handlers/index-maintenance.ts +31 -17
- package/src/memory/job-handlers/media-processing.ts +65 -24
- package/src/memory/job-handlers/summarization.ts +186 -128
- package/src/memory/job-utils.ts +100 -57
- package/src/memory/jobs-store.ts +235 -142
- package/src/memory/jobs-worker.ts +167 -83
- package/src/memory/llm-request-log-store.ts +13 -11
- package/src/memory/llm-usage-store.ts +35 -26
- package/src/memory/media-store.ts +151 -44
- package/src/memory/message-content.ts +28 -18
- package/src/memory/migrations/001-job-deferrals.ts +11 -5
- package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
- package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
- package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
- package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
- package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
- package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
- package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
- package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
- package/src/memory/migrations/022-add-origin-interface.ts +4 -2
- package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
- package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
- package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
- package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
- package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
- package/src/memory/migrations/028-call-session-mode.ts +13 -3
- package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
- package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
- package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
- package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
- package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
- package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
- package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
- package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
- package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
- package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
- package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
- package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
- package/src/memory/migrations/038-actor-token-records.ts +5 -9
- package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
- package/src/memory/migrations/100-core-tables.ts +1 -1
- package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
- package/src/memory/migrations/103-complex-migrations.ts +9 -9
- package/src/memory/migrations/104-core-indexes.ts +188 -64
- package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
- package/src/memory/migrations/106-call-sessions.ts +58 -16
- package/src/memory/migrations/107-followups.ts +16 -6
- package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
- package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
- package/src/memory/migrations/110-channel-guardian.ts +48 -10
- package/src/memory/migrations/111-media-assets.ts +52 -18
- package/src/memory/migrations/112-assistant-inbox.ts +32 -12
- package/src/memory/migrations/113-late-migrations.ts +12 -12
- package/src/memory/migrations/114-notifications.ts +28 -12
- package/src/memory/migrations/115-sequences.ts +10 -4
- package/src/memory/migrations/116-messages-fts.ts +1 -1
- package/src/memory/migrations/117-conversation-attention.ts +16 -6
- package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
- package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
- package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
- package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
- package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
- package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
- package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
- package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
- package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
- package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
- package/src/memory/migrations/index.ts +82 -73
- package/src/memory/migrations/registry.ts +53 -37
- package/src/memory/migrations/validate-migration-state.ts +73 -46
- package/src/memory/profile-compiler.ts +58 -24
- package/src/memory/published-pages-store.ts +12 -16
- package/src/memory/qdrant-circuit-breaker.ts +28 -20
- package/src/memory/qdrant-client.ts +99 -63
- package/src/memory/qdrant-manager.ts +89 -57
- package/src/memory/query-builder.ts +9 -7
- package/src/memory/raw-query.ts +63 -14
- package/src/memory/recall-cache.ts +15 -8
- package/src/memory/retrieval-budget.ts +0 -1
- package/src/memory/retriever.ts +385 -192
- package/src/memory/schema-migration.ts +1 -1
- package/src/memory/schema.ts +44 -56
- package/src/memory/scoped-approval-grants.ts +99 -45
- package/src/memory/search/entity.ts +102 -40
- package/src/memory/search/formatting.ts +70 -52
- package/src/memory/search/lexical.ts +82 -43
- package/src/memory/search/ranking.ts +103 -39
- package/src/memory/search/semantic.ts +59 -35
- package/src/memory/search/types.ts +8 -8
- package/src/memory/segmenter.ts +20 -12
- package/src/memory/shared-app-links-store.ts +21 -16
- package/src/memory/task-memory-cleanup.ts +18 -8
- package/src/memory/tool-usage-store.ts +27 -19
- package/src/memory/validation.ts +4 -2
- package/src/messaging/activity-analyzer.ts +7 -7
- package/src/messaging/draft-store.ts +13 -10
- package/src/messaging/email-classifier.ts +73 -37
- package/src/messaging/index.ts +3 -3
- package/src/messaging/outreach-classifier.ts +76 -38
- package/src/messaging/provider-types.ts +2 -4
- package/src/messaging/provider.ts +37 -8
- package/src/messaging/providers/gmail/adapter.ts +183 -66
- package/src/messaging/providers/gmail/client.ts +3 -1
- package/src/messaging/providers/gmail/mime-builder.ts +21 -19
- package/src/messaging/providers/gmail/people-client.ts +22 -9
- package/src/messaging/providers/gmail/types.ts +6 -6
- package/src/messaging/providers/slack/adapter.ts +93 -43
- package/src/messaging/providers/slack/client.ts +100 -41
- package/src/messaging/providers/slack/types.ts +6 -0
- package/src/messaging/providers/sms/adapter.ts +76 -40
- package/src/messaging/providers/sms/client.ts +4 -4
- package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
- package/src/messaging/providers/telegram-bot/client.ts +7 -7
- package/src/messaging/providers/whatsapp/adapter.ts +58 -31
- package/src/messaging/providers/whatsapp/client.ts +4 -4
- package/src/messaging/registry.ts +9 -5
- package/src/messaging/style-analyzer.ts +69 -39
- package/src/messaging/thread-summarizer.ts +101 -53
- package/src/messaging/triage-engine.ts +111 -82
- package/src/messaging/types.ts +10 -10
- package/src/migrations/config-merge.ts +18 -10
- package/src/migrations/data-layout.ts +35 -22
- package/src/migrations/data-merge.ts +17 -7
- package/src/migrations/hooks-merge.ts +43 -16
- package/src/migrations/index.ts +6 -6
- package/src/migrations/log.ts +9 -5
- package/src/migrations/skills-merge.ts +17 -7
- package/src/migrations/workspace-layout.ts +39 -25
- package/src/notifications/AGENTS.md +5 -0
- package/src/notifications/adapters/macos.ts +21 -14
- package/src/notifications/adapters/sms.ts +28 -15
- package/src/notifications/adapters/telegram.ts +24 -15
- package/src/notifications/broadcaster.ts +108 -52
- package/src/notifications/conversation-pairing.ts +64 -29
- package/src/notifications/copy-composer.ts +165 -95
- package/src/notifications/decision-engine.ts +353 -147
- package/src/notifications/decisions-store.ts +26 -10
- package/src/notifications/deliveries-store.ts +23 -13
- package/src/notifications/destination-resolver.ts +42 -24
- package/src/notifications/deterministic-checks.ts +78 -27
- package/src/notifications/emit-signal.ts +83 -45
- package/src/notifications/events-store.ts +13 -7
- package/src/notifications/guardian-question-mode.ts +125 -75
- package/src/notifications/preference-extractor.ts +85 -53
- package/src/notifications/preference-summary.ts +31 -18
- package/src/notifications/preferences-store.ts +29 -18
- package/src/notifications/runtime-dispatch.ts +22 -12
- package/src/notifications/signal.ts +4 -4
- package/src/notifications/thread-candidates.ts +59 -23
- package/src/notifications/thread-seed-composer.ts +45 -27
- package/src/notifications/types.ts +19 -10
- package/src/oauth/connect-orchestrator.ts +105 -54
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/provider-profiles.ts +80 -59
- package/src/oauth/scope-policy.ts +5 -2
- package/src/oauth/token-persistence.ts +58 -24
- package/src/outbound-proxy/certs.ts +284 -0
- package/src/outbound-proxy/config.ts +94 -0
- package/src/outbound-proxy/connect-tunnel.ts +84 -0
- package/src/outbound-proxy/health.ts +62 -0
- package/src/outbound-proxy/host-pattern-match.ts +67 -0
- package/src/outbound-proxy/http-forwarder.ts +162 -0
- package/src/outbound-proxy/index.ts +80 -0
- package/src/outbound-proxy/logging.ts +193 -0
- package/src/outbound-proxy/mitm-handler.ts +292 -0
- package/src/outbound-proxy/policy.ts +172 -0
- package/src/outbound-proxy/router.ts +64 -0
- package/src/outbound-proxy/server.ts +145 -0
- package/src/outbound-proxy/types.ts +150 -0
- package/src/permissions/checker.ts +481 -189
- package/src/permissions/defaults.ts +135 -108
- package/src/permissions/prompter.ts +53 -27
- package/src/permissions/secret-prompter.ts +21 -15
- package/src/permissions/shell-identity.ts +47 -16
- package/src/permissions/trust-store.ts +185 -73
- package/src/permissions/types.ts +22 -12
- package/src/permissions/workspace-policy.ts +47 -38
- package/src/playbooks/index.ts +10 -2
- package/src/playbooks/playbook-compiler.ts +30 -24
- package/src/playbooks/types.ts +11 -8
- package/src/providers/anthropic/client.ts +325 -168
- package/src/providers/failover.ts +57 -22
- package/src/providers/fireworks/client.ts +9 -5
- package/src/providers/gemini/client.ts +61 -39
- package/src/providers/model-intents.ts +40 -33
- package/src/providers/ollama/client.ts +7 -7
- package/src/providers/openai/client.ts +106 -68
- package/src/providers/openrouter/client.ts +9 -5
- package/src/providers/provider-send-message.ts +59 -27
- package/src/providers/ratelimit.ts +25 -8
- package/src/providers/registry.ts +86 -38
- package/src/providers/retry.ts +84 -36
- package/src/providers/stream-timeout.ts +5 -3
- package/src/providers/types.ts +7 -6
- package/src/runtime/AGENTS.md +42 -0
- package/src/runtime/access-request-helper.ts +118 -68
- package/src/runtime/actor-refresh-token-store.ts +21 -16
- package/src/runtime/actor-token-store.ts +25 -18
- package/src/runtime/actor-trust-resolver.ts +183 -80
- package/src/runtime/approval-conversation-turn.ts +39 -26
- package/src/runtime/approval-message-composer.ts +116 -84
- package/src/runtime/assistant-event-hub.ts +25 -6
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
- package/src/runtime/auth/context.ts +8 -7
- package/src/runtime/auth/credential-service.ts +60 -38
- package/src/runtime/auth/external-assistant-id.ts +16 -8
- package/src/runtime/auth/index.ts +23 -16
- package/src/runtime/auth/route-policy.ts +170 -104
- package/src/runtime/auth/scopes.ts +22 -29
- package/src/runtime/auth/subject.ts +19 -13
- package/src/runtime/auth/token-service.ts +3 -3
- package/src/runtime/auth/types.ts +23 -23
- package/src/runtime/channel-approval-parser.ts +37 -14
- package/src/runtime/channel-approval-types.ts +12 -4
- package/src/runtime/channel-approvals.ts +41 -23
- package/src/runtime/channel-guardian-service.ts +144 -103
- package/src/runtime/channel-invite-transport.ts +4 -2
- package/src/runtime/channel-invite-transports/telegram.ts +16 -10
- package/src/runtime/channel-invite-transports/voice.ts +7 -7
- package/src/runtime/channel-readiness-service.ts +139 -90
- package/src/runtime/channel-readiness-types.ts +4 -2
- package/src/runtime/channel-reply-delivery.ts +21 -11
- package/src/runtime/channel-retry-sweep.ts +111 -62
- package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
- package/src/runtime/gateway-client.ts +86 -53
- package/src/runtime/guardian-action-conversation-turn.ts +34 -18
- package/src/runtime/guardian-action-followup-executor.ts +115 -45
- package/src/runtime/guardian-action-grant-minter.ts +40 -24
- package/src/runtime/guardian-action-message-composer.ts +105 -84
- package/src/runtime/guardian-decision-types.ts +28 -13
- package/src/runtime/guardian-outbound-actions.ts +9 -0
- package/src/runtime/guardian-reply-router.ts +274 -145
- package/src/runtime/guardian-vellum-migration.ts +38 -24
- package/src/runtime/guardian-verification-templates.ts +8 -11
- package/src/runtime/http-router.ts +175 -0
- package/src/runtime/http-server.ts +931 -669
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/ingress-service.ts +182 -89
- package/src/runtime/invite-redemption-service.ts +211 -134
- package/src/runtime/invite-redemption-templates.ts +18 -11
- package/src/runtime/local-actor-identity.ts +73 -55
- package/src/runtime/middleware/auth.ts +25 -14
- package/src/runtime/middleware/error-handler.ts +15 -11
- package/src/runtime/middleware/rate-limiter.ts +23 -17
- package/src/runtime/middleware/request-logger.ts +4 -4
- package/src/runtime/middleware/twilio-validation.ts +29 -20
- package/src/runtime/migrations/migration-transport.ts +575 -0
- package/src/runtime/migrations/migration-wizard.ts +715 -0
- package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
- package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
- package/src/runtime/migrations/validation-results-screen.ts +467 -0
- package/src/runtime/migrations/vbundle-builder.ts +295 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
- package/src/runtime/migrations/vbundle-importer.ts +339 -0
- package/src/runtime/migrations/vbundle-validator.ts +356 -0
- package/src/runtime/pending-interactions.ts +16 -7
- package/src/runtime/routes/access-request-decision.ts +73 -52
- package/src/runtime/routes/app-routes.ts +56 -38
- package/src/runtime/routes/approval-routes.ts +165 -74
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
- package/src/runtime/routes/attachment-routes.ts +59 -48
- package/src/runtime/routes/brain-graph-routes.ts +85 -69
- package/src/runtime/routes/call-routes.ts +79 -38
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
- package/src/runtime/routes/channel-delivery-routes.ts +19 -14
- package/src/runtime/routes/channel-guardian-routes.ts +3 -3
- package/src/runtime/routes/channel-inbound-routes.ts +2 -2
- package/src/runtime/routes/channel-readiness-routes.ts +12 -6
- package/src/runtime/routes/channel-route-shared.ts +33 -25
- package/src/runtime/routes/channel-routes.ts +4 -6
- package/src/runtime/routes/contact-routes.ts +205 -16
- package/src/runtime/routes/conversation-attention-routes.ts +57 -28
- package/src/runtime/routes/conversation-routes.ts +321 -174
- package/src/runtime/routes/debug-routes.ts +14 -10
- package/src/runtime/routes/events-routes.ts +90 -57
- package/src/runtime/routes/global-search-routes.ts +266 -0
- package/src/runtime/routes/guardian-action-routes.ts +147 -56
- package/src/runtime/routes/guardian-approval-interception.ts +255 -880
- package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
- package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
- package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
- package/src/runtime/routes/identity-routes.ts +71 -42
- package/src/runtime/routes/inbound-conversation.ts +17 -11
- package/src/runtime/routes/inbound-message-handler.ts +278 -1460
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
- package/src/runtime/routes/ingress-routes.ts +34 -23
- package/src/runtime/routes/integration-routes.ts +60 -21
- package/src/runtime/routes/migration-routes.ts +434 -0
- package/src/runtime/routes/pairing-routes.ts +157 -79
- package/src/runtime/routes/secret-routes.ts +6 -2
- package/src/runtime/routes/twilio-routes.ts +443 -249
- package/src/runtime/tool-grant-request-helper.ts +36 -27
- package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
- package/src/schedule/integration-status.ts +44 -9
- package/src/schedule/recurrence-engine.ts +47 -24
- package/src/schedule/recurrence-types.ts +12 -7
- package/src/schedule/schedule-store.ts +166 -83
- package/src/schedule/scheduler.ts +26 -22
- package/src/security/encrypted-store.ts +68 -38
- package/src/security/keychain.ts +183 -120
- package/src/security/oauth-callback-registry.ts +3 -3
- package/src/security/oauth2.ts +226 -138
- package/src/security/redaction.ts +24 -24
- package/src/security/secret-allowlist.ts +46 -21
- package/src/security/secret-ingress.ts +15 -7
- package/src/security/secret-scanner.ts +193 -104
- package/src/security/secure-keys.ts +9 -3
- package/src/security/token-manager.ts +99 -40
- package/src/security/tool-approval-digest.ts +3 -3
- package/src/sequence/analytics.ts +52 -27
- package/src/sequence/engine.ts +135 -72
- package/src/sequence/guardrails.ts +32 -20
- package/src/sequence/importer.ts +75 -37
- package/src/sequence/reply-matcher.ts +36 -18
- package/src/sequence/store.ts +137 -75
- package/src/sequence/types.ts +30 -16
- package/src/services/published-app-updater.ts +26 -16
- package/src/services/vercel-deploy.ts +19 -15
- package/src/skills/active-skill-tools.ts +3 -3
- package/src/skills/clawhub.ts +178 -90
- package/src/skills/include-graph.ts +24 -17
- package/src/skills/managed-store.ts +89 -42
- package/src/skills/path-classifier.ts +10 -10
- package/src/skills/remote-skill-policy.ts +31 -22
- package/src/skills/slash-commands.ts +36 -30
- package/src/skills/tool-manifest.ts +60 -31
- package/src/skills/version-hash.ts +25 -15
- package/src/slack/slack-webhook.ts +19 -15
- package/src/subagent/index.ts +4 -8
- package/src/subagent/manager.ts +119 -69
- package/src/subagent/types.ts +9 -12
- package/src/swarm/backend-claude-code.ts +124 -45
- package/src/swarm/checkpoint.ts +36 -16
- package/src/swarm/graph-utils.ts +1 -3
- package/src/swarm/index.ts +38 -19
- package/src/swarm/limits.ts +13 -4
- package/src/swarm/orchestrator.ts +108 -57
- package/src/swarm/plan-validator.ts +23 -17
- package/src/swarm/router-planner.ts +51 -22
- package/src/swarm/router-prompts.ts +4 -1
- package/src/swarm/synthesizer.ts +26 -18
- package/src/swarm/types.ts +14 -4
- package/src/swarm/worker-backend.ts +36 -26
- package/src/swarm/worker-prompts.ts +13 -9
- package/src/swarm/worker-runner.ts +40 -34
- package/src/tasks/candidate-store.ts +14 -6
- package/src/tasks/ephemeral-permissions.ts +9 -5
- package/src/tasks/task-compiler.ts +41 -38
- package/src/tasks/task-runner.ts +54 -26
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/task-store.ts +20 -7
- package/src/tasks/tool-sanitizer.ts +3 -3
- package/src/tools/apps/definitions.ts +23 -15
- package/src/tools/apps/executors.ts +118 -37
- package/src/tools/apps/open-proxy.ts +5 -5
- package/src/tools/apps/registry.ts +2 -2
- package/src/tools/assets/materialize.ts +59 -41
- package/src/tools/assets/search.ts +86 -48
- package/src/tools/browser/api-map.ts +52 -36
- package/src/tools/browser/auth-cache.ts +21 -18
- package/src/tools/browser/auth-detector.ts +43 -28
- package/src/tools/browser/auto-navigate.ts +149 -68
- package/src/tools/browser/browser-execution.ts +9 -3
- package/src/tools/browser/headless-browser.ts +287 -150
- package/src/tools/browser/jit-auth.ts +37 -21
- package/src/tools/browser/network-recorder.ts +138 -56
- package/src/tools/browser/recording-store.ts +22 -15
- package/src/tools/browser/runtime-check.ts +8 -5
- package/src/tools/browser/x-auto-navigate.ts +88 -47
- package/src/tools/calls/call-end.ts +9 -6
- package/src/tools/calls/call-start.ts +30 -20
- package/src/tools/calls/call-status.ts +8 -5
- package/src/tools/claude-code/claude-code.ts +301 -165
- package/src/tools/computer-use/definitions.ts +159 -130
- package/src/tools/computer-use/registry.ts +2 -2
- package/src/tools/computer-use/request-computer-control.ts +21 -13
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/credentials/account-registry.ts +52 -35
- package/src/tools/credentials/broker-types.ts +1 -1
- package/src/tools/credentials/broker.ts +97 -55
- package/src/tools/credentials/domain-policy.ts +5 -2
- package/src/tools/credentials/host-pattern-match.ts +15 -8
- package/src/tools/credentials/metadata-store.ts +93 -43
- package/src/tools/credentials/policy-types.ts +5 -2
- package/src/tools/credentials/policy-validate.ts +21 -14
- package/src/tools/credentials/post-connect-hooks.ts +18 -7
- package/src/tools/credentials/resolve.ts +11 -10
- package/src/tools/credentials/selection.ts +30 -25
- package/src/tools/credentials/tool-policy.ts +5 -2
- package/src/tools/credentials/vault.ts +452 -183
- package/src/tools/document/document-tool.ts +23 -17
- package/src/tools/document/editor-template.ts +12 -7
- package/src/tools/execution-target.ts +13 -10
- package/src/tools/execution-timeout.ts +6 -5
- package/src/tools/executor.ts +141 -74
- package/src/tools/filesystem/edit.ts +82 -45
- package/src/tools/filesystem/fuzzy-match.ts +70 -32
- package/src/tools/filesystem/read.ts +46 -28
- package/src/tools/filesystem/view-image.ts +86 -42
- package/src/tools/filesystem/write.ts +53 -32
- package/src/tools/followups/followup_create.ts +43 -17
- package/src/tools/followups/followup_list.ts +28 -13
- package/src/tools/followups/followup_resolve.ts +9 -6
- package/src/tools/guardian-control-plane-policy.ts +15 -14
- package/src/tools/host-filesystem/edit.ts +77 -42
- package/src/tools/host-filesystem/read.ts +52 -33
- package/src/tools/host-filesystem/write.ts +50 -29
- package/src/tools/host-terminal/host-shell.ts +97 -61
- package/src/tools/mcp/mcp-tool-factory.ts +21 -14
- package/src/tools/memory/definitions.ts +60 -28
- package/src/tools/memory/handlers.ts +149 -77
- package/src/tools/memory/register.ts +39 -16
- package/src/tools/network/__tests__/web-search.test.ts +236 -177
- package/src/tools/network/domain-normalize.ts +13 -9
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
- package/src/tools/network/script-proxy/index.ts +1 -17
- package/src/tools/network/script-proxy/session-manager.ts +151 -84
- package/src/tools/network/url-safety.ts +56 -34
- package/src/tools/network/web-fetch.ts +273 -155
- package/src/tools/network/web-search.ts +166 -81
- package/src/tools/permission-checker.ts +6 -25
- package/src/tools/policy-context.ts +8 -5
- package/src/tools/registry.ts +73 -46
- package/src/tools/reminder/reminder-store.ts +65 -44
- package/src/tools/reminder/reminder.ts +76 -35
- package/src/tools/schedule/create.ts +44 -21
- package/src/tools/schedule/delete.ts +8 -5
- package/src/tools/schedule/list.ts +39 -19
- package/src/tools/schedule/update.ts +49 -26
- package/src/tools/secret-detection-handler.ts +130 -49
- package/src/tools/sensitive-output-placeholders.ts +15 -8
- package/src/tools/shared/filesystem/edit-engine.ts +45 -14
- package/src/tools/shared/filesystem/errors.ts +18 -18
- package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
- package/src/tools/shared/filesystem/format-diff.ts +21 -11
- package/src/tools/shared/filesystem/path-policy.ts +17 -13
- package/src/tools/shared/filesystem/size-guard.ts +8 -4
- package/src/tools/shared/filesystem/types.ts +2 -2
- package/src/tools/shared/shell-output.ts +4 -3
- package/src/tools/side-effects.ts +36 -28
- package/src/tools/skills/delete-managed.ts +30 -17
- package/src/tools/skills/load.ts +88 -46
- package/src/tools/skills/sandbox-runner.ts +62 -46
- package/src/tools/skills/scaffold-managed.ts +98 -48
- package/src/tools/skills/script-contract.ts +5 -2
- package/src/tools/skills/skill-script-runner.ts +29 -13
- package/src/tools/skills/skill-tool-factory.ts +20 -10
- package/src/tools/subagent/abort.ts +10 -4
- package/src/tools/subagent/message.ts +14 -8
- package/src/tools/subagent/read.ts +20 -11
- package/src/tools/subagent/spawn.ts +14 -6
- package/src/tools/subagent/status.ts +7 -4
- package/src/tools/swarm/delegate.ts +75 -49
- package/src/tools/system/avatar-generator.ts +46 -33
- package/src/tools/system/navigate-settings.ts +29 -19
- package/src/tools/system/open-system-settings.ts +30 -20
- package/src/tools/system/request-permission.ts +59 -44
- package/src/tools/system/version.ts +27 -16
- package/src/tools/system/voice-config.ts +116 -53
- package/src/tools/tasks/index.ts +8 -8
- package/src/tools/tasks/task-delete.ts +61 -22
- package/src/tools/tasks/task-list.ts +23 -11
- package/src/tools/tasks/task-run.ts +41 -16
- package/src/tools/tasks/task-save.ts +27 -10
- package/src/tools/tasks/work-item-enqueue.ts +114 -48
- package/src/tools/tasks/work-item-list.ts +20 -10
- package/src/tools/tasks/work-item-remove.ts +49 -15
- package/src/tools/tasks/work-item-run.ts +34 -13
- package/src/tools/tasks/work-item-update.ts +84 -31
- package/src/tools/terminal/backends/native.ts +64 -35
- package/src/tools/terminal/backends/types.ts +6 -2
- package/src/tools/terminal/parser.ts +200 -125
- package/src/tools/terminal/safe-env.ts +27 -21
- package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
- package/src/tools/terminal/sandbox.ts +10 -6
- package/src/tools/terminal/shell.ts +124 -68
- package/src/tools/tool-approval-handler.ts +193 -138
- package/src/tools/types.ts +43 -23
- package/src/tools/ui-surface/definitions.ts +124 -89
- package/src/tools/ui-surface/registry.ts +2 -2
- package/src/tools/watch/screen-watch.ts +50 -32
- package/src/tools/watch/watch-state.ts +41 -15
- package/src/tools/watcher/create.ts +37 -15
- package/src/tools/watcher/delete.ts +9 -6
- package/src/tools/watcher/digest.ts +10 -6
- package/src/tools/watcher/list.ts +37 -14
- package/src/tools/watcher/update.ts +33 -18
- package/src/tools/weather/service.ts +331 -174
- package/src/twitter/client.ts +261 -138
- package/src/twitter/oauth-client.ts +17 -13
- package/src/twitter/router.ts +51 -23
- package/src/twitter/session.ts +27 -18
- package/src/types/qrcode.d.ts +6 -3
- package/src/usage/actors.ts +16 -16
- package/src/usage/types.ts +3 -3
- package/src/util/bundled-asset.ts +10 -6
- package/src/util/canonicalize-identity.ts +11 -4
- package/src/util/clipboard.ts +7 -7
- package/src/util/content-id.ts +3 -3
- package/src/util/debounce.ts +3 -2
- package/src/util/diff.ts +55 -33
- package/src/util/errors.ts +26 -26
- package/src/util/fs.ts +8 -2
- package/src/util/log-redact.ts +12 -12
- package/src/util/logger.ts +112 -51
- package/src/util/network-info.ts +13 -5
- package/src/util/object.ts +4 -2
- package/src/util/phone.ts +4 -4
- package/src/util/platform.ts +80 -58
- package/src/util/pricing.ts +49 -31
- package/src/util/retry.ts +18 -7
- package/src/util/row-mapper.ts +7 -4
- package/src/util/silently.ts +7 -4
- package/src/util/spawn.ts +48 -0
- package/src/util/spinner.ts +9 -7
- package/src/util/time.ts +16 -3
- package/src/util/truncate.ts +1 -1
- package/src/util/voice-code.ts +6 -4
- package/src/util/xml.ts +5 -1
- package/src/version.ts +12 -8
- package/src/watcher/engine.ts +71 -44
- package/src/watcher/provider-registry.ts +1 -1
- package/src/watcher/providers/github.ts +40 -23
- package/src/watcher/providers/gmail.ts +59 -38
- package/src/watcher/providers/google-calendar.ts +62 -48
- package/src/watcher/providers/linear.ts +219 -150
- package/src/watcher/providers/slack.ts +93 -27
- package/src/watcher/watcher-store.ts +75 -55
- package/src/work-items/work-item-runner.ts +62 -29
- package/src/work-items/work-item-store.ts +137 -47
- package/src/workspace/commit-message-enrichment-service.ts +65 -25
- package/src/workspace/commit-message-provider.ts +14 -12
- package/src/workspace/git-service.ts +355 -239
- package/src/workspace/heartbeat-service.ts +74 -37
- package/src/workspace/provider-commit-message-generator.ts +95 -70
- package/src/workspace/top-level-renderer.ts +10 -8
- package/src/workspace/top-level-scanner.ts +9 -3
- package/src/workspace/turn-commit.ts +63 -36
- package/src/__tests__/ingress-member-store.test.ts +0 -294
- package/src/__tests__/script-proxy-router.test.ts +0 -215
- package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
- package/src/memory/guardian-bindings.ts +0 -158
- package/src/memory/ingress-member-store.ts +0 -352
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
- package/src/tools/network/script-proxy/certs.ts +0 -7
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
- package/src/tools/network/script-proxy/logging.ts +0 -12
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
- package/src/tools/network/script-proxy/policy.ts +0 -4
- package/src/tools/network/script-proxy/router.ts +0 -2
- package/src/tools/network/script-proxy/server.ts +0 -5
- package/src/tools/network/script-proxy/types.ts +0 -19
package/src/config/skills.ts
CHANGED
|
@@ -1,15 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
readdirSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
realpathSync,
|
|
6
|
+
statSync,
|
|
7
|
+
writeFileSync,
|
|
8
|
+
} from "node:fs";
|
|
9
|
+
import {
|
|
10
|
+
basename,
|
|
11
|
+
dirname,
|
|
12
|
+
isAbsolute,
|
|
13
|
+
join,
|
|
14
|
+
relative,
|
|
15
|
+
resolve,
|
|
16
|
+
} from "node:path";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
extractAllText,
|
|
20
|
+
getConfiguredProvider,
|
|
21
|
+
userMessage,
|
|
22
|
+
} from "../providers/provider-send-message.js";
|
|
23
|
+
import { parseFrontmatterFields } from "../skills/frontmatter.js";
|
|
24
|
+
import { parseToolManifestFile } from "../skills/tool-manifest.js";
|
|
25
|
+
import { computeSkillVersionHash } from "../skills/version-hash.js";
|
|
26
|
+
import { getLogger } from "../util/logger.js";
|
|
27
|
+
import { getWorkspaceSkillsDir } from "../util/platform.js";
|
|
28
|
+
import { stripCommentLines } from "./system-prompt.js";
|
|
29
|
+
|
|
30
|
+
const log = getLogger("skills");
|
|
13
31
|
|
|
14
32
|
// ─── New interfaces for extended skill metadata ──────────────────────────────
|
|
15
33
|
|
|
@@ -39,11 +57,11 @@ export interface SkillRequirements {
|
|
|
39
57
|
|
|
40
58
|
export interface InstallerSpec {
|
|
41
59
|
id: string;
|
|
42
|
-
kind:
|
|
60
|
+
kind: "brew" | "node" | "go" | "uv" | "download";
|
|
43
61
|
[key: string]: unknown;
|
|
44
62
|
}
|
|
45
63
|
|
|
46
|
-
export type SkillSource =
|
|
64
|
+
export type SkillSource = "bundled" | "managed" | "workspace" | "extra";
|
|
47
65
|
|
|
48
66
|
// ─── Core interfaces ─────────────────────────────────────────────────────────
|
|
49
67
|
|
|
@@ -105,13 +123,13 @@ export interface SkillToolEntry {
|
|
|
105
123
|
/** Tool category for grouping/display. */
|
|
106
124
|
category: string;
|
|
107
125
|
/** Default risk level for permission checks. */
|
|
108
|
-
risk:
|
|
126
|
+
risk: "low" | "medium" | "high";
|
|
109
127
|
/** JSON Schema for the tool's input parameters. */
|
|
110
128
|
input_schema: Record<string, unknown>;
|
|
111
129
|
/** Relative path to the executor script within the skill directory. */
|
|
112
130
|
executor: string;
|
|
113
131
|
/** Where the tool script runs. */
|
|
114
|
-
execution_target:
|
|
132
|
+
execution_target: "host" | "sandbox";
|
|
115
133
|
}
|
|
116
134
|
|
|
117
135
|
/**
|
|
@@ -163,7 +181,11 @@ export function checkSkillRequirements(
|
|
|
163
181
|
return {
|
|
164
182
|
eligible: false,
|
|
165
183
|
missing: {
|
|
166
|
-
bins: [
|
|
184
|
+
bins: [
|
|
185
|
+
`(unsupported platform: ${
|
|
186
|
+
process.platform
|
|
187
|
+
}, requires: ${vellum.os.join(", ")})`,
|
|
188
|
+
],
|
|
167
189
|
},
|
|
168
190
|
};
|
|
169
191
|
}
|
|
@@ -187,13 +209,15 @@ export function checkSkillRequirements(
|
|
|
187
209
|
if (requires.anyBins && requires.anyBins.length > 0) {
|
|
188
210
|
const hasAny = requires.anyBins.some((bin) => Bun.which(bin) != null);
|
|
189
211
|
if (!hasAny) {
|
|
190
|
-
missingBins.push(`(one of: ${requires.anyBins.join(
|
|
212
|
+
missingBins.push(`(one of: ${requires.anyBins.join(", ")})`);
|
|
191
213
|
}
|
|
192
214
|
}
|
|
193
215
|
|
|
194
216
|
// env: check process.env or envOverrides
|
|
195
217
|
if (requires.env) {
|
|
196
|
-
const env = envOverrides
|
|
218
|
+
const env = envOverrides
|
|
219
|
+
? { ...process.env, ...envOverrides }
|
|
220
|
+
: process.env;
|
|
197
221
|
for (const key of requires.env) {
|
|
198
222
|
if (!env[key]) {
|
|
199
223
|
missingEnv.push(key);
|
|
@@ -203,7 +227,7 @@ export function checkSkillRequirements(
|
|
|
203
227
|
|
|
204
228
|
// config: skip for now (needs config integration from M2)
|
|
205
229
|
|
|
206
|
-
const missing: RequirementsCheckResult[
|
|
230
|
+
const missing: RequirementsCheckResult["missing"] = {};
|
|
207
231
|
if (missingBins.length > 0) missing.bins = missingBins;
|
|
208
232
|
if (missingEnv.length > 0) missing.env = missingEnv;
|
|
209
233
|
|
|
@@ -225,21 +249,21 @@ export function getBundledSkillsDir(): string {
|
|
|
225
249
|
// In compiled Bun binaries, import.meta.dir points into the virtual
|
|
226
250
|
// /$bunfs/ filesystem where non-JS assets don't exist. Fall back to
|
|
227
251
|
// the macOS .app bundle Resources dir or next to the binary.
|
|
228
|
-
if (dir.startsWith(
|
|
252
|
+
if (dir.startsWith("/$bunfs/")) {
|
|
229
253
|
const execDir = dirname(process.execPath);
|
|
230
254
|
// macOS .app bundle: binary is in Contents/MacOS/, resources in Contents/Resources/
|
|
231
|
-
const resourcesPath = join(execDir,
|
|
255
|
+
const resourcesPath = join(execDir, "..", "Resources", "bundled-skills");
|
|
232
256
|
if (existsSync(resourcesPath)) return resourcesPath;
|
|
233
257
|
// Next to the binary itself (non-app-bundle deployments)
|
|
234
|
-
const execDirPath = join(execDir,
|
|
258
|
+
const execDirPath = join(execDir, "bundled-skills");
|
|
235
259
|
if (existsSync(execDirPath)) return execDirPath;
|
|
236
260
|
}
|
|
237
261
|
|
|
238
|
-
return join(dir,
|
|
262
|
+
return join(dir, "bundled-skills");
|
|
239
263
|
}
|
|
240
264
|
|
|
241
265
|
function getSkillsIndexPath(skillsDir: string): string {
|
|
242
|
-
return join(skillsDir,
|
|
266
|
+
return join(skillsDir, "SKILLS.md");
|
|
243
267
|
}
|
|
244
268
|
|
|
245
269
|
// ─── Frontmatter parsing ─────────────────────────────────────────────────────
|
|
@@ -256,24 +280,30 @@ interface ParsedFrontmatter {
|
|
|
256
280
|
credentialSetupFor?: string;
|
|
257
281
|
}
|
|
258
282
|
|
|
259
|
-
function parseIncludes(
|
|
283
|
+
function parseIncludes(
|
|
284
|
+
raw: string | undefined,
|
|
285
|
+
skillFilePath: string,
|
|
286
|
+
): string[] | undefined {
|
|
260
287
|
if (!raw) return undefined;
|
|
261
288
|
|
|
262
289
|
let parsed: unknown;
|
|
263
290
|
try {
|
|
264
291
|
parsed = JSON.parse(raw);
|
|
265
292
|
} catch (err) {
|
|
266
|
-
log.warn(
|
|
293
|
+
log.warn(
|
|
294
|
+
{ err, skillFilePath },
|
|
295
|
+
"Failed to parse includes JSON in frontmatter",
|
|
296
|
+
);
|
|
267
297
|
return undefined;
|
|
268
298
|
}
|
|
269
299
|
|
|
270
300
|
if (!Array.isArray(parsed)) {
|
|
271
|
-
log.warn({ skillFilePath },
|
|
301
|
+
log.warn({ skillFilePath }, "includes must be a JSON array");
|
|
272
302
|
return undefined;
|
|
273
303
|
}
|
|
274
304
|
|
|
275
|
-
if (!parsed.every((item: unknown) => typeof item ===
|
|
276
|
-
log.warn({ skillFilePath },
|
|
305
|
+
if (!parsed.every((item: unknown) => typeof item === "string")) {
|
|
306
|
+
log.warn({ skillFilePath }, "includes must be an array of strings");
|
|
277
307
|
return undefined;
|
|
278
308
|
}
|
|
279
309
|
|
|
@@ -291,10 +321,13 @@ function parseIncludes(raw: string | undefined, skillFilePath: string): string[]
|
|
|
291
321
|
return result.length > 0 ? result : undefined;
|
|
292
322
|
}
|
|
293
323
|
|
|
294
|
-
function parseFrontmatter(
|
|
324
|
+
function parseFrontmatter(
|
|
325
|
+
content: string,
|
|
326
|
+
skillFilePath: string,
|
|
327
|
+
): ParsedFrontmatter | null {
|
|
295
328
|
const result = parseFrontmatterFields(content);
|
|
296
329
|
if (!result) {
|
|
297
|
-
log.warn({ skillFilePath },
|
|
330
|
+
log.warn({ skillFilePath }, "Skipping skill without YAML frontmatter");
|
|
298
331
|
return null;
|
|
299
332
|
}
|
|
300
333
|
|
|
@@ -303,18 +336,23 @@ function parseFrontmatter(content: string, skillFilePath: string): ParsedFrontma
|
|
|
303
336
|
const name = fields.name?.trim();
|
|
304
337
|
const description = fields.description?.trim();
|
|
305
338
|
if (!name || !description) {
|
|
306
|
-
log.warn(
|
|
339
|
+
log.warn(
|
|
340
|
+
{ skillFilePath },
|
|
341
|
+
'Skipping skill missing required frontmatter keys "name" and/or "description"',
|
|
342
|
+
);
|
|
307
343
|
return null;
|
|
308
344
|
}
|
|
309
345
|
|
|
310
346
|
// Parse new optional fields
|
|
311
347
|
const homepage = fields.homepage?.trim() || undefined;
|
|
312
348
|
|
|
313
|
-
const userInvocableRaw = fields[
|
|
314
|
-
const userInvocable = userInvocableRaw !==
|
|
349
|
+
const userInvocableRaw = fields["user-invocable"]?.trim().toLowerCase();
|
|
350
|
+
const userInvocable = userInvocableRaw !== "false";
|
|
315
351
|
|
|
316
|
-
const disableModelInvocationRaw = fields[
|
|
317
|
-
|
|
352
|
+
const disableModelInvocationRaw = fields["disable-model-invocation"]
|
|
353
|
+
?.trim()
|
|
354
|
+
.toLowerCase();
|
|
355
|
+
const disableModelInvocation = disableModelInvocationRaw === "true";
|
|
318
356
|
|
|
319
357
|
// Parse metadata as single-line JSON string, extract .vellum namespace
|
|
320
358
|
let metadata: VellumMetadata | undefined;
|
|
@@ -322,11 +360,14 @@ function parseFrontmatter(content: string, skillFilePath: string): ParsedFrontma
|
|
|
322
360
|
if (metadataRaw) {
|
|
323
361
|
try {
|
|
324
362
|
const parsed = JSON.parse(metadataRaw);
|
|
325
|
-
if (parsed && typeof parsed ===
|
|
363
|
+
if (parsed && typeof parsed === "object" && parsed.vellum) {
|
|
326
364
|
metadata = parsed.vellum as VellumMetadata;
|
|
327
365
|
}
|
|
328
366
|
} catch (err) {
|
|
329
|
-
log.warn(
|
|
367
|
+
log.warn(
|
|
368
|
+
{ err, skillFilePath },
|
|
369
|
+
"Failed to parse metadata JSON in frontmatter",
|
|
370
|
+
);
|
|
330
371
|
}
|
|
331
372
|
}
|
|
332
373
|
|
|
@@ -341,7 +382,8 @@ function parseFrontmatter(content: string, skillFilePath: string): ParsedFrontma
|
|
|
341
382
|
}
|
|
342
383
|
|
|
343
384
|
const includes = parseIncludes(fields.includes, skillFilePath);
|
|
344
|
-
const credentialSetupFor =
|
|
385
|
+
const credentialSetupFor =
|
|
386
|
+
fields["credential-setup-for"]?.trim() || undefined;
|
|
345
387
|
|
|
346
388
|
return {
|
|
347
389
|
name,
|
|
@@ -362,13 +404,19 @@ function getCanonicalPath(path: string): string {
|
|
|
362
404
|
return existsSync(path) ? realpathSync(path) : resolve(path);
|
|
363
405
|
}
|
|
364
406
|
|
|
365
|
-
function getRelativeToSkillsRoot(
|
|
407
|
+
function getRelativeToSkillsRoot(
|
|
408
|
+
skillsDir: string,
|
|
409
|
+
candidatePath: string,
|
|
410
|
+
): string {
|
|
366
411
|
return relative(getCanonicalPath(skillsDir), getCanonicalPath(candidatePath));
|
|
367
412
|
}
|
|
368
413
|
|
|
369
|
-
function isOutsideSkillsRoot(
|
|
414
|
+
function isOutsideSkillsRoot(
|
|
415
|
+
skillsDir: string,
|
|
416
|
+
candidatePath: string,
|
|
417
|
+
): boolean {
|
|
370
418
|
const relativePath = getRelativeToSkillsRoot(skillsDir, candidatePath);
|
|
371
|
-
return relativePath.startsWith(
|
|
419
|
+
return relativePath.startsWith("..") || isAbsolute(relativePath);
|
|
372
420
|
}
|
|
373
421
|
|
|
374
422
|
// ─── Tool manifest detection ─────────────────────────────────────────────────
|
|
@@ -379,19 +427,22 @@ function isOutsideSkillsRoot(skillsDir: string, candidatePath: string): boolean
|
|
|
379
427
|
* recursively hashing the skill directory during catalog load.
|
|
380
428
|
*/
|
|
381
429
|
function createManifestMeta(
|
|
382
|
-
base: Omit<SkillToolManifestMeta,
|
|
430
|
+
base: Omit<SkillToolManifestMeta, "versionHash">,
|
|
383
431
|
directoryPath: string,
|
|
384
432
|
): SkillToolManifestMeta {
|
|
385
433
|
let cached: string | undefined;
|
|
386
434
|
let computed = false;
|
|
387
|
-
return Object.defineProperty({ ...base },
|
|
435
|
+
return Object.defineProperty({ ...base }, "versionHash", {
|
|
388
436
|
get() {
|
|
389
437
|
if (!computed) {
|
|
390
438
|
computed = true;
|
|
391
439
|
try {
|
|
392
440
|
cached = computeSkillVersionHash(directoryPath);
|
|
393
441
|
} catch (err) {
|
|
394
|
-
log.warn(
|
|
442
|
+
log.warn(
|
|
443
|
+
{ err, directoryPath },
|
|
444
|
+
"Failed to compute skill version hash",
|
|
445
|
+
);
|
|
395
446
|
}
|
|
396
447
|
}
|
|
397
448
|
return cached;
|
|
@@ -406,58 +457,79 @@ function createManifestMeta(
|
|
|
406
457
|
* Returns the manifest metadata if the file exists, or undefined if it doesn't.
|
|
407
458
|
* On parse failure, returns a degraded metadata object (present but invalid).
|
|
408
459
|
*/
|
|
409
|
-
function detectToolManifest(
|
|
410
|
-
|
|
460
|
+
function detectToolManifest(
|
|
461
|
+
directoryPath: string,
|
|
462
|
+
): SkillToolManifestMeta | undefined {
|
|
463
|
+
const manifestPath = join(directoryPath, "TOOLS.json");
|
|
411
464
|
if (!existsSync(manifestPath)) {
|
|
412
465
|
return undefined;
|
|
413
466
|
}
|
|
414
467
|
|
|
415
468
|
try {
|
|
416
469
|
const manifest = parseToolManifestFile(manifestPath);
|
|
417
|
-
return createManifestMeta(
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
470
|
+
return createManifestMeta(
|
|
471
|
+
{
|
|
472
|
+
present: true,
|
|
473
|
+
valid: true,
|
|
474
|
+
toolCount: manifest.tools.length,
|
|
475
|
+
toolNames: manifest.tools.map((t) => t.name),
|
|
476
|
+
},
|
|
477
|
+
directoryPath,
|
|
478
|
+
);
|
|
423
479
|
} catch (err) {
|
|
424
|
-
log.warn({ err, manifestPath },
|
|
425
|
-
return createManifestMeta(
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
480
|
+
log.warn({ err, manifestPath }, "Failed to parse TOOLS.json manifest");
|
|
481
|
+
return createManifestMeta(
|
|
482
|
+
{
|
|
483
|
+
present: true,
|
|
484
|
+
valid: false,
|
|
485
|
+
toolCount: 0,
|
|
486
|
+
toolNames: [],
|
|
487
|
+
},
|
|
488
|
+
directoryPath,
|
|
489
|
+
);
|
|
431
490
|
}
|
|
432
491
|
}
|
|
433
492
|
|
|
434
493
|
// ─── Skill reading ───────────────────────────────────────────────────────────
|
|
435
494
|
|
|
436
|
-
function readSkillFromDirectory(
|
|
437
|
-
|
|
495
|
+
function readSkillFromDirectory(
|
|
496
|
+
directoryPath: string,
|
|
497
|
+
skillsDir: string,
|
|
498
|
+
source: SkillSource,
|
|
499
|
+
): SkillDefinition | null {
|
|
500
|
+
const skillFilePath = join(directoryPath, "SKILL.md");
|
|
438
501
|
if (!existsSync(skillFilePath)) {
|
|
439
|
-
log.warn({ directoryPath },
|
|
502
|
+
log.warn({ directoryPath }, "Skipping skill directory without SKILL.md");
|
|
440
503
|
return null;
|
|
441
504
|
}
|
|
442
505
|
|
|
443
506
|
try {
|
|
444
507
|
if (isOutsideSkillsRoot(skillsDir, directoryPath)) {
|
|
445
|
-
log.warn(
|
|
508
|
+
log.warn(
|
|
509
|
+
{ directoryPath },
|
|
510
|
+
"Skipping skill directory that resolves outside ~/.vellum/workspace/skills",
|
|
511
|
+
);
|
|
446
512
|
return null;
|
|
447
513
|
}
|
|
448
514
|
|
|
449
515
|
const stat = statSync(skillFilePath);
|
|
450
516
|
if (!stat.isFile()) {
|
|
451
|
-
log.warn(
|
|
517
|
+
log.warn(
|
|
518
|
+
{ skillFilePath },
|
|
519
|
+
"Skipping skill path because SKILL.md is not a file",
|
|
520
|
+
);
|
|
452
521
|
return null;
|
|
453
522
|
}
|
|
454
523
|
|
|
455
524
|
if (isOutsideSkillsRoot(skillsDir, skillFilePath)) {
|
|
456
|
-
log.warn(
|
|
525
|
+
log.warn(
|
|
526
|
+
{ skillFilePath },
|
|
527
|
+
"Skipping SKILL.md that resolves outside ~/.vellum/workspace/skills",
|
|
528
|
+
);
|
|
457
529
|
return null;
|
|
458
530
|
}
|
|
459
531
|
|
|
460
|
-
const content = readFileSync(skillFilePath,
|
|
532
|
+
const content = readFileSync(skillFilePath, "utf-8");
|
|
461
533
|
const parsed = parseFrontmatter(content, skillFilePath);
|
|
462
534
|
if (!parsed) return null;
|
|
463
535
|
|
|
@@ -479,26 +551,34 @@ function readSkillFromDirectory(directoryPath: string, skillsDir: string, source
|
|
|
479
551
|
credentialSetupFor: parsed.credentialSetupFor,
|
|
480
552
|
};
|
|
481
553
|
} catch (err) {
|
|
482
|
-
log.warn({ err, skillFilePath },
|
|
554
|
+
log.warn({ err, skillFilePath }, "Failed to read skill file");
|
|
483
555
|
return null;
|
|
484
556
|
}
|
|
485
557
|
}
|
|
486
558
|
|
|
487
|
-
function readBundledSkillFromDirectory(
|
|
488
|
-
|
|
559
|
+
function readBundledSkillFromDirectory(
|
|
560
|
+
directoryPath: string,
|
|
561
|
+
): SkillDefinition | null {
|
|
562
|
+
const skillFilePath = join(directoryPath, "SKILL.md");
|
|
489
563
|
if (!existsSync(skillFilePath)) {
|
|
490
|
-
log.warn(
|
|
564
|
+
log.warn(
|
|
565
|
+
{ directoryPath },
|
|
566
|
+
"Skipping bundled skill directory without SKILL.md",
|
|
567
|
+
);
|
|
491
568
|
return null;
|
|
492
569
|
}
|
|
493
570
|
|
|
494
571
|
try {
|
|
495
572
|
const stat = statSync(skillFilePath);
|
|
496
573
|
if (!stat.isFile()) {
|
|
497
|
-
log.warn(
|
|
574
|
+
log.warn(
|
|
575
|
+
{ skillFilePath },
|
|
576
|
+
"Skipping bundled skill path because SKILL.md is not a file",
|
|
577
|
+
);
|
|
498
578
|
return null;
|
|
499
579
|
}
|
|
500
580
|
|
|
501
|
-
const content = readFileSync(skillFilePath,
|
|
581
|
+
const content = readFileSync(skillFilePath, "utf-8");
|
|
502
582
|
const parsed = parseFrontmatter(content, skillFilePath);
|
|
503
583
|
if (!parsed) return null;
|
|
504
584
|
|
|
@@ -514,14 +594,14 @@ function readBundledSkillFromDirectory(directoryPath: string): SkillDefinition |
|
|
|
514
594
|
homepage: parsed.homepage,
|
|
515
595
|
userInvocable: parsed.userInvocable,
|
|
516
596
|
disableModelInvocation: parsed.disableModelInvocation,
|
|
517
|
-
source:
|
|
597
|
+
source: "bundled",
|
|
518
598
|
metadata: parsed.metadata,
|
|
519
599
|
toolManifest: detectToolManifest(directoryPath),
|
|
520
600
|
includes: parsed.includes,
|
|
521
601
|
credentialSetupFor: parsed.credentialSetupFor,
|
|
522
602
|
};
|
|
523
603
|
} catch (err) {
|
|
524
|
-
log.warn({ err, skillFilePath },
|
|
604
|
+
log.warn({ err, skillFilePath }, "Failed to read bundled skill file");
|
|
525
605
|
return null;
|
|
526
606
|
}
|
|
527
607
|
}
|
|
@@ -538,12 +618,15 @@ function discoverBundledSkillDirectories(): string[] {
|
|
|
538
618
|
for (const entry of entries) {
|
|
539
619
|
if (!entry.isDirectory()) continue;
|
|
540
620
|
const directoryPath = join(bundledDir, entry.name);
|
|
541
|
-
if (existsSync(join(directoryPath,
|
|
621
|
+
if (existsSync(join(directoryPath, "SKILL.md"))) {
|
|
542
622
|
dirs.push(directoryPath);
|
|
543
623
|
}
|
|
544
624
|
}
|
|
545
625
|
} catch (err) {
|
|
546
|
-
log.warn(
|
|
626
|
+
log.warn(
|
|
627
|
+
{ err, bundledDir },
|
|
628
|
+
"Failed to discover bundled skill directories",
|
|
629
|
+
);
|
|
547
630
|
return [];
|
|
548
631
|
}
|
|
549
632
|
|
|
@@ -569,7 +652,7 @@ function loadBundledSkills(): SkillSummary[] {
|
|
|
569
652
|
homepage: skill.homepage,
|
|
570
653
|
userInvocable: skill.userInvocable,
|
|
571
654
|
disableModelInvocation: skill.disableModelInvocation,
|
|
572
|
-
source:
|
|
655
|
+
source: "bundled",
|
|
573
656
|
metadata: skill.metadata,
|
|
574
657
|
toolManifest: skill.toolManifest,
|
|
575
658
|
includes: skill.includes,
|
|
@@ -592,33 +675,43 @@ function parseIndexEntry(line: string): string | null {
|
|
|
592
675
|
entry = markdownLinkMatch[1].trim();
|
|
593
676
|
}
|
|
594
677
|
|
|
595
|
-
if (entry.startsWith(
|
|
678
|
+
if (entry.startsWith("`") && entry.endsWith("`")) {
|
|
596
679
|
entry = entry.slice(1, -1).trim();
|
|
597
680
|
}
|
|
598
681
|
|
|
599
682
|
return entry.length > 0 ? entry : null;
|
|
600
683
|
}
|
|
601
684
|
|
|
602
|
-
function resolveIndexEntryToDirectory(
|
|
685
|
+
function resolveIndexEntryToDirectory(
|
|
686
|
+
skillsDir: string,
|
|
687
|
+
entry: string,
|
|
688
|
+
): string | null {
|
|
603
689
|
if (isAbsolute(entry)) {
|
|
604
|
-
log.warn(
|
|
690
|
+
log.warn(
|
|
691
|
+
{ entry },
|
|
692
|
+
"Skipping SKILLS.md entry because absolute paths are not allowed",
|
|
693
|
+
);
|
|
605
694
|
return null;
|
|
606
695
|
}
|
|
607
696
|
|
|
608
697
|
const resolvedEntryPath = resolve(skillsDir, entry);
|
|
609
|
-
const resolvedDirectory =
|
|
610
|
-
|
|
611
|
-
|
|
698
|
+
const resolvedDirectory =
|
|
699
|
+
basename(resolvedEntryPath).toLowerCase() === "skill.md"
|
|
700
|
+
? dirname(resolvedEntryPath)
|
|
701
|
+
: resolvedEntryPath;
|
|
612
702
|
|
|
613
703
|
const relativePath = getRelativeToSkillsRoot(skillsDir, resolvedDirectory);
|
|
614
704
|
if (relativePath.length === 0) {
|
|
615
|
-
log.warn(
|
|
705
|
+
log.warn(
|
|
706
|
+
{ entry },
|
|
707
|
+
"Skipping SKILLS.md entry that resolves to the skills root",
|
|
708
|
+
);
|
|
616
709
|
return null;
|
|
617
710
|
}
|
|
618
711
|
if (isOutsideSkillsRoot(skillsDir, resolvedDirectory)) {
|
|
619
712
|
log.warn(
|
|
620
713
|
{ entry, resolvedDirectory: getCanonicalPath(resolvedDirectory) },
|
|
621
|
-
|
|
714
|
+
"Skipping SKILLS.md entry that resolves outside ~/.vellum/workspace/skills",
|
|
622
715
|
);
|
|
623
716
|
return null;
|
|
624
717
|
}
|
|
@@ -630,11 +723,14 @@ function getIndexedSkillDirectories(skillsDir: string): string[] | null {
|
|
|
630
723
|
const indexPath = getSkillsIndexPath(skillsDir);
|
|
631
724
|
if (!existsSync(indexPath)) return null;
|
|
632
725
|
|
|
633
|
-
let rawIndex =
|
|
726
|
+
let rawIndex = "";
|
|
634
727
|
try {
|
|
635
|
-
rawIndex = readFileSync(indexPath,
|
|
728
|
+
rawIndex = readFileSync(indexPath, "utf-8");
|
|
636
729
|
} catch (err) {
|
|
637
|
-
log.warn(
|
|
730
|
+
log.warn(
|
|
731
|
+
{ err, indexPath },
|
|
732
|
+
"Failed to read SKILLS.md; treating as empty catalog",
|
|
733
|
+
);
|
|
638
734
|
return [];
|
|
639
735
|
}
|
|
640
736
|
|
|
@@ -664,12 +760,12 @@ function discoverSkillDirectories(skillsDir: string): string[] {
|
|
|
664
760
|
for (const entry of entries) {
|
|
665
761
|
if (!entry.isDirectory()) continue;
|
|
666
762
|
const directoryPath = join(skillsDir, entry.name);
|
|
667
|
-
if (existsSync(join(directoryPath,
|
|
763
|
+
if (existsSync(join(directoryPath, "SKILL.md"))) {
|
|
668
764
|
dirs.push(directoryPath);
|
|
669
765
|
}
|
|
670
766
|
}
|
|
671
767
|
} catch (err) {
|
|
672
|
-
log.warn({ err, skillsDir },
|
|
768
|
+
log.warn({ err, skillsDir }, "Failed to discover skill directories");
|
|
673
769
|
return [];
|
|
674
770
|
}
|
|
675
771
|
|
|
@@ -678,7 +774,10 @@ function discoverSkillDirectories(skillsDir: string): string[] {
|
|
|
678
774
|
|
|
679
775
|
// ─── Catalog loading ─────────────────────────────────────────────────────────
|
|
680
776
|
|
|
681
|
-
function skillSummaryFromDefinition(
|
|
777
|
+
function skillSummaryFromDefinition(
|
|
778
|
+
skill: SkillDefinition,
|
|
779
|
+
source: SkillSource,
|
|
780
|
+
): SkillSummary {
|
|
682
781
|
return {
|
|
683
782
|
id: skill.id,
|
|
684
783
|
name: skill.name,
|
|
@@ -698,7 +797,10 @@ function skillSummaryFromDefinition(skill: SkillDefinition, source: SkillSource)
|
|
|
698
797
|
};
|
|
699
798
|
}
|
|
700
799
|
|
|
701
|
-
export function loadSkillCatalog(
|
|
800
|
+
export function loadSkillCatalog(
|
|
801
|
+
workspaceSkillsDir?: string,
|
|
802
|
+
extraDirs?: string[],
|
|
803
|
+
): SkillSummary[] {
|
|
702
804
|
const catalog: SkillSummary[] = [];
|
|
703
805
|
const seenIds = new Set<string>();
|
|
704
806
|
|
|
@@ -708,20 +810,23 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
708
810
|
if (!existsSync(dir)) continue;
|
|
709
811
|
const dirs = discoverSkillDirectories(dir);
|
|
710
812
|
for (const directory of dirs) {
|
|
711
|
-
const skillFilePath = join(directory,
|
|
813
|
+
const skillFilePath = join(directory, "SKILL.md");
|
|
712
814
|
if (!existsSync(skillFilePath)) continue;
|
|
713
815
|
|
|
714
816
|
try {
|
|
715
817
|
const stat = statSync(skillFilePath);
|
|
716
818
|
if (!stat.isFile()) continue;
|
|
717
819
|
|
|
718
|
-
const content = readFileSync(skillFilePath,
|
|
820
|
+
const content = readFileSync(skillFilePath, "utf-8");
|
|
719
821
|
const parsed = parseFrontmatter(content, skillFilePath);
|
|
720
822
|
if (!parsed) continue;
|
|
721
823
|
|
|
722
824
|
const id = basename(directory);
|
|
723
825
|
if (seenIds.has(id)) {
|
|
724
|
-
log.warn(
|
|
826
|
+
log.warn(
|
|
827
|
+
{ id, directory },
|
|
828
|
+
"Skipping duplicate skill id from extraDirs",
|
|
829
|
+
);
|
|
725
830
|
continue;
|
|
726
831
|
}
|
|
727
832
|
|
|
@@ -736,14 +841,14 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
736
841
|
homepage: parsed.homepage,
|
|
737
842
|
userInvocable: parsed.userInvocable,
|
|
738
843
|
disableModelInvocation: parsed.disableModelInvocation,
|
|
739
|
-
source:
|
|
844
|
+
source: "extra",
|
|
740
845
|
metadata: parsed.metadata,
|
|
741
846
|
toolManifest: detectToolManifest(directory),
|
|
742
847
|
includes: parsed.includes,
|
|
743
848
|
credentialSetupFor: parsed.credentialSetupFor,
|
|
744
849
|
});
|
|
745
850
|
} catch (err) {
|
|
746
|
-
log.warn({ err, directory },
|
|
851
|
+
log.warn({ err, directory }, "Failed to read skill from extraDirs");
|
|
747
852
|
}
|
|
748
853
|
}
|
|
749
854
|
}
|
|
@@ -755,12 +860,18 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
755
860
|
if (seenIds.has(skill.id)) {
|
|
756
861
|
// Bundled wins over extraDirs
|
|
757
862
|
const existingIndex = catalog.findIndex((s) => s.id === skill.id);
|
|
758
|
-
if (existingIndex !== -1 && catalog[existingIndex].source ===
|
|
759
|
-
log.info(
|
|
863
|
+
if (existingIndex !== -1 && catalog[existingIndex].source === "extra") {
|
|
864
|
+
log.info(
|
|
865
|
+
{ id: skill.id, directory: skill.directoryPath },
|
|
866
|
+
"Bundled skill overrides extraDirs skill",
|
|
867
|
+
);
|
|
760
868
|
catalog[existingIndex] = skill;
|
|
761
869
|
continue;
|
|
762
870
|
}
|
|
763
|
-
log.warn(
|
|
871
|
+
log.warn(
|
|
872
|
+
{ id: skill.id, directory: skill.directoryPath },
|
|
873
|
+
"Skipping duplicate bundled skill id",
|
|
874
|
+
);
|
|
764
875
|
continue;
|
|
765
876
|
}
|
|
766
877
|
seenIds.add(skill.id);
|
|
@@ -773,23 +884,30 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
773
884
|
const directories = indexedDirectories ?? discoverSkillDirectories(skillsDir);
|
|
774
885
|
|
|
775
886
|
for (const directory of directories) {
|
|
776
|
-
const skill = readSkillFromDirectory(directory, skillsDir,
|
|
887
|
+
const skill = readSkillFromDirectory(directory, skillsDir, "managed");
|
|
777
888
|
if (!skill) continue;
|
|
778
889
|
|
|
779
890
|
if (seenIds.has(skill.id)) {
|
|
780
891
|
// If the existing entry is bundled, the user skill overrides it
|
|
781
892
|
const existingIndex = catalog.findIndex((s) => s.id === skill.id);
|
|
782
|
-
if (
|
|
783
|
-
|
|
784
|
-
catalog[existingIndex]
|
|
893
|
+
if (
|
|
894
|
+
existingIndex !== -1 &&
|
|
895
|
+
(catalog[existingIndex].bundled ||
|
|
896
|
+
catalog[existingIndex].source === "extra")
|
|
897
|
+
) {
|
|
898
|
+
log.info(
|
|
899
|
+
{ id: skill.id, directory },
|
|
900
|
+
"User skill overrides bundled skill",
|
|
901
|
+
);
|
|
902
|
+
catalog[existingIndex] = skillSummaryFromDefinition(skill, "managed");
|
|
785
903
|
continue;
|
|
786
904
|
}
|
|
787
|
-
log.warn({ id: skill.id, directory },
|
|
905
|
+
log.warn({ id: skill.id, directory }, "Skipping duplicate skill id");
|
|
788
906
|
continue;
|
|
789
907
|
}
|
|
790
908
|
|
|
791
909
|
seenIds.add(skill.id);
|
|
792
|
-
catalog.push(skillSummaryFromDefinition(skill,
|
|
910
|
+
catalog.push(skillSummaryFromDefinition(skill, "managed"));
|
|
793
911
|
}
|
|
794
912
|
|
|
795
913
|
// Load workspace skills with highest precedence
|
|
@@ -797,14 +915,14 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
797
915
|
const workspaceDirs = discoverSkillDirectories(workspaceSkillsDir);
|
|
798
916
|
|
|
799
917
|
for (const directory of workspaceDirs) {
|
|
800
|
-
const skillFilePath = join(directory,
|
|
918
|
+
const skillFilePath = join(directory, "SKILL.md");
|
|
801
919
|
if (!existsSync(skillFilePath)) continue;
|
|
802
920
|
|
|
803
921
|
try {
|
|
804
922
|
const stat = statSync(skillFilePath);
|
|
805
923
|
if (!stat.isFile()) continue;
|
|
806
924
|
|
|
807
|
-
const content = readFileSync(skillFilePath,
|
|
925
|
+
const content = readFileSync(skillFilePath, "utf-8");
|
|
808
926
|
const parsed = parseFrontmatter(content, skillFilePath);
|
|
809
927
|
if (!parsed) continue;
|
|
810
928
|
|
|
@@ -819,7 +937,7 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
819
937
|
homepage: parsed.homepage,
|
|
820
938
|
userInvocable: parsed.userInvocable,
|
|
821
939
|
disableModelInvocation: parsed.disableModelInvocation,
|
|
822
|
-
source:
|
|
940
|
+
source: "workspace",
|
|
823
941
|
metadata: parsed.metadata,
|
|
824
942
|
toolManifest: detectToolManifest(directory),
|
|
825
943
|
includes: parsed.includes,
|
|
@@ -830,7 +948,10 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
830
948
|
// Workspace skills override any existing skill
|
|
831
949
|
const existingIndex = catalog.findIndex((s) => s.id === id);
|
|
832
950
|
if (existingIndex !== -1) {
|
|
833
|
-
log.info(
|
|
951
|
+
log.info(
|
|
952
|
+
{ id, directory },
|
|
953
|
+
"Workspace skill overrides existing skill",
|
|
954
|
+
);
|
|
834
955
|
catalog[existingIndex] = workspaceSkill;
|
|
835
956
|
continue;
|
|
836
957
|
}
|
|
@@ -839,7 +960,7 @@ export function loadSkillCatalog(workspaceSkillsDir?: string, extraDirs?: string
|
|
|
839
960
|
seenIds.add(id);
|
|
840
961
|
catalog.push(workspaceSkill);
|
|
841
962
|
} catch (err) {
|
|
842
|
-
log.warn({ err, directory },
|
|
963
|
+
log.warn({ err, directory }, "Failed to read workspace skill");
|
|
843
964
|
}
|
|
844
965
|
}
|
|
845
966
|
}
|
|
@@ -851,30 +972,46 @@ function loadSkillDefinition(skill: SkillSummary): SkillLookupResult {
|
|
|
851
972
|
let loaded: SkillDefinition | null;
|
|
852
973
|
if (skill.bundled) {
|
|
853
974
|
loaded = readBundledSkillFromDirectory(skill.directoryPath);
|
|
854
|
-
} else if (skill.source ===
|
|
975
|
+
} else if (skill.source === "workspace") {
|
|
855
976
|
// Workspace skills live outside ~/.vellum/workspace/skills, so use their parent
|
|
856
977
|
// directory as the root to avoid the isOutsideSkillsRoot rejection.
|
|
857
|
-
loaded = readSkillFromDirectory(
|
|
978
|
+
loaded = readSkillFromDirectory(
|
|
979
|
+
skill.directoryPath,
|
|
980
|
+
dirname(skill.directoryPath),
|
|
981
|
+
skill.source,
|
|
982
|
+
);
|
|
858
983
|
} else {
|
|
859
|
-
loaded = readSkillFromDirectory(
|
|
984
|
+
loaded = readSkillFromDirectory(
|
|
985
|
+
skill.directoryPath,
|
|
986
|
+
getSkillsDir(),
|
|
987
|
+
skill.source,
|
|
988
|
+
);
|
|
860
989
|
}
|
|
861
990
|
if (!loaded) {
|
|
862
991
|
return { error: `Failed to load SKILL.md for "${skill.id}"` };
|
|
863
992
|
}
|
|
864
993
|
// Replace {baseDir} placeholders with the actual skill directory path
|
|
865
|
-
loaded.body = loaded.body.replaceAll(
|
|
994
|
+
loaded.body = loaded.body.replaceAll("{baseDir}", loaded.directoryPath);
|
|
866
995
|
return { skill: loaded };
|
|
867
996
|
}
|
|
868
997
|
|
|
869
|
-
export function resolveSkillSelector(
|
|
998
|
+
export function resolveSkillSelector(
|
|
999
|
+
selector: string,
|
|
1000
|
+
workspaceSkillsDir?: string,
|
|
1001
|
+
): SkillSelectorResult {
|
|
870
1002
|
const needle = selector.trim();
|
|
871
1003
|
if (!needle) {
|
|
872
|
-
return {
|
|
1004
|
+
return {
|
|
1005
|
+
error: "Skill selector is required and must be a non-empty string.",
|
|
1006
|
+
};
|
|
873
1007
|
}
|
|
874
1008
|
|
|
875
1009
|
const catalog = loadSkillCatalog(workspaceSkillsDir);
|
|
876
1010
|
if (catalog.length === 0) {
|
|
877
|
-
return {
|
|
1011
|
+
return {
|
|
1012
|
+
error:
|
|
1013
|
+
"No skills are available. Configure ~/.vellum/workspace/skills/SKILLS.md or add skill directories.",
|
|
1014
|
+
};
|
|
878
1015
|
}
|
|
879
1016
|
|
|
880
1017
|
const exactIdMatch = catalog.find((skill) => skill.id === needle);
|
|
@@ -889,46 +1026,62 @@ export function resolveSkillSelector(selector: string, workspaceSkillsDir?: stri
|
|
|
889
1026
|
return { skill: exactNameMatches[0] };
|
|
890
1027
|
}
|
|
891
1028
|
if (exactNameMatches.length > 1) {
|
|
892
|
-
const ids = exactNameMatches.map((skill) => skill.id).join(
|
|
1029
|
+
const ids = exactNameMatches.map((skill) => skill.id).join(", ");
|
|
893
1030
|
return { error: `Ambiguous skill name "${needle}". Matching IDs: ${ids}` };
|
|
894
1031
|
}
|
|
895
1032
|
|
|
896
|
-
const idPrefixMatches = catalog.filter((skill) =>
|
|
1033
|
+
const idPrefixMatches = catalog.filter((skill) =>
|
|
1034
|
+
skill.id.startsWith(needle),
|
|
1035
|
+
);
|
|
897
1036
|
if (idPrefixMatches.length === 1) {
|
|
898
1037
|
return { skill: idPrefixMatches[0] };
|
|
899
1038
|
}
|
|
900
1039
|
if (idPrefixMatches.length > 1) {
|
|
901
|
-
const ids = idPrefixMatches.map((skill) => skill.id).join(
|
|
902
|
-
return {
|
|
1040
|
+
const ids = idPrefixMatches.map((skill) => skill.id).join(", ");
|
|
1041
|
+
return {
|
|
1042
|
+
error: `Ambiguous skill id prefix "${needle}". Matching IDs: ${ids}`,
|
|
1043
|
+
};
|
|
903
1044
|
}
|
|
904
1045
|
|
|
905
|
-
const knownSkills = catalog.map((skill) => skill.id).join(
|
|
906
|
-
return {
|
|
1046
|
+
const knownSkills = catalog.map((skill) => skill.id).join(", ");
|
|
1047
|
+
return {
|
|
1048
|
+
error: `No skill matched "${needle}". Available skills: ${knownSkills}`,
|
|
1049
|
+
};
|
|
907
1050
|
}
|
|
908
1051
|
|
|
909
|
-
export function loadSkillBySelector(
|
|
1052
|
+
export function loadSkillBySelector(
|
|
1053
|
+
selector: string,
|
|
1054
|
+
workspaceSkillsDir?: string,
|
|
1055
|
+
): SkillLookupResult {
|
|
910
1056
|
const resolved = resolveSkillSelector(selector, workspaceSkillsDir);
|
|
911
1057
|
if (!resolved.skill) {
|
|
912
|
-
return { error: resolved.error ??
|
|
1058
|
+
return { error: resolved.error ?? "Failed to resolve skill selector." };
|
|
913
1059
|
}
|
|
914
1060
|
return loadSkillDefinition(resolved.skill);
|
|
915
1061
|
}
|
|
916
1062
|
|
|
917
1063
|
// ─── Icon generation ─────────────────────────────────────────────────────────
|
|
918
1064
|
|
|
919
|
-
async function generateSkillIcon(
|
|
1065
|
+
async function generateSkillIcon(
|
|
1066
|
+
name: string,
|
|
1067
|
+
description: string,
|
|
1068
|
+
): Promise<string> {
|
|
920
1069
|
const provider = getConfiguredProvider();
|
|
921
1070
|
if (!provider) {
|
|
922
|
-
throw new Error(
|
|
1071
|
+
throw new Error("Configured provider unavailable for icon generation");
|
|
923
1072
|
}
|
|
924
1073
|
|
|
925
1074
|
const response = await provider.sendMessage(
|
|
926
|
-
[
|
|
1075
|
+
[
|
|
1076
|
+
userMessage(
|
|
1077
|
+
`Create a 16x16 pixel art SVG icon representing this skill:\nName: ${name}\nDescription: ${description}`,
|
|
1078
|
+
),
|
|
1079
|
+
],
|
|
927
1080
|
undefined,
|
|
928
1081
|
'You are a pixel art icon designer. When asked, return ONLY a single <svg> element — no explanation, no markdown, no code fences. The SVG must be a 16x16 grid pixel art icon using <rect> elements. Use a limited palette (3-5 colors). Keep it under 2KB. The viewBox should be "0 0 16 16" with each pixel being a 1x1 rect.',
|
|
929
1082
|
{
|
|
930
1083
|
config: {
|
|
931
|
-
modelIntent:
|
|
1084
|
+
modelIntent: "latency-optimized",
|
|
932
1085
|
max_tokens: 1024,
|
|
933
1086
|
},
|
|
934
1087
|
},
|
|
@@ -938,7 +1091,7 @@ async function generateSkillIcon(name: string, description: string): Promise<str
|
|
|
938
1091
|
|
|
939
1092
|
const svgMatch = text.match(/<svg[\s\S]*<\/svg>/i);
|
|
940
1093
|
if (!svgMatch) {
|
|
941
|
-
throw new Error(
|
|
1094
|
+
throw new Error("No <svg> element found in response");
|
|
942
1095
|
}
|
|
943
1096
|
|
|
944
1097
|
return svgMatch[0];
|
|
@@ -948,10 +1101,10 @@ async function generateSkillIcon(name: string, description: string): Promise<str
|
|
|
948
1101
|
* Synchronously read a cached icon if it exists on disk. Returns undefined if not cached yet.
|
|
949
1102
|
*/
|
|
950
1103
|
export function readCachedSkillIcon(directoryPath: string): string | undefined {
|
|
951
|
-
const iconPath = join(directoryPath,
|
|
1104
|
+
const iconPath = join(directoryPath, "icon.svg");
|
|
952
1105
|
if (existsSync(iconPath)) {
|
|
953
1106
|
try {
|
|
954
|
-
return readFileSync(iconPath,
|
|
1107
|
+
return readFileSync(iconPath, "utf-8");
|
|
955
1108
|
} catch {
|
|
956
1109
|
return undefined;
|
|
957
1110
|
}
|
|
@@ -959,14 +1112,18 @@ export function readCachedSkillIcon(directoryPath: string): string | undefined {
|
|
|
959
1112
|
return undefined;
|
|
960
1113
|
}
|
|
961
1114
|
|
|
962
|
-
export async function ensureSkillIcon(
|
|
963
|
-
|
|
1115
|
+
export async function ensureSkillIcon(
|
|
1116
|
+
directoryPath: string,
|
|
1117
|
+
name: string,
|
|
1118
|
+
description: string,
|
|
1119
|
+
): Promise<string | undefined> {
|
|
1120
|
+
const iconPath = join(directoryPath, "icon.svg");
|
|
964
1121
|
|
|
965
1122
|
if (existsSync(iconPath)) {
|
|
966
1123
|
try {
|
|
967
|
-
return readFileSync(iconPath,
|
|
1124
|
+
return readFileSync(iconPath, "utf-8");
|
|
968
1125
|
} catch {
|
|
969
|
-
log.warn({ iconPath },
|
|
1126
|
+
log.warn({ iconPath }, "Failed to read existing icon.svg");
|
|
970
1127
|
return undefined;
|
|
971
1128
|
}
|
|
972
1129
|
}
|
|
@@ -974,14 +1131,17 @@ export async function ensureSkillIcon(directoryPath: string, name: string, descr
|
|
|
974
1131
|
try {
|
|
975
1132
|
const svg = await generateSkillIcon(name, description);
|
|
976
1133
|
try {
|
|
977
|
-
writeFileSync(iconPath, svg,
|
|
978
|
-
log.info({ iconPath },
|
|
1134
|
+
writeFileSync(iconPath, svg, "utf-8");
|
|
1135
|
+
log.info({ iconPath }, "Generated skill icon");
|
|
979
1136
|
} catch (writeErr) {
|
|
980
|
-
log.warn(
|
|
1137
|
+
log.warn(
|
|
1138
|
+
{ err: writeErr, iconPath },
|
|
1139
|
+
"Failed to cache icon.svg (returning generated icon anyway)",
|
|
1140
|
+
);
|
|
981
1141
|
}
|
|
982
1142
|
return svg;
|
|
983
1143
|
} catch (err) {
|
|
984
|
-
log.warn({ err, iconPath },
|
|
1144
|
+
log.warn({ err, iconPath }, "Failed to generate skill icon");
|
|
985
1145
|
return undefined;
|
|
986
1146
|
}
|
|
987
1147
|
}
|