@vellumai/assistant 0.7.1 → 0.7.2
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/ARCHITECTURE.md +32 -49
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -0
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +565 -12
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +374 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +109 -2
- package/src/__tests__/assistant-event.test.ts +10 -0
- package/src/__tests__/assistant-events-sse-hardening.test.ts +7 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -7
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-readiness-service.test.ts +59 -1
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +90 -155
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +5 -12
- package/src/__tests__/cu-unified-flow.test.ts +185 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-service.test.ts +718 -1
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +602 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +246 -47
- package/src/__tests__/host-bash-routes.test.ts +294 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +41 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
- package/src/__tests__/host-file-proxy.test.ts +37 -43
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/prechat-onboarding-contract.test.ts +3 -1
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +10 -6
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/bundler/app-bundler.ts +51 -3
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +73 -0
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +15 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +296 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +0 -18
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +67 -10
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -12
- package/src/config/feature-flag-registry.json +21 -133
- package/src/config/loader.ts +73 -99
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +7 -4
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/heartbeat.ts +63 -0
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +5 -10
- package/src/config/schemas/memory-lifecycle.ts +77 -24
- package/src/config/schemas/memory-v2.ts +48 -4
- package/src/config/schemas/platform.ts +6 -0
- package/src/config/schemas/services.ts +1 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +1 -1
- package/src/contacts/contact-store.ts +0 -30
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +4 -3
- package/src/daemon/conversation-agent-loop-handlers.ts +21 -3
- package/src/daemon/conversation-agent-loop.ts +32 -28
- package/src/daemon/conversation-lifecycle.ts +8 -1
- package/src/daemon/conversation-process.ts +16 -11
- package/src/daemon/conversation-runtime-assembly.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +125 -4
- package/src/daemon/conversation-tool-setup.ts +16 -55
- package/src/daemon/conversation.ts +21 -2
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -1
- package/src/daemon/host-app-control-proxy.ts +293 -0
- package/src/daemon/host-bash-proxy.ts +84 -74
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +81 -86
- package/src/daemon/host-file-proxy.ts +93 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +247 -129
- package/src/daemon/lifecycle.ts +115 -117
- package/src/daemon/message-protocol.ts +3 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +11 -8
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +15 -7
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
- package/src/heartbeat/heartbeat-run-store.ts +236 -0
- package/src/heartbeat/heartbeat-service.ts +280 -49
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +14 -1
- package/src/ipc/cli-client.ts +32 -1
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +32 -7
- package/src/memory/context-search/sources/memory-v2.ts +17 -5
- package/src/memory/conversation-crud.ts +1 -1
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +4 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -4
- package/src/memory/graph/conversation-graph-memory.ts +1 -24
- package/src/memory/graph/graph-search.ts +8 -0
- package/src/memory/graph/retriever.ts +28 -0
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +66 -22
- package/src/memory/jobs-worker.ts +112 -63
- package/src/memory/memory-v2-activation-log-store.ts +1 -1
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +50 -20
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +7 -0
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/v2/__tests__/activation.test.ts +77 -95
- package/src/memory/v2/__tests__/injection.test.ts +43 -21
- package/src/memory/v2/__tests__/sim.test.ts +166 -6
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +0 -1
- package/src/memory/v2/activation.ts +69 -88
- package/src/memory/v2/consolidation-job.ts +3 -5
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +86 -53
- package/src/memory/v2/prompts/consolidation.ts +312 -91
- package/src/memory/v2/qdrant.ts +99 -1
- package/src/memory/v2/sim.ts +126 -16
- package/src/memory/v2/skill-qdrant.ts +12 -3
- package/src/memory/v2/skill-store.ts +16 -1
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +6 -5
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/oauth/connect-orchestrator.ts +4 -0
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/system-prompt.ts +3 -18
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/runtime/assistant-event-hub.ts +118 -96
- package/src/runtime/assistant-event.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +19 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +35 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +1 -0
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +30 -13
- package/src/runtime/routes/document-pdf-renderer.ts +165 -0
- package/src/runtime/routes/documents-routes.ts +30 -0
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +12 -6
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +36 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +44 -14
- package/src/runtime/routes/host-file-routes.ts +33 -10
- package/src/runtime/routes/host-transfer-routes.ts +64 -24
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +15 -43
- package/src/runtime/routes/inbound-message-handler.ts +1 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +441 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +63 -38
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +5 -5
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.ts +26 -0
- package/src/tools/host-filesystem/read.ts +26 -0
- package/src/tools/host-filesystem/transfer.ts +31 -1
- package/src/tools/host-filesystem/write.ts +26 -0
- package/src/tools/host-terminal/host-shell.ts +58 -0
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/tool-approval-handler.ts +1 -5
- package/src/tools/types.ts +4 -0
- package/src/usage/pricing.ts +1 -1
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/mcp-reload.ts +0 -18
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
2
1
|
import { emitFeedEvent } from "../home/emit-feed-event.js";
|
|
3
2
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
4
3
|
import { getConversation } from "../memory/conversation-crud.js";
|
|
@@ -12,40 +11,26 @@ import {
|
|
|
12
11
|
type WatcherNotifier,
|
|
13
12
|
} from "../watcher/engine.js";
|
|
14
13
|
import { hasSetConstructs } from "./recurrence-engine.js";
|
|
14
|
+
import { applyRetryDecision, decideRetry } from "./retry-policy.js";
|
|
15
15
|
import { runScript, type ScriptResult } from "./run-script.js";
|
|
16
16
|
import {
|
|
17
17
|
claimDueSchedules,
|
|
18
18
|
completeOneShot,
|
|
19
19
|
completeScheduleRun,
|
|
20
20
|
createScheduleRun,
|
|
21
|
-
failOneShot,
|
|
22
21
|
failOneShotPermanently,
|
|
23
22
|
getLastScheduleConversationId,
|
|
23
|
+
resetRetryCount,
|
|
24
24
|
retryOneShot,
|
|
25
25
|
type RoutingIntent,
|
|
26
|
+
type ScheduleJob,
|
|
27
|
+
scheduleRetry,
|
|
26
28
|
} from "./schedule-store.js";
|
|
27
29
|
|
|
28
30
|
const log = getLogger("scheduler");
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
taskRunId?: string;
|
|
33
|
-
/**
|
|
34
|
-
* Optional LLM call-site identifier propagated to the per-call provider
|
|
35
|
-
* config. Schedule and sequence callers will start passing their own call-site
|
|
36
|
-
* (e.g. for a future scheduled-agent profile) once PRs 7-11 migrate them off
|
|
37
|
-
* the default `mainAgent` route.
|
|
38
|
-
*/
|
|
39
|
-
callSite?: LLMCallSite;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type ScheduleMessageProcessor = (
|
|
43
|
-
conversationId: string,
|
|
44
|
-
message: string,
|
|
45
|
-
options?: ScheduleMessageOptions,
|
|
46
|
-
) => Promise<unknown>;
|
|
47
|
-
|
|
48
|
-
export type ScheduleNotifyModeNotifier = (payload: {
|
|
32
|
+
import type { ScheduleMessageProcessor } from "./scheduler-types.js";
|
|
33
|
+
type ScheduleNotifyModeNotifier = (payload: {
|
|
49
34
|
id: string;
|
|
50
35
|
label: string;
|
|
51
36
|
message: string;
|
|
@@ -53,7 +38,7 @@ export type ScheduleNotifyModeNotifier = (payload: {
|
|
|
53
38
|
routingHints: Record<string, unknown>;
|
|
54
39
|
}) => void | Promise<void>;
|
|
55
40
|
|
|
56
|
-
|
|
41
|
+
type ScheduleConversationCreatedNotifier = (info: {
|
|
57
42
|
conversationId: string;
|
|
58
43
|
scheduleJobId: string;
|
|
59
44
|
title: string;
|
|
@@ -73,6 +58,26 @@ const TICK_INTERVAL_MS = 15_000;
|
|
|
73
58
|
*/
|
|
74
59
|
const WAKE_MAX_RETRIES = 20;
|
|
75
60
|
|
|
61
|
+
function handleExecutionFailure(params: {
|
|
62
|
+
job: ScheduleJob;
|
|
63
|
+
errorMsg: string;
|
|
64
|
+
isOneShot: boolean;
|
|
65
|
+
}): void {
|
|
66
|
+
const decision = decideRetry(params.job);
|
|
67
|
+
applyRetryDecision({
|
|
68
|
+
job: params.job,
|
|
69
|
+
isOneShot: params.isOneShot,
|
|
70
|
+
errorMsg: params.errorMsg,
|
|
71
|
+
decision,
|
|
72
|
+
scheduleRetry,
|
|
73
|
+
failOneShotPermanently,
|
|
74
|
+
resetRetryCount,
|
|
75
|
+
emitAlert: (title, summary, dedupKey) =>
|
|
76
|
+
emitScheduleFeedEvent({ title, summary, dedupKey }),
|
|
77
|
+
log,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
76
81
|
export function startScheduler(
|
|
77
82
|
processMessage: ScheduleMessageProcessor,
|
|
78
83
|
notifyScheduleOneShot: ScheduleNotifyModeNotifier,
|
|
@@ -154,6 +159,8 @@ async function runScheduleOnce(
|
|
|
154
159
|
routingHints: job.routingHints,
|
|
155
160
|
});
|
|
156
161
|
if (isOneShot) {
|
|
162
|
+
const successRunId = createScheduleRun(job.id, `notify-ok:${job.id}`);
|
|
163
|
+
completeScheduleRun(successRunId, { status: "ok" });
|
|
157
164
|
completeOneShot(job.id);
|
|
158
165
|
emitScheduleFeedEvent({
|
|
159
166
|
title: job.name,
|
|
@@ -176,15 +183,10 @@ async function runScheduleOnce(
|
|
|
176
183
|
{ err, jobId: job.id, name: job.name, isOneShot },
|
|
177
184
|
"Schedule notification failed",
|
|
178
185
|
);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// occurrence isn't silently lost and lastStatus/retryCount update.
|
|
184
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
185
|
-
const runId = createScheduleRun(job.id, `notify-error:${job.id}`);
|
|
186
|
-
completeScheduleRun(runId, { status: "error", error: errorMsg });
|
|
187
|
-
}
|
|
186
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
187
|
+
const errorRunId = createScheduleRun(job.id, `notify-error:${job.id}`);
|
|
188
|
+
completeScheduleRun(errorRunId, { status: "error", error: errorMsg });
|
|
189
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
188
190
|
}
|
|
189
191
|
processed += 1;
|
|
190
192
|
continue;
|
|
@@ -222,7 +224,9 @@ async function runScheduleOnce(
|
|
|
222
224
|
}
|
|
223
225
|
if (isOneShot) completeOneShot(job.id);
|
|
224
226
|
} else {
|
|
225
|
-
|
|
227
|
+
const errorMsg =
|
|
228
|
+
result.stderr || "Script exited with non-zero status";
|
|
229
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
226
230
|
}
|
|
227
231
|
} catch (err) {
|
|
228
232
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
@@ -231,7 +235,7 @@ async function runScheduleOnce(
|
|
|
231
235
|
"Script schedule execution failed",
|
|
232
236
|
);
|
|
233
237
|
completeScheduleRun(runId, { status: "error", error: errorMsg });
|
|
234
|
-
|
|
238
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
235
239
|
}
|
|
236
240
|
processed += 1;
|
|
237
241
|
continue;
|
|
@@ -309,7 +313,11 @@ async function runScheduleOnce(
|
|
|
309
313
|
continue;
|
|
310
314
|
}
|
|
311
315
|
|
|
312
|
-
if (isOneShot)
|
|
316
|
+
if (isOneShot) {
|
|
317
|
+
const successRunId = createScheduleRun(job.id, `wake-ok:${job.id}`);
|
|
318
|
+
completeScheduleRun(successRunId, { status: "ok" });
|
|
319
|
+
completeOneShot(job.id);
|
|
320
|
+
}
|
|
313
321
|
if (!job.quiet) {
|
|
314
322
|
emitScheduleFeedEvent({
|
|
315
323
|
title: job.name,
|
|
@@ -322,7 +330,16 @@ async function runScheduleOnce(
|
|
|
322
330
|
{ err, jobId: job.id, name: job.name, wakeConversationId, isOneShot },
|
|
323
331
|
"Wake schedule execution failed",
|
|
324
332
|
);
|
|
325
|
-
|
|
333
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
334
|
+
const wakeErrorRunId = createScheduleRun(
|
|
335
|
+
job.id,
|
|
336
|
+
`wake-error:${job.id}`,
|
|
337
|
+
);
|
|
338
|
+
completeScheduleRun(wakeErrorRunId, {
|
|
339
|
+
status: "error",
|
|
340
|
+
error: errorMsg,
|
|
341
|
+
});
|
|
342
|
+
handleExecutionFailure({ job, errorMsg, isOneShot });
|
|
326
343
|
}
|
|
327
344
|
processed += 1;
|
|
328
345
|
continue;
|
|
@@ -380,7 +397,11 @@ async function runScheduleOnce(
|
|
|
380
397
|
status: "error",
|
|
381
398
|
error: result.error ?? "Task run failed",
|
|
382
399
|
});
|
|
383
|
-
|
|
400
|
+
handleExecutionFailure({
|
|
401
|
+
job,
|
|
402
|
+
errorMsg: result.error ?? "Task run failed",
|
|
403
|
+
isOneShot,
|
|
404
|
+
});
|
|
384
405
|
} else {
|
|
385
406
|
completeScheduleRun(runId, { status: "ok" });
|
|
386
407
|
if (!job.quiet) {
|
|
@@ -424,7 +445,11 @@ async function runScheduleOnce(
|
|
|
424
445
|
});
|
|
425
446
|
const runId = createScheduleRun(job.id, fallbackConversation.id);
|
|
426
447
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
427
|
-
|
|
448
|
+
handleExecutionFailure({
|
|
449
|
+
job,
|
|
450
|
+
errorMsg: message,
|
|
451
|
+
isOneShot,
|
|
452
|
+
});
|
|
428
453
|
}
|
|
429
454
|
continue;
|
|
430
455
|
}
|
|
@@ -507,7 +532,7 @@ async function runScheduleOnce(
|
|
|
507
532
|
: "Schedule execution failed",
|
|
508
533
|
);
|
|
509
534
|
completeScheduleRun(runId, { status: "error", error: message });
|
|
510
|
-
|
|
535
|
+
handleExecutionFailure({ job, errorMsg: message, isOneShot });
|
|
511
536
|
|
|
512
537
|
// Only skip invalidation when the conversation was *actually* reused,
|
|
513
538
|
// i.e. it contains prior successful context worth preserving. When
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
* back to the runtime code that initiated the OAuth handshake.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Sibling: `assistant/src/mcp/mcp-auth-state.ts`. The MCP auth state map sits
|
|
9
|
+
* one layer up from this registry — it tracks polling-visible status per
|
|
10
|
+
* MCP server, while this registry resolves the OAuth code-arrival promise
|
|
11
|
+
* keyed by OAuth `state`. The callback registry is shared by all
|
|
12
|
+
* gateway-transport OAuth flows (MCP and otherwise); the MCP state map is
|
|
13
|
+
* MCP-specific.
|
|
14
|
+
*/
|
|
7
15
|
interface PendingCallback {
|
|
8
16
|
resolve: (code: string) => void;
|
|
9
17
|
reject: (error: Error) => void;
|
|
@@ -15,7 +15,7 @@ import type { Sequence } from "./types.js";
|
|
|
15
15
|
|
|
16
16
|
// ── Event tracking ──────────────────────────────────────────────────
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
type SequenceEventType =
|
|
19
19
|
| "send"
|
|
20
20
|
| "reply"
|
|
21
21
|
| "complete"
|
|
@@ -24,7 +24,7 @@ export type SequenceEventType =
|
|
|
24
24
|
| "pause"
|
|
25
25
|
| "resume";
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
interface SequenceEvent {
|
|
28
28
|
id: string;
|
|
29
29
|
sequenceId: string;
|
|
30
30
|
enrollmentId: string;
|
|
@@ -74,7 +74,7 @@ function getRecentEvents(limit = 20): SequenceEvent[] {
|
|
|
74
74
|
|
|
75
75
|
// ── Metrics ─────────────────────────────────────────────────────────
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
interface SequenceMetrics {
|
|
78
78
|
sequenceId: string;
|
|
79
79
|
sequenceName: string;
|
|
80
80
|
status: string;
|
|
@@ -90,7 +90,7 @@ export interface SequenceMetrics {
|
|
|
90
90
|
avgTimeToReplyMs: number | null;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
interface StepMetrics {
|
|
94
94
|
stepIndex: number;
|
|
95
95
|
subject: string;
|
|
96
96
|
sends: number;
|
|
@@ -98,7 +98,7 @@ export interface StepMetrics {
|
|
|
98
98
|
dropOff: number;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
interface DashboardData {
|
|
102
102
|
summary: {
|
|
103
103
|
totalSequences: number;
|
|
104
104
|
activeSequences: number;
|
package/src/sequence/engine.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { emitFeedEvent } from "../home/emit-feed-event.js";
|
|
10
10
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
11
11
|
import { getMessages } from "../memory/conversation-crud.js";
|
|
12
|
-
import type { ScheduleMessageProcessor } from "../schedule/scheduler.js";
|
|
12
|
+
import type { ScheduleMessageProcessor } from "../schedule/scheduler-types.js";
|
|
13
13
|
import { getLogger } from "../util/logger.js";
|
|
14
14
|
import { recordEvent } from "./analytics.js";
|
|
15
15
|
import { checkAllPreSend, recordSend } from "./guardrails.js";
|
|
@@ -64,14 +64,8 @@ function classifyByName(name: string): boolean {
|
|
|
64
64
|
* depends on `catalog-cache.ts`, which would otherwise be reachable via
|
|
65
65
|
* the handler module.
|
|
66
66
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
name: string; // basename
|
|
70
|
-
size: number;
|
|
71
|
-
mimeType: string;
|
|
72
|
-
isBinary: boolean;
|
|
73
|
-
content: string | null; // inline text if ≤ 2 MB and text MIME, else null
|
|
74
|
-
}
|
|
67
|
+
import type { SkillFileEntry } from "./skill-file-types.js";
|
|
68
|
+
export type { SkillFileEntry } from "./skill-file-types.js";
|
|
75
69
|
|
|
76
70
|
// ─── Platform response contracts ─────────────────────────────────────────────
|
|
77
71
|
//
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SkillSummary } from "../config/skills.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
interface IncludeGraphResult {
|
|
4
4
|
/** Ordered list of all skill IDs visited during traversal (including the root). */
|
|
5
5
|
visited: string[];
|
|
6
6
|
}
|
|
@@ -37,12 +37,12 @@ export function getImmediateChildren(
|
|
|
37
37
|
return children;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
interface IncludeValidationSuccess {
|
|
41
41
|
ok: true;
|
|
42
42
|
visited: string[];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
interface IncludeValidationError {
|
|
46
46
|
ok: false;
|
|
47
47
|
error: "missing";
|
|
48
48
|
missingChildId: string;
|
|
@@ -50,13 +50,13 @@ export interface IncludeValidationError {
|
|
|
50
50
|
path: string[]; // full path from root to the parent that referenced the missing child
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
interface IncludeValidationCycleError {
|
|
54
54
|
ok: false;
|
|
55
55
|
error: "cycle";
|
|
56
56
|
cyclePath: string[]; // the IDs forming the cycle, e.g. ['a', 'b', 'c', 'a']
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
type IncludeValidationResult =
|
|
60
60
|
| IncludeValidationSuccess
|
|
61
61
|
| IncludeValidationError
|
|
62
62
|
| IncludeValidationCycleError;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
type RemoteSkillProvider = "clawhub" | "skillssh";
|
|
2
2
|
|
|
3
3
|
export type SkillsShRisk =
|
|
4
4
|
| "safe"
|
|
@@ -26,12 +26,12 @@ export interface RemoteSkillPolicy {
|
|
|
26
26
|
maxSkillsShRisk: SkillsShRiskThreshold;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
interface ClawhubModerationState {
|
|
30
30
|
isSuspicious?: boolean;
|
|
31
31
|
isMalwareBlocked?: boolean;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
interface SkillsShAuditState {
|
|
35
35
|
risk?: SkillsShRisk | null;
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -40,12 +40,12 @@ interface RemoteSkillCandidateBase {
|
|
|
40
40
|
slug: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
interface ClawhubRemoteSkillCandidate extends RemoteSkillCandidateBase {
|
|
44
44
|
provider: "clawhub";
|
|
45
45
|
moderation?: ClawhubModerationState | null;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
interface SkillsShRemoteSkillCandidate extends RemoteSkillCandidateBase {
|
|
49
49
|
provider: "skillssh";
|
|
50
50
|
audit?: SkillsShAuditState | null;
|
|
51
51
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SlimSkillResponse } from "../daemon/message-types/skills.js";
|
|
2
|
-
import type { SkillFileEntry } from "./
|
|
2
|
+
import type { SkillFileEntry } from "./skill-file-types.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A file provider can resolve file listings and single-file content for
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types extracted from catalog-files.ts to break the
|
|
3
|
+
* catalog-files ↔ skill-file-provider cycle.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface SkillFileEntry {
|
|
7
|
+
path: string; // relative to skill directory root (e.g. "SKILL.md", "tools/foo.ts")
|
|
8
|
+
name: string; // basename
|
|
9
|
+
size: number;
|
|
10
|
+
mimeType: string;
|
|
11
|
+
isBinary: boolean;
|
|
12
|
+
content: string | null; // inline text if ≤ 2 MB and text MIME, else null
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit types for SkillSSH partner security analysis.
|
|
3
|
+
*
|
|
4
|
+
* Extracted as a leaf module so daemon message types can reference
|
|
5
|
+
* PartnerAudit without pulling in the full skillssh-registry module
|
|
6
|
+
* (which transitively imports cli/program and the entire CLI graph).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type RiskLevel =
|
|
10
|
+
| "safe"
|
|
11
|
+
| "low"
|
|
12
|
+
| "medium"
|
|
13
|
+
| "high"
|
|
14
|
+
| "critical"
|
|
15
|
+
| "unknown";
|
|
16
|
+
|
|
17
|
+
export interface PartnerAudit {
|
|
18
|
+
risk: RiskLevel;
|
|
19
|
+
alerts?: number;
|
|
20
|
+
score?: number;
|
|
21
|
+
analyzedAt: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
|
|
25
|
+
export type SkillAuditData = Record<string, PartnerAudit>;
|
|
26
|
+
|
|
27
|
+
/** Map from skill slug to per-provider audit data */
|
|
28
|
+
export type AuditResponse = Record<string, SkillAuditData>;
|
|
@@ -6,6 +6,14 @@ import { dirname, join, resolve, sep } from "node:path";
|
|
|
6
6
|
import { getWorkspaceSkillsDir } from "../util/platform.js";
|
|
7
7
|
import { upsertSkillsIndex } from "./catalog-install.js";
|
|
8
8
|
import { computeSkillHash, writeInstallMeta } from "./install-meta.js";
|
|
9
|
+
import type {
|
|
10
|
+
AuditResponse,
|
|
11
|
+
PartnerAudit,
|
|
12
|
+
RiskLevel,
|
|
13
|
+
SkillAuditData,
|
|
14
|
+
} from "./skillssh-audit-types.js";
|
|
15
|
+
|
|
16
|
+
export type { AuditResponse, PartnerAudit, RiskLevel, SkillAuditData };
|
|
9
17
|
|
|
10
18
|
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
11
19
|
|
|
@@ -17,27 +25,6 @@ export interface SkillsShSearchResult {
|
|
|
17
25
|
source: string; // e.g. "vercel-labs/agent-skills"
|
|
18
26
|
}
|
|
19
27
|
|
|
20
|
-
export type RiskLevel =
|
|
21
|
-
| "safe"
|
|
22
|
-
| "low"
|
|
23
|
-
| "medium"
|
|
24
|
-
| "high"
|
|
25
|
-
| "critical"
|
|
26
|
-
| "unknown";
|
|
27
|
-
|
|
28
|
-
export interface PartnerAudit {
|
|
29
|
-
risk: RiskLevel;
|
|
30
|
-
alerts?: number;
|
|
31
|
-
score?: number;
|
|
32
|
-
analyzedAt: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
|
|
36
|
-
export type SkillAuditData = Record<string, PartnerAudit>;
|
|
37
|
-
|
|
38
|
-
/** Map from skill slug to per-provider audit data */
|
|
39
|
-
export type AuditResponse = Record<string, SkillAuditData>;
|
|
40
|
-
|
|
41
28
|
export interface ResolvedSkillSource {
|
|
42
29
|
owner: string;
|
|
43
30
|
repo: string;
|
package/src/telemetry/types.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface LlmUsageTelemetryEvent extends TelemetryEventBase {
|
|
|
21
21
|
llm_call_site: LLMCallSite | null;
|
|
22
22
|
inference_profile: string | null;
|
|
23
23
|
inference_profile_source: UsageAttributionProfileSource | null;
|
|
24
|
+
/** Computed estimated cost in USD for this LLM call. Null when pricing data is unavailable. */
|
|
25
|
+
cost: number | null;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
/** Turn event — one per user message. */
|
|
@@ -389,6 +389,7 @@ describe("UsageTelemetryReporter", () => {
|
|
|
389
389
|
expect(e.llm_call_site).toBe("compactionAgent");
|
|
390
390
|
expect(e.inference_profile).toBe("quality-optimized");
|
|
391
391
|
expect(e.inference_profile_source).toBe("conversation");
|
|
392
|
+
expect(e.cost).toBe(0.001);
|
|
392
393
|
expect(e.recorded_at).toBe(1700000099000);
|
|
393
394
|
});
|
|
394
395
|
|
|
@@ -419,6 +420,26 @@ describe("UsageTelemetryReporter", () => {
|
|
|
419
420
|
});
|
|
420
421
|
});
|
|
421
422
|
|
|
423
|
+
test("cost is null when estimatedCostUsd is null (unpriced event)", async () => {
|
|
424
|
+
const event = makeUsageEvent({
|
|
425
|
+
id: "evt-unpriced",
|
|
426
|
+
estimatedCostUsd: null,
|
|
427
|
+
pricingStatus: "unpriced",
|
|
428
|
+
});
|
|
429
|
+
mockQueryUnreportedUsageEvents.mockReturnValue([event]);
|
|
430
|
+
mockFetch.mockImplementation(() =>
|
|
431
|
+
Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
const reporter = new UsageTelemetryReporter();
|
|
435
|
+
await reporter.flush();
|
|
436
|
+
|
|
437
|
+
const body = JSON.parse(
|
|
438
|
+
(mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
|
|
439
|
+
);
|
|
440
|
+
expect(body.events[0].cost).toBeNull();
|
|
441
|
+
});
|
|
442
|
+
|
|
422
443
|
test("organization_id and user_id included in payload when available", async () => {
|
|
423
444
|
mockGetPlatformOrganizationId.mockReturnValue("org-123");
|
|
424
445
|
mockGetPlatformUserId.mockReturnValue("user-456");
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for app-control skill wrapper scripts.
|
|
3
|
+
*
|
|
4
|
+
* Each wrapper calls forwardAppControlProxyTool() to delegate execution to
|
|
5
|
+
* the proxy resolver, which forwards the call to the connected client.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Forward an app-control proxy tool call through the context's proxyToolResolver.
|
|
12
|
+
*
|
|
13
|
+
* Returns a clear error result if the resolver is missing (e.g. when the tool
|
|
14
|
+
* is invoked outside a session with a connected client).
|
|
15
|
+
*/
|
|
16
|
+
export function forwardAppControlProxyTool(
|
|
17
|
+
toolName: string,
|
|
18
|
+
input: Record<string, unknown>,
|
|
19
|
+
context: ToolContext,
|
|
20
|
+
): Promise<ToolExecutionResult> {
|
|
21
|
+
if (!context.proxyToolResolver) {
|
|
22
|
+
return Promise.resolve({
|
|
23
|
+
content: `Cannot execute ${toolName}: no proxy resolver available. This tool requires a connected client.`,
|
|
24
|
+
isError: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return context.proxyToolResolver(toolName, input);
|
|
28
|
+
}
|