@vellumai/assistant 0.4.44 → 0.4.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +4 -0
- package/ARCHITECTURE.md +34 -31
- package/README.md +4 -4
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -197
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -1
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +4 -11
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +7 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -2
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +0 -1
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -3
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +80 -4
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -1
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +1 -1
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +49 -24
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -67
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +2 -1
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/ride-shotgun-handler.ts +2 -42
- package/src/daemon/server.ts +43 -10
- package/src/daemon/session-agent-loop-handlers.ts +48 -7
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -0
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +19 -97
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +77 -13
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -29
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +10 -14
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +29 -30
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -4
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +0 -23
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +2 -3
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +230 -46
- package/src/runtime/routes/diagnostics-routes.ts +63 -29
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -261
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +0 -1
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +0 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -885
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -108
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
- package/src/cli/commands/twitter/index.ts +0 -420
- package/src/cli/commands/twitter/oauth-client.ts +0 -60
- package/src/cli/commands/twitter/router.ts +0 -351
- package/src/cli/commands/twitter/types.ts +0 -30
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -136
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -206
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -408
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -3,19 +3,18 @@ import type { ContextWindowConfig } from "../config/types.js";
|
|
|
3
3
|
import type { ContentBlock, Message, Provider } from "../providers/types.js";
|
|
4
4
|
import { getLogger } from "../util/logger.js";
|
|
5
5
|
import { estimatePromptTokens, estimateTextTokens } from "./token-estimator.js";
|
|
6
|
+
import { truncateToolResultsAcrossHistory } from "./tool-result-truncation.js";
|
|
6
7
|
|
|
7
8
|
const log = getLogger("context-window");
|
|
8
9
|
|
|
9
10
|
export const CONTEXT_SUMMARY_MARKER = "<context_summary>";
|
|
10
|
-
const CHUNK_MIN_TOKENS = 1000;
|
|
11
11
|
const MAX_BLOCK_PREVIEW_CHARS = 3000;
|
|
12
12
|
const MAX_FALLBACK_SUMMARY_CHARS = 12000;
|
|
13
|
-
const MAX_CONTEXT_SUMMARY_CHARS = 16000;
|
|
14
13
|
const COMPACTION_COOLDOWN_MS = 2 * 60 * 1000;
|
|
15
14
|
const MIN_GAIN_TOKENS_DURING_COOLDOWN = 1200;
|
|
16
15
|
const SEVERE_PRESSURE_RATIO = 0.95;
|
|
16
|
+
const COMPACTION_TOOL_RESULT_MAX_CHARS = 6_000;
|
|
17
17
|
const MIN_COMPACTABLE_PERSISTED_MESSAGES = 2;
|
|
18
|
-
const MAX_PRESERVED_IMAGE_BLOCKS = 5;
|
|
19
18
|
const INTERNAL_CONTEXT_SUMMARY_MESSAGES = new WeakSet<Message>();
|
|
20
19
|
|
|
21
20
|
const SUMMARY_SYSTEM_PROMPT = [
|
|
@@ -195,11 +194,25 @@ export class ContextWindowManager {
|
|
|
195
194
|
targetInputTokensOverride: options?.targetInputTokensOverride,
|
|
196
195
|
});
|
|
197
196
|
if (keepPlan.keepFromIndex <= summaryOffset) {
|
|
197
|
+
// All turns fit after truncation projection, but the real in-memory
|
|
198
|
+
// messages may still contain un-truncated tool results. Apply truncation
|
|
199
|
+
// so the caller gets the token savings even without summarization.
|
|
200
|
+
const { messages: truncatedMessages, truncatedCount } =
|
|
201
|
+
truncateToolResultsAcrossHistory(
|
|
202
|
+
messages,
|
|
203
|
+
COMPACTION_TOOL_RESULT_MAX_CHARS,
|
|
204
|
+
);
|
|
205
|
+
const didTruncate = truncatedCount > 0;
|
|
206
|
+
const estimatedAfterTruncation = didTruncate
|
|
207
|
+
? estimatePromptTokens(truncatedMessages, this.systemPrompt, {
|
|
208
|
+
providerName: this.provider.name,
|
|
209
|
+
})
|
|
210
|
+
: previousEstimatedInputTokens;
|
|
198
211
|
return {
|
|
199
|
-
messages,
|
|
200
|
-
compacted:
|
|
212
|
+
messages: truncatedMessages,
|
|
213
|
+
compacted: didTruncate,
|
|
201
214
|
previousEstimatedInputTokens,
|
|
202
|
-
estimatedInputTokens:
|
|
215
|
+
estimatedInputTokens: estimatedAfterTruncation,
|
|
203
216
|
maxInputTokens: this.config.maxInputTokens,
|
|
204
217
|
thresholdTokens,
|
|
205
218
|
compactedMessages: 0,
|
|
@@ -209,7 +222,9 @@ export class ContextWindowManager {
|
|
|
209
222
|
summaryOutputTokens: 0,
|
|
210
223
|
summaryModel: "",
|
|
211
224
|
summaryText: existingSummary ?? "",
|
|
212
|
-
reason:
|
|
225
|
+
reason: didTruncate
|
|
226
|
+
? "truncated tool results without summarization"
|
|
227
|
+
: "unable to compact while keeping recent turns",
|
|
213
228
|
};
|
|
214
229
|
}
|
|
215
230
|
|
|
@@ -238,10 +253,14 @@ export class ContextWindowManager {
|
|
|
238
253
|
|
|
239
254
|
const compactedPersistedMessages =
|
|
240
255
|
countPersistedMessages(compactableMessages);
|
|
241
|
-
const
|
|
256
|
+
const rawProjectedMessages = [
|
|
242
257
|
createContextSummaryMessage(existingSummary ?? "Projected summary"),
|
|
243
258
|
...messages.slice(keepPlan.keepFromIndex),
|
|
244
259
|
];
|
|
260
|
+
const { messages: projectedMessages } = truncateToolResultsAcrossHistory(
|
|
261
|
+
rawProjectedMessages,
|
|
262
|
+
COMPACTION_TOOL_RESULT_MAX_CHARS,
|
|
263
|
+
);
|
|
245
264
|
const projectedInputTokens = estimatePromptTokens(
|
|
246
265
|
projectedMessages,
|
|
247
266
|
this.systemPrompt,
|
|
@@ -331,83 +350,42 @@ export class ContextWindowManager {
|
|
|
331
350
|
};
|
|
332
351
|
}
|
|
333
352
|
|
|
334
|
-
const
|
|
335
|
-
compactableMessages,
|
|
336
|
-
|
|
353
|
+
const transcript = this.capTranscriptToTokenBudget(
|
|
354
|
+
serializeMessages(compactableMessages),
|
|
355
|
+
existingSummary ?? "No previous summary.",
|
|
356
|
+
);
|
|
357
|
+
const summaryUpdate = await this.updateSummary(
|
|
358
|
+
existingSummary ?? "No previous summary.",
|
|
359
|
+
transcript,
|
|
360
|
+
signal,
|
|
337
361
|
);
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
362
|
+
const summary = summaryUpdate.summary;
|
|
363
|
+
const summaryInputTokens = summaryUpdate.inputTokens;
|
|
364
|
+
const summaryOutputTokens = summaryUpdate.outputTokens;
|
|
365
|
+
const summaryModel = summaryUpdate.model;
|
|
366
|
+
const summaryCacheCreationInputTokens =
|
|
367
|
+
summaryUpdate.cacheCreationInputTokens;
|
|
368
|
+
const summaryCacheReadInputTokens = summaryUpdate.cacheReadInputTokens;
|
|
344
369
|
const summaryRawResponses: unknown[] = [];
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
summary = summaryUpdate.summary;
|
|
350
|
-
summaryInputTokens += summaryUpdate.inputTokens;
|
|
351
|
-
summaryOutputTokens += summaryUpdate.outputTokens;
|
|
352
|
-
summaryModel = summaryUpdate.model || summaryModel;
|
|
353
|
-
summaryCacheCreationInputTokens += summaryUpdate.cacheCreationInputTokens;
|
|
354
|
-
summaryCacheReadInputTokens += summaryUpdate.cacheReadInputTokens;
|
|
355
|
-
if (Array.isArray(summaryUpdate.rawResponse)) {
|
|
356
|
-
summaryRawResponses.push(...summaryUpdate.rawResponse);
|
|
357
|
-
} else if (summaryUpdate.rawResponse !== undefined) {
|
|
358
|
-
summaryRawResponses.push(summaryUpdate.rawResponse);
|
|
359
|
-
}
|
|
360
|
-
summaryCalls += 1;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Extract user-uploaded image blocks from compacted messages so they
|
|
364
|
-
// remain accessible to the assistant in subsequent turns. Tool-result
|
|
365
|
-
// screenshots are NOT preserved — only top-level image blocks in user
|
|
366
|
-
// messages, which represent intentional user uploads.
|
|
367
|
-
// Also carry forward any images already preserved in the existing summary
|
|
368
|
-
// message so they survive multiple compaction cycles.
|
|
369
|
-
const preservedImageBlocks: ContentBlock[] = [];
|
|
370
|
-
if (existingSummary != null) {
|
|
371
|
-
const summaryMsg = messages[0];
|
|
372
|
-
for (const block of summaryMsg.content) {
|
|
373
|
-
if (block.type === "image") {
|
|
374
|
-
preservedImageBlocks.push(block);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
for (const msg of compactableMessages) {
|
|
379
|
-
if (msg.role !== "user") continue;
|
|
380
|
-
for (const block of msg.content) {
|
|
381
|
-
if (block.type === "image") {
|
|
382
|
-
preservedImageBlocks.push(block);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Cap preserved images to avoid unbounded accumulation across cycles.
|
|
388
|
-
// Older images (carried forward) are at the front; keep the most recent.
|
|
389
|
-
if (preservedImageBlocks.length > MAX_PRESERVED_IMAGE_BLOCKS) {
|
|
390
|
-
preservedImageBlocks.splice(
|
|
391
|
-
0,
|
|
392
|
-
preservedImageBlocks.length - MAX_PRESERVED_IMAGE_BLOCKS,
|
|
393
|
-
);
|
|
370
|
+
if (Array.isArray(summaryUpdate.rawResponse)) {
|
|
371
|
+
summaryRawResponses.push(...summaryUpdate.rawResponse);
|
|
372
|
+
} else if (summaryUpdate.rawResponse !== undefined) {
|
|
373
|
+
summaryRawResponses.push(summaryUpdate.rawResponse);
|
|
394
374
|
}
|
|
375
|
+
const summaryCalls = 1;
|
|
395
376
|
|
|
377
|
+
// Media (images, files) in kept turns is preserved naturally — those
|
|
378
|
+
// turns are carried forward as-is and their token cost is already
|
|
379
|
+
// accounted for by pickKeepBoundary's estimatePromptTokens call.
|
|
380
|
+
// Media in compacted turns is described textually in the summary transcript.
|
|
396
381
|
const summaryMessage = createContextSummaryMessage(summary);
|
|
397
|
-
if (preservedImageBlocks.length > 0) {
|
|
398
|
-
summaryMessage.content.push(
|
|
399
|
-
{
|
|
400
|
-
type: "text",
|
|
401
|
-
text: "[The following images were uploaded by the user in earlier messages and are preserved for reference.]",
|
|
402
|
-
},
|
|
403
|
-
...preservedImageBlocks,
|
|
404
|
-
);
|
|
405
|
-
}
|
|
406
382
|
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
383
|
+
const { messages: truncatedKeptMessages } =
|
|
384
|
+
truncateToolResultsAcrossHistory(
|
|
385
|
+
messages.slice(keepPlan.keepFromIndex),
|
|
386
|
+
COMPACTION_TOOL_RESULT_MAX_CHARS,
|
|
387
|
+
);
|
|
388
|
+
const compactedMessages = [summaryMessage, ...truncatedKeptMessages];
|
|
411
389
|
const estimatedInputTokens = estimatePromptTokens(
|
|
412
390
|
compactedMessages,
|
|
413
391
|
this.systemPrompt,
|
|
@@ -445,6 +423,13 @@ export class ContextWindowManager {
|
|
|
445
423
|
};
|
|
446
424
|
}
|
|
447
425
|
|
|
426
|
+
private get targetInputTokens(): number {
|
|
427
|
+
return Math.floor(
|
|
428
|
+
this.config.maxInputTokens *
|
|
429
|
+
(this.config.targetBudgetRatio - this.config.summaryBudgetRatio),
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
|
|
448
433
|
private pickKeepBoundary(
|
|
449
434
|
messages: Message[],
|
|
450
435
|
userTurnStarts: number[],
|
|
@@ -458,47 +443,110 @@ export class ContextWindowManager {
|
|
|
458
443
|
userTurnStarts.length,
|
|
459
444
|
);
|
|
460
445
|
const targetTokens =
|
|
461
|
-
opts?.targetInputTokensOverride ?? this.
|
|
446
|
+
opts?.targetInputTokensOverride ?? this.targetInputTokens;
|
|
447
|
+
|
|
448
|
+
// Binary search for the maximum keepTurns whose projected tokens fit
|
|
449
|
+
// within the budget. Token count is monotonically non-decreasing with
|
|
450
|
+
// keepTurns (more turns = more tokens), so binary search is valid.
|
|
451
|
+
const projectedTokensForKeep = (turns: number): number => {
|
|
452
|
+
const fromIndex =
|
|
453
|
+
turns === 0
|
|
454
|
+
? messages.length
|
|
455
|
+
: (userTurnStarts[userTurnStarts.length - turns] ?? messages.length);
|
|
456
|
+
const rawProjected = [
|
|
457
|
+
createContextSummaryMessage("Projected summary"),
|
|
458
|
+
...messages.slice(fromIndex),
|
|
459
|
+
];
|
|
460
|
+
const { messages: projectedMessages } = truncateToolResultsAcrossHistory(
|
|
461
|
+
rawProjected,
|
|
462
|
+
COMPACTION_TOOL_RESULT_MAX_CHARS,
|
|
463
|
+
);
|
|
464
|
+
return estimatePromptTokens(projectedMessages, this.systemPrompt, {
|
|
465
|
+
providerName: this.provider.name,
|
|
466
|
+
});
|
|
467
|
+
};
|
|
462
468
|
|
|
463
|
-
let
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
469
|
+
let lo = minFloor;
|
|
470
|
+
let hi = userTurnStarts.length;
|
|
471
|
+
|
|
472
|
+
// Fast path: if keeping all turns already fits, skip the search.
|
|
473
|
+
if (hi > lo && projectedTokensForKeep(hi) > targetTokens) {
|
|
474
|
+
// Binary search: find the largest keepTurns where projected tokens fit.
|
|
475
|
+
while (lo < hi) {
|
|
476
|
+
const mid = lo + Math.ceil((hi - lo) / 2);
|
|
477
|
+
if (projectedTokensForKeep(mid) <= targetTokens) {
|
|
478
|
+
lo = mid;
|
|
479
|
+
} else {
|
|
480
|
+
hi = mid - 1;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
} else {
|
|
484
|
+
lo = hi;
|
|
485
|
+
}
|
|
468
486
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
let keepFromIndex =
|
|
487
|
+
const keepTurns = lo;
|
|
488
|
+
const keepFromIndex =
|
|
472
489
|
keepTurns === 0
|
|
473
490
|
? messages.length
|
|
474
491
|
: (userTurnStarts[userTurnStarts.length - keepTurns] ??
|
|
475
492
|
messages.length);
|
|
476
493
|
|
|
477
|
-
while (keepTurns > minFloor) {
|
|
478
|
-
const projectedMessages = [
|
|
479
|
-
createContextSummaryMessage("Projected summary"),
|
|
480
|
-
...messages.slice(keepFromIndex),
|
|
481
|
-
];
|
|
482
|
-
const projectedTokens = estimatePromptTokens(
|
|
483
|
-
projectedMessages,
|
|
484
|
-
this.systemPrompt,
|
|
485
|
-
{ providerName: this.provider.name },
|
|
486
|
-
);
|
|
487
|
-
if (projectedTokens <= targetTokens) break;
|
|
488
|
-
keepTurns -= 1;
|
|
489
|
-
keepFromIndex =
|
|
490
|
-
keepTurns === 0
|
|
491
|
-
? messages.length
|
|
492
|
-
: (userTurnStarts[userTurnStarts.length - keepTurns] ??
|
|
493
|
-
keepFromIndex);
|
|
494
|
-
}
|
|
495
|
-
|
|
496
494
|
return { keepFromIndex, keepTurns };
|
|
497
495
|
}
|
|
498
496
|
|
|
497
|
+
private get summaryMaxTokens(): number {
|
|
498
|
+
return Math.max(
|
|
499
|
+
1,
|
|
500
|
+
Math.floor(this.config.maxInputTokens * this.config.summaryBudgetRatio),
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Trim the serialized transcript so that the summary prompt (system prompt +
|
|
506
|
+
* existing summary + transcript + scaffolding) fits within the provider's
|
|
507
|
+
* input token limit, minus the output budget reserved for the summary itself.
|
|
508
|
+
* This prevents the summarizer LLM call from exceeding its context window
|
|
509
|
+
* during forced compaction of very large histories.
|
|
510
|
+
*/
|
|
511
|
+
private capTranscriptToTokenBudget(
|
|
512
|
+
transcript: string,
|
|
513
|
+
currentSummary: string,
|
|
514
|
+
): string {
|
|
515
|
+
// Reserve tokens for: system prompt, summary prompt scaffolding, existing
|
|
516
|
+
// summary, message overhead, and the output (summaryMaxTokens).
|
|
517
|
+
const overheadTokens =
|
|
518
|
+
estimateTextTokens(SUMMARY_SYSTEM_PROMPT) +
|
|
519
|
+
estimateTextTokens(currentSummary) +
|
|
520
|
+
// Scaffolding text in buildSummaryPrompt ("Update the summary...",
|
|
521
|
+
// section headers, etc.) — generous fixed estimate.
|
|
522
|
+
200 +
|
|
523
|
+
this.summaryMaxTokens;
|
|
524
|
+
|
|
525
|
+
const maxTranscriptTokens = Math.max(
|
|
526
|
+
0,
|
|
527
|
+
this.config.maxInputTokens - overheadTokens,
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
const transcriptTokens = estimateTextTokens(transcript);
|
|
531
|
+
if (transcriptTokens <= maxTranscriptTokens) return transcript;
|
|
532
|
+
|
|
533
|
+
// Truncate from the beginning (older messages) to preserve recent context.
|
|
534
|
+
const maxChars = maxTranscriptTokens * 4; // inverse of estimateTextTokens
|
|
535
|
+
const truncated = transcript.slice(transcript.length - maxChars);
|
|
536
|
+
log.info(
|
|
537
|
+
{
|
|
538
|
+
originalTokens: transcriptTokens,
|
|
539
|
+
cappedTokens: maxTranscriptTokens,
|
|
540
|
+
droppedTokens: transcriptTokens - maxTranscriptTokens,
|
|
541
|
+
},
|
|
542
|
+
"Capped summary transcript to fit provider input limit",
|
|
543
|
+
);
|
|
544
|
+
return `[earlier messages truncated]\n${truncated}`;
|
|
545
|
+
}
|
|
546
|
+
|
|
499
547
|
private async updateSummary(
|
|
500
548
|
currentSummary: string,
|
|
501
|
-
|
|
549
|
+
transcript: string,
|
|
502
550
|
signal?: AbortSignal,
|
|
503
551
|
): Promise<{
|
|
504
552
|
summary: string;
|
|
@@ -509,14 +557,14 @@ export class ContextWindowManager {
|
|
|
509
557
|
cacheReadInputTokens: number;
|
|
510
558
|
rawResponse?: unknown;
|
|
511
559
|
}> {
|
|
512
|
-
const prompt = buildSummaryPrompt(currentSummary,
|
|
560
|
+
const prompt = buildSummaryPrompt(currentSummary, transcript);
|
|
513
561
|
try {
|
|
514
562
|
const response = await this.provider.sendMessage(
|
|
515
563
|
[createUserMessage(prompt)],
|
|
516
564
|
undefined,
|
|
517
565
|
SUMMARY_SYSTEM_PROMPT,
|
|
518
566
|
{
|
|
519
|
-
config: { max_tokens: this.
|
|
567
|
+
config: { max_tokens: this.summaryMaxTokens },
|
|
520
568
|
signal,
|
|
521
569
|
},
|
|
522
570
|
);
|
|
@@ -524,7 +572,7 @@ export class ContextWindowManager {
|
|
|
524
572
|
const nextSummary = extractText(response.content).trim();
|
|
525
573
|
if (nextSummary.length > 0) {
|
|
526
574
|
return {
|
|
527
|
-
summary: clampSummary(nextSummary),
|
|
575
|
+
summary: this.clampSummary(nextSummary),
|
|
528
576
|
inputTokens: response.usage.inputTokens,
|
|
529
577
|
outputTokens: response.usage.outputTokens,
|
|
530
578
|
model: response.model,
|
|
@@ -539,7 +587,7 @@ export class ContextWindowManager {
|
|
|
539
587
|
}
|
|
540
588
|
|
|
541
589
|
return {
|
|
542
|
-
summary: fallbackSummary(currentSummary,
|
|
590
|
+
summary: fallbackSummary(currentSummary, transcript),
|
|
543
591
|
inputTokens: 0,
|
|
544
592
|
outputTokens: 0,
|
|
545
593
|
model: "",
|
|
@@ -547,6 +595,13 @@ export class ContextWindowManager {
|
|
|
547
595
|
cacheReadInputTokens: 0,
|
|
548
596
|
};
|
|
549
597
|
}
|
|
598
|
+
|
|
599
|
+
private clampSummary(summary: string): string {
|
|
600
|
+
// Budget in tokens → approximate char limit (4 chars ≈ 1 token).
|
|
601
|
+
const maxChars = this.summaryMaxTokens * 4;
|
|
602
|
+
if (summary.length <= maxChars) return summary;
|
|
603
|
+
return `${summary.slice(0, maxChars)}...`;
|
|
604
|
+
}
|
|
550
605
|
}
|
|
551
606
|
|
|
552
607
|
function collectUserTurnStartIndexes(messages: Message[]): number[] {
|
|
@@ -608,9 +663,7 @@ export function createContextSummaryMessage(summary: string): Message {
|
|
|
608
663
|
content: [
|
|
609
664
|
{
|
|
610
665
|
type: "text",
|
|
611
|
-
text: `${CONTEXT_SUMMARY_MARKER}\n${
|
|
612
|
-
summary,
|
|
613
|
-
)}\n</context_summary>`,
|
|
666
|
+
text: `${CONTEXT_SUMMARY_MARKER}\n${summary}\n</context_summary>`,
|
|
614
667
|
},
|
|
615
668
|
],
|
|
616
669
|
};
|
|
@@ -618,7 +671,10 @@ export function createContextSummaryMessage(summary: string): Message {
|
|
|
618
671
|
return message;
|
|
619
672
|
}
|
|
620
673
|
|
|
621
|
-
function buildSummaryPrompt(
|
|
674
|
+
function buildSummaryPrompt(
|
|
675
|
+
currentSummary: string,
|
|
676
|
+
transcript: string,
|
|
677
|
+
): string {
|
|
622
678
|
return [
|
|
623
679
|
"Update the summary with new transcript data.",
|
|
624
680
|
"If new information conflicts with older notes, keep the most recent and explicit detail.",
|
|
@@ -627,39 +683,13 @@ function buildSummaryPrompt(currentSummary: string, chunk: string): string {
|
|
|
627
683
|
"### Existing Summary",
|
|
628
684
|
currentSummary.trim().length > 0 ? currentSummary.trim() : "None.",
|
|
629
685
|
"",
|
|
630
|
-
"###
|
|
631
|
-
|
|
686
|
+
"### Transcript",
|
|
687
|
+
transcript,
|
|
632
688
|
].join("\n");
|
|
633
689
|
}
|
|
634
690
|
|
|
635
|
-
function
|
|
636
|
-
messages
|
|
637
|
-
maxTokensPerChunk: number,
|
|
638
|
-
): string[] {
|
|
639
|
-
const chunks: string[] = [];
|
|
640
|
-
let currentChunk: string[] = [];
|
|
641
|
-
let currentTokens = 0;
|
|
642
|
-
|
|
643
|
-
for (let i = 0; i < messages.length; i++) {
|
|
644
|
-
const line = serializeForSummary(messages[i], i);
|
|
645
|
-
const lineTokens = estimateTextTokens(line) + 1;
|
|
646
|
-
if (
|
|
647
|
-
currentChunk.length > 0 &&
|
|
648
|
-
currentTokens + lineTokens > maxTokensPerChunk
|
|
649
|
-
) {
|
|
650
|
-
chunks.push(currentChunk.join("\n\n"));
|
|
651
|
-
currentChunk = [];
|
|
652
|
-
currentTokens = 0;
|
|
653
|
-
}
|
|
654
|
-
currentChunk.push(line);
|
|
655
|
-
currentTokens += lineTokens;
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
if (currentChunk.length > 0) {
|
|
659
|
-
chunks.push(currentChunk.join("\n\n"));
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
return chunks;
|
|
691
|
+
function serializeMessages(messages: Message[]): string {
|
|
692
|
+
return messages.map((m, i) => serializeForSummary(m, i)).join("\n\n");
|
|
663
693
|
}
|
|
664
694
|
|
|
665
695
|
function serializeForSummary(message: Message, index: number): string {
|
|
@@ -702,6 +732,10 @@ function serializeBlock(block: ContentBlock): string {
|
|
|
702
732
|
return `thinking: ${clampText(block.thinking)}`;
|
|
703
733
|
case "redacted_thinking":
|
|
704
734
|
return "redacted_thinking";
|
|
735
|
+
case "server_tool_use":
|
|
736
|
+
return `server_tool_use ${block.name}: ${clampText(stableJson(block.input))}`;
|
|
737
|
+
case "web_search_tool_result":
|
|
738
|
+
return `web_search_tool_result ${block.tool_use_id}`;
|
|
705
739
|
default:
|
|
706
740
|
return "unknown_block";
|
|
707
741
|
}
|
|
@@ -741,11 +775,6 @@ function extractText(content: ContentBlock[]): string {
|
|
|
741
775
|
.join("\n");
|
|
742
776
|
}
|
|
743
777
|
|
|
744
|
-
function clampSummary(summary: string): string {
|
|
745
|
-
if (summary.length <= MAX_CONTEXT_SUMMARY_CHARS) return summary;
|
|
746
|
-
return `${summary.slice(0, MAX_CONTEXT_SUMMARY_CHARS)}...`;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
778
|
function stableJson(value: unknown): string {
|
|
750
779
|
try {
|
|
751
780
|
return JSON.stringify(value);
|
|
@@ -22,14 +22,13 @@ import type {
|
|
|
22
22
|
} from "../providers/types.js";
|
|
23
23
|
import { allComputerUseTools } from "../tools/computer-use/definitions.js";
|
|
24
24
|
import { ToolExecutor } from "../tools/executor.js";
|
|
25
|
-
import { registerSkillTools } from "../tools/registry.js";
|
|
25
|
+
import { getTool, registerSkillTools } from "../tools/registry.js";
|
|
26
26
|
import type { Tool, ToolExecutionResult } from "../tools/types.js";
|
|
27
27
|
import { allUiSurfaceTools } from "../tools/ui-surface/definitions.js";
|
|
28
28
|
import { getLogger } from "../util/logger.js";
|
|
29
29
|
import { getSandboxWorkingDir } from "../util/platform.js";
|
|
30
30
|
import type {
|
|
31
31
|
CuObservation,
|
|
32
|
-
FileUploadSurfaceData,
|
|
33
32
|
ServerMessage,
|
|
34
33
|
SurfaceData,
|
|
35
34
|
SurfaceType,
|
|
@@ -288,7 +287,7 @@ export class ComputerUseSession {
|
|
|
288
287
|
cache: this.skillProjectionCache,
|
|
289
288
|
});
|
|
290
289
|
|
|
291
|
-
if (projection.
|
|
290
|
+
if (projection.allowedToolNames.size === 0) {
|
|
292
291
|
log.warn(
|
|
293
292
|
{ preactivatedSkillIds: this.preactivatedSkillIds },
|
|
294
293
|
"Skill projection produced no tool definitions, falling back to legacy CU tools",
|
|
@@ -296,7 +295,14 @@ export class ComputerUseSession {
|
|
|
296
295
|
return null;
|
|
297
296
|
}
|
|
298
297
|
|
|
299
|
-
|
|
298
|
+
// Tool definitions are no longer returned from projectSkillTools
|
|
299
|
+
// (dispatched via skill_execute). Build definitions from the registry.
|
|
300
|
+
const defs: ToolDefinition[] = [];
|
|
301
|
+
for (const name of projection.allowedToolNames) {
|
|
302
|
+
const tool = getTool(name);
|
|
303
|
+
if (tool) defs.push(tool.getDefinition());
|
|
304
|
+
}
|
|
305
|
+
return defs;
|
|
300
306
|
} catch (err) {
|
|
301
307
|
log.warn(
|
|
302
308
|
{ err },
|
|
@@ -360,9 +366,7 @@ export class ComputerUseSession {
|
|
|
360
366
|
|
|
361
367
|
const toolDefs: ToolDefinition[] = [
|
|
362
368
|
...cuToolDefs,
|
|
363
|
-
...allUiSurfaceTools
|
|
364
|
-
.filter((t) => t.name !== "request_file")
|
|
365
|
-
.map((t) => t.getDefinition()),
|
|
369
|
+
...allUiSurfaceTools.map((t) => t.getDefinition()),
|
|
366
370
|
];
|
|
367
371
|
|
|
368
372
|
this.prompter = new PermissionPrompter(this.sendToClient);
|
|
@@ -461,42 +465,6 @@ export class ComputerUseSession {
|
|
|
461
465
|
return { content: "Surface dismissed", isError: false };
|
|
462
466
|
}
|
|
463
467
|
|
|
464
|
-
// ── File request proxying ──────────────────────────────────────
|
|
465
|
-
if (toolName === "request_file") {
|
|
466
|
-
const surfaceId = uuid();
|
|
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;
|
|
476
|
-
|
|
477
|
-
const data: FileUploadSurfaceData = {
|
|
478
|
-
prompt,
|
|
479
|
-
acceptedTypes,
|
|
480
|
-
maxFiles,
|
|
481
|
-
};
|
|
482
|
-
|
|
483
|
-
this.surfaceState.set(surfaceId, { surfaceType: "file_upload", data });
|
|
484
|
-
|
|
485
|
-
this.sendToClient({
|
|
486
|
-
type: "ui_surface_show",
|
|
487
|
-
sessionId: this.sessionId,
|
|
488
|
-
surfaceId,
|
|
489
|
-
surfaceType: "file_upload",
|
|
490
|
-
title: "File Request",
|
|
491
|
-
data,
|
|
492
|
-
} as UiSurfaceShow);
|
|
493
|
-
|
|
494
|
-
// Always await — file upload is interactive
|
|
495
|
-
return new Promise<ToolExecutionResult>((resolve) => {
|
|
496
|
-
this.pendingSurfaceActions.set(surfaceId, { resolve });
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
|
|
500
468
|
// ── Computer-use tool proxying ─────────────────────────────────
|
|
501
469
|
const reasoning =
|
|
502
470
|
typeof input.reasoning === "string" ? input.reasoning : undefined;
|
|
@@ -223,7 +223,10 @@ export async function getDaemonStatus(): Promise<{
|
|
|
223
223
|
// killStaleDaemon() can clean it up.
|
|
224
224
|
const responsive = await isHttpHealthy();
|
|
225
225
|
if (!responsive) {
|
|
226
|
-
log.warn(
|
|
226
|
+
log.warn(
|
|
227
|
+
{ pid },
|
|
228
|
+
"Daemon process alive but HTTP health check unresponsive",
|
|
229
|
+
);
|
|
227
230
|
return { running: false, pid };
|
|
228
231
|
}
|
|
229
232
|
return { running: true, pid };
|
|
@@ -49,9 +49,9 @@ import type {
|
|
|
49
49
|
ChannelVerificationSessionRequest,
|
|
50
50
|
ChannelVerificationSessionResponse,
|
|
51
51
|
} from "../message-protocol.js";
|
|
52
|
-
import {
|
|
52
|
+
import { type HandlerContext, log } from "./shared.js";
|
|
53
53
|
|
|
54
|
-
// -- Transport-agnostic result type (omits the
|
|
54
|
+
// -- Transport-agnostic result type (omits the `type` discriminant) --
|
|
55
55
|
|
|
56
56
|
export type ChannelVerificationSessionResult = Omit<
|
|
57
57
|
ChannelVerificationSessionResponse,
|
|
@@ -224,7 +224,7 @@ export function revokeVerificationForChannel(
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
// ---------------------------------------------------------------------------
|
|
227
|
-
// Trusted-contact verification (shared
|
|
227
|
+
// Trusted-contact verification (shared across transports)
|
|
228
228
|
// ---------------------------------------------------------------------------
|
|
229
229
|
|
|
230
230
|
/** Session TTL in seconds (matches challenge TTL of 10 minutes). */
|
|
@@ -252,7 +252,7 @@ function toVerificationChannel(channelType: string): ChannelId | null {
|
|
|
252
252
|
* channel, derives the verification channel and destination, checks rate
|
|
253
253
|
* limits, and creates the appropriate outbound session.
|
|
254
254
|
*
|
|
255
|
-
* Returns a `ChannelVerificationSessionResult` so both the
|
|
255
|
+
* Returns a `ChannelVerificationSessionResult` so both the message handler
|
|
256
256
|
* and the HTTP handler can wrap it in their respective response envelopes.
|
|
257
257
|
*/
|
|
258
258
|
export async function verifyTrustedContact(
|
|
@@ -610,8 +610,4 @@ export async function handleChannelVerificationSession(
|
|
|
610
610
|
channel,
|
|
611
611
|
});
|
|
612
612
|
}
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
export const channelHandlers = defineHandlers({
|
|
616
|
-
channel_verification_session: handleChannelVerificationSession,
|
|
617
|
-
});
|
|
613
|
+
}
|
|
@@ -22,7 +22,6 @@ import {
|
|
|
22
22
|
import type { IngressConfigRequest } from "../message-protocol.js";
|
|
23
23
|
import {
|
|
24
24
|
CONFIG_RELOAD_DEBOUNCE_MS,
|
|
25
|
-
defineHandlers,
|
|
26
25
|
type HandlerContext,
|
|
27
26
|
log,
|
|
28
27
|
} from "./shared.js";
|
|
@@ -252,6 +251,3 @@ export async function handleIngressConfig(
|
|
|
252
251
|
}
|
|
253
252
|
}
|
|
254
253
|
|
|
255
|
-
export const ingressHandlers = defineHandlers({
|
|
256
|
-
ingress_config: handleIngressConfig,
|
|
257
|
-
});
|