@vellumai/assistant 0.6.5 → 0.7.0
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/AGENTS.md +29 -1
- package/ARCHITECTURE.md +60 -53
- package/Dockerfile +25 -3
- package/README.md +8 -10
- package/__tests__/permissions/gateway-threshold-reader.test.ts +277 -0
- package/bun.lock +306 -119
- package/docs/architecture/integrations.md +32 -39
- package/docs/architecture/memory.md +26 -120
- package/docs/architecture/security.md +22 -36
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/credential-execution-service.md +7 -5
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +17 -45
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/bun.lock +25 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/knip.json +8 -22
- package/node_modules/@vellumai/ces-client/bun.lock +33 -0
- package/node_modules/@vellumai/ces-client/package.json +25 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +631 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/package-boundary.test.ts +138 -0
- package/node_modules/@vellumai/ces-client/src/credential-rpc.ts +13 -0
- package/node_modules/@vellumai/ces-client/src/http-credentials.ts +296 -0
- package/node_modules/@vellumai/ces-client/src/http-log-export.ts +111 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +43 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +445 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +32 -6
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +32 -1
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +39 -0
- package/node_modules/@vellumai/gateway-client/package.json +23 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/gateway-client.test.ts +343 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/package-boundary.test.ts +140 -0
- package/node_modules/@vellumai/gateway-client/src/http-delivery.ts +422 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +35 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +331 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +131 -0
- package/node_modules/@vellumai/gateway-client/tsconfig.json +20 -0
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/bun.lock +1 -1
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/package.json +4 -2
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/contracts.test.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +155 -0
- package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +23 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +25 -0
- package/node_modules/@vellumai/{ces-contracts/src/index.ts → service-contracts/src/transport.ts} +6 -28
- package/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
- package/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +891 -0
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +24 -0
- package/node_modules/@vellumai/skill-host-contracts/package.json +18 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +91 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +1348 -0
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +6 -0
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +32 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +333 -0
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +444 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +12 -0
- package/openapi.yaml +3135 -692
- package/package.json +13 -7
- package/scripts/check-circular-deps.ts +80 -0
- package/scripts/generate-openapi.ts +24 -7
- package/{src/memory/graph/inspect.ts → scripts/memory-inspect.ts} +28 -28
- package/src/__tests__/access-request-decision.test.ts +2 -11
- package/src/__tests__/acp-session.test.ts +4 -150
- package/src/__tests__/actor-token-service.test.ts +17 -678
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +2 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +404 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -4
- package/src/__tests__/agent-wake-override-profile.test.ts +261 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -1
- package/src/__tests__/anthropic-provider.test.ts +127 -15
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/app-routes-csp.test.ts +106 -55
- package/src/__tests__/approval-cascade.test.ts +10 -357
- package/src/__tests__/approval-conversation-turn.test.ts +3 -8
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -1
- package/src/__tests__/approval-routes-http.test.ts +34 -451
- package/src/__tests__/assistant-events-sse-hardening.test.ts +73 -80
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -3
- package/src/__tests__/attachment-upload-trusted-source.test.ts +139 -0
- package/src/__tests__/attachments-store.test.ts +46 -1
- package/src/__tests__/audit-log-rotation.test.ts +2 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -20
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/background-shell-bash.test.ts +227 -0
- package/src/__tests__/background-shell-host-bash.test.ts +474 -0
- package/src/__tests__/background-tool-registry.test.ts +145 -0
- package/src/__tests__/background-tool-routes.test.ts +175 -0
- package/src/__tests__/btw-routes.test.ts +147 -183
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +15 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -1
- package/src/__tests__/call-domain.test.ts +2 -2
- package/src/__tests__/call-pointer-messages.test.ts +11 -13
- package/src/__tests__/call-recovery.test.ts +2 -1
- package/src/__tests__/call-routes-http.test.ts +3 -14
- package/src/__tests__/call-store.test.ts +2 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +31 -62
- package/src/__tests__/canonical-guardian-store.test.ts +2 -2
- package/src/__tests__/catalog-cache.test.ts +69 -0
- package/src/__tests__/catalog-files.test.ts +0 -26
- package/src/__tests__/ces-rpc-credential-backend.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +79 -49
- package/src/__tests__/channel-approval.test.ts +9 -7
- package/src/__tests__/channel-approvals.test.ts +9 -180
- package/src/__tests__/channel-delivery-store.test.ts +11 -10
- package/src/__tests__/channel-guardian.test.ts +14 -25
- package/src/__tests__/channel-readiness-service.test.ts +8 -6
- package/src/__tests__/channel-reply-delivery.test.ts +3 -19
- package/src/__tests__/channel-retry-sweep.test.ts +2 -5
- package/src/__tests__/checker.test.ts +447 -3806
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +208 -0
- package/src/__tests__/cli.test.ts +1 -38
- package/src/__tests__/compaction-events.test.ts +500 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -7
- package/src/__tests__/config-model-image-provider.test.ts +109 -0
- package/src/__tests__/config-schema-cmd.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +25 -203
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -25
- package/src/__tests__/contact-store-user-file.test.ts +2 -1
- package/src/__tests__/contacts-tools.test.ts +71 -18
- package/src/__tests__/contacts-write.test.ts +6 -61
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-search-agent-protocol.test.ts +230 -0
- package/src/__tests__/context-search-agent-runner.test.ts +998 -0
- package/src/__tests__/context-search-conversations-source.test.ts +320 -0
- package/src/__tests__/context-search-fanout.test.ts +380 -0
- package/src/__tests__/context-search-memory-source.test.ts +311 -0
- package/src/__tests__/context-search-pkb-source.test.ts +444 -0
- package/src/__tests__/context-search-types.test.ts +95 -0
- package/src/__tests__/context-search-workspace-source.test.ts +545 -0
- package/src/__tests__/context-window-manager.test.ts +380 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +14 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +631 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +41 -32
- package/src/__tests__/conversation-agent-loop.test.ts +54 -143
- package/src/__tests__/conversation-analysis-routes.test.ts +60 -82
- package/src/__tests__/conversation-attachments.test.ts +9 -20
- package/src/__tests__/conversation-attention-store.test.ts +2 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +4 -2
- package/src/__tests__/conversation-clear-safety.test.ts +53 -95
- package/src/__tests__/conversation-confirmation-signals.test.ts +7 -40
- package/src/__tests__/conversation-crud-inference-profile.test.ts +54 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +63 -157
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +5 -4
- package/src/__tests__/conversation-fork-crud.test.ts +26 -55
- package/src/__tests__/conversation-fork-route.test.ts +5 -74
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +128 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +216 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +4 -95
- package/src/__tests__/conversation-key-store-disk-view.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +0 -1
- package/src/__tests__/conversation-list-source.test.ts +2 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -1
- package/src/__tests__/conversation-pairing.test.ts +174 -11
- package/src/__tests__/conversation-pre-run-repair.test.ts +137 -294
- package/src/__tests__/conversation-process-callsite.test.ts +3 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +22 -8
- package/src/__tests__/conversation-queue.test.ts +30 -47
- package/src/__tests__/conversation-routes-disk-view.test.ts +131 -103
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +80 -55
- package/src/__tests__/conversation-routes-slash-commands.test.ts +83 -12
- package/src/__tests__/conversation-runtime-assembly.test.ts +196 -194
- package/src/__tests__/conversation-runtime-workspace.test.ts +23 -38
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-slash-commands.test.ts +6 -43
- package/src/__tests__/conversation-slash-queue.test.ts +7 -3
- package/src/__tests__/conversation-slash-unknown.test.ts +25 -3
- package/src/__tests__/conversation-speed-override.test.ts +6 -2
- package/src/__tests__/conversation-starter-routes.test.ts +177 -55
- package/src/__tests__/conversation-starters-cadence.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +2 -375
- package/src/__tests__/conversation-title-service.test.ts +116 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +42 -3
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +6 -6
- package/src/__tests__/conversation-unread-route.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +3 -2
- package/src/__tests__/conversation-wipe.test.ts +2 -103
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +3 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -2
- package/src/__tests__/conversations-defer-cli.test.ts +150 -0
- package/src/__tests__/credential-execution-admin-cli.test.ts +1 -1
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +2 -2
- package/src/__tests__/credential-execution-approval-bridge.test.ts +22 -289
- package/src/__tests__/credential-execution-client.test.ts +1 -1
- package/src/__tests__/credential-execution-managed-contract.test.ts +1 -1
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +16 -2
- package/src/__tests__/credentials-cli.test.ts +45 -21
- package/src/__tests__/daemon-credential-client.test.ts +23 -108
- package/src/__tests__/db-acp-history.test.ts +284 -0
- package/src/__tests__/db-activation-state.test.ts +240 -0
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +2 -1
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +248 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +2 -1
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +116 -0
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +132 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/delete-propagation.test.ts +3 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +39 -32
- package/src/__tests__/dm-backfill.test.ts +3 -2
- package/src/__tests__/edit-propagation.test.ts +5 -7
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +1 -1
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/events-client-registration.test.ts +297 -0
- package/src/__tests__/file-write-tool.test.ts +2 -4
- package/src/__tests__/filing-service.test.ts +144 -17
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/followup-tools.test.ts +2 -1
- package/src/__tests__/gateway-client-managed-outbound.test.ts +8 -12
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -6
- package/src/__tests__/gateway-only-guard.test.ts +4 -3
- package/src/__tests__/gemini-provider.test.ts +276 -10
- package/src/__tests__/graph-extraction-event-date.test.ts +30 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -2
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +9 -9
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -1
- package/src/__tests__/guardian-action-store.test.ts +2 -1
- package/src/__tests__/guardian-action-sweep.test.ts +9 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +21 -118
- package/src/__tests__/guardian-dispatch.test.ts +14 -11
- package/src/__tests__/guardian-grant-minting.test.ts +9 -15
- package/src/__tests__/guardian-outbound-http.test.ts +71 -106
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +34 -90
- package/src/__tests__/guardian-routing-state.test.ts +14 -22
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +253 -0
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +8 -4
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +39 -21
- package/src/__tests__/helpers/call-route-handler.ts +72 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +161 -0
- package/src/__tests__/helpers/gateway-classify-mock.ts +67 -0
- package/src/__tests__/helpers/mock-logger.ts +36 -0
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/home-state-routes.test.ts +10 -31
- package/src/__tests__/host-browser-e2e-cloud.test.ts +309 -1
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +12 -2
- package/src/__tests__/host-browser-routes.test.ts +36 -91
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +10 -2
- package/src/__tests__/host-proxy-interface.test.ts +38 -4
- package/src/__tests__/host-shell-tool.test.ts +2 -4
- package/src/__tests__/host-transfer-pending-interactions.test.ts +160 -0
- package/src/__tests__/host-transfer-proxy.test.ts +733 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +20 -11
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +3 -2
- package/src/__tests__/injector-chain.test.ts +525 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +41 -206
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/intent-routing.test.ts +0 -26
- package/src/__tests__/invite-redemption-service.test.ts +2 -1
- package/src/__tests__/invite-routes-http.test.ts +80 -12
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -1
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +2 -1
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +157 -0
- package/src/__tests__/list-messages-attachments.test.ts +52 -55
- package/src/__tests__/list-messages-page-latest.test.ts +283 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +16 -17
- package/src/__tests__/llm-call-pipeline.test.ts +284 -0
- package/src/__tests__/llm-context-normalization.test.ts +69 -4
- package/src/__tests__/llm-context-route-provider.test.ts +39 -113
- package/src/__tests__/llm-request-log-turn-query.test.ts +2 -1
- package/src/__tests__/llm-resolver.test.ts +211 -0
- package/src/__tests__/llm-schema.test.ts +56 -0
- package/src/__tests__/llm-usage-store.test.ts +2 -1
- package/src/__tests__/log-export-workspace.test.ts +28 -17
- package/src/__tests__/mcp-abort-signal.test.ts +2 -3
- package/src/__tests__/mcp-client-auth.test.ts +2 -3
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-admin-recall.test.ts +221 -0
- package/src/__tests__/memory-recall-log-store.test.ts +2 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +399 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +14 -13
- package/src/__tests__/migration-export-http.test.ts +17 -17
- package/src/__tests__/migration-export-to-gcs.test.ts +491 -0
- package/src/__tests__/migration-import-commit-http.test.ts +16 -16
- package/src/__tests__/migration-import-from-gcs.test.ts +533 -0
- package/src/__tests__/migration-import-from-url.test.ts +21 -91
- package/src/__tests__/migration-import-preflight-http.test.ts +13 -13
- package/src/__tests__/migration-jobs-status.test.ts +164 -0
- package/src/__tests__/migration-validate-http.test.ts +48 -83
- package/src/__tests__/mock-gateway-ipc.ts +32 -62
- package/src/__tests__/model-intents.test.ts +16 -1
- package/src/__tests__/nl-approval-parser.test.ts +13 -17
- package/src/__tests__/non-member-access-request.test.ts +13 -5
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-guardian-path.test.ts +15 -8
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +109 -0
- package/src/__tests__/notification-telegram-adapter.test.ts +57 -55
- package/src/__tests__/oauth-apps-routes.test.ts +77 -123
- package/src/__tests__/oauth-cli.test.ts +28 -13
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +6 -6
- package/src/__tests__/oauth-providers-routes.test.ts +81 -103
- package/src/__tests__/oauth-store.test.ts +44 -77
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -3
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/openai-provider.test.ts +105 -6
- package/src/__tests__/openai-responses-provider.test.ts +146 -4
- package/src/__tests__/openrouter-provider-only.test.ts +22 -4
- package/src/__tests__/overflow-reduce-pipeline.test.ts +671 -0
- package/src/__tests__/permission-types.test.ts +3 -18
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +378 -0
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +27 -20
- package/src/__tests__/platform.test.ts +10 -59
- package/src/__tests__/playbook-execution.test.ts +2 -1
- package/src/__tests__/playbook-tools.test.ts +2 -1
- package/src/__tests__/plugin-bootstrap.test.ts +529 -0
- package/src/__tests__/plugin-registry.test.ts +303 -0
- package/src/__tests__/plugin-route-contribution.test.ts +294 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +292 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +195 -14
- package/src/__tests__/profiler-routes.test.ts +112 -177
- package/src/__tests__/provider-send-message-override-profile.test.ts +223 -0
- package/src/__tests__/proxy-approval-callback.test.ts +6 -493
- package/src/__tests__/qdrant-collection-migration.test.ts +7 -7
- package/src/__tests__/reaction-persistence.test.ts +4 -2
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/recording-handler.test.ts +0 -2
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +1 -2
- package/src/__tests__/relay-server.test.ts +19 -4
- package/src/__tests__/require-fresh-approval.test.ts +19 -168
- package/src/__tests__/resolve-trust-class.test.ts +2 -1
- package/src/__tests__/retry-thinking-tool-choice.test.ts +19 -7
- package/src/__tests__/retry-verbosity-normalization.test.ts +139 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +26 -6
- package/src/__tests__/runtime-events-sse-parity.test.ts +12 -13
- package/src/__tests__/runtime-events-sse.test.ts +13 -21
- package/src/__tests__/schedule-routes.test.ts +304 -77
- package/src/__tests__/schedule-store.test.ts +119 -1
- package/src/__tests__/schedule-tools.test.ts +2 -1
- package/src/__tests__/scheduler-recurrence.test.ts +16 -71
- package/src/__tests__/scheduler-reuse-conversation.test.ts +12 -51
- package/src/__tests__/scheduler-wake.test.ts +356 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -1
- package/src/__tests__/secret-detection-handler.test.ts +2 -19
- package/src/__tests__/secret-ingress-http.test.ts +38 -21
- package/src/__tests__/secret-routes-managed-proxy.test.ts +46 -102
- package/src/__tests__/secret-scanner-executor.test.ts +1 -2
- package/src/__tests__/send-endpoint-busy.test.ts +38 -25
- package/src/__tests__/sequence-store.test.ts +2 -1
- package/src/__tests__/server-history-render.test.ts +2 -2
- package/src/__tests__/service-contracts-import-guard.test.ts +185 -0
- package/src/__tests__/set-permission-mode.test.ts +0 -10
- package/src/__tests__/settings-routes.test.ts +35 -68
- package/src/__tests__/skill-boundary-guard.test.ts +105 -0
- package/src/__tests__/skill-load-inline-command.test.ts +2 -2
- package/src/__tests__/skill-load-inline-includes.test.ts +2 -2
- package/src/__tests__/skill-runtime-path.test.ts +64 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +11 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +1 -3
- package/src/__tests__/slack-reaction-approvals.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +37 -72
- package/src/__tests__/subagent-call-site-routing.test.ts +79 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +20 -28
- package/src/__tests__/subagent-notify-parent.test.ts +6 -29
- package/src/__tests__/subagent-role-registry.test.ts +3 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +52 -104
- package/src/__tests__/subagent-tools.test.ts +0 -1
- package/src/__tests__/suggestion-routes.test.ts +149 -57
- package/src/__tests__/task-compiler.test.ts +2 -1
- package/src/__tests__/task-management-tools.test.ts +2 -1
- package/src/__tests__/task-memory-cleanup.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +5 -16
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +5 -314
- package/src/__tests__/thread-backfill.test.ts +3 -2
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +484 -0
- package/src/__tests__/tool-approval-handler.test.ts +21 -63
- package/src/__tests__/tool-audit-listener.test.ts +3 -3
- package/src/__tests__/tool-domain-event-publisher.test.ts +3 -3
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +429 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +61 -4
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +28 -56
- package/src/__tests__/tool-executor.test.ts +434 -1604
- package/src/__tests__/tool-grant-request-escalation.test.ts +90 -311
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +7 -15
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +178 -354
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +3 -2
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -2
- package/src/__tests__/trusted-contact-verification.test.ts +2 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -1
- package/src/__tests__/twilio-routes.test.ts +25 -66
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -7
- package/src/__tests__/usage-routes.test.ts +73 -90
- package/src/__tests__/user-plugin-loader.test.ts +233 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +2 -2
- package/src/__tests__/verification-control-plane-policy.test.ts +95 -14
- package/src/__tests__/voice-ingress-preflight.test.ts +5 -5
- package/src/__tests__/voice-invite-redemption.test.ts +2 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +3 -3
- package/src/__tests__/voice-session-bridge.test.ts +285 -106
- package/src/__tests__/volume-security-guard.test.ts +0 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +3 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +1 -1
- package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-052-seed-default-inference-profiles.test.ts +260 -0
- package/src/__tests__/workspace-migration-053-release-notes-acp-codex.test.ts +225 -0
- package/src/__tests__/workspace-migration-054-seed-recall-callsite.test.ts +235 -0
- package/src/__tests__/workspace-migration-055-release-notes-agentic-recall.test.ts +128 -0
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +232 -0
- package/src/__tests__/workspace-migration-acp-sessions-ui.test.ts +144 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +1 -1
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +274 -0
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-policy.test.ts +21 -3
- package/src/acp/__tests__/client-handler.test.ts +64 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +62 -0
- package/src/acp/__tests__/helpers/which-stub.ts +45 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +366 -0
- package/src/acp/__tests__/session-manager-startup.test.ts +159 -0
- package/src/acp/__tests__/session-manager.test.ts +83 -0
- package/src/acp/client-handler.ts +23 -139
- package/src/acp/resolve-agent.test.ts +291 -0
- package/src/acp/resolve-agent.ts +176 -0
- package/src/acp/session-manager.ts +166 -7
- package/src/acp/types.ts +2 -50
- package/src/agent/loop.ts +365 -104
- package/src/agent/message-types.ts +0 -2
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/__tests__/guardian-feed-event.test.ts +296 -0
- package/src/approvals/approval-primitive.ts +3 -20
- package/src/approvals/guardian-decision-primitive.ts +37 -68
- package/src/approvals/guardian-request-resolvers.ts +109 -103
- package/src/avatar/character-components.ts +6 -6
- package/src/{config/bundled-skills/settings/tools → avatar}/identity-avatar.ts +1 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -15
- package/src/backup/__tests__/paths.test.ts +3 -2
- package/src/backup/backup-worker.ts +3 -24
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +7 -11
- package/src/browser/__tests__/operations.test.ts +0 -35
- package/src/browser/operations.ts +1 -47
- package/src/bundler/app-compiler.ts +84 -1
- package/src/bundler/package-resolver.ts +2 -6
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-constants.ts +1 -1
- package/src/calls/call-controller.ts +1 -5
- package/src/calls/call-domain.ts +14 -14
- package/src/calls/call-pointer-messages.ts +4 -9
- package/src/calls/call-state.ts +2 -2
- package/src/calls/call-store.ts +2 -1
- package/src/calls/guardian-action-sweep.ts +9 -25
- package/src/calls/guardian-dispatch.ts +1 -20
- package/src/calls/media-stream-audio-transcode.ts +2 -41
- package/src/calls/media-stream-server.ts +2 -3
- package/src/calls/media-stream-stt-session.ts +1 -3
- package/src/calls/relay-access-wait.ts +5 -8
- package/src/calls/relay-server.ts +15 -18
- package/src/calls/relay-setup-router.ts +2 -2
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/twilio-routes.ts +160 -78
- package/src/calls/voice-control-protocol.ts +10 -10
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/calls/voice-session-bridge.ts +137 -42
- package/src/channels/__tests__/types.test.ts +28 -6
- package/src/channels/permission-profiles.ts +2 -72
- package/src/channels/types.ts +48 -30
- package/src/cli/AGENTS.md +1 -0
- package/src/cli/__tests__/notifications.test.ts +92 -214
- package/src/cli/commands/__tests__/attachment.test.ts +14 -8
- package/src/cli/commands/__tests__/backup.test.ts +4 -15
- package/src/cli/commands/__tests__/browser.test.ts +36 -31
- package/src/cli/commands/__tests__/cache.test.ts +23 -18
- package/src/cli/commands/__tests__/image-generation.test.ts +255 -35
- package/src/cli/commands/__tests__/inference-send.test.ts +12 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +396 -0
- package/src/cli/commands/__tests__/task.test.ts +36 -35
- package/src/cli/commands/__tests__/trust.test.ts +602 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +12 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +14 -14
- package/src/cli/commands/__tests__/ui.test.ts +17 -17
- package/src/cli/commands/__tests__/watchers.test.ts +29 -29
- package/src/cli/commands/__tests__/webhooks.test.ts +544 -0
- package/src/cli/commands/attachment.ts +12 -8
- package/src/cli/commands/auth.ts +1 -1
- package/src/cli/commands/avatar.ts +192 -9
- package/src/cli/commands/backup.ts +16 -46
- package/src/cli/commands/browser.ts +52 -4
- package/src/cli/commands/cache.ts +7 -5
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/clients.ts +137 -0
- package/src/cli/commands/completions.ts +3 -10
- package/src/cli/commands/contacts.ts +10 -10
- package/src/cli/commands/conversations-defer.ts +364 -0
- package/src/cli/commands/conversations-import.ts +2 -3
- package/src/cli/commands/conversations.ts +115 -57
- package/src/cli/commands/credential-execution.ts +1 -1
- package/src/cli/commands/credentials.ts +139 -5
- package/src/cli/commands/default-action.ts +1 -1
- package/src/cli/commands/domain.ts +2 -2
- package/src/cli/commands/email.ts +7 -7
- package/src/cli/commands/image-generation.ts +33 -34
- package/src/cli/commands/keys.ts +2 -2
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/memory-v2.ts +343 -0
- package/src/cli/commands/memory.ts +8 -8
- package/src/cli/commands/notifications.ts +87 -121
- package/src/cli/commands/oauth/__tests__/connect.test.ts +23 -5
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/mode.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/status.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/token.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +4 -4
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/shared.ts +29 -2
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -6
- package/src/cli/commands/platform/__tests__/connect.test.ts +23 -11
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +22 -10
- package/src/cli/commands/platform/__tests__/status.test.ts +22 -10
- package/src/cli/commands/platform/connect.ts +3 -3
- package/src/cli/commands/platform/disconnect.ts +4 -6
- package/src/cli/commands/platform/index.ts +12 -10
- package/src/cli/commands/routes.ts +7 -1
- package/src/cli/commands/sequence.ts +7 -7
- package/src/cli/commands/skills.ts +189 -84
- package/src/cli/commands/task.ts +12 -10
- package/src/cli/commands/trust.ts +460 -162
- package/src/cli/commands/ui.ts +3 -3
- package/src/cli/commands/usage.ts +10 -5
- package/src/cli/commands/watchers.ts +8 -8
- package/src/cli/commands/webhooks.ts +270 -0
- package/src/cli/lib/daemon-avatar-client.ts +37 -0
- package/src/cli/lib/daemon-credential-client.ts +27 -189
- package/src/cli/lib/ipc-params.ts +22 -0
- package/src/cli/program.ts +29 -29
- package/src/cli.ts +1 -61
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/acp-defaults.test.ts +57 -0
- package/src/config/acp-defaults.ts +40 -0
- package/src/config/acp-schema.ts +1 -1
- package/src/config/assistant-feature-flags.ts +18 -142
- package/src/config/bundled-skills/acp/SKILL.md +44 -16
- package/src/config/bundled-skills/acp/TOOLS.json +45 -1
- package/src/config/bundled-skills/{screen-watch/tools/start-screen-watch.ts → acp/tools/acp-list-agents.ts} +2 -2
- package/src/config/bundled-skills/acp/tools/acp-steer.ts +12 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +25 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +31 -44
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +6 -6
- package/src/config/bundled-skills/media-processing/services/reduce.ts +0 -13
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +58 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +1 -1
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-skills/settings/SKILL.md +2 -17
- package/src/config/bundled-skills/settings/TOOLS.json +0 -56
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-tool-registry.ts +4 -21
- package/src/config/env.ts +7 -8
- package/src/config/feature-flag-registry.json +25 -17
- package/src/config/llm-resolver.ts +51 -33
- package/src/config/loader.ts +12 -15
- package/src/config/schema.ts +22 -70
- package/src/config/schemas/__tests__/filing.test.ts +58 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +186 -0
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +12 -0
- package/src/config/schemas/host-browser.ts +2 -2
- package/src/config/schemas/inference.ts +0 -2
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +51 -10
- package/src/config/schemas/memory-storage.ts +1 -1
- package/src/config/schemas/memory-v2.ts +176 -0
- package/src/config/schemas/memory.ts +2 -0
- package/src/config/schemas/security.ts +0 -60
- package/src/config/schemas/services.ts +46 -7
- package/src/config/schemas/tts.ts +11 -0
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +95 -6
- package/src/config/types.ts +0 -41
- package/src/contacts/contact-store.ts +2 -2
- package/src/contacts/contacts-write.ts +0 -38
- package/src/contacts/types.ts +8 -10
- package/src/context/__tests__/compact-prompt.test.ts +27 -9
- package/src/context/prompts/compact.md +26 -12
- package/src/context/token-estimator.ts +1 -1
- package/src/context/tool-result-truncation.ts +4 -64
- package/src/context/window-manager.ts +191 -17
- package/src/credential-execution/approval-bridge.ts +7 -69
- package/src/credential-execution/client.ts +17 -422
- package/src/credential-execution/feature-gates.ts +1 -2
- package/src/credential-execution/managed-catalog.ts +1 -1
- package/src/credential-health/credential-health-service.ts +20 -7
- package/src/daemon/__tests__/conversation-feed-event.test.ts +304 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/__tests__/daemon-skill-host.test.ts +272 -0
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +587 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +463 -0
- package/src/daemon/approval-generators.ts +2 -14
- package/src/daemon/classifier.ts +0 -106
- package/src/daemon/config-watcher.ts +14 -56
- package/src/daemon/connection-policy.ts +0 -14
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/conversation-agent-loop-handlers.ts +120 -28
- package/src/daemon/conversation-agent-loop.ts +1113 -701
- package/src/daemon/conversation-attachments.ts +5 -81
- package/src/daemon/conversation-error.ts +9 -5
- package/src/daemon/conversation-history.ts +11 -20
- package/src/daemon/conversation-launch.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +37 -19
- package/src/daemon/conversation-messaging.ts +1 -1
- package/src/daemon/conversation-notifiers.ts +3 -111
- package/src/daemon/conversation-process.ts +23 -20
- package/src/daemon/conversation-runtime-assembly.ts +530 -471
- package/src/daemon/conversation-slash.ts +4 -160
- package/src/daemon/conversation-store.ts +368 -0
- package/src/daemon/conversation-surfaces.ts +5 -4
- package/src/daemon/conversation-tool-setup.ts +49 -161
- package/src/daemon/conversation.ts +126 -217
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/daemon-skill-host.ts +262 -0
- package/src/daemon/external-plugins-bootstrap.ts +532 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/handlers/config-channels.ts +2 -2
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/config-ingress.ts +24 -2
- package/src/daemon/handlers/config-model.test.ts +17 -0
- package/src/daemon/handlers/config-model.ts +18 -52
- package/src/daemon/handlers/config-telegram.ts +6 -53
- package/src/daemon/handlers/config-voice.ts +1 -1
- package/src/daemon/handlers/conversations.ts +22 -156
- package/src/daemon/handlers/recording.ts +1 -1
- package/src/daemon/handlers/shared.ts +34 -35
- package/src/daemon/handlers/skills.ts +20 -24
- package/src/daemon/host-transfer-proxy.ts +500 -0
- package/src/daemon/lifecycle.ts +56 -326
- package/src/daemon/meet-host-startup.ts +51 -0
- package/src/daemon/meet-host-supervisor.ts +781 -0
- package/src/daemon/meet-manifest-loader.ts +410 -0
- package/src/daemon/memory-v2-startup.ts +35 -0
- package/src/daemon/message-protocol.ts +4 -7
- package/src/daemon/message-types/acp.ts +1 -0
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +65 -2
- package/src/daemon/message-types/host-transfer.ts +41 -0
- package/src/daemon/message-types/integrations.ts +6 -0
- package/src/daemon/message-types/messages.ts +26 -14
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +0 -6
- package/src/daemon/message-types/shared.ts +5 -2
- package/src/daemon/message-types/subagents.ts +2 -1
- package/src/daemon/message-types/workspace.ts +0 -2
- package/src/daemon/pkb-reminder-builder.test.ts +13 -12
- package/src/daemon/pkb-reminder-builder.ts +8 -16
- package/src/daemon/process-message.ts +616 -0
- package/src/daemon/providers-setup.ts +14 -6
- package/src/daemon/server.ts +79 -1272
- package/src/daemon/shutdown-handlers.ts +3 -13
- package/src/daemon/startup-error.ts +1 -1
- package/src/daemon/tool-side-effects.ts +14 -56
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +223 -0
- package/src/email/feature-gate.ts +1 -1
- package/src/events/domain-events.ts +1 -8
- package/src/events/tool-audit-listener.ts +2 -8
- package/src/events/tool-metrics-listener.ts +1 -4
- package/src/filing/filing-service.ts +194 -54
- package/src/followups/followup-store.ts +3 -71
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +228 -0
- package/src/heartbeat/heartbeat-service.ts +52 -8
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +18 -1
- package/src/home/__tests__/rollup-producer.test.ts +67 -2
- package/src/home/assistant-feed-authoring.ts +8 -1
- package/src/home/emit-feed-event.ts +7 -0
- package/src/home/feed-types.ts +42 -3
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rewrite-feed-title.ts +58 -0
- package/src/home/rollup-producer.ts +16 -3
- package/src/inbound/platform-callback-registration.ts +1 -17
- package/src/ipc/__tests__/attachment-ipc.test.ts +128 -66
- package/src/ipc/__tests__/browser-ipc.test.ts +75 -51
- package/src/ipc/__tests__/cache-ipc.test.ts +52 -107
- package/src/ipc/__tests__/cli-ipc.test.ts +9 -6
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +254 -0
- package/src/ipc/__tests__/skill-server.test.ts +182 -0
- package/src/ipc/__tests__/socket-path.test.ts +44 -37
- package/src/ipc/__tests__/ui-request-route.test.ts +241 -216
- package/src/ipc/__tests__/watcher-ipc.test.ts +33 -33
- package/src/ipc/assistant-server.ts +450 -0
- package/src/ipc/cli-client.ts +3 -3
- package/src/ipc/gateway-client.test.ts +131 -0
- package/src/ipc/gateway-client.ts +98 -120
- package/src/ipc/ipc-framing.ts +281 -0
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +152 -0
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +219 -0
- package/src/ipc/routes/db-proxy.ts +73 -0
- package/src/ipc/routes/route-adapter.ts +32 -0
- package/src/ipc/routes/trust-rules.test.ts +218 -0
- package/src/ipc/skill-ipc-types.ts +13 -0
- package/src/ipc/skill-routes/__tests__/config.test.ts +146 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +402 -0
- package/src/ipc/skill-routes/__tests__/identity.test.ts +81 -0
- package/src/ipc/skill-routes/__tests__/log.test.ts +133 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +178 -0
- package/src/ipc/skill-routes/__tests__/platform.test.ts +111 -0
- package/src/ipc/skill-routes/__tests__/providers.test.ts +265 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +361 -0
- package/src/ipc/skill-routes/config.ts +47 -0
- package/src/ipc/skill-routes/events.ts +131 -0
- package/src/ipc/skill-routes/identity.ts +34 -0
- package/src/ipc/skill-routes/index.ts +37 -0
- package/src/ipc/skill-routes/log.ts +40 -0
- package/src/ipc/skill-routes/memory.ts +76 -0
- package/src/ipc/skill-routes/platform.ts +39 -0
- package/src/ipc/skill-routes/providers.ts +163 -0
- package/src/ipc/skill-routes/registries.ts +393 -0
- package/src/ipc/skill-server.ts +771 -0
- package/src/ipc/skill-socket-path.ts +20 -0
- package/src/ipc/socket-cleanup.ts +92 -0
- package/src/ipc/socket-path.ts +55 -48
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +374 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +525 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +473 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +359 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +179 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +349 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +244 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +337 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +337 -0
- package/src/live-voice/__tests__/protocol.test.ts +295 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +421 -0
- package/src/live-voice/live-voice-archive.ts +758 -0
- package/src/live-voice/live-voice-metrics.ts +472 -0
- package/src/live-voice/live-voice-session-manager.ts +222 -0
- package/src/live-voice/live-voice-session.ts +1144 -0
- package/src/live-voice/live-voice-tts.ts +260 -0
- package/src/live-voice/protocol.ts +524 -0
- package/src/mcp/client.ts +2 -2
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -0
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +4 -28
- package/src/memory/__tests__/auto-analysis-guard.test.ts +2 -2
- package/src/memory/__tests__/conversation-analyze-job.test.ts +7 -62
- package/src/memory/__tests__/conversation-group-migration.test.ts +2 -2
- package/src/memory/__tests__/find-analysis-conversation.test.ts +2 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +235 -0
- package/src/memory/admin.ts +65 -7
- package/src/memory/app-git-service.ts +0 -14
- package/src/memory/attachments-store.ts +14 -16
- package/src/memory/auto-analysis-enqueue.ts +2 -17
- package/src/memory/canonical-guardian-store.ts +2 -1
- package/src/memory/channel-verification-sessions.ts +1 -1
- package/src/memory/checkpoints.ts +1 -1
- package/src/memory/context-search/agent-protocol.ts +424 -0
- package/src/memory/context-search/agent-runner.ts +1295 -0
- package/src/memory/context-search/format.ts +160 -0
- package/src/memory/context-search/limits.ts +106 -0
- package/src/memory/context-search/search.ts +387 -0
- package/src/memory/context-search/sources/conversations.ts +278 -0
- package/src/memory/context-search/sources/memory.ts +90 -0
- package/src/memory/context-search/sources/pkb.ts +468 -0
- package/src/memory/context-search/sources/workspace.ts +1255 -0
- package/src/memory/context-search/types.ts +49 -0
- package/src/memory/conversation-analyze-job.ts +3 -24
- package/src/memory/conversation-attention-store.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +117 -145
- package/src/memory/conversation-directories.ts +1 -11
- package/src/memory/conversation-display-order-migration.ts +11 -2
- package/src/memory/conversation-group-migration.ts +20 -4
- package/src/memory/conversation-key-store.ts +3 -4
- package/src/memory/conversation-queries.ts +69 -29
- package/src/memory/conversation-starter-validation.ts +88 -0
- package/src/memory/conversation-starters-cadence.ts +1 -1
- package/src/memory/conversation-title-service.ts +27 -1
- package/src/memory/db-init.ts +22 -4
- package/src/memory/db-maintenance.ts +1 -1
- package/src/memory/delivery-channels.ts +1 -14
- package/src/memory/delivery-crud.ts +2 -32
- package/src/memory/delivery-status.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +44 -5
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +412 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +225 -0
- package/src/memory/graph/bootstrap.test.ts +277 -0
- package/src/memory/graph/bootstrap.ts +10 -6
- package/src/memory/graph/capability-seed.ts +3 -3
- package/src/memory/graph/compaction.ts +1 -1
- package/src/memory/graph/consolidation.ts +13 -10
- package/src/memory/graph/conversation-graph-memory.ts +151 -1
- package/src/memory/graph/decay.ts +1 -1
- package/src/memory/graph/extraction.ts +63 -23
- package/src/memory/graph/graph-memory-state-store.ts +1 -1
- package/src/memory/graph/graph-search.test.ts +95 -2
- package/src/memory/graph/graph-search.ts +22 -7
- package/src/memory/graph/image-ref-utils.ts +1 -1
- package/src/memory/graph/retriever.test.ts +158 -4
- package/src/memory/graph/retriever.ts +27 -8
- package/src/memory/graph/store.test.ts +2 -1
- package/src/memory/graph/store.ts +1 -1
- package/src/memory/graph/tool-handlers.ts +73 -247
- package/src/memory/graph/tools.ts +35 -53
- package/src/memory/group-crud.ts +1 -2
- package/src/memory/guardian-action-store.ts +2 -1
- package/src/memory/guardian-approvals.ts +1 -1
- package/src/memory/guardian-rate-limits.ts +1 -1
- package/src/memory/indexer.ts +43 -17
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +1 -1
- package/src/memory/job-handlers/cleanup.ts +2 -1
- package/src/memory/job-handlers/conversation-starters.ts +18 -10
- package/src/memory/job-handlers/embedding.test.ts +2 -1
- package/src/memory/job-handlers/embedding.ts +1 -1
- package/src/memory/job-handlers/index-maintenance.ts +1 -1
- package/src/memory/job-handlers/summarization.ts +3 -3
- package/src/memory/job-utils.ts +3 -3
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +362 -0
- package/src/memory/jobs/embed-concept-page.ts +210 -0
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -1
- package/src/memory/jobs-store.ts +10 -2
- package/src/memory/jobs-worker.ts +58 -5
- package/src/memory/lifecycle-events-store.ts +1 -1
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +1 -1
- package/src/memory/media-store.ts +1 -1
- package/src/memory/memory-recall-log-store.ts +1 -1
- package/src/memory/migrations/038-actor-token-records.ts +3 -0
- package/src/memory/migrations/039-actor-refresh-token-records.ts +3 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/226-schedule-wake-conversation-id.ts +11 -0
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +18 -0
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +27 -0
- package/src/memory/migrations/229-delete-private-conversations.test.ts +1087 -0
- package/src/memory/migrations/229-delete-private-conversations.ts +210 -0
- package/src/memory/migrations/230-acp-session-history.ts +41 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +128 -0
- package/src/memory/migrations/232-activation-state.ts +38 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +7 -0
- package/src/memory/pkb/pkb-index.test.ts +5 -5
- package/src/memory/pkb/pkb-reconcile.test.ts +5 -5
- package/src/memory/pkb/pkb-search.test.ts +148 -7
- package/src/memory/pkb/pkb-search.ts +65 -30
- package/src/memory/published-pages-store.ts +1 -1
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +25 -0
- package/src/memory/schema/acp.ts +30 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +2 -32
- package/src/memory/schema/memory-graph.ts +36 -14
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/scoped-approval-grants.ts +2 -1
- package/src/memory/search/semantic.ts +2 -2
- package/src/memory/shared-app-links-store.ts +2 -1
- package/src/memory/tool-usage-store.ts +1 -1
- package/src/memory/trace-event-store.ts +2 -1
- package/src/memory/turn-events-store.ts +1 -1
- package/src/memory/v2/__tests__/activation-store.test.ts +202 -0
- package/src/memory/v2/__tests__/activation.test.ts +956 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +610 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +395 -0
- package/src/memory/v2/__tests__/edges.test.ts +435 -0
- package/src/memory/v2/__tests__/injection.test.ts +792 -0
- package/src/memory/v2/__tests__/migration.test.ts +812 -0
- package/src/memory/v2/__tests__/page-store.test.ts +334 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +438 -0
- package/src/memory/v2/__tests__/sim.test.ts +549 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +85 -0
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +657 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +351 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +441 -0
- package/src/memory/v2/activation-store.ts +109 -0
- package/src/memory/v2/activation.ts +490 -0
- package/src/memory/v2/backfill-jobs.ts +442 -0
- package/src/memory/v2/consolidation-job.ts +304 -0
- package/src/memory/v2/edges.ts +217 -0
- package/src/memory/v2/injection.ts +307 -0
- package/src/memory/v2/migration.ts +654 -0
- package/src/memory/v2/now-text.ts +38 -0
- package/src/memory/v2/page-store.ts +245 -0
- package/src/memory/v2/prompts/consolidation.ts +185 -0
- package/src/memory/v2/prompts/sweep.ts +56 -0
- package/src/memory/v2/qdrant.ts +342 -0
- package/src/memory/v2/sim.ts +206 -0
- package/src/memory/v2/skill-content.ts +42 -0
- package/src/memory/v2/skill-qdrant.ts +395 -0
- package/src/memory/v2/skill-store.ts +128 -0
- package/src/memory/v2/sweep-job.ts +298 -0
- package/src/memory/v2/types.ts +116 -0
- package/src/memory/validation.ts +1 -1
- package/src/messaging/providers/index.ts +262 -0
- package/src/messaging/providers/slack/api.ts +242 -0
- package/src/messaging/providers/slack/message-metadata.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.test.ts +77 -29
- package/src/messaging/providers/slack/render-transcript.ts +58 -0
- package/src/messaging/providers/slack/send.ts +383 -0
- package/src/messaging/providers/telegram-bot/adapter.ts +4 -42
- package/src/messaging/providers/telegram-bot/api.ts +253 -0
- package/src/messaging/providers/telegram-bot/client.ts +17 -58
- package/src/messaging/providers/telegram-bot/send.ts +232 -0
- package/src/messaging/providers/whatsapp/adapter.ts +4 -36
- package/src/messaging/providers/whatsapp/api.ts +319 -0
- package/src/messaging/providers/whatsapp/client.ts +4 -48
- package/src/messaging/providers/whatsapp/send.ts +209 -0
- package/src/notifications/adapters/slack.ts +5 -23
- package/src/notifications/adapters/telegram.ts +8 -29
- package/src/notifications/conversation-candidates.ts +1 -1
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/conversation-seed-composer.ts +12 -6
- package/src/notifications/copy-composer.ts +1 -6
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/decisions-store.ts +1 -1
- package/src/notifications/deliveries-store.ts +2 -1
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/events-store.ts +1 -13
- package/src/notifications/preferences-store.ts +1 -1
- package/src/notifications/signal.ts +1 -11
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/connection-resolver.ts +11 -2
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +32 -15
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -108
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/outbound-proxy/index.ts +0 -1
- package/src/permissions/approval-policy.test.ts +398 -106
- package/src/permissions/approval-policy.ts +134 -108
- package/src/permissions/checker.test.ts +632 -0
- package/src/permissions/checker.ts +280 -345
- package/src/permissions/gateway-threshold-reader.ts +177 -0
- package/src/permissions/ipc-risk-types.ts +95 -0
- package/src/permissions/prompter.ts +8 -9
- package/src/permissions/risk-types.ts +24 -153
- package/src/permissions/types.ts +19 -47
- package/src/permissions/workspace-policy.ts +10 -7
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +488 -0
- package/src/plugins/defaults/llm-call.ts +79 -0
- package/src/plugins/defaults/memory-retrieval.ts +221 -0
- package/src/plugins/defaults/overflow-reduce.ts +185 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +103 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +301 -0
- package/src/plugins/types.ts +1133 -0
- package/src/plugins/user-loader.ts +203 -0
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +197 -0
- package/src/prompts/persona-resolver.ts +2 -4
- package/src/prompts/system-prompt.ts +39 -0
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/providers/__tests__/provider-env-vars.test.ts +0 -21
- package/src/providers/__tests__/retry-callsite.test.ts +3 -6
- package/src/providers/anthropic/client.ts +71 -19
- package/src/providers/call-site-routing.ts +7 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/gemini/client.ts +96 -22
- package/src/providers/managed-proxy/context.ts +0 -12
- package/src/providers/model-catalog.ts +123 -25
- package/src/providers/model-intents.ts +6 -7
- package/src/providers/openai/chat-completions-provider.ts +37 -7
- package/src/providers/openai/responses-provider.ts +39 -4
- package/src/providers/openrouter/client.ts +9 -6
- package/src/providers/provider-env-vars.ts +4 -12
- package/src/providers/provider-send-message.ts +16 -11
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +52 -23
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +1 -1
- package/src/providers/speech-to-text/openai-whisper.ts +3 -6
- package/src/providers/speech-to-text/provider-catalog.ts +75 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +72 -4
- package/src/providers/speech-to-text/xai-realtime.ts +39 -14
- package/src/providers/speech-to-text/xai.ts +5 -5
- package/src/providers/thinking-config.ts +34 -0
- package/src/providers/types.ts +22 -10
- package/src/runtime/AGENTS.md +27 -17
- package/src/runtime/__tests__/agent-wake.test.ts +33 -9
- package/src/runtime/__tests__/client-registry.test.ts +271 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +157 -246
- package/src/runtime/access-request-helper.ts +9 -20
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/agent-wake.ts +174 -68
- package/src/runtime/approval-conversation-turn.ts +2 -15
- package/src/runtime/approval-message-composer.ts +11 -60
- package/src/runtime/assistant-event.ts +18 -66
- package/src/runtime/auth/__tests__/guard-tests.test.ts +6 -30
- package/src/runtime/auth/__tests__/middleware.test.ts +10 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -8
- package/src/runtime/auth/context.ts +9 -0
- package/src/runtime/auth/middleware.ts +4 -4
- package/src/runtime/auth/route-policy.ts +195 -4
- package/src/runtime/auth/token-service.ts +1 -100
- package/src/runtime/capability-tokens.ts +89 -313
- package/src/runtime/channel-approval-types.ts +1 -6
- package/src/runtime/channel-approvals.ts +7 -79
- package/src/runtime/channel-readiness-service.ts +2 -2
- package/src/runtime/channel-reply-delivery.ts +2 -8
- package/src/runtime/channel-retry-sweep.ts +20 -17
- package/src/runtime/client-registry.ts +254 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -7
- package/src/runtime/gateway-client.ts +37 -378
- package/src/runtime/guardian-action-grant-minter.ts +2 -3
- package/src/runtime/guardian-action-message-composer.ts +11 -52
- package/src/runtime/guardian-action-service.ts +19 -7
- package/src/runtime/guardian-decision-types.ts +4 -65
- package/src/runtime/guardian-reply-router.ts +10 -19
- package/src/runtime/guardian-vellum-migration.ts +5 -64
- package/src/runtime/http-errors.ts +3 -0
- package/src/runtime/http-router.ts +50 -7
- package/src/runtime/http-server.ts +345 -1041
- package/src/runtime/http-types.ts +15 -100
- package/src/runtime/interactive-ui-types.ts +145 -0
- package/src/runtime/interactive-ui.ts +38 -196
- package/src/runtime/invite-redemption-service.ts +1 -1
- package/src/runtime/invite-redemption-templates.ts +1 -1
- package/src/runtime/local-actor-identity.ts +13 -43
- package/src/runtime/message-composer-types.ts +134 -0
- package/src/runtime/middleware/rate-limiter.ts +1 -1
- package/src/runtime/middleware/request-logger.ts +5 -2
- package/src/runtime/migrations/__tests__/job-registry.test.ts +346 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +16 -0
- package/src/runtime/migrations/job-registry.ts +281 -0
- package/src/runtime/migrations/vbundle-builder.ts +4 -26
- package/src/runtime/migrations/vbundle-importer.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +0 -13
- package/src/runtime/migrations/vbundle-tar-stream.ts +11 -3
- package/src/runtime/nl-approval-parser.ts +16 -21
- package/src/runtime/pending-interactions.ts +29 -12
- package/src/runtime/routes/__tests__/acp-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +204 -320
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +72 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +182 -223
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +230 -0
- package/src/{ipc/__tests__/task-ipc.test.ts → runtime/routes/__tests__/task-routes.test.ts} +116 -96
- package/src/runtime/routes/__tests__/tts-routes.test.ts +185 -289
- package/src/runtime/routes/access-request-decision.ts +25 -50
- package/src/runtime/routes/acp-routes.test.ts +371 -0
- package/src/runtime/routes/acp-routes.ts +392 -166
- package/src/runtime/routes/app-management-routes.ts +464 -660
- package/src/runtime/routes/app-routes.ts +192 -177
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +51 -31
- package/src/runtime/routes/approval-routes.ts +133 -434
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +24 -84
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +3 -10
- package/src/runtime/routes/attachment-routes.ts +409 -253
- package/src/runtime/routes/audio-routes.ts +51 -18
- package/src/runtime/routes/avatar-routes.ts +82 -75
- package/src/runtime/routes/background-tool-routes.ts +94 -0
- package/src/runtime/routes/backup-routes.ts +154 -336
- package/src/runtime/routes/brain-graph-routes.ts +83 -110
- package/src/runtime/routes/browser-routes.ts +141 -0
- package/src/runtime/routes/btw-routes.ts +62 -106
- package/src/runtime/routes/cache-routes.ts +96 -0
- package/src/runtime/routes/call-routes.ts +208 -247
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +25 -27
- package/src/runtime/routes/channel-readiness-routes.ts +83 -120
- package/src/runtime/routes/channel-route-definitions.ts +62 -0
- package/src/runtime/routes/channel-route-shared.ts +14 -18
- package/src/runtime/routes/channel-verification-routes.ts +207 -187
- package/src/runtime/routes/client-routes.ts +48 -0
- package/src/runtime/routes/contact-routes.ts +533 -407
- package/src/runtime/routes/conversation-analysis-routes.ts +48 -49
- package/src/runtime/routes/conversation-attention-routes.ts +55 -67
- package/src/runtime/routes/conversation-list-routes.ts +265 -0
- package/src/runtime/routes/conversation-management-routes.ts +626 -715
- package/src/runtime/routes/conversation-query-routes.ts +510 -460
- package/src/runtime/routes/conversation-routes.ts +652 -457
- package/src/runtime/routes/conversation-starter-routes.ts +121 -71
- package/src/runtime/routes/credential-prompt-routes.ts +124 -0
- package/src/runtime/routes/debug-routes.ts +34 -39
- package/src/runtime/routes/defer-routes.ts +230 -0
- package/src/runtime/routes/diagnostics-routes.ts +79 -70
- package/src/runtime/routes/documents-routes.ts +117 -106
- package/src/runtime/routes/errors.ts +132 -0
- package/src/runtime/routes/events-routes.ts +97 -58
- package/src/runtime/routes/filing-routes.ts +65 -78
- package/src/runtime/routes/global-search-routes.ts +51 -57
- package/src/runtime/routes/group-routes.ts +199 -181
- package/src/runtime/routes/guardian-action-routes.ts +103 -169
- package/src/runtime/routes/guardian-approval-interception.ts +27 -58
- package/src/runtime/routes/guardian-approval-prompt.ts +10 -21
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +2 -6
- package/src/runtime/routes/guardian-expiry-sweep.ts +19 -36
- package/src/runtime/routes/heartbeat-routes.ts +194 -209
- package/src/runtime/routes/home-feed-routes.ts +85 -187
- package/src/runtime/routes/home-state-routes.ts +27 -24
- package/src/runtime/routes/host-bash-routes.ts +42 -52
- package/src/runtime/routes/host-browser-routes.ts +38 -69
- package/src/runtime/routes/host-cu-routes.ts +74 -70
- package/src/runtime/routes/host-file-routes.ts +50 -60
- package/src/runtime/routes/host-transfer-routes.ts +220 -0
- package/src/runtime/routes/http-adapter.ts +172 -0
- package/src/runtime/routes/identity-routes.ts +83 -79
- package/src/runtime/routes/inbound-conversation.ts +11 -18
- package/src/runtime/routes/inbound-message-handler.ts +162 -123
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +79 -138
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +2 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +54 -90
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +25 -50
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +5 -6
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -24
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -10
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +3 -3
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +19 -26
- package/src/runtime/routes/index.ts +197 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +25 -32
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +22 -31
- package/src/runtime/routes/integrations/slack/channel.ts +69 -66
- package/src/runtime/routes/integrations/slack/share.ts +49 -58
- package/src/runtime/routes/integrations/telegram.ts +91 -74
- package/src/runtime/routes/integrations/twilio.ts +163 -240
- package/src/runtime/routes/integrations/vercel.ts +57 -54
- package/src/runtime/routes/interface-routes.ts +43 -0
- package/src/runtime/routes/internal-oauth-routes.ts +56 -0
- package/src/runtime/routes/internal-twilio-routes.ts +46 -0
- package/src/runtime/routes/llm-context-normalization.ts +4 -2
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +90 -100
- package/src/runtime/routes/memory-item-routes.test.ts +153 -175
- package/src/runtime/routes/memory-item-routes.ts +243 -323
- package/src/runtime/routes/memory-v2-routes.ts +193 -0
- package/src/runtime/routes/migration-rollback-routes.ts +167 -212
- package/src/runtime/routes/migration-routes.ts +877 -377
- package/src/runtime/routes/notification-routes.ts +199 -70
- package/src/runtime/routes/oauth-apps.ts +254 -251
- package/src/runtime/routes/oauth-providers.ts +66 -57
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +224 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +60 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +250 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +195 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +159 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +207 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +175 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +27 -0
- package/src/runtime/routes/playground/force-compact.ts +60 -0
- package/src/runtime/routes/playground/guard.ts +36 -0
- package/src/runtime/routes/playground/helpers.ts +103 -0
- package/src/runtime/routes/playground/index.ts +18 -0
- package/src/runtime/routes/playground/inject-failures.ts +143 -0
- package/src/runtime/routes/playground/reset-circuit.ts +89 -0
- package/src/runtime/routes/playground/seed-conversation.ts +113 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +74 -0
- package/src/runtime/routes/playground/state.ts +77 -0
- package/src/runtime/routes/profiler-routes.ts +132 -167
- package/src/runtime/routes/ps-routes.ts +120 -0
- package/src/runtime/routes/recording-routes.ts +197 -258
- package/src/runtime/routes/rename-conversation-routes.ts +89 -0
- package/src/runtime/routes/schedule-routes.ts +284 -207
- package/src/runtime/routes/secret-routes.ts +219 -265
- package/src/runtime/routes/secrets-deps.ts +24 -0
- package/src/runtime/routes/settings-routes.ts +361 -441
- package/src/runtime/routes/skills-routes.ts +434 -469
- package/src/runtime/routes/stt-routes.ts +196 -206
- package/src/runtime/routes/subagents-routes.ts +125 -141
- package/src/runtime/routes/suggest-trust-rule-routes.ts +244 -0
- package/src/runtime/routes/surface-action-routes.ts +135 -190
- package/src/runtime/routes/surface-content-routes.ts +84 -118
- package/src/runtime/routes/task-routes.ts +354 -0
- package/src/runtime/routes/telemetry-routes.ts +33 -49
- package/src/runtime/routes/trace-event-routes.ts +55 -74
- package/src/runtime/routes/trust-rules-routes.ts +147 -239
- package/src/runtime/routes/tts-routes.ts +187 -169
- package/src/runtime/routes/types.ts +139 -0
- package/src/{ipc/routes/ui-request.ts → runtime/routes/ui-request-routes.ts} +23 -17
- package/src/runtime/routes/upgrade-broadcast-routes.ts +156 -197
- package/src/runtime/routes/usage-routes.ts +143 -169
- package/src/runtime/routes/user-routes.ts +102 -18
- package/src/runtime/routes/wake-conversation-routes.ts +49 -0
- package/src/{ipc/routes/watcher.ts → runtime/routes/watcher-routes.ts} +84 -39
- package/src/runtime/routes/wipe-conversation-routes.ts +89 -0
- package/src/runtime/routes/work-items-routes.test.ts +10 -20
- package/src/runtime/routes/work-items-routes.ts +418 -433
- package/src/runtime/routes/workspace-commit-routes.ts +30 -61
- package/src/runtime/routes/workspace-routes.test.ts +254 -381
- package/src/runtime/routes/workspace-routes.ts +238 -246
- package/src/runtime/runtime-mode.ts +8 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +80 -118
- package/src/runtime/services/analyze-conversation.ts +14 -41
- package/src/runtime/services/conversation-serializer.ts +181 -0
- package/src/runtime/skill-route-registry.ts +75 -15
- package/src/runtime/trust-context-resolver.ts +3 -2
- package/src/runtime/verification-outbound-actions.ts +13 -49
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +70 -2
- package/src/schedule/scheduler.ts +149 -8
- package/src/security/ces-credential-client.ts +32 -169
- package/src/security/ces-rpc-credential-backend.ts +1 -1
- package/src/security/credential-backend.ts +6 -6
- package/src/security/oauth-completion-page.ts +1 -1
- package/src/security/oauth2.ts +3 -6
- package/src/sequence/analytics.ts +1 -1
- package/src/sequence/guardrails.ts +3 -3
- package/src/sequence/store.ts +2 -1
- package/src/signals/bash.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/skills/catalog-cache.ts +19 -5
- package/src/skills/catalog-files.ts +0 -5
- package/src/skills/catalog-install.ts +28 -18
- package/src/skills/category-inference.ts +0 -11
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/managed-store.ts +2 -2
- package/src/skills/remote-skill-policy.ts +6 -7
- package/src/subagent/index.ts +2 -6
- package/src/subagent/manager.ts +27 -23
- package/src/subagent/types.ts +9 -0
- package/src/tasks/SPEC.md +2 -2
- package/src/tasks/task-compiler.ts +1 -1
- package/src/tasks/task-runner.ts +2 -22
- package/src/tasks/task-store.ts +1 -1
- package/src/tools/acp/list-agents.test.ts +115 -0
- package/src/tools/acp/list-agents.ts +31 -0
- package/src/tools/acp/spawn.test.ts +379 -0
- package/src/tools/acp/spawn.ts +142 -62
- package/src/tools/acp/steer.test.ts +101 -0
- package/src/tools/acp/steer.ts +38 -0
- package/src/tools/background-tool-registry.ts +98 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +189 -0
- package/src/tools/browser/browser-execution.ts +122 -26
- package/src/tools/browser/browser-manager.ts +1 -8
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +3 -1
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/browser/cdp-client/types.ts +4 -1
- package/src/tools/computer-use/definitions.ts +1 -1
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -2
- package/src/tools/credential-execution/manage-secure-command-tool.ts +1 -1
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -2
- package/src/tools/credentials/broker-types.ts +2 -1
- package/src/tools/document/editor-template.ts +1 -1
- package/src/tools/execution-timeout.ts +1 -1
- package/src/tools/executor.ts +123 -76
- package/src/tools/host-filesystem/transfer.test.ts +268 -0
- package/src/tools/host-filesystem/transfer.ts +234 -0
- package/src/tools/host-terminal/host-shell.ts +189 -11
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/register.test.ts +161 -1
- package/src/tools/memory/register.ts +19 -34
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/permission-checker.ts +103 -255
- package/src/tools/policy-context.ts +5 -8
- package/src/tools/registry.ts +156 -4
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +13 -154
- package/src/tools/shared/shell-output.ts +4 -1
- package/src/tools/side-effects.ts +2 -2
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/subagent/spawn.ts +35 -11
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/safe-env.ts +9 -1
- package/src/tools/terminal/shell.ts +161 -31
- package/src/tools/tool-approval-handler.ts +4 -70
- package/src/tools/tool-input-summary.ts +10 -0
- package/src/tools/types.ts +157 -151
- package/src/tools/ui-surface/definitions.ts +2 -2
- package/src/util/debounce.ts +0 -21
- package/src/util/errors.ts +0 -8
- package/src/util/log-redact.ts +0 -1
- package/src/util/platform.ts +85 -119
- package/src/util/pricing.ts +135 -9
- package/src/watcher/engine.ts +42 -20
- package/src/watcher/watcher-store.ts +2 -1
- package/src/work-items/work-item-store.ts +1 -1
- package/src/workspace/git-service.ts +1 -6
- package/src/workspace/migrations/006-services-config.ts +11 -4
- package/src/workspace/migrations/017-seed-persona-dirs.ts +1 -1
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +1 -1
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -1
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +3 -4
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +3 -4
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +150 -0
- package/src/workspace/migrations/053-release-notes-acp-codex.ts +107 -0
- package/src/workspace/migrations/054-seed-recall-callsite.ts +102 -0
- package/src/workspace/migrations/055-release-notes-agentic-recall.ts +63 -0
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +65 -0
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +98 -0
- package/src/workspace/migrations/058-release-notes-acp-sessions-ui.ts +71 -0
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +53 -0
- package/src/workspace/migrations/060-memory-v2-init.ts +53 -0
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +1 -1
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +2 -2
- package/src/workspace/provider-commit-message-generator.ts +1 -1
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +0 -471
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +0 -436
- package/src/__tests__/cli-command-risk-guard.test.ts +0 -368
- package/src/__tests__/compaction-circuit-breaker.test.ts +0 -336
- package/src/__tests__/config-watcher-feature-flags.test.ts +0 -211
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/conversation-approval-overrides.test.ts +0 -207
- package/src/__tests__/conversation-host-access-routes.test.ts +0 -229
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +0 -226
- package/src/__tests__/conversation-tool-setup-side-effect-flag.test.ts +0 -167
- package/src/__tests__/ephemeral-permissions.test.ts +0 -474
- package/src/__tests__/extension-id-sync-guard.test.ts +0 -241
- package/src/__tests__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +0 -374
- package/src/__tests__/native-host-marker-sync-guard.test.ts +0 -157
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/pairing-concurrent.test.ts +0 -84
- package/src/__tests__/pairing-routes.test.ts +0 -181
- package/src/__tests__/parser.test.ts +0 -595
- package/src/__tests__/permission-checker-host-gate.test.ts +0 -512
- package/src/__tests__/permission-controls-v2-flag.test.ts +0 -55
- package/src/__tests__/permission-mode.test.ts +0 -89
- package/src/__tests__/provider-env-vars-scope.test.ts +0 -52
- package/src/__tests__/risk-classifier-parity.test.ts +0 -230
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/shell-identity.test.ts +0 -370
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -629
- package/src/__tests__/shell-parser-property.test.ts +0 -936
- package/src/__tests__/starter-bundle.test.ts +0 -173
- package/src/__tests__/stt-catalog-parity.test.ts +0 -282
- package/src/__tests__/task-runner.test.ts +0 -224
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -357
- package/src/__tests__/trust-store-pattern-matches.test.ts +0 -29
- package/src/__tests__/trust-store.test.ts +0 -2013
- package/src/__tests__/v2-consent-policy.test.ts +0 -103
- package/src/browser/identifiers.ts +0 -51
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/cli/db.ts +0 -1
- package/src/config/bundled-skills/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -88
- package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +0 -40
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +0 -64
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +0 -88
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +0 -127
- package/src/daemon/approved-devices-store.ts +0 -110
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/external-skills-bootstrap.ts +0 -41
- package/src/daemon/message-types/trust.ts +0 -71
- package/src/daemon/pairing-store.ts +0 -229
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/ipc/cli-server.ts +0 -252
- package/src/ipc/routes/attachment.ts +0 -114
- package/src/ipc/routes/browser-context.ts +0 -61
- package/src/ipc/routes/browser.ts +0 -96
- package/src/ipc/routes/cache.ts +0 -96
- package/src/ipc/routes/index.ts +0 -21
- package/src/ipc/routes/task-queue.ts +0 -226
- package/src/ipc/routes/task.ts +0 -173
- package/src/ipc/routes/wake-conversation.ts +0 -19
- package/src/memory/db.ts +0 -23
- package/src/oauth/scope-policy.ts +0 -89
- package/src/permissions/bash-risk-classifier.test.ts +0 -1208
- package/src/permissions/bash-risk-classifier.ts +0 -707
- package/src/permissions/command-registry.test.ts +0 -535
- package/src/permissions/command-registry.ts +0 -825
- package/src/permissions/defaults.ts +0 -313
- package/src/permissions/file-risk-classifier.test.ts +0 -535
- package/src/permissions/file-risk-classifier.ts +0 -274
- package/src/permissions/permission-mode.ts +0 -24
- package/src/permissions/shell-identity.ts +0 -337
- package/src/permissions/skill-risk-classifier.test.ts +0 -311
- package/src/permissions/skill-risk-classifier.ts +0 -214
- package/src/permissions/trust-client.ts +0 -359
- package/src/permissions/trust-store-interface.ts +0 -100
- package/src/permissions/trust-store.ts +0 -1330
- package/src/permissions/v2-consent-policy.ts +0 -87
- package/src/permissions/web-risk-classifier.test.ts +0 -170
- package/src/permissions/web-risk-classifier.ts +0 -89
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +0 -715
- package/src/runtime/__tests__/capability-tokens.test.ts +0 -258
- package/src/runtime/actor-refresh-token-store.ts +0 -156
- package/src/runtime/actor-token-store.ts +0 -207
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -264
- package/src/runtime/auth/credential-service.ts +0 -352
- package/src/runtime/conversation-approval-overrides.ts +0 -86
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/browser-extension-pair-routes.ts +0 -556
- package/src/runtime/routes/channel-routes.ts +0 -112
- package/src/runtime/routes/contact-routes.test.ts +0 -298
- package/src/runtime/routes/guardian-bootstrap-routes.ts +0 -175
- package/src/runtime/routes/guardian-refresh-routes.ts +0 -79
- package/src/runtime/routes/invite-routes.ts +0 -280
- package/src/runtime/routes/pairing-routes.ts +0 -431
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +0 -67
- package/src/runtime/services/analyze-deps-singleton.ts +0 -32
- package/src/signals/shotgun.ts +0 -203
- package/src/tasks/ephemeral-permissions.ts +0 -55
- package/src/tools/terminal/parser.ts +0 -623
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- package/src/types/qrcode.d.ts +0 -13
- package/src/util/network-info.ts +0 -55
- /package/node_modules/@vellumai/{ces-contracts → ces-client}/tsconfig.json +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/grants.test.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/error.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/grants.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/handles.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rendering.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rpc.ts +0 -0
|
@@ -1,1330 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
chmodSync,
|
|
3
|
-
existsSync,
|
|
4
|
-
mkdirSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
renameSync,
|
|
7
|
-
writeFileSync,
|
|
8
|
-
} from "node:fs";
|
|
9
|
-
import { dirname, join } from "node:path";
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
parseTrustFileData,
|
|
13
|
-
parseTrustRule,
|
|
14
|
-
ruleScope,
|
|
15
|
-
SCOPED_TOOLS,
|
|
16
|
-
} from "@vellumai/ces-contracts";
|
|
17
|
-
import { Minimatch } from "minimatch";
|
|
18
|
-
import { v4 as uuid } from "uuid";
|
|
19
|
-
|
|
20
|
-
import { getIsContainerized } from "../config/env-registry.js";
|
|
21
|
-
import { getLogger } from "../util/logger.js";
|
|
22
|
-
import { getProtectedDir } from "../util/platform.js";
|
|
23
|
-
import { getDefaultRuleTemplates } from "./defaults.js";
|
|
24
|
-
import * as trustClient from "./trust-client.js";
|
|
25
|
-
import type {
|
|
26
|
-
AcceptStarterBundleResult,
|
|
27
|
-
StarterBundleRule,
|
|
28
|
-
TrustStoreBackend,
|
|
29
|
-
} from "./trust-store-interface.js";
|
|
30
|
-
import type { PolicyContext, TrustRule } from "./types.js";
|
|
31
|
-
|
|
32
|
-
export type {
|
|
33
|
-
AcceptStarterBundleResult,
|
|
34
|
-
StarterBundleRule,
|
|
35
|
-
} from "./trust-store-interface.js";
|
|
36
|
-
export type { TrustStoreBackend } from "./trust-store-interface.js";
|
|
37
|
-
|
|
38
|
-
const log = getLogger("trust-store");
|
|
39
|
-
|
|
40
|
-
/** O(1) lookup set for scoped tool names. */
|
|
41
|
-
const SCOPED_TOOLS_SET: ReadonlySet<string> = new Set(SCOPED_TOOLS);
|
|
42
|
-
|
|
43
|
-
const TRUST_FILE_VERSION = 3;
|
|
44
|
-
|
|
45
|
-
interface TrustFile {
|
|
46
|
-
version: number;
|
|
47
|
-
rules: TrustRule[];
|
|
48
|
-
/** Set to true when the user explicitly accepts the starter approval bundle. */
|
|
49
|
-
starterBundleAccepted?: boolean;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
let cachedRules: TrustRule[] | null = null;
|
|
53
|
-
let cachedStarterBundleAccepted: boolean | null = null;
|
|
54
|
-
|
|
55
|
-
// Callbacks invoked when trust rules change (add/update/remove/clear).
|
|
56
|
-
// Used by the permission checker to invalidate dependent caches.
|
|
57
|
-
const rulesChangedListeners: Array<() => void> = [];
|
|
58
|
-
|
|
59
|
-
/** Register a callback to be invoked whenever trust rules change (file backend). */
|
|
60
|
-
function fileOnRulesChanged(listener: () => void): void {
|
|
61
|
-
rulesChangedListeners.push(listener);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function notifyRulesChanged(): void {
|
|
65
|
-
for (const listener of rulesChangedListeners) {
|
|
66
|
-
listener();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Cache of pre-compiled Minimatch objects keyed by pattern string.
|
|
72
|
-
* Rebuilt whenever cachedRules changes. Avoids re-parsing glob patterns
|
|
73
|
-
* on every tool-call permission check.
|
|
74
|
-
*/
|
|
75
|
-
const compiledPatterns = new Map<string, Minimatch>();
|
|
76
|
-
/** Patterns that failed compilation — cached to avoid repeated attempts and log spam. */
|
|
77
|
-
const invalidPatterns = new Set<string>();
|
|
78
|
-
|
|
79
|
-
/** Get or compile a Minimatch object for the given pattern. Returns null if the pattern is invalid. */
|
|
80
|
-
function getCompiledPattern(pattern: string): Minimatch | null {
|
|
81
|
-
if (invalidPatterns.has(pattern)) return null;
|
|
82
|
-
let compiled = compiledPatterns.get(pattern);
|
|
83
|
-
if (!compiled) {
|
|
84
|
-
if (typeof pattern !== "string") {
|
|
85
|
-
log.warn({ pattern }, "Cannot compile non-string pattern");
|
|
86
|
-
invalidPatterns.add(pattern as string);
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
try {
|
|
90
|
-
compiled = new Minimatch(pattern);
|
|
91
|
-
compiledPatterns.set(pattern, compiled);
|
|
92
|
-
} catch (err) {
|
|
93
|
-
log.warn({ pattern, err }, "Failed to compile pattern");
|
|
94
|
-
invalidPatterns.add(pattern);
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return compiled;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Check whether a minimatch pattern matches a candidate string (file backend).
|
|
103
|
-
* Reuses the compiled pattern cache from trust rule evaluation.
|
|
104
|
-
*/
|
|
105
|
-
function filePatternMatchesCandidate(
|
|
106
|
-
pattern: string,
|
|
107
|
-
candidate: string,
|
|
108
|
-
): boolean {
|
|
109
|
-
const compiled = getCompiledPattern(pattern);
|
|
110
|
-
if (!compiled) return false;
|
|
111
|
-
return compiled.match(candidate);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Rebuild the compiled pattern cache from the current rule set. */
|
|
115
|
-
function rebuildPatternCache(rules: TrustRule[]): void {
|
|
116
|
-
compiledPatterns.clear();
|
|
117
|
-
invalidPatterns.clear();
|
|
118
|
-
for (const rule of rules) {
|
|
119
|
-
if (typeof rule.pattern !== "string") {
|
|
120
|
-
log.warn(
|
|
121
|
-
{ ruleId: rule.id, pattern: rule.pattern },
|
|
122
|
-
"Skipping rule with non-string pattern during cache rebuild",
|
|
123
|
-
);
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (!compiledPatterns.has(rule.pattern)) {
|
|
127
|
-
try {
|
|
128
|
-
compiledPatterns.set(rule.pattern, new Minimatch(rule.pattern));
|
|
129
|
-
} catch (err) {
|
|
130
|
-
log.warn(
|
|
131
|
-
{ ruleId: rule.id, pattern: rule.pattern, err },
|
|
132
|
-
"Skipping rule with invalid pattern during cache rebuild",
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function getTrustPath(): string {
|
|
140
|
-
return join(getGatewaySecurityDir(), "trust.json");
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Resolve the gateway security directory.
|
|
145
|
-
*
|
|
146
|
-
* Docker: `GATEWAY_SECURITY_DIR` env var.
|
|
147
|
-
* Local: the per-instance protected directory resolved by `getProtectedDir()`.
|
|
148
|
-
*/
|
|
149
|
-
function getGatewaySecurityDir(): string {
|
|
150
|
-
const securityDir = process.env.GATEWAY_SECURITY_DIR;
|
|
151
|
-
if (securityDir) return securityDir;
|
|
152
|
-
return getProtectedDir();
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Sort comparator: highest priority first. At the same priority, deny rules
|
|
157
|
-
* come before allow rules for safety (deny wins ties).
|
|
158
|
-
*/
|
|
159
|
-
function ruleOrder(a: TrustRule, b: TrustRule): number {
|
|
160
|
-
if (b.priority !== a.priority) return b.priority - a.priority;
|
|
161
|
-
if (a.decision !== b.decision) {
|
|
162
|
-
// deny > ask > allow
|
|
163
|
-
const order: Record<string, number> = { deny: 0, ask: 1, allow: 2 };
|
|
164
|
-
return (order[a.decision] ?? 2) - (order[b.decision] ?? 2);
|
|
165
|
-
}
|
|
166
|
-
return 0;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Ensure default rules are always present in the rule set.
|
|
171
|
-
* Mutates the provided array and returns whether any rules were added.
|
|
172
|
-
*/
|
|
173
|
-
function backfillDefaults(rules: TrustRule[]): boolean {
|
|
174
|
-
let changed = false;
|
|
175
|
-
const existingIds = new Set(rules.map((r) => r.id));
|
|
176
|
-
|
|
177
|
-
// Migrate old default:deny-*-protected rules → default:ask-*-protected
|
|
178
|
-
const oldDefaultPrefix = "default:deny-";
|
|
179
|
-
const newDefaultPrefix = "default:ask-";
|
|
180
|
-
for (let i = rules.length - 1; i >= 0; i--) {
|
|
181
|
-
const rule = rules[i];
|
|
182
|
-
if (
|
|
183
|
-
rule.id.startsWith(oldDefaultPrefix) &&
|
|
184
|
-
rule.id.endsWith("-protected")
|
|
185
|
-
) {
|
|
186
|
-
const newId = newDefaultPrefix + rule.id.slice(oldDefaultPrefix.length);
|
|
187
|
-
rules.splice(i, 1);
|
|
188
|
-
existingIds.delete(rule.id);
|
|
189
|
-
// Don't add newId to existingIds — let the backfill loop re-add it
|
|
190
|
-
changed = true;
|
|
191
|
-
log.info({ oldId: rule.id, newId }, "Migrated default deny rule to ask");
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Remove default rules that are no longer in the template set (e.g.
|
|
196
|
-
// computer_use_done/computer_use_respond were removed from the ask-rule list
|
|
197
|
-
// because they are terminal signal tools that don't need approval).
|
|
198
|
-
const templateIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
|
|
199
|
-
for (let i = rules.length - 1; i >= 0; i--) {
|
|
200
|
-
const rule = rules[i];
|
|
201
|
-
if (rule.id.startsWith("default:") && !templateIds.has(rule.id)) {
|
|
202
|
-
rules.splice(i, 1);
|
|
203
|
-
existingIds.delete(rule.id);
|
|
204
|
-
changed = true;
|
|
205
|
-
log.info({ ruleId: rule.id }, "Removed stale default trust rule");
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Migrate existing default rules whose priority, pattern, scope, or decision
|
|
210
|
-
// has changed in the template (e.g. host_bash pattern changed from '*' to
|
|
211
|
-
// '**', host tool priorities changed from 1000 to 50, workspace scope
|
|
212
|
-
// changed from getRootDir()+workspace to getWorkspaceDir()).
|
|
213
|
-
//
|
|
214
|
-
// Also strip any leftover allowHighRisk fields from persisted default rules
|
|
215
|
-
// since the field has been replaced by runtime determination.
|
|
216
|
-
//
|
|
217
|
-
// Rules with `userModifiedAt` set are skipped — the user explicitly
|
|
218
|
-
// customized them and their override should be preserved across upgrades.
|
|
219
|
-
for (const template of getDefaultRuleTemplates()) {
|
|
220
|
-
if (existingIds.has(template.id)) {
|
|
221
|
-
const rule = rules.find((r) => r.id === template.id);
|
|
222
|
-
if (!rule) continue;
|
|
223
|
-
// Strip legacy allowHighRisk from persisted default rules.
|
|
224
|
-
const ruleRecord = rule as unknown as Record<string, unknown>;
|
|
225
|
-
if ("allowHighRisk" in ruleRecord) {
|
|
226
|
-
delete ruleRecord.allowHighRisk;
|
|
227
|
-
changed = true;
|
|
228
|
-
}
|
|
229
|
-
if (
|
|
230
|
-
rule.priority !== template.priority ||
|
|
231
|
-
rule.pattern !== template.pattern ||
|
|
232
|
-
ruleScope(rule) !== (template.scope ?? "everywhere") ||
|
|
233
|
-
rule.decision !== template.decision
|
|
234
|
-
) {
|
|
235
|
-
if (rule.userModifiedAt != null) {
|
|
236
|
-
log.info(
|
|
237
|
-
{ ruleId: rule.id, userModifiedAt: rule.userModifiedAt },
|
|
238
|
-
"Skipping migration of user-modified default rule",
|
|
239
|
-
);
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
log.info(
|
|
243
|
-
{
|
|
244
|
-
ruleId: rule.id,
|
|
245
|
-
oldPriority: rule.priority,
|
|
246
|
-
newPriority: template.priority,
|
|
247
|
-
oldPattern: rule.pattern,
|
|
248
|
-
newPattern: template.pattern,
|
|
249
|
-
oldScope: ruleScope(rule),
|
|
250
|
-
newScope: template.scope ?? "everywhere",
|
|
251
|
-
},
|
|
252
|
-
"Migrated default rule to updated template values",
|
|
253
|
-
);
|
|
254
|
-
rule.priority = template.priority;
|
|
255
|
-
rule.pattern = template.pattern;
|
|
256
|
-
if (template.scope != null) {
|
|
257
|
-
rule.scope = template.scope;
|
|
258
|
-
}
|
|
259
|
-
rule.decision = template.decision;
|
|
260
|
-
changed = true;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
for (const template of getDefaultRuleTemplates()) {
|
|
266
|
-
if (!existingIds.has(template.id)) {
|
|
267
|
-
// Canonicalize through parseTrustRule so family-specific field
|
|
268
|
-
// validation is applied (consistent with fileAddRule/fileUpdateRule).
|
|
269
|
-
const { rule } = parseTrustRule({
|
|
270
|
-
...template,
|
|
271
|
-
createdAt: Date.now(),
|
|
272
|
-
});
|
|
273
|
-
rules.push(rule as TrustRule);
|
|
274
|
-
changed = true;
|
|
275
|
-
log.info({ ruleId: template.id }, "Backfilled default trust rule");
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return changed;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function loadFromDisk(): TrustRule[] {
|
|
282
|
-
const path = getTrustPath();
|
|
283
|
-
let rules: TrustRule[] = [];
|
|
284
|
-
let needsSave = false;
|
|
285
|
-
|
|
286
|
-
if (existsSync(path)) {
|
|
287
|
-
try {
|
|
288
|
-
const raw = readFileSync(path, "utf-8");
|
|
289
|
-
const data = JSON.parse(raw) as TrustFile;
|
|
290
|
-
|
|
291
|
-
// Guard: ensure rules is an array (protects against hand-edited files)
|
|
292
|
-
const rawRules = Array.isArray(data.rules) ? data.rules : [];
|
|
293
|
-
|
|
294
|
-
// Restore persisted starter bundle flag
|
|
295
|
-
cachedStarterBundleAccepted = data.starterBundleAccepted === true;
|
|
296
|
-
|
|
297
|
-
// Defense-in-depth: strip any __internal: prefixed rules that may have
|
|
298
|
-
// been hand-edited into trust.json.
|
|
299
|
-
const sanitizedRules = rawRules.filter((r) => {
|
|
300
|
-
if (typeof r.tool === "string" && r.tool.startsWith("__internal:")) {
|
|
301
|
-
log.warn(
|
|
302
|
-
{ ruleId: r.id, tool: r.tool },
|
|
303
|
-
"Stripping __internal: rule from trust file on load",
|
|
304
|
-
);
|
|
305
|
-
return false;
|
|
306
|
-
}
|
|
307
|
-
return true;
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
data.version === TRUST_FILE_VERSION ||
|
|
312
|
-
data.version === 1 ||
|
|
313
|
-
data.version === 2
|
|
314
|
-
) {
|
|
315
|
-
if (sanitizedRules.length < rawRules.length) {
|
|
316
|
-
needsSave = true;
|
|
317
|
-
}
|
|
318
|
-
if (data.version !== TRUST_FILE_VERSION) {
|
|
319
|
-
needsSave = true;
|
|
320
|
-
log.info(
|
|
321
|
-
{ version: data.version, targetVersion: TRUST_FILE_VERSION },
|
|
322
|
-
"Migrating legacy trust file version",
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Apply canonical parser for family-aware normalization.
|
|
327
|
-
// The parser strips fields that are invalid for a rule's tool family
|
|
328
|
-
// (e.g. executionTarget on URL rules) and coerces malformed values.
|
|
329
|
-
const { data: parsedData, normalized } = parseTrustFileData({
|
|
330
|
-
...data,
|
|
331
|
-
rules: sanitizedRules,
|
|
332
|
-
});
|
|
333
|
-
// The contracts parser returns the union TrustRule type; our local
|
|
334
|
-
// TrustRule flattens the union with optional fields for backward
|
|
335
|
-
// compatibility. The structural overlap is safe to cast here.
|
|
336
|
-
rules = parsedData.rules as TrustRule[];
|
|
337
|
-
if (normalized) {
|
|
338
|
-
needsSave = true;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// Strip legacy principal-scoped fields from persisted v3 rules.
|
|
342
|
-
// Before the principal concept was removed, rules could carry
|
|
343
|
-
// principalKind/principalId/principalVersion which acted as scope
|
|
344
|
-
// constraints. Now that matching ignores those fields, leaving them
|
|
345
|
-
// on loaded rules would silently widen their scope to global
|
|
346
|
-
// wildcards. Stripping them and re-saving prevents scope escalation.
|
|
347
|
-
for (const rule of rules) {
|
|
348
|
-
// Legacy v3 rules may carry principal-scoped fields that no longer
|
|
349
|
-
// exist in the TrustRule interface — cast to strip them at runtime.
|
|
350
|
-
const r = rule as unknown as Record<string, unknown>;
|
|
351
|
-
if (
|
|
352
|
-
"principalKind" in r ||
|
|
353
|
-
"principalId" in r ||
|
|
354
|
-
"principalVersion" in r
|
|
355
|
-
) {
|
|
356
|
-
delete r.principalKind;
|
|
357
|
-
delete r.principalId;
|
|
358
|
-
delete r.principalVersion;
|
|
359
|
-
needsSave = true;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
} else {
|
|
363
|
-
log.warn(
|
|
364
|
-
{ version: data.version },
|
|
365
|
-
"Unknown trust file version, applying defaults in-memory only",
|
|
366
|
-
);
|
|
367
|
-
// Apply default deny rules in-memory so the assistant is still
|
|
368
|
-
// protected, but do NOT persist — we must not overwrite a newer
|
|
369
|
-
// trust file format we don't understand.
|
|
370
|
-
const memRules: TrustRule[] = [];
|
|
371
|
-
backfillDefaults(memRules);
|
|
372
|
-
memRules.sort(ruleOrder);
|
|
373
|
-
return memRules;
|
|
374
|
-
}
|
|
375
|
-
} catch (err) {
|
|
376
|
-
log.error({ err }, "Failed to load trust file");
|
|
377
|
-
// Fall through to backfill defaults even on parse errors
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Backfill default rules at their declared priority
|
|
382
|
-
if (backfillDefaults(rules)) {
|
|
383
|
-
needsSave = true;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
rules.sort(ruleOrder);
|
|
387
|
-
|
|
388
|
-
if (needsSave) {
|
|
389
|
-
try {
|
|
390
|
-
saveToDisk(rules);
|
|
391
|
-
} catch (err) {
|
|
392
|
-
log.warn(
|
|
393
|
-
{ err },
|
|
394
|
-
"Failed to persist migrated trust rules (continuing with in-memory rules)",
|
|
395
|
-
);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
return rules;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
function saveToDisk(rules: TrustRule[]): void {
|
|
403
|
-
const path = getTrustPath();
|
|
404
|
-
const dir = dirname(path);
|
|
405
|
-
if (!existsSync(dir)) {
|
|
406
|
-
mkdirSync(dir, { recursive: true });
|
|
407
|
-
}
|
|
408
|
-
const data: TrustFile = { version: TRUST_FILE_VERSION, rules };
|
|
409
|
-
if (cachedStarterBundleAccepted) {
|
|
410
|
-
data.starterBundleAccepted = true;
|
|
411
|
-
}
|
|
412
|
-
const tmpPath = path + ".tmp." + process.pid;
|
|
413
|
-
writeFileSync(tmpPath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
414
|
-
renameSync(tmpPath, path);
|
|
415
|
-
// Enforce owner-only permissions even if the file already existed with
|
|
416
|
-
// wider permissions. Matches the pattern used in encrypted-store.ts.
|
|
417
|
-
chmodSync(path, 0o600);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
function getRules(): TrustRule[] {
|
|
421
|
-
if (cachedRules == null) {
|
|
422
|
-
cachedRules = loadFromDisk();
|
|
423
|
-
rebuildPatternCache(cachedRules);
|
|
424
|
-
}
|
|
425
|
-
return cachedRules;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
function fileAddRule(
|
|
429
|
-
tool: string,
|
|
430
|
-
pattern: string,
|
|
431
|
-
scope: string,
|
|
432
|
-
decision: "allow" | "deny" | "ask" = "allow",
|
|
433
|
-
priority: number = 100,
|
|
434
|
-
options?: {
|
|
435
|
-
executionTarget?: string;
|
|
436
|
-
},
|
|
437
|
-
): TrustRule {
|
|
438
|
-
if (tool.startsWith("__internal:"))
|
|
439
|
-
throw new Error(`Cannot create internal pseudo-rule via addRule: ${tool}`);
|
|
440
|
-
|
|
441
|
-
// Canonicalize through the shared parser so fields invalid for the tool's
|
|
442
|
-
// family are stripped before persistence, regardless of which callsite
|
|
443
|
-
// invoked addRule. Only include scope for scoped tools — non-scoped tools
|
|
444
|
-
// don't carry a scope field.
|
|
445
|
-
const rawRule: Record<string, unknown> = {
|
|
446
|
-
id: uuid(),
|
|
447
|
-
tool,
|
|
448
|
-
pattern,
|
|
449
|
-
decision,
|
|
450
|
-
priority,
|
|
451
|
-
createdAt: Date.now(),
|
|
452
|
-
};
|
|
453
|
-
if (SCOPED_TOOLS_SET.has(tool)) {
|
|
454
|
-
rawRule.scope = scope;
|
|
455
|
-
}
|
|
456
|
-
if (options?.executionTarget != null) {
|
|
457
|
-
rawRule.executionTarget = options.executionTarget;
|
|
458
|
-
}
|
|
459
|
-
const { rule: canonical } = parseTrustRule(rawRule);
|
|
460
|
-
const rule = canonical as TrustRule;
|
|
461
|
-
|
|
462
|
-
// Re-read from disk to avoid lost updates if another call modified rules
|
|
463
|
-
// between our last read and now (e.g. two rapid trust rule additions).
|
|
464
|
-
cachedRules = null;
|
|
465
|
-
const rules = [...getRules()];
|
|
466
|
-
rules.push(rule);
|
|
467
|
-
rules.sort(ruleOrder);
|
|
468
|
-
cachedRules = rules;
|
|
469
|
-
rebuildPatternCache(rules);
|
|
470
|
-
saveToDisk(rules);
|
|
471
|
-
notifyRulesChanged();
|
|
472
|
-
log.info({ rule }, "Added trust rule");
|
|
473
|
-
return rule;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
function fileUpdateRule(
|
|
477
|
-
id: string,
|
|
478
|
-
updates: {
|
|
479
|
-
tool?: string;
|
|
480
|
-
pattern?: string;
|
|
481
|
-
scope?: string;
|
|
482
|
-
decision?: "allow" | "deny" | "ask";
|
|
483
|
-
priority?: number;
|
|
484
|
-
},
|
|
485
|
-
): TrustRule {
|
|
486
|
-
if (updates.tool?.startsWith("__internal:"))
|
|
487
|
-
throw new Error(
|
|
488
|
-
`Cannot update tool to internal pseudo-rule: ${updates.tool}`,
|
|
489
|
-
);
|
|
490
|
-
|
|
491
|
-
// Re-read from disk to avoid lost updates from concurrent modifications.
|
|
492
|
-
cachedRules = null;
|
|
493
|
-
const rules = [...getRules()];
|
|
494
|
-
const index = rules.findIndex((r) => r.id === id);
|
|
495
|
-
if (index === -1) throw new Error(`Trust rule not found: ${id}`);
|
|
496
|
-
const merged = { ...rules[index] };
|
|
497
|
-
if (updates.tool != null) merged.tool = updates.tool;
|
|
498
|
-
if (updates.pattern != null) merged.pattern = updates.pattern;
|
|
499
|
-
// Only apply scope updates for scoped tools — non-scoped tools ignore scope.
|
|
500
|
-
const effectiveTool = updates.tool ?? merged.tool;
|
|
501
|
-
if (updates.scope != null && SCOPED_TOOLS_SET.has(effectiveTool)) {
|
|
502
|
-
merged.scope = updates.scope;
|
|
503
|
-
}
|
|
504
|
-
if (updates.decision != null) merged.decision = updates.decision;
|
|
505
|
-
if (updates.priority != null) merged.priority = updates.priority;
|
|
506
|
-
|
|
507
|
-
// Mark default rules with userModifiedAt so backfillDefaults() preserves
|
|
508
|
-
// the user's customization across upgrades instead of overwriting it.
|
|
509
|
-
// Only set the timestamp when the merged result actually diverges from the
|
|
510
|
-
// template — a no-op PATCH (same values) should not permanently opt a rule
|
|
511
|
-
// out of future template migrations.
|
|
512
|
-
const templates = getDefaultRuleTemplates();
|
|
513
|
-
const template = templates.find((t) => t.id === id);
|
|
514
|
-
if (template) {
|
|
515
|
-
const diverges =
|
|
516
|
-
merged.tool !== template.tool ||
|
|
517
|
-
merged.pattern !== template.pattern ||
|
|
518
|
-
ruleScope(merged) !== (template.scope ?? "everywhere") ||
|
|
519
|
-
merged.decision !== template.decision ||
|
|
520
|
-
merged.priority !== template.priority;
|
|
521
|
-
if (diverges) {
|
|
522
|
-
merged.userModifiedAt = Date.now();
|
|
523
|
-
} else {
|
|
524
|
-
// Rule matches the template again — clear the override marker so
|
|
525
|
-
// future template changes are applied normally.
|
|
526
|
-
delete merged.userModifiedAt;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
// Canonicalize through parseTrustRule so that fields invalid for the
|
|
531
|
-
// (potentially changed) tool family are stripped. For example, if a rule's
|
|
532
|
-
// tool is changed from "bash" to "web_fetch", executionTarget is dropped
|
|
533
|
-
// because URL-family tools don't support target scoping.
|
|
534
|
-
const { rule } = parseTrustRule(merged as unknown as Record<string, unknown>);
|
|
535
|
-
rules[index] = rule;
|
|
536
|
-
rules.sort(ruleOrder);
|
|
537
|
-
cachedRules = rules;
|
|
538
|
-
rebuildPatternCache(rules);
|
|
539
|
-
saveToDisk(rules);
|
|
540
|
-
notifyRulesChanged();
|
|
541
|
-
log.info({ rule }, "Updated trust rule");
|
|
542
|
-
return rule;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
function fileRemoveRule(id: string): boolean {
|
|
546
|
-
const defaultIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
|
|
547
|
-
if (defaultIds.has(id))
|
|
548
|
-
throw new Error(`Cannot remove default trust rule: ${id}`);
|
|
549
|
-
|
|
550
|
-
// Re-read from disk to avoid lost updates from concurrent modifications.
|
|
551
|
-
cachedRules = null;
|
|
552
|
-
const rules = [...getRules()];
|
|
553
|
-
const index = rules.findIndex((r) => r.id === id);
|
|
554
|
-
if (index === -1) return false;
|
|
555
|
-
rules.splice(index, 1);
|
|
556
|
-
cachedRules = rules;
|
|
557
|
-
rebuildPatternCache(rules);
|
|
558
|
-
saveToDisk(rules);
|
|
559
|
-
notifyRulesChanged();
|
|
560
|
-
log.info({ id }, "Removed trust rule");
|
|
561
|
-
return true;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
function matchesScope(ruleScope: string, workingDir: string): boolean {
|
|
565
|
-
if (ruleScope === "everywhere") return true;
|
|
566
|
-
// Strip optional trailing wildcard, then enforce a directory-boundary match
|
|
567
|
-
// so that a rule for "/path/project" does NOT match "/path/project-evil".
|
|
568
|
-
const prefix = ruleScope.replace(/\*$/, "").replace(/\/+$/, "");
|
|
569
|
-
const dir = workingDir.replace(/\/+$/, "");
|
|
570
|
-
return dir === prefix || dir.startsWith(prefix + "/");
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
function findRuleByDecision(
|
|
574
|
-
tool: string,
|
|
575
|
-
command: string,
|
|
576
|
-
scope: string,
|
|
577
|
-
decision: "allow" | "deny" | "ask",
|
|
578
|
-
): TrustRule | null {
|
|
579
|
-
const rules = getRules();
|
|
580
|
-
for (const rule of rules) {
|
|
581
|
-
if (rule.tool !== tool) continue;
|
|
582
|
-
if (rule.decision !== decision) continue;
|
|
583
|
-
const compiled = getCompiledPattern(rule.pattern);
|
|
584
|
-
if (!compiled || !compiled.match(command)) continue;
|
|
585
|
-
if (!matchesScope(ruleScope(rule), scope)) continue;
|
|
586
|
-
return rule;
|
|
587
|
-
}
|
|
588
|
-
return null;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Check whether a rule's executionTarget constraint matches the context.
|
|
593
|
-
*
|
|
594
|
-
* If the rule does not specify an executionTarget it matches any target
|
|
595
|
-
* (wildcard). If specified, it must match exactly.
|
|
596
|
-
*
|
|
597
|
-
* Not all trust rule families carry `executionTarget` — URL, managed-skill,
|
|
598
|
-
* and skill-load rules never have it. For those families the check is a
|
|
599
|
-
* no-op (wildcard match).
|
|
600
|
-
*/
|
|
601
|
-
function matchesExecutionTarget(rule: TrustRule, ctx?: PolicyContext): boolean {
|
|
602
|
-
if (rule.executionTarget == null) return true;
|
|
603
|
-
return ctx?.executionTarget === rule.executionTarget;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
/**
|
|
607
|
-
* Find the highest-priority rule that matches any of the command candidates (file backend).
|
|
608
|
-
* Rules are pre-sorted by priority descending, so the first match wins.
|
|
609
|
-
*
|
|
610
|
-
* When a `PolicyContext` is provided, rules that specify executionTarget
|
|
611
|
-
* constraints are filtered accordingly. Rules without those constraints
|
|
612
|
-
* act as wildcards and match any context.
|
|
613
|
-
*/
|
|
614
|
-
function fileFindHighestPriorityRule(
|
|
615
|
-
tool: string,
|
|
616
|
-
commands: string[],
|
|
617
|
-
scope: string,
|
|
618
|
-
ctx?: PolicyContext,
|
|
619
|
-
): TrustRule | null {
|
|
620
|
-
// Check ephemeral (task-scoped) rules first — they take precedence over
|
|
621
|
-
// file-based rules at the same priority because they are evaluated earlier.
|
|
622
|
-
// The ruleOrder sort (highest priority first, deny wins ties) still applies
|
|
623
|
-
// across the combined set because ephemeral rules use a lower default
|
|
624
|
-
// priority (50) than user rules (100), so user deny rules still win.
|
|
625
|
-
const ephemeral = ctx?.ephemeralRules ?? [];
|
|
626
|
-
const fileRules = getRules();
|
|
627
|
-
|
|
628
|
-
// Concatenate and re-sort so priority ordering is respected across both sets.
|
|
629
|
-
const allRules =
|
|
630
|
-
ephemeral.length > 0
|
|
631
|
-
? [...ephemeral, ...fileRules].sort(ruleOrder)
|
|
632
|
-
: fileRules;
|
|
633
|
-
|
|
634
|
-
for (const rule of allRules) {
|
|
635
|
-
if (rule.tool !== tool) continue;
|
|
636
|
-
if (!matchesScope(ruleScope(rule), scope)) continue;
|
|
637
|
-
if (!matchesExecutionTarget(rule, ctx)) continue;
|
|
638
|
-
const compiled = getCompiledPattern(rule.pattern);
|
|
639
|
-
if (!compiled) continue;
|
|
640
|
-
for (const command of commands) {
|
|
641
|
-
if (compiled.match(command)) {
|
|
642
|
-
return rule;
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
return null;
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
function fileFindMatchingRule(
|
|
650
|
-
tool: string,
|
|
651
|
-
command: string,
|
|
652
|
-
scope: string,
|
|
653
|
-
): TrustRule | null {
|
|
654
|
-
return findRuleByDecision(tool, command, scope, "allow");
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
function fileFindDenyRule(
|
|
658
|
-
tool: string,
|
|
659
|
-
command: string,
|
|
660
|
-
scope: string,
|
|
661
|
-
): TrustRule | null {
|
|
662
|
-
return findRuleByDecision(tool, command, scope, "deny");
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
function fileGetAllRules(): TrustRule[] {
|
|
666
|
-
return [...getRules()];
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
function fileClearAllRules(): void {
|
|
670
|
-
// Reset the starter bundle flag so the bundle can be re-accepted after clear.
|
|
671
|
-
cachedStarterBundleAccepted = false;
|
|
672
|
-
// Re-backfill default rules so protected directory stays guarded.
|
|
673
|
-
const rules: TrustRule[] = [];
|
|
674
|
-
backfillDefaults(rules);
|
|
675
|
-
rules.sort(ruleOrder);
|
|
676
|
-
cachedRules = rules;
|
|
677
|
-
rebuildPatternCache(rules);
|
|
678
|
-
saveToDisk(rules);
|
|
679
|
-
notifyRulesChanged();
|
|
680
|
-
log.info("Cleared all user trust rules (default rules preserved)");
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
function fileClearCache(): void {
|
|
684
|
-
cachedRules = null;
|
|
685
|
-
cachedStarterBundleAccepted = null;
|
|
686
|
-
compiledPatterns.clear();
|
|
687
|
-
invalidPatterns.clear();
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
// ─── Starter approval bundle ────────────────────────────────────────────────
|
|
691
|
-
//
|
|
692
|
-
// A curated set of low-risk tool rules that most users would approve
|
|
693
|
-
// individually during normal use. Accepting the bundle seeds them all at
|
|
694
|
-
// once, reducing prompt noise in strict mode while keeping the action
|
|
695
|
-
// explicitly opt-in.
|
|
696
|
-
|
|
697
|
-
/**
|
|
698
|
-
* Returns the starter bundle rule definitions (file backend). These cover read-only and
|
|
699
|
-
* information-gathering tools that never mutate the filesystem or execute
|
|
700
|
-
* arbitrary code.
|
|
701
|
-
*/
|
|
702
|
-
function fileGetStarterBundleRules(): StarterBundleRule[] {
|
|
703
|
-
return [
|
|
704
|
-
// Use standalone "**" globstar — minimatch only treats ** as globstar when
|
|
705
|
-
// it is its own path segment, so a "tool:**" prefix would collapse to
|
|
706
|
-
// single-star behavior and fail to match candidates containing "/".
|
|
707
|
-
// The tool field is already filtered by findHighestPriorityRule.
|
|
708
|
-
{
|
|
709
|
-
id: "starter:allow-file_read",
|
|
710
|
-
tool: "file_read",
|
|
711
|
-
pattern: "**",
|
|
712
|
-
scope: "everywhere",
|
|
713
|
-
decision: "allow",
|
|
714
|
-
priority: 90,
|
|
715
|
-
},
|
|
716
|
-
{
|
|
717
|
-
id: "starter:allow-glob",
|
|
718
|
-
tool: "glob",
|
|
719
|
-
pattern: "**",
|
|
720
|
-
scope: "everywhere",
|
|
721
|
-
decision: "allow",
|
|
722
|
-
priority: 90,
|
|
723
|
-
},
|
|
724
|
-
{
|
|
725
|
-
id: "starter:allow-grep",
|
|
726
|
-
tool: "grep",
|
|
727
|
-
pattern: "**",
|
|
728
|
-
scope: "everywhere",
|
|
729
|
-
decision: "allow",
|
|
730
|
-
priority: 90,
|
|
731
|
-
},
|
|
732
|
-
{
|
|
733
|
-
id: "starter:allow-list_directory",
|
|
734
|
-
tool: "list_directory",
|
|
735
|
-
pattern: "**",
|
|
736
|
-
scope: "everywhere",
|
|
737
|
-
decision: "allow",
|
|
738
|
-
priority: 90,
|
|
739
|
-
},
|
|
740
|
-
{
|
|
741
|
-
id: "starter:allow-web_search",
|
|
742
|
-
tool: "web_search",
|
|
743
|
-
pattern: "**",
|
|
744
|
-
scope: "everywhere",
|
|
745
|
-
decision: "allow",
|
|
746
|
-
priority: 90,
|
|
747
|
-
},
|
|
748
|
-
{
|
|
749
|
-
id: "starter:allow-web_fetch",
|
|
750
|
-
tool: "web_fetch",
|
|
751
|
-
pattern: "**",
|
|
752
|
-
scope: "everywhere",
|
|
753
|
-
decision: "allow",
|
|
754
|
-
priority: 90,
|
|
755
|
-
},
|
|
756
|
-
];
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
/** Whether the user has previously accepted the starter bundle (file backend). */
|
|
760
|
-
function fileIsStarterBundleAccepted(): boolean {
|
|
761
|
-
// Ensure rules are loaded (which also loads the flag from disk)
|
|
762
|
-
getRules();
|
|
763
|
-
return cachedStarterBundleAccepted === true;
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
/**
|
|
767
|
-
* Seed the trust store with the starter bundle rules (file backend).
|
|
768
|
-
*
|
|
769
|
-
* Idempotent: if the bundle was already accepted, no rules are added and
|
|
770
|
-
* `alreadyAccepted` is returned as true. Rules whose IDs already exist
|
|
771
|
-
* (e.g. from a previous partial acceptance) are skipped individually.
|
|
772
|
-
*/
|
|
773
|
-
function fileAcceptStarterBundle(): AcceptStarterBundleResult {
|
|
774
|
-
// Re-read from disk to avoid lost updates.
|
|
775
|
-
cachedRules = null;
|
|
776
|
-
cachedStarterBundleAccepted = null;
|
|
777
|
-
const rules = [...getRules()];
|
|
778
|
-
|
|
779
|
-
if (cachedStarterBundleAccepted === true) {
|
|
780
|
-
return { accepted: true, rulesAdded: 0, alreadyAccepted: true };
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
const existingIds = new Set(rules.map((r) => r.id));
|
|
784
|
-
let added = 0;
|
|
785
|
-
|
|
786
|
-
for (const template of fileGetStarterBundleRules()) {
|
|
787
|
-
if (existingIds.has(template.id)) continue;
|
|
788
|
-
rules.push({
|
|
789
|
-
id: template.id,
|
|
790
|
-
tool: template.tool,
|
|
791
|
-
pattern: template.pattern,
|
|
792
|
-
scope: template.scope,
|
|
793
|
-
decision: template.decision,
|
|
794
|
-
priority: template.priority,
|
|
795
|
-
createdAt: Date.now(),
|
|
796
|
-
});
|
|
797
|
-
added++;
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
cachedStarterBundleAccepted = true;
|
|
801
|
-
rules.sort(ruleOrder);
|
|
802
|
-
cachedRules = rules;
|
|
803
|
-
rebuildPatternCache(rules);
|
|
804
|
-
saveToDisk(rules);
|
|
805
|
-
notifyRulesChanged();
|
|
806
|
-
log.info({ rulesAdded: added }, "Starter approval bundle accepted");
|
|
807
|
-
|
|
808
|
-
return { accepted: true, rulesAdded: added, alreadyAccepted: false };
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
// ─── Backend interface ──────────────────────────────────────────────────────
|
|
812
|
-
|
|
813
|
-
/**
|
|
814
|
-
* File-based trust store backend. Wraps the module-level functions into a
|
|
815
|
-
* `TrustStoreBackend` so callers can program against the interface.
|
|
816
|
-
*/
|
|
817
|
-
const fileTrustStoreBackend: TrustStoreBackend = {
|
|
818
|
-
getAllRules: fileGetAllRules,
|
|
819
|
-
findHighestPriorityRule: fileFindHighestPriorityRule,
|
|
820
|
-
findMatchingRule: fileFindMatchingRule,
|
|
821
|
-
findDenyRule: fileFindDenyRule,
|
|
822
|
-
addRule: fileAddRule,
|
|
823
|
-
updateRule: fileUpdateRule,
|
|
824
|
-
removeRule: fileRemoveRule,
|
|
825
|
-
clearAllRules: fileClearAllRules,
|
|
826
|
-
acceptStarterBundle: fileAcceptStarterBundle,
|
|
827
|
-
isStarterBundleAccepted: fileIsStarterBundleAccepted,
|
|
828
|
-
onRulesChanged: fileOnRulesChanged,
|
|
829
|
-
clearCache: fileClearCache,
|
|
830
|
-
patternMatchesCandidate: filePatternMatchesCandidate,
|
|
831
|
-
getStarterBundleRules: fileGetStarterBundleRules,
|
|
832
|
-
};
|
|
833
|
-
|
|
834
|
-
// ─── Gateway-backed trust store adapter ─────────────────────────────────────
|
|
835
|
-
//
|
|
836
|
-
// When the daemon runs in a container (IS_CONTAINERIZED=true), trust rules
|
|
837
|
-
// are stored in the gateway — not on the local filesystem. This adapter
|
|
838
|
-
// wraps the async gateway HTTP client into the synchronous TrustStoreBackend
|
|
839
|
-
// interface using an in-memory cache.
|
|
840
|
-
//
|
|
841
|
-
// Read operations serve from the cache. Write operations call the gateway
|
|
842
|
-
// synchronously (via curl), then update the cache from the response.
|
|
843
|
-
// A background timer refreshes the cache every CACHE_TTL_MS.
|
|
844
|
-
|
|
845
|
-
const CACHE_TTL_MS = 5_000;
|
|
846
|
-
|
|
847
|
-
/**
|
|
848
|
-
* Gateway-backed trust store that caches rules in memory and refreshes
|
|
849
|
-
* on a TTL. Satisfies the synchronous TrustStoreBackend interface by
|
|
850
|
-
* reading from cache and writing via synchronous HTTP calls.
|
|
851
|
-
*/
|
|
852
|
-
class GatewayTrustStoreAdapter implements TrustStoreBackend {
|
|
853
|
-
private rules: TrustRule[] = [];
|
|
854
|
-
private starterBundleAccepted = false;
|
|
855
|
-
private initialized = false;
|
|
856
|
-
private refreshTimer: ReturnType<typeof setInterval> | null = null;
|
|
857
|
-
private readonly listeners: Array<() => void> = [];
|
|
858
|
-
|
|
859
|
-
/** Pattern cache — mirrors the file-based store's approach. */
|
|
860
|
-
private readonly gwCompiledPatterns = new Map<string, Minimatch>();
|
|
861
|
-
private readonly gwInvalidPatterns = new Set<string>();
|
|
862
|
-
|
|
863
|
-
// ── Initialization ──────────────────────────────────────────────────────
|
|
864
|
-
|
|
865
|
-
/**
|
|
866
|
-
* Ensure the cache is populated. Blocks synchronously on the first call
|
|
867
|
-
* by fetching rules from the gateway via the sync client. Subsequent
|
|
868
|
-
* calls are no-ops because the background refresh timer keeps the cache
|
|
869
|
-
* current.
|
|
870
|
-
*/
|
|
871
|
-
private ensureInitialized(): void {
|
|
872
|
-
if (this.initialized) return;
|
|
873
|
-
try {
|
|
874
|
-
this.rules = trustClient.getAllRulesSync();
|
|
875
|
-
this.rules.sort(ruleOrder);
|
|
876
|
-
this.rebuildPatternCache();
|
|
877
|
-
// Infer starterBundleAccepted from the fetched rules — if any starter
|
|
878
|
-
// rule IDs are present, the bundle was accepted.
|
|
879
|
-
const starterIds = new Set(fileGetStarterBundleRules().map((r) => r.id));
|
|
880
|
-
this.starterBundleAccepted = this.rules.some((r) => starterIds.has(r.id));
|
|
881
|
-
} catch (err) {
|
|
882
|
-
log.error(
|
|
883
|
-
{ err },
|
|
884
|
-
"Failed to load trust rules from gateway; using empty rule set",
|
|
885
|
-
);
|
|
886
|
-
this.rules = [];
|
|
887
|
-
}
|
|
888
|
-
this.initialized = true;
|
|
889
|
-
this.startRefreshTimer();
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
private startRefreshTimer(): void {
|
|
893
|
-
if (this.refreshTimer != null) return;
|
|
894
|
-
this.refreshTimer = setInterval(() => {
|
|
895
|
-
this.refreshCache();
|
|
896
|
-
}, CACHE_TTL_MS);
|
|
897
|
-
// Unref so the timer doesn't prevent the process from exiting.
|
|
898
|
-
if (
|
|
899
|
-
this.refreshTimer &&
|
|
900
|
-
typeof this.refreshTimer === "object" &&
|
|
901
|
-
"unref" in this.refreshTimer
|
|
902
|
-
) {
|
|
903
|
-
(this.refreshTimer as NodeJS.Timeout).unref();
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
private refreshCache(): void {
|
|
908
|
-
try {
|
|
909
|
-
const fresh = trustClient.getAllRulesSync();
|
|
910
|
-
fresh.sort(ruleOrder);
|
|
911
|
-
const oldJson = JSON.stringify(this.rules);
|
|
912
|
-
this.rules = fresh;
|
|
913
|
-
this.rebuildPatternCache();
|
|
914
|
-
// Detect starter bundle acceptance
|
|
915
|
-
const starterIds = new Set(fileGetStarterBundleRules().map((r) => r.id));
|
|
916
|
-
this.starterBundleAccepted = this.rules.some((r) => starterIds.has(r.id));
|
|
917
|
-
if (JSON.stringify(fresh) !== oldJson) {
|
|
918
|
-
this.notifyListeners();
|
|
919
|
-
}
|
|
920
|
-
} catch (err) {
|
|
921
|
-
log.warn(
|
|
922
|
-
{ err },
|
|
923
|
-
"Failed to refresh trust rules from gateway; using stale cache",
|
|
924
|
-
);
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
private rebuildPatternCache(): void {
|
|
929
|
-
this.gwCompiledPatterns.clear();
|
|
930
|
-
this.gwInvalidPatterns.clear();
|
|
931
|
-
for (const rule of this.rules) {
|
|
932
|
-
if (typeof rule.pattern !== "string") continue;
|
|
933
|
-
if (!this.gwCompiledPatterns.has(rule.pattern)) {
|
|
934
|
-
try {
|
|
935
|
-
this.gwCompiledPatterns.set(
|
|
936
|
-
rule.pattern,
|
|
937
|
-
new Minimatch(rule.pattern),
|
|
938
|
-
);
|
|
939
|
-
} catch {
|
|
940
|
-
// skip invalid patterns
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
private getCompiledPattern(pattern: string): Minimatch | null {
|
|
947
|
-
if (this.gwInvalidPatterns.has(pattern)) return null;
|
|
948
|
-
let compiled = this.gwCompiledPatterns.get(pattern);
|
|
949
|
-
if (!compiled) {
|
|
950
|
-
try {
|
|
951
|
-
compiled = new Minimatch(pattern);
|
|
952
|
-
this.gwCompiledPatterns.set(pattern, compiled);
|
|
953
|
-
} catch {
|
|
954
|
-
this.gwInvalidPatterns.add(pattern);
|
|
955
|
-
return null;
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
return compiled;
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
private notifyListeners(): void {
|
|
962
|
-
for (const listener of this.listeners) {
|
|
963
|
-
listener();
|
|
964
|
-
}
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
// ── TrustStoreBackend implementation ────────────────────────────────────
|
|
968
|
-
|
|
969
|
-
getAllRules(): TrustRule[] {
|
|
970
|
-
this.ensureInitialized();
|
|
971
|
-
return [...this.rules];
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
findHighestPriorityRule(
|
|
975
|
-
tool: string,
|
|
976
|
-
commands: string[],
|
|
977
|
-
scope: string,
|
|
978
|
-
ctx?: PolicyContext,
|
|
979
|
-
): TrustRule | null {
|
|
980
|
-
this.ensureInitialized();
|
|
981
|
-
const ephemeral = ctx?.ephemeralRules ?? [];
|
|
982
|
-
const allRules =
|
|
983
|
-
ephemeral.length > 0
|
|
984
|
-
? [...ephemeral, ...this.rules].sort(ruleOrder)
|
|
985
|
-
: this.rules;
|
|
986
|
-
|
|
987
|
-
for (const rule of allRules) {
|
|
988
|
-
if (rule.tool !== tool) continue;
|
|
989
|
-
if (!matchesScope(ruleScope(rule), scope)) continue;
|
|
990
|
-
if (!matchesExecutionTarget(rule, ctx)) continue;
|
|
991
|
-
const compiled = this.getCompiledPattern(rule.pattern);
|
|
992
|
-
if (!compiled) continue;
|
|
993
|
-
for (const command of commands) {
|
|
994
|
-
if (compiled.match(command)) {
|
|
995
|
-
return rule;
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
}
|
|
999
|
-
return null;
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
findMatchingRule(
|
|
1003
|
-
tool: string,
|
|
1004
|
-
command: string,
|
|
1005
|
-
scope: string,
|
|
1006
|
-
): TrustRule | null {
|
|
1007
|
-
this.ensureInitialized();
|
|
1008
|
-
for (const rule of this.rules) {
|
|
1009
|
-
if (rule.tool !== tool) continue;
|
|
1010
|
-
if (rule.decision !== "allow") continue;
|
|
1011
|
-
const compiled = this.getCompiledPattern(rule.pattern);
|
|
1012
|
-
if (!compiled || !compiled.match(command)) continue;
|
|
1013
|
-
if (!matchesScope(ruleScope(rule), scope)) continue;
|
|
1014
|
-
return rule;
|
|
1015
|
-
}
|
|
1016
|
-
return null;
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
findDenyRule(tool: string, command: string, scope: string): TrustRule | null {
|
|
1020
|
-
this.ensureInitialized();
|
|
1021
|
-
for (const rule of this.rules) {
|
|
1022
|
-
if (rule.tool !== tool) continue;
|
|
1023
|
-
if (rule.decision !== "deny") continue;
|
|
1024
|
-
const compiled = this.getCompiledPattern(rule.pattern);
|
|
1025
|
-
if (!compiled || !compiled.match(command)) continue;
|
|
1026
|
-
if (!matchesScope(ruleScope(rule), scope)) continue;
|
|
1027
|
-
return rule;
|
|
1028
|
-
}
|
|
1029
|
-
return null;
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
|
-
addRule(
|
|
1033
|
-
tool: string,
|
|
1034
|
-
pattern: string,
|
|
1035
|
-
scope: string,
|
|
1036
|
-
decision: "allow" | "deny" | "ask" = "allow",
|
|
1037
|
-
priority: number = 100,
|
|
1038
|
-
options?: {
|
|
1039
|
-
executionTarget?: string;
|
|
1040
|
-
},
|
|
1041
|
-
): TrustRule {
|
|
1042
|
-
if (tool.startsWith("__internal:"))
|
|
1043
|
-
throw new Error(
|
|
1044
|
-
`Cannot create internal pseudo-rule via addRule: ${tool}`,
|
|
1045
|
-
);
|
|
1046
|
-
|
|
1047
|
-
// Canonicalize through the shared parser so fields invalid for the tool's
|
|
1048
|
-
// family are stripped before sending to the gateway.
|
|
1049
|
-
const { rule: canonical } = parseTrustRule({
|
|
1050
|
-
id: "",
|
|
1051
|
-
tool,
|
|
1052
|
-
pattern,
|
|
1053
|
-
scope,
|
|
1054
|
-
decision,
|
|
1055
|
-
priority,
|
|
1056
|
-
createdAt: 0,
|
|
1057
|
-
...(options?.executionTarget != null
|
|
1058
|
-
? { executionTarget: options.executionTarget }
|
|
1059
|
-
: {}),
|
|
1060
|
-
});
|
|
1061
|
-
const canonicalOpts: { executionTarget?: string } = {};
|
|
1062
|
-
if ("executionTarget" in canonical) {
|
|
1063
|
-
canonicalOpts.executionTarget = (
|
|
1064
|
-
canonical as { executionTarget?: string }
|
|
1065
|
-
).executionTarget;
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
this.ensureInitialized();
|
|
1069
|
-
const rule = trustClient.addRuleSync({
|
|
1070
|
-
tool: canonical.tool,
|
|
1071
|
-
pattern: canonical.pattern,
|
|
1072
|
-
// Only send scope for scoped tools — non-scoped tools omit it.
|
|
1073
|
-
...(SCOPED_TOOLS_SET.has(canonical.tool)
|
|
1074
|
-
? { scope: ruleScope(canonical) }
|
|
1075
|
-
: {}),
|
|
1076
|
-
decision: canonical.decision,
|
|
1077
|
-
priority: canonical.priority,
|
|
1078
|
-
executionTarget: canonicalOpts.executionTarget,
|
|
1079
|
-
});
|
|
1080
|
-
// Update local cache
|
|
1081
|
-
this.rules = [...this.rules, rule].sort(ruleOrder);
|
|
1082
|
-
this.rebuildPatternCache();
|
|
1083
|
-
this.notifyListeners();
|
|
1084
|
-
log.info({ rule }, "Added trust rule via gateway");
|
|
1085
|
-
return rule;
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
updateRule(
|
|
1089
|
-
id: string,
|
|
1090
|
-
updates: {
|
|
1091
|
-
tool?: string;
|
|
1092
|
-
pattern?: string;
|
|
1093
|
-
scope?: string;
|
|
1094
|
-
decision?: "allow" | "deny" | "ask";
|
|
1095
|
-
priority?: number;
|
|
1096
|
-
},
|
|
1097
|
-
): TrustRule {
|
|
1098
|
-
if (updates.tool?.startsWith("__internal:"))
|
|
1099
|
-
throw new Error(
|
|
1100
|
-
`Cannot update tool to internal pseudo-rule: ${updates.tool}`,
|
|
1101
|
-
);
|
|
1102
|
-
this.ensureInitialized();
|
|
1103
|
-
|
|
1104
|
-
// Send only the caller's partial updates to the gateway. The gateway's
|
|
1105
|
-
// own updateRule merges and canonicalizes via parseTrustRule, so doing a
|
|
1106
|
-
// full-rule merge here against the local cache would risk overwriting
|
|
1107
|
-
// concurrent edits with stale cached values.
|
|
1108
|
-
const rule = trustClient.updateRuleSync(id, updates);
|
|
1109
|
-
// Update local cache
|
|
1110
|
-
const idx = this.rules.findIndex((r) => r.id === id);
|
|
1111
|
-
if (idx >= 0) {
|
|
1112
|
-
this.rules[idx] = rule;
|
|
1113
|
-
} else {
|
|
1114
|
-
this.rules.push(rule);
|
|
1115
|
-
}
|
|
1116
|
-
this.rules = [...this.rules].sort(ruleOrder);
|
|
1117
|
-
this.rebuildPatternCache();
|
|
1118
|
-
this.notifyListeners();
|
|
1119
|
-
log.info({ rule }, "Updated trust rule via gateway");
|
|
1120
|
-
return rule;
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
removeRule(id: string): boolean {
|
|
1124
|
-
this.ensureInitialized();
|
|
1125
|
-
const success = trustClient.removeRuleSync(id);
|
|
1126
|
-
if (success) {
|
|
1127
|
-
this.rules = this.rules.filter((r) => r.id !== id);
|
|
1128
|
-
this.rebuildPatternCache();
|
|
1129
|
-
this.notifyListeners();
|
|
1130
|
-
log.info({ id }, "Removed trust rule via gateway");
|
|
1131
|
-
}
|
|
1132
|
-
return success;
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
clearAllRules(): void {
|
|
1136
|
-
this.ensureInitialized();
|
|
1137
|
-
trustClient.clearRulesSync();
|
|
1138
|
-
this.starterBundleAccepted = false;
|
|
1139
|
-
// Re-fetch to get the default rules the gateway preserves
|
|
1140
|
-
try {
|
|
1141
|
-
this.rules = trustClient.getAllRulesSync();
|
|
1142
|
-
this.rules.sort(ruleOrder);
|
|
1143
|
-
} catch {
|
|
1144
|
-
this.rules = [];
|
|
1145
|
-
}
|
|
1146
|
-
this.rebuildPatternCache();
|
|
1147
|
-
this.notifyListeners();
|
|
1148
|
-
log.info("Cleared all user trust rules via gateway");
|
|
1149
|
-
}
|
|
1150
|
-
|
|
1151
|
-
acceptStarterBundle(): AcceptStarterBundleResult {
|
|
1152
|
-
this.ensureInitialized();
|
|
1153
|
-
const result = trustClient.acceptStarterBundleSync();
|
|
1154
|
-
this.starterBundleAccepted = true;
|
|
1155
|
-
// Refresh cache to include the newly added starter rules
|
|
1156
|
-
try {
|
|
1157
|
-
this.rules = trustClient.getAllRulesSync();
|
|
1158
|
-
this.rules.sort(ruleOrder);
|
|
1159
|
-
} catch {
|
|
1160
|
-
// Keep stale cache
|
|
1161
|
-
}
|
|
1162
|
-
this.rebuildPatternCache();
|
|
1163
|
-
this.notifyListeners();
|
|
1164
|
-
log.info(
|
|
1165
|
-
{ rulesAdded: result.rulesAdded },
|
|
1166
|
-
"Starter approval bundle accepted via gateway",
|
|
1167
|
-
);
|
|
1168
|
-
return { ...result, alreadyAccepted: result.rulesAdded === 0 };
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
isStarterBundleAccepted(): boolean {
|
|
1172
|
-
this.ensureInitialized();
|
|
1173
|
-
return this.starterBundleAccepted;
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
onRulesChanged(listener: () => void): void {
|
|
1177
|
-
this.listeners.push(listener);
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1180
|
-
clearCache(): void {
|
|
1181
|
-
this.initialized = false;
|
|
1182
|
-
this.rules = [];
|
|
1183
|
-
this.starterBundleAccepted = false;
|
|
1184
|
-
this.gwCompiledPatterns.clear();
|
|
1185
|
-
this.gwInvalidPatterns.clear();
|
|
1186
|
-
if (this.refreshTimer != null) {
|
|
1187
|
-
clearInterval(this.refreshTimer);
|
|
1188
|
-
this.refreshTimer = null;
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
patternMatchesCandidate(pattern: string, candidate: string): boolean {
|
|
1193
|
-
const compiled = this.getCompiledPattern(pattern);
|
|
1194
|
-
if (!compiled) return false;
|
|
1195
|
-
return compiled.match(candidate);
|
|
1196
|
-
}
|
|
1197
|
-
|
|
1198
|
-
getStarterBundleRules(): StarterBundleRule[] {
|
|
1199
|
-
// Starter bundle definitions are static — same regardless of backend.
|
|
1200
|
-
return fileGetStarterBundleRules();
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
|
|
1204
|
-
/** Singleton gateway adapter instance (lazily created). */
|
|
1205
|
-
let gatewayTrustStoreBackend: GatewayTrustStoreAdapter | null = null;
|
|
1206
|
-
|
|
1207
|
-
function getGatewayTrustStore(): GatewayTrustStoreAdapter {
|
|
1208
|
-
if (!gatewayTrustStoreBackend) {
|
|
1209
|
-
gatewayTrustStoreBackend = new GatewayTrustStoreAdapter();
|
|
1210
|
-
}
|
|
1211
|
-
return gatewayTrustStoreBackend;
|
|
1212
|
-
}
|
|
1213
|
-
|
|
1214
|
-
/**
|
|
1215
|
-
* Returns the active trust store backend.
|
|
1216
|
-
*
|
|
1217
|
-
* When `IS_CONTAINERIZED=true`, returns a gateway-backed adapter that
|
|
1218
|
-
* proxies all trust operations through the gateway HTTP API.
|
|
1219
|
-
*
|
|
1220
|
-
* When `IS_CONTAINERIZED=false`, returns the file-based implementation.
|
|
1221
|
-
*/
|
|
1222
|
-
export function getTrustStore(): TrustStoreBackend {
|
|
1223
|
-
if (getIsContainerized()) {
|
|
1224
|
-
return getGatewayTrustStore();
|
|
1225
|
-
}
|
|
1226
|
-
return fileTrustStoreBackend;
|
|
1227
|
-
}
|
|
1228
|
-
|
|
1229
|
-
// ─── Module-level exports that delegate through getTrustStore() ─────────────
|
|
1230
|
-
//
|
|
1231
|
-
// All existing callers import these functions directly. By delegating through
|
|
1232
|
-
// getTrustStore(), they automatically get the right backend (file-based or
|
|
1233
|
-
// gateway-backed) without changing their imports.
|
|
1234
|
-
|
|
1235
|
-
export function addRule(
|
|
1236
|
-
tool: string,
|
|
1237
|
-
pattern: string,
|
|
1238
|
-
scope: string,
|
|
1239
|
-
decision: "allow" | "deny" | "ask" = "allow",
|
|
1240
|
-
priority: number = 100,
|
|
1241
|
-
options?: {
|
|
1242
|
-
executionTarget?: string;
|
|
1243
|
-
},
|
|
1244
|
-
): TrustRule {
|
|
1245
|
-
return getTrustStore().addRule(
|
|
1246
|
-
tool,
|
|
1247
|
-
pattern,
|
|
1248
|
-
scope,
|
|
1249
|
-
decision,
|
|
1250
|
-
priority,
|
|
1251
|
-
options,
|
|
1252
|
-
);
|
|
1253
|
-
}
|
|
1254
|
-
|
|
1255
|
-
export function updateRule(
|
|
1256
|
-
id: string,
|
|
1257
|
-
updates: {
|
|
1258
|
-
tool?: string;
|
|
1259
|
-
pattern?: string;
|
|
1260
|
-
scope?: string;
|
|
1261
|
-
decision?: "allow" | "deny" | "ask";
|
|
1262
|
-
priority?: number;
|
|
1263
|
-
},
|
|
1264
|
-
): TrustRule {
|
|
1265
|
-
return getTrustStore().updateRule(id, updates);
|
|
1266
|
-
}
|
|
1267
|
-
|
|
1268
|
-
export function removeRule(id: string): boolean {
|
|
1269
|
-
return getTrustStore().removeRule(id);
|
|
1270
|
-
}
|
|
1271
|
-
|
|
1272
|
-
export function clearAllRules(): void {
|
|
1273
|
-
getTrustStore().clearAllRules();
|
|
1274
|
-
}
|
|
1275
|
-
|
|
1276
|
-
export function getAllRules(): TrustRule[] {
|
|
1277
|
-
return getTrustStore().getAllRules();
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
export function findHighestPriorityRule(
|
|
1281
|
-
tool: string,
|
|
1282
|
-
commands: string[],
|
|
1283
|
-
scope: string,
|
|
1284
|
-
ctx?: PolicyContext,
|
|
1285
|
-
): TrustRule | null {
|
|
1286
|
-
return getTrustStore().findHighestPriorityRule(tool, commands, scope, ctx);
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
export function findMatchingRule(
|
|
1290
|
-
tool: string,
|
|
1291
|
-
command: string,
|
|
1292
|
-
scope: string,
|
|
1293
|
-
): TrustRule | null {
|
|
1294
|
-
return getTrustStore().findMatchingRule(tool, command, scope);
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
export function findDenyRule(
|
|
1298
|
-
tool: string,
|
|
1299
|
-
command: string,
|
|
1300
|
-
scope: string,
|
|
1301
|
-
): TrustRule | null {
|
|
1302
|
-
return getTrustStore().findDenyRule(tool, command, scope);
|
|
1303
|
-
}
|
|
1304
|
-
|
|
1305
|
-
export function acceptStarterBundle(): AcceptStarterBundleResult {
|
|
1306
|
-
return getTrustStore().acceptStarterBundle();
|
|
1307
|
-
}
|
|
1308
|
-
|
|
1309
|
-
export function isStarterBundleAccepted(): boolean {
|
|
1310
|
-
return getTrustStore().isStarterBundleAccepted();
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
export function getStarterBundleRules(): StarterBundleRule[] {
|
|
1314
|
-
return getTrustStore().getStarterBundleRules();
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
export function onRulesChanged(listener: () => void): void {
|
|
1318
|
-
getTrustStore().onRulesChanged(listener);
|
|
1319
|
-
}
|
|
1320
|
-
|
|
1321
|
-
export function clearCache(): void {
|
|
1322
|
-
getTrustStore().clearCache();
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
export function patternMatchesCandidate(
|
|
1326
|
-
pattern: string,
|
|
1327
|
-
candidate: string,
|
|
1328
|
-
): boolean {
|
|
1329
|
-
return getTrustStore().patternMatchesCandidate(pattern, candidate);
|
|
1330
|
-
}
|