@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
|
@@ -10,7 +10,10 @@ import type {
|
|
|
10
10
|
TurnInterfaceContext,
|
|
11
11
|
} from "../channels/types.js";
|
|
12
12
|
import { getLogger } from "../util/logger.js";
|
|
13
|
-
import type {
|
|
13
|
+
import type {
|
|
14
|
+
ServerMessage,
|
|
15
|
+
UserMessageAttachment,
|
|
16
|
+
} from "./message-protocol.js";
|
|
14
17
|
|
|
15
18
|
const log = getLogger("session-queue");
|
|
16
19
|
|
|
@@ -26,16 +29,16 @@ export interface QueuedMessage {
|
|
|
26
29
|
turnInterfaceContext?: TurnInterfaceContext;
|
|
27
30
|
/** When false, the turn has no interactive user and should skip clarification prompts. */
|
|
28
31
|
isInteractive?: boolean;
|
|
29
|
-
/** Timestamp (ms) when the message was enqueued. */
|
|
30
|
-
queuedAt: number;
|
|
31
32
|
/** Original user message text to persist to DB when recording intent stripping produced a different `content`. */
|
|
32
33
|
displayContent?: string;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Maximum total estimated bytes across all queued messages per session.
|
|
38
|
+
* Limits memory consumption when a sender floods messages while the
|
|
39
|
+
* session is busy. 50 MB is well above any legitimate usage.
|
|
40
|
+
*/
|
|
41
|
+
export const DEFAULT_MAX_QUEUE_BYTES = 50 * 1024 * 1024; // 50 MB
|
|
39
42
|
|
|
40
43
|
/**
|
|
41
44
|
* Describes why a queued message was promoted from the queue.
|
|
@@ -53,75 +56,59 @@ export interface QueuePolicy {
|
|
|
53
56
|
checkpointHandoffEnabled: boolean;
|
|
54
57
|
}
|
|
55
58
|
|
|
56
|
-
export interface QueueMetrics {
|
|
57
|
-
currentDepth: number;
|
|
58
|
-
totalDropped: number;
|
|
59
|
-
totalExpired: number;
|
|
60
|
-
/** Average wait time (ms) of dequeued messages. 0 when no messages have been dequeued. */
|
|
61
|
-
averageWaitMs: number;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
59
|
/**
|
|
65
60
|
* Typed wrapper around the queued-message array.
|
|
66
61
|
*
|
|
67
|
-
* Session owns one instance; the wrapper handles
|
|
68
|
-
*
|
|
69
|
-
*
|
|
62
|
+
* Session owns one instance; the wrapper handles iteration
|
|
63
|
+
* so the rest of Session doesn't touch the raw array.
|
|
64
|
+
*
|
|
65
|
+
* A byte budget caps total memory held by queued messages so a
|
|
66
|
+
* high-rate sender cannot exhaust the process.
|
|
70
67
|
*/
|
|
71
68
|
export class MessageQueue {
|
|
72
69
|
private items: QueuedMessage[] = [];
|
|
73
|
-
private
|
|
74
|
-
private
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
private capacityWarned = false;
|
|
79
|
-
|
|
80
|
-
constructor(maxWaitMs: number = DEFAULT_MAX_WAIT_MS) {
|
|
81
|
-
this.maxWaitMs = maxWaitMs;
|
|
70
|
+
private currentBytes = 0;
|
|
71
|
+
private maxBytes: number;
|
|
72
|
+
|
|
73
|
+
constructor(maxBytes: number = DEFAULT_MAX_QUEUE_BYTES) {
|
|
74
|
+
this.maxBytes = maxBytes;
|
|
82
75
|
}
|
|
83
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Attempt to enqueue a message.
|
|
79
|
+
* Returns `true` if accepted, `false` if rejected (over budget).
|
|
80
|
+
*/
|
|
84
81
|
push(item: QueuedMessage): boolean {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (this.items.length >= MAX_QUEUE_DEPTH) {
|
|
88
|
-
this.droppedCount++;
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
item.queuedAt = Date.now();
|
|
93
|
-
this.items.push(item);
|
|
94
|
-
|
|
95
|
-
const ratio = this.items.length / MAX_QUEUE_DEPTH;
|
|
96
|
-
if (ratio >= CAPACITY_WARNING_THRESHOLD && !this.capacityWarned) {
|
|
97
|
-
this.capacityWarned = true;
|
|
82
|
+
const itemBytes = estimateItemBytes(item);
|
|
83
|
+
if (this.currentBytes + itemBytes > this.maxBytes && this.items.length > 0) {
|
|
98
84
|
log.warn(
|
|
99
|
-
{
|
|
100
|
-
|
|
85
|
+
{
|
|
86
|
+
requestId: item.requestId,
|
|
87
|
+
queueDepth: this.items.length,
|
|
88
|
+
currentBytes: this.currentBytes,
|
|
89
|
+
itemBytes,
|
|
90
|
+
maxBytes: this.maxBytes,
|
|
91
|
+
},
|
|
92
|
+
"Rejecting queued message: queue byte budget exceeded",
|
|
101
93
|
);
|
|
102
|
-
|
|
103
|
-
this.capacityWarned = false;
|
|
94
|
+
return false;
|
|
104
95
|
}
|
|
105
|
-
|
|
96
|
+
this.items.push(item);
|
|
97
|
+
this.currentBytes += itemBytes;
|
|
106
98
|
return true;
|
|
107
99
|
}
|
|
108
100
|
|
|
109
101
|
shift(): QueuedMessage | undefined {
|
|
110
|
-
this.expireStale();
|
|
111
102
|
const item = this.items.shift();
|
|
112
103
|
if (item) {
|
|
113
|
-
this.
|
|
114
|
-
this.totalWaitMs += Date.now() - item.queuedAt;
|
|
115
|
-
}
|
|
116
|
-
if (this.items.length / MAX_QUEUE_DEPTH < CAPACITY_WARNING_THRESHOLD) {
|
|
117
|
-
this.capacityWarned = false;
|
|
104
|
+
this.currentBytes -= estimateItemBytes(item);
|
|
118
105
|
}
|
|
119
106
|
return item;
|
|
120
107
|
}
|
|
121
108
|
|
|
122
109
|
clear(): void {
|
|
123
110
|
this.items = [];
|
|
124
|
-
this.
|
|
111
|
+
this.currentBytes = 0;
|
|
125
112
|
}
|
|
126
113
|
|
|
127
114
|
get length(): number {
|
|
@@ -132,6 +119,10 @@ export class MessageQueue {
|
|
|
132
119
|
return this.items.length === 0;
|
|
133
120
|
}
|
|
134
121
|
|
|
122
|
+
get totalBytes(): number {
|
|
123
|
+
return this.currentBytes;
|
|
124
|
+
}
|
|
125
|
+
|
|
135
126
|
/**
|
|
136
127
|
* Remove a queued message by its requestId.
|
|
137
128
|
* Returns the removed message, or undefined if not found.
|
|
@@ -139,60 +130,28 @@ export class MessageQueue {
|
|
|
139
130
|
removeByRequestId(requestId: string): QueuedMessage | undefined {
|
|
140
131
|
const idx = this.items.findIndex((m) => m.requestId === requestId);
|
|
141
132
|
if (idx === -1) return undefined;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
getMetrics(): QueueMetrics {
|
|
146
|
-
return {
|
|
147
|
-
currentDepth: this.items.length,
|
|
148
|
-
totalDropped: this.droppedCount,
|
|
149
|
-
totalExpired: this.expiredCount,
|
|
150
|
-
averageWaitMs:
|
|
151
|
-
this.dequeuedCount > 0 ? this.totalWaitMs / this.dequeuedCount : 0,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/** Remove messages that have been waiting longer than maxWaitMs. */
|
|
156
|
-
private expireStale(): void {
|
|
157
|
-
const now = Date.now();
|
|
158
|
-
const cutoff = now - this.maxWaitMs;
|
|
159
|
-
const expired: QueuedMessage[] = [];
|
|
160
|
-
this.items = this.items.filter((item) => {
|
|
161
|
-
if (item.queuedAt < cutoff) {
|
|
162
|
-
this.expiredCount++;
|
|
163
|
-
expired.push(item);
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
return true;
|
|
167
|
-
});
|
|
168
|
-
for (const item of expired) {
|
|
169
|
-
log.warn(
|
|
170
|
-
{ requestId: item.requestId, waitMs: now - item.queuedAt },
|
|
171
|
-
"Expiring stale queued message",
|
|
172
|
-
);
|
|
173
|
-
try {
|
|
174
|
-
item.onEvent({
|
|
175
|
-
type: "error",
|
|
176
|
-
message:
|
|
177
|
-
"Your queued message was dropped because it waited too long in the queue.",
|
|
178
|
-
category: "queue_expired",
|
|
179
|
-
});
|
|
180
|
-
} catch (e) {
|
|
181
|
-
log.debug(
|
|
182
|
-
{ err: e, requestId: item.requestId },
|
|
183
|
-
"Failed to notify client of expired message",
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (
|
|
188
|
-
expired.length > 0 &&
|
|
189
|
-
this.items.length / MAX_QUEUE_DEPTH < CAPACITY_WARNING_THRESHOLD
|
|
190
|
-
) {
|
|
191
|
-
this.capacityWarned = false;
|
|
192
|
-
}
|
|
133
|
+
const [removed] = this.items.splice(idx, 1);
|
|
134
|
+
this.currentBytes -= estimateItemBytes(removed);
|
|
135
|
+
return removed;
|
|
193
136
|
}
|
|
194
137
|
|
|
195
138
|
[Symbol.iterator](): Iterator<QueuedMessage> {
|
|
196
139
|
return this.items[Symbol.iterator]();
|
|
197
140
|
}
|
|
198
141
|
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Estimate the in-memory byte cost of a queued message.
|
|
145
|
+
* Dominated by content text and attachment `data` (base64 strings).
|
|
146
|
+
*/
|
|
147
|
+
function estimateItemBytes(item: QueuedMessage): number {
|
|
148
|
+
let bytes = item.content.length * 2; // JS strings are UTF-16
|
|
149
|
+
for (const a of item.attachments) {
|
|
150
|
+
bytes += a.data.length * 2;
|
|
151
|
+
if (a.extractedText) bytes += a.extractedText.length * 2;
|
|
152
|
+
}
|
|
153
|
+
// Small fixed overhead for metadata, pointers, etc. (not worth
|
|
154
|
+
// measuring precisely — the content/attachment data dominates).
|
|
155
|
+
bytes += 512;
|
|
156
|
+
return bytes;
|
|
157
|
+
}
|
|
@@ -1174,3 +1174,30 @@ export function applyRuntimeInjections(
|
|
|
1174
1174
|
|
|
1175
1175
|
return result;
|
|
1176
1176
|
}
|
|
1177
|
+
|
|
1178
|
+
// ---------------------------------------------------------------------------
|
|
1179
|
+
// Attachment detection
|
|
1180
|
+
// ---------------------------------------------------------------------------
|
|
1181
|
+
|
|
1182
|
+
/** Content block types that indicate user-uploaded attachments. */
|
|
1183
|
+
const ATTACHMENT_CONTENT_TYPES = new Set(["image", "file"]);
|
|
1184
|
+
|
|
1185
|
+
/**
|
|
1186
|
+
* Scan conversation messages for user-uploaded attachment content blocks
|
|
1187
|
+
* (image or file). Returns true as soon as any attachment is found.
|
|
1188
|
+
*
|
|
1189
|
+
* Used to set the one-way `hasAttachments` flag on Session so that asset
|
|
1190
|
+
* tools (asset_search, asset_materialize) are included in tool definitions
|
|
1191
|
+
* only when the conversation contains attachments.
|
|
1192
|
+
*/
|
|
1193
|
+
export function messagesContainAttachments(messages: Message[]): boolean {
|
|
1194
|
+
for (const message of messages) {
|
|
1195
|
+
if (message.role !== "user") continue;
|
|
1196
|
+
for (const block of message.content) {
|
|
1197
|
+
if (ATTACHMENT_CONTENT_TYPES.has(block.type)) {
|
|
1198
|
+
return true;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
return false;
|
|
1203
|
+
}
|
|
@@ -240,12 +240,21 @@ export function projectSkillTools(
|
|
|
240
240
|
const contextIds = contextEntries.map((e) => e.id);
|
|
241
241
|
const allCandidateIds = new Set<string>([...contextIds, ...preactivated]);
|
|
242
242
|
|
|
243
|
+
// Load the catalog (cached for session lifetime) and index by ID
|
|
244
|
+
const catalog = getCachedCatalog(options?.cache);
|
|
245
|
+
const catalogById = new Map<string, SkillSummary>();
|
|
246
|
+
for (const skill of catalog) {
|
|
247
|
+
catalogById.set(skill.id, skill);
|
|
248
|
+
}
|
|
249
|
+
|
|
243
250
|
// Assistant feature flag gate: drop skills whose flag is explicitly OFF,
|
|
244
251
|
// even if they have markers in conversation history from before the flag was turned off.
|
|
245
252
|
const config = getConfig();
|
|
246
253
|
const activeIds = new Set<string>();
|
|
247
254
|
for (const id of allCandidateIds) {
|
|
248
|
-
|
|
255
|
+
const skill = catalogById.get(id);
|
|
256
|
+
const flagKey = skill ? skillFlagKey(skill) : undefined;
|
|
257
|
+
if (!flagKey || isAssistantFeatureFlagEnabled(flagKey, config)) {
|
|
249
258
|
activeIds.add(id);
|
|
250
259
|
}
|
|
251
260
|
}
|
|
@@ -270,14 +279,7 @@ export function projectSkillTools(
|
|
|
270
279
|
return { toolDefinitions: [], allowedToolNames: new Set() };
|
|
271
280
|
}
|
|
272
281
|
|
|
273
|
-
//
|
|
274
|
-
const catalog = getCachedCatalog(options?.cache);
|
|
275
|
-
const catalogById = new Map<string, SkillSummary>();
|
|
276
|
-
for (const skill of catalog) {
|
|
277
|
-
catalogById.set(skill.id, skill);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const allToolDefinitions: ToolDefinition[] = [];
|
|
282
|
+
// Tool definitions are no longer sent to the LLM — tools are invoked via skill_execute dispatch.
|
|
281
283
|
const allToolNames = new Set<string>();
|
|
282
284
|
const successfulEntries = new Map<string, string>();
|
|
283
285
|
// Track skills already unregistered in the version-change branch so the
|
|
@@ -373,7 +375,6 @@ export function projectSkillTools(
|
|
|
373
375
|
|
|
374
376
|
successfulEntries.set(skillId, currentHash);
|
|
375
377
|
for (const tool of accepted) {
|
|
376
|
-
allToolDefinitions.push(tool.getDefinition());
|
|
377
378
|
allToolNames.add(tool.name);
|
|
378
379
|
}
|
|
379
380
|
}
|
|
@@ -405,7 +406,7 @@ export function projectSkillTools(
|
|
|
405
406
|
}
|
|
406
407
|
|
|
407
408
|
return {
|
|
408
|
-
toolDefinitions:
|
|
409
|
+
toolDefinitions: [],
|
|
409
410
|
allowedToolNames: allToolNames,
|
|
410
411
|
};
|
|
411
412
|
}
|
|
@@ -121,6 +121,13 @@ const PROVIDER_MODEL_SHORTCUTS: Record<
|
|
|
121
121
|
},
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
+
/** True when the trimmed content matches a provider shortcut like /opus, /gpt4, etc. */
|
|
125
|
+
export function isProviderShortcut(content: string): boolean {
|
|
126
|
+
const match = content.trim().match(/^\/([a-z0-9-]+)(\s|$)/i);
|
|
127
|
+
if (!match) return false;
|
|
128
|
+
return match[1].toLowerCase() in PROVIDER_MODEL_SHORTCUTS;
|
|
129
|
+
}
|
|
130
|
+
|
|
124
131
|
/** Reverse lookup: model ID → provider, derived from PROVIDER_MODEL_SHORTCUTS. */
|
|
125
132
|
export const MODEL_TO_PROVIDER: Record<string, string> = Object.fromEntries(
|
|
126
133
|
Object.values(PROVIDER_MODEL_SHORTCUTS).map(({ model, provider }) => [
|
|
@@ -7,7 +7,6 @@ import { isPlainObject } from "../util/object.js";
|
|
|
7
7
|
import type {
|
|
8
8
|
CardSurfaceData,
|
|
9
9
|
DynamicPageSurfaceData,
|
|
10
|
-
FileUploadSurfaceData,
|
|
11
10
|
ListSurfaceData,
|
|
12
11
|
ServerMessage,
|
|
13
12
|
SurfaceData,
|
|
@@ -215,7 +214,7 @@ export interface SurfaceSessionContext {
|
|
|
215
214
|
metadata?: Record<string, unknown>,
|
|
216
215
|
options?: { isInteractive?: boolean },
|
|
217
216
|
displayContent?: string,
|
|
218
|
-
): { queued: boolean; rejected?: boolean
|
|
217
|
+
): { queued: boolean; requestId: string; rejected?: boolean };
|
|
219
218
|
getQueueDepth(): number;
|
|
220
219
|
processMessage(
|
|
221
220
|
content: string,
|
|
@@ -573,23 +572,14 @@ export function handleSurfaceAction(
|
|
|
573
572
|
requestId,
|
|
574
573
|
surfaceId,
|
|
575
574
|
);
|
|
575
|
+
|
|
576
576
|
if (result.rejected) {
|
|
577
|
-
|
|
578
|
-
onEvent(
|
|
579
|
-
buildSessionErrorMessage(ctx.conversationId, {
|
|
580
|
-
code: "QUEUE_FULL",
|
|
581
|
-
userMessage:
|
|
582
|
-
"Message queue is full (max depth: 10). Please wait for current messages to be processed.",
|
|
583
|
-
retryable: true,
|
|
584
|
-
debugDetails: "Relay prompt rejected — session queue is full",
|
|
585
|
-
}),
|
|
586
|
-
);
|
|
577
|
+
ctx.surfaceActionRequestIds.delete(requestId);
|
|
587
578
|
return;
|
|
588
579
|
}
|
|
589
580
|
|
|
590
581
|
// Echo the prompt to the client so it appears in the chat UI.
|
|
591
|
-
//
|
|
592
|
-
// won't be processed.
|
|
582
|
+
// Deferred until after rejection check to avoid ghost messages.
|
|
593
583
|
ctx.sendToClient({
|
|
594
584
|
type: "user_message_echo",
|
|
595
585
|
text: prompt,
|
|
@@ -715,15 +705,6 @@ export function handleSurfaceAction(
|
|
|
715
705
|
ctx.surfaceActionRequestIds.add(requestId);
|
|
716
706
|
const onEvent = (msg: ServerMessage) => ctx.sendToClient(msg);
|
|
717
707
|
|
|
718
|
-
// Echo the user's prompt to the client so it appears in the chat UI
|
|
719
|
-
if (shouldRelayPrompt && prompt) {
|
|
720
|
-
ctx.sendToClient({
|
|
721
|
-
type: "user_message_echo",
|
|
722
|
-
text: prompt,
|
|
723
|
-
sessionId: ctx.conversationId,
|
|
724
|
-
});
|
|
725
|
-
}
|
|
726
|
-
|
|
727
708
|
ctx.traceEmitter.emit("request_received", "Surface action received", {
|
|
728
709
|
requestId,
|
|
729
710
|
status: "info",
|
|
@@ -741,6 +722,20 @@ export function handleSurfaceAction(
|
|
|
741
722
|
undefined,
|
|
742
723
|
displayContent,
|
|
743
724
|
);
|
|
725
|
+
if (result.rejected) {
|
|
726
|
+
ctx.surfaceActionRequestIds.delete(requestId);
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Echo the user's prompt to the client so it appears in the chat UI.
|
|
731
|
+
// Deferred until after rejection check to avoid ghost messages.
|
|
732
|
+
if (shouldRelayPrompt && prompt) {
|
|
733
|
+
ctx.sendToClient({
|
|
734
|
+
type: "user_message_echo",
|
|
735
|
+
text: prompt,
|
|
736
|
+
sessionId: ctx.conversationId,
|
|
737
|
+
});
|
|
738
|
+
}
|
|
744
739
|
if (result.queued) {
|
|
745
740
|
const position = ctx.getQueueDepth();
|
|
746
741
|
if (!retainPending) {
|
|
@@ -768,29 +763,6 @@ export function handleSurfaceAction(
|
|
|
768
763
|
return;
|
|
769
764
|
}
|
|
770
765
|
|
|
771
|
-
if (result.rejected) {
|
|
772
|
-
log.error({ surfaceId, actionId }, "Surface action rejected — queue full");
|
|
773
|
-
ctx.traceEmitter.emit(
|
|
774
|
-
"request_error",
|
|
775
|
-
"Surface action rejected — queue full",
|
|
776
|
-
{
|
|
777
|
-
requestId,
|
|
778
|
-
status: "error",
|
|
779
|
-
attributes: { reason: "queue_full", source: "surface_action" },
|
|
780
|
-
},
|
|
781
|
-
);
|
|
782
|
-
onEvent(
|
|
783
|
-
buildSessionErrorMessage(ctx.conversationId, {
|
|
784
|
-
code: "QUEUE_FULL",
|
|
785
|
-
userMessage:
|
|
786
|
-
"Message queue is full (max depth: 10). Please wait for current messages to be processed.",
|
|
787
|
-
retryable: true,
|
|
788
|
-
debugDetails: "Surface action rejected — session queue is full",
|
|
789
|
-
}),
|
|
790
|
-
);
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
|
|
794
766
|
if (!retainPending) {
|
|
795
767
|
ctx.pendingSurfaceActions.delete(surfaceId);
|
|
796
768
|
}
|
|
@@ -959,7 +931,7 @@ export function buildUserFacingLabel(
|
|
|
959
931
|
|
|
960
932
|
/**
|
|
961
933
|
* Resolve a proxy tool call that targets a UI surface.
|
|
962
|
-
* Handles ui_show, ui_update, ui_dismiss,
|
|
934
|
+
* Handles ui_show, ui_update, ui_dismiss, computer_use_request_control, and app_open.
|
|
963
935
|
*/
|
|
964
936
|
export async function surfaceProxyResolver(
|
|
965
937
|
ctx: SurfaceSessionContext,
|
|
@@ -980,56 +952,6 @@ export async function surfaceProxyResolver(
|
|
|
980
952
|
}
|
|
981
953
|
}
|
|
982
954
|
|
|
983
|
-
if (toolName === "request_file") {
|
|
984
|
-
const surfaceId = uuid();
|
|
985
|
-
const prompt =
|
|
986
|
-
typeof input.prompt === "string" ? input.prompt : "Please share a file";
|
|
987
|
-
const acceptedTypes = Array.isArray(input.accepted_types)
|
|
988
|
-
? (input.accepted_types as string[])
|
|
989
|
-
: undefined;
|
|
990
|
-
const maxFiles = typeof input.max_files === "number" ? input.max_files : 1;
|
|
991
|
-
|
|
992
|
-
const data: FileUploadSurfaceData = {
|
|
993
|
-
prompt,
|
|
994
|
-
acceptedTypes,
|
|
995
|
-
maxFiles,
|
|
996
|
-
};
|
|
997
|
-
|
|
998
|
-
ctx.surfaceState.set(surfaceId, { surfaceType: "file_upload", data });
|
|
999
|
-
|
|
1000
|
-
ctx.sendToClient({
|
|
1001
|
-
type: "ui_surface_show",
|
|
1002
|
-
sessionId: ctx.conversationId,
|
|
1003
|
-
surfaceId,
|
|
1004
|
-
surfaceType: "file_upload",
|
|
1005
|
-
title: "File Request",
|
|
1006
|
-
data,
|
|
1007
|
-
} as UiSurfaceShow);
|
|
1008
|
-
|
|
1009
|
-
// Track surface for persistence
|
|
1010
|
-
ctx.currentTurnSurfaces.push({
|
|
1011
|
-
surfaceId,
|
|
1012
|
-
surfaceType: "file_upload",
|
|
1013
|
-
title: "File Request",
|
|
1014
|
-
data,
|
|
1015
|
-
});
|
|
1016
|
-
|
|
1017
|
-
// Non-blocking: return immediately, user action arrives as follow-up message
|
|
1018
|
-
ctx.pendingSurfaceActions.set(surfaceId, {
|
|
1019
|
-
surfaceType: "file_upload" as SurfaceType,
|
|
1020
|
-
});
|
|
1021
|
-
return {
|
|
1022
|
-
content: JSON.stringify({
|
|
1023
|
-
surfaceId,
|
|
1024
|
-
status: "awaiting_user_action",
|
|
1025
|
-
message:
|
|
1026
|
-
"File upload dialog displayed and the user can see it. The uploaded file data will arrive as a follow-up message. Do not output any waiting message — just stop here.",
|
|
1027
|
-
}),
|
|
1028
|
-
isError: false,
|
|
1029
|
-
yieldToUser: true,
|
|
1030
|
-
};
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
955
|
if (toolName === "ui_show") {
|
|
1034
956
|
const surfaceId = uuid();
|
|
1035
957
|
const surfaceType = input.surface_type as SurfaceType;
|