@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
|
@@ -3,12 +3,14 @@ import { join, relative } from "node:path";
|
|
|
3
3
|
import { describe, expect, test } from "bun:test";
|
|
4
4
|
|
|
5
5
|
const ASSISTANT_DIR = join(import.meta.dir, "..", "..");
|
|
6
|
+
const REPO_ROOT = join(ASSISTANT_DIR, "..");
|
|
6
7
|
const BUNDLED_SKILLS_DIR = join(
|
|
7
8
|
ASSISTANT_DIR,
|
|
8
9
|
"src",
|
|
9
10
|
"config",
|
|
10
11
|
"bundled-skills",
|
|
11
12
|
);
|
|
13
|
+
const FIRST_PARTY_SKILLS_DIR = join(REPO_ROOT, "skills");
|
|
12
14
|
|
|
13
15
|
function collectSkillFiles(rootDir: string): string[] {
|
|
14
16
|
const pending = [rootDir];
|
|
@@ -33,25 +35,32 @@ function collectSkillFiles(rootDir: string): string[] {
|
|
|
33
35
|
return files;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
const ALL_SKILL_FILES =
|
|
38
|
+
const ALL_SKILL_FILES = [
|
|
39
|
+
...collectSkillFiles(BUNDLED_SKILLS_DIR),
|
|
40
|
+
...collectSkillFiles(FIRST_PARTY_SKILLS_DIR),
|
|
41
|
+
];
|
|
37
42
|
|
|
38
43
|
const GATEWAY_RETRIEVAL_BANLIST: Array<{
|
|
44
|
+
skillDir: string;
|
|
39
45
|
skillPath: string;
|
|
40
46
|
bannedSnippets: string[];
|
|
41
47
|
}> = [
|
|
42
48
|
{
|
|
49
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
43
50
|
skillPath: "guardian-verify-setup/SKILL.md",
|
|
44
51
|
bannedSnippets: [
|
|
45
52
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/channel-verification-sessions/status',
|
|
46
53
|
],
|
|
47
54
|
},
|
|
48
55
|
{
|
|
56
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
49
57
|
skillPath: "telegram-setup/SKILL.md",
|
|
50
58
|
bannedSnippets: [
|
|
51
59
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/telegram/config',
|
|
52
60
|
],
|
|
53
61
|
},
|
|
54
62
|
{
|
|
63
|
+
skillDir: BUNDLED_SKILLS_DIR,
|
|
55
64
|
skillPath: "contacts/SKILL.md",
|
|
56
65
|
bannedSnippets: [
|
|
57
66
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/ingress/members',
|
|
@@ -61,6 +70,7 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
|
|
|
61
70
|
],
|
|
62
71
|
},
|
|
63
72
|
{
|
|
73
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
64
74
|
skillPath: "twilio-setup/SKILL.md",
|
|
65
75
|
bannedSnippets: [
|
|
66
76
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/twilio/config"',
|
|
@@ -68,12 +78,14 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
|
|
|
68
78
|
],
|
|
69
79
|
},
|
|
70
80
|
{
|
|
81
|
+
skillDir: BUNDLED_SKILLS_DIR,
|
|
71
82
|
skillPath: "phone-calls/SKILL.md",
|
|
72
83
|
bannedSnippets: [
|
|
73
84
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/integrations/twilio/config"',
|
|
74
85
|
],
|
|
75
86
|
},
|
|
76
87
|
{
|
|
88
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
77
89
|
skillPath: "public-ingress/SKILL.md",
|
|
78
90
|
bannedSnippets: [
|
|
79
91
|
'curl -s "$INTERNAL_GATEWAY_BASE_URL/v1/',
|
|
@@ -82,6 +94,7 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
|
|
|
82
94
|
],
|
|
83
95
|
},
|
|
84
96
|
{
|
|
97
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
85
98
|
skillPath: "voice-setup/SKILL.md",
|
|
86
99
|
bannedSnippets: [
|
|
87
100
|
"assistant config get elevenlabs.voiceId",
|
|
@@ -89,6 +102,7 @@ const GATEWAY_RETRIEVAL_BANLIST: Array<{
|
|
|
89
102
|
],
|
|
90
103
|
},
|
|
91
104
|
{
|
|
105
|
+
skillDir: FIRST_PARTY_SKILLS_DIR,
|
|
92
106
|
skillPath: "email-setup/SKILL.md",
|
|
93
107
|
bannedSnippets: [
|
|
94
108
|
"host_bash",
|
|
@@ -123,7 +137,7 @@ describe("bundled skill retrieval guard", () => {
|
|
|
123
137
|
const violations: string[] = [];
|
|
124
138
|
|
|
125
139
|
for (const rule of GATEWAY_RETRIEVAL_BANLIST) {
|
|
126
|
-
const abs = join(
|
|
140
|
+
const abs = join(rule.skillDir, rule.skillPath);
|
|
127
141
|
const content = readFileSync(abs, "utf-8");
|
|
128
142
|
for (const snippet of rule.bannedSnippets) {
|
|
129
143
|
if (content.includes(snippet)) {
|
|
@@ -136,7 +150,7 @@ describe("bundled skill retrieval guard", () => {
|
|
|
136
150
|
|
|
137
151
|
if (violations.length > 0) {
|
|
138
152
|
const message = [
|
|
139
|
-
"
|
|
153
|
+
"Skill retrieval contract regression detected.",
|
|
140
154
|
"Migrated skills must not reintroduce direct gateway/keychain retrieval snippets.",
|
|
141
155
|
"",
|
|
142
156
|
"Violations:",
|
|
@@ -147,11 +161,11 @@ describe("bundled skill retrieval guard", () => {
|
|
|
147
161
|
}
|
|
148
162
|
});
|
|
149
163
|
|
|
150
|
-
test("
|
|
164
|
+
test("skills do not contain direct keychain lookup instructions", () => {
|
|
151
165
|
const violations: string[] = [];
|
|
152
166
|
|
|
153
167
|
for (const skillFile of ALL_SKILL_FILES) {
|
|
154
|
-
const rel = relative(
|
|
168
|
+
const rel = relative(REPO_ROOT, skillFile).replaceAll("\\", "/");
|
|
155
169
|
if (KEYCHAIN_ALLOWLIST.has(rel)) continue;
|
|
156
170
|
const content = readFileSync(skillFile, "utf-8");
|
|
157
171
|
for (const pattern of KEYCHAIN_PATTERNS) {
|
|
@@ -163,7 +177,7 @@ describe("bundled skill retrieval guard", () => {
|
|
|
163
177
|
|
|
164
178
|
if (violations.length > 0) {
|
|
165
179
|
const message = [
|
|
166
|
-
"Direct keychain lookup instructions were found in
|
|
180
|
+
"Direct keychain lookup instructions were found in skills.",
|
|
167
181
|
"Use credential_store and CLI/proxied flows instead.",
|
|
168
182
|
"",
|
|
169
183
|
"Violations:",
|
|
@@ -176,11 +190,11 @@ describe("bundled skill retrieval guard", () => {
|
|
|
176
190
|
}
|
|
177
191
|
});
|
|
178
192
|
|
|
179
|
-
test("
|
|
193
|
+
test("skills do not require host_bash for Vellum CLI retrieval commands", () => {
|
|
180
194
|
const violations: string[] = [];
|
|
181
195
|
|
|
182
196
|
for (const skillFile of ALL_SKILL_FILES) {
|
|
183
|
-
const rel = relative(
|
|
197
|
+
const rel = relative(REPO_ROOT, skillFile).replaceAll("\\", "/");
|
|
184
198
|
if (HOST_BASH_RETRIEVAL_ALLOWLIST.has(rel)) continue;
|
|
185
199
|
const content = readFileSync(skillFile, "utf-8");
|
|
186
200
|
const hasHostBash = content.includes("host_bash");
|
|
@@ -196,7 +210,7 @@ describe("bundled skill retrieval guard", () => {
|
|
|
196
210
|
|
|
197
211
|
if (violations.length > 0) {
|
|
198
212
|
const message = [
|
|
199
|
-
"
|
|
213
|
+
"Skills must not require host_bash for Vellum CLI retrieval commands.",
|
|
200
214
|
"Use sandboxed bash for retrieval flows unless an explicit exception is documented.",
|
|
201
215
|
"",
|
|
202
216
|
"Violations:",
|
|
@@ -22,7 +22,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
22
22
|
isMacOS: () => process.platform === "darwin",
|
|
23
23
|
isLinux: () => process.platform === "linux",
|
|
24
24
|
isWindows: () => process.platform === "win32",
|
|
25
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
26
25
|
getPidPath: () => join(testDir, "test.pid"),
|
|
27
26
|
getDbPath: () => join(testDir, "test.db"),
|
|
28
27
|
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"),
|
|
@@ -20,7 +20,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
20
20
|
isMacOS: () => process.platform === "darwin",
|
|
21
21
|
isLinux: () => process.platform === "linux",
|
|
22
22
|
isWindows: () => process.platform === "win32",
|
|
23
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
24
23
|
getPidPath: () => join(testDir, "test.pid"),
|
|
25
24
|
getDbPath: () => join(testDir, "test.db"),
|
|
26
25
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -18,7 +18,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
18
18
|
isMacOS: () => process.platform === "darwin",
|
|
19
19
|
isLinux: () => process.platform === "linux",
|
|
20
20
|
isWindows: () => process.platform === "win32",
|
|
21
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
22
21
|
getPidPath: () => join(testDir, "test.pid"),
|
|
23
22
|
getDbPath: () => join(testDir, "test.db"),
|
|
24
23
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -11,7 +11,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
11
11
|
isMacOS: () => process.platform === "darwin",
|
|
12
12
|
isLinux: () => process.platform === "linux",
|
|
13
13
|
isWindows: () => process.platform === "win32",
|
|
14
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
15
14
|
getPidPath: () => join(testDir, "test.pid"),
|
|
16
15
|
getDbPath: () => join(testDir, "test.db"),
|
|
17
16
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -22,7 +22,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
22
22
|
isMacOS: () => process.platform === "darwin",
|
|
23
23
|
isLinux: () => process.platform === "linux",
|
|
24
24
|
isWindows: () => process.platform === "win32",
|
|
25
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
26
25
|
getPidPath: () => join(testDir, "test.pid"),
|
|
27
26
|
getDbPath: () => join(testDir, "test.db"),
|
|
28
27
|
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"),
|
|
@@ -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"),
|
|
@@ -25,7 +25,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
25
25
|
isMacOS: () => process.platform === "darwin",
|
|
26
26
|
isLinux: () => process.platform === "linux",
|
|
27
27
|
isWindows: () => process.platform === "win32",
|
|
28
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
29
28
|
getPidPath: () => join(testDir, "test.pid"),
|
|
30
29
|
getDbPath: () => join(testDir, "test.db"),
|
|
31
30
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -152,6 +151,7 @@ function registerPendingInteraction(
|
|
|
152
151
|
const handleConfirmationResponse = mock(() => {});
|
|
153
152
|
const mockSession = {
|
|
154
153
|
handleConfirmationResponse,
|
|
154
|
+
ensureActorScopedHistory: async () => {},
|
|
155
155
|
} as unknown as Session;
|
|
156
156
|
|
|
157
157
|
pendingInteractions.register(requestId, {
|
|
@@ -25,7 +25,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
25
25
|
isMacOS: () => process.platform === "darwin",
|
|
26
26
|
isLinux: () => process.platform === "linux",
|
|
27
27
|
isWindows: () => process.platform === "win32",
|
|
28
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
29
28
|
getPidPath: () => join(testDir, "test.pid"),
|
|
30
29
|
getDbPath: () => join(testDir, "test.db"),
|
|
31
30
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -86,6 +85,7 @@ function registerPendingConfirmation(
|
|
|
86
85
|
): void {
|
|
87
86
|
const mockSession = {
|
|
88
87
|
handleConfirmationResponse: mock(() => {}),
|
|
88
|
+
ensureActorScopedHistory: async () => {},
|
|
89
89
|
} as unknown as Session;
|
|
90
90
|
|
|
91
91
|
pendingInteractions.register(requestId, {
|
|
@@ -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"),
|
|
@@ -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"),
|
|
@@ -1293,7 +1292,7 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1293
1292
|
});
|
|
1294
1293
|
|
|
1295
1294
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1296
|
-
// 10.
|
|
1295
|
+
// 10. HTTP handler — channel-aware guardian status response
|
|
1297
1296
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1298
1297
|
|
|
1299
1298
|
/**
|
|
@@ -1327,8 +1326,7 @@ function createMockCtx(): {
|
|
|
1327
1326
|
return { ctx, lastResponse: () => captured };
|
|
1328
1327
|
}
|
|
1329
1328
|
|
|
1330
|
-
|
|
1331
|
-
describe("IPC handler channel-aware guardian status", () => {
|
|
1329
|
+
describe("HTTP handler channel-aware guardian status", () => {
|
|
1332
1330
|
beforeEach(() => {
|
|
1333
1331
|
resetTables();
|
|
1334
1332
|
});
|
|
@@ -1954,10 +1952,10 @@ describe("pending challenge lookup", () => {
|
|
|
1954
1952
|
});
|
|
1955
1953
|
|
|
1956
1954
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1957
|
-
// 16.
|
|
1955
|
+
// 16. HTTP handler — voice guardian verification
|
|
1958
1956
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1959
1957
|
|
|
1960
|
-
describe("
|
|
1958
|
+
describe("HTTP handler voice guardian verification", () => {
|
|
1961
1959
|
beforeEach(() => {
|
|
1962
1960
|
resetTables();
|
|
1963
1961
|
});
|
|
@@ -2540,7 +2538,7 @@ describe("outbound verification sessions", () => {
|
|
|
2540
2538
|
});
|
|
2541
2539
|
|
|
2542
2540
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
2543
|
-
// 18. Outbound Voice Verification (
|
|
2541
|
+
// 18. Outbound Voice Verification (HTTP Handlers)
|
|
2544
2542
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
2545
2543
|
|
|
2546
2544
|
describe("outbound voice verification", () => {
|
|
@@ -12,7 +12,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
12
12
|
isMacOS: () => process.platform === "darwin",
|
|
13
13
|
isLinux: () => process.platform === "linux",
|
|
14
14
|
isWindows: () => process.platform === "win32",
|
|
15
|
-
getSocketPath: () => join(testDir, "test.sock"),
|
|
16
15
|
getPidPath: () => join(testDir, "test.pid"),
|
|
17
16
|
getDbPath: () => join(testDir, "test.db"),
|
|
18
17
|
getLogPath: () => join(testDir, "test.log"),
|
|
@@ -31,7 +31,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
31
31
|
isMacOS: () => process.platform === "darwin",
|
|
32
32
|
isLinux: () => process.platform === "linux",
|
|
33
33
|
isWindows: () => process.platform === "win32",
|
|
34
|
-
getSocketPath: () => join(checkerTestDir, "test.sock"),
|
|
35
34
|
getPidPath: () => join(checkerTestDir, "test.pid"),
|
|
36
35
|
getDbPath: () => join(checkerTestDir, "test.db"),
|
|
37
36
|
getLogPath: () => join(checkerTestDir, "test.log"),
|
|
@@ -98,12 +97,6 @@ import { RiskLevel } from "../permissions/types.js";
|
|
|
98
97
|
import { getTool, registerTool } from "../tools/registry.js";
|
|
99
98
|
import type { Tool } from "../tools/types.js";
|
|
100
99
|
|
|
101
|
-
// Import managed skill tools so they register in the tool registry.
|
|
102
|
-
// Without this, classifyRisk falls through to RiskLevel.Medium (unknown tool)
|
|
103
|
-
// instead of the declared RiskLevel.High — producing wrong test behavior.
|
|
104
|
-
import "../tools/skills/scaffold-managed.js";
|
|
105
|
-
import "../tools/skills/delete-managed.js";
|
|
106
|
-
|
|
107
100
|
// Register a mock skill-origin tool for testing default-ask policy.
|
|
108
101
|
const mockSkillTool: Tool = {
|
|
109
102
|
name: "skill_test_tool",
|
|
@@ -637,27 +630,26 @@ describe("Permission Checker", () => {
|
|
|
637
630
|
expect(result.decision).toBe("prompt");
|
|
638
631
|
});
|
|
639
632
|
|
|
640
|
-
test("host_bash rm is always
|
|
633
|
+
test("host_bash rm is always prompted via default ask rule", async () => {
|
|
641
634
|
const result = await check(
|
|
642
635
|
"host_bash",
|
|
643
636
|
{ command: "rm file.txt" },
|
|
644
637
|
"/tmp",
|
|
645
638
|
);
|
|
646
639
|
expect(result.decision).toBe("prompt");
|
|
647
|
-
expect(result.reason).toContain("
|
|
640
|
+
expect(result.reason).toContain("ask rule");
|
|
648
641
|
});
|
|
649
642
|
|
|
650
|
-
test("plain rm (without -rf)
|
|
651
|
-
//
|
|
652
|
-
//
|
|
653
|
-
// High risk always prompts.
|
|
643
|
+
test("plain rm (without -rf) prompts via default ask rule", async () => {
|
|
644
|
+
// The default ask rule for host_bash prompts ALL commands regardless
|
|
645
|
+
// of risk level — rm commands are no exception.
|
|
654
646
|
const result = await check(
|
|
655
647
|
"host_bash",
|
|
656
648
|
{ command: "rm single-file.txt" },
|
|
657
649
|
"/tmp",
|
|
658
650
|
);
|
|
659
651
|
expect(result.decision).toBe("prompt");
|
|
660
|
-
expect(result.reason).toContain("
|
|
652
|
+
expect(result.reason).toContain("ask rule");
|
|
661
653
|
|
|
662
654
|
// Also verify rm -rf still prompts
|
|
663
655
|
const rfResult = await check(
|
|
@@ -666,7 +658,7 @@ describe("Permission Checker", () => {
|
|
|
666
658
|
"/tmp",
|
|
667
659
|
);
|
|
668
660
|
expect(rfResult.decision).toBe("prompt");
|
|
669
|
-
expect(rfResult.reason).toContain("
|
|
661
|
+
expect(rfResult.reason).toContain("ask rule");
|
|
670
662
|
});
|
|
671
663
|
|
|
672
664
|
test("rm is high risk even with matching trust rule → prompt", async () => {
|
|
@@ -807,11 +799,11 @@ describe("Permission Checker", () => {
|
|
|
807
799
|
expect(result.matchedRule?.id).toBe("default:ask-host_file_edit-global");
|
|
808
800
|
});
|
|
809
801
|
|
|
810
|
-
test("host_bash
|
|
802
|
+
test("host_bash prompts low risk via default ask rule", async () => {
|
|
811
803
|
const result = await check("host_bash", { command: "ls" }, "/tmp");
|
|
812
|
-
expect(result.decision).toBe("
|
|
813
|
-
expect(result.reason).toContain("
|
|
814
|
-
expect(result.matchedRule?.id).toBe("default:
|
|
804
|
+
expect(result.decision).toBe("prompt");
|
|
805
|
+
expect(result.reason).toContain("ask rule");
|
|
806
|
+
expect(result.matchedRule?.id).toBe("default:ask-host_bash-global");
|
|
815
807
|
});
|
|
816
808
|
|
|
817
809
|
test("scaffold_managed_skill prompts by default via managed skill ask rule", async () => {
|
|
@@ -2232,11 +2224,12 @@ describe("Permission Checker", () => {
|
|
|
2232
2224
|
expect(result.matchedRule?.id).toBe("default:allow-bash-global");
|
|
2233
2225
|
});
|
|
2234
2226
|
|
|
2235
|
-
test("host_bash
|
|
2227
|
+
test("host_bash prompts low risk in strict mode (default ask rule matches)", async () => {
|
|
2236
2228
|
testConfig.permissions.mode = "strict";
|
|
2237
2229
|
const result = await check("host_bash", { command: "ls" }, "/tmp");
|
|
2238
|
-
expect(result.decision).toBe("
|
|
2239
|
-
expect(result.
|
|
2230
|
+
expect(result.decision).toBe("prompt");
|
|
2231
|
+
expect(result.reason).toContain("ask rule");
|
|
2232
|
+
expect(result.matchedRule?.id).toBe("default:ask-host_bash-global");
|
|
2240
2233
|
});
|
|
2241
2234
|
|
|
2242
2235
|
test("high-risk host_bash (rm) with no matching rule returns prompt in strict mode", async () => {
|
|
@@ -3570,15 +3563,16 @@ describe("Permission Checker", () => {
|
|
|
3570
3563
|
expect(result.matchedRule?.id).toBe("default:allow-bash-global");
|
|
3571
3564
|
});
|
|
3572
3565
|
|
|
3573
|
-
test("low-risk host_bash
|
|
3566
|
+
test("low-risk host_bash prompts in strict mode (default ask rule matches)", async () => {
|
|
3574
3567
|
testConfig.permissions.mode = "strict";
|
|
3575
3568
|
const result = await check(
|
|
3576
3569
|
"host_bash",
|
|
3577
3570
|
{ command: "echo hello" },
|
|
3578
3571
|
"/tmp",
|
|
3579
3572
|
);
|
|
3580
|
-
expect(result.decision).toBe("
|
|
3581
|
-
expect(result.
|
|
3573
|
+
expect(result.decision).toBe("prompt");
|
|
3574
|
+
expect(result.reason).toContain("ask rule");
|
|
3575
|
+
expect(result.matchedRule?.id).toBe("default:ask-host_bash-global");
|
|
3582
3576
|
});
|
|
3583
3577
|
|
|
3584
3578
|
test("low-risk file_read with no rule prompts in strict mode", async () => {
|
|
@@ -3660,10 +3654,11 @@ describe("Permission Checker", () => {
|
|
|
3660
3654
|
// target-scoped. ───────────────────────────────────────────────
|
|
3661
3655
|
|
|
3662
3656
|
describe("Invariant 4: host execution approvals are explicit and target-scoped", () => {
|
|
3663
|
-
test("host_bash
|
|
3657
|
+
test("host_bash prompts low risk via default ask rule", async () => {
|
|
3664
3658
|
const result = await check("host_bash", { command: "ls" }, "/tmp");
|
|
3665
|
-
expect(result.decision).toBe("
|
|
3666
|
-
expect(result.
|
|
3659
|
+
expect(result.decision).toBe("prompt");
|
|
3660
|
+
expect(result.reason).toContain("ask rule");
|
|
3661
|
+
expect(result.matchedRule?.id).toBe("default:ask-host_bash-global");
|
|
3667
3662
|
});
|
|
3668
3663
|
|
|
3669
3664
|
test("host_file_read prompts by default (no implicit allow)", async () => {
|
|
@@ -3740,7 +3735,7 @@ describe("Permission Checker", () => {
|
|
|
3740
3735
|
expect(matchResult.matchedRule?.id).toBe("inv4-target-scoped");
|
|
3741
3736
|
|
|
3742
3737
|
// Different target — the target-scoped rule should NOT match;
|
|
3743
|
-
// falls back to the default host_bash
|
|
3738
|
+
// falls back to the default host_bash ask rule (prompts)
|
|
3744
3739
|
const noMatchResult = await check(
|
|
3745
3740
|
"host_bash",
|
|
3746
3741
|
{ command: "run script.js" },
|
|
@@ -3749,8 +3744,11 @@ describe("Permission Checker", () => {
|
|
|
3749
3744
|
executionTarget: "/usr/local/bin/bun",
|
|
3750
3745
|
},
|
|
3751
3746
|
);
|
|
3752
|
-
expect(noMatchResult.decision).toBe("
|
|
3753
|
-
expect(noMatchResult.
|
|
3747
|
+
expect(noMatchResult.decision).toBe("prompt");
|
|
3748
|
+
expect(noMatchResult.reason).toContain("ask rule");
|
|
3749
|
+
expect(noMatchResult.matchedRule?.id).toBe(
|
|
3750
|
+
"default:ask-host_bash-global",
|
|
3751
|
+
);
|
|
3754
3752
|
});
|
|
3755
3753
|
});
|
|
3756
3754
|
|
|
@@ -4391,8 +4389,6 @@ describe("computer-use tool permission defaults", () => {
|
|
|
4391
4389
|
test("computer_use_* tools classify as Low risk (proxy tools)", async () => {
|
|
4392
4390
|
const cuToolNames = [
|
|
4393
4391
|
"computer_use_click",
|
|
4394
|
-
"computer_use_double_click",
|
|
4395
|
-
"computer_use_right_click",
|
|
4396
4392
|
"computer_use_type_text",
|
|
4397
4393
|
"computer_use_key",
|
|
4398
4394
|
"computer_use_scroll",
|
|
@@ -4722,10 +4718,10 @@ describe("workspace mode — auto-allow workspace-scoped operations", () => {
|
|
|
4722
4718
|
expect(result.reason).toContain("ask rule");
|
|
4723
4719
|
});
|
|
4724
4720
|
|
|
4725
|
-
test("host_bash →
|
|
4721
|
+
test("host_bash → prompt (default ask rule matches)", async () => {
|
|
4726
4722
|
const result = await check("host_bash", { command: "ls" }, workspaceDir);
|
|
4727
|
-
expect(result.decision).toBe("
|
|
4728
|
-
expect(result.reason).toContain("
|
|
4723
|
+
expect(result.decision).toBe("prompt");
|
|
4724
|
+
expect(result.reason).toContain("ask rule");
|
|
4729
4725
|
});
|
|
4730
4726
|
|
|
4731
4727
|
// ── explicit rules still take precedence in workspace mode ──
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Measures compaction cost with a mock provider:
|
|
5
5
|
* - compaction latency under threshold pressure
|
|
6
6
|
* - no-op fast path for below-threshold histories
|
|
7
|
-
* - token reduction
|
|
8
|
-
* -
|
|
7
|
+
* - token reduction below target budget
|
|
8
|
+
* - single-pass summarization (exactly 1 call)
|
|
9
9
|
* - severe pressure overriding cooldown
|
|
10
10
|
*/
|
|
11
11
|
import { describe, expect, mock, test } from "bun:test";
|
|
@@ -73,10 +73,9 @@ function makeConfig() {
|
|
|
73
73
|
return {
|
|
74
74
|
...DEFAULT_CONFIG.contextWindow,
|
|
75
75
|
maxInputTokens: 6000,
|
|
76
|
-
|
|
76
|
+
targetBudgetRatio: 0.58,
|
|
77
77
|
compactThreshold: 0.6,
|
|
78
|
-
|
|
79
|
-
chunkTokens: 1200,
|
|
78
|
+
summaryBudgetRatio: 0.05,
|
|
80
79
|
};
|
|
81
80
|
}
|
|
82
81
|
|
|
@@ -131,7 +130,7 @@ describe("Compaction benchmark", () => {
|
|
|
131
130
|
expect(counter.calls).toBe(0);
|
|
132
131
|
});
|
|
133
132
|
|
|
134
|
-
test("
|
|
133
|
+
test("compaction reduces tokens below target budget", async () => {
|
|
135
134
|
const counter = { calls: 0 };
|
|
136
135
|
const provider = makeSummaryProvider(counter);
|
|
137
136
|
const config = makeConfig();
|
|
@@ -145,13 +144,17 @@ describe("Compaction benchmark", () => {
|
|
|
145
144
|
const result = await manager.maybeCompact(messages);
|
|
146
145
|
|
|
147
146
|
expect(result.compacted).toBe(true);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
147
|
+
expect(result.estimatedInputTokens).toBeLessThan(
|
|
148
|
+
result.previousEstimatedInputTokens,
|
|
149
|
+
);
|
|
150
|
+
// Target is maxInputTokens * (targetBudgetRatio - summaryBudgetRatio)
|
|
151
|
+
const targetTokens = Math.floor(
|
|
152
|
+
config.maxInputTokens * (config.targetBudgetRatio - config.summaryBudgetRatio),
|
|
153
|
+
);
|
|
154
|
+
expect(result.estimatedInputTokens).toBeLessThanOrEqual(targetTokens);
|
|
152
155
|
});
|
|
153
156
|
|
|
154
|
-
test("
|
|
157
|
+
test("single-pass summarization makes exactly 1 summary call", async () => {
|
|
155
158
|
const counter = { calls: 0 };
|
|
156
159
|
const provider = makeSummaryProvider(counter);
|
|
157
160
|
const config = makeConfig();
|
|
@@ -165,8 +168,7 @@ describe("Compaction benchmark", () => {
|
|
|
165
168
|
const result = await manager.maybeCompact(messages);
|
|
166
169
|
|
|
167
170
|
expect(result.compacted).toBe(true);
|
|
168
|
-
expect(result.summaryCalls).
|
|
169
|
-
expect(result.summaryCalls).toBeLessThanOrEqual(6);
|
|
171
|
+
expect(result.summaryCalls).toBe(1);
|
|
170
172
|
expect(result.summaryCalls).toBe(counter.calls);
|
|
171
173
|
});
|
|
172
174
|
|
|
@@ -177,7 +179,7 @@ describe("Compaction benchmark", () => {
|
|
|
177
179
|
const config = {
|
|
178
180
|
...makeConfig(),
|
|
179
181
|
maxInputTokens: 4000,
|
|
180
|
-
|
|
182
|
+
targetBudgetRatio: 0.55,
|
|
181
183
|
};
|
|
182
184
|
const manager = new ContextWindowManager({
|
|
183
185
|
provider,
|
|
@@ -17,18 +17,19 @@ mock.module("../config/loader.js", () => ({
|
|
|
17
17
|
contextWindow: {
|
|
18
18
|
enabled: true,
|
|
19
19
|
maxInputTokens: 180000,
|
|
20
|
-
|
|
20
|
+
targetBudgetRatio: 0.3,
|
|
21
21
|
compactThreshold: 0.8,
|
|
22
|
-
|
|
23
|
-
summaryMaxTokens: 1200,
|
|
24
|
-
chunkTokens: 12000,
|
|
22
|
+
summaryBudgetRatio: 0.05,
|
|
25
23
|
},
|
|
26
24
|
}),
|
|
27
25
|
invalidateConfigCache: () => {},
|
|
28
26
|
}));
|
|
29
27
|
|
|
30
28
|
import { ComputerUseSession } from "../daemon/computer-use-session.js";
|
|
31
|
-
import type {
|
|
29
|
+
import type {
|
|
30
|
+
CuObservation,
|
|
31
|
+
ServerMessage,
|
|
32
|
+
} from "../daemon/message-protocol.js";
|
|
32
33
|
import type { Provider, ProviderResponse } from "../providers/types.js";
|
|
33
34
|
|
|
34
35
|
function createProvider(responses: ProviderResponse[]): {
|
|
@@ -141,7 +142,7 @@ describe("ComputerUseSession lifecycle", () => {
|
|
|
141
142
|
expect(session.getState()).toBe("error");
|
|
142
143
|
});
|
|
143
144
|
|
|
144
|
-
test("CU session passes exactly
|
|
145
|
+
test("CU session passes exactly 10 computer_use_* tools to the agent loop", async () => {
|
|
145
146
|
let capturedTools: string[] = [];
|
|
146
147
|
const provider: Provider = {
|
|
147
148
|
name: "mock",
|
|
@@ -180,13 +181,11 @@ describe("ComputerUseSession lifecycle", () => {
|
|
|
180
181
|
});
|
|
181
182
|
|
|
182
183
|
const cuTools = capturedTools.filter((n) => n.startsWith("computer_use_"));
|
|
183
|
-
expect(cuTools).toHaveLength(
|
|
184
|
+
expect(cuTools).toHaveLength(10);
|
|
184
185
|
|
|
185
186
|
// Assert exact set of expected CU tool names
|
|
186
187
|
const expectedCuTools = [
|
|
187
188
|
"computer_use_click",
|
|
188
|
-
"computer_use_double_click",
|
|
189
|
-
"computer_use_right_click",
|
|
190
189
|
"computer_use_type_text",
|
|
191
190
|
"computer_use_key",
|
|
192
191
|
"computer_use_scroll",
|
|
@@ -251,7 +250,7 @@ describe("ComputerUseSession lifecycle", () => {
|
|
|
251
250
|
expect(completes[0].isResponse).toBe(true);
|
|
252
251
|
});
|
|
253
252
|
|
|
254
|
-
test("default construction preactivates computer-use skill and provides
|
|
253
|
+
test("default construction preactivates computer-use skill and provides 10 CU tools", async () => {
|
|
255
254
|
let capturedTools: string[] = [];
|
|
256
255
|
const provider: Provider = {
|
|
257
256
|
name: "mock",
|
|
@@ -292,7 +291,7 @@ describe("ComputerUseSession lifecycle", () => {
|
|
|
292
291
|
});
|
|
293
292
|
|
|
294
293
|
const cuTools = capturedTools.filter((n) => n.startsWith("computer_use_"));
|
|
295
|
-
expect(cuTools).toHaveLength(
|
|
294
|
+
expect(cuTools).toHaveLength(10);
|
|
296
295
|
});
|
|
297
296
|
|
|
298
297
|
test("constructor accepts preactivatedSkillIds parameter", () => {
|