@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
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
import { NetworkRecorder } from "../tools/browser/network-recorder.js";
|
|
10
10
|
import type { SessionRecording } from "../tools/browser/network-recording-types.js";
|
|
11
11
|
import { saveRecording } from "../tools/browser/recording-store.js";
|
|
12
|
-
import { navigateXPages } from "../tools/browser/x-auto-navigate.js";
|
|
13
12
|
import type { WatchSession } from "../tools/watch/watch-state.js";
|
|
14
13
|
import {
|
|
15
14
|
fireWatchCompletionNotifier,
|
|
@@ -35,13 +34,7 @@ const activeCdpSessions = new Map<string, CdpSession>();
|
|
|
35
34
|
const activeProgressIntervals = new Map<string, NodeJS.Timeout>();
|
|
36
35
|
|
|
37
36
|
/** Return domain-specific URL patterns that indicate a successful login. */
|
|
38
|
-
function getLoginSignals(
|
|
39
|
-
if (targetDomain === "x.com" || targetDomain === "twitter.com") {
|
|
40
|
-
return [
|
|
41
|
-
"/i/api/graphql/", // any authenticated GraphQL call
|
|
42
|
-
"/1.1/account/settings", // legacy API session check
|
|
43
|
-
];
|
|
44
|
-
}
|
|
37
|
+
function getLoginSignals(_targetDomain?: string): string[] {
|
|
45
38
|
// DoorDash and general fallback
|
|
46
39
|
return [
|
|
47
40
|
"/graphql/postLoginQuery",
|
|
@@ -324,40 +317,7 @@ export async function handleRideShotgunStart(
|
|
|
324
317
|
}, 5000);
|
|
325
318
|
activeProgressIntervals.set(watchId, progressInterval);
|
|
326
319
|
|
|
327
|
-
|
|
328
|
-
// Skip login detection — auto-navigation will complete the session when done.
|
|
329
|
-
if (
|
|
330
|
-
(targetDomain === "x.com" || targetDomain === "twitter.com") &&
|
|
331
|
-
msg.autoNavigate !== false
|
|
332
|
-
) {
|
|
333
|
-
// Don't set onLoginDetected — it would kill the session after the first
|
|
334
|
-
// GraphQL call (5s grace), before auto-navigation finishes.
|
|
335
|
-
const abortSignal = { aborted: false };
|
|
336
|
-
const checkInterval = setInterval(() => {
|
|
337
|
-
if (session.status !== "active") {
|
|
338
|
-
abortSignal.aborted = true;
|
|
339
|
-
clearInterval(checkInterval);
|
|
340
|
-
}
|
|
341
|
-
}, 1000);
|
|
342
|
-
navigateXPages({ abortSignal, cdpBaseUrl })
|
|
343
|
-
.then((completed) => {
|
|
344
|
-
clearInterval(checkInterval);
|
|
345
|
-
log.info(
|
|
346
|
-
{ watchId, completedSteps: completed.length },
|
|
347
|
-
"X auto-navigation finished",
|
|
348
|
-
);
|
|
349
|
-
if (session.status === "active") {
|
|
350
|
-
completeSession(session);
|
|
351
|
-
}
|
|
352
|
-
})
|
|
353
|
-
.catch((err) => {
|
|
354
|
-
clearInterval(checkInterval);
|
|
355
|
-
log.warn({ err, watchId }, "X auto-navigation failed");
|
|
356
|
-
if (session.status === "active") {
|
|
357
|
-
completeSession(session);
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
} else if (msg.autoNavigate && targetDomain) {
|
|
320
|
+
if (msg.autoNavigate && targetDomain) {
|
|
361
321
|
const navDomain = msg.navigateDomain ?? targetDomain;
|
|
362
322
|
const abortSignal = { aborted: false };
|
|
363
323
|
const checkInterval = setInterval(() => {
|
|
@@ -538,13 +498,45 @@ async function finalizeLearnRecording(
|
|
|
538
498
|
const networkEntries = recorder ? await recorder.stop() : [];
|
|
539
499
|
activeRecorders.delete(watchId);
|
|
540
500
|
|
|
501
|
+
// Save cookies to the encrypted credential store (keyed by target domain)
|
|
502
|
+
// so they don't need to be persisted in the plaintext recording file.
|
|
503
|
+
if (session.targetDomain && cookies.length > 0) {
|
|
504
|
+
const { setSecureKeyAsync } = await import("../security/secure-keys.js");
|
|
505
|
+
const { upsertCredentialMetadata } =
|
|
506
|
+
await import("../tools/credentials/metadata-store.js");
|
|
507
|
+
|
|
508
|
+
const service = session.targetDomain;
|
|
509
|
+
const field = "session:cookies";
|
|
510
|
+
const storageKey = `credential:${service}:${field}`;
|
|
511
|
+
const stored = await setSecureKeyAsync(
|
|
512
|
+
storageKey,
|
|
513
|
+
JSON.stringify(cookies),
|
|
514
|
+
);
|
|
515
|
+
if (stored) {
|
|
516
|
+
try {
|
|
517
|
+
upsertCredentialMetadata(service, field, {});
|
|
518
|
+
} catch {
|
|
519
|
+
// Non-critical: metadata upsert is best-effort
|
|
520
|
+
}
|
|
521
|
+
log.info(
|
|
522
|
+
{ targetDomain: service, cookieCount: cookies.length },
|
|
523
|
+
"Cookies saved to credential store",
|
|
524
|
+
);
|
|
525
|
+
} else {
|
|
526
|
+
log.warn(
|
|
527
|
+
{ targetDomain: service },
|
|
528
|
+
"Failed to save cookies to credential store",
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
541
533
|
const recording: SessionRecording = {
|
|
542
534
|
id: recordingId,
|
|
543
535
|
startedAt: session.startedAt,
|
|
544
536
|
endedAt: Date.now(),
|
|
545
537
|
targetDomain: session.targetDomain,
|
|
546
538
|
networkEntries,
|
|
547
|
-
cookies,
|
|
539
|
+
cookies: [], // Cookies saved to credential store — never persisted in recording
|
|
548
540
|
observations: session.observations.map((obs) => ({
|
|
549
541
|
ocrText: obs.ocrText,
|
|
550
542
|
appName: obs.appName,
|
package/src/daemon/seed-files.ts
CHANGED
|
@@ -2,16 +2,15 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
|
|
5
|
-
import { loadPrebuiltHtml } from "../home-base/prebuilt/seed.js";
|
|
6
5
|
import { getLogger } from "../util/logger.js";
|
|
7
6
|
import { getInterfacesDir } from "../util/platform.js";
|
|
8
7
|
|
|
9
8
|
const log = getLogger("seed-files");
|
|
10
9
|
|
|
11
10
|
/**
|
|
12
|
-
* Seeds interface files (TUI main-window
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Seeds interface files (TUI main-window) from their source packages when they
|
|
12
|
+
* don't already exist on disk. Called during daemon startup so the runtime can
|
|
13
|
+
* serve these files immediately.
|
|
15
14
|
*/
|
|
16
15
|
export function seedInterfaceFiles(): void {
|
|
17
16
|
// Seed the TUI main-window interface from the CLI package's DefaultMainScreen
|
|
@@ -35,27 +34,4 @@ export function seedInterfaceFiles(): void {
|
|
|
35
34
|
log.warn({ err }, "Could not seed tui/main-window.tsx from CLI package");
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
|
-
|
|
39
|
-
// Seed the vellum-desktop interface from the prebuilt Home Base HTML if it
|
|
40
|
-
// doesn't already exist. This ensures the Home tab renders immediately
|
|
41
|
-
// on first launch for both local and remote hatches.
|
|
42
|
-
const desktopIndexPath = join(
|
|
43
|
-
getInterfacesDir(),
|
|
44
|
-
"vellum-desktop",
|
|
45
|
-
"index.html",
|
|
46
|
-
);
|
|
47
|
-
if (!existsSync(desktopIndexPath)) {
|
|
48
|
-
const prebuiltHtml = loadPrebuiltHtml();
|
|
49
|
-
if (prebuiltHtml) {
|
|
50
|
-
mkdirSync(join(getInterfacesDir(), "vellum-desktop"), {
|
|
51
|
-
recursive: true,
|
|
52
|
-
});
|
|
53
|
-
writeFileSync(desktopIndexPath, prebuiltHtml);
|
|
54
|
-
log.info("Seeded vellum-desktop/index.html from prebuilt Home Base");
|
|
55
|
-
} else {
|
|
56
|
-
log.warn(
|
|
57
|
-
"Could not seed vellum-desktop/index.html — prebuilt HTML not found (missing embedded index.html in home-base/prebuilt/)",
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
37
|
}
|
package/src/daemon/server.ts
CHANGED
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
import { getConfig } from "../config/loader.js";
|
|
15
15
|
import { onContactChange } from "../contacts/contact-events.js";
|
|
16
16
|
import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
17
|
-
import { bootstrapHomeBaseAppLink } from "../home-base/bootstrap.js";
|
|
18
17
|
import * as attachmentsStore from "../memory/attachments-store.js";
|
|
19
18
|
import {
|
|
20
19
|
createCanonicalGuardianRequest,
|
|
@@ -57,6 +56,8 @@ import type {
|
|
|
57
56
|
SessionCreateOptions,
|
|
58
57
|
} from "./handlers/shared.js";
|
|
59
58
|
import type { SkillOperationContext } from "./handlers/skills.js";
|
|
59
|
+
import { HostBashProxy } from "./host-bash-proxy.js";
|
|
60
|
+
import { HostFileProxy } from "./host-file-proxy.js";
|
|
60
61
|
import type { ServerMessage } from "./message-protocol.js";
|
|
61
62
|
import {
|
|
62
63
|
DEFAULT_MEMORY_POLICY,
|
|
@@ -131,8 +132,9 @@ function resolveCanonicalRequestSourceType(
|
|
|
131
132
|
|
|
132
133
|
/**
|
|
133
134
|
* Build an onEvent callback that registers pending interactions when the agent
|
|
134
|
-
* loop emits confirmation_request
|
|
135
|
-
*
|
|
135
|
+
* loop emits confirmation_request, secret_request, host_bash_request, or
|
|
136
|
+
* host_file_request events. This ensures that channel approval interception
|
|
137
|
+
* can look up the session by requestId.
|
|
136
138
|
*/
|
|
137
139
|
function makePendingInteractionRegistrar(
|
|
138
140
|
session: Session,
|
|
@@ -200,6 +202,18 @@ function makePendingInteractionRegistrar(
|
|
|
200
202
|
conversationId,
|
|
201
203
|
kind: "secret",
|
|
202
204
|
});
|
|
205
|
+
} else if (msg.type === "host_bash_request") {
|
|
206
|
+
pendingInteractions.register(msg.requestId, {
|
|
207
|
+
session,
|
|
208
|
+
conversationId,
|
|
209
|
+
kind: "host_bash",
|
|
210
|
+
});
|
|
211
|
+
} else if (msg.type === "host_file_request") {
|
|
212
|
+
pendingInteractions.register(msg.requestId, {
|
|
213
|
+
session,
|
|
214
|
+
conversationId,
|
|
215
|
+
kind: "host_file",
|
|
216
|
+
});
|
|
203
217
|
}
|
|
204
218
|
};
|
|
205
219
|
}
|
|
@@ -292,14 +306,7 @@ export class DaemonServer {
|
|
|
292
306
|
undefined,
|
|
293
307
|
metadata,
|
|
294
308
|
);
|
|
295
|
-
if (enqueueResult.rejected) {
|
|
296
|
-
log.warn(
|
|
297
|
-
{ parentSessionId },
|
|
298
|
-
"Parent session queue full, dropping subagent notification",
|
|
299
|
-
);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
if (!enqueueResult.queued) {
|
|
309
|
+
if (!enqueueResult.queued && !enqueueResult.rejected) {
|
|
303
310
|
const messageId = await parentSession.persistUserMessage(
|
|
304
311
|
message,
|
|
305
312
|
[],
|
|
@@ -325,10 +332,7 @@ export class DaemonServer {
|
|
|
325
332
|
* Publications are serialized via a promise chain so subscribers
|
|
326
333
|
* always observe events in send order.
|
|
327
334
|
*/
|
|
328
|
-
private publishAssistantEvent(
|
|
329
|
-
msg: ServerMessage,
|
|
330
|
-
sessionId?: string,
|
|
331
|
-
): void {
|
|
335
|
+
private publishAssistantEvent(msg: ServerMessage, sessionId?: string): void {
|
|
332
336
|
const id = this.assistantId ?? "default";
|
|
333
337
|
const event = buildAssistantEvent(id, msg, sessionId);
|
|
334
338
|
this._hubChain = this._hubChain
|
|
@@ -373,15 +377,6 @@ export class DaemonServer {
|
|
|
373
377
|
initializeProviders(config);
|
|
374
378
|
this.configWatcher.initFingerprint(config);
|
|
375
379
|
|
|
376
|
-
try {
|
|
377
|
-
bootstrapHomeBaseAppLink();
|
|
378
|
-
} catch (err) {
|
|
379
|
-
log.warn(
|
|
380
|
-
{ err },
|
|
381
|
-
"Failed to bootstrap Home Base app link at daemon startup",
|
|
382
|
-
);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
380
|
this.evictor.start();
|
|
386
381
|
|
|
387
382
|
registerDaemonCallbacks({
|
|
@@ -629,10 +624,7 @@ export class DaemonServer {
|
|
|
629
624
|
);
|
|
630
625
|
}
|
|
631
626
|
|
|
632
|
-
const session = await this.getOrCreateSession(
|
|
633
|
-
conversationId,
|
|
634
|
-
options,
|
|
635
|
-
);
|
|
627
|
+
const session = await this.getOrCreateSession(conversationId, options);
|
|
636
628
|
|
|
637
629
|
if (session.isProcessing()) {
|
|
638
630
|
throw new Error("Session is already processing a message");
|
|
@@ -652,6 +644,31 @@ export class DaemonServer {
|
|
|
652
644
|
session.setChannelCapabilities(
|
|
653
645
|
resolveChannelCapabilities(sourceChannel, sourceInterface),
|
|
654
646
|
);
|
|
647
|
+
// Only create the host bash proxy for desktop client interfaces that can
|
|
648
|
+
// execute commands on the user's machine. Non-desktop sessions (CLI,
|
|
649
|
+
// channels, headless) fall back to local execution.
|
|
650
|
+
// Guard: don't replace an active proxy during concurrent turn races —
|
|
651
|
+
// another request may have started processing between the isProcessing()
|
|
652
|
+
// check above and the await on ensureActorScopedHistory().
|
|
653
|
+
if (resolvedInterface === "macos" || resolvedInterface === "ios") {
|
|
654
|
+
if (!session.isProcessing() || !session.hostBashProxy) {
|
|
655
|
+
session.setHostBashProxy(
|
|
656
|
+
new HostBashProxy(session.getCurrentSender(), (requestId) => {
|
|
657
|
+
pendingInteractions.resolve(requestId);
|
|
658
|
+
}),
|
|
659
|
+
);
|
|
660
|
+
}
|
|
661
|
+
if (!session.isProcessing() || !session.hostFileProxy) {
|
|
662
|
+
session.setHostFileProxy(
|
|
663
|
+
new HostFileProxy(session.getCurrentSender(), (requestId) => {
|
|
664
|
+
pendingInteractions.resolve(requestId);
|
|
665
|
+
}),
|
|
666
|
+
);
|
|
667
|
+
}
|
|
668
|
+
} else if (!session.isProcessing()) {
|
|
669
|
+
session.setHostBashProxy(undefined);
|
|
670
|
+
session.setHostFileProxy(undefined);
|
|
671
|
+
}
|
|
655
672
|
session.setCommandIntent(options?.commandIntent ?? null);
|
|
656
673
|
session.setTurnChannelContext({
|
|
657
674
|
userMessageChannel: resolvedChannel,
|
|
@@ -164,22 +164,22 @@ export function emitLlmCallStartedIfNeeded(
|
|
|
164
164
|
);
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
// ──
|
|
167
|
+
// ── Client Payload Size Caps ─────────────────────────────────────────
|
|
168
168
|
// The client truncates tool results anyway (2 000 chars in ChatViewModel),
|
|
169
169
|
// but the full string can be megabytes (file_read, bash output). Capping
|
|
170
|
-
// here avoids sending oversized payloads
|
|
171
|
-
//
|
|
170
|
+
// here avoids sending oversized payloads which get decoded on the
|
|
171
|
+
// client's main thread.
|
|
172
172
|
|
|
173
173
|
const TOOL_RESULT_MAX_CHARS = 2_000;
|
|
174
174
|
const TOOL_RESULT_TRUNCATION_SUFFIX = "...[truncated]";
|
|
175
175
|
|
|
176
176
|
// tool_input_delta streams accumulated JSON as tools run. For non-app
|
|
177
177
|
// tools the client discards it (extractCodePreview only handles app tools),
|
|
178
|
-
// so we cap it aggressively to avoid excessive
|
|
178
|
+
// so we cap it aggressively to avoid excessive client traffic.
|
|
179
179
|
const TOOL_INPUT_DELTA_MAX_CHARS = 50_000;
|
|
180
180
|
const APP_TOOL_NAMES = new Set(["app_create", "app_update"]);
|
|
181
181
|
|
|
182
|
-
function
|
|
182
|
+
function truncateForClient(
|
|
183
183
|
value: string,
|
|
184
184
|
maxChars: number,
|
|
185
185
|
suffix: string,
|
|
@@ -206,6 +206,7 @@ const TOOL_FRIENDLY_NAMES: Record<string, string> = {
|
|
|
206
206
|
app_create: "app",
|
|
207
207
|
app_update: "app",
|
|
208
208
|
skill_load: "skill",
|
|
209
|
+
skill_execute: "skill",
|
|
209
210
|
app_file_edit: "app file",
|
|
210
211
|
app_file_write: "app file",
|
|
211
212
|
};
|
|
@@ -304,6 +305,27 @@ export function handleToolUse(
|
|
|
304
305
|
});
|
|
305
306
|
}
|
|
306
307
|
|
|
308
|
+
export function handleToolUsePreviewStart(
|
|
309
|
+
_state: EventHandlerState,
|
|
310
|
+
deps: EventHandlerDeps,
|
|
311
|
+
event: Extract<AgentEvent, { type: "tool_use_preview_start" }>,
|
|
312
|
+
): void {
|
|
313
|
+
deps.onEvent({
|
|
314
|
+
type: "tool_use_preview_start",
|
|
315
|
+
toolUseId: event.toolUseId,
|
|
316
|
+
toolName: event.toolName,
|
|
317
|
+
sessionId: deps.ctx.conversationId,
|
|
318
|
+
});
|
|
319
|
+
const statusText = `Preparing ${friendlyToolName(event.toolName)}...`;
|
|
320
|
+
deps.ctx.emitActivityState(
|
|
321
|
+
"tool_running",
|
|
322
|
+
"preview_start",
|
|
323
|
+
"assistant_turn",
|
|
324
|
+
deps.reqId,
|
|
325
|
+
statusText,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
307
329
|
export function handleToolOutputChunk(
|
|
308
330
|
_state: EventHandlerState,
|
|
309
331
|
deps: EventHandlerDeps,
|
|
@@ -386,7 +408,7 @@ export function handleInputJsonDelta(
|
|
|
386
408
|
// app_create/app_update code previews; all other tools discard it.
|
|
387
409
|
const content = APP_TOOL_NAMES.has(event.toolName)
|
|
388
410
|
? event.accumulatedJson
|
|
389
|
-
:
|
|
411
|
+
: truncateForClient(
|
|
390
412
|
event.accumulatedJson,
|
|
391
413
|
TOOL_INPUT_DELTA_MAX_CHARS,
|
|
392
414
|
TOOL_RESULT_TRUNCATION_SUFFIX,
|
|
@@ -396,6 +418,7 @@ export function handleInputJsonDelta(
|
|
|
396
418
|
toolName: event.toolName,
|
|
397
419
|
content,
|
|
398
420
|
sessionId: deps.ctx.conversationId,
|
|
421
|
+
toolUseId: event.toolUseId,
|
|
399
422
|
});
|
|
400
423
|
}
|
|
401
424
|
|
|
@@ -410,7 +433,7 @@ export function handleToolResult(
|
|
|
410
433
|
deps.onEvent({
|
|
411
434
|
type: "tool_result",
|
|
412
435
|
toolName: "",
|
|
413
|
-
result:
|
|
436
|
+
result: truncateForClient(
|
|
414
437
|
event.content,
|
|
415
438
|
TOOL_RESULT_MAX_CHARS,
|
|
416
439
|
TOOL_RESULT_TRUNCATION_SUFFIX,
|
|
@@ -420,6 +443,7 @@ export function handleToolResult(
|
|
|
420
443
|
status: event.status,
|
|
421
444
|
sessionId: deps.ctx.conversationId,
|
|
422
445
|
imageData: imageBlock?.source.data,
|
|
446
|
+
toolUseId: event.toolUseId,
|
|
423
447
|
});
|
|
424
448
|
state.pendingToolResults.set(event.toolUseId, {
|
|
425
449
|
content: event.content,
|
|
@@ -481,7 +505,7 @@ export function handleToolResult(
|
|
|
481
505
|
return ts && ts.completedAt != null;
|
|
482
506
|
});
|
|
483
507
|
if (allToolsDone && state.currentTurnToolUseIds.length > 0) {
|
|
484
|
-
annotatePersistedAssistantMessage(state);
|
|
508
|
+
annotatePersistedAssistantMessage(state, deps);
|
|
485
509
|
}
|
|
486
510
|
}
|
|
487
511
|
|
|
@@ -491,7 +515,10 @@ export function handleToolResult(
|
|
|
491
515
|
* and update the DB. This runs post-tool-execution so the metadata maps are
|
|
492
516
|
* fully populated (unlike message_complete which fires before tools run).
|
|
493
517
|
*/
|
|
494
|
-
function annotatePersistedAssistantMessage(
|
|
518
|
+
function annotatePersistedAssistantMessage(
|
|
519
|
+
state: EventHandlerState,
|
|
520
|
+
deps: EventHandlerDeps,
|
|
521
|
+
): void {
|
|
495
522
|
const messageId = state.lastAssistantMessageId;
|
|
496
523
|
if (!messageId) return;
|
|
497
524
|
|
|
@@ -529,6 +556,25 @@ function annotatePersistedAssistantMessage(state: EventHandlerState): void {
|
|
|
529
556
|
}
|
|
530
557
|
}
|
|
531
558
|
|
|
559
|
+
// Persist any surfaces created during tool execution.
|
|
560
|
+
// message_complete fires BEFORE tools run, so currentTurnSurfaces is empty
|
|
561
|
+
// at write time. We append them here after all tools have completed.
|
|
562
|
+
if (deps.ctx.currentTurnSurfaces.length > 0) {
|
|
563
|
+
for (const surface of deps.ctx.currentTurnSurfaces) {
|
|
564
|
+
content.push({
|
|
565
|
+
type: "ui_surface",
|
|
566
|
+
surfaceId: surface.surfaceId,
|
|
567
|
+
surfaceType: surface.surfaceType,
|
|
568
|
+
title: surface.title,
|
|
569
|
+
data: surface.data,
|
|
570
|
+
actions: surface.actions,
|
|
571
|
+
display: surface.display,
|
|
572
|
+
} as unknown as ContentBlock);
|
|
573
|
+
}
|
|
574
|
+
modified = true;
|
|
575
|
+
deps.ctx.currentTurnSurfaces = [];
|
|
576
|
+
}
|
|
577
|
+
|
|
532
578
|
if (modified) {
|
|
533
579
|
updateMessageContent(messageId, JSON.stringify(content));
|
|
534
580
|
}
|
|
@@ -759,6 +805,9 @@ export async function dispatchAgentEvent(
|
|
|
759
805
|
case "tool_use":
|
|
760
806
|
handleToolUse(state, deps, event);
|
|
761
807
|
break;
|
|
808
|
+
case "tool_use_preview_start":
|
|
809
|
+
handleToolUsePreviewStart(state, deps, event);
|
|
810
|
+
break;
|
|
762
811
|
case "tool_output_chunk":
|
|
763
812
|
handleToolOutputChunk(state, deps, event);
|
|
764
813
|
break;
|
|
@@ -768,6 +817,20 @@ export async function dispatchAgentEvent(
|
|
|
768
817
|
case "tool_result":
|
|
769
818
|
handleToolResult(state, deps, event);
|
|
770
819
|
break;
|
|
820
|
+
case "server_tool_start": {
|
|
821
|
+
const friendlyNames: Record<string, string> = {
|
|
822
|
+
web_search: "Searching the web",
|
|
823
|
+
};
|
|
824
|
+
const statusText = friendlyNames[event.name] ?? `Running ${event.name}`;
|
|
825
|
+
deps.ctx.emitActivityState(
|
|
826
|
+
"tool_running",
|
|
827
|
+
"tool_use_start",
|
|
828
|
+
"assistant_turn",
|
|
829
|
+
deps.reqId,
|
|
830
|
+
statusText,
|
|
831
|
+
);
|
|
832
|
+
break;
|
|
833
|
+
}
|
|
771
834
|
case "error":
|
|
772
835
|
handleError(state, deps, event);
|
|
773
836
|
break;
|
|
@@ -139,6 +139,7 @@ const TOOL_FRIENDLY_LABEL: Record<string, string> = {
|
|
|
139
139
|
app_create: "Create App",
|
|
140
140
|
app_update: "Update App",
|
|
141
141
|
skill_load: "Load Skill",
|
|
142
|
+
skill_execute: "Run Skill Tool",
|
|
142
143
|
app_file_edit: "Edit App File",
|
|
143
144
|
app_file_write: "Write App File",
|
|
144
145
|
};
|
|
@@ -226,6 +227,7 @@ export interface AgentLoopSessionContext {
|
|
|
226
227
|
| "thinking_delta"
|
|
227
228
|
| "first_text_delta"
|
|
228
229
|
| "tool_use_start"
|
|
230
|
+
| "preview_start"
|
|
229
231
|
| "tool_result_received"
|
|
230
232
|
| "confirmation_requested"
|
|
231
233
|
| "confirmation_resolved"
|
|
@@ -1301,60 +1303,10 @@ export async function runAgentLoopImpl(
|
|
|
1301
1303
|
sessionId: ctx.conversationId,
|
|
1302
1304
|
});
|
|
1303
1305
|
|
|
1304
|
-
//
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
state.directiveWarnings,
|
|
1309
|
-
ctx.workingDir,
|
|
1310
|
-
async (filePath) =>
|
|
1311
|
-
approveHostAttachmentRead(
|
|
1312
|
-
filePath,
|
|
1313
|
-
ctx.workingDir,
|
|
1314
|
-
ctx.prompter,
|
|
1315
|
-
ctx.conversationId,
|
|
1316
|
-
ctx.hasNoClient,
|
|
1317
|
-
),
|
|
1318
|
-
state.lastAssistantMessageId,
|
|
1319
|
-
state.toolContentBlockToolNames,
|
|
1320
|
-
);
|
|
1321
|
-
const { assistantAttachments, emittedAttachments } = attachmentResult;
|
|
1322
|
-
|
|
1323
|
-
ctx.lastAssistantAttachments = assistantAttachments;
|
|
1324
|
-
ctx.lastAttachmentWarnings = attachmentResult.directiveWarnings;
|
|
1325
|
-
|
|
1326
|
-
const warningText = formatAttachmentWarnings(
|
|
1327
|
-
attachmentResult.directiveWarnings,
|
|
1328
|
-
);
|
|
1329
|
-
if (warningText) {
|
|
1330
|
-
onEvent({
|
|
1331
|
-
type: "assistant_text_delta",
|
|
1332
|
-
text: warningText,
|
|
1333
|
-
sessionId: ctx.conversationId,
|
|
1334
|
-
});
|
|
1335
|
-
}
|
|
1336
|
-
|
|
1337
|
-
// Emit completion event
|
|
1338
|
-
if (yieldedForHandoff) {
|
|
1339
|
-
ctx.traceEmitter.emit(
|
|
1340
|
-
"generation_handoff",
|
|
1341
|
-
"Handing off to next queued message",
|
|
1342
|
-
{
|
|
1343
|
-
requestId: reqId,
|
|
1344
|
-
status: "info",
|
|
1345
|
-
attributes: { queuedCount: ctx.getQueueDepth() },
|
|
1346
|
-
},
|
|
1347
|
-
);
|
|
1348
|
-
onEvent({
|
|
1349
|
-
type: "generation_handoff",
|
|
1350
|
-
sessionId: ctx.conversationId,
|
|
1351
|
-
requestId: reqId,
|
|
1352
|
-
queuedCount: ctx.getQueueDepth(),
|
|
1353
|
-
...(emittedAttachments.length > 0
|
|
1354
|
-
? { attachments: emittedAttachments }
|
|
1355
|
-
: {}),
|
|
1356
|
-
});
|
|
1357
|
-
} else if (abortController.signal.aborted) {
|
|
1306
|
+
// Fast-path: when the user cancelled, skip expensive post-loop work
|
|
1307
|
+
// (attachment resolution) and emit the cancellation event immediately
|
|
1308
|
+
// so the client can re-enable the UI without delay.
|
|
1309
|
+
if (abortController.signal.aborted) {
|
|
1358
1310
|
ctx.emitActivityState("idle", "generation_cancelled", "global", reqId);
|
|
1359
1311
|
ctx.traceEmitter.emit(
|
|
1360
1312
|
"generation_cancelled",
|
|
@@ -1366,18 +1318,97 @@ export async function runAgentLoopImpl(
|
|
|
1366
1318
|
);
|
|
1367
1319
|
onEvent({ type: "generation_cancelled", sessionId: ctx.conversationId });
|
|
1368
1320
|
} else {
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1321
|
+
// Resolve attachments (only when not cancelled — this is expensive async I/O)
|
|
1322
|
+
const attachmentResult = await resolveAssistantAttachments(
|
|
1323
|
+
state.accumulatedDirectives,
|
|
1324
|
+
state.accumulatedToolContentBlocks,
|
|
1325
|
+
state.directiveWarnings,
|
|
1326
|
+
ctx.workingDir,
|
|
1327
|
+
async (filePath) =>
|
|
1328
|
+
approveHostAttachmentRead(
|
|
1329
|
+
filePath,
|
|
1330
|
+
ctx.workingDir,
|
|
1331
|
+
ctx.prompter,
|
|
1332
|
+
ctx.conversationId,
|
|
1333
|
+
ctx.hasNoClient,
|
|
1334
|
+
),
|
|
1335
|
+
state.lastAssistantMessageId,
|
|
1336
|
+
state.toolContentBlockToolNames,
|
|
1337
|
+
);
|
|
1338
|
+
const { assistantAttachments, emittedAttachments } = attachmentResult;
|
|
1339
|
+
|
|
1340
|
+
ctx.lastAssistantAttachments = assistantAttachments;
|
|
1341
|
+
ctx.lastAttachmentWarnings = attachmentResult.directiveWarnings;
|
|
1342
|
+
|
|
1343
|
+
const warningText = formatAttachmentWarnings(
|
|
1344
|
+
attachmentResult.directiveWarnings,
|
|
1345
|
+
);
|
|
1346
|
+
if (warningText) {
|
|
1347
|
+
onEvent({
|
|
1348
|
+
type: "assistant_text_delta",
|
|
1349
|
+
text: warningText,
|
|
1350
|
+
sessionId: ctx.conversationId,
|
|
1351
|
+
});
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
// Re-check: the user may have cancelled during attachment resolution
|
|
1355
|
+
if (abortController.signal.aborted) {
|
|
1356
|
+
ctx.emitActivityState("idle", "generation_cancelled", "global", reqId);
|
|
1357
|
+
ctx.traceEmitter.emit(
|
|
1358
|
+
"generation_cancelled",
|
|
1359
|
+
"Generation cancelled by user",
|
|
1360
|
+
{
|
|
1361
|
+
requestId: reqId,
|
|
1362
|
+
status: "warning",
|
|
1363
|
+
},
|
|
1364
|
+
);
|
|
1365
|
+
onEvent({
|
|
1366
|
+
type: "generation_cancelled",
|
|
1367
|
+
sessionId: ctx.conversationId,
|
|
1368
|
+
});
|
|
1369
|
+
} else if (yieldedForHandoff) {
|
|
1370
|
+
ctx.traceEmitter.emit(
|
|
1371
|
+
"generation_handoff",
|
|
1372
|
+
"Handing off to next queued message",
|
|
1373
|
+
{
|
|
1374
|
+
requestId: reqId,
|
|
1375
|
+
status: "info",
|
|
1376
|
+
attributes: { queuedCount: ctx.getQueueDepth() },
|
|
1377
|
+
},
|
|
1378
|
+
);
|
|
1379
|
+
onEvent({
|
|
1380
|
+
type: "generation_handoff",
|
|
1381
|
+
sessionId: ctx.conversationId,
|
|
1382
|
+
requestId: reqId,
|
|
1383
|
+
queuedCount: ctx.getQueueDepth(),
|
|
1384
|
+
...(emittedAttachments.length > 0
|
|
1385
|
+
? { attachments: emittedAttachments }
|
|
1386
|
+
: {}),
|
|
1387
|
+
...(state.lastAssistantMessageId
|
|
1388
|
+
? { messageId: state.lastAssistantMessageId }
|
|
1389
|
+
: {}),
|
|
1390
|
+
});
|
|
1391
|
+
} else {
|
|
1392
|
+
ctx.emitActivityState("idle", "message_complete", "global", reqId);
|
|
1393
|
+
ctx.traceEmitter.emit(
|
|
1394
|
+
"message_complete",
|
|
1395
|
+
"Message processing complete",
|
|
1396
|
+
{
|
|
1397
|
+
requestId: reqId,
|
|
1398
|
+
status: "success",
|
|
1399
|
+
},
|
|
1400
|
+
);
|
|
1401
|
+
onEvent({
|
|
1402
|
+
type: "message_complete",
|
|
1403
|
+
sessionId: ctx.conversationId,
|
|
1404
|
+
...(emittedAttachments.length > 0
|
|
1405
|
+
? { attachments: emittedAttachments }
|
|
1406
|
+
: {}),
|
|
1407
|
+
...(state.lastAssistantMessageId
|
|
1408
|
+
? { messageId: state.lastAssistantMessageId }
|
|
1409
|
+
: {}),
|
|
1410
|
+
});
|
|
1411
|
+
}
|
|
1381
1412
|
}
|
|
1382
1413
|
|
|
1383
1414
|
// Second title pass: after 3 completed turns, re-generate the title
|
|
@@ -199,7 +199,7 @@ export async function resolveAssistantAttachments(
|
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
// Persist resolved attachments and link to the last assistant message.
|
|
202
|
-
// Large video attachments are omitted from the
|
|
202
|
+
// Large video attachments are omitted from the event payload and lazy-loaded
|
|
203
203
|
// by the client via the HTTP endpoint (same pattern as history_response).
|
|
204
204
|
const MAX_INLINE_B64_SIZE = 512 * 1024;
|
|
205
205
|
|