@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
|
@@ -6,81 +6,10 @@ import type {
|
|
|
6
6
|
} from "../daemon/message-protocol.js";
|
|
7
7
|
import { INTERACTIVE_SURFACE_TYPES } from "../daemon/message-protocol.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
9
|
+
allUiSurfaceTools,
|
|
10
10
|
uiShowTool,
|
|
11
11
|
} from "../tools/ui-surface/definitions.js";
|
|
12
12
|
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
// request_file tool definition
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
|
|
17
|
-
describe("requestFileTool definition", () => {
|
|
18
|
-
test("has the correct name and category", () => {
|
|
19
|
-
expect(requestFileTool.name).toBe("request_file");
|
|
20
|
-
expect(requestFileTool.category).toBe("ui-surface");
|
|
21
|
-
expect(requestFileTool.executionMode).toBe("proxy");
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test("getDefinition returns correct input_schema", () => {
|
|
25
|
-
const definition = requestFileTool.getDefinition();
|
|
26
|
-
|
|
27
|
-
expect(definition.name).toBe("request_file");
|
|
28
|
-
expect(definition.description).toContain("file");
|
|
29
|
-
|
|
30
|
-
const schema = definition.input_schema as {
|
|
31
|
-
type: string;
|
|
32
|
-
properties: Record<string, unknown>;
|
|
33
|
-
required: string[];
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
expect(schema.type).toBe("object");
|
|
37
|
-
expect(schema.required).toEqual(["prompt"]);
|
|
38
|
-
expect(schema.properties).toHaveProperty("prompt");
|
|
39
|
-
expect(schema.properties).toHaveProperty("accepted_types");
|
|
40
|
-
expect(schema.properties).toHaveProperty("max_files");
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("prompt property is a string type", () => {
|
|
44
|
-
const definition = requestFileTool.getDefinition();
|
|
45
|
-
const props = (
|
|
46
|
-
definition.input_schema as {
|
|
47
|
-
properties: Record<string, { type: string }>;
|
|
48
|
-
}
|
|
49
|
-
).properties;
|
|
50
|
-
|
|
51
|
-
expect(props.prompt.type).toBe("string");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test("accepted_types property is an array of strings", () => {
|
|
55
|
-
const definition = requestFileTool.getDefinition();
|
|
56
|
-
const props = (
|
|
57
|
-
definition.input_schema as {
|
|
58
|
-
properties: Record<string, { type: string; items?: { type: string } }>;
|
|
59
|
-
}
|
|
60
|
-
).properties;
|
|
61
|
-
|
|
62
|
-
expect(props.accepted_types.type).toBe("array");
|
|
63
|
-
expect(props.accepted_types.items).toEqual({ type: "string" });
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test("max_files property is a number type", () => {
|
|
67
|
-
const definition = requestFileTool.getDefinition();
|
|
68
|
-
const props = (
|
|
69
|
-
definition.input_schema as {
|
|
70
|
-
properties: Record<string, { type: string }>;
|
|
71
|
-
}
|
|
72
|
-
).properties;
|
|
73
|
-
|
|
74
|
-
expect(props.max_files.type).toBe("number");
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test("execute throws proxy error", () => {
|
|
78
|
-
expect(() => requestFileTool.execute({}, {} as never)).toThrow(
|
|
79
|
-
"Proxy tool: execution must be forwarded to the connected client",
|
|
80
|
-
);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
13
|
// ---------------------------------------------------------------------------
|
|
85
14
|
// FileUploadSurfaceData shape
|
|
86
15
|
// ---------------------------------------------------------------------------
|
|
@@ -164,3 +93,13 @@ describe("ui_show tool includes file_upload", () => {
|
|
|
164
93
|
expect(definition.description).toContain("file_upload");
|
|
165
94
|
});
|
|
166
95
|
});
|
|
96
|
+
|
|
97
|
+
describe("UI surface tool registration", () => {
|
|
98
|
+
test("registers only the base UI surface tools", () => {
|
|
99
|
+
expect(allUiSurfaceTools.map((tool) => tool.name)).toEqual([
|
|
100
|
+
"ui_show",
|
|
101
|
+
"ui_update",
|
|
102
|
+
"ui_dismiss",
|
|
103
|
+
]);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -16,7 +16,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
16
16
|
isMacOS: () => process.platform === "darwin",
|
|
17
17
|
isLinux: () => process.platform === "linux",
|
|
18
18
|
isWindows: () => process.platform === "win32",
|
|
19
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
20
19
|
getPidPath: () => join(testDir, "test.pid"),
|
|
21
20
|
getDbPath: () => join(testDir, "test.db"),
|
|
22
21
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
10
10
|
isMacOS: () => process.platform === "darwin",
|
|
11
11
|
isLinux: () => process.platform === "linux",
|
|
12
12
|
isWindows: () => process.platform === "win32",
|
|
13
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
14
13
|
getPidPath: () => join(testDir, "test.pid"),
|
|
15
14
|
getDbPath: () => join(testDir, "test.db"),
|
|
16
15
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -737,8 +737,8 @@ describe("ToolExecutor verification control-plane policy gate", () => {
|
|
|
737
737
|
test("unverified channel actor is blocked from side-effect tools", async () => {
|
|
738
738
|
const executor = new ToolExecutor(makePrompter());
|
|
739
739
|
const result = await executor.execute(
|
|
740
|
-
"
|
|
741
|
-
{ fire_at: "2026-02-27T12:00:00-05:00",
|
|
740
|
+
"schedule_create",
|
|
741
|
+
{ name: "test", fire_at: "2026-02-27T12:00:00-05:00", message: "hello" },
|
|
742
742
|
makeContext({ trustClass: "unknown" }),
|
|
743
743
|
);
|
|
744
744
|
expect(result.isError).toBe(true);
|
|
@@ -748,8 +748,8 @@ describe("ToolExecutor verification control-plane policy gate", () => {
|
|
|
748
748
|
test("guardian actor can execute side-effect tools", async () => {
|
|
749
749
|
const executor = new ToolExecutor(makePrompter());
|
|
750
750
|
const result = await executor.execute(
|
|
751
|
-
"
|
|
752
|
-
{ fire_at: "2026-02-27T12:00:00-05:00",
|
|
751
|
+
"schedule_create",
|
|
752
|
+
{ name: "test", fire_at: "2026-02-27T12:00:00-05:00", message: "hello" },
|
|
753
753
|
makeContext({ trustClass: "guardian" }),
|
|
754
754
|
);
|
|
755
755
|
expect(result.isError).toBe(false);
|
|
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
10
10
|
isMacOS: () => process.platform === "darwin",
|
|
11
11
|
isLinux: () => process.platform === "linux",
|
|
12
12
|
isWindows: () => process.platform === "win32",
|
|
13
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
14
13
|
getPidPath: () => join(testDir, "test.pid"),
|
|
15
14
|
getDbPath: () => join(testDir, "test.db"),
|
|
16
15
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -33,7 +33,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
33
33
|
isMacOS: () => process.platform === "darwin",
|
|
34
34
|
isLinux: () => process.platform === "linux",
|
|
35
35
|
isWindows: () => process.platform === "win32",
|
|
36
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
37
36
|
getPidPath: () => join(testDir, "test.pid"),
|
|
38
37
|
getDbPath: () => join(testDir, "test.db"),
|
|
39
38
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -26,7 +26,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
26
26
|
isMacOS: () => process.platform === "darwin",
|
|
27
27
|
isLinux: () => process.platform === "linux",
|
|
28
28
|
isWindows: () => process.platform === "win32",
|
|
29
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
30
29
|
getPidPath: () => join(testDir, "test.pid"),
|
|
31
30
|
getDbPath: () => join(testDir, "test.db"),
|
|
32
31
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -73,6 +72,7 @@ function makeStreamingSession(events: ServerMessage[]): Session {
|
|
|
73
72
|
setTurnChannelContext: () => {},
|
|
74
73
|
setVoiceCallControlPrompt: () => {},
|
|
75
74
|
updateClient: () => {},
|
|
75
|
+
ensureActorScopedHistory: async () => {},
|
|
76
76
|
runAgentLoop: async (
|
|
77
77
|
_content: string,
|
|
78
78
|
_messageId: string,
|
|
@@ -212,6 +212,7 @@ describe("voice-session-bridge", () => {
|
|
|
212
212
|
setTurnChannelContext: () => {},
|
|
213
213
|
setVoiceCallControlPrompt: () => {},
|
|
214
214
|
updateClient: () => {},
|
|
215
|
+
ensureActorScopedHistory: async () => {},
|
|
215
216
|
runAgentLoop: async () => {
|
|
216
217
|
await new Promise((r) => setTimeout(r, 200));
|
|
217
218
|
},
|
|
@@ -263,6 +264,7 @@ describe("voice-session-bridge", () => {
|
|
|
263
264
|
setTurnChannelContext: () => {},
|
|
264
265
|
setVoiceCallControlPrompt: () => {},
|
|
265
266
|
updateClient: () => {},
|
|
267
|
+
ensureActorScopedHistory: async () => {},
|
|
266
268
|
runAgentLoop: async () => {
|
|
267
269
|
await new Promise((r) => setTimeout(r, 200));
|
|
268
270
|
},
|
|
@@ -640,6 +642,7 @@ describe("voice-session-bridge", () => {
|
|
|
640
642
|
updateClient: (handler: (msg: ServerMessage) => void) => {
|
|
641
643
|
clientHandler = handler;
|
|
642
644
|
},
|
|
645
|
+
ensureActorScopedHistory: async () => {},
|
|
643
646
|
runAgentLoop: async () => {
|
|
644
647
|
// Simulate the prompter emitting a confirmation_request via the
|
|
645
648
|
// updateClient callback (this is how the real prompter works).
|
|
@@ -724,6 +727,7 @@ describe("voice-session-bridge", () => {
|
|
|
724
727
|
updateClient: (handler: (msg: ServerMessage) => void) => {
|
|
725
728
|
clientHandler = handler;
|
|
726
729
|
},
|
|
730
|
+
ensureActorScopedHistory: async () => {},
|
|
727
731
|
runAgentLoop: async () => {
|
|
728
732
|
clientHandler({
|
|
729
733
|
type: "confirmation_request",
|
|
@@ -791,6 +795,7 @@ describe("voice-session-bridge", () => {
|
|
|
791
795
|
updateClient: (handler: (msg: ServerMessage) => void) => {
|
|
792
796
|
clientHandler = handler;
|
|
793
797
|
},
|
|
798
|
+
ensureActorScopedHistory: async () => {},
|
|
794
799
|
runAgentLoop: async () => {
|
|
795
800
|
clientHandler({
|
|
796
801
|
type: "confirmation_request",
|
|
@@ -854,6 +859,7 @@ describe("voice-session-bridge", () => {
|
|
|
854
859
|
updateClient: (handler: (msg: ServerMessage) => void) => {
|
|
855
860
|
clientHandler = handler;
|
|
856
861
|
},
|
|
862
|
+
ensureActorScopedHistory: async () => {},
|
|
857
863
|
runAgentLoop: async () => {
|
|
858
864
|
clientHandler({
|
|
859
865
|
type: "confirmation_request",
|
|
@@ -926,6 +932,7 @@ describe("voice-session-bridge", () => {
|
|
|
926
932
|
updateClient: (handler: (msg: ServerMessage) => void) => {
|
|
927
933
|
clientHandler = handler;
|
|
928
934
|
},
|
|
935
|
+
ensureActorScopedHistory: async () => {},
|
|
929
936
|
runAgentLoop: async () => {
|
|
930
937
|
clientHandler({
|
|
931
938
|
type: "secret_request",
|
|
@@ -998,6 +1005,7 @@ describe("voice-session-bridge", () => {
|
|
|
998
1005
|
setTurnChannelContext: () => {},
|
|
999
1006
|
setVoiceCallControlPrompt: () => {},
|
|
1000
1007
|
updateClient: () => {},
|
|
1008
|
+
ensureActorScopedHistory: async () => {},
|
|
1001
1009
|
runAgentLoop: async () => {
|
|
1002
1010
|
await new Promise((r) => setTimeout(r, 200));
|
|
1003
1011
|
},
|
|
@@ -1605,4 +1605,61 @@ describe("web_fetch tool", () => {
|
|
|
1605
1605
|
expect(result.content).toContain("<title>Fake Title</title>");
|
|
1606
1606
|
expect(result.content).toContain("Regular markdown content.");
|
|
1607
1607
|
});
|
|
1608
|
+
|
|
1609
|
+
test("suggests JS rendering may be needed when HTML page returns very little text content", async () => {
|
|
1610
|
+
const spaHtml =
|
|
1611
|
+
'<!doctype html><html><head><title>My App</title></head><body><div id="root"></div><script src="/app.js"></script></body></html>';
|
|
1612
|
+
const result = await executeWithMockFetch(
|
|
1613
|
+
{ url: "https://example.com/spa" },
|
|
1614
|
+
{
|
|
1615
|
+
resolveHostAddresses: async () => ["93.184.216.34"],
|
|
1616
|
+
requestExecutor: async () =>
|
|
1617
|
+
new Response(spaHtml, {
|
|
1618
|
+
status: 200,
|
|
1619
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
1620
|
+
}),
|
|
1621
|
+
},
|
|
1622
|
+
);
|
|
1623
|
+
|
|
1624
|
+
expect(result.isError).toBe(false);
|
|
1625
|
+
expect(result.content).toContain("Extracted text content is very short");
|
|
1626
|
+
expect(result.content).toContain("JavaScript rendering");
|
|
1627
|
+
});
|
|
1628
|
+
|
|
1629
|
+
test("does not suggest browser skill when HTML page has substantial content", async () => {
|
|
1630
|
+
const richHtml = `<!doctype html><html><head><title>Docs</title></head><body><p>${"Lorem ipsum dolor sit amet. ".repeat(20)}</p></body></html>`;
|
|
1631
|
+
const result = await executeWithMockFetch(
|
|
1632
|
+
{ url: "https://example.com/docs" },
|
|
1633
|
+
{
|
|
1634
|
+
resolveHostAddresses: async () => ["93.184.216.34"],
|
|
1635
|
+
requestExecutor: async () =>
|
|
1636
|
+
new Response(richHtml, {
|
|
1637
|
+
status: 200,
|
|
1638
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
1639
|
+
}),
|
|
1640
|
+
},
|
|
1641
|
+
);
|
|
1642
|
+
|
|
1643
|
+
expect(result.isError).toBe(false);
|
|
1644
|
+
expect(result.content).not.toContain("Extracted text content is very short");
|
|
1645
|
+
});
|
|
1646
|
+
|
|
1647
|
+
test("does not suggest JS rendering notice in raw mode even for sparse HTML", async () => {
|
|
1648
|
+
const spaHtml =
|
|
1649
|
+
'<!doctype html><html><head><title>My App</title></head><body><div id="root"></div><script src="/app.js"></script></body></html>';
|
|
1650
|
+
const result = await executeWithMockFetch(
|
|
1651
|
+
{ url: "https://example.com/spa", raw: true },
|
|
1652
|
+
{
|
|
1653
|
+
resolveHostAddresses: async () => ["93.184.216.34"],
|
|
1654
|
+
requestExecutor: async () =>
|
|
1655
|
+
new Response(spaHtml, {
|
|
1656
|
+
status: 200,
|
|
1657
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
1658
|
+
}),
|
|
1659
|
+
},
|
|
1660
|
+
);
|
|
1661
|
+
|
|
1662
|
+
expect(result.isError).toBe(false);
|
|
1663
|
+
expect(result.content).not.toContain("Extracted text content is very short");
|
|
1664
|
+
});
|
|
1608
1665
|
});
|
|
@@ -63,11 +63,9 @@ describe("WorkspaceGitService", () => {
|
|
|
63
63
|
const content = readFileSync(gitignorePath, "utf-8");
|
|
64
64
|
expect(content).toContain("data/db/");
|
|
65
65
|
expect(content).toContain("data/qdrant/");
|
|
66
|
-
expect(content).toContain("data/ipc-blobs/");
|
|
67
66
|
expect(content).toContain("*.log");
|
|
68
67
|
expect(content).toContain("*.sock");
|
|
69
68
|
expect(content).toContain("*.pid");
|
|
70
|
-
expect(content).toContain("vellum.sock");
|
|
71
69
|
expect(content).toContain("session-token");
|
|
72
70
|
});
|
|
73
71
|
|
|
@@ -631,7 +629,6 @@ describe("WorkspaceGitService", () => {
|
|
|
631
629
|
// Verify .gitignore does NOT have our rules yet
|
|
632
630
|
const contentBefore = readFileSync(join(testDir, ".gitignore"), "utf-8");
|
|
633
631
|
expect(contentBefore).not.toContain("data/db/");
|
|
634
|
-
expect(contentBefore).not.toContain("vellum.sock");
|
|
635
632
|
|
|
636
633
|
// Initialize the service — should append rules
|
|
637
634
|
const service = new WorkspaceGitService(testDir);
|
|
@@ -641,9 +638,8 @@ describe("WorkspaceGitService", () => {
|
|
|
641
638
|
expect(contentAfter).toContain("node_modules/"); // original rule preserved
|
|
642
639
|
expect(contentAfter).toContain("data/db/");
|
|
643
640
|
expect(contentAfter).toContain("data/qdrant/");
|
|
644
|
-
expect(contentAfter).toContain("data/ipc-blobs/");
|
|
645
641
|
expect(contentAfter).toContain("*.log");
|
|
646
|
-
expect(contentAfter).toContain("
|
|
642
|
+
expect(contentAfter).toContain("*.sock");
|
|
647
643
|
expect(contentAfter).toContain("session-token");
|
|
648
644
|
});
|
|
649
645
|
|
|
@@ -655,7 +651,7 @@ describe("WorkspaceGitService", () => {
|
|
|
655
651
|
cwd: testDir,
|
|
656
652
|
});
|
|
657
653
|
const oldGitignore =
|
|
658
|
-
"# Runtime state - excluded from git tracking\ndata/\nlogs/\n*.log\n*.sock\n*.pid\n*.sqlite\n*.sqlite-journal\n*.sqlite-wal\n*.sqlite-shm\n*.db\n*.db-journal\n*.db-wal\n*.db-shm\nvellum.
|
|
654
|
+
"# Runtime state - excluded from git tracking\ndata/\nlogs/\n*.log\n*.sock\n*.pid\n*.sqlite\n*.sqlite-journal\n*.sqlite-wal\n*.sqlite-shm\n*.db\n*.db-journal\n*.db-wal\n*.db-shm\nvellum.pid\nsession-token\n";
|
|
659
655
|
writeFileSync(join(testDir, ".gitignore"), oldGitignore);
|
|
660
656
|
writeFileSync(join(testDir, "file.txt"), "content");
|
|
661
657
|
execFileSync("git", ["add", "-A"], { cwd: testDir });
|
|
@@ -677,12 +673,11 @@ describe("WorkspaceGitService", () => {
|
|
|
677
673
|
// New selective rules should be present
|
|
678
674
|
expect(contentAfter).toContain("data/db/");
|
|
679
675
|
expect(contentAfter).toContain("data/qdrant/");
|
|
680
|
-
expect(contentAfter).toContain("data/ipc-blobs/");
|
|
681
676
|
|
|
682
677
|
// Other existing rules should be preserved
|
|
683
678
|
expect(contentAfter).toContain("logs/");
|
|
684
679
|
expect(contentAfter).toContain("*.log");
|
|
685
|
-
expect(contentAfter).toContain("
|
|
680
|
+
expect(contentAfter).toContain("*.sock");
|
|
686
681
|
});
|
|
687
682
|
|
|
688
683
|
test("existing repo gets local identity set on init", async () => {
|
|
@@ -725,7 +720,7 @@ describe("WorkspaceGitService", () => {
|
|
|
725
720
|
cwd: testDir,
|
|
726
721
|
});
|
|
727
722
|
const gitignoreContent =
|
|
728
|
-
"# Runtime state - excluded from git tracking\ndata/db/\ndata/qdrant/\
|
|
723
|
+
"# Runtime state - excluded from git tracking\ndata/db/\ndata/qdrant/\nlogs/\n*.log\n*.sock\n*.pid\n*.sqlite\n*.sqlite-journal\n*.sqlite-wal\n*.sqlite-shm\n*.db\n*.db-journal\n*.db-wal\n*.db-shm\nvellum.pid\nsession-token\n";
|
|
729
724
|
writeFileSync(join(testDir, ".gitignore"), gitignoreContent);
|
|
730
725
|
writeFileSync(join(testDir, "file.txt"), "content");
|
|
731
726
|
execFileSync("git", ["add", "-A"], { cwd: testDir });
|
|
@@ -778,9 +773,6 @@ describe("WorkspaceGitService", () => {
|
|
|
778
773
|
join(testDir, "data", "qdrant", "index.bin"),
|
|
779
774
|
"qdrant content",
|
|
780
775
|
);
|
|
781
|
-
mkdirSync(join(testDir, "data", "ipc-blobs"), { recursive: true });
|
|
782
|
-
writeFileSync(join(testDir, "data", "ipc-blobs", "blob1"), "ipc content");
|
|
783
|
-
|
|
784
776
|
// Create files in tracked data subdirectories
|
|
785
777
|
mkdirSync(join(testDir, "data", "memory"), { recursive: true });
|
|
786
778
|
writeFileSync(join(testDir, "data", "memory", "index.json"), "{}");
|
|
@@ -799,9 +791,8 @@ describe("WorkspaceGitService", () => {
|
|
|
799
791
|
// Ignored subdirectories should NOT be in the commit
|
|
800
792
|
expect(committedFiles).not.toContain("data/db/");
|
|
801
793
|
expect(committedFiles).not.toContain("data/qdrant/");
|
|
802
|
-
expect(committedFiles).not.toContain("data/ipc-blobs/");
|
|
803
794
|
|
|
804
|
-
//
|
|
795
|
+
// Non-ignored data subdirectories SHOULD be in the commit
|
|
805
796
|
expect(committedFiles).toContain("data/memory/index.json");
|
|
806
797
|
expect(committedFiles).toContain("data/apps/state.json");
|
|
807
798
|
});
|
package/src/agent/loop.ts
CHANGED
|
@@ -27,7 +27,6 @@ export interface AgentLoopConfig {
|
|
|
27
27
|
| { type: "auto" }
|
|
28
28
|
| { type: "any" }
|
|
29
29
|
| { type: "tool"; name: string };
|
|
30
|
-
maxToolUseTurns?: number;
|
|
31
30
|
/** Minimum interval (ms) between consecutive LLM calls to prevent spin when tools return instantly */
|
|
32
31
|
minTurnIntervalMs?: number;
|
|
33
32
|
}
|
|
@@ -65,7 +64,14 @@ export type AgentEvent =
|
|
|
65
64
|
status?: string;
|
|
66
65
|
contentBlocks?: ContentBlock[];
|
|
67
66
|
}
|
|
68
|
-
| { type: "
|
|
67
|
+
| { type: "tool_use_preview_start"; toolUseId: string; toolName: string }
|
|
68
|
+
| {
|
|
69
|
+
type: "input_json_delta";
|
|
70
|
+
toolName: string;
|
|
71
|
+
toolUseId: string;
|
|
72
|
+
accumulatedJson: string;
|
|
73
|
+
}
|
|
74
|
+
| { type: "server_tool_start"; name: string; toolUseId: string }
|
|
69
75
|
| { type: "error"; error: Error }
|
|
70
76
|
| {
|
|
71
77
|
type: "usage";
|
|
@@ -82,7 +88,6 @@ export type AgentEvent =
|
|
|
82
88
|
const DEFAULT_CONFIG: AgentLoopConfig = {
|
|
83
89
|
maxTokens: 16000,
|
|
84
90
|
effort: "high",
|
|
85
|
-
maxToolUseTurns: 40,
|
|
86
91
|
minTurnIntervalMs: 150,
|
|
87
92
|
};
|
|
88
93
|
|
|
@@ -90,11 +95,6 @@ const PROGRESS_CHECK_INTERVAL = 5;
|
|
|
90
95
|
const PROGRESS_CHECK_REMINDER =
|
|
91
96
|
"You have been using tools for several turns. Check whether you are making meaningful progress toward the user's goal. If you are stuck in a loop or not making progress, summarize what you have tried and ask the user for guidance instead of continuing.";
|
|
92
97
|
|
|
93
|
-
// Warn the model N turns before the hard limit so it can wrap up gracefully
|
|
94
|
-
const APPROACHING_LIMIT_OFFSET = 5;
|
|
95
|
-
const APPROACHING_LIMIT_WARNING =
|
|
96
|
-
"You are approaching the tool-use turn limit. You have {remaining} turns remaining. Wrap up your current task — summarize progress and present results to the user. If you cannot finish, explain what remains and ask the user how to proceed.";
|
|
97
|
-
|
|
98
98
|
export interface ResolvedSystemPrompt {
|
|
99
99
|
systemPrompt: string;
|
|
100
100
|
maxTokens?: number;
|
|
@@ -301,12 +301,25 @@ export class AgentLoop {
|
|
|
301
301
|
}
|
|
302
302
|
} else if (event.type === "thinking_delta") {
|
|
303
303
|
onEvent({ type: "thinking_delta", thinking: event.thinking });
|
|
304
|
+
} else if (event.type === "tool_use_preview_start") {
|
|
305
|
+
onEvent({
|
|
306
|
+
type: "tool_use_preview_start",
|
|
307
|
+
toolUseId: event.toolUseId,
|
|
308
|
+
toolName: event.toolName,
|
|
309
|
+
});
|
|
304
310
|
} else if (event.type === "input_json_delta") {
|
|
305
311
|
onEvent({
|
|
306
312
|
type: "input_json_delta",
|
|
307
313
|
toolName: event.toolName,
|
|
314
|
+
toolUseId: event.toolUseId,
|
|
308
315
|
accumulatedJson: event.accumulatedJson,
|
|
309
316
|
});
|
|
317
|
+
} else if (event.type === "server_tool_start") {
|
|
318
|
+
onEvent({
|
|
319
|
+
type: "server_tool_start",
|
|
320
|
+
name: event.name,
|
|
321
|
+
toolUseId: event.toolUseId,
|
|
322
|
+
});
|
|
310
323
|
}
|
|
311
324
|
},
|
|
312
325
|
signal,
|
|
@@ -627,32 +640,7 @@ export class AgentLoop {
|
|
|
627
640
|
|
|
628
641
|
// Track tool-use turns and inject progress reminder every N turns
|
|
629
642
|
toolUseTurns++;
|
|
630
|
-
if (
|
|
631
|
-
this.config.maxToolUseTurns &&
|
|
632
|
-
this.config.maxToolUseTurns > 0 &&
|
|
633
|
-
toolUseTurns >= this.config.maxToolUseTurns
|
|
634
|
-
) {
|
|
635
|
-
const limitMessage = `Tool-use turn limit reached (${this.config.maxToolUseTurns}). Stopping to prevent runaway loops; ask the user for guidance.`;
|
|
636
|
-
onEvent({ type: "error", error: new Error(limitMessage) });
|
|
637
|
-
resultBlocks.push({
|
|
638
|
-
type: "text",
|
|
639
|
-
text: `<system_notice>${limitMessage}</system_notice>`,
|
|
640
|
-
});
|
|
641
|
-
history.push({ role: "user", content: resultBlocks });
|
|
642
|
-
break;
|
|
643
|
-
}
|
|
644
|
-
// Soft warning a few turns before the hard limit
|
|
645
|
-
const softLimit =
|
|
646
|
-
(this.config.maxToolUseTurns ?? 0) - APPROACHING_LIMIT_OFFSET;
|
|
647
|
-
if (softLimit > 0 && toolUseTurns === softLimit) {
|
|
648
|
-
resultBlocks.push({
|
|
649
|
-
type: "text",
|
|
650
|
-
text: `<system_notice>${APPROACHING_LIMIT_WARNING.replace(
|
|
651
|
-
"{remaining}",
|
|
652
|
-
String(APPROACHING_LIMIT_OFFSET),
|
|
653
|
-
)}</system_notice>`,
|
|
654
|
-
});
|
|
655
|
-
} else if (toolUseTurns % PROGRESS_CHECK_INTERVAL === 0) {
|
|
643
|
+
if (toolUseTurns % PROGRESS_CHECK_INTERVAL === 0) {
|
|
656
644
|
resultBlocks.push({
|
|
657
645
|
type: "text",
|
|
658
646
|
text: `<system_notice>${PROGRESS_CHECK_REMINDER}</system_notice>`,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Bundle signing for .vellum archives.
|
|
3
3
|
*
|
|
4
4
|
* Computes content hashes, constructs a canonical signing payload,
|
|
5
|
-
* and requests an Ed25519 signature from the Swift client
|
|
5
|
+
* and requests an Ed25519 signature from the Swift client.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
@@ -22,8 +22,8 @@ export interface SignatureJson {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Callback type for requesting a signature from the Swift client
|
|
26
|
-
* The caller provides this so the signer doesn't need to know about
|
|
25
|
+
* Callback type for requesting a signature from the Swift client.
|
|
26
|
+
* The caller provides this so the signer doesn't need to know about transport details.
|
|
27
27
|
*/
|
|
28
28
|
export type SigningCallback = (payload: string) => Promise<{
|
|
29
29
|
signature: string; // base64-encoded
|
|
@@ -109,7 +109,7 @@ export async function signBundle(
|
|
|
109
109
|
});
|
|
110
110
|
const canonicalPayload = JSON.stringify(signingPayload);
|
|
111
111
|
|
|
112
|
-
// 4. Request signature from Swift
|
|
112
|
+
// 4. Request signature from Swift client
|
|
113
113
|
const { signature, keyId } = await requestSignature(canonicalPayload);
|
|
114
114
|
|
|
115
115
|
// 5. Build SignatureJson
|
|
@@ -108,7 +108,7 @@ export class CallController {
|
|
|
108
108
|
private awaitingOpeningAck = false;
|
|
109
109
|
/** Monotonic run id used to suppress stale turn side effects after interruption. */
|
|
110
110
|
private llmRunVersion = 0;
|
|
111
|
-
/** Optional broadcast function for emitting
|
|
111
|
+
/** Optional broadcast function for emitting events to connected clients. */
|
|
112
112
|
private broadcast?: (msg: ServerMessage) => void;
|
|
113
113
|
/** Assistant identity for scoping guardian bindings. */
|
|
114
114
|
private assistantId: string;
|
|
@@ -155,7 +155,7 @@ let globalBroadcast:
|
|
|
155
155
|
| ((msg: import("../daemon/message-protocol.js").ServerMessage) => void)
|
|
156
156
|
| undefined;
|
|
157
157
|
|
|
158
|
-
/** Register a broadcast function so RelayConnection can forward
|
|
158
|
+
/** Register a broadcast function so RelayConnection can forward events to connected clients. */
|
|
159
159
|
export function setRelayBroadcast(
|
|
160
160
|
fn: (msg: import("../daemon/message-protocol.js").ServerMessage) => void,
|
|
161
161
|
): void {
|
package/src/calls/twilio-rest.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Reusable Twilio REST API helpers.
|
|
3
3
|
*
|
|
4
4
|
* Provides low-level building blocks (auth header, base URL, credential
|
|
5
|
-
* resolution) shared across the voice provider and
|
|
5
|
+
* resolution) shared across the voice provider and the
|
|
6
6
|
* config handler. Uses fetch() directly — no twilio npm package.
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -471,7 +471,7 @@ export async function startVoiceTurn(
|
|
|
471
471
|
|
|
472
472
|
// Fire-and-forget the agent loop
|
|
473
473
|
const cleanup = () => {
|
|
474
|
-
// Reset channel capabilities so a subsequent
|
|
474
|
+
// Reset channel capabilities so a subsequent desktop session on the
|
|
475
475
|
// same conversation is not incorrectly treated as a voice client.
|
|
476
476
|
session.setChannelCapabilities(null);
|
|
477
477
|
session.setTrustContext(null);
|
|
@@ -513,6 +513,8 @@ export async function startVoiceTurn(
|
|
|
513
513
|
} else if (msg.type === "tool_use_start") {
|
|
514
514
|
eventSink.onToolUse(msg.toolName, msg.input);
|
|
515
515
|
}
|
|
516
|
+
// Note: tool_use_preview_start is intentionally not handled here.
|
|
517
|
+
// Voice only reacts to the definitive tool_use_start event.
|
|
516
518
|
},
|
|
517
519
|
);
|
|
518
520
|
if (lastError) {
|
|
@@ -23,7 +23,6 @@ mock.module("../../util/platform.js", () => ({
|
|
|
23
23
|
isMacOS: () => process.platform === "darwin",
|
|
24
24
|
isLinux: () => process.platform === "linux",
|
|
25
25
|
isWindows: () => process.platform === "win32",
|
|
26
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
27
26
|
getPidPath: () => join(testDir, "test.pid"),
|
|
28
27
|
getDbPath: () => join(testDir, "test.db"),
|
|
29
28
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -190,7 +189,7 @@ describe("notifications send", () => {
|
|
|
190
189
|
"--source-channel",
|
|
191
190
|
"scheduler",
|
|
192
191
|
"--source-event-name",
|
|
193
|
-
"
|
|
192
|
+
"schedule.notify",
|
|
194
193
|
"--message",
|
|
195
194
|
"Test",
|
|
196
195
|
"--urgency",
|
|
@@ -269,7 +268,7 @@ describe("notifications send", () => {
|
|
|
269
268
|
expect(parsed.error).toContain("bogus.event");
|
|
270
269
|
// Should list valid event names from the registry
|
|
271
270
|
expect(parsed.error).toContain("user.send_notification");
|
|
272
|
-
expect(parsed.error).toContain("
|
|
271
|
+
expect(parsed.error).toContain("schedule.notify");
|
|
273
272
|
});
|
|
274
273
|
|
|
275
274
|
test("send rejects invalid urgency", async () => {
|
|
@@ -399,7 +398,7 @@ describe("notifications list", () => {
|
|
|
399
398
|
|
|
400
399
|
createEvent({
|
|
401
400
|
id: `evt-filter-reminder-${Date.now()}`,
|
|
402
|
-
sourceEventName: "
|
|
401
|
+
sourceEventName: "schedule.notify",
|
|
403
402
|
sourceChannel: "scheduler",
|
|
404
403
|
sourceSessionId: "session-filter-2",
|
|
405
404
|
attentionHints: {
|
package/src/cli/commands/map.ts
CHANGED
|
@@ -224,9 +224,7 @@ async function startLearnSession(
|
|
|
224
224
|
|
|
225
225
|
if (status.bootstrapFailureReason) {
|
|
226
226
|
reject(
|
|
227
|
-
new Error(
|
|
228
|
-
`Learn session failed: ${status.bootstrapFailureReason}`,
|
|
229
|
-
),
|
|
227
|
+
new Error(`Learn session failed: ${status.bootstrapFailureReason}`),
|
|
230
228
|
);
|
|
231
229
|
return;
|
|
232
230
|
}
|
|
@@ -239,9 +237,7 @@ async function startLearnSession(
|
|
|
239
237
|
});
|
|
240
238
|
} else {
|
|
241
239
|
reject(
|
|
242
|
-
new Error(
|
|
243
|
-
"Learn session completed but no recording was saved.",
|
|
244
|
-
),
|
|
240
|
+
new Error("Learn session completed but no recording was saved."),
|
|
245
241
|
);
|
|
246
242
|
}
|
|
247
243
|
return;
|