@vellumai/assistant 0.7.1 → 0.7.3
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 +48 -50
- 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/memory.md +5 -2
- 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 +52 -5
- 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/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- 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 +1020 -40
- 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 +384 -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 +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- 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-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- 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-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- 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-error.test.ts +150 -3
- 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-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -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-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -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 +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- 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-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -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 +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -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 +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- 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__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- 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-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- 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__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- 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 +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- 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__/suggestion-routes.test.ts +46 -0
- 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-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- 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-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- 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/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- 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 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -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 +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- 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/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- 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 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- 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 +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- 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 +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -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 +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- 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/messages.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/profiler-run-store.ts +5 -5
- 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/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- 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/feed-scheduler.ts +18 -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/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- 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/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -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/admin.ts +5 -9
- 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 +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- 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 +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- 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/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- 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/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- 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/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -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/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- 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 +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- 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 +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- 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 +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- 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 +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- 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/guardian-reply-intercept.ts +3 -0
- 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 +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- 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/run-script.ts +37 -5
- 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 +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -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 +10 -16
- 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/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- 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/background-tool-registry.ts +17 -3
- 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.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- 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/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -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/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- 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/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- 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/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
package/src/cli/program.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { registerCredentialsCommand } from "./commands/credentials.js";
|
|
|
27
27
|
import { registerDefaultAction } from "./commands/default-action.js";
|
|
28
28
|
import { registerDomainCommand } from "./commands/domain.js";
|
|
29
29
|
import { registerEmailCommand } from "./commands/email.js";
|
|
30
|
+
import { registerGatewayCommand } from "./commands/gateway.js";
|
|
30
31
|
import { registerImageGenerationCommand } from "./commands/image-generation.js";
|
|
31
32
|
import { registerInferenceCommand } from "./commands/inference.js";
|
|
32
33
|
import { registerKeysCommand } from "./commands/keys.js";
|
|
@@ -40,6 +41,7 @@ import { registerPlatformCommand } from "./commands/platform/index.js";
|
|
|
40
41
|
import { registerRoutesCommand } from "./commands/routes.js";
|
|
41
42
|
import { registerSequenceCommand } from "./commands/sequence.js";
|
|
42
43
|
import { registerSkillsCommand } from "./commands/skills.js";
|
|
44
|
+
import { registerStatusCommand } from "./commands/status.js";
|
|
43
45
|
import { registerSttCommand } from "./commands/stt.js";
|
|
44
46
|
import { registerTaskCommand } from "./commands/task.js";
|
|
45
47
|
import { registerTrustCommand } from "./commands/trust.js";
|
|
@@ -55,7 +57,7 @@ import { log } from "./logger.js";
|
|
|
55
57
|
* the gateway so flag-gated commands are registered correctly.
|
|
56
58
|
*/
|
|
57
59
|
export async function buildCliProgram(): Promise<Command> {
|
|
58
|
-
await initFeatureFlagOverrides();
|
|
60
|
+
await initFeatureFlagOverrides({ retryBackoffsMs: [], callTimeoutMs: 200 });
|
|
59
61
|
const program = new Command();
|
|
60
62
|
|
|
61
63
|
program
|
|
@@ -96,6 +98,7 @@ Examples:
|
|
|
96
98
|
registerDomainCommand(program);
|
|
97
99
|
registerEmailCommand(program);
|
|
98
100
|
}
|
|
101
|
+
registerGatewayCommand(program);
|
|
99
102
|
registerImageGenerationCommand(program);
|
|
100
103
|
registerInferenceCommand(program);
|
|
101
104
|
registerKeysCommand(program);
|
|
@@ -108,6 +111,7 @@ Examples:
|
|
|
108
111
|
registerPlatformCommand(program);
|
|
109
112
|
registerRoutesCommand(program);
|
|
110
113
|
registerSequenceCommand(program);
|
|
114
|
+
registerStatusCommand(program);
|
|
111
115
|
registerSkillsCommand(program);
|
|
112
116
|
registerSttCommand(program);
|
|
113
117
|
registerTaskCommand(program);
|
|
@@ -124,7 +128,7 @@ Examples:
|
|
|
124
128
|
// remain available even without a workspace.
|
|
125
129
|
// Workspace-independent commands are exempt:
|
|
126
130
|
// completions — pure shell-script generation, no workspace files needed
|
|
127
|
-
const workspaceExemptCommands = new Set(["completions"]);
|
|
131
|
+
const workspaceExemptCommands = new Set(["completions", "status"]);
|
|
128
132
|
program.hook("preAction", (_thisCommand, actionCommand) => {
|
|
129
133
|
if (workspaceExemptCommands.has(actionCommand.name())) {
|
|
130
134
|
return;
|
|
@@ -17,8 +17,11 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
17
17
|
import { dirname, join } from "node:path";
|
|
18
18
|
|
|
19
19
|
import { ipcGetFeatureFlags } from "../ipc/gateway-client.js";
|
|
20
|
+
import { getLogger } from "../util/logger.js";
|
|
20
21
|
import type { AssistantConfig } from "./schema.js";
|
|
21
22
|
|
|
23
|
+
const log = getLogger("assistant-feature-flags");
|
|
24
|
+
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
23
26
|
// Types
|
|
24
27
|
// ---------------------------------------------------------------------------
|
|
@@ -132,14 +135,30 @@ let cachedOverridesFromGateway = false;
|
|
|
132
135
|
* timeout, parse error). No auth needed — the IPC socket is
|
|
133
136
|
* access-controlled by file-system permissions on the shared volume.
|
|
134
137
|
*/
|
|
135
|
-
async function fetchOverridesFromGateway(
|
|
138
|
+
async function fetchOverridesFromGateway(
|
|
139
|
+
timeoutMs?: number,
|
|
140
|
+
): Promise<Record<string, boolean>> {
|
|
136
141
|
try {
|
|
137
|
-
return await ipcGetFeatureFlags();
|
|
142
|
+
return await ipcGetFeatureFlags(timeoutMs);
|
|
138
143
|
} catch {
|
|
139
144
|
return {};
|
|
140
145
|
}
|
|
141
146
|
}
|
|
142
147
|
|
|
148
|
+
/**
|
|
149
|
+
* Default backoff schedule (ms) between `initFeatureFlagOverrides` retries
|
|
150
|
+
* when the gateway IPC fetch returns empty. The daemon and gateway start
|
|
151
|
+
* as sibling child processes of the macOS app, so the daemon can race
|
|
152
|
+
* ahead of the gateway binding `gateway.sock`. Each delay is the
|
|
153
|
+
* *additional* wait before the next attempt, so total worst-case latency
|
|
154
|
+
* is the sum: 250 + 500 + 1000 + 2000 + 4000 = 7.75s. All retries run in
|
|
155
|
+
* the background (lifecycle.ts fires `initFeatureFlagOverrides`
|
|
156
|
+
* non-blocking), so this never delays startup.
|
|
157
|
+
*/
|
|
158
|
+
const DEFAULT_INIT_RETRY_BACKOFFS_MS: readonly number[] = [
|
|
159
|
+
250, 500, 1000, 2000, 4000,
|
|
160
|
+
];
|
|
161
|
+
|
|
143
162
|
/**
|
|
144
163
|
* Pre-populate the override cache from the gateway (async).
|
|
145
164
|
*
|
|
@@ -148,26 +167,74 @@ async function fetchOverridesFromGateway(): Promise<Record<string, boolean>> {
|
|
|
148
167
|
* uses the gateway. In local mode, falls back to the local file when
|
|
149
168
|
* the gateway is unreachable.
|
|
150
169
|
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
170
|
+
* Retries the gateway IPC fetch on empty/failed results — the gateway
|
|
171
|
+
* may not have bound its IPC socket yet when the daemon races ahead at
|
|
172
|
+
* startup. After exhausting retries, the cache is left unset so
|
|
173
|
+
* subsequent sync calls return an empty override map (registry defaults
|
|
174
|
+
* only).
|
|
175
|
+
*
|
|
176
|
+
* Pass `retryBackoffsMs: []` to disable retries (used by unit tests that
|
|
177
|
+
* intentionally simulate an unreachable gateway and want immediate
|
|
178
|
+
* fallback without waiting through the production schedule).
|
|
153
179
|
*
|
|
154
180
|
* No-ops when the cache is already populated — callers that want to
|
|
155
181
|
* refresh must call `clearFeatureFlagOverridesCache()` first. This lets
|
|
156
182
|
* tests preseed flag state via `_setOverridesForTesting()` without the
|
|
157
183
|
* gateway IPC call clobbering their setup.
|
|
158
184
|
*/
|
|
159
|
-
export async function initFeatureFlagOverrides(
|
|
185
|
+
export async function initFeatureFlagOverrides(options?: {
|
|
186
|
+
retryBackoffsMs?: readonly number[];
|
|
187
|
+
/**
|
|
188
|
+
* Timeout (ms) for each IPC call to the gateway. When omitted the
|
|
189
|
+
* transport defaults apply (3 s connect + 5 s call). CLI callers should
|
|
190
|
+
* pass a small value (e.g. 200) so a slow/absent gateway fails fast
|
|
191
|
+
* instead of blocking startup.
|
|
192
|
+
*/
|
|
193
|
+
callTimeoutMs?: number;
|
|
194
|
+
}): Promise<void> {
|
|
160
195
|
if (cachedOverridesFromGateway) return;
|
|
161
196
|
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
197
|
+
const backoffs = options?.retryBackoffsMs ?? DEFAULT_INIT_RETRY_BACKOFFS_MS;
|
|
198
|
+
const callTimeoutMs = options?.callTimeoutMs;
|
|
199
|
+
|
|
200
|
+
// First attempt has no preceding delay; subsequent attempts wait per the
|
|
201
|
+
// backoff schedule. An empty result is treated as a transient miss
|
|
202
|
+
// (gateway not yet bound) and triggers a retry — a healthy gateway
|
|
203
|
+
// always returns at least the registry-merged flags.
|
|
204
|
+
for (let attempt = 0; attempt <= backoffs.length; attempt++) {
|
|
205
|
+
if (attempt > 0) {
|
|
206
|
+
const delay = backoffs[attempt - 1]!;
|
|
207
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
208
|
+
// Re-check after the wait: a concurrent caller (e.g. a test using
|
|
209
|
+
// `_setOverridesForTesting`) may have populated the cache while we
|
|
210
|
+
// were sleeping. Bail out so we don't clobber their setup.
|
|
211
|
+
if (cachedOverridesFromGateway) return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const gatewayOverrides = await fetchOverridesFromGateway(callTimeoutMs);
|
|
215
|
+
if (Object.keys(gatewayOverrides).length > 0) {
|
|
216
|
+
cachedOverrides = gatewayOverrides;
|
|
217
|
+
cachedOverridesFromGateway = true;
|
|
218
|
+
if (attempt > 0) {
|
|
219
|
+
log.info(
|
|
220
|
+
{ attempt: attempt + 1 },
|
|
221
|
+
"Feature flag overrides loaded from gateway after retry",
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
167
226
|
}
|
|
168
227
|
|
|
169
|
-
//
|
|
170
|
-
//
|
|
228
|
+
// Exhausted retries — leave cache unset so loadOverrides() returns an
|
|
229
|
+
// empty map on subsequent sync reads. Flag checks fall through to the
|
|
230
|
+
// registry default (`defaultEnabled`), which biases toward off for
|
|
231
|
+
// newer assistant-scope flags.
|
|
232
|
+
if (backoffs.length > 0) {
|
|
233
|
+
log.warn(
|
|
234
|
+
{ attempts: backoffs.length + 1 },
|
|
235
|
+
"Feature flag overrides empty after all retries; falling back to registry defaults",
|
|
236
|
+
);
|
|
237
|
+
}
|
|
171
238
|
}
|
|
172
239
|
|
|
173
240
|
/**
|
|
@@ -6,6 +6,12 @@ metadata:
|
|
|
6
6
|
emoji: "🔗"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "ACP"
|
|
9
|
+
activation-hints:
|
|
10
|
+
- "User wants to delegate a coding task to Claude Code, Codex, or another ACP agent"
|
|
11
|
+
- "User wants to spawn an external coding agent that runs autonomously and streams results back"
|
|
12
|
+
- "User mentions ACP, claude-agent-acp, codex-acp, or running multiple coding agents in parallel"
|
|
13
|
+
avoid-when:
|
|
14
|
+
- "Task is small enough to do inline with the assistant's own tools — no need for an external agent"
|
|
9
15
|
---
|
|
10
16
|
|
|
11
17
|
ACP agent orchestration - spawn external coding agents (Claude Code, Codex, etc.) to work on tasks via the Agent Client Protocol. Each agent runs as its own subprocess speaking ACP over stdio and streams results back into the conversation.
|
|
@@ -20,10 +20,6 @@
|
|
|
20
20
|
"cwd": {
|
|
21
21
|
"type": "string",
|
|
22
22
|
"description": "Working directory for the agent. This determines where the agent runs and where its session is stored. Set this to the project/repo root the user wants the agent to work in. Defaults to current conversation's working directory."
|
|
23
|
-
},
|
|
24
|
-
"activity": {
|
|
25
|
-
"type": "string",
|
|
26
|
-
"description": "Brief explanation of why this tool is being called"
|
|
27
23
|
}
|
|
28
24
|
},
|
|
29
25
|
"required": ["task"]
|
|
@@ -42,10 +38,6 @@
|
|
|
42
38
|
"acp_session_id": {
|
|
43
39
|
"type": "string",
|
|
44
40
|
"description": "Optional ACP session ID to query. If omitted, returns all ACP sessions."
|
|
45
|
-
},
|
|
46
|
-
"activity": {
|
|
47
|
-
"type": "string",
|
|
48
|
-
"description": "Brief explanation of why this tool is being called"
|
|
49
41
|
}
|
|
50
42
|
},
|
|
51
43
|
"required": []
|
|
@@ -64,10 +56,6 @@
|
|
|
64
56
|
"acp_session_id": {
|
|
65
57
|
"type": "string",
|
|
66
58
|
"description": "The ID of the ACP session to abort."
|
|
67
|
-
},
|
|
68
|
-
"activity": {
|
|
69
|
-
"type": "string",
|
|
70
|
-
"description": "Brief explanation of why this tool is being called"
|
|
71
59
|
}
|
|
72
60
|
},
|
|
73
61
|
"required": ["acp_session_id"]
|
|
@@ -90,10 +78,6 @@
|
|
|
90
78
|
"instruction": {
|
|
91
79
|
"type": "string",
|
|
92
80
|
"description": "The new instruction that replaces the in-flight prompt."
|
|
93
|
-
},
|
|
94
|
-
"activity": {
|
|
95
|
-
"type": "string",
|
|
96
|
-
"description": "Brief explanation of why this tool is being called"
|
|
97
81
|
}
|
|
98
82
|
},
|
|
99
83
|
"required": ["acp_session_id", "instruction"]
|
|
@@ -108,12 +92,7 @@
|
|
|
108
92
|
"risk": "low",
|
|
109
93
|
"input_schema": {
|
|
110
94
|
"type": "object",
|
|
111
|
-
"properties": {
|
|
112
|
-
"activity": {
|
|
113
|
-
"type": "string",
|
|
114
|
-
"description": "Brief explanation of why this tool is being called"
|
|
115
|
-
}
|
|
116
|
-
},
|
|
95
|
+
"properties": {},
|
|
117
96
|
"required": []
|
|
118
97
|
},
|
|
119
98
|
"executor": "tools/acp-list-agents.ts",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: app-builder
|
|
3
|
-
description: Build interactive apps, dashboards, calculators, games, trackers, tools, landing pages, and data visualizations with
|
|
3
|
+
description: Build interactive apps, dashboards, calculators, games, trackers, tools, landing pages, and data visualizations with Preact/TypeScript/CSS
|
|
4
4
|
compatibility: "Designed for Vellum personal assistants"
|
|
5
5
|
metadata:
|
|
6
6
|
emoji: "🏗️"
|
|
@@ -30,11 +30,11 @@ Apps live under `{workspaceDir}/data/apps/`. Each app has a slug-based layout:
|
|
|
30
30
|
{workspaceDir}/data/apps/
|
|
31
31
|
<slug>.json # App metadata
|
|
32
32
|
<slug>/ # App directory (contains all app files)
|
|
33
|
-
index.html #
|
|
34
|
-
pages/ #
|
|
33
|
+
index.html # Legacy single-file entry point (do not create for new apps)
|
|
34
|
+
pages/ # Legacy additional pages (do not create for new apps)
|
|
35
35
|
records/ # Data records (one JSON file per record)
|
|
36
|
-
src/ # Source files (
|
|
37
|
-
dist/ # Compiled output (
|
|
36
|
+
src/ # Source files (multi-file TSX apps, formatVersion: 2)
|
|
37
|
+
dist/ # Compiled output (multi-file TSX apps)
|
|
38
38
|
<slug>.preview # Preview image (auto-generated)
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -42,7 +42,7 @@ Apps live under `{workspaceDir}/data/apps/`. Each app has a slug-based layout:
|
|
|
42
42
|
|
|
43
43
|
Fields: `id`, `name`, `description`, `icon`, `schemaJson`, `createdAt`, `updatedAt`, `formatVersion`, `dirName`.
|
|
44
44
|
|
|
45
|
-
**Important:** `htmlDefinition` and `pages`
|
|
45
|
+
**Important:** Legacy `htmlDefinition` and `pages` content is NOT stored in the metadata JSON — it lives as separate files inside the app directory (`index.html` and `pages/`). Do not create new single-file apps or new `pages/` directories.
|
|
46
46
|
|
|
47
47
|
### Records
|
|
48
48
|
|
|
@@ -52,9 +52,9 @@ Each record is a JSON file at `<slug>/records/<uuid>.json` with shape:
|
|
|
52
52
|
{ "id": "<uuid>", "appId": "<app-id>", "data": { ... }, "createdAt": "...", "updatedAt": "..." }
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
###
|
|
55
|
+
### Multi-file TSX Apps
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
All new apps use `formatVersion: 2`: source files live under `src/` and compiled output lives under `dist/`. The build system compiles TSX to JS automatically when `app_refresh` is called.
|
|
58
58
|
|
|
59
59
|
## Workflow
|
|
60
60
|
|
|
@@ -69,16 +69,7 @@ For `formatVersion: 2` apps, source files live under `src/` and compiled output
|
|
|
69
69
|
|
|
70
70
|
**Make creative decisions on behalf of the user.** They want to be delighted, not consulted. Pick the accent color. Choose between a dark moody aesthetic or a light airy one. Decide if cards should have glassmorphism or layered shadows. Add a background pattern or gradient. These are YOUR decisions as the designer.
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
**Prefer multi-file TSX projects** for any non-trivial app. They give you component reuse, TypeScript safety, and cleaner organization. Fall back to single-file HTML only for the simplest one-off pages.
|
|
75
|
-
|
|
76
|
-
<!-- feature:app-builder-multifile:end -->
|
|
77
|
-
<!-- feature:app-builder-multifile:alt -->
|
|
78
|
-
|
|
79
|
-
**Always build single-file HTML apps.** Write a complete, self-contained HTML document with all CSS in `<style>` and all JavaScript in `<script>`. Do not use multi-file projects or TSX.
|
|
80
|
-
|
|
81
|
-
<!-- feature:app-builder-multifile:alt:end -->
|
|
72
|
+
**Build all new apps as multi-file TSX projects.** They give you component reuse, TypeScript safety, and cleaner organization.
|
|
82
73
|
|
|
83
74
|
**Only ask questions when the request is genuinely ambiguous** - e.g., "build me an app" with no indication of what kind. Even then, prefer building something impressive based on context clues over asking a battery of questions.
|
|
84
75
|
|
|
@@ -124,11 +115,9 @@ Example schema for a project tracker:
|
|
|
124
115
|
|
|
125
116
|
Apps are rendered inside a sandboxed WebView on macOS.
|
|
126
117
|
|
|
127
|
-
<!-- feature:app-builder-multifile:start -->
|
|
128
|
-
|
|
129
118
|
#### Multi-file TSX projects
|
|
130
119
|
|
|
131
|
-
Build apps as multi-file TSX projects. You get component reuse, TypeScript type-checking, and clean file organization. The build system uses esbuild to bundle everything automatically.
|
|
120
|
+
Build apps as multi-file TSX projects. You get component reuse, TypeScript type-checking, and clean file organization. The build system uses esbuild to bundle everything automatically. Do not create root-level `index.html` files or `pages/` directories for new apps.
|
|
132
121
|
|
|
133
122
|
**Project structure:**
|
|
134
123
|
|
|
@@ -190,7 +179,7 @@ useEffect(() => {
|
|
|
190
179
|
}, []);
|
|
191
180
|
```
|
|
192
181
|
|
|
193
|
-
**File workflow:**
|
|
182
|
+
**File workflow:** Call `app_create` first to create the app record and scaffold, use `file_write` for each source file under `src/`, then call `app_refresh` once to compile and refresh the UI.
|
|
194
183
|
|
|
195
184
|
**Allowed third-party packages:** `date-fns`, `chart.js`, `lodash-es`, `zod`, `clsx`, `lucide`. Import them directly - esbuild resolves them at build time. No CDN imports. Note: `lucide` is the vanilla JS icon library (not `lucide-react`). Use its `createElement` or `createIcons` API, or manually inline SVG - do not import JSX icon components.
|
|
196
185
|
|
|
@@ -262,23 +251,6 @@ app_refresh(app_id)
|
|
|
262
251
|
- No external fonts, images, or resources - use system fonts and CSS/SVG for visuals
|
|
263
252
|
- Design responsively. Apps render at fluid, user-resizable widths — avoid fixed-pixel layouts
|
|
264
253
|
- The WebView blocks all navigation - links and form `action` attributes won't work
|
|
265
|
-
<!-- feature:app-builder-multifile:end -->
|
|
266
|
-
|
|
267
|
-
<!-- feature:app-builder-multifile:alt -->
|
|
268
|
-
|
|
269
|
-
#### Single HTML file
|
|
270
|
-
|
|
271
|
-
Write a complete, self-contained HTML document.
|
|
272
|
-
|
|
273
|
-
**Technical constraints (single-file):**
|
|
274
|
-
|
|
275
|
-
- Single HTML string - no external files, CDNs, or imports
|
|
276
|
-
- All CSS in `<style>` in `<head>`, all JavaScript in `<script>` before `</body>`
|
|
277
|
-
- No external fonts, images, or resources - use system fonts and CSS/SVG for visuals
|
|
278
|
-
- Design responsively. Apps render at fluid, user-resizable widths — avoid fixed-pixel layouts
|
|
279
|
-
- The WebView blocks all navigation - links and form `action` attributes won't work
|
|
280
|
-
|
|
281
|
-
<!-- feature:app-builder-multifile:alt:end -->
|
|
282
254
|
|
|
283
255
|
#### Injected design system
|
|
284
256
|
|
|
@@ -352,88 +324,21 @@ For handler conventions, examples, key rules, and frontend usage patterns, see *
|
|
|
352
324
|
|
|
353
325
|
`localStorage` and `sessionStorage` are available for ephemeral UI state (filters, view modes, collapsed state, preferences, form drafts). Use custom routes for persistent app records, `localStorage` for UI preferences.
|
|
354
326
|
|
|
355
|
-
<!-- feature:app-builder-multifile:alt -->
|
|
356
|
-
|
|
357
|
-
#### JavaScript patterns
|
|
358
|
-
|
|
359
|
-
Initialize apps with clean state management:
|
|
360
|
-
|
|
361
|
-
```javascript
|
|
362
|
-
document.addEventListener("DOMContentLoaded", async () => {
|
|
363
|
-
await loadRecords();
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
let allRecords = [];
|
|
367
|
-
|
|
368
|
-
async function loadRecords() {
|
|
369
|
-
try {
|
|
370
|
-
const res = await window.vellum.fetch("/v1/x/records");
|
|
371
|
-
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
372
|
-
allRecords = await res.json();
|
|
373
|
-
render();
|
|
374
|
-
} catch (err) {
|
|
375
|
-
console.error("Failed to load:", err);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
function render() {
|
|
380
|
-
// Re-render UI from allRecords
|
|
381
|
-
}
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
**HTML escaping:** Always escape user-controlled data before inserting into the DOM via `innerHTML`:
|
|
385
|
-
|
|
386
|
-
```javascript
|
|
387
|
-
function esc(s) {
|
|
388
|
-
const d = document.createElement("div");
|
|
389
|
-
d.textContent = String(s);
|
|
390
|
-
return d.innerHTML;
|
|
391
|
-
}
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
### 4. Single-Page App Views
|
|
395
|
-
|
|
396
|
-
Apps run inside a sandboxed WebView that blocks all navigation. All apps are effectively single-page. When an app needs multiple views, use JavaScript to swap content:
|
|
397
|
-
|
|
398
|
-
```javascript
|
|
399
|
-
function showView(name) {
|
|
400
|
-
document.querySelectorAll(".view").forEach((v) => (v.hidden = true));
|
|
401
|
-
document.getElementById("view-" + name).hidden = false;
|
|
402
|
-
document
|
|
403
|
-
.querySelectorAll(".nav-link")
|
|
404
|
-
.forEach((btn) => btn.classList.remove("active"));
|
|
405
|
-
document
|
|
406
|
-
.querySelector(`[onclick="showView('${name}')"]`)
|
|
407
|
-
?.classList.add("active");
|
|
408
|
-
}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
<!-- feature:app-builder-multifile:alt:end -->
|
|
412
|
-
|
|
413
|
-
<!-- feature:app-builder-multifile:start -->
|
|
414
327
|
### 4. Create and Open the App
|
|
415
|
-
<!-- feature:app-builder-multifile:end -->
|
|
416
|
-
<!-- feature:app-builder-multifile:alt -->
|
|
417
|
-
### 5. Create and Open the App
|
|
418
|
-
<!-- feature:app-builder-multifile:alt:end -->
|
|
419
328
|
|
|
420
329
|
Call `app_create` with:
|
|
421
330
|
|
|
422
331
|
- `name`: Short descriptive name
|
|
423
332
|
- `description`: One-sentence summary
|
|
424
333
|
- `schema_json`: JSON schema as string
|
|
425
|
-
- `html`: (optional) Complete HTML document as string for `index.html`. If omitted, a minimal scaffold is created - you can then write `index.html` and other files via `file_write`.
|
|
426
334
|
- `auto_open`: (optional, defaults to `true`) Shows an inline preview card in chat
|
|
427
335
|
- `preview`: Always include - `title` (required), `subtitle`, `description`, `icon` (image URL preferred, emoji fallback), `metrics` (up to 3 key-value pills)
|
|
428
336
|
|
|
337
|
+
Do not pass `html` or `pages` to `app_create`; those single-file shortcuts are retired. After `app_create` returns the app ID, write the real app source under `src/` and call `app_refresh`.
|
|
338
|
+
|
|
429
339
|
The app is NOT opened in a workspace panel automatically - users open it via the 'Open App' button on the inline card.
|
|
430
340
|
|
|
431
|
-
<!-- feature:app-builder-multifile:start -->
|
|
432
341
|
### 5. Handle Iteration
|
|
433
|
-
<!-- feature:app-builder-multifile:end -->
|
|
434
|
-
<!-- feature:app-builder-multifile:alt -->
|
|
435
|
-
### 6. Handle Iteration
|
|
436
|
-
<!-- feature:app-builder-multifile:alt:end -->
|
|
437
342
|
|
|
438
343
|
When the user requests changes, prefer **`file_edit`** over rewriting the entire file.
|
|
439
344
|
|
|
@@ -444,7 +349,7 @@ When the user requests changes, prefer **`file_edit`** over rewriting the entire
|
|
|
444
349
|
|
|
445
350
|
After making all file changes, call `app_refresh(app_id)` once to compile and refresh the UI. Do NOT call it after every individual file edit — batch your changes first.
|
|
446
351
|
|
|
447
|
-
Apps
|
|
352
|
+
Apps should have multiple source files under `src/` (`styles.css`, components, helpers, etc.). Import CSS and modules from TSX so esbuild includes them in the compiled output.
|
|
448
353
|
|
|
449
354
|
## Interaction Standards
|
|
450
355
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"tools": [
|
|
4
4
|
{
|
|
5
5
|
"name": "app_create",
|
|
6
|
-
"description": "Create a persistent app with a name, optional description, JSON schema,
|
|
6
|
+
"description": "Create a persistent multi-file TSX app scaffold with a name, optional description, and JSON schema. Write source files under src/ with file tools, then call app_refresh.",
|
|
7
7
|
"category": "apps",
|
|
8
8
|
"risk": "low",
|
|
9
9
|
"input_schema": {
|
|
@@ -21,17 +21,6 @@
|
|
|
21
21
|
"type": "string",
|
|
22
22
|
"description": "JSON schema defining the app data structure"
|
|
23
23
|
},
|
|
24
|
-
"html": {
|
|
25
|
-
"type": "string",
|
|
26
|
-
"description": "Optional HTML definition for the main index.html page. If omitted, a minimal scaffold is created and you can write index.html later via file_write."
|
|
27
|
-
},
|
|
28
|
-
"pages": {
|
|
29
|
-
"type": "object",
|
|
30
|
-
"description": "Optional additional pages as a mapping of filename to HTML content (e.g. {\"settings.html\": \"<html>...</html>\"}). Navigate between pages with <a href=\"settings.html\">. Do not include index.html here \u2014 use the html parameter instead.",
|
|
31
|
-
"additionalProperties": {
|
|
32
|
-
"type": "string"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
24
|
"auto_open": {
|
|
36
25
|
"type": "boolean",
|
|
37
26
|
"description": "When true (default), an inline preview card is shown in chat after creation. The app is NOT automatically opened in a workspace panel \u2014 users can open it explicitly via the 'Open App' button on the inline card."
|
|
@@ -78,10 +67,6 @@
|
|
|
78
67
|
"change_summary": {
|
|
79
68
|
"type": "string",
|
|
80
69
|
"description": "Short summary of what changed, using git conventional commit format (e.g. 'feat: add coin flip app', 'fix: correct button alignment'). Used as the version history entry."
|
|
81
|
-
},
|
|
82
|
-
"activity": {
|
|
83
|
-
"type": "string",
|
|
84
|
-
"description": "Brief non-technical explanation of why this tool is being called"
|
|
85
70
|
}
|
|
86
71
|
},
|
|
87
72
|
"required": ["name"]
|
|
@@ -104,10 +89,6 @@
|
|
|
104
89
|
"change_summary": {
|
|
105
90
|
"type": "string",
|
|
106
91
|
"description": "Short summary of what changed, using git conventional commit format (e.g. 'chore: delete unused app'). Used as the version history entry."
|
|
107
|
-
},
|
|
108
|
-
"activity": {
|
|
109
|
-
"type": "string",
|
|
110
|
-
"description": "Brief non-technical explanation of why this tool is being called"
|
|
111
92
|
}
|
|
112
93
|
},
|
|
113
94
|
"required": ["app_id"]
|
|
@@ -130,10 +111,6 @@
|
|
|
130
111
|
"change_summary": {
|
|
131
112
|
"type": "string",
|
|
132
113
|
"description": "Short summary of what changed, using git conventional commit format (e.g. 'feat: add dark mode toggle', 'fix: form validation'). Used as the version history entry."
|
|
133
|
-
},
|
|
134
|
-
"activity": {
|
|
135
|
-
"type": "string",
|
|
136
|
-
"description": "Brief non-technical explanation of why this tool is being called"
|
|
137
114
|
}
|
|
138
115
|
},
|
|
139
116
|
"required": ["app_id"]
|
|
@@ -160,10 +137,6 @@
|
|
|
160
137
|
"change_summary": {
|
|
161
138
|
"type": "string",
|
|
162
139
|
"description": "Short summary of what changed, using git conventional commit format (e.g. 'feat: generate app icon'). Used as the version history entry."
|
|
163
|
-
},
|
|
164
|
-
"activity": {
|
|
165
|
-
"type": "string",
|
|
166
|
-
"description": "Brief non-technical explanation of why this tool is being called"
|
|
167
140
|
}
|
|
168
141
|
},
|
|
169
142
|
"required": ["app_id"]
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { isAssistantFeatureFlagEnabled } from "../../../../config/assistant-feature-flags.js";
|
|
2
|
-
import { getConfig } from "../../../../config/loader.js";
|
|
3
1
|
import { setAppCommitMessage } from "../../../../memory/app-git-service.js";
|
|
4
2
|
import * as appStore from "../../../../memory/app-store.js";
|
|
5
3
|
import type { AppCreateInput } from "../../../../tools/apps/executors.js";
|
|
@@ -16,13 +14,6 @@ export async function run(
|
|
|
16
14
|
if (typeof input.change_summary === "string" && input.change_summary.trim()) {
|
|
17
15
|
setAppCommitMessage(context.conversationId, input.change_summary.trim());
|
|
18
16
|
}
|
|
19
|
-
const
|
|
20
|
-
"app-builder-multifile",
|
|
21
|
-
getConfig(),
|
|
22
|
-
);
|
|
23
|
-
const createInput: AppCreateInput = {
|
|
24
|
-
...(input as unknown as AppCreateInput),
|
|
25
|
-
featureFlags: { multifileEnabled },
|
|
26
|
-
};
|
|
17
|
+
const createInput: AppCreateInput = input as unknown as AppCreateInput;
|
|
27
18
|
return executeAppCreate(createInput, appStore, context.proxyToolResolver);
|
|
28
19
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-control
|
|
3
|
+
description: Drive a specific named macOS app via raw input bypassing the Accessibility tree
|
|
4
|
+
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
+
metadata:
|
|
6
|
+
emoji: "🎯"
|
|
7
|
+
vellum:
|
|
8
|
+
display-name: "App Control"
|
|
9
|
+
feature-flag: "app-control"
|
|
10
|
+
activation-hints:
|
|
11
|
+
- "User explicitly directs the assistant to drive a specific named app via raw input (emulator, game, OpenGL canvas, custom-rendered Electron app)"
|
|
12
|
+
- "User says the macOS Accessibility tree is unhelpful or empty for the target app"
|
|
13
|
+
avoid-when:
|
|
14
|
+
- "Task can be done via the computer-use skill (general macOS UI navigation)"
|
|
15
|
+
- "Task can be done via a CLI / API alternative"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
This skill exposes the `app_control_*` proxy tools for driving a single
|
|
19
|
+
named macOS application via raw input — keyboard, mouse, screenshot — that
|
|
20
|
+
bypasses the system Accessibility tree. Use it only when explicitly directed
|
|
21
|
+
to a specific app where the AX tree is unhelpful (emulators, games, OpenGL
|
|
22
|
+
canvases, custom-rendered Electron apps). For general macOS UI navigation
|
|
23
|
+
prefer the `computer-use` skill.
|
|
24
|
+
|
|
25
|
+
Tools in this skill are proxy tools — execution is forwarded to the connected
|
|
26
|
+
macOS client, never handled locally by the assistant.
|
|
27
|
+
|
|
28
|
+
## Cadence
|
|
29
|
+
|
|
30
|
+
Take 2-3 actions per turn, then yield with a short narration so the user can
|
|
31
|
+
interject. Do not chain long sequences without surfacing what you are doing.
|
|
32
|
+
|
|
33
|
+
## Always observe before acting
|
|
34
|
+
|
|
35
|
+
Call `app_control_observe` before your first input action whenever the screen
|
|
36
|
+
state matters (e.g. you need to know what is on screen, where a UI element is,
|
|
37
|
+
or whether the app is even running). Re-observe after actions that may have
|
|
38
|
+
moved the window or changed visibility.
|
|
39
|
+
|
|
40
|
+
`observe` waits a short settle delay (default ~200ms) before capturing so the
|
|
41
|
+
target app and the WindowServer can flush pending input and composite a fresh
|
|
42
|
+
frame. If the captured screenshot looks one input behind the latest state
|
|
43
|
+
(common with emulators or other slow-feedback apps), pass a larger
|
|
44
|
+
`settle_ms`. For static UIs where you just want a quick snapshot, pass
|
|
45
|
+
`settle_ms: 0` to skip the wait.
|
|
46
|
+
|
|
47
|
+
## Input choice
|
|
48
|
+
|
|
49
|
+
- Prefer `app_control_sequence` over multiple back-to-back `app_control_press`
|
|
50
|
+
calls when sending an ordered batch of presses (e.g. menu navigation,
|
|
51
|
+
repeated movement). Sequence runs in a single round-trip — the target app is
|
|
52
|
+
activated once at the start and the keys are sent serially without any
|
|
53
|
+
window for keyboard focus to drift to another app between presses. Each step
|
|
54
|
+
may carry its own `duration_ms` (hold) and `gap_ms` (pause after).
|
|
55
|
+
- Prefer `app_control_combo` over rapid sequential `app_control_press` for
|
|
56
|
+
simultaneous inputs (e.g. cmd+shift+4). `combo` holds every key at once;
|
|
57
|
+
sequential presses interleave key-down and key-up events.
|
|
58
|
+
- Use `app_control_type` for literal text into a focused field.
|
|
59
|
+
|
|
60
|
+
## Coordinate caveat
|
|
61
|
+
|
|
62
|
+
`app_control_click` and `app_control_drag` use **window-relative** coordinates.
|
|
63
|
+
The window may move or resize between observation and click — if you are
|
|
64
|
+
uncertain whether the window has shifted, re-observe first.
|
|
65
|
+
|
|
66
|
+
## App targeting
|
|
67
|
+
|
|
68
|
+
Use bundle IDs (e.g. `com.example.app`) when possible — they are the most
|
|
69
|
+
reliable identifier. Fall back to localized process names if a bundle ID is
|
|
70
|
+
unavailable.
|
|
71
|
+
|
|
72
|
+
## Ending the session
|
|
73
|
+
|
|
74
|
+
Call `app_control_stop` when you are done. Do **not** auto-quit the controlled
|
|
75
|
+
app — `stop` only ends the app-control session, leaving the app running.
|