@vellumai/assistant 0.4.43 → 0.4.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +4 -0
- package/ARCHITECTURE.md +46 -44
- package/README.md +15 -16
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -215
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -3
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-asset.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +32 -36
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +0 -10
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -5
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +7 -46
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/starter-task-flow.test.ts +9 -19
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +7 -7
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +84 -8
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -2
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
- package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +33 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +42 -10
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +53 -41
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/apps.ts +0 -25
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -73
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +8 -2
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/ride-shotgun-handler.ts +35 -43
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +45 -28
- package/src/daemon/session-agent-loop-handlers.ts +72 -9
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -7
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +192 -118
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +75 -37
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/app-store.ts +0 -18
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -37
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +13 -17
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +33 -35
- package/src/prompts/templates/BOOTSTRAP.md +0 -3
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +4 -6
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -8
- package/src/runtime/auth/scopes.ts +2 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +1 -24
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/http-types.ts +10 -0
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/middleware/error-handler.ts +14 -1
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +63 -67
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +234 -47
- package/src/runtime/routes/diagnostics-routes.ts +154 -43
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -351
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +37 -0
- package/src/tools/apps/executors.ts +0 -6
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/document/editor-template.ts +10 -8
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +12 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/home-base-bootstrap.test.ts +0 -84
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -920
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -116
- package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
- package/src/cli/commands/twitter/client.ts +0 -989
- package/src/cli/commands/twitter/index.ts +0 -1160
- package/src/cli/commands/twitter/oauth-client.ts +0 -94
- package/src/cli/commands/twitter/router.ts +0 -396
- package/src/cli/commands/twitter/session.ts +0 -121
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -137
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -319
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -405
- package/src/util/cookie-session.ts +0 -98
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
findSeededHomeBaseApp,
|
|
5
|
-
getPrebuiltHomeBasePreview,
|
|
6
|
-
} from "../home-base/prebuilt/seed.js";
|
|
7
3
|
import { getApp, getAppPreview, updateApp } from "../memory/app-store.js";
|
|
8
4
|
import type { ToolExecutionResult } from "../tools/types.js";
|
|
9
5
|
import { getLogger } from "../util/logger.js";
|
|
@@ -11,7 +7,6 @@ import { isPlainObject } from "../util/object.js";
|
|
|
11
7
|
import type {
|
|
12
8
|
CardSurfaceData,
|
|
13
9
|
DynamicPageSurfaceData,
|
|
14
|
-
FileUploadSurfaceData,
|
|
15
10
|
ListSurfaceData,
|
|
16
11
|
ServerMessage,
|
|
17
12
|
SurfaceData,
|
|
@@ -78,14 +73,27 @@ function normalizeCardShowData(
|
|
|
78
73
|
normalized.templateData = input.templateData;
|
|
79
74
|
}
|
|
80
75
|
|
|
81
|
-
//
|
|
76
|
+
// The LLM sometimes sends `title` or `body` at the top-level tool input
|
|
77
|
+
// instead of nesting them inside `data`. The Swift client requires `title`
|
|
78
|
+
// inside the card data dict — without it `parseCardData` returns nil and
|
|
79
|
+
// the surface is silently dropped. Copy them from input when missing.
|
|
80
|
+
if (
|
|
81
|
+
typeof normalized.title !== "string" &&
|
|
82
|
+
typeof input.title === "string" &&
|
|
83
|
+
input.title.trim().length > 0
|
|
84
|
+
) {
|
|
85
|
+
normalized.title = input.title;
|
|
86
|
+
}
|
|
87
|
+
if (typeof normalized.body !== "string" && typeof input.body === "string") {
|
|
88
|
+
normalized.body = input.body;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// task_progress cards: additional fallbacks for title from templateData.
|
|
82
92
|
if (
|
|
83
93
|
normalized.template === "task_progress" &&
|
|
84
94
|
typeof normalized.title !== "string"
|
|
85
95
|
) {
|
|
86
|
-
if (
|
|
87
|
-
normalized.title = input.title;
|
|
88
|
-
} else if (
|
|
96
|
+
if (
|
|
89
97
|
isPlainObject(normalized.templateData) &&
|
|
90
98
|
typeof normalized.templateData.title === "string"
|
|
91
99
|
) {
|
|
@@ -166,7 +174,17 @@ export interface SurfaceSessionContext {
|
|
|
166
174
|
>;
|
|
167
175
|
surfaceState: Map<
|
|
168
176
|
string,
|
|
169
|
-
{
|
|
177
|
+
{
|
|
178
|
+
surfaceType: SurfaceType;
|
|
179
|
+
data: SurfaceData;
|
|
180
|
+
title?: string;
|
|
181
|
+
actions?: Array<{
|
|
182
|
+
id: string;
|
|
183
|
+
label: string;
|
|
184
|
+
style?: string;
|
|
185
|
+
data?: Record<string, unknown>;
|
|
186
|
+
}>;
|
|
187
|
+
}
|
|
170
188
|
>;
|
|
171
189
|
surfaceUndoStacks: Map<string, string[]>;
|
|
172
190
|
/** Request IDs that originated from surface action button clicks (not regular user messages). */
|
|
@@ -176,7 +194,12 @@ export interface SurfaceSessionContext {
|
|
|
176
194
|
surfaceType: SurfaceType;
|
|
177
195
|
title?: string;
|
|
178
196
|
data: SurfaceData;
|
|
179
|
-
actions?: Array<{
|
|
197
|
+
actions?: Array<{
|
|
198
|
+
id: string;
|
|
199
|
+
label: string;
|
|
200
|
+
style?: string;
|
|
201
|
+
data?: Record<string, unknown>;
|
|
202
|
+
}>;
|
|
180
203
|
display?: string;
|
|
181
204
|
}>;
|
|
182
205
|
onEscalateToComputerUse?: (task: string, sourceSessionId: string) => boolean;
|
|
@@ -191,7 +214,7 @@ export interface SurfaceSessionContext {
|
|
|
191
214
|
metadata?: Record<string, unknown>,
|
|
192
215
|
options?: { isInteractive?: boolean },
|
|
193
216
|
displayContent?: string,
|
|
194
|
-
): { queued: boolean; rejected?: boolean
|
|
217
|
+
): { queued: boolean; requestId: string; rejected?: boolean };
|
|
195
218
|
getQueueDepth(): number;
|
|
196
219
|
processMessage(
|
|
197
220
|
content: string,
|
|
@@ -517,8 +540,82 @@ export function handleSurfaceAction(
|
|
|
517
540
|
data?: Record<string, unknown>,
|
|
518
541
|
): void {
|
|
519
542
|
const pending = ctx.pendingSurfaceActions.get(surfaceId);
|
|
543
|
+
|
|
544
|
+
// When surfaces are restored from history (e.g. onboarding cards), there is
|
|
545
|
+
// no in-memory pendingSurfaceActions entry. For relay_prompt / agent_prompt
|
|
546
|
+
// actions the client already sends the full payload (including { prompt }),
|
|
547
|
+
// so we can handle them without stored state.
|
|
520
548
|
if (!pending) {
|
|
521
|
-
|
|
549
|
+
const isRelay = actionId === "relay_prompt" || actionId === "agent_prompt";
|
|
550
|
+
const prompt =
|
|
551
|
+
isRelay && typeof data?.prompt === "string" ? data.prompt.trim() : "";
|
|
552
|
+
|
|
553
|
+
if (!prompt) {
|
|
554
|
+
log.warn({ surfaceId, actionId }, "No pending surface action found");
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
const requestId = uuid();
|
|
559
|
+
ctx.surfaceActionRequestIds.add(requestId);
|
|
560
|
+
const onEvent = (msg: ServerMessage) => ctx.sendToClient(msg);
|
|
561
|
+
|
|
562
|
+
ctx.traceEmitter.emit("request_received", "Surface action received", {
|
|
563
|
+
requestId,
|
|
564
|
+
status: "info",
|
|
565
|
+
attributes: { source: "surface_action", surfaceId, actionId },
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
const result = ctx.enqueueMessage(
|
|
569
|
+
prompt,
|
|
570
|
+
[],
|
|
571
|
+
onEvent,
|
|
572
|
+
requestId,
|
|
573
|
+
surfaceId,
|
|
574
|
+
);
|
|
575
|
+
|
|
576
|
+
if (result.rejected) {
|
|
577
|
+
ctx.surfaceActionRequestIds.delete(requestId);
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
// Echo the prompt to the client so it appears in the chat UI.
|
|
582
|
+
// Deferred until after rejection check to avoid ghost messages.
|
|
583
|
+
ctx.sendToClient({
|
|
584
|
+
type: "user_message_echo",
|
|
585
|
+
text: prompt,
|
|
586
|
+
sessionId: ctx.conversationId,
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
if (result.queued) {
|
|
590
|
+
log.info(
|
|
591
|
+
{ surfaceId, actionId, requestId },
|
|
592
|
+
"Relay prompt queued (session busy, history-restored)",
|
|
593
|
+
);
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// Session is idle — process the message immediately.
|
|
598
|
+
log.info(
|
|
599
|
+
{ surfaceId, actionId, requestId },
|
|
600
|
+
"Processing relay prompt immediately (history-restored)",
|
|
601
|
+
);
|
|
602
|
+
ctx
|
|
603
|
+
.processMessage(prompt, [], onEvent, requestId, surfaceId)
|
|
604
|
+
.catch((err) => {
|
|
605
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
606
|
+
log.error(
|
|
607
|
+
{ err, surfaceId, actionId },
|
|
608
|
+
"Failed to process history-restored relay prompt",
|
|
609
|
+
);
|
|
610
|
+
onEvent(
|
|
611
|
+
buildSessionErrorMessage(ctx.conversationId, {
|
|
612
|
+
code: "SESSION_PROCESSING_FAILED",
|
|
613
|
+
userMessage: `Something went wrong: ${message}`,
|
|
614
|
+
retryable: false,
|
|
615
|
+
debugDetails: `History-restored relay prompt processing failed: ${message}`,
|
|
616
|
+
}),
|
|
617
|
+
);
|
|
618
|
+
});
|
|
522
619
|
return;
|
|
523
620
|
}
|
|
524
621
|
const retainPending = pending.surfaceType === "dynamic_page";
|
|
@@ -538,32 +635,39 @@ export function handleSurfaceAction(
|
|
|
538
635
|
handleDocumentContentChanged(ctx, surfaceId, data);
|
|
539
636
|
return;
|
|
540
637
|
}
|
|
541
|
-
|
|
638
|
+
// Merge stored action-level data (from ui_show definition) with client-sent
|
|
639
|
+
// data. This is critical for relay_prompt buttons: the client only sends the
|
|
640
|
+
// actionId, but the prompt payload lives in the action definition's data.
|
|
641
|
+
const stored = ctx.surfaceState.get(surfaceId);
|
|
642
|
+
const actionDef = stored?.actions?.find((a) => a.id === actionId);
|
|
643
|
+
const mergedData: Record<string, unknown> | undefined =
|
|
644
|
+
actionDef?.data || data ? { ...actionDef?.data, ...data } : undefined;
|
|
645
|
+
|
|
646
|
+
ctx.lastSurfaceAction.set(surfaceId, { actionId, data: mergedData });
|
|
542
647
|
const shouldRelayPrompt =
|
|
543
648
|
actionId === "relay_prompt" || actionId === "agent_prompt";
|
|
544
649
|
const prompt =
|
|
545
|
-
shouldRelayPrompt && typeof
|
|
546
|
-
?
|
|
650
|
+
shouldRelayPrompt && typeof mergedData?.prompt === "string"
|
|
651
|
+
? mergedData.prompt.trim()
|
|
547
652
|
: "";
|
|
548
653
|
|
|
549
654
|
// Build a human-readable summary so the LLM clearly understands the
|
|
550
655
|
// user's decision instead of parsing raw JSON.
|
|
551
|
-
const stored = ctx.surfaceState.get(surfaceId);
|
|
552
656
|
const surfaceData = stored?.data as Record<string, unknown> | undefined;
|
|
553
657
|
const summary = buildCompletionSummary(
|
|
554
658
|
pending.surfaceType,
|
|
555
659
|
actionId,
|
|
556
|
-
|
|
660
|
+
mergedData,
|
|
557
661
|
surfaceData,
|
|
558
662
|
);
|
|
559
663
|
let fallbackContent = `[User action on ${pending.surfaceType} surface: ${summary}]`;
|
|
560
664
|
// Append structured data so the LLM has access to IDs/values it needs
|
|
561
665
|
// to act on (e.g. selectedIds for archiving).
|
|
562
|
-
if (
|
|
563
|
-
fallbackContent += `\n\nAction data: ${JSON.stringify(
|
|
666
|
+
if (mergedData && Object.keys(mergedData).length > 0) {
|
|
667
|
+
fallbackContent += `\n\nAction data: ${JSON.stringify(mergedData)}`;
|
|
564
668
|
}
|
|
565
669
|
// Append deselection context for table/list surfaces so the LLM knows what the user chose to keep.
|
|
566
|
-
const selectedIds =
|
|
670
|
+
const selectedIds = mergedData?.selectedIds as string[] | undefined;
|
|
567
671
|
if (
|
|
568
672
|
selectedIds &&
|
|
569
673
|
(pending.surfaceType === "table" || pending.surfaceType === "list")
|
|
@@ -574,25 +678,33 @@ export function handleSurfaceAction(
|
|
|
574
678
|
selectedIds,
|
|
575
679
|
);
|
|
576
680
|
}
|
|
577
|
-
|
|
681
|
+
// When a relay_prompt button also carries selection data (e.g. list/table
|
|
682
|
+
// surface with a canned prompt + user-selected rows), append the selection
|
|
683
|
+
// context so the LLM sees both the prompt and the user's selections.
|
|
684
|
+
let content = prompt || fallbackContent;
|
|
685
|
+
if (prompt && selectedIds && mergedData) {
|
|
686
|
+
if (pending.surfaceType === "table" || pending.surfaceType === "list") {
|
|
687
|
+
content += buildDeselectionDescription(
|
|
688
|
+
pending.surfaceType,
|
|
689
|
+
stored,
|
|
690
|
+
selectedIds,
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
578
694
|
// Show the user plain-text instead of raw JSON action data.
|
|
579
695
|
const displayContent = prompt
|
|
580
696
|
? undefined
|
|
581
|
-
: buildUserFacingLabel(
|
|
697
|
+
: buildUserFacingLabel(
|
|
698
|
+
pending.surfaceType,
|
|
699
|
+
actionId,
|
|
700
|
+
mergedData,
|
|
701
|
+
surfaceData,
|
|
702
|
+
);
|
|
582
703
|
|
|
583
704
|
const requestId = uuid();
|
|
584
705
|
ctx.surfaceActionRequestIds.add(requestId);
|
|
585
706
|
const onEvent = (msg: ServerMessage) => ctx.sendToClient(msg);
|
|
586
707
|
|
|
587
|
-
// Echo the user's prompt to the client so it appears in the chat UI
|
|
588
|
-
if (shouldRelayPrompt && prompt) {
|
|
589
|
-
ctx.sendToClient({
|
|
590
|
-
type: "user_message_echo",
|
|
591
|
-
text: prompt,
|
|
592
|
-
sessionId: ctx.conversationId,
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
|
|
596
708
|
ctx.traceEmitter.emit("request_received", "Surface action received", {
|
|
597
709
|
requestId,
|
|
598
710
|
status: "info",
|
|
@@ -610,6 +722,20 @@ export function handleSurfaceAction(
|
|
|
610
722
|
undefined,
|
|
611
723
|
displayContent,
|
|
612
724
|
);
|
|
725
|
+
if (result.rejected) {
|
|
726
|
+
ctx.surfaceActionRequestIds.delete(requestId);
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Echo the user's prompt to the client so it appears in the chat UI.
|
|
731
|
+
// Deferred until after rejection check to avoid ghost messages.
|
|
732
|
+
if (shouldRelayPrompt && prompt) {
|
|
733
|
+
ctx.sendToClient({
|
|
734
|
+
type: "user_message_echo",
|
|
735
|
+
text: prompt,
|
|
736
|
+
sessionId: ctx.conversationId,
|
|
737
|
+
});
|
|
738
|
+
}
|
|
613
739
|
if (result.queued) {
|
|
614
740
|
const position = ctx.getQueueDepth();
|
|
615
741
|
if (!retainPending) {
|
|
@@ -637,29 +763,6 @@ export function handleSurfaceAction(
|
|
|
637
763
|
return;
|
|
638
764
|
}
|
|
639
765
|
|
|
640
|
-
if (result.rejected) {
|
|
641
|
-
log.error({ surfaceId, actionId }, "Surface action rejected — queue full");
|
|
642
|
-
ctx.traceEmitter.emit(
|
|
643
|
-
"request_error",
|
|
644
|
-
"Surface action rejected — queue full",
|
|
645
|
-
{
|
|
646
|
-
requestId,
|
|
647
|
-
status: "error",
|
|
648
|
-
attributes: { reason: "queue_full", source: "surface_action" },
|
|
649
|
-
},
|
|
650
|
-
);
|
|
651
|
-
onEvent(
|
|
652
|
-
buildSessionErrorMessage(ctx.conversationId, {
|
|
653
|
-
code: "QUEUE_FULL",
|
|
654
|
-
userMessage:
|
|
655
|
-
"Message queue is full (max depth: 10). Please wait for current messages to be processed.",
|
|
656
|
-
retryable: true,
|
|
657
|
-
debugDetails: "Surface action rejected — session queue is full",
|
|
658
|
-
}),
|
|
659
|
-
);
|
|
660
|
-
return;
|
|
661
|
-
}
|
|
662
|
-
|
|
663
766
|
if (!retainPending) {
|
|
664
767
|
ctx.pendingSurfaceActions.delete(surfaceId);
|
|
665
768
|
}
|
|
@@ -828,7 +931,7 @@ export function buildUserFacingLabel(
|
|
|
828
931
|
|
|
829
932
|
/**
|
|
830
933
|
* Resolve a proxy tool call that targets a UI surface.
|
|
831
|
-
* Handles ui_show, ui_update, ui_dismiss,
|
|
934
|
+
* Handles ui_show, ui_update, ui_dismiss, computer_use_request_control, and app_open.
|
|
832
935
|
*/
|
|
833
936
|
export async function surfaceProxyResolver(
|
|
834
937
|
ctx: SurfaceSessionContext,
|
|
@@ -849,56 +952,6 @@ export async function surfaceProxyResolver(
|
|
|
849
952
|
}
|
|
850
953
|
}
|
|
851
954
|
|
|
852
|
-
if (toolName === "request_file") {
|
|
853
|
-
const surfaceId = uuid();
|
|
854
|
-
const prompt =
|
|
855
|
-
typeof input.prompt === "string" ? input.prompt : "Please share a file";
|
|
856
|
-
const acceptedTypes = Array.isArray(input.accepted_types)
|
|
857
|
-
? (input.accepted_types as string[])
|
|
858
|
-
: undefined;
|
|
859
|
-
const maxFiles = typeof input.max_files === "number" ? input.max_files : 1;
|
|
860
|
-
|
|
861
|
-
const data: FileUploadSurfaceData = {
|
|
862
|
-
prompt,
|
|
863
|
-
acceptedTypes,
|
|
864
|
-
maxFiles,
|
|
865
|
-
};
|
|
866
|
-
|
|
867
|
-
ctx.surfaceState.set(surfaceId, { surfaceType: "file_upload", data });
|
|
868
|
-
|
|
869
|
-
ctx.sendToClient({
|
|
870
|
-
type: "ui_surface_show",
|
|
871
|
-
sessionId: ctx.conversationId,
|
|
872
|
-
surfaceId,
|
|
873
|
-
surfaceType: "file_upload",
|
|
874
|
-
title: "File Request",
|
|
875
|
-
data,
|
|
876
|
-
} as UiSurfaceShow);
|
|
877
|
-
|
|
878
|
-
// Track surface for persistence
|
|
879
|
-
ctx.currentTurnSurfaces.push({
|
|
880
|
-
surfaceId,
|
|
881
|
-
surfaceType: "file_upload",
|
|
882
|
-
title: "File Request",
|
|
883
|
-
data,
|
|
884
|
-
});
|
|
885
|
-
|
|
886
|
-
// Non-blocking: return immediately, user action arrives as follow-up message
|
|
887
|
-
ctx.pendingSurfaceActions.set(surfaceId, {
|
|
888
|
-
surfaceType: "file_upload" as SurfaceType,
|
|
889
|
-
});
|
|
890
|
-
return {
|
|
891
|
-
content: JSON.stringify({
|
|
892
|
-
surfaceId,
|
|
893
|
-
status: "awaiting_user_action",
|
|
894
|
-
message:
|
|
895
|
-
"File upload dialog displayed and the user can see it. The uploaded file data will arrive as a follow-up message. Do not output any waiting message — just stop here.",
|
|
896
|
-
}),
|
|
897
|
-
isError: false,
|
|
898
|
-
yieldToUser: true,
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
|
-
|
|
902
955
|
if (toolName === "ui_show") {
|
|
903
956
|
const surfaceId = uuid();
|
|
904
957
|
const surfaceType = input.surface_type as SurfaceType;
|
|
@@ -912,7 +965,12 @@ export async function surfaceProxyResolver(
|
|
|
912
965
|
: rawData
|
|
913
966
|
) as SurfaceData;
|
|
914
967
|
const actions = input.actions as
|
|
915
|
-
| Array<{
|
|
968
|
+
| Array<{
|
|
969
|
+
id: string;
|
|
970
|
+
label: string;
|
|
971
|
+
style?: string;
|
|
972
|
+
data?: Record<string, unknown>;
|
|
973
|
+
}>
|
|
916
974
|
| undefined;
|
|
917
975
|
// Interactive surfaces default to awaiting user action.
|
|
918
976
|
const hasActions = Array.isArray(actions) && actions.length > 0;
|
|
@@ -942,9 +1000,6 @@ export async function surfaceProxyResolver(
|
|
|
942
1000
|
}
|
|
943
1001
|
}
|
|
944
1002
|
|
|
945
|
-
// Track surface state for ui_update merging
|
|
946
|
-
ctx.surfaceState.set(surfaceId, { surfaceType, data, title });
|
|
947
|
-
|
|
948
1003
|
const display = (input.display as string) === "panel" ? "panel" : "inline";
|
|
949
1004
|
|
|
950
1005
|
const mappedActions = actions?.map((a) => ({
|
|
@@ -954,8 +1009,31 @@ export async function surfaceProxyResolver(
|
|
|
954
1009
|
| "primary"
|
|
955
1010
|
| "secondary"
|
|
956
1011
|
| "destructive",
|
|
1012
|
+
...(a.data ? { data: a.data } : {}),
|
|
957
1013
|
}));
|
|
958
1014
|
|
|
1015
|
+
// Track surface state for ui_update merging (includes actions so we can
|
|
1016
|
+
// look up per-action data payloads when the client sends an action back).
|
|
1017
|
+
ctx.surfaceState.set(surfaceId, {
|
|
1018
|
+
surfaceType,
|
|
1019
|
+
data,
|
|
1020
|
+
title,
|
|
1021
|
+
actions: mappedActions,
|
|
1022
|
+
});
|
|
1023
|
+
|
|
1024
|
+
log.info(
|
|
1025
|
+
{
|
|
1026
|
+
surfaceId,
|
|
1027
|
+
surfaceType,
|
|
1028
|
+
title,
|
|
1029
|
+
dataKeys: Object.keys(data),
|
|
1030
|
+
actionCount: mappedActions?.length ?? 0,
|
|
1031
|
+
display,
|
|
1032
|
+
conversationId: ctx.conversationId,
|
|
1033
|
+
},
|
|
1034
|
+
"Sending ui_surface_show to client",
|
|
1035
|
+
);
|
|
1036
|
+
|
|
959
1037
|
ctx.sendToClient({
|
|
960
1038
|
type: "ui_surface_show",
|
|
961
1039
|
sessionId: ctx.conversationId,
|
|
@@ -1106,14 +1184,10 @@ export async function surfaceProxyResolver(
|
|
|
1106
1184
|
const openMode = input.open_mode as string | undefined;
|
|
1107
1185
|
const app = getApp(appId);
|
|
1108
1186
|
if (!app) return { content: `App not found: ${appId}`, isError: true };
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
: // Generate a minimal fallback preview from app metadata so that the
|
|
1114
|
-
// surface is always rendered as a clickable preview card (not an
|
|
1115
|
-
// un-clickable fallback chip) after session restart.
|
|
1116
|
-
{ title: app.name, subtitle: app.description };
|
|
1187
|
+
// Generate a minimal fallback preview from app metadata so that the
|
|
1188
|
+
// surface is always rendered as a clickable preview card (not an
|
|
1189
|
+
// un-clickable fallback chip) after session restart.
|
|
1190
|
+
const defaultPreview = { title: app.name, subtitle: app.description };
|
|
1117
1191
|
|
|
1118
1192
|
const storedPreview = getAppPreview(app.id);
|
|
1119
1193
|
const surfaceData: DynamicPageSurfaceData = {
|
|
@@ -27,10 +27,14 @@ import { coreAppProxyTools } from "../tools/apps/definitions.js";
|
|
|
27
27
|
import { registerSessionSender } from "../tools/browser/browser-screencast.js";
|
|
28
28
|
import { requestComputerControlTool } from "../tools/computer-use/request-computer-control.js";
|
|
29
29
|
import type { ToolExecutor } from "../tools/executor.js";
|
|
30
|
-
import {
|
|
30
|
+
import {
|
|
31
|
+
getAllToolDefinitions,
|
|
32
|
+
getMcpToolDefinitions,
|
|
33
|
+
} from "../tools/registry.js";
|
|
31
34
|
import type {
|
|
32
35
|
ProxyApprovalCallback,
|
|
33
36
|
ProxyApprovalRequest,
|
|
37
|
+
ToolContext,
|
|
34
38
|
ToolExecutionResult,
|
|
35
39
|
ToolLifecycleEventHandler,
|
|
36
40
|
} from "../tools/types.js";
|
|
@@ -87,7 +91,7 @@ export interface ToolSetupContext extends SurfaceSessionContext {
|
|
|
87
91
|
allowedToolNames?: Set<string>;
|
|
88
92
|
/** Session memory policy — used to propagate scopeId and strictSideEffects into ToolContext. */
|
|
89
93
|
memoryPolicy: { scopeId: string; strictSideEffects: boolean };
|
|
90
|
-
/** True when the session has no connected
|
|
94
|
+
/** True when the session has no connected client (HTTP-only path). */
|
|
91
95
|
hasNoClient?: boolean;
|
|
92
96
|
/** When true, the session is executing a task run and must not become interactive. */
|
|
93
97
|
headlessLock?: boolean;
|
|
@@ -97,6 +101,10 @@ export interface ToolSetupContext extends SurfaceSessionContext {
|
|
|
97
101
|
trustContext?: TrustContext;
|
|
98
102
|
/** Voice/call session ID, if the session originates from a call. Propagated into ToolContext for scoped grant consumption. */
|
|
99
103
|
callSessionId?: string;
|
|
104
|
+
/** Optional proxy for delegating host_bash execution to a connected client. */
|
|
105
|
+
hostBashProxy?: import("./host-bash-proxy.js").HostBashProxy;
|
|
106
|
+
/** Optional proxy for delegating host_file_read/write/edit execution to a connected client. */
|
|
107
|
+
hostFileProxy?: import("./host-file-proxy.js").HostFileProxy;
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
// ── buildToolDefinitions ─────────────────────────────────────────────
|
|
@@ -150,7 +158,9 @@ export function createToolExecutor(
|
|
|
150
158
|
markDoordashStepInProgress(ctx, input);
|
|
151
159
|
}
|
|
152
160
|
|
|
153
|
-
|
|
161
|
+
// Build the context object shared by both the skill_execute interception
|
|
162
|
+
// path and the regular executor path.
|
|
163
|
+
const toolContext: ToolContext = {
|
|
154
164
|
workingDir: ctx.workingDir,
|
|
155
165
|
sessionId: ctx.conversationId,
|
|
156
166
|
conversationId: ctx.conversationId,
|
|
@@ -175,6 +185,8 @@ export function createToolExecutor(
|
|
|
175
185
|
memoryScopeId: ctx.memoryPolicy.scopeId,
|
|
176
186
|
forcePromptSideEffects: ctx.memoryPolicy.strictSideEffects,
|
|
177
187
|
toolUseId,
|
|
188
|
+
hostBashProxy: ctx.hostBashProxy,
|
|
189
|
+
hostFileProxy: ctx.hostFileProxy,
|
|
178
190
|
onToolLifecycleEvent: handleToolLifecycleEvent,
|
|
179
191
|
sendToClient: (msg) => {
|
|
180
192
|
// Tool context's sendToClient uses a loose { type: string; [key: string]: unknown }
|
|
@@ -315,7 +327,38 @@ export function createToolExecutor(
|
|
|
315
327
|
: ("deny" as const),
|
|
316
328
|
};
|
|
317
329
|
},
|
|
318
|
-
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// Intercept skill_execute: extract the real tool name and input, then
|
|
333
|
+
// route through the full executor pipeline so the underlying tool's
|
|
334
|
+
// risk level, permission checks, hooks, and lifecycle events all fire
|
|
335
|
+
// with the real tool name.
|
|
336
|
+
if (name === "skill_execute") {
|
|
337
|
+
const toolName = typeof input.tool === "string" ? input.tool : "";
|
|
338
|
+
const toolInput =
|
|
339
|
+
input.input != null && typeof input.input === "object"
|
|
340
|
+
? (input.input as Record<string, unknown>)
|
|
341
|
+
: {};
|
|
342
|
+
|
|
343
|
+
if (!toolName) {
|
|
344
|
+
return {
|
|
345
|
+
content:
|
|
346
|
+
'Error: skill_execute requires a "tool" parameter with the tool name',
|
|
347
|
+
isError: true,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const result = await executor.execute(toolName, toolInput, toolContext);
|
|
352
|
+
|
|
353
|
+
runPostExecutionSideEffects(toolName, toolInput, result, {
|
|
354
|
+
ctx,
|
|
355
|
+
broadcastToAllClients,
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const result = await executor.execute(name, input, toolContext);
|
|
319
362
|
|
|
320
363
|
runPostExecutionSideEffects(name, input, result, {
|
|
321
364
|
ctx,
|
|
@@ -486,6 +529,63 @@ export interface SkillProjectionContext {
|
|
|
486
529
|
allowedToolNames?: Set<string>;
|
|
487
530
|
/** When > 0, the resolveTools callback returns no tools at all. */
|
|
488
531
|
toolsDisabledDepth: number;
|
|
532
|
+
/** Channel capabilities — read lazily per turn for conditional tool filtering. */
|
|
533
|
+
readonly channelCapabilities?: {
|
|
534
|
+
channel: string;
|
|
535
|
+
supportsDynamicUi: boolean;
|
|
536
|
+
};
|
|
537
|
+
/** True when no client is connected (HTTP-only). */
|
|
538
|
+
readonly hasNoClient?: boolean;
|
|
539
|
+
/** True when the conversation has user-uploaded attachments. */
|
|
540
|
+
hasAttachments?: boolean;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// ── Conditional tool sets ────────────────────────────────────────────
|
|
544
|
+
|
|
545
|
+
const UI_SURFACE_TOOL_NAMES = new Set(["ui_show", "ui_update", "ui_dismiss"]);
|
|
546
|
+
const HOST_TOOL_NAMES = new Set([
|
|
547
|
+
"host_file_read",
|
|
548
|
+
"host_file_write",
|
|
549
|
+
"host_file_edit",
|
|
550
|
+
"host_bash",
|
|
551
|
+
]);
|
|
552
|
+
const ASSET_TOOL_NAMES = new Set(["asset_search", "asset_materialize"]);
|
|
553
|
+
const CLIENT_CAPABILITY_TOOL_NAMES = new Set([
|
|
554
|
+
"app_open",
|
|
555
|
+
"computer_use_request_control",
|
|
556
|
+
]);
|
|
557
|
+
const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Determine whether a tool should be included in the LLM tool definitions
|
|
561
|
+
* for the current turn based on session context. Tools not active for the
|
|
562
|
+
* current context are omitted from the definitions sent to the provider,
|
|
563
|
+
* reducing noise and preventing the model from attempting calls that would
|
|
564
|
+
* fail.
|
|
565
|
+
*/
|
|
566
|
+
export function isToolActiveForContext(
|
|
567
|
+
name: string,
|
|
568
|
+
ctx: SkillProjectionContext,
|
|
569
|
+
): boolean {
|
|
570
|
+
if (UI_SURFACE_TOOL_NAMES.has(name)) {
|
|
571
|
+
return ctx.channelCapabilities?.supportsDynamicUi ?? !ctx.hasNoClient;
|
|
572
|
+
}
|
|
573
|
+
if (HOST_TOOL_NAMES.has(name)) {
|
|
574
|
+
// Host tools require a connected client — without one, there is no human
|
|
575
|
+
// to approve execution and the guardian auto-approve path would allow
|
|
576
|
+
// unchecked host command execution on the daemon host.
|
|
577
|
+
return !ctx.hasNoClient;
|
|
578
|
+
}
|
|
579
|
+
if (ASSET_TOOL_NAMES.has(name)) {
|
|
580
|
+
return ctx.hasAttachments ?? false;
|
|
581
|
+
}
|
|
582
|
+
if (CLIENT_CAPABILITY_TOOL_NAMES.has(name)) {
|
|
583
|
+
return !ctx.hasNoClient;
|
|
584
|
+
}
|
|
585
|
+
if (PLATFORM_TOOL_NAMES.has(name)) {
|
|
586
|
+
return process.platform === "darwin" && !ctx.hasNoClient;
|
|
587
|
+
}
|
|
588
|
+
return true;
|
|
489
589
|
}
|
|
490
590
|
|
|
491
591
|
/**
|
|
@@ -493,6 +593,12 @@ export interface SkillProjectionContext {
|
|
|
493
593
|
* dynamically projected skill tools on each agent turn. Also updates
|
|
494
594
|
* allowedToolNames so newly-activated skill tools aren't blocked by
|
|
495
595
|
* the executor's stale gate.
|
|
596
|
+
*
|
|
597
|
+
* Core (non-MCP) tool definitions are captured at session creation and
|
|
598
|
+
* reused on each turn. MCP tool definitions are re-read from the global
|
|
599
|
+
* registry on each turn so that tools registered after session creation
|
|
600
|
+
* (e.g. via `vellum mcp reload`) are automatically picked up without
|
|
601
|
+
* requiring session disposal or app restart.
|
|
496
602
|
*/
|
|
497
603
|
export function createResolveToolsCallback(
|
|
498
604
|
toolDefs: ToolDefinition[],
|
|
@@ -500,6 +606,20 @@ export function createResolveToolsCallback(
|
|
|
500
606
|
): ((history: Message[]) => ToolDefinition[]) | undefined {
|
|
501
607
|
if (toolDefs.length === 0) return undefined;
|
|
502
608
|
|
|
609
|
+
// Separate the initial tool defs into core (stable) and MCP (dynamic).
|
|
610
|
+
// We keep core tools from the snapshot and re-read MCP tools each turn.
|
|
611
|
+
const initialMcpDefs = getMcpToolDefinitions();
|
|
612
|
+
const initialMcpNames = new Set(initialMcpDefs.map((d) => d.name));
|
|
613
|
+
const coreToolDefs = toolDefs.filter((d) => !initialMcpNames.has(d.name));
|
|
614
|
+
log.debug(
|
|
615
|
+
{
|
|
616
|
+
coreCount: coreToolDefs.length,
|
|
617
|
+
mcpCount: initialMcpDefs.length,
|
|
618
|
+
mcpTools: initialMcpDefs.map((d) => d.name),
|
|
619
|
+
},
|
|
620
|
+
"Session tool resolver initialized",
|
|
621
|
+
);
|
|
622
|
+
|
|
503
623
|
return (history: Message[]) => {
|
|
504
624
|
// When tools are explicitly disabled (e.g. during pointer generation),
|
|
505
625
|
// return an empty tool list so the LLM never sees tool definitions and
|
|
@@ -509,6 +629,26 @@ export function createResolveToolsCallback(
|
|
|
509
629
|
return [];
|
|
510
630
|
}
|
|
511
631
|
|
|
632
|
+
// Filter core tools based on current session context so that tools
|
|
633
|
+
// irrelevant to this turn (e.g. UI tools when no client is connected)
|
|
634
|
+
// are omitted from the definitions sent to the provider.
|
|
635
|
+
const filteredCoreDefs = coreToolDefs.filter((d) =>
|
|
636
|
+
isToolActiveForContext(d.name, ctx),
|
|
637
|
+
);
|
|
638
|
+
|
|
639
|
+
// Re-read MCP tool definitions from the registry each turn so sessions
|
|
640
|
+
// automatically pick up tools added/removed by `vellum mcp reload`.
|
|
641
|
+
const currentMcpDefs = getMcpToolDefinitions();
|
|
642
|
+
log.debug(
|
|
643
|
+
{
|
|
644
|
+
coreCount: filteredCoreDefs.length,
|
|
645
|
+
mcpCount: currentMcpDefs.length,
|
|
646
|
+
mcpTools: currentMcpDefs.map((d) => d.name),
|
|
647
|
+
},
|
|
648
|
+
"MCP tools resolved for turn",
|
|
649
|
+
);
|
|
650
|
+
const allBaseDefs = [...filteredCoreDefs, ...currentMcpDefs];
|
|
651
|
+
|
|
512
652
|
const effectivePreactivated = [
|
|
513
653
|
...DEFAULT_PREACTIVATED_SKILL_IDS,
|
|
514
654
|
...(ctx.preactivatedSkillIds ?? []),
|
|
@@ -518,11 +658,11 @@ export function createResolveToolsCallback(
|
|
|
518
658
|
previouslyActiveSkillIds: ctx.skillProjectionState,
|
|
519
659
|
cache: ctx.skillProjectionCache,
|
|
520
660
|
});
|
|
521
|
-
const turnAllowed = new Set(
|
|
661
|
+
const turnAllowed = new Set(allBaseDefs.map((d) => d.name));
|
|
522
662
|
for (const name of projection.allowedToolNames) {
|
|
523
663
|
turnAllowed.add(name);
|
|
524
664
|
}
|
|
525
665
|
ctx.allowedToolNames = turnAllowed;
|
|
526
|
-
return
|
|
666
|
+
return allBaseDefs;
|
|
527
667
|
};
|
|
528
668
|
}
|