@vellumai/assistant 0.4.43 → 0.4.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +4 -0
- package/ARCHITECTURE.md +46 -44
- package/README.md +15 -16
- package/bun.lock +10 -35
- package/docs/architecture/integrations.md +102 -215
- package/docs/architecture/keychain-broker.md +1 -1
- package/docs/architecture/memory.md +2 -2
- package/docs/architecture/scheduling.md +1 -1
- package/docs/architecture/security.md +11 -11
- package/docs/error-handling.md +1 -1
- package/docs/trusted-contact-access.md +3 -3
- package/drizzle/meta/0000_snapshot.json +34 -100
- package/drizzle/meta/_journal.json +1 -1
- package/drizzle.config.ts +4 -4
- package/package.json +3 -2
- package/scripts/capture-x-graphql.ts +237 -141
- package/scripts/generate-bundled-tool-registry.ts +223 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/actor-token-service.test.ts +23 -24
- package/src/__tests__/agent-loop.test.ts +0 -131
- package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
- package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
- package/src/__tests__/approval-primitive.test.ts +0 -1
- package/src/__tests__/approval-routes-http.test.ts +11 -3
- package/src/__tests__/asset-materialize-tool.test.ts +0 -1
- package/src/__tests__/asset-search-tool.test.ts +0 -1
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
- package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
- package/src/__tests__/attachments-store.test.ts +0 -1
- package/src/__tests__/avatar-e2e.test.ts +74 -115
- package/src/__tests__/avatar-router.test.ts +25 -62
- package/src/__tests__/browser-manager.test.ts +24 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
- package/src/__tests__/browser-skill-endstate.test.ts +8 -11
- package/src/__tests__/btw-routes.test.ts +326 -0
- package/src/__tests__/bundled-asset.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-conversation-messages.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -1
- package/src/__tests__/call-pointer-messages.test.ts +0 -1
- package/src/__tests__/call-recovery.test.ts +0 -1
- package/src/__tests__/call-routes-http.test.ts +0 -1
- package/src/__tests__/call-store.test.ts +0 -1
- package/src/__tests__/canonical-guardian-store.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +5 -7
- package/src/__tests__/channel-retry-sweep.test.ts +0 -1
- package/src/__tests__/checker.test.ts +32 -36
- package/src/__tests__/compaction.benchmark.test.ts +16 -14
- package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +35 -31
- package/src/__tests__/config-schema.test.ts +11 -15
- package/src/__tests__/config-watcher.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conflict-store.test.ts +0 -1
- package/src/__tests__/connection-policy.test.ts +4 -7
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-memory-e2e.test.ts +2 -4
- package/src/__tests__/context-overflow-reducer.test.ts +2 -4
- package/src/__tests__/context-window-manager.test.ts +147 -60
- package/src/__tests__/contradiction-checker.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +0 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
- package/src/__tests__/conversation-store.test.ts +0 -1
- package/src/__tests__/conversation-unread-route.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/cross-provider-web-search.test.ts +353 -0
- package/src/__tests__/daemon-assistant-events.test.ts +6 -7
- package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +189 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
- package/src/__tests__/entity-extractor.test.ts +0 -1
- package/src/__tests__/entity-search.test.ts +0 -1
- package/src/__tests__/ephemeral-permissions.test.ts +2 -4
- package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
- package/src/__tests__/file-read-tool.test.ts +86 -0
- package/src/__tests__/followup-tools.test.ts +0 -1
- package/src/__tests__/frontmatter.test.ts +77 -34
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/gateway-only-guard.test.ts +1 -1
- package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
- package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
- package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
- package/src/__tests__/guardian-action-store.test.ts +0 -1
- package/src/__tests__/guardian-action-sweep.test.ts +0 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-outbound-http.test.ts +0 -1
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
- package/src/__tests__/host-bash-proxy.test.ts +335 -0
- package/src/__tests__/host-file-proxy.test.ts +374 -0
- package/src/__tests__/host-shell-tool.test.ts +147 -1
- package/src/__tests__/http-user-message-parity.test.ts +361 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
- package/src/__tests__/integration-status.test.ts +3 -8
- package/src/__tests__/intent-routing.test.ts +7 -46
- package/src/__tests__/invite-redemption-service.test.ts +0 -1
- package/src/__tests__/invite-routes-http.test.ts +0 -1
- package/src/__tests__/llm-usage-store.test.ts +0 -1
- package/src/__tests__/managed-avatar-client.test.ts +101 -55
- package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
- package/src/__tests__/managed-store.test.ts +94 -21
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
- package/src/__tests__/memory-recall-quality.test.ts +0 -1
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
- package/src/__tests__/memory-regressions.test.ts +0 -1
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
- package/src/__tests__/messaging-send-tool.test.ts +35 -0
- package/src/__tests__/messaging-skill-split.test.ts +138 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
- package/src/__tests__/migration-export-http.test.ts +2 -3
- package/src/__tests__/migration-import-commit-http.test.ts +1 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
- package/src/__tests__/migration-validate-http.test.ts +1 -2
- package/src/__tests__/native-web-search.test.ts +475 -0
- package/src/__tests__/navigate-settings-tab.test.ts +84 -0
- package/src/__tests__/non-member-access-request.test.ts +0 -1
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-strategy.test.ts +6 -6
- package/src/__tests__/notification-deep-link.test.ts +7 -7
- package/src/__tests__/notification-guardian-path.test.ts +2 -3
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
- package/src/__tests__/notification-thread-candidates.test.ts +4 -4
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +0 -10
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/profile-compiler.test.ts +0 -1
- package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
- package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
- package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
- package/src/__tests__/recording-handler.test.ts +30 -94
- package/src/__tests__/registry.test.ts +28 -35
- package/src/__tests__/relay-server.test.ts +0 -1
- package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +0 -1
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
- package/src/__tests__/schedule-store.test.ts +441 -1
- package/src/__tests__/schedule-tools.test.ts +468 -7
- package/src/__tests__/scheduler-recurrence.test.ts +196 -23
- package/src/__tests__/scoped-approval-grants.test.ts +0 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
- package/src/__tests__/secret-response-routing.test.ts +4 -1
- package/src/__tests__/send-endpoint-busy.test.ts +14 -5
- package/src/__tests__/send-notification-tool.test.ts +0 -7
- package/src/__tests__/sequence-store.test.ts +0 -1
- package/src/__tests__/server-history-render.test.ts +1 -2
- package/src/__tests__/session-abort-tool-results.test.ts +0 -1
- package/src/__tests__/session-agent-loop.test.ts +46 -6
- package/src/__tests__/session-confirmation-signals.test.ts +7 -46
- package/src/__tests__/session-conflict-gate.test.ts +2 -6
- package/src/__tests__/session-error.test.ts +5 -14
- package/src/__tests__/session-init.benchmark.test.ts +3 -5
- package/src/__tests__/session-load-history-repair.test.ts +0 -1
- package/src/__tests__/session-media-retry.test.ts +12 -74
- package/src/__tests__/session-pre-run-repair.test.ts +0 -1
- package/src/__tests__/session-profile-injection.test.ts +2 -6
- package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
- package/src/__tests__/session-queue.test.ts +94 -139
- package/src/__tests__/session-skill-tools.test.ts +115 -115
- package/src/__tests__/session-slash-known.test.ts +0 -1
- package/src/__tests__/session-slash-queue.test.ts +0 -1
- package/src/__tests__/session-slash-unknown.test.ts +0 -1
- package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
- package/src/__tests__/session-usage.test.ts +0 -1
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
- package/src/__tests__/session-workspace-injection.test.ts +2 -6
- package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
- package/src/__tests__/skill-feature-flags.test.ts +125 -18
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
- package/src/__tests__/skill-load-tool.test.ts +194 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
- package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
- package/src/__tests__/skills.test.ts +14 -53
- package/src/__tests__/slack-channel-config.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +0 -1
- package/src/__tests__/slack-skill.test.ts +1 -1
- package/src/__tests__/starter-task-flow.test.ts +9 -19
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +7 -7
- package/src/__tests__/task-compiler.test.ts +0 -1
- package/src/__tests__/task-management-tools.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +0 -1
- package/src/__tests__/task-runner.test.ts +0 -1
- package/src/__tests__/task-scheduler.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -1
- package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +5 -5
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +8 -86
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
- package/src/__tests__/trust-store.test.ts +84 -8
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/trusted-contact-verification.test.ts +0 -1
- package/src/__tests__/twilio-provider.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
- package/src/__tests__/update-bulletin.test.ts +0 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
- package/src/__tests__/usage-routes.test.ts +0 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
- package/src/__tests__/voice-session-bridge.test.ts +9 -1
- package/src/__tests__/web-fetch.test.ts +57 -0
- package/src/__tests__/workspace-git-service.test.ts +5 -14
- package/src/__tests__/workspace-policy.test.ts +0 -1
- package/src/agent/loop.ts +22 -34
- package/src/bundler/bundle-signer.ts +4 -4
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/relay-server.ts +1 -1
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/voice-session-bridge.ts +3 -1
- package/src/cli/__tests__/notifications.test.ts +3 -4
- package/src/cli/commands/map.ts +2 -6
- package/src/cli/commands/mcp.ts +73 -15
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/sessions.ts +9 -1
- package/src/cli/commands/skills.ts +6 -10
- package/src/cli/http-client.ts +2 -3
- package/src/cli/main-screen.tsx +10 -10
- package/src/cli/program.ts +0 -4
- package/src/cli/reference.ts +0 -2
- package/src/cli.ts +15 -9
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- package/src/config/bundled-skills/browser/SKILL.md +6 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
- package/src/config/bundled-skills/contacts/SKILL.md +10 -1
- package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
- package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -1
- package/src/config/bundled-skills/doordash/SKILL.md +8 -2
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
- package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
- package/src/config/bundled-skills/followups/SKILL.md +4 -1
- package/src/config/bundled-skills/gmail/SKILL.md +180 -0
- package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
- package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
- package/src/config/bundled-skills/messaging/SKILL.md +23 -139
- package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
- package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
- package/src/config/bundled-skills/notifications/SKILL.md +5 -1
- package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
- package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
- package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
- package/src/config/bundled-skills/schedule/SKILL.md +70 -9
- package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
- package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
- package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
- package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
- package/src/config/bundled-skills/sequences/SKILL.md +47 -0
- package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
- package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
- package/src/config/bundled-skills/settings/SKILL.md +12 -0
- package/src/config/bundled-skills/settings/TOOLS.json +112 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
- package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
- package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
- package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
- package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
- package/src/config/bundled-skills/slack/SKILL.md +5 -1
- package/src/config/bundled-skills/subagent/SKILL.md +4 -1
- package/src/config/bundled-skills/tasks/SKILL.md +5 -2
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
- package/src/config/bundled-skills/watcher/SKILL.md +4 -1
- package/src/config/bundled-tool-registry.ts +118 -107
- package/src/config/env.ts +5 -2
- package/src/config/feature-flag-registry.json +33 -9
- package/src/config/loader.ts +10 -2
- package/src/config/schema.ts +19 -16
- package/src/config/schemas/inference.ts +12 -22
- package/src/config/schemas/memory-storage.ts +19 -1
- package/src/config/schemas/platform.ts +0 -16
- package/src/config/skill-state.ts +11 -8
- package/src/config/skills.ts +83 -32
- package/src/context/token-estimator.ts +11 -0
- package/src/context/window-manager.ts +180 -151
- package/src/daemon/computer-use-session.ts +11 -43
- package/src/daemon/daemon-control.ts +4 -1
- package/src/daemon/handlers/config-channels.ts +5 -9
- package/src/daemon/handlers/config-ingress.ts +0 -4
- package/src/daemon/handlers/config-model.ts +7 -13
- package/src/daemon/handlers/config-telegram.ts +4 -8
- package/src/daemon/handlers/config-voice.ts +2 -5
- package/src/daemon/handlers/dictation.ts +2 -12
- package/src/daemon/handlers/identity.ts +0 -105
- package/src/daemon/handlers/recording.ts +3 -23
- package/src/daemon/handlers/session-history.ts +42 -10
- package/src/daemon/handlers/sessions.ts +53 -72
- package/src/daemon/handlers/shared.ts +7 -28
- package/src/daemon/handlers/skills.ts +31 -27
- package/src/daemon/host-bash-proxy.ts +148 -0
- package/src/daemon/host-file-proxy.ts +135 -0
- package/src/daemon/lifecycle.ts +53 -41
- package/src/daemon/mcp-reload-service.ts +123 -0
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/apps.ts +0 -25
- package/src/daemon/message-types/browser.ts +1 -1
- package/src/daemon/message-types/computer-use.ts +1 -4
- package/src/daemon/message-types/guardian-actions.ts +1 -1
- package/src/daemon/message-types/host-bash.ts +18 -0
- package/src/daemon/message-types/host-file.ts +44 -0
- package/src/daemon/message-types/integrations.ts +1 -73
- package/src/daemon/message-types/messages.ts +15 -0
- package/src/daemon/message-types/schedules.ts +11 -27
- package/src/daemon/message-types/sessions.ts +8 -2
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +1 -1
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/ride-shotgun-handler.ts +35 -43
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +45 -28
- package/src/daemon/session-agent-loop-handlers.ts +72 -9
- package/src/daemon/session-agent-loop.ts +97 -66
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +17 -16
- package/src/daemon/session-lifecycle.ts +20 -1
- package/src/daemon/session-media-retry.ts +1 -15
- package/src/daemon/session-messaging.ts +14 -6
- package/src/daemon/session-process.ts +36 -7
- package/src/daemon/session-queue-manager.ts +62 -103
- package/src/daemon/session-runtime-assembly.ts +27 -7
- package/src/daemon/session-skill-tools.ts +12 -11
- package/src/daemon/session-slash.ts +7 -0
- package/src/daemon/session-surfaces.ts +192 -118
- package/src/daemon/session-tool-setup.ts +146 -6
- package/src/daemon/session.ts +75 -37
- package/src/errors.ts +0 -2
- package/src/export/formatter.ts +6 -0
- package/src/mcp/mcp-oauth-provider.ts +1 -3
- package/src/media/avatar-router.ts +20 -28
- package/src/media/avatar-types.ts +7 -14
- package/src/media/managed-avatar-client.ts +70 -34
- package/src/memory/app-store.ts +0 -18
- package/src/memory/conversation-title-service.ts +1 -2
- package/src/memory/db-init.ts +16 -0
- package/src/memory/embedding-backend.ts +129 -27
- package/src/memory/embedding-gemini.test.ts +256 -0
- package/src/memory/embedding-gemini.ts +47 -13
- package/src/memory/embedding-local.ts +14 -2
- package/src/memory/embedding-ollama.ts +15 -2
- package/src/memory/embedding-openai.ts +15 -2
- package/src/memory/embedding-types.test.ts +116 -0
- package/src/memory/embedding-types.ts +61 -0
- package/src/memory/fingerprint.ts +1 -1
- package/src/memory/indexer.ts +25 -1
- package/src/memory/job-handlers/embedding.test.ts +258 -0
- package/src/memory/job-handlers/embedding.ts +81 -1
- package/src/memory/job-handlers/index-maintenance.ts +35 -1
- package/src/memory/job-handlers/media-processing.ts +11 -1
- package/src/memory/job-utils.ts +21 -6
- package/src/memory/jobs-store.ts +5 -1
- package/src/memory/jobs-worker.ts +8 -0
- package/src/memory/message-content.ts +66 -0
- package/src/memory/migrations/100-core-tables.ts +1 -31
- package/src/memory/migrations/104-core-indexes.ts +0 -11
- package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
- package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
- package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/migrations/registry.ts +19 -0
- package/src/memory/qdrant-client.ts +158 -43
- package/src/memory/retriever.test.ts +0 -1
- package/src/memory/retriever.ts +12 -2
- package/src/memory/schema/infrastructure.ts +5 -37
- package/src/memory/search/formatting.ts +34 -9
- package/src/memory/search/semantic.ts +57 -2
- package/src/memory/search/types.ts +2 -1
- package/src/notifications/AGENTS.md +2 -2
- package/src/notifications/README.md +59 -58
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/broadcaster.ts +5 -5
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +2 -2
- package/src/notifications/destination-resolver.ts +2 -2
- package/src/notifications/emit-signal.ts +8 -8
- package/src/notifications/signal.ts +1 -1
- package/src/notifications/thread-seed-composer.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +12 -1
- package/src/permissions/defaults.ts +13 -17
- package/src/permissions/trust-store.ts +37 -0
- package/src/permissions/workspace-policy.ts +0 -1
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
- package/src/prompts/computer-use-prompt.ts +1 -1
- package/src/prompts/system-prompt.ts +33 -35
- package/src/prompts/templates/BOOTSTRAP.md +0 -3
- package/src/prompts/templates/SOUL.md +1 -2
- package/src/prompts/templates/UPDATES.md +16 -7
- package/src/providers/anthropic/client.ts +87 -33
- package/src/providers/gemini/client.ts +6 -0
- package/src/providers/managed-proxy/constants.ts +5 -0
- package/src/providers/openai/client.ts +15 -0
- package/src/providers/registry.ts +4 -6
- package/src/providers/types.ts +24 -2
- package/src/runtime/AGENTS.md +18 -0
- package/src/runtime/assistant-event-hub.ts +2 -3
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/auth/__tests__/context.test.ts +5 -5
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
- package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
- package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
- package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
- package/src/runtime/auth/__tests__/subject.test.ts +8 -8
- package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
- package/src/runtime/auth/route-policy.ts +8 -8
- package/src/runtime/auth/scopes.ts +2 -1
- package/src/runtime/auth/subject.ts +4 -4
- package/src/runtime/auth/token-service.ts +1 -24
- package/src/runtime/auth/types.ts +3 -3
- package/src/runtime/guardian-action-followup-executor.ts +1 -1
- package/src/runtime/guardian-action-grant-minter.ts +1 -1
- package/src/runtime/guardian-action-service.ts +3 -3
- package/src/runtime/http-server.ts +15 -2
- package/src/runtime/http-types.ts +10 -0
- package/src/runtime/invite-service.ts +3 -3
- package/src/runtime/local-actor-identity.ts +17 -22
- package/src/runtime/middleware/error-handler.ts +14 -1
- package/src/runtime/pending-interactions.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +63 -67
- package/src/runtime/routes/approval-routes.ts +1 -3
- package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- package/src/runtime/routes/btw-routes.ts +155 -0
- package/src/runtime/routes/computer-use-routes.ts +77 -31
- package/src/runtime/routes/conversation-routes.ts +234 -47
- package/src/runtime/routes/diagnostics-routes.ts +154 -43
- package/src/runtime/routes/documents-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/host-bash-routes.ts +83 -0
- package/src/runtime/routes/host-file-routes.ts +79 -0
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +120 -0
- package/src/runtime/routes/mcp-routes.ts +20 -0
- package/src/runtime/routes/migration-routes.ts +3 -3
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +6 -4
- package/src/runtime/routes/schedule-routes.ts +31 -5
- package/src/runtime/routes/session-management-routes.ts +2 -6
- package/src/runtime/routes/session-query-routes.ts +18 -15
- package/src/runtime/routes/settings-routes.ts +7 -351
- package/src/runtime/routes/skills-routes.ts +7 -6
- package/src/runtime/routes/subagents-routes.ts +4 -10
- package/src/runtime/routes/surface-action-routes.ts +3 -14
- package/src/runtime/routes/surface-content-routes.ts +22 -5
- package/src/runtime/routes/work-items-routes.ts +21 -25
- package/src/runtime/routes/workspace-routes.test.ts +3 -3
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/telegram-streaming-delivery.ts +3 -0
- package/src/runtime/verification-outbound-actions.ts +2 -2
- package/src/schedule/integration-status.ts +0 -6
- package/src/schedule/schedule-store.ts +234 -43
- package/src/schedule/scheduler.ts +73 -74
- package/src/security/oauth2.ts +1 -1
- package/src/sequence/store.ts +12 -2
- package/src/skills/frontmatter.ts +19 -77
- package/src/skills/managed-store.ts +11 -2
- package/src/subagent/manager.ts +5 -3
- package/src/tasks/ephemeral-permissions.ts +3 -5
- package/src/tools/AGENTS.md +37 -0
- package/src/tools/apps/executors.ts +0 -6
- package/src/tools/browser/browser-manager.ts +17 -11
- package/src/tools/browser/jit-auth.ts +4 -1
- package/src/tools/claude-code/claude-code.ts +1 -1
- package/src/tools/computer-use/definitions.ts +48 -60
- package/src/tools/document/document-tool.ts +6 -6
- package/src/tools/document/editor-template.ts +10 -8
- package/src/tools/filesystem/edit.ts +2 -1
- package/src/tools/filesystem/read.ts +20 -2
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +17 -1
- package/src/tools/host-filesystem/read.ts +16 -1
- package/src/tools/host-filesystem/write.ts +15 -1
- package/src/tools/host-terminal/host-shell.ts +24 -0
- package/src/tools/memory/definitions.ts +45 -81
- package/src/tools/memory/handlers.test.ts +0 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/memory/register.ts +26 -60
- package/src/tools/network/script-proxy/session-manager.ts +6 -8
- package/src/tools/network/web-fetch.ts +7 -1
- package/src/tools/network/web-search.ts +2 -1
- package/src/tools/registry.ts +23 -0
- package/src/tools/schedule/create.ts +113 -5
- package/src/tools/schedule/list.ts +57 -15
- package/src/tools/schedule/update.ts +73 -3
- package/src/tools/shared/filesystem/image-read.ts +192 -0
- package/src/tools/side-effects.ts +1 -7
- package/src/tools/skills/delete-managed.ts +27 -64
- package/src/tools/skills/execute.ts +54 -0
- package/src/tools/skills/load.ts +127 -5
- package/src/tools/skills/scaffold-managed.ts +93 -172
- package/src/tools/subagent/message.ts +0 -7
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/swarm/delegate.ts +0 -3
- package/src/tools/system/avatar-generator.ts +13 -19
- package/src/tools/system/request-permission.ts +2 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/tool-manifest.ts +41 -47
- package/src/tools/types.ts +6 -2
- package/src/tools/ui-surface/definitions.ts +0 -55
- package/src/util/errors.ts +12 -10
- package/src/workspace/git-service.ts +0 -2
- package/src/__tests__/account-registry.test.ts +0 -258
- package/src/__tests__/email-classifier.test.ts +0 -25
- package/src/__tests__/gmail-integration.test.ts +0 -97
- package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
- package/src/__tests__/home-base-bootstrap.test.ts +0 -84
- package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
- package/src/__tests__/recording-intent-fallback.test.ts +0 -199
- package/src/__tests__/recording-intent.test.ts +0 -985
- package/src/__tests__/recording-state-machine.test.ts +0 -1574
- package/src/__tests__/reminder-store.test.ts +0 -350
- package/src/__tests__/reminder.test.ts +0 -337
- package/src/__tests__/scan-result-store.test.ts +0 -121
- package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
- package/src/__tests__/view-image-tool.test.ts +0 -241
- package/src/cli/commands/amazon/cart.ts +0 -513
- package/src/cli/commands/amazon/checkout.ts +0 -394
- package/src/cli/commands/amazon/client.ts +0 -513
- package/src/cli/commands/amazon/index.ts +0 -920
- package/src/cli/commands/amazon/product-details.ts +0 -145
- package/src/cli/commands/amazon/request-extractor.ts +0 -187
- package/src/cli/commands/amazon/search.ts +0 -76
- package/src/cli/commands/amazon/session.ts +0 -116
- package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
- package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
- package/src/cli/commands/twitter/client.ts +0 -989
- package/src/cli/commands/twitter/index.ts +0 -1160
- package/src/cli/commands/twitter/oauth-client.ts +0 -94
- package/src/cli/commands/twitter/router.ts +0 -396
- package/src/cli/commands/twitter/session.ts +0 -121
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/amazon/SKILL.md +0 -137
- package/src/config/bundled-skills/amazon/icon.svg +0 -13
- package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
- package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
- package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
- package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
- package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
- package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
- package/src/config/bundled-skills/influencer/SKILL.md +0 -144
- package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
- package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
- package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
- package/src/config/bundled-skills/notion/SKILL.md +0 -240
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
- package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
- package/src/config/bundled-skills/reminder/SKILL.md +0 -79
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
- package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
- package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
- package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
- package/src/config/bundled-skills/twitter/SKILL.md +0 -319
- package/src/config/bundled-skills/twitter/icon.svg +0 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
- package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
- package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
- package/src/daemon/handlers/pairing.ts +0 -119
- package/src/daemon/handlers/session-user-message.ts +0 -961
- package/src/daemon/recording-executor.ts +0 -180
- package/src/daemon/recording-intent-fallback.ts +0 -162
- package/src/daemon/recording-intent.ts +0 -493
- package/src/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- package/src/memory/account-store.ts +0 -117
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/email-classifier.ts +0 -208
- package/src/messaging/index.ts +0 -2
- package/src/messaging/outreach-classifier.ts +0 -185
- package/src/messaging/thread-summarizer.ts +0 -346
- package/src/messaging/types.ts +0 -17
- package/src/tools/browser/x-auto-navigate.ts +0 -254
- package/src/tools/credentials/account-registry.ts +0 -144
- package/src/tools/filesystem/view-image.ts +0 -244
- package/src/tools/reminder/reminder-store.ts +0 -194
- package/src/tools/reminder/reminder.ts +0 -158
- package/src/tools/system/navigate-settings.ts +0 -74
- package/src/tools/system/open-system-settings.ts +0 -85
- package/src/tools/system/version.ts +0 -54
- package/src/twitter/platform-proxy-client.ts +0 -405
- package/src/util/cookie-session.ts +0 -98
- /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
- /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { ProviderError } from "../util/errors.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
SessionErrorCode,
|
|
4
|
+
SessionErrorMessage,
|
|
5
|
+
} from "./message-protocol.js";
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
|
-
* Classified session error ready for
|
|
8
|
+
* Classified session error ready for client emission.
|
|
6
9
|
*/
|
|
7
10
|
export interface ClassifiedSessionError {
|
|
8
11
|
code: SessionErrorCode;
|
|
@@ -73,7 +76,7 @@ const CANCEL_PATTERNS = [/abort/i, /cancel/i];
|
|
|
73
76
|
*/
|
|
74
77
|
export interface ErrorContext {
|
|
75
78
|
/** Where in the processing pipeline the error occurred. */
|
|
76
|
-
phase: "agent_loop" | "
|
|
79
|
+
phase: "agent_loop" | "regenerate" | "handler" | "persist";
|
|
77
80
|
/** Whether the abort signal was active when the error occurred. */
|
|
78
81
|
aborted?: boolean;
|
|
79
82
|
}
|
|
@@ -90,11 +93,11 @@ export function isUserCancellation(error: unknown, ctx: ErrorContext): boolean {
|
|
|
90
93
|
return false;
|
|
91
94
|
}
|
|
92
95
|
|
|
93
|
-
/** Maximum length for debugDetails to prevent unbounded
|
|
96
|
+
/** Maximum length for debugDetails to prevent unbounded event payloads. */
|
|
94
97
|
const MAX_DEBUG_DETAIL_LENGTH = 4000;
|
|
95
98
|
|
|
96
99
|
/**
|
|
97
|
-
* Truncate debug details to a reasonable size for
|
|
100
|
+
* Truncate debug details to a reasonable size for transport.
|
|
98
101
|
*/
|
|
99
102
|
function truncateDebugDetails(details: string): string {
|
|
100
103
|
if (details.length <= MAX_DEBUG_DETAIL_LENGTH) return details;
|
|
@@ -121,15 +124,6 @@ export function classifySessionError(
|
|
|
121
124
|
const debugDetails = truncateDebugDetails(rawDetails);
|
|
122
125
|
|
|
123
126
|
// Phase-specific overrides
|
|
124
|
-
if (ctx.phase === "queue") {
|
|
125
|
-
return {
|
|
126
|
-
code: "QUEUE_FULL",
|
|
127
|
-
userMessage: "Message queue is full (10 messages pending).",
|
|
128
|
-
retryable: true,
|
|
129
|
-
debugDetails: truncateDebugDetails(message),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
127
|
if (ctx.phase === "regenerate") {
|
|
134
128
|
const base = classifyCore(error, message);
|
|
135
129
|
return {
|
|
@@ -165,6 +159,13 @@ function classifyCore(
|
|
|
165
159
|
retryable: false,
|
|
166
160
|
};
|
|
167
161
|
}
|
|
162
|
+
if (error.statusCode === 401) {
|
|
163
|
+
return {
|
|
164
|
+
code: "PROVIDER_BILLING",
|
|
165
|
+
userMessage: "Your API key is invalid or expired.",
|
|
166
|
+
retryable: false,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
168
169
|
if (error.statusCode === 429) {
|
|
169
170
|
return {
|
|
170
171
|
code: "PROVIDER_RATE_LIMIT",
|
|
@@ -209,7 +210,7 @@ function classifyCore(
|
|
|
209
210
|
return {
|
|
210
211
|
code: "PROVIDER_API",
|
|
211
212
|
userMessage: "The AI provider rejected the request.",
|
|
212
|
-
retryable:
|
|
213
|
+
retryable: true,
|
|
213
214
|
};
|
|
214
215
|
}
|
|
215
216
|
}
|
|
@@ -311,7 +312,7 @@ function classifyByMessage(
|
|
|
311
312
|
}
|
|
312
313
|
|
|
313
314
|
/**
|
|
314
|
-
* Build a `session_error`
|
|
315
|
+
* Build a `session_error` server message from a classified error.
|
|
315
316
|
*/
|
|
316
317
|
export function buildSessionErrorMessage(
|
|
317
318
|
sessionId: string,
|
|
@@ -24,7 +24,11 @@ import {
|
|
|
24
24
|
import { unregisterSessionSender } from "../tools/browser/browser-screencast.js";
|
|
25
25
|
import { getLogger } from "../util/logger.js";
|
|
26
26
|
import { repairHistory } from "./history-repair.js";
|
|
27
|
-
import type {
|
|
27
|
+
import type {
|
|
28
|
+
SurfaceData,
|
|
29
|
+
SurfaceType,
|
|
30
|
+
UsageStats,
|
|
31
|
+
} from "./message-protocol.js";
|
|
28
32
|
import {
|
|
29
33
|
unregisterCallNotifiers,
|
|
30
34
|
unregisterWatchNotifiers,
|
|
@@ -74,6 +78,7 @@ export interface LoadFromDbContext {
|
|
|
74
78
|
contextCompactedAt: number | null;
|
|
75
79
|
trustContext?: { trustClass: TrustClass };
|
|
76
80
|
loadedHistoryTrustClass?: TrustClass;
|
|
81
|
+
hasAttachments?: boolean;
|
|
77
82
|
}
|
|
78
83
|
|
|
79
84
|
export interface AbortContext {
|
|
@@ -177,6 +182,20 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
|
|
|
177
182
|
|
|
178
183
|
ctx.loadedHistoryTrustClass = trustClass;
|
|
179
184
|
|
|
185
|
+
// Scan ALL db messages (including compacted ones) for attachments so that
|
|
186
|
+
// asset tools remain available after context compaction.
|
|
187
|
+
if (
|
|
188
|
+
ctx.contextCompactedMessageCount > 0 &&
|
|
189
|
+
dbMessages.some(
|
|
190
|
+
(m) =>
|
|
191
|
+
m.role === "user" &&
|
|
192
|
+
(m.content.includes('"type":"image"') ||
|
|
193
|
+
m.content.includes('"type":"file"')),
|
|
194
|
+
)
|
|
195
|
+
) {
|
|
196
|
+
ctx.hasAttachments = true;
|
|
197
|
+
}
|
|
198
|
+
|
|
180
199
|
log.info(
|
|
181
200
|
{ conversationId: ctx.conversationId, count: ctx.messages.length },
|
|
182
201
|
"Loaded messages from DB",
|
|
@@ -19,29 +19,15 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
|
|
|
19
19
|
latestUserIndex: number | null;
|
|
20
20
|
} {
|
|
21
21
|
let latestUserIndex: number | null = null;
|
|
22
|
-
let lastSummaryUserIndex: number | null = null;
|
|
23
22
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
24
23
|
const msg = messages[i];
|
|
25
24
|
if (msg.role !== "user") continue;
|
|
26
25
|
if (isToolResultOnlyMessage(msg)) continue;
|
|
27
|
-
if (getSummaryFromContextMessage(msg) != null)
|
|
28
|
-
// Track the last summary message as a fallback — after aggressive
|
|
29
|
-
// compaction (minKeepRecentUserTurns: 0), the summary may be the only
|
|
30
|
-
// user message left and it can contain preserved image blocks that
|
|
31
|
-
// should not be stripped.
|
|
32
|
-
if (lastSummaryUserIndex == null) lastSummaryUserIndex = i;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
26
|
+
if (getSummaryFromContextMessage(msg) != null) continue;
|
|
35
27
|
latestUserIndex = i;
|
|
36
28
|
break;
|
|
37
29
|
}
|
|
38
30
|
|
|
39
|
-
// Fall back to the summary message when compaction consumed all user turns,
|
|
40
|
-
// so images preserved by compaction are not unconditionally stripped.
|
|
41
|
-
if (latestUserIndex == null && lastSummaryUserIndex != null) {
|
|
42
|
-
latestUserIndex = lastSummaryUserIndex;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
31
|
let modified = false;
|
|
46
32
|
let replacedBlocks = 0;
|
|
47
33
|
let keptLatestMediaBlocks = 0;
|
|
@@ -28,7 +28,10 @@ import {
|
|
|
28
28
|
import type { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
29
29
|
import type { Message } from "../providers/types.js";
|
|
30
30
|
import { getLogger } from "../util/logger.js";
|
|
31
|
-
import type {
|
|
31
|
+
import type {
|
|
32
|
+
ServerMessage,
|
|
33
|
+
UserMessageAttachment,
|
|
34
|
+
} from "./message-protocol.js";
|
|
32
35
|
import type { MessageQueue } from "./session-queue-manager.js";
|
|
33
36
|
import type { TrustContext } from "./session-runtime-assembly.js";
|
|
34
37
|
|
|
@@ -212,7 +215,7 @@ export function enqueueMessage(
|
|
|
212
215
|
metadata?: Record<string, unknown>,
|
|
213
216
|
options?: { isInteractive?: boolean },
|
|
214
217
|
displayContent?: string,
|
|
215
|
-
): { queued: boolean; rejected?: boolean
|
|
218
|
+
): { queued: boolean; requestId: string; rejected?: boolean } {
|
|
216
219
|
if (!ctx.processing) {
|
|
217
220
|
return { queued: false, requestId };
|
|
218
221
|
}
|
|
@@ -225,7 +228,7 @@ export function enqueueMessage(
|
|
|
225
228
|
extractTurnInterfaceContext(metadata) ??
|
|
226
229
|
ctx.getTurnInterfaceContext() ??
|
|
227
230
|
undefined;
|
|
228
|
-
const
|
|
231
|
+
const accepted = ctx.queue.push({
|
|
229
232
|
content,
|
|
230
233
|
attachments,
|
|
231
234
|
requestId,
|
|
@@ -236,11 +239,16 @@ export function enqueueMessage(
|
|
|
236
239
|
turnChannelContext,
|
|
237
240
|
turnInterfaceContext,
|
|
238
241
|
isInteractive: options?.isInteractive,
|
|
239
|
-
queuedAt: Date.now(),
|
|
240
242
|
displayContent,
|
|
241
243
|
});
|
|
242
|
-
if (!
|
|
243
|
-
|
|
244
|
+
if (!accepted) {
|
|
245
|
+
onEvent({
|
|
246
|
+
type: "error",
|
|
247
|
+
message:
|
|
248
|
+
"The assistant is busy and cannot accept more messages right now. Please try again shortly.",
|
|
249
|
+
category: "queue_full",
|
|
250
|
+
});
|
|
251
|
+
return { queued: false, requestId, rejected: true };
|
|
244
252
|
}
|
|
245
253
|
return { queued: true, requestId };
|
|
246
254
|
}
|
|
@@ -36,14 +36,18 @@ import type {
|
|
|
36
36
|
import type { MessageQueue } from "./session-queue-manager.js";
|
|
37
37
|
import type { QueueDrainReason } from "./session-queue-manager.js";
|
|
38
38
|
import type { TrustContext } from "./session-runtime-assembly.js";
|
|
39
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
isProviderShortcut,
|
|
41
|
+
resolveSlash,
|
|
42
|
+
type SlashContext,
|
|
43
|
+
} from "./session-slash.js";
|
|
40
44
|
import type { TraceEmitter } from "./trace-emitter.js";
|
|
41
45
|
import { resolveVerificationSessionIntent } from "./verification-session-intent.js";
|
|
42
46
|
|
|
43
47
|
const log = getLogger("session-process");
|
|
44
48
|
|
|
45
49
|
/** Build a model_info event with fresh config data. */
|
|
46
|
-
function buildModelInfoEvent(): ServerMessage {
|
|
50
|
+
export function buildModelInfoEvent(): ServerMessage {
|
|
47
51
|
const config = getConfig();
|
|
48
52
|
const configured = Object.keys(config.apiKeys).filter(
|
|
49
53
|
(k) => !!config.apiKeys[k],
|
|
@@ -58,7 +62,7 @@ function buildModelInfoEvent(): ServerMessage {
|
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
/** True when the trimmed content is a /model or /models slash command. */
|
|
61
|
-
function isModelSlashCommand(content: string): boolean {
|
|
65
|
+
export function isModelSlashCommand(content: string): boolean {
|
|
62
66
|
const trimmed = content.trim();
|
|
63
67
|
return (
|
|
64
68
|
trimmed === "/model" ||
|
|
@@ -114,6 +118,10 @@ export interface ProcessSessionContext {
|
|
|
114
118
|
setTurnChannelContext(ctx: TurnChannelContext): void;
|
|
115
119
|
getTurnInterfaceContext(): TurnInterfaceContext | null;
|
|
116
120
|
setTurnInterfaceContext(ctx: TurnInterfaceContext): void;
|
|
121
|
+
/** Mark host proxies as unavailable so tool execution uses local fallback. */
|
|
122
|
+
clearProxyAvailability(): void;
|
|
123
|
+
/** Restore host proxy availability based on whether a real client is connected. */
|
|
124
|
+
restoreProxyAvailability(): void;
|
|
117
125
|
emitActivityState(
|
|
118
126
|
phase:
|
|
119
127
|
| "idle"
|
|
@@ -131,7 +139,8 @@ export interface ProcessSessionContext {
|
|
|
131
139
|
| "confirmation_resolved"
|
|
132
140
|
| "message_complete"
|
|
133
141
|
| "generation_cancelled"
|
|
134
|
-
| "error_terminal"
|
|
142
|
+
| "error_terminal"
|
|
143
|
+
| "preview_start",
|
|
135
144
|
anchor?: "assistant_turn" | "user_turn" | "global",
|
|
136
145
|
requestId?: string,
|
|
137
146
|
statusText?: string,
|
|
@@ -260,6 +269,23 @@ export async function drainQueue(
|
|
|
260
269
|
session.setTurnInterfaceContext(queuedInterfaceCtx);
|
|
261
270
|
}
|
|
262
271
|
|
|
272
|
+
// Non-interactive queued messages (channel requests) must not execute tools
|
|
273
|
+
// via the desktop host proxy. Clear proxy availability so isAvailable()
|
|
274
|
+
// returns false and tool execution falls back to local.
|
|
275
|
+
if (next.isInteractive === false) {
|
|
276
|
+
session.clearProxyAvailability();
|
|
277
|
+
} else {
|
|
278
|
+
// Restore proxy availability only for desktop-originating turns (macos/ios)
|
|
279
|
+
// in case a prior non-interactive drain disabled it. Non-desktop interactive
|
|
280
|
+
// interfaces (CLI, Vellum) should not re-enable desktop host proxies.
|
|
281
|
+
const interfaceCtx =
|
|
282
|
+
queuedInterfaceCtx ?? session.getTurnInterfaceContext();
|
|
283
|
+
const sourceInterface = interfaceCtx?.userMessageInterface;
|
|
284
|
+
if (sourceInterface === "macos" || sourceInterface === "ios") {
|
|
285
|
+
session.restoreProxyAvailability();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
263
289
|
// Resolve slash commands for queued messages
|
|
264
290
|
const slashResult = resolveSlash(next.content, buildSlashContext(session));
|
|
265
291
|
|
|
@@ -326,7 +352,10 @@ export async function drainQueue(
|
|
|
326
352
|
|
|
327
353
|
// Emit fresh model info before the text delta so the client has
|
|
328
354
|
// up-to-date configuredProviders when rendering /model or /models UI.
|
|
329
|
-
if (
|
|
355
|
+
if (
|
|
356
|
+
isModelSlashCommand(next.content) ||
|
|
357
|
+
isProviderShortcut(next.content)
|
|
358
|
+
) {
|
|
330
359
|
next.onEvent(buildModelInfoEvent());
|
|
331
360
|
}
|
|
332
361
|
next.onEvent({ type: "assistant_text_delta", text: slashResult.message });
|
|
@@ -510,7 +539,7 @@ export async function drainQueue(
|
|
|
510
539
|
|
|
511
540
|
/**
|
|
512
541
|
* Convenience function that persists a user message and runs the agent loop
|
|
513
|
-
* in a single call. Used by the
|
|
542
|
+
* in a single call. Used by the message-handler path where blocking is expected.
|
|
514
543
|
*/
|
|
515
544
|
export async function processMessage(
|
|
516
545
|
session: ProcessSessionContext,
|
|
@@ -676,7 +705,7 @@ export async function processMessage(
|
|
|
676
705
|
|
|
677
706
|
// Emit fresh model info before the text delta so the client has
|
|
678
707
|
// up-to-date configuredProviders when rendering /model or /models UI.
|
|
679
|
-
if (isModelSlashCommand(content)) {
|
|
708
|
+
if (isModelSlashCommand(content) || isProviderShortcut(content)) {
|
|
680
709
|
onEvent(buildModelInfoEvent());
|
|
681
710
|
}
|
|
682
711
|
onEvent({ type: "assistant_text_delta", text: slashResult.message });
|
|
@@ -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
|
+
}
|
|
@@ -421,13 +421,6 @@ export function injectActiveSurfaceContext(
|
|
|
421
421
|
"8. Keep your text response to 1 brief sentence confirming what you changed.",
|
|
422
422
|
);
|
|
423
423
|
|
|
424
|
-
if (ctx.html.includes('data-vellum-home-base="v1"')) {
|
|
425
|
-
lines.push(
|
|
426
|
-
"9. This is the prebuilt Home Base scaffold. Preserve layout anchors:",
|
|
427
|
-
" `home-base-root`, `home-base-onboarding-lane`, and `home-base-starter-lane`.",
|
|
428
|
-
);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
424
|
// File tree with sizes (capped at 50 files to bound prompt size)
|
|
432
425
|
const files = ctx.appFiles ?? listAppFiles(ctx.appId);
|
|
433
426
|
const MAX_FILE_TREE_ENTRIES = 50;
|
|
@@ -1181,3 +1174,30 @@ export function applyRuntimeInjections(
|
|
|
1181
1174
|
|
|
1182
1175
|
return result;
|
|
1183
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 }) => [
|