@vellumai/assistant 0.4.26 → 0.4.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -2
- package/AGENTS.md +5 -0
- package/ARCHITECTURE.md +169 -69
- package/Dockerfile +1 -1
- package/README.md +111 -112
- package/bun.lock +0 -3
- package/docs/architecture/integrations.md +0 -1
- package/docs/architecture/memory.md +100 -63
- package/docs/error-handling.md +71 -0
- package/docs/runbook-trusted-contacts.md +10 -9
- package/docs/trusted-contact-access.md +48 -46
- package/package.json +3 -3
- package/scripts/compare-benchmarks.sh +12 -5
- package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
- package/scripts/test.sh +89 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/account-registry.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +36 -23
- package/src/__tests__/agent-loop-thinking.test.ts +29 -13
- package/src/__tests__/agent-loop.test.ts +2 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/asset-materialize-tool.test.ts +7 -7
- package/src/__tests__/asset-search-tool.test.ts +7 -7
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
- package/src/__tests__/call-controller.test.ts +99 -69
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +113 -70
- package/src/__tests__/channel-guardian.test.ts +173 -282
- package/src/__tests__/channel-readiness-service.test.ts +6 -2
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +14 -14
- package/src/__tests__/checker.test.ts +12 -31
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
- package/src/__tests__/compaction.benchmark.test.ts +6 -2
- package/src/__tests__/computer-use-tools.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +66 -7
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
- package/src/__tests__/contacts-tools.test.ts +63 -2
- package/src/__tests__/context-overflow-approval.test.ts +141 -0
- package/src/__tests__/context-overflow-policy.test.ts +171 -0
- package/src/__tests__/context-overflow-reducer.test.ts +533 -0
- package/src/__tests__/context-window-manager.test.ts +97 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
- package/src/__tests__/conversation-routes.test.ts +4 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
- package/src/__tests__/credential-security-e2e.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/credential-vault-unit.test.ts +1 -1
- package/src/__tests__/credential-vault.test.ts +11 -8
- package/src/__tests__/daemon-lifecycle.test.ts +2 -2
- package/src/__tests__/daemon-server-session-init.test.ts +6 -6
- package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
- package/src/__tests__/encrypted-store.test.ts +10 -7
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/file-edit-tool.test.ts +1 -1
- package/src/__tests__/file-read-tool.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +1 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
- package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
- package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -0
- package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
- package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +79 -1
- package/src/__tests__/guardian-grant-minting.test.ts +14 -14
- package/src/__tests__/guardian-outbound-http.test.ts +1 -2
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
- package/src/__tests__/guardian-routing-state.test.ts +36 -52
- package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
- package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
- package/src/__tests__/handlers-telegram-config.test.ts +14 -14
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +45 -2
- package/src/__tests__/host-file-edit-tool.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +1 -1
- package/src/__tests__/host-file-write-tool.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
- package/src/__tests__/ingress-reconcile.test.ts +2 -2
- package/src/__tests__/ingress-routes-http.test.ts +2 -1
- package/src/__tests__/integrations-cli.test.ts +256 -0
- package/src/__tests__/intent-routing.test.ts +4 -5
- package/src/__tests__/invite-redemption-service.test.ts +4 -3
- package/src/__tests__/ipc-snapshot.test.ts +28 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +136 -57
- package/src/__tests__/mcp-client-auth.test.ts +95 -0
- package/src/__tests__/media-generate-image.test.ts +2 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
- package/src/__tests__/memory-regressions.test.ts +6 -6
- package/src/__tests__/messaging-send-tool.test.ts +1 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
- package/src/__tests__/migration-export-http.test.ts +540 -0
- package/src/__tests__/migration-import-commit-http.test.ts +823 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
- package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
- package/src/__tests__/migration-transport.test.ts +904 -0
- package/src/__tests__/migration-validate-http.test.ts +698 -0
- package/src/__tests__/migration-wizard.test.ts +1289 -0
- package/src/__tests__/non-member-access-request.test.ts +17 -17
- package/src/__tests__/notification-decision-strategy.test.ts +110 -2
- package/src/__tests__/notification-deep-link.test.ts +18 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
- package/src/__tests__/proxy-approval-callback.test.ts +1 -1
- package/src/__tests__/qdrant-manager.test.ts +40 -11
- package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/recording-intent-handler.test.ts +3 -3
- package/src/__tests__/recording-state-machine.test.ts +2 -2
- package/src/__tests__/relay-server.test.ts +506 -227
- package/src/__tests__/reminder-store.test.ts +8 -0
- package/src/__tests__/reminder.test.ts +8 -0
- package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
- package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
- package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
- package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
- package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
- package/src/__tests__/script-proxy-policy.test.ts +2 -2
- package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
- package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
- package/src/__tests__/secret-onetime-send.test.ts +4 -4
- package/src/__tests__/secret-scanner-executor.test.ts +2 -2
- package/src/__tests__/send-endpoint-busy.test.ts +11 -9
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +17 -2
- package/src/__tests__/session-agent-loop.test.ts +456 -35
- package/src/__tests__/session-confirmation-signals.test.ts +3 -2
- package/src/__tests__/session-conflict-gate.test.ts +20 -3
- package/src/__tests__/session-init.benchmark.test.ts +2 -2
- package/src/__tests__/session-load-history-repair.test.ts +7 -7
- package/src/__tests__/session-pre-run-repair.test.ts +17 -2
- package/src/__tests__/session-profile-injection.test.ts +20 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
- package/src/__tests__/session-queue.test.ts +33 -18
- package/src/__tests__/session-runtime-assembly.test.ts +147 -1
- package/src/__tests__/session-runtime-workspace.test.ts +40 -0
- package/src/__tests__/session-slash-known.test.ts +21 -3
- package/src/__tests__/session-slash-queue.test.ts +17 -2
- package/src/__tests__/session-slash-unknown.test.ts +17 -2
- package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
- package/src/__tests__/session-workspace-injection.test.ts +17 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
- package/src/__tests__/shell-credential-ref.test.ts +1 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-script-runner-host.test.ts +1 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
- package/src/__tests__/skill-script-runner.test.ts +1 -1
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +3 -2
- package/src/__tests__/subagent-tools.test.ts +3 -3
- package/src/__tests__/swarm-recursion.test.ts +1 -1
- package/src/__tests__/swarm-session-integration.test.ts +1 -1
- package/src/__tests__/swarm-tool.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-tools.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
- package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +23 -182
- package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
- package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
- package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
- package/src/__tests__/trust-context-guards.test.ts +25 -29
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
- package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
- package/src/__tests__/trusted-contact-verification.test.ts +63 -77
- package/src/__tests__/turn-commit.test.ts +18 -18
- package/src/__tests__/twilio-provider.test.ts +7 -7
- package/src/__tests__/validation-results-screen.test.ts +1107 -0
- package/src/__tests__/view-image-tool.test.ts +1 -1
- package/src/__tests__/voice-invite-redemption.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
- package/src/__tests__/voice-session-bridge.test.ts +24 -24
- package/src/agent/attachments.ts +3 -1
- package/src/agent/loop.ts +13 -13
- package/src/agent/message-types.ts +13 -7
- package/src/amazon/cart.ts +59 -32
- package/src/amazon/checkout.ts +25 -14
- package/src/amazon/client.ts +68 -48
- package/src/amazon/product-details.ts +3 -3
- package/src/amazon/request-extractor.ts +46 -31
- package/src/amazon/search.ts +6 -4
- package/src/amazon/session.ts +33 -24
- package/src/approvals/AGENTS.md +26 -0
- package/src/approvals/approval-primitive.ts +87 -64
- package/src/approvals/guardian-decision-primitive.ts +172 -81
- package/src/approvals/guardian-request-resolvers.ts +262 -155
- package/src/autonomy/autonomy-resolver.ts +7 -5
- package/src/autonomy/autonomy-store.ts +34 -19
- package/src/autonomy/disposition-mapper.ts +5 -5
- package/src/autonomy/index.ts +6 -6
- package/src/autonomy/types.ts +7 -3
- package/src/browser-extension-relay/client.ts +50 -19
- package/src/browser-extension-relay/protocol.ts +11 -11
- package/src/browser-extension-relay/server.ts +45 -20
- package/src/bundler/app-bundler.ts +75 -50
- package/src/bundler/bundle-scanner.ts +145 -41
- package/src/bundler/bundle-signer.ts +16 -14
- package/src/bundler/signature-verifier.ts +36 -33
- package/src/calls/call-constants.ts +10 -3
- package/src/calls/call-controller.ts +473 -214
- package/src/calls/call-conversation-messages.ts +25 -15
- package/src/calls/call-domain.ts +401 -148
- package/src/calls/call-pointer-message-composer.ts +26 -21
- package/src/calls/call-pointer-messages.ts +52 -28
- package/src/calls/call-recovery.ts +53 -37
- package/src/calls/call-state-machine.ts +37 -7
- package/src/calls/call-state.ts +35 -13
- package/src/calls/call-store.ts +165 -77
- package/src/calls/elevenlabs-client.ts +39 -20
- package/src/calls/guardian-action-sweep.ts +42 -24
- package/src/calls/guardian-dispatch.ts +79 -56
- package/src/calls/guardian-question-copy.ts +28 -23
- package/src/calls/relay-server.ts +1121 -532
- package/src/calls/speaker-identification.ts +21 -15
- package/src/calls/twilio-config.ts +34 -17
- package/src/calls/twilio-provider.ts +108 -55
- package/src/calls/twilio-rest.ts +212 -100
- package/src/calls/twilio-routes.ts +165 -92
- package/src/calls/types.ts +55 -7
- package/src/calls/voice-quality.ts +6 -4
- package/src/calls/voice-session-bridge.ts +181 -133
- package/src/channels/config.ts +17 -13
- package/src/channels/types.ts +38 -10
- package/src/cli/amazon.ts +333 -227
- package/src/cli/config-commands.ts +236 -146
- package/src/cli/core-commands.ts +403 -329
- package/src/cli/email-guardrails.ts +38 -19
- package/src/cli/email.ts +207 -153
- package/src/cli/influencer.ts +58 -56
- package/src/cli/integrations.ts +362 -0
- package/src/cli/ipc-client.ts +24 -19
- package/src/cli/map.ts +176 -129
- package/src/cli/mcp.ts +260 -152
- package/src/cli/sequence.ts +165 -107
- package/src/cli/twitter.ts +302 -218
- package/src/cli.ts +418 -279
- package/src/commands/cc-command-registry.ts +52 -27
- package/src/config/agent-schema.ts +217 -134
- package/src/config/assistant-feature-flags.ts +23 -18
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
- package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
- package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
- package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
- package/src/config/bundled-skills/contacts/SKILL.md +446 -15
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
- package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
- package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
- package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
- package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
- package/src/config/bundled-skills/google-calendar/types.ts +3 -3
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
- package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
- package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
- package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
- package/src/config/bundled-skills/messaging/SKILL.md +7 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
- package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
- package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
- package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
- package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
- package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
- package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
- package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
- package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
- package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
- package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
- package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
- package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
- package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
- package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
- package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
- package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
- package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
- package/src/config/bundled-skills/slack/TOOLS.json +33 -15
- package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
- package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
- package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
- package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
- package/src/config/bundled-skills/twitter/SKILL.md +19 -2
- package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
- package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
- package/src/config/calls-schema.ts +108 -63
- package/src/config/computer-use-prompt.ts +7 -7
- package/src/config/core-schema.ts +239 -155
- package/src/config/defaults.ts +2 -2
- package/src/config/elevenlabs-schema.ts +15 -15
- package/src/config/env-registry.ts +33 -33
- package/src/config/feature-flag-registry.json +31 -7
- package/src/config/loader.ts +118 -58
- package/src/config/mcp-schema.ts +29 -15
- package/src/config/memory-schema.ts +434 -229
- package/src/config/notifications-schema.ts +4 -4
- package/src/config/sandbox-schema.ts +2 -2
- package/src/config/schema.ts +12 -2
- package/src/config/skill-state.ts +27 -15
- package/src/config/skills-schema.ts +72 -23
- package/src/config/skills.ts +303 -143
- package/src/config/system-prompt.ts +25 -6
- package/src/config/types.ts +1 -1
- package/src/config/update-bulletin-format.ts +3 -3
- package/src/config/update-bulletin-state.ts +15 -6
- package/src/config/update-bulletin-template-path.ts +8 -4
- package/src/config/update-bulletin.ts +33 -14
- package/src/config/user-reference.ts +8 -8
- package/src/contacts/contact-events.ts +21 -0
- package/src/contacts/contact-store.ts +622 -100
- package/src/contacts/contacts-write.ts +287 -0
- package/src/contacts/index.ts +13 -4
- package/src/contacts/startup-migration.ts +21 -0
- package/src/contacts/types.ts +47 -2
- package/src/context/token-estimator.ts +54 -31
- package/src/context/tool-result-truncation.ts +41 -7
- package/src/context/window-manager.ts +225 -120
- package/src/daemon/approval-generators.ts +83 -55
- package/src/daemon/approved-devices-store.ts +33 -20
- package/src/daemon/assistant-attachments.ts +134 -98
- package/src/daemon/auth-manager.ts +17 -15
- package/src/daemon/classifier.ts +117 -46
- package/src/daemon/computer-use-session.ts +316 -187
- package/src/daemon/config-watcher.ts +91 -44
- package/src/daemon/connection-policy.ts +18 -10
- package/src/daemon/context-overflow-approval.ts +48 -0
- package/src/daemon/context-overflow-policy.ts +50 -0
- package/src/daemon/context-overflow-reducer.ts +300 -0
- package/src/daemon/daemon-control.ts +79 -51
- package/src/daemon/date-context.ts +119 -69
- package/src/daemon/dictation-profile-store.ts +94 -48
- package/src/daemon/dictation-text-processing.ts +33 -12
- package/src/daemon/doordash-steps.ts +92 -49
- package/src/daemon/guardian-action-generators.ts +62 -46
- package/src/daemon/guardian-verification-intent.ts +31 -18
- package/src/daemon/handlers/apps.ts +257 -111
- package/src/daemon/handlers/avatar.ts +20 -15
- package/src/daemon/handlers/computer-use.ts +82 -39
- package/src/daemon/handlers/config-channels.ts +146 -69
- package/src/daemon/handlers/config-heartbeat.ts +114 -59
- package/src/daemon/handlers/config-inbox.ts +277 -106
- package/src/daemon/handlers/config-ingress.ts +127 -55
- package/src/daemon/handlers/config-integrations.ts +145 -88
- package/src/daemon/handlers/config-model.ts +58 -22
- package/src/daemon/handlers/config-platform.ts +40 -16
- package/src/daemon/handlers/config-scheduling.ts +109 -48
- package/src/daemon/handlers/config-slack-channel.ts +67 -35
- package/src/daemon/handlers/config-slack.ts +21 -20
- package/src/daemon/handlers/config-telegram.ts +100 -70
- package/src/daemon/handlers/config-tools.ts +103 -55
- package/src/daemon/handlers/config-trust.ts +50 -20
- package/src/daemon/handlers/config.ts +72 -24
- package/src/daemon/handlers/contacts.ts +163 -0
- package/src/daemon/handlers/diagnostics.ts +90 -48
- package/src/daemon/handlers/documents.ts +74 -46
- package/src/daemon/handlers/guardian-actions.ts +118 -71
- package/src/daemon/handlers/home-base.ts +19 -16
- package/src/daemon/handlers/identity.ts +65 -45
- package/src/daemon/handlers/index.ts +78 -54
- package/src/daemon/handlers/misc.ts +664 -234
- package/src/daemon/handlers/navigate-settings.ts +14 -11
- package/src/daemon/handlers/oauth-connect.ts +48 -35
- package/src/daemon/handlers/open-bundle-handler.ts +31 -24
- package/src/daemon/handlers/pairing.ts +51 -25
- package/src/daemon/handlers/publish.ts +55 -33
- package/src/daemon/handlers/recording.ts +378 -162
- package/src/daemon/handlers/sessions.ts +923 -423
- package/src/daemon/handlers/shared.ts +202 -117
- package/src/daemon/handlers/signing.ts +25 -6
- package/src/daemon/handlers/subagents.ts +117 -56
- package/src/daemon/handlers/twitter-auth.ts +70 -49
- package/src/daemon/handlers/work-items.ts +264 -112
- package/src/daemon/handlers/workspace-files.ts +27 -20
- package/src/daemon/handlers.ts +2 -2
- package/src/daemon/history-repair.ts +16 -15
- package/src/daemon/identity-helpers.ts +4 -4
- package/src/daemon/install-cli-launchers.ts +33 -22
- package/src/daemon/ipc-blob-store.ts +38 -24
- package/src/daemon/ipc-contract/apps.ts +61 -49
- package/src/daemon/ipc-contract/computer-use.ts +47 -37
- package/src/daemon/ipc-contract/contacts.ts +69 -0
- package/src/daemon/ipc-contract/diagnostics.ts +14 -14
- package/src/daemon/ipc-contract/documents.ts +8 -8
- package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
- package/src/daemon/ipc-contract/inbox.ts +16 -16
- package/src/daemon/ipc-contract/integrations.ts +57 -44
- package/src/daemon/ipc-contract/memory.ts +3 -5
- package/src/daemon/ipc-contract/messages.ts +95 -69
- package/src/daemon/ipc-contract/notifications.ts +10 -6
- package/src/daemon/ipc-contract/pairing.ts +8 -8
- package/src/daemon/ipc-contract/schedules.ts +20 -20
- package/src/daemon/ipc-contract/sessions.ts +88 -57
- package/src/daemon/ipc-contract/settings.ts +12 -7
- package/src/daemon/ipc-contract/shared.ts +9 -7
- package/src/daemon/ipc-contract/skills.ts +46 -26
- package/src/daemon/ipc-contract/subagents.ts +9 -9
- package/src/daemon/ipc-contract/trust.ts +11 -11
- package/src/daemon/ipc-contract/work-items.ts +33 -28
- package/src/daemon/ipc-contract/workspace.ts +28 -21
- package/src/daemon/ipc-contract-inventory.json +8 -0
- package/src/daemon/ipc-contract-inventory.ts +29 -26
- package/src/daemon/ipc-contract.ts +111 -44
- package/src/daemon/ipc-handler.ts +27 -19
- package/src/daemon/ipc-protocol.ts +22 -12
- package/src/daemon/ipc-validate.ts +91 -46
- package/src/daemon/lifecycle.ts +25 -1
- package/src/daemon/main.ts +10 -8
- package/src/daemon/media-visibility-policy.ts +3 -1
- package/src/daemon/pairing-store.ts +72 -40
- package/src/daemon/providers-setup.ts +35 -25
- package/src/daemon/recording-executor.ts +37 -30
- package/src/daemon/recording-intent-fallback.ts +58 -28
- package/src/daemon/recording-intent.ts +71 -61
- package/src/daemon/ride-shotgun-handler.ts +201 -121
- package/src/daemon/seed-files.ts +28 -17
- package/src/daemon/server.ts +23 -14
- package/src/daemon/session-agent-loop-handlers.ts +261 -135
- package/src/daemon/session-agent-loop.ts +795 -253
- package/src/daemon/session-attachments.ts +104 -39
- package/src/daemon/session-conflict-gate.ts +72 -28
- package/src/daemon/session-dynamic-profile.ts +36 -22
- package/src/daemon/session-error.ts +50 -45
- package/src/daemon/session-evictor.ts +17 -10
- package/src/daemon/session-history.ts +201 -89
- package/src/daemon/session-lifecycle.ts +79 -42
- package/src/daemon/session-media-retry.ts +89 -41
- package/src/daemon/session-memory.ts +77 -55
- package/src/daemon/session-messaging.ts +261 -111
- package/src/daemon/session-notifiers.ts +57 -45
- package/src/daemon/session-process.ts +370 -154
- package/src/daemon/session-queue-manager.ts +30 -13
- package/src/daemon/session-runtime-assembly.ts +61 -15
- package/src/daemon/session-skill-tools.ts +84 -36
- package/src/daemon/session-slash.ts +178 -113
- package/src/daemon/session-surfaces.ts +498 -211
- package/src/daemon/session-tool-setup.ts +22 -17
- package/src/daemon/session-usage.ts +26 -13
- package/src/daemon/session-workspace.ts +7 -4
- package/src/daemon/session.ts +18 -19
- package/src/daemon/shutdown-handlers.ts +36 -33
- package/src/daemon/tls-certs.ts +90 -57
- package/src/daemon/tool-side-effects.ts +97 -65
- package/src/daemon/trace-emitter.ts +8 -7
- package/src/daemon/video-thumbnail.ts +55 -25
- package/src/daemon/watch-handler.ts +164 -86
- package/src/email/provider.ts +1 -1
- package/src/email/providers/agentmail.ts +87 -45
- package/src/email/providers/index.ts +19 -14
- package/src/email/service.ts +52 -24
- package/src/email/types.ts +2 -2
- package/src/errors.ts +1 -1
- package/src/events/bus.ts +30 -10
- package/src/events/domain-events.ts +19 -13
- package/src/events/index.ts +6 -6
- package/src/events/tool-audit-listener.ts +34 -20
- package/src/events/tool-domain-event-publisher.ts +22 -20
- package/src/events/tool-metrics-listener.ts +26 -21
- package/src/events/tool-notification-listener.ts +5 -5
- package/src/events/tool-profiling-listener.ts +33 -23
- package/src/events/tool-trace-listener.ts +70 -46
- package/src/export/formatter.ts +38 -32
- package/src/followups/followup-store.ts +43 -36
- package/src/followups/index.ts +2 -2
- package/src/followups/types.ts +1 -1
- package/src/gallery/default-gallery.ts +37 -34
- package/src/gallery/gallery-manifest.ts +9 -9
- package/src/heartbeat/heartbeat-service.ts +59 -37
- package/src/home-base/app-link-store.ts +14 -12
- package/src/home-base/bootstrap.ts +14 -8
- package/src/home-base/prebuilt/seed.ts +35 -26
- package/src/home-base/prebuilt-home-base-updater.ts +14 -8
- package/src/hooks/cli.ts +56 -43
- package/src/hooks/config.ts +27 -14
- package/src/hooks/discovery.ts +53 -33
- package/src/hooks/manager.ts +50 -26
- package/src/hooks/runner.ts +35 -29
- package/src/hooks/templates.ts +38 -15
- package/src/hooks/types.ts +13 -13
- package/src/inbound/platform-callback-registration.ts +21 -15
- package/src/inbound/public-ingress-urls.ts +9 -6
- package/src/index.ts +20 -19
- package/src/influencer/client.ts +269 -108
- package/src/instrument.ts +3 -1
- package/src/logfire.ts +64 -39
- package/src/mcp/client.ts +107 -55
- package/src/mcp/manager.ts +45 -18
- package/src/mcp/mcp-oauth-provider.ts +114 -62
- package/src/media/gemini-image-service.ts +28 -21
- package/src/memory/account-store.ts +16 -9
- package/src/memory/admin.ts +87 -57
- package/src/memory/app-git-service.ts +77 -47
- package/src/memory/app-store.ts +151 -77
- package/src/memory/attachments-store.ts +123 -53
- package/src/memory/canonical-guardian-store.ts +190 -48
- package/src/memory/channel-delivery-store.ts +5 -5
- package/src/memory/channel-guardian-store.ts +31 -16
- package/src/memory/checkpoints.ts +14 -7
- package/src/memory/clarification-resolver.ts +219 -104
- package/src/memory/conflict-intent.ts +74 -23
- package/src/memory/conflict-policy.ts +20 -7
- package/src/memory/conflict-store.ts +144 -94
- package/src/memory/contradiction-checker.ts +257 -132
- package/src/memory/conversation-attention-store.ts +72 -32
- package/src/memory/conversation-bootstrap.ts +28 -0
- package/src/memory/conversation-crud.ts +12 -5
- package/src/memory/conversation-display-order-migration.ts +7 -7
- package/src/memory/conversation-key-store.ts +18 -13
- package/src/memory/conversation-queries.ts +130 -52
- package/src/memory/conversation-store.ts +43 -26
- package/src/memory/conversation-title-service.ts +89 -66
- package/src/memory/db-init.ts +90 -2
- package/src/memory/db.ts +10 -3
- package/src/memory/delivery-channels.ts +12 -6
- package/src/memory/delivery-crud.ts +26 -12
- package/src/memory/delivery-status.ts +19 -16
- package/src/memory/embedding-backend.ts +205 -77
- package/src/memory/embedding-gemini.ts +23 -10
- package/src/memory/embedding-local.ts +89 -44
- package/src/memory/embedding-ollama.ts +25 -13
- package/src/memory/embedding-openai.ts +20 -11
- package/src/memory/embedding-runtime-manager.ts +163 -90
- package/src/memory/entity-extractor.ts +185 -123
- package/src/memory/external-conversation-store.ts +30 -12
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/fts-reconciler.ts +57 -28
- package/src/memory/guardian-action-store.ts +162 -100
- package/src/memory/guardian-approvals.ts +63 -129
- package/src/memory/guardian-rate-limits.ts +20 -9
- package/src/memory/guardian-verification.ts +82 -35
- package/src/memory/indexer.ts +96 -55
- package/src/memory/ingress-invite-store.ts +28 -169
- package/src/memory/items-extractor.ts +313 -157
- package/src/memory/job-handlers/backfill.ts +116 -63
- package/src/memory/job-handlers/cleanup.ts +64 -41
- package/src/memory/job-handlers/conflict.ts +90 -49
- package/src/memory/job-handlers/embedding.ts +32 -17
- package/src/memory/job-handlers/extraction.ts +58 -33
- package/src/memory/job-handlers/index-maintenance.ts +31 -17
- package/src/memory/job-handlers/media-processing.ts +65 -24
- package/src/memory/job-handlers/summarization.ts +186 -128
- package/src/memory/job-utils.ts +100 -57
- package/src/memory/jobs-store.ts +235 -142
- package/src/memory/jobs-worker.ts +167 -83
- package/src/memory/llm-request-log-store.ts +13 -11
- package/src/memory/llm-usage-store.ts +35 -26
- package/src/memory/media-store.ts +151 -44
- package/src/memory/message-content.ts +28 -18
- package/src/memory/migrations/001-job-deferrals.ts +11 -5
- package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
- package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
- package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
- package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
- package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
- package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
- package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
- package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
- package/src/memory/migrations/022-add-origin-interface.ts +4 -2
- package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
- package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
- package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
- package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
- package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
- package/src/memory/migrations/028-call-session-mode.ts +13 -3
- package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
- package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
- package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
- package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
- package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
- package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
- package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
- package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
- package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
- package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
- package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
- package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
- package/src/memory/migrations/038-actor-token-records.ts +5 -9
- package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
- package/src/memory/migrations/100-core-tables.ts +1 -1
- package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
- package/src/memory/migrations/103-complex-migrations.ts +9 -9
- package/src/memory/migrations/104-core-indexes.ts +188 -64
- package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
- package/src/memory/migrations/106-call-sessions.ts +58 -16
- package/src/memory/migrations/107-followups.ts +16 -6
- package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
- package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
- package/src/memory/migrations/110-channel-guardian.ts +48 -10
- package/src/memory/migrations/111-media-assets.ts +52 -18
- package/src/memory/migrations/112-assistant-inbox.ts +32 -12
- package/src/memory/migrations/113-late-migrations.ts +12 -12
- package/src/memory/migrations/114-notifications.ts +28 -12
- package/src/memory/migrations/115-sequences.ts +10 -4
- package/src/memory/migrations/116-messages-fts.ts +1 -1
- package/src/memory/migrations/117-conversation-attention.ts +16 -6
- package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
- package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
- package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
- package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
- package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
- package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
- package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
- package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
- package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
- package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
- package/src/memory/migrations/index.ts +82 -73
- package/src/memory/migrations/registry.ts +53 -37
- package/src/memory/migrations/validate-migration-state.ts +73 -46
- package/src/memory/profile-compiler.ts +58 -24
- package/src/memory/published-pages-store.ts +12 -16
- package/src/memory/qdrant-circuit-breaker.ts +28 -20
- package/src/memory/qdrant-client.ts +99 -63
- package/src/memory/qdrant-manager.ts +89 -57
- package/src/memory/query-builder.ts +9 -7
- package/src/memory/raw-query.ts +63 -14
- package/src/memory/recall-cache.ts +15 -8
- package/src/memory/retrieval-budget.ts +0 -1
- package/src/memory/retriever.ts +385 -192
- package/src/memory/schema-migration.ts +1 -1
- package/src/memory/schema.ts +44 -56
- package/src/memory/scoped-approval-grants.ts +99 -45
- package/src/memory/search/entity.ts +102 -40
- package/src/memory/search/formatting.ts +70 -52
- package/src/memory/search/lexical.ts +82 -43
- package/src/memory/search/ranking.ts +103 -39
- package/src/memory/search/semantic.ts +59 -35
- package/src/memory/search/types.ts +8 -8
- package/src/memory/segmenter.ts +20 -12
- package/src/memory/shared-app-links-store.ts +21 -16
- package/src/memory/task-memory-cleanup.ts +18 -8
- package/src/memory/tool-usage-store.ts +27 -19
- package/src/memory/validation.ts +4 -2
- package/src/messaging/activity-analyzer.ts +7 -7
- package/src/messaging/draft-store.ts +13 -10
- package/src/messaging/email-classifier.ts +73 -37
- package/src/messaging/index.ts +3 -3
- package/src/messaging/outreach-classifier.ts +76 -38
- package/src/messaging/provider-types.ts +2 -4
- package/src/messaging/provider.ts +37 -8
- package/src/messaging/providers/gmail/adapter.ts +183 -66
- package/src/messaging/providers/gmail/client.ts +3 -1
- package/src/messaging/providers/gmail/mime-builder.ts +21 -19
- package/src/messaging/providers/gmail/people-client.ts +22 -9
- package/src/messaging/providers/gmail/types.ts +6 -6
- package/src/messaging/providers/slack/adapter.ts +93 -43
- package/src/messaging/providers/slack/client.ts +100 -41
- package/src/messaging/providers/slack/types.ts +6 -0
- package/src/messaging/providers/sms/adapter.ts +76 -40
- package/src/messaging/providers/sms/client.ts +4 -4
- package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
- package/src/messaging/providers/telegram-bot/client.ts +7 -7
- package/src/messaging/providers/whatsapp/adapter.ts +58 -31
- package/src/messaging/providers/whatsapp/client.ts +4 -4
- package/src/messaging/registry.ts +9 -5
- package/src/messaging/style-analyzer.ts +69 -39
- package/src/messaging/thread-summarizer.ts +101 -53
- package/src/messaging/triage-engine.ts +111 -82
- package/src/messaging/types.ts +10 -10
- package/src/migrations/config-merge.ts +18 -10
- package/src/migrations/data-layout.ts +35 -22
- package/src/migrations/data-merge.ts +17 -7
- package/src/migrations/hooks-merge.ts +43 -16
- package/src/migrations/index.ts +6 -6
- package/src/migrations/log.ts +9 -5
- package/src/migrations/skills-merge.ts +17 -7
- package/src/migrations/workspace-layout.ts +39 -25
- package/src/notifications/AGENTS.md +5 -0
- package/src/notifications/adapters/macos.ts +21 -14
- package/src/notifications/adapters/sms.ts +28 -15
- package/src/notifications/adapters/telegram.ts +24 -15
- package/src/notifications/broadcaster.ts +108 -52
- package/src/notifications/conversation-pairing.ts +64 -29
- package/src/notifications/copy-composer.ts +165 -95
- package/src/notifications/decision-engine.ts +353 -147
- package/src/notifications/decisions-store.ts +26 -10
- package/src/notifications/deliveries-store.ts +23 -13
- package/src/notifications/destination-resolver.ts +42 -24
- package/src/notifications/deterministic-checks.ts +78 -27
- package/src/notifications/emit-signal.ts +83 -45
- package/src/notifications/events-store.ts +13 -7
- package/src/notifications/guardian-question-mode.ts +125 -75
- package/src/notifications/preference-extractor.ts +85 -53
- package/src/notifications/preference-summary.ts +31 -18
- package/src/notifications/preferences-store.ts +29 -18
- package/src/notifications/runtime-dispatch.ts +22 -12
- package/src/notifications/signal.ts +4 -4
- package/src/notifications/thread-candidates.ts +59 -23
- package/src/notifications/thread-seed-composer.ts +45 -27
- package/src/notifications/types.ts +19 -10
- package/src/oauth/connect-orchestrator.ts +105 -54
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/provider-profiles.ts +80 -59
- package/src/oauth/scope-policy.ts +5 -2
- package/src/oauth/token-persistence.ts +58 -24
- package/src/outbound-proxy/certs.ts +284 -0
- package/src/outbound-proxy/config.ts +94 -0
- package/src/outbound-proxy/connect-tunnel.ts +84 -0
- package/src/outbound-proxy/health.ts +62 -0
- package/src/outbound-proxy/host-pattern-match.ts +67 -0
- package/src/outbound-proxy/http-forwarder.ts +162 -0
- package/src/outbound-proxy/index.ts +80 -0
- package/src/outbound-proxy/logging.ts +193 -0
- package/src/outbound-proxy/mitm-handler.ts +292 -0
- package/src/outbound-proxy/policy.ts +172 -0
- package/src/outbound-proxy/router.ts +64 -0
- package/src/outbound-proxy/server.ts +145 -0
- package/src/outbound-proxy/types.ts +150 -0
- package/src/permissions/checker.ts +481 -189
- package/src/permissions/defaults.ts +135 -108
- package/src/permissions/prompter.ts +53 -27
- package/src/permissions/secret-prompter.ts +21 -15
- package/src/permissions/shell-identity.ts +47 -16
- package/src/permissions/trust-store.ts +185 -73
- package/src/permissions/types.ts +22 -12
- package/src/permissions/workspace-policy.ts +47 -38
- package/src/playbooks/index.ts +10 -2
- package/src/playbooks/playbook-compiler.ts +30 -24
- package/src/playbooks/types.ts +11 -8
- package/src/providers/anthropic/client.ts +325 -168
- package/src/providers/failover.ts +57 -22
- package/src/providers/fireworks/client.ts +9 -5
- package/src/providers/gemini/client.ts +61 -39
- package/src/providers/model-intents.ts +40 -33
- package/src/providers/ollama/client.ts +7 -7
- package/src/providers/openai/client.ts +106 -68
- package/src/providers/openrouter/client.ts +9 -5
- package/src/providers/provider-send-message.ts +59 -27
- package/src/providers/ratelimit.ts +25 -8
- package/src/providers/registry.ts +86 -38
- package/src/providers/retry.ts +84 -36
- package/src/providers/stream-timeout.ts +5 -3
- package/src/providers/types.ts +7 -6
- package/src/runtime/AGENTS.md +42 -0
- package/src/runtime/access-request-helper.ts +118 -68
- package/src/runtime/actor-refresh-token-store.ts +21 -16
- package/src/runtime/actor-token-store.ts +25 -18
- package/src/runtime/actor-trust-resolver.ts +183 -80
- package/src/runtime/approval-conversation-turn.ts +39 -26
- package/src/runtime/approval-message-composer.ts +116 -84
- package/src/runtime/assistant-event-hub.ts +25 -6
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
- package/src/runtime/auth/context.ts +8 -7
- package/src/runtime/auth/credential-service.ts +60 -38
- package/src/runtime/auth/external-assistant-id.ts +16 -8
- package/src/runtime/auth/index.ts +23 -16
- package/src/runtime/auth/route-policy.ts +170 -104
- package/src/runtime/auth/scopes.ts +22 -29
- package/src/runtime/auth/subject.ts +19 -13
- package/src/runtime/auth/token-service.ts +3 -3
- package/src/runtime/auth/types.ts +23 -23
- package/src/runtime/channel-approval-parser.ts +37 -14
- package/src/runtime/channel-approval-types.ts +12 -4
- package/src/runtime/channel-approvals.ts +41 -23
- package/src/runtime/channel-guardian-service.ts +144 -103
- package/src/runtime/channel-invite-transport.ts +4 -2
- package/src/runtime/channel-invite-transports/telegram.ts +16 -10
- package/src/runtime/channel-invite-transports/voice.ts +7 -7
- package/src/runtime/channel-readiness-service.ts +139 -90
- package/src/runtime/channel-readiness-types.ts +4 -2
- package/src/runtime/channel-reply-delivery.ts +21 -11
- package/src/runtime/channel-retry-sweep.ts +111 -62
- package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
- package/src/runtime/gateway-client.ts +86 -53
- package/src/runtime/guardian-action-conversation-turn.ts +34 -18
- package/src/runtime/guardian-action-followup-executor.ts +115 -45
- package/src/runtime/guardian-action-grant-minter.ts +40 -24
- package/src/runtime/guardian-action-message-composer.ts +105 -84
- package/src/runtime/guardian-decision-types.ts +28 -13
- package/src/runtime/guardian-outbound-actions.ts +9 -0
- package/src/runtime/guardian-reply-router.ts +274 -145
- package/src/runtime/guardian-vellum-migration.ts +38 -24
- package/src/runtime/guardian-verification-templates.ts +8 -11
- package/src/runtime/http-router.ts +175 -0
- package/src/runtime/http-server.ts +931 -669
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/ingress-service.ts +182 -89
- package/src/runtime/invite-redemption-service.ts +211 -134
- package/src/runtime/invite-redemption-templates.ts +18 -11
- package/src/runtime/local-actor-identity.ts +73 -55
- package/src/runtime/middleware/auth.ts +25 -14
- package/src/runtime/middleware/error-handler.ts +15 -11
- package/src/runtime/middleware/rate-limiter.ts +23 -17
- package/src/runtime/middleware/request-logger.ts +4 -4
- package/src/runtime/middleware/twilio-validation.ts +29 -20
- package/src/runtime/migrations/migration-transport.ts +575 -0
- package/src/runtime/migrations/migration-wizard.ts +715 -0
- package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
- package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
- package/src/runtime/migrations/validation-results-screen.ts +467 -0
- package/src/runtime/migrations/vbundle-builder.ts +295 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
- package/src/runtime/migrations/vbundle-importer.ts +339 -0
- package/src/runtime/migrations/vbundle-validator.ts +356 -0
- package/src/runtime/pending-interactions.ts +16 -7
- package/src/runtime/routes/access-request-decision.ts +73 -52
- package/src/runtime/routes/app-routes.ts +56 -38
- package/src/runtime/routes/approval-routes.ts +165 -74
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
- package/src/runtime/routes/attachment-routes.ts +59 -48
- package/src/runtime/routes/brain-graph-routes.ts +85 -69
- package/src/runtime/routes/call-routes.ts +79 -38
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
- package/src/runtime/routes/channel-delivery-routes.ts +19 -14
- package/src/runtime/routes/channel-guardian-routes.ts +3 -3
- package/src/runtime/routes/channel-inbound-routes.ts +2 -2
- package/src/runtime/routes/channel-readiness-routes.ts +12 -6
- package/src/runtime/routes/channel-route-shared.ts +33 -25
- package/src/runtime/routes/channel-routes.ts +4 -6
- package/src/runtime/routes/contact-routes.ts +205 -16
- package/src/runtime/routes/conversation-attention-routes.ts +57 -28
- package/src/runtime/routes/conversation-routes.ts +321 -174
- package/src/runtime/routes/debug-routes.ts +14 -10
- package/src/runtime/routes/events-routes.ts +90 -57
- package/src/runtime/routes/global-search-routes.ts +266 -0
- package/src/runtime/routes/guardian-action-routes.ts +147 -56
- package/src/runtime/routes/guardian-approval-interception.ts +255 -880
- package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
- package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
- package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
- package/src/runtime/routes/identity-routes.ts +71 -42
- package/src/runtime/routes/inbound-conversation.ts +17 -11
- package/src/runtime/routes/inbound-message-handler.ts +278 -1460
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
- package/src/runtime/routes/ingress-routes.ts +34 -23
- package/src/runtime/routes/integration-routes.ts +60 -21
- package/src/runtime/routes/migration-routes.ts +434 -0
- package/src/runtime/routes/pairing-routes.ts +157 -79
- package/src/runtime/routes/secret-routes.ts +6 -2
- package/src/runtime/routes/twilio-routes.ts +443 -249
- package/src/runtime/tool-grant-request-helper.ts +36 -27
- package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
- package/src/schedule/integration-status.ts +44 -9
- package/src/schedule/recurrence-engine.ts +47 -24
- package/src/schedule/recurrence-types.ts +12 -7
- package/src/schedule/schedule-store.ts +166 -83
- package/src/schedule/scheduler.ts +26 -22
- package/src/security/encrypted-store.ts +68 -38
- package/src/security/keychain.ts +183 -120
- package/src/security/oauth-callback-registry.ts +3 -3
- package/src/security/oauth2.ts +226 -138
- package/src/security/redaction.ts +24 -24
- package/src/security/secret-allowlist.ts +46 -21
- package/src/security/secret-ingress.ts +15 -7
- package/src/security/secret-scanner.ts +193 -104
- package/src/security/secure-keys.ts +9 -3
- package/src/security/token-manager.ts +99 -40
- package/src/security/tool-approval-digest.ts +3 -3
- package/src/sequence/analytics.ts +52 -27
- package/src/sequence/engine.ts +135 -72
- package/src/sequence/guardrails.ts +32 -20
- package/src/sequence/importer.ts +75 -37
- package/src/sequence/reply-matcher.ts +36 -18
- package/src/sequence/store.ts +137 -75
- package/src/sequence/types.ts +30 -16
- package/src/services/published-app-updater.ts +26 -16
- package/src/services/vercel-deploy.ts +19 -15
- package/src/skills/active-skill-tools.ts +3 -3
- package/src/skills/clawhub.ts +178 -90
- package/src/skills/include-graph.ts +24 -17
- package/src/skills/managed-store.ts +89 -42
- package/src/skills/path-classifier.ts +10 -10
- package/src/skills/remote-skill-policy.ts +31 -22
- package/src/skills/slash-commands.ts +36 -30
- package/src/skills/tool-manifest.ts +60 -31
- package/src/skills/version-hash.ts +25 -15
- package/src/slack/slack-webhook.ts +19 -15
- package/src/subagent/index.ts +4 -8
- package/src/subagent/manager.ts +119 -69
- package/src/subagent/types.ts +9 -12
- package/src/swarm/backend-claude-code.ts +124 -45
- package/src/swarm/checkpoint.ts +36 -16
- package/src/swarm/graph-utils.ts +1 -3
- package/src/swarm/index.ts +38 -19
- package/src/swarm/limits.ts +13 -4
- package/src/swarm/orchestrator.ts +108 -57
- package/src/swarm/plan-validator.ts +23 -17
- package/src/swarm/router-planner.ts +51 -22
- package/src/swarm/router-prompts.ts +4 -1
- package/src/swarm/synthesizer.ts +26 -18
- package/src/swarm/types.ts +14 -4
- package/src/swarm/worker-backend.ts +36 -26
- package/src/swarm/worker-prompts.ts +13 -9
- package/src/swarm/worker-runner.ts +40 -34
- package/src/tasks/candidate-store.ts +14 -6
- package/src/tasks/ephemeral-permissions.ts +9 -5
- package/src/tasks/task-compiler.ts +41 -38
- package/src/tasks/task-runner.ts +54 -26
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/task-store.ts +20 -7
- package/src/tasks/tool-sanitizer.ts +3 -3
- package/src/tools/apps/definitions.ts +23 -15
- package/src/tools/apps/executors.ts +118 -37
- package/src/tools/apps/open-proxy.ts +5 -5
- package/src/tools/apps/registry.ts +2 -2
- package/src/tools/assets/materialize.ts +59 -41
- package/src/tools/assets/search.ts +86 -48
- package/src/tools/browser/api-map.ts +52 -36
- package/src/tools/browser/auth-cache.ts +21 -18
- package/src/tools/browser/auth-detector.ts +43 -28
- package/src/tools/browser/auto-navigate.ts +149 -68
- package/src/tools/browser/browser-execution.ts +9 -3
- package/src/tools/browser/headless-browser.ts +287 -150
- package/src/tools/browser/jit-auth.ts +37 -21
- package/src/tools/browser/network-recorder.ts +138 -56
- package/src/tools/browser/recording-store.ts +22 -15
- package/src/tools/browser/runtime-check.ts +8 -5
- package/src/tools/browser/x-auto-navigate.ts +88 -47
- package/src/tools/calls/call-end.ts +9 -6
- package/src/tools/calls/call-start.ts +30 -20
- package/src/tools/calls/call-status.ts +8 -5
- package/src/tools/claude-code/claude-code.ts +301 -165
- package/src/tools/computer-use/definitions.ts +159 -130
- package/src/tools/computer-use/registry.ts +2 -2
- package/src/tools/computer-use/request-computer-control.ts +21 -13
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/credentials/account-registry.ts +52 -35
- package/src/tools/credentials/broker-types.ts +1 -1
- package/src/tools/credentials/broker.ts +97 -55
- package/src/tools/credentials/domain-policy.ts +5 -2
- package/src/tools/credentials/host-pattern-match.ts +15 -8
- package/src/tools/credentials/metadata-store.ts +93 -43
- package/src/tools/credentials/policy-types.ts +5 -2
- package/src/tools/credentials/policy-validate.ts +21 -14
- package/src/tools/credentials/post-connect-hooks.ts +18 -7
- package/src/tools/credentials/resolve.ts +11 -10
- package/src/tools/credentials/selection.ts +30 -25
- package/src/tools/credentials/tool-policy.ts +5 -2
- package/src/tools/credentials/vault.ts +452 -183
- package/src/tools/document/document-tool.ts +23 -17
- package/src/tools/document/editor-template.ts +12 -7
- package/src/tools/execution-target.ts +13 -10
- package/src/tools/execution-timeout.ts +6 -5
- package/src/tools/executor.ts +141 -74
- package/src/tools/filesystem/edit.ts +82 -45
- package/src/tools/filesystem/fuzzy-match.ts +70 -32
- package/src/tools/filesystem/read.ts +46 -28
- package/src/tools/filesystem/view-image.ts +86 -42
- package/src/tools/filesystem/write.ts +53 -32
- package/src/tools/followups/followup_create.ts +43 -17
- package/src/tools/followups/followup_list.ts +28 -13
- package/src/tools/followups/followup_resolve.ts +9 -6
- package/src/tools/guardian-control-plane-policy.ts +15 -14
- package/src/tools/host-filesystem/edit.ts +77 -42
- package/src/tools/host-filesystem/read.ts +52 -33
- package/src/tools/host-filesystem/write.ts +50 -29
- package/src/tools/host-terminal/host-shell.ts +97 -61
- package/src/tools/mcp/mcp-tool-factory.ts +21 -14
- package/src/tools/memory/definitions.ts +60 -28
- package/src/tools/memory/handlers.ts +149 -77
- package/src/tools/memory/register.ts +39 -16
- package/src/tools/network/__tests__/web-search.test.ts +236 -177
- package/src/tools/network/domain-normalize.ts +13 -9
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
- package/src/tools/network/script-proxy/index.ts +1 -17
- package/src/tools/network/script-proxy/session-manager.ts +151 -84
- package/src/tools/network/url-safety.ts +56 -34
- package/src/tools/network/web-fetch.ts +273 -155
- package/src/tools/network/web-search.ts +166 -81
- package/src/tools/permission-checker.ts +6 -25
- package/src/tools/policy-context.ts +8 -5
- package/src/tools/registry.ts +73 -46
- package/src/tools/reminder/reminder-store.ts +65 -44
- package/src/tools/reminder/reminder.ts +76 -35
- package/src/tools/schedule/create.ts +44 -21
- package/src/tools/schedule/delete.ts +8 -5
- package/src/tools/schedule/list.ts +39 -19
- package/src/tools/schedule/update.ts +49 -26
- package/src/tools/secret-detection-handler.ts +130 -49
- package/src/tools/sensitive-output-placeholders.ts +15 -8
- package/src/tools/shared/filesystem/edit-engine.ts +45 -14
- package/src/tools/shared/filesystem/errors.ts +18 -18
- package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
- package/src/tools/shared/filesystem/format-diff.ts +21 -11
- package/src/tools/shared/filesystem/path-policy.ts +17 -13
- package/src/tools/shared/filesystem/size-guard.ts +8 -4
- package/src/tools/shared/filesystem/types.ts +2 -2
- package/src/tools/shared/shell-output.ts +4 -3
- package/src/tools/side-effects.ts +36 -28
- package/src/tools/skills/delete-managed.ts +30 -17
- package/src/tools/skills/load.ts +88 -46
- package/src/tools/skills/sandbox-runner.ts +62 -46
- package/src/tools/skills/scaffold-managed.ts +98 -48
- package/src/tools/skills/script-contract.ts +5 -2
- package/src/tools/skills/skill-script-runner.ts +29 -13
- package/src/tools/skills/skill-tool-factory.ts +20 -10
- package/src/tools/subagent/abort.ts +10 -4
- package/src/tools/subagent/message.ts +14 -8
- package/src/tools/subagent/read.ts +20 -11
- package/src/tools/subagent/spawn.ts +14 -6
- package/src/tools/subagent/status.ts +7 -4
- package/src/tools/swarm/delegate.ts +75 -49
- package/src/tools/system/avatar-generator.ts +46 -33
- package/src/tools/system/navigate-settings.ts +29 -19
- package/src/tools/system/open-system-settings.ts +30 -20
- package/src/tools/system/request-permission.ts +59 -44
- package/src/tools/system/version.ts +27 -16
- package/src/tools/system/voice-config.ts +116 -53
- package/src/tools/tasks/index.ts +8 -8
- package/src/tools/tasks/task-delete.ts +61 -22
- package/src/tools/tasks/task-list.ts +23 -11
- package/src/tools/tasks/task-run.ts +41 -16
- package/src/tools/tasks/task-save.ts +27 -10
- package/src/tools/tasks/work-item-enqueue.ts +114 -48
- package/src/tools/tasks/work-item-list.ts +20 -10
- package/src/tools/tasks/work-item-remove.ts +49 -15
- package/src/tools/tasks/work-item-run.ts +34 -13
- package/src/tools/tasks/work-item-update.ts +84 -31
- package/src/tools/terminal/backends/native.ts +64 -35
- package/src/tools/terminal/backends/types.ts +6 -2
- package/src/tools/terminal/parser.ts +200 -125
- package/src/tools/terminal/safe-env.ts +27 -21
- package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
- package/src/tools/terminal/sandbox.ts +10 -6
- package/src/tools/terminal/shell.ts +124 -68
- package/src/tools/tool-approval-handler.ts +193 -138
- package/src/tools/types.ts +43 -23
- package/src/tools/ui-surface/definitions.ts +124 -89
- package/src/tools/ui-surface/registry.ts +2 -2
- package/src/tools/watch/screen-watch.ts +50 -32
- package/src/tools/watch/watch-state.ts +41 -15
- package/src/tools/watcher/create.ts +37 -15
- package/src/tools/watcher/delete.ts +9 -6
- package/src/tools/watcher/digest.ts +10 -6
- package/src/tools/watcher/list.ts +37 -14
- package/src/tools/watcher/update.ts +33 -18
- package/src/tools/weather/service.ts +331 -174
- package/src/twitter/client.ts +261 -138
- package/src/twitter/oauth-client.ts +17 -13
- package/src/twitter/router.ts +51 -23
- package/src/twitter/session.ts +27 -18
- package/src/types/qrcode.d.ts +6 -3
- package/src/usage/actors.ts +16 -16
- package/src/usage/types.ts +3 -3
- package/src/util/bundled-asset.ts +10 -6
- package/src/util/canonicalize-identity.ts +11 -4
- package/src/util/clipboard.ts +7 -7
- package/src/util/content-id.ts +3 -3
- package/src/util/debounce.ts +3 -2
- package/src/util/diff.ts +55 -33
- package/src/util/errors.ts +26 -26
- package/src/util/fs.ts +8 -2
- package/src/util/log-redact.ts +12 -12
- package/src/util/logger.ts +112 -51
- package/src/util/network-info.ts +13 -5
- package/src/util/object.ts +4 -2
- package/src/util/phone.ts +4 -4
- package/src/util/platform.ts +80 -58
- package/src/util/pricing.ts +49 -31
- package/src/util/retry.ts +18 -7
- package/src/util/row-mapper.ts +7 -4
- package/src/util/silently.ts +7 -4
- package/src/util/spawn.ts +48 -0
- package/src/util/spinner.ts +9 -7
- package/src/util/time.ts +16 -3
- package/src/util/truncate.ts +1 -1
- package/src/util/voice-code.ts +6 -4
- package/src/util/xml.ts +5 -1
- package/src/version.ts +12 -8
- package/src/watcher/engine.ts +71 -44
- package/src/watcher/provider-registry.ts +1 -1
- package/src/watcher/providers/github.ts +40 -23
- package/src/watcher/providers/gmail.ts +59 -38
- package/src/watcher/providers/google-calendar.ts +62 -48
- package/src/watcher/providers/linear.ts +219 -150
- package/src/watcher/providers/slack.ts +93 -27
- package/src/watcher/watcher-store.ts +75 -55
- package/src/work-items/work-item-runner.ts +62 -29
- package/src/work-items/work-item-store.ts +137 -47
- package/src/workspace/commit-message-enrichment-service.ts +65 -25
- package/src/workspace/commit-message-provider.ts +14 -12
- package/src/workspace/git-service.ts +355 -239
- package/src/workspace/heartbeat-service.ts +74 -37
- package/src/workspace/provider-commit-message-generator.ts +95 -70
- package/src/workspace/top-level-renderer.ts +10 -8
- package/src/workspace/top-level-scanner.ts +9 -3
- package/src/workspace/turn-commit.ts +63 -36
- package/src/__tests__/ingress-member-store.test.ts +0 -294
- package/src/__tests__/script-proxy-router.test.ts +0 -215
- package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
- package/src/memory/guardian-bindings.ts +0 -158
- package/src/memory/ingress-member-store.ts +0 -352
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
- package/src/tools/network/script-proxy/certs.ts +0 -7
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
- package/src/tools/network/script-proxy/logging.ts +0 -12
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
- package/src/tools/network/script-proxy/policy.ts +0 -4
- package/src/tools/network/script-proxy/router.ts +0 -2
- package/src/tools/network/script-proxy/server.ts +0 -5
- package/src/tools/network/script-proxy/types.ts +0 -19
|
@@ -6,27 +6,43 @@
|
|
|
6
6
|
* with the AgentLoop (which runs inference via the Anthropic API with CU tools).
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { v4 as uuid } from
|
|
10
|
-
|
|
11
|
-
import { AgentLoop } from
|
|
12
|
-
import { buildComputerUseSystemPrompt } from
|
|
13
|
-
import { getConfig } from
|
|
14
|
-
import { PermissionPrompter } from
|
|
15
|
-
import { SecretPrompter } from
|
|
16
|
-
import type { UserDecision } from
|
|
17
|
-
import type {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
|
|
9
|
+
import { v4 as uuid } from "uuid";
|
|
10
|
+
|
|
11
|
+
import { AgentLoop } from "../agent/loop.js";
|
|
12
|
+
import { buildComputerUseSystemPrompt } from "../config/computer-use-prompt.js";
|
|
13
|
+
import { getConfig } from "../config/loader.js";
|
|
14
|
+
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
15
|
+
import { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
16
|
+
import type { UserDecision } from "../permissions/types.js";
|
|
17
|
+
import type {
|
|
18
|
+
ContentBlock,
|
|
19
|
+
Message,
|
|
20
|
+
Provider,
|
|
21
|
+
ToolDefinition,
|
|
22
|
+
} from "../providers/types.js";
|
|
23
|
+
import { allComputerUseTools } from "../tools/computer-use/definitions.js";
|
|
24
|
+
import { ToolExecutor } from "../tools/executor.js";
|
|
25
|
+
import { registerSkillTools } from "../tools/registry.js";
|
|
26
|
+
import type { Tool, ToolExecutionResult } from "../tools/types.js";
|
|
27
|
+
import { allUiSurfaceTools } from "../tools/ui-surface/definitions.js";
|
|
28
|
+
import { getLogger } from "../util/logger.js";
|
|
29
|
+
import { getSandboxWorkingDir } from "../util/platform.js";
|
|
30
|
+
import type {
|
|
31
|
+
CuObservation,
|
|
32
|
+
FileUploadSurfaceData,
|
|
33
|
+
ServerMessage,
|
|
34
|
+
SurfaceData,
|
|
35
|
+
SurfaceType,
|
|
36
|
+
UiSurfaceShow,
|
|
37
|
+
} from "./ipc-protocol.js";
|
|
38
|
+
import { INTERACTIVE_SURFACE_TYPES } from "./ipc-protocol.js";
|
|
39
|
+
import {
|
|
40
|
+
projectSkillTools,
|
|
41
|
+
resetSkillToolProjection,
|
|
42
|
+
type SkillProjectionCache,
|
|
43
|
+
} from "./session-skill-tools.js";
|
|
44
|
+
|
|
45
|
+
const log = getLogger("computer-use-session");
|
|
30
46
|
|
|
31
47
|
const MAX_STEPS = 50;
|
|
32
48
|
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
@@ -39,9 +55,14 @@ const MAX_AX_TREES_IN_HISTORY = 2;
|
|
|
39
55
|
|
|
40
56
|
/** Regex that matches the `<ax-tree>…</ax-tree>` markers injected by buildObservationResultContent. */
|
|
41
57
|
const AX_TREE_PATTERN = /<ax-tree>[\s\S]*?<\/ax-tree>/g;
|
|
42
|
-
const AX_TREE_PLACEHOLDER =
|
|
58
|
+
const AX_TREE_PLACEHOLDER = "<ax_tree_omitted />";
|
|
43
59
|
|
|
44
|
-
type SessionState =
|
|
60
|
+
type SessionState =
|
|
61
|
+
| "idle"
|
|
62
|
+
| "awaiting_observation"
|
|
63
|
+
| "inferring"
|
|
64
|
+
| "complete"
|
|
65
|
+
| "error";
|
|
45
66
|
|
|
46
67
|
interface ActionRecord {
|
|
47
68
|
step: number;
|
|
@@ -58,13 +79,13 @@ export class ComputerUseSession {
|
|
|
58
79
|
private readonly screenHeight: number;
|
|
59
80
|
private readonly provider: Provider;
|
|
60
81
|
private sendToClient: (msg: ServerMessage) => void;
|
|
61
|
-
private readonly interactionType:
|
|
82
|
+
private readonly interactionType: "computer_use" | "text_qa";
|
|
62
83
|
private readonly onTerminal?: (sessionId: string) => void;
|
|
63
84
|
private readonly preactivatedSkillIds: string[];
|
|
64
85
|
private readonly skillProjectionState = new Map<string, string>();
|
|
65
86
|
private readonly skillProjectionCache: SkillProjectionCache = {};
|
|
66
87
|
|
|
67
|
-
private state: SessionState =
|
|
88
|
+
private state: SessionState = "idle";
|
|
68
89
|
private stepCount = 0;
|
|
69
90
|
private actionHistory: ActionRecord[] = [];
|
|
70
91
|
private previousAXTree: string | undefined;
|
|
@@ -76,10 +97,16 @@ export class ComputerUseSession {
|
|
|
76
97
|
resolve: (result: ToolExecutionResult) => void;
|
|
77
98
|
} | null = null;
|
|
78
99
|
|
|
79
|
-
private pendingSurfaceActions = new Map<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
100
|
+
private pendingSurfaceActions = new Map<
|
|
101
|
+
string,
|
|
102
|
+
{
|
|
103
|
+
resolve: (result: ToolExecutionResult) => void;
|
|
104
|
+
}
|
|
105
|
+
>();
|
|
106
|
+
private surfaceState = new Map<
|
|
107
|
+
string,
|
|
108
|
+
{ surfaceType: SurfaceType; data: SurfaceData; title?: string }
|
|
109
|
+
>();
|
|
83
110
|
private terminalNotified = false;
|
|
84
111
|
private prompter: PermissionPrompter | null = null;
|
|
85
112
|
|
|
@@ -93,7 +120,7 @@ export class ComputerUseSession {
|
|
|
93
120
|
screenHeight: number,
|
|
94
121
|
provider: Provider,
|
|
95
122
|
sendToClient: (msg: ServerMessage) => void,
|
|
96
|
-
interactionType?:
|
|
123
|
+
interactionType?: "computer_use" | "text_qa",
|
|
97
124
|
onTerminal?: (sessionId: string) => void,
|
|
98
125
|
preactivatedSkillIds?: string[],
|
|
99
126
|
) {
|
|
@@ -103,9 +130,9 @@ export class ComputerUseSession {
|
|
|
103
130
|
this.screenHeight = screenHeight;
|
|
104
131
|
this.provider = provider;
|
|
105
132
|
this.sendToClient = sendToClient;
|
|
106
|
-
this.interactionType = interactionType ??
|
|
133
|
+
this.interactionType = interactionType ?? "computer_use";
|
|
107
134
|
this.onTerminal = onTerminal;
|
|
108
|
-
this.preactivatedSkillIds = preactivatedSkillIds ?? [
|
|
135
|
+
this.preactivatedSkillIds = preactivatedSkillIds ?? ["computer-use"];
|
|
109
136
|
}
|
|
110
137
|
|
|
111
138
|
// ---------------------------------------------------------------------------
|
|
@@ -113,8 +140,11 @@ export class ComputerUseSession {
|
|
|
113
140
|
// ---------------------------------------------------------------------------
|
|
114
141
|
|
|
115
142
|
async handleObservation(obs: CuObservation): Promise<void> {
|
|
116
|
-
if (this.state ===
|
|
117
|
-
log.warn(
|
|
143
|
+
if (this.state === "complete" || this.state === "error") {
|
|
144
|
+
log.warn(
|
|
145
|
+
{ sessionId: this.sessionId, state: this.state },
|
|
146
|
+
"Observation received after session ended",
|
|
147
|
+
);
|
|
118
148
|
return;
|
|
119
149
|
}
|
|
120
150
|
|
|
@@ -133,13 +163,19 @@ export class ComputerUseSession {
|
|
|
133
163
|
this.previousAXTree = obs.axTree;
|
|
134
164
|
}
|
|
135
165
|
|
|
136
|
-
if (this.state ===
|
|
166
|
+
if (this.state === "awaiting_observation" && this.pendingObservation) {
|
|
137
167
|
// Resolve the pending proxy tool result with updated screen context
|
|
138
|
-
const content = this.buildObservationResultContent(
|
|
168
|
+
const content = this.buildObservationResultContent(
|
|
169
|
+
obs,
|
|
170
|
+
hadPreviousAXTree,
|
|
171
|
+
);
|
|
139
172
|
const result: ToolExecutionResult = obs.executionError
|
|
140
|
-
? {
|
|
173
|
+
? {
|
|
174
|
+
content: `Action failed: ${obs.executionError}\n\n${content}`,
|
|
175
|
+
isError: true,
|
|
176
|
+
}
|
|
141
177
|
: { content, isError: false };
|
|
142
|
-
this.state =
|
|
178
|
+
this.state = "inferring";
|
|
143
179
|
this.pendingObservation.resolve(result);
|
|
144
180
|
this.pendingObservation = null;
|
|
145
181
|
// The agent loop continues automatically after resolution
|
|
@@ -147,12 +183,15 @@ export class ComputerUseSession {
|
|
|
147
183
|
}
|
|
148
184
|
|
|
149
185
|
// First observation — start the agent loop
|
|
150
|
-
this.state =
|
|
186
|
+
this.state = "inferring";
|
|
151
187
|
this.abortController = new AbortController();
|
|
152
188
|
|
|
153
189
|
// Safety net: abort the session if it runs longer than SESSION_TIMEOUT_MS
|
|
154
190
|
this.sessionTimer = setTimeout(() => {
|
|
155
|
-
log.warn(
|
|
191
|
+
log.warn(
|
|
192
|
+
{ sessionId: this.sessionId, timeoutMs: SESSION_TIMEOUT_MS },
|
|
193
|
+
"Session timeout reached, aborting",
|
|
194
|
+
);
|
|
156
195
|
this.abort();
|
|
157
196
|
}, SESSION_TIMEOUT_MS);
|
|
158
197
|
|
|
@@ -161,15 +200,18 @@ export class ComputerUseSession {
|
|
|
161
200
|
// Catches errors from setup code (e.g. skill projection failures) that
|
|
162
201
|
// occur before runAgentLoop's internal try-catch takes over.
|
|
163
202
|
const message = err instanceof Error ? err.message : String(err);
|
|
164
|
-
log.error(
|
|
203
|
+
log.error(
|
|
204
|
+
{ err, sessionId: this.sessionId },
|
|
205
|
+
"Agent loop startup failed",
|
|
206
|
+
);
|
|
165
207
|
if (this.sessionTimer) {
|
|
166
208
|
clearTimeout(this.sessionTimer);
|
|
167
209
|
this.sessionTimer = null;
|
|
168
210
|
}
|
|
169
|
-
if (this.state !==
|
|
170
|
-
this.state =
|
|
211
|
+
if (this.state !== "complete" && this.state !== "error") {
|
|
212
|
+
this.state = "error";
|
|
171
213
|
this.sendToClient({
|
|
172
|
-
type:
|
|
214
|
+
type: "cu_error",
|
|
173
215
|
sessionId: this.sessionId,
|
|
174
216
|
message,
|
|
175
217
|
});
|
|
@@ -181,9 +223,9 @@ export class ComputerUseSession {
|
|
|
181
223
|
}
|
|
182
224
|
|
|
183
225
|
abort(): void {
|
|
184
|
-
if (this.state ===
|
|
226
|
+
if (this.state === "complete" || this.state === "error") return;
|
|
185
227
|
|
|
186
|
-
log.info({ sessionId: this.sessionId },
|
|
228
|
+
log.info({ sessionId: this.sessionId }, "Aborting computer-use session");
|
|
187
229
|
if (this.sessionTimer) {
|
|
188
230
|
clearTimeout(this.sessionTimer);
|
|
189
231
|
this.sessionTimer = null;
|
|
@@ -192,7 +234,10 @@ export class ComputerUseSession {
|
|
|
192
234
|
|
|
193
235
|
// If waiting for an observation, resolve it as cancelled
|
|
194
236
|
if (this.pendingObservation) {
|
|
195
|
-
this.pendingObservation.resolve({
|
|
237
|
+
this.pendingObservation.resolve({
|
|
238
|
+
content: "Session aborted",
|
|
239
|
+
isError: true,
|
|
240
|
+
});
|
|
196
241
|
this.pendingObservation = null;
|
|
197
242
|
}
|
|
198
243
|
|
|
@@ -201,22 +246,22 @@ export class ComputerUseSession {
|
|
|
201
246
|
|
|
202
247
|
// Resolve any pending surface actions
|
|
203
248
|
for (const [, pending] of this.pendingSurfaceActions) {
|
|
204
|
-
pending.resolve({ content:
|
|
249
|
+
pending.resolve({ content: "Session aborted", isError: true });
|
|
205
250
|
}
|
|
206
251
|
this.pendingSurfaceActions.clear();
|
|
207
252
|
this.surfaceState.clear();
|
|
208
253
|
|
|
209
|
-
this.state =
|
|
254
|
+
this.state = "error";
|
|
210
255
|
this.sendToClient({
|
|
211
|
-
type:
|
|
256
|
+
type: "cu_error",
|
|
212
257
|
sessionId: this.sessionId,
|
|
213
|
-
message:
|
|
258
|
+
message: "Session aborted by user",
|
|
214
259
|
});
|
|
215
260
|
this.notifyTerminal();
|
|
216
261
|
}
|
|
217
262
|
|
|
218
263
|
isComplete(): boolean {
|
|
219
|
-
return this.state ===
|
|
264
|
+
return this.state === "complete";
|
|
220
265
|
}
|
|
221
266
|
|
|
222
267
|
getState(): string {
|
|
@@ -230,7 +275,9 @@ export class ComputerUseSession {
|
|
|
230
275
|
*/
|
|
231
276
|
private getProjectedCuToolDefinitions(): ToolDefinition[] | null {
|
|
232
277
|
if (this.preactivatedSkillIds.length === 0) {
|
|
233
|
-
log.warn(
|
|
278
|
+
log.warn(
|
|
279
|
+
"No preactivatedSkillIds configured, falling back to legacy CU tools",
|
|
280
|
+
);
|
|
234
281
|
return null;
|
|
235
282
|
}
|
|
236
283
|
|
|
@@ -244,27 +291,34 @@ export class ComputerUseSession {
|
|
|
244
291
|
if (projection.toolDefinitions.length === 0) {
|
|
245
292
|
log.warn(
|
|
246
293
|
{ preactivatedSkillIds: this.preactivatedSkillIds },
|
|
247
|
-
|
|
294
|
+
"Skill projection produced no tool definitions, falling back to legacy CU tools",
|
|
248
295
|
);
|
|
249
296
|
return null;
|
|
250
297
|
}
|
|
251
298
|
|
|
252
299
|
return projection.toolDefinitions;
|
|
253
300
|
} catch (err) {
|
|
254
|
-
log.warn(
|
|
301
|
+
log.warn(
|
|
302
|
+
{ err },
|
|
303
|
+
"Skill projection failed, falling back to legacy CU tools",
|
|
304
|
+
);
|
|
255
305
|
return null;
|
|
256
306
|
}
|
|
257
307
|
}
|
|
258
308
|
|
|
259
|
-
handleSurfaceAction(
|
|
309
|
+
handleSurfaceAction(
|
|
310
|
+
surfaceId: string,
|
|
311
|
+
actionId: string,
|
|
312
|
+
data?: Record<string, unknown>,
|
|
313
|
+
): void {
|
|
260
314
|
const pending = this.pendingSurfaceActions.get(surfaceId);
|
|
261
315
|
if (!pending) {
|
|
262
|
-
log.warn({ surfaceId, actionId },
|
|
316
|
+
log.warn({ surfaceId, actionId }, "No pending surface action found");
|
|
263
317
|
return;
|
|
264
318
|
}
|
|
265
319
|
// selection_changed is a non-terminal state update — don't consume the
|
|
266
320
|
// pending entry. The selection state will be in the action button payload.
|
|
267
|
-
if (actionId ===
|
|
321
|
+
if (actionId === "selection_changed") {
|
|
268
322
|
return;
|
|
269
323
|
}
|
|
270
324
|
this.pendingSurfaceActions.delete(surfaceId);
|
|
@@ -279,7 +333,10 @@ export class ComputerUseSession {
|
|
|
279
333
|
// ---------------------------------------------------------------------------
|
|
280
334
|
|
|
281
335
|
private async runAgentLoop(messages: Message[]): Promise<void> {
|
|
282
|
-
const systemPrompt = buildComputerUseSystemPrompt(
|
|
336
|
+
const systemPrompt = buildComputerUseSystemPrompt(
|
|
337
|
+
this.screenWidth,
|
|
338
|
+
this.screenHeight,
|
|
339
|
+
);
|
|
283
340
|
|
|
284
341
|
let cuToolDefs = this.getProjectedCuToolDefinitions();
|
|
285
342
|
if (!cuToolDefs) {
|
|
@@ -288,23 +345,23 @@ export class ComputerUseSession {
|
|
|
288
345
|
// ownerSkillId as the bundled computer-use skill. This avoids
|
|
289
346
|
// core-vs-skill collisions that would permanently block skill
|
|
290
347
|
// projection recovery on subsequent sessions.
|
|
291
|
-
const fallbackSkillId = this.preactivatedSkillIds[0] ??
|
|
348
|
+
const fallbackSkillId = this.preactivatedSkillIds[0] ?? "computer-use";
|
|
292
349
|
const fallbackTools: Tool[] = allComputerUseTools.map((t) => ({
|
|
293
350
|
...t,
|
|
294
|
-
origin:
|
|
351
|
+
origin: "skill" as const,
|
|
295
352
|
ownerSkillId: fallbackSkillId,
|
|
296
353
|
ownerSkillBundled: true,
|
|
297
354
|
}));
|
|
298
355
|
registerSkillTools(fallbackTools);
|
|
299
356
|
// Track in the session map so resetSkillToolProjection cleans up
|
|
300
|
-
this.skillProjectionState.set(fallbackSkillId,
|
|
357
|
+
this.skillProjectionState.set(fallbackSkillId, "fallback");
|
|
301
358
|
cuToolDefs = allComputerUseTools.map((t) => t.getDefinition());
|
|
302
359
|
}
|
|
303
360
|
|
|
304
361
|
const toolDefs: ToolDefinition[] = [
|
|
305
362
|
...cuToolDefs,
|
|
306
363
|
...allUiSurfaceTools
|
|
307
|
-
.filter((t) => t.name !==
|
|
364
|
+
.filter((t) => t.name !== "request_file")
|
|
308
365
|
.map((t) => t.getDefinition()),
|
|
309
366
|
];
|
|
310
367
|
|
|
@@ -318,37 +375,47 @@ export class ComputerUseSession {
|
|
|
318
375
|
input: Record<string, unknown>,
|
|
319
376
|
): Promise<ToolExecutionResult> => {
|
|
320
377
|
// ── Surface tool proxying ──────────────────────────────────────
|
|
321
|
-
if (toolName ===
|
|
378
|
+
if (toolName === "ui_show") {
|
|
322
379
|
const surfaceId = uuid();
|
|
323
380
|
const surfaceType = input.surface_type as SurfaceType;
|
|
324
|
-
const title = typeof input.title ===
|
|
381
|
+
const title = typeof input.title === "string" ? input.title : undefined;
|
|
325
382
|
const data = input.data as SurfaceData;
|
|
326
|
-
const actions = input.actions as
|
|
383
|
+
const actions = input.actions as
|
|
384
|
+
| Array<{ id: string; label: string; style?: string }>
|
|
385
|
+
| undefined;
|
|
327
386
|
// Interactive surfaces default to awaiting user action.
|
|
328
387
|
// Tables and lists only block when explicit action buttons are provided;
|
|
329
388
|
// selectionMode alone should not gate blocking because selection_changed
|
|
330
389
|
// fires on every click and would immediately resolve multi-select surfaces.
|
|
331
390
|
const hasActions = Array.isArray(actions) && actions.length > 0;
|
|
332
|
-
const isInteractive =
|
|
333
|
-
|
|
334
|
-
: surfaceType === 'list'
|
|
391
|
+
const isInteractive =
|
|
392
|
+
surfaceType === "card"
|
|
335
393
|
? hasActions
|
|
336
|
-
: surfaceType ===
|
|
394
|
+
: surfaceType === "list"
|
|
337
395
|
? hasActions
|
|
338
|
-
:
|
|
396
|
+
: surfaceType === "table"
|
|
397
|
+
? hasActions
|
|
398
|
+
: INTERACTIVE_SURFACE_TYPES.includes(surfaceType);
|
|
339
399
|
const awaitAction = (input.await_action as boolean) ?? isInteractive;
|
|
340
400
|
|
|
341
401
|
// Track surface state for ui_update merging
|
|
342
402
|
this.surfaceState.set(surfaceId, { surfaceType, data, title });
|
|
343
403
|
|
|
344
404
|
this.sendToClient({
|
|
345
|
-
type:
|
|
405
|
+
type: "ui_surface_show",
|
|
346
406
|
sessionId: this.sessionId,
|
|
347
407
|
surfaceId,
|
|
348
408
|
surfaceType,
|
|
349
409
|
title,
|
|
350
410
|
data,
|
|
351
|
-
actions: actions?.map(a => ({
|
|
411
|
+
actions: actions?.map((a) => ({
|
|
412
|
+
id: a.id,
|
|
413
|
+
label: a.label,
|
|
414
|
+
style: (a.style ?? "secondary") as
|
|
415
|
+
| "primary"
|
|
416
|
+
| "secondary"
|
|
417
|
+
| "destructive",
|
|
418
|
+
})),
|
|
352
419
|
} as unknown as UiSurfaceShow);
|
|
353
420
|
|
|
354
421
|
if (awaitAction) {
|
|
@@ -359,7 +426,7 @@ export class ComputerUseSession {
|
|
|
359
426
|
return { content: JSON.stringify({ surfaceId }), isError: false };
|
|
360
427
|
}
|
|
361
428
|
|
|
362
|
-
if (toolName ===
|
|
429
|
+
if (toolName === "ui_update") {
|
|
363
430
|
const surfaceId = input.surface_id as string;
|
|
364
431
|
const patch = input.data as Record<string, unknown>;
|
|
365
432
|
|
|
@@ -374,32 +441,38 @@ export class ComputerUseSession {
|
|
|
374
441
|
}
|
|
375
442
|
|
|
376
443
|
this.sendToClient({
|
|
377
|
-
type:
|
|
444
|
+
type: "ui_surface_update",
|
|
378
445
|
sessionId: this.sessionId,
|
|
379
446
|
surfaceId,
|
|
380
447
|
data: mergedData,
|
|
381
448
|
});
|
|
382
|
-
return { content:
|
|
449
|
+
return { content: "Surface updated", isError: false };
|
|
383
450
|
}
|
|
384
451
|
|
|
385
|
-
if (toolName ===
|
|
452
|
+
if (toolName === "ui_dismiss") {
|
|
386
453
|
const surfaceId = input.surface_id as string;
|
|
387
454
|
this.sendToClient({
|
|
388
|
-
type:
|
|
455
|
+
type: "ui_surface_dismiss",
|
|
389
456
|
sessionId: this.sessionId,
|
|
390
457
|
surfaceId,
|
|
391
458
|
});
|
|
392
459
|
this.pendingSurfaceActions.delete(surfaceId);
|
|
393
460
|
this.surfaceState.delete(surfaceId);
|
|
394
|
-
return { content:
|
|
461
|
+
return { content: "Surface dismissed", isError: false };
|
|
395
462
|
}
|
|
396
463
|
|
|
397
464
|
// ── File request proxying ──────────────────────────────────────
|
|
398
|
-
if (toolName ===
|
|
465
|
+
if (toolName === "request_file") {
|
|
399
466
|
const surfaceId = uuid();
|
|
400
|
-
const prompt =
|
|
401
|
-
|
|
402
|
-
|
|
467
|
+
const prompt =
|
|
468
|
+
typeof input.prompt === "string"
|
|
469
|
+
? input.prompt
|
|
470
|
+
: "Please share a file";
|
|
471
|
+
const acceptedTypes = Array.isArray(input.accepted_types)
|
|
472
|
+
? (input.accepted_types as string[])
|
|
473
|
+
: undefined;
|
|
474
|
+
const maxFiles =
|
|
475
|
+
typeof input.max_files === "number" ? input.max_files : 1;
|
|
403
476
|
|
|
404
477
|
const data: FileUploadSurfaceData = {
|
|
405
478
|
prompt,
|
|
@@ -407,14 +480,14 @@ export class ComputerUseSession {
|
|
|
407
480
|
maxFiles,
|
|
408
481
|
};
|
|
409
482
|
|
|
410
|
-
this.surfaceState.set(surfaceId, { surfaceType:
|
|
483
|
+
this.surfaceState.set(surfaceId, { surfaceType: "file_upload", data });
|
|
411
484
|
|
|
412
485
|
this.sendToClient({
|
|
413
|
-
type:
|
|
486
|
+
type: "ui_surface_show",
|
|
414
487
|
sessionId: this.sessionId,
|
|
415
488
|
surfaceId,
|
|
416
|
-
surfaceType:
|
|
417
|
-
title:
|
|
489
|
+
surfaceType: "file_upload",
|
|
490
|
+
title: "File Request",
|
|
418
491
|
data,
|
|
419
492
|
} as UiSurfaceShow);
|
|
420
493
|
|
|
@@ -425,7 +498,8 @@ export class ComputerUseSession {
|
|
|
425
498
|
}
|
|
426
499
|
|
|
427
500
|
// ── Computer-use tool proxying ─────────────────────────────────
|
|
428
|
-
const reasoning =
|
|
501
|
+
const reasoning =
|
|
502
|
+
typeof input.reasoning === "string" ? input.reasoning : undefined;
|
|
429
503
|
|
|
430
504
|
// Record action in history
|
|
431
505
|
this.actionHistory.push({
|
|
@@ -436,33 +510,40 @@ export class ComputerUseSession {
|
|
|
436
510
|
});
|
|
437
511
|
|
|
438
512
|
// Check for terminal tools
|
|
439
|
-
if (
|
|
513
|
+
if (
|
|
514
|
+
toolName === "computer_use_done" ||
|
|
515
|
+
toolName === "computer_use_respond"
|
|
516
|
+
) {
|
|
440
517
|
const summary =
|
|
441
|
-
toolName ===
|
|
442
|
-
?
|
|
443
|
-
|
|
518
|
+
toolName === "computer_use_done"
|
|
519
|
+
? typeof input.summary === "string"
|
|
520
|
+
? input.summary
|
|
521
|
+
: "Task completed"
|
|
522
|
+
: typeof input.answer === "string"
|
|
523
|
+
? input.answer
|
|
524
|
+
: "No answer provided";
|
|
444
525
|
|
|
445
526
|
this.sendToClient({
|
|
446
|
-
type:
|
|
527
|
+
type: "cu_complete",
|
|
447
528
|
sessionId: this.sessionId,
|
|
448
529
|
summary,
|
|
449
530
|
stepCount: this.stepCount,
|
|
450
|
-
isResponse: toolName ===
|
|
531
|
+
isResponse: toolName === "computer_use_respond" ? true : undefined,
|
|
451
532
|
});
|
|
452
|
-
this.state =
|
|
533
|
+
this.state = "complete";
|
|
453
534
|
// Stop AgentLoop immediately so terminal tools cannot trigger extra provider calls.
|
|
454
535
|
this.abortController?.abort();
|
|
455
536
|
this.notifyTerminal();
|
|
456
|
-
return { content:
|
|
537
|
+
return { content: "Session complete", isError: false };
|
|
457
538
|
}
|
|
458
539
|
|
|
459
540
|
this.stepCount++;
|
|
460
541
|
|
|
461
542
|
// Enforce step limit — abort the loop so toolChoice:'any' can't force another turn
|
|
462
543
|
if (this.stepCount > MAX_STEPS) {
|
|
463
|
-
this.state =
|
|
544
|
+
this.state = "error";
|
|
464
545
|
this.sendToClient({
|
|
465
|
-
type:
|
|
546
|
+
type: "cu_error",
|
|
466
547
|
sessionId: this.sessionId,
|
|
467
548
|
message: `Step limit (${MAX_STEPS}) exceeded`,
|
|
468
549
|
});
|
|
@@ -473,7 +554,7 @@ export class ComputerUseSession {
|
|
|
473
554
|
|
|
474
555
|
// Send action to client for execution
|
|
475
556
|
this.sendToClient({
|
|
476
|
-
type:
|
|
557
|
+
type: "cu_action",
|
|
477
558
|
sessionId: this.sessionId,
|
|
478
559
|
toolName,
|
|
479
560
|
input,
|
|
@@ -482,7 +563,7 @@ export class ComputerUseSession {
|
|
|
482
563
|
});
|
|
483
564
|
|
|
484
565
|
// Wait for next observation from client
|
|
485
|
-
this.state =
|
|
566
|
+
this.state = "awaiting_observation";
|
|
486
567
|
return new Promise<ToolExecutionResult>((resolve) => {
|
|
487
568
|
this.pendingObservation = { resolve };
|
|
488
569
|
});
|
|
@@ -501,15 +582,20 @@ export class ComputerUseSession {
|
|
|
501
582
|
workingDir: getSandboxWorkingDir(),
|
|
502
583
|
sessionId: this.sessionId,
|
|
503
584
|
conversationId: this.sessionId,
|
|
504
|
-
|
|
585
|
+
trustClass: "guardian",
|
|
505
586
|
proxyToolResolver: proxyResolver,
|
|
506
587
|
allowedToolNames,
|
|
507
588
|
requestSecret: async (params) => {
|
|
508
589
|
return secretPrompter.prompt(
|
|
509
|
-
params.service,
|
|
510
|
-
params.
|
|
590
|
+
params.service,
|
|
591
|
+
params.field,
|
|
592
|
+
params.label,
|
|
593
|
+
params.description,
|
|
594
|
+
params.placeholder,
|
|
511
595
|
this.sessionId,
|
|
512
|
-
params.purpose,
|
|
596
|
+
params.purpose,
|
|
597
|
+
params.allowedTools,
|
|
598
|
+
params.allowedDomains,
|
|
513
599
|
);
|
|
514
600
|
},
|
|
515
601
|
});
|
|
@@ -534,7 +620,7 @@ export class ComputerUseSession {
|
|
|
534
620
|
{
|
|
535
621
|
maxTokens: 4096,
|
|
536
622
|
maxInputTokens: cuConfig.contextWindow.maxInputTokens,
|
|
537
|
-
toolChoice: { type:
|
|
623
|
+
toolChoice: { type: "any" },
|
|
538
624
|
},
|
|
539
625
|
toolDefs,
|
|
540
626
|
toolExecutor,
|
|
@@ -545,25 +631,31 @@ export class ComputerUseSession {
|
|
|
545
631
|
messages,
|
|
546
632
|
(event) => {
|
|
547
633
|
switch (event.type) {
|
|
548
|
-
case
|
|
549
|
-
log.error(
|
|
550
|
-
|
|
551
|
-
|
|
634
|
+
case "error":
|
|
635
|
+
log.error(
|
|
636
|
+
{ err: event.error, sessionId: this.sessionId },
|
|
637
|
+
"Agent loop error",
|
|
638
|
+
);
|
|
639
|
+
if (this.state !== "complete") {
|
|
640
|
+
this.state = "error";
|
|
552
641
|
this.sendToClient({
|
|
553
|
-
type:
|
|
642
|
+
type: "cu_error",
|
|
554
643
|
sessionId: this.sessionId,
|
|
555
644
|
message: event.error.message,
|
|
556
645
|
});
|
|
557
646
|
this.notifyTerminal();
|
|
558
647
|
}
|
|
559
648
|
break;
|
|
560
|
-
case
|
|
561
|
-
log.info(
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
649
|
+
case "usage":
|
|
650
|
+
log.info(
|
|
651
|
+
{
|
|
652
|
+
sessionId: this.sessionId,
|
|
653
|
+
inputTokens: event.inputTokens,
|
|
654
|
+
outputTokens: event.outputTokens,
|
|
655
|
+
model: event.model,
|
|
656
|
+
},
|
|
657
|
+
"Usage",
|
|
658
|
+
);
|
|
567
659
|
break;
|
|
568
660
|
// Other events (text_delta, thinking_delta, etc.) are not surfaced to the CU client
|
|
569
661
|
}
|
|
@@ -572,26 +664,26 @@ export class ComputerUseSession {
|
|
|
572
664
|
);
|
|
573
665
|
|
|
574
666
|
// If the loop exits without completing, treat as error
|
|
575
|
-
if (this.state !==
|
|
576
|
-
this.state =
|
|
667
|
+
if (this.state !== "complete" && this.state !== "error") {
|
|
668
|
+
this.state = "error";
|
|
577
669
|
this.sendToClient({
|
|
578
|
-
type:
|
|
670
|
+
type: "cu_error",
|
|
579
671
|
sessionId: this.sessionId,
|
|
580
|
-
message:
|
|
672
|
+
message: "Agent loop ended unexpectedly",
|
|
581
673
|
});
|
|
582
674
|
this.notifyTerminal();
|
|
583
675
|
}
|
|
584
676
|
} catch (err) {
|
|
585
677
|
if (this.abortController?.signal.aborted) {
|
|
586
|
-
log.info({ sessionId: this.sessionId },
|
|
678
|
+
log.info({ sessionId: this.sessionId }, "Agent loop aborted");
|
|
587
679
|
return;
|
|
588
680
|
}
|
|
589
681
|
const message = err instanceof Error ? err.message : String(err);
|
|
590
|
-
log.error({ err, sessionId: this.sessionId },
|
|
591
|
-
if (this.state !==
|
|
592
|
-
this.state =
|
|
682
|
+
log.error({ err, sessionId: this.sessionId }, "Agent loop failed");
|
|
683
|
+
if (this.state !== "complete") {
|
|
684
|
+
this.state = "error";
|
|
593
685
|
this.sendToClient({
|
|
594
|
-
type:
|
|
686
|
+
type: "cu_error",
|
|
595
687
|
sessionId: this.sessionId,
|
|
596
688
|
message,
|
|
597
689
|
});
|
|
@@ -629,12 +721,12 @@ export class ComputerUseSession {
|
|
|
629
721
|
const indicesWithAxTree: number[] = [];
|
|
630
722
|
for (let i = 0; i < messages.length; i++) {
|
|
631
723
|
const msg = messages[i];
|
|
632
|
-
if (msg.role !==
|
|
724
|
+
if (msg.role !== "user") continue;
|
|
633
725
|
for (const block of msg.content) {
|
|
634
726
|
if (
|
|
635
|
-
block.type ===
|
|
636
|
-
typeof block.content ===
|
|
637
|
-
block.content.includes(
|
|
727
|
+
block.type === "tool_result" &&
|
|
728
|
+
typeof block.content === "string" &&
|
|
729
|
+
block.content.includes("<ax-tree>")
|
|
638
730
|
) {
|
|
639
731
|
indicesWithAxTree.push(i);
|
|
640
732
|
break;
|
|
@@ -646,7 +738,9 @@ export class ComputerUseSession {
|
|
|
646
738
|
return messages;
|
|
647
739
|
}
|
|
648
740
|
|
|
649
|
-
const toStrip = new Set(
|
|
741
|
+
const toStrip = new Set(
|
|
742
|
+
indicesWithAxTree.slice(0, -MAX_AX_TREES_IN_HISTORY),
|
|
743
|
+
);
|
|
650
744
|
|
|
651
745
|
return messages.map((msg, idx) => {
|
|
652
746
|
if (!toStrip.has(idx)) return msg;
|
|
@@ -654,13 +748,16 @@ export class ComputerUseSession {
|
|
|
654
748
|
...msg,
|
|
655
749
|
content: msg.content.map((block) => {
|
|
656
750
|
if (
|
|
657
|
-
block.type ===
|
|
658
|
-
typeof block.content ===
|
|
659
|
-
block.content.includes(
|
|
751
|
+
block.type === "tool_result" &&
|
|
752
|
+
typeof block.content === "string" &&
|
|
753
|
+
block.content.includes("<ax-tree>")
|
|
660
754
|
) {
|
|
661
755
|
return {
|
|
662
756
|
...block,
|
|
663
|
-
content: block.content.replace(
|
|
757
|
+
content: block.content.replace(
|
|
758
|
+
AX_TREE_PATTERN,
|
|
759
|
+
AX_TREE_PLACEHOLDER,
|
|
760
|
+
),
|
|
664
761
|
};
|
|
665
762
|
}
|
|
666
763
|
return block;
|
|
@@ -677,7 +774,7 @@ export class ComputerUseSession {
|
|
|
677
774
|
* unescaped because compaction replaces the entire block with a placeholder.
|
|
678
775
|
*/
|
|
679
776
|
static escapeAxTreeContent(content: string): string {
|
|
680
|
-
return content.replace(/<\/ax-tree>/gi,
|
|
777
|
+
return content.replace(/<\/ax-tree>/gi, "</ax-tree>");
|
|
681
778
|
}
|
|
682
779
|
|
|
683
780
|
// ---------------------------------------------------------------------------
|
|
@@ -685,68 +782,79 @@ export class ComputerUseSession {
|
|
|
685
782
|
// updated screen state on each turn (not just "Action executed").
|
|
686
783
|
// ---------------------------------------------------------------------------
|
|
687
784
|
|
|
688
|
-
private buildObservationResultContent(
|
|
785
|
+
private buildObservationResultContent(
|
|
786
|
+
obs: CuObservation,
|
|
787
|
+
hadPreviousAXTree: boolean,
|
|
788
|
+
): string {
|
|
689
789
|
const parts: string[] = [];
|
|
690
790
|
|
|
691
791
|
// Surface user guidance prominently so the model sees it first
|
|
692
792
|
if (obs.userGuidance) {
|
|
693
793
|
parts.push(`USER GUIDANCE: ${obs.userGuidance}`);
|
|
694
|
-
parts.push(
|
|
794
|
+
parts.push("");
|
|
695
795
|
}
|
|
696
796
|
|
|
697
797
|
if (obs.executionResult) {
|
|
698
798
|
parts.push(obs.executionResult);
|
|
699
|
-
parts.push(
|
|
799
|
+
parts.push("");
|
|
700
800
|
}
|
|
701
801
|
|
|
702
802
|
// AX tree diff
|
|
703
803
|
if (obs.axDiff) {
|
|
704
804
|
parts.push(obs.axDiff);
|
|
705
|
-
parts.push(
|
|
805
|
+
parts.push("");
|
|
706
806
|
} else if (hadPreviousAXTree && obs.axTree != null) {
|
|
707
807
|
const lastAction = this.actionHistory[this.actionHistory.length - 1];
|
|
708
|
-
const wasWait = lastAction?.toolName ===
|
|
709
|
-
if (
|
|
808
|
+
const wasWait = lastAction?.toolName === "computer_use_wait";
|
|
809
|
+
if (
|
|
810
|
+
this.consecutiveUnchangedSteps >=
|
|
811
|
+
CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD
|
|
812
|
+
) {
|
|
710
813
|
parts.push(
|
|
711
814
|
`WARNING: ${this.consecutiveUnchangedSteps} consecutive actions had NO VISIBLE EFFECT on the UI. You MUST try a completely different approach.`,
|
|
712
815
|
);
|
|
713
816
|
} else if (!wasWait) {
|
|
714
|
-
parts.push(
|
|
817
|
+
parts.push(
|
|
818
|
+
"Your last action had NO VISIBLE EFFECT on the UI. Try something different.",
|
|
819
|
+
);
|
|
715
820
|
}
|
|
716
|
-
parts.push(
|
|
821
|
+
parts.push("");
|
|
717
822
|
}
|
|
718
823
|
|
|
719
824
|
// Current screen state — wrapped in markers so compactHistory can strip old snapshots
|
|
720
825
|
if (obs.axTree) {
|
|
721
|
-
parts.push(
|
|
722
|
-
parts.push(
|
|
826
|
+
parts.push("<ax-tree>");
|
|
827
|
+
parts.push("CURRENT SCREEN STATE:");
|
|
723
828
|
parts.push(ComputerUseSession.escapeAxTreeContent(obs.axTree));
|
|
724
|
-
parts.push(
|
|
829
|
+
parts.push("</ax-tree>");
|
|
725
830
|
}
|
|
726
831
|
|
|
727
832
|
const screenshotMetadata = this.formatScreenshotMetadata(obs);
|
|
728
833
|
if (screenshotMetadata.length > 0) {
|
|
729
|
-
parts.push(
|
|
834
|
+
parts.push("");
|
|
730
835
|
parts.push(...screenshotMetadata);
|
|
731
836
|
}
|
|
732
837
|
|
|
733
|
-
return parts.join(
|
|
838
|
+
return parts.join("\n").trim() || "Action executed";
|
|
734
839
|
}
|
|
735
840
|
|
|
736
841
|
// ---------------------------------------------------------------------------
|
|
737
842
|
// Message building (replicates AnthropicProvider.buildMessages from Swift)
|
|
738
843
|
// ---------------------------------------------------------------------------
|
|
739
844
|
|
|
740
|
-
private buildMessages(
|
|
845
|
+
private buildMessages(
|
|
846
|
+
obs: CuObservation,
|
|
847
|
+
hadPreviousAXTree: boolean,
|
|
848
|
+
): Message[] {
|
|
741
849
|
const contentBlocks: ContentBlock[] = [];
|
|
742
850
|
|
|
743
851
|
// Screenshot image block
|
|
744
852
|
if (obs.screenshot) {
|
|
745
853
|
contentBlocks.push({
|
|
746
|
-
type:
|
|
854
|
+
type: "image",
|
|
747
855
|
source: {
|
|
748
|
-
type:
|
|
749
|
-
media_type:
|
|
856
|
+
type: "base64",
|
|
857
|
+
media_type: "image/jpeg",
|
|
750
858
|
data: obs.screenshot,
|
|
751
859
|
},
|
|
752
860
|
});
|
|
@@ -758,55 +866,68 @@ export class ComputerUseSession {
|
|
|
758
866
|
if (trimmedTask) {
|
|
759
867
|
textParts.push(`TASK: ${trimmedTask}`);
|
|
760
868
|
} else {
|
|
761
|
-
textParts.push(
|
|
869
|
+
textParts.push("TASK: No explicit task provided.");
|
|
762
870
|
}
|
|
763
|
-
textParts.push(
|
|
871
|
+
textParts.push("");
|
|
764
872
|
|
|
765
873
|
// AX tree diff (compact summary of what changed)
|
|
766
874
|
if (obs.axDiff && this.actionHistory.length > 0) {
|
|
767
875
|
textParts.push(obs.axDiff);
|
|
768
|
-
textParts.push(
|
|
769
|
-
} else if (
|
|
876
|
+
textParts.push("");
|
|
877
|
+
} else if (
|
|
878
|
+
hadPreviousAXTree &&
|
|
879
|
+
obs.axTree != null &&
|
|
880
|
+
this.actionHistory.length > 0
|
|
881
|
+
) {
|
|
770
882
|
// AX tree unchanged — tell the model its action had no effect
|
|
771
883
|
const lastAction = this.actionHistory[this.actionHistory.length - 1];
|
|
772
|
-
const wasWait = lastAction?.toolName ===
|
|
773
|
-
textParts.push(
|
|
774
|
-
if (
|
|
884
|
+
const wasWait = lastAction?.toolName === "computer_use_wait";
|
|
885
|
+
textParts.push("CHANGES SINCE LAST ACTION:");
|
|
886
|
+
if (
|
|
887
|
+
this.consecutiveUnchangedSteps >=
|
|
888
|
+
CONSECUTIVE_UNCHANGED_WARNING_THRESHOLD
|
|
889
|
+
) {
|
|
775
890
|
textParts.push(
|
|
776
891
|
`WARNING: ${this.consecutiveUnchangedSteps} consecutive actions had NO VISIBLE EFFECT on the UI. You MUST try a completely different approach — do not repeat any of your recent actions.`,
|
|
777
892
|
);
|
|
778
893
|
} else if (!wasWait) {
|
|
779
|
-
const actionDesc = `${lastAction?.toolName ??
|
|
894
|
+
const actionDesc = `${lastAction?.toolName ?? "unknown"}`;
|
|
780
895
|
textParts.push(
|
|
781
896
|
`Your last action (${actionDesc}) had NO VISIBLE EFFECT on the UI. The screen is identical to the previous step. Do NOT repeat the same action — try something different.`,
|
|
782
897
|
);
|
|
783
898
|
} else {
|
|
784
|
-
textParts.push(
|
|
899
|
+
textParts.push(
|
|
900
|
+
"No visible changes detected — the UI is identical to the previous step.",
|
|
901
|
+
);
|
|
785
902
|
}
|
|
786
|
-
textParts.push(
|
|
903
|
+
textParts.push("");
|
|
787
904
|
}
|
|
788
905
|
|
|
789
906
|
// Current screen state
|
|
790
907
|
if (obs.axTree) {
|
|
791
|
-
textParts.push(
|
|
908
|
+
textParts.push(
|
|
909
|
+
"CURRENT SCREEN STATE (accessibility tree of the focused window):",
|
|
910
|
+
);
|
|
792
911
|
textParts.push(obs.axTree);
|
|
793
|
-
textParts.push(
|
|
794
|
-
textParts.push(
|
|
912
|
+
textParts.push("");
|
|
913
|
+
textParts.push(
|
|
914
|
+
"Use element_id with the [ID] numbers shown above to target elements.",
|
|
915
|
+
);
|
|
795
916
|
|
|
796
917
|
// Secondary windows for cross-app awareness
|
|
797
918
|
if (obs.secondaryWindows) {
|
|
798
|
-
textParts.push(
|
|
919
|
+
textParts.push("");
|
|
799
920
|
textParts.push(obs.secondaryWindows);
|
|
800
|
-
textParts.push(
|
|
921
|
+
textParts.push("");
|
|
801
922
|
textParts.push(
|
|
802
923
|
"Note: The element [ID]s above are from other windows — you can reference them for context but can only interact with the focused window's elements.",
|
|
803
924
|
);
|
|
804
925
|
}
|
|
805
926
|
|
|
806
927
|
if (obs.screenshot) {
|
|
807
|
-
textParts.push(
|
|
928
|
+
textParts.push("");
|
|
808
929
|
textParts.push(
|
|
809
|
-
|
|
930
|
+
"A screenshot of the FULL SCREEN is also attached above. Use it to see content outside the focused window (e.g., reference documents, PDFs, other apps visible behind the current window).",
|
|
810
931
|
);
|
|
811
932
|
const screenshotMetadata = this.formatScreenshotMetadata(obs);
|
|
812
933
|
if (screenshotMetadata.length > 0) {
|
|
@@ -814,21 +935,23 @@ export class ComputerUseSession {
|
|
|
814
935
|
}
|
|
815
936
|
}
|
|
816
937
|
} else if (obs.screenshot) {
|
|
817
|
-
textParts.push(
|
|
818
|
-
textParts.push(
|
|
938
|
+
textParts.push("CURRENT SCREEN STATE:");
|
|
939
|
+
textParts.push(
|
|
940
|
+
"See the screenshot above. No accessibility tree available — estimate coordinates from the image.",
|
|
941
|
+
);
|
|
819
942
|
const screenshotMetadata = this.formatScreenshotMetadata(obs);
|
|
820
943
|
if (screenshotMetadata.length > 0) {
|
|
821
944
|
textParts.push(...screenshotMetadata);
|
|
822
945
|
}
|
|
823
946
|
} else {
|
|
824
|
-
textParts.push(
|
|
825
|
-
textParts.push(
|
|
947
|
+
textParts.push("CURRENT SCREEN STATE:");
|
|
948
|
+
textParts.push("No screen data available.");
|
|
826
949
|
}
|
|
827
950
|
|
|
828
951
|
// Action history
|
|
829
952
|
if (this.actionHistory.length > 0) {
|
|
830
|
-
textParts.push(
|
|
831
|
-
textParts.push(
|
|
953
|
+
textParts.push("");
|
|
954
|
+
textParts.push("ACTIONS TAKEN SO FAR:");
|
|
832
955
|
let windowedHistory: ActionRecord[];
|
|
833
956
|
if (this.actionHistory.length > MAX_HISTORY_ENTRIES) {
|
|
834
957
|
textParts.push(
|
|
@@ -839,7 +962,7 @@ export class ComputerUseSession {
|
|
|
839
962
|
windowedHistory = this.actionHistory;
|
|
840
963
|
}
|
|
841
964
|
for (const record of windowedHistory) {
|
|
842
|
-
const result = record.result ??
|
|
965
|
+
const result = record.result ?? "executed";
|
|
843
966
|
textParts.push(` ${record.step}. ${record.toolName} → ${result}`);
|
|
844
967
|
}
|
|
845
968
|
}
|
|
@@ -853,7 +976,7 @@ export class ComputerUseSession {
|
|
|
853
976
|
JSON.stringify(r.input) === JSON.stringify(recent[0].input),
|
|
854
977
|
);
|
|
855
978
|
if (allIdentical) {
|
|
856
|
-
textParts.push(
|
|
979
|
+
textParts.push("");
|
|
857
980
|
textParts.push(
|
|
858
981
|
`WARNING: You have repeated the exact same action (${recent[0].toolName}) ${LOOP_DETECTION_WINDOW} times in a row. You MUST try a completely different approach or call computer_use_done with an explanation of why you are stuck.`,
|
|
859
982
|
);
|
|
@@ -862,24 +985,26 @@ export class ComputerUseSession {
|
|
|
862
985
|
|
|
863
986
|
// Surface user guidance prominently
|
|
864
987
|
if (obs.userGuidance) {
|
|
865
|
-
textParts.push(
|
|
988
|
+
textParts.push("");
|
|
866
989
|
textParts.push(`USER GUIDANCE: ${obs.userGuidance}`);
|
|
867
990
|
}
|
|
868
991
|
|
|
869
992
|
// Prompt for next action
|
|
870
|
-
textParts.push(
|
|
993
|
+
textParts.push("");
|
|
871
994
|
if (this.actionHistory.length === 0) {
|
|
872
|
-
textParts.push(
|
|
995
|
+
textParts.push(
|
|
996
|
+
"This is the first action. Examine the screen state and decide what to do first.",
|
|
997
|
+
);
|
|
873
998
|
} else {
|
|
874
|
-
textParts.push(
|
|
999
|
+
textParts.push("Decide the next action to take.");
|
|
875
1000
|
}
|
|
876
1001
|
|
|
877
1002
|
contentBlocks.push({
|
|
878
|
-
type:
|
|
879
|
-
text: textParts.join(
|
|
1003
|
+
type: "text",
|
|
1004
|
+
text: textParts.join("\n"),
|
|
880
1005
|
});
|
|
881
1006
|
|
|
882
|
-
return [{ role:
|
|
1007
|
+
return [{ role: "user", content: contentBlocks }];
|
|
883
1008
|
}
|
|
884
1009
|
|
|
885
1010
|
private formatScreenshotMetadata(obs: CuObservation): string[] {
|
|
@@ -887,10 +1012,14 @@ export class ComputerUseSession {
|
|
|
887
1012
|
|
|
888
1013
|
const lines: string[] = [];
|
|
889
1014
|
if (obs.screenshotWidthPx != null && obs.screenshotHeightPx != null) {
|
|
890
|
-
lines.push(
|
|
1015
|
+
lines.push(
|
|
1016
|
+
`Screenshot metadata: ${obs.screenshotWidthPx}x${obs.screenshotHeightPx} px`,
|
|
1017
|
+
);
|
|
891
1018
|
}
|
|
892
1019
|
if (obs.screenWidthPt != null && obs.screenHeightPt != null) {
|
|
893
|
-
lines.push(
|
|
1020
|
+
lines.push(
|
|
1021
|
+
`Screen metadata: ${obs.screenWidthPt}x${obs.screenHeightPt} pt`,
|
|
1022
|
+
);
|
|
894
1023
|
}
|
|
895
1024
|
if (obs.coordinateOrigin) {
|
|
896
1025
|
lines.push(`Coordinate origin: ${obs.coordinateOrigin}`);
|