@vellumai/assistant 0.4.48 → 0.4.50

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.
Files changed (423) hide show
  1. package/ARCHITECTURE.md +26 -35
  2. package/README.md +5 -26
  3. package/docs/architecture/integrations.md +45 -41
  4. package/docs/architecture/keychain-broker.md +3 -3
  5. package/docs/architecture/memory.md +180 -119
  6. package/docs/runbook-trusted-contacts.md +3 -8
  7. package/hook-templates/debug-prompt-logger/hook.json +1 -1
  8. package/hook-templates/debug-prompt-logger/run.sh +1 -3
  9. package/package.json +2 -2
  10. package/src/__tests__/actor-token-service.test.ts +0 -1
  11. package/src/__tests__/agent-loop.test.ts +3 -1
  12. package/src/__tests__/anthropic-provider.test.ts +249 -2
  13. package/src/__tests__/approval-cascade.test.ts +796 -0
  14. package/src/__tests__/approval-primitive.test.ts +0 -1
  15. package/src/__tests__/approval-routes-http.test.ts +4 -0
  16. package/src/__tests__/assistant-attachments.test.ts +12 -34
  17. package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
  18. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
  19. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
  20. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  21. package/src/__tests__/canonical-guardian-store.test.ts +95 -0
  22. package/src/__tests__/channel-guardian.test.ts +0 -2
  23. package/src/__tests__/channel-readiness-routes.test.ts +15 -6
  24. package/src/__tests__/channel-readiness-service.test.ts +10 -9
  25. package/src/__tests__/checker.test.ts +13 -20
  26. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
  27. package/src/__tests__/computer-use-tools.test.ts +2 -19
  28. package/src/__tests__/config-schema.test.ts +1 -68
  29. package/src/__tests__/config-watcher.test.ts +0 -1
  30. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  31. package/src/__tests__/context-image-dimensions.test.ts +332 -0
  32. package/src/__tests__/context-memory-e2e.test.ts +11 -100
  33. package/src/__tests__/context-token-estimator.test.ts +196 -13
  34. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  35. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  36. package/src/__tests__/conversation-routes-guardian-reply.test.ts +152 -0
  37. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
  38. package/src/__tests__/credential-metadata-store.test.ts +64 -73
  39. package/src/__tests__/credential-security-e2e.test.ts +1 -0
  40. package/src/__tests__/credential-security-invariants.test.ts +13 -7
  41. package/src/__tests__/credential-vault-unit.test.ts +284 -49
  42. package/src/__tests__/credential-vault.test.ts +150 -16
  43. package/src/__tests__/credentials-cli.test.ts +71 -0
  44. package/src/__tests__/cu-unified-flow.test.ts +532 -0
  45. package/src/__tests__/date-context.test.ts +93 -77
  46. package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
  47. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  48. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  49. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  50. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  51. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  52. package/src/__tests__/guardian-routing-invariants.test.ts +93 -1
  53. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  54. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
  55. package/src/__tests__/heartbeat-service.test.ts +0 -1
  56. package/src/__tests__/history-repair.test.ts +245 -0
  57. package/src/__tests__/host-cu-proxy.test.ts +791 -0
  58. package/src/__tests__/host-shell-tool.test.ts +27 -15
  59. package/src/__tests__/http-user-message-parity.test.ts +2 -0
  60. package/src/__tests__/ingress-url-consistency.test.ts +14 -21
  61. package/src/__tests__/integration-status.test.ts +32 -51
  62. package/src/__tests__/intent-routing.test.ts +0 -1
  63. package/src/__tests__/invite-redemption-service.test.ts +65 -1
  64. package/src/__tests__/invite-routes-http.test.ts +10 -9
  65. package/src/__tests__/keychain-broker-client.test.ts +14 -46
  66. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
  67. package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
  68. package/src/__tests__/memory-recall-quality.test.ts +244 -407
  69. package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
  70. package/src/__tests__/memory-regressions.test.ts +477 -2841
  71. package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
  72. package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
  73. package/src/__tests__/mime-builder.test.ts +28 -0
  74. package/src/__tests__/native-web-search.test.ts +1 -0
  75. package/src/__tests__/notification-routing-intent.test.ts +0 -1
  76. package/src/__tests__/oauth-cli.test.ts +941 -15
  77. package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
  78. package/src/__tests__/oauth-scope-policy.test.ts +4 -6
  79. package/src/__tests__/oauth-store.test.ts +870 -0
  80. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  81. package/src/__tests__/provider-error-scenarios.test.ts +0 -1
  82. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
  83. package/src/__tests__/public-ingress-urls.test.ts +15 -21
  84. package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
  85. package/src/__tests__/recording-handler.test.ts +3 -4
  86. package/src/__tests__/registry.test.ts +2 -3
  87. package/src/__tests__/relay-server.test.ts +46 -1
  88. package/src/__tests__/runtime-events-sse.test.ts +55 -7
  89. package/src/__tests__/schedule-store.test.ts +0 -1
  90. package/src/__tests__/schedule-tools.test.ts +32 -0
  91. package/src/__tests__/scheduler-recurrence.test.ts +0 -1
  92. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  93. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  94. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  95. package/src/__tests__/secret-ingress-handler.test.ts +0 -1
  96. package/src/__tests__/secret-onetime-send.test.ts +1 -0
  97. package/src/__tests__/secure-keys.test.ts +7 -2
  98. package/src/__tests__/send-endpoint-busy.test.ts +24 -6
  99. package/src/__tests__/sequence-store.test.ts +0 -1
  100. package/src/__tests__/session-abort-tool-results.test.ts +1 -14
  101. package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
  102. package/src/__tests__/session-agent-loop.test.ts +19 -15
  103. package/src/__tests__/session-confirmation-signals.test.ts +1 -15
  104. package/src/__tests__/session-error.test.ts +124 -2
  105. package/src/__tests__/session-history-web-search.test.ts +918 -0
  106. package/src/__tests__/session-init.benchmark.test.ts +4 -5
  107. package/src/__tests__/session-pre-run-repair.test.ts +1 -14
  108. package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
  109. package/src/__tests__/session-queue.test.ts +37 -27
  110. package/src/__tests__/session-runtime-assembly.test.ts +54 -0
  111. package/src/__tests__/session-slash-known.test.ts +1 -15
  112. package/src/__tests__/session-slash-queue.test.ts +1 -15
  113. package/src/__tests__/session-slash-unknown.test.ts +1 -15
  114. package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
  115. package/src/__tests__/session-workspace-injection.test.ts +3 -37
  116. package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
  117. package/src/__tests__/skill-include-graph.test.ts +66 -0
  118. package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
  119. package/src/__tests__/skill-load-tool.test.ts +149 -1
  120. package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
  121. package/src/__tests__/skills-install-extract.test.ts +93 -0
  122. package/src/__tests__/skills-uninstall.test.ts +1 -1
  123. package/src/__tests__/skills.test.ts +3 -3
  124. package/src/__tests__/skillssh-registry.test.ts +451 -0
  125. package/src/__tests__/slack-channel-config.test.ts +67 -3
  126. package/src/__tests__/slack-share-routes.test.ts +17 -19
  127. package/src/__tests__/system-prompt.test.ts +0 -1
  128. package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
  129. package/src/__tests__/terminal-tools.test.ts +4 -3
  130. package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
  131. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  132. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  133. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  134. package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
  135. package/src/__tests__/tool-executor.test.ts +0 -1
  136. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  137. package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
  138. package/src/__tests__/trust-store.test.ts +7 -13
  139. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  140. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  141. package/src/__tests__/twilio-routes.test.ts +0 -16
  142. package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
  143. package/src/__tests__/voice-invite-redemption.test.ts +32 -1
  144. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  145. package/src/agent/ax-tree-compaction.test.ts +286 -0
  146. package/src/agent/loop.ts +104 -131
  147. package/src/approvals/AGENTS.md +1 -1
  148. package/src/approvals/guardian-request-resolvers.ts +14 -2
  149. package/src/bundler/compiler-tools.ts +66 -2
  150. package/src/calls/call-domain.ts +133 -6
  151. package/src/calls/call-store.ts +6 -0
  152. package/src/calls/relay-server.ts +52 -18
  153. package/src/calls/relay-setup-router.ts +17 -1
  154. package/src/calls/twilio-config.ts +3 -8
  155. package/src/calls/twilio-routes.ts +1 -2
  156. package/src/calls/types.ts +3 -1
  157. package/src/calls/voice-ingress-preflight.ts +1 -1
  158. package/src/cli/commands/browser-relay.ts +18 -12
  159. package/src/cli/commands/completions.ts +0 -3
  160. package/src/cli/commands/credentials.ts +101 -15
  161. package/src/cli/commands/doctor.ts +4 -3
  162. package/src/cli/commands/mcp.ts +46 -59
  163. package/src/cli/commands/memory.ts +16 -165
  164. package/src/cli/commands/oauth/apps.ts +284 -0
  165. package/src/cli/commands/oauth/connections.ts +633 -0
  166. package/src/cli/commands/oauth/index.ts +52 -0
  167. package/src/cli/commands/oauth/providers.ts +256 -0
  168. package/src/cli/commands/sessions.ts +5 -2
  169. package/src/cli/commands/skills.ts +177 -339
  170. package/src/cli/http-client.ts +0 -20
  171. package/src/cli/main-screen.tsx +2 -2
  172. package/src/cli/program.ts +6 -11
  173. package/src/cli/reference.ts +1 -3
  174. package/src/cli.ts +4 -10
  175. package/src/config/assistant-feature-flags.ts +0 -3
  176. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  177. package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
  178. package/src/config/bundled-skills/computer-use/TOOLS.json +23 -5
  179. package/src/config/bundled-skills/computer-use/tools/{computer-use-request-control.ts → computer-use-observe.ts} +1 -5
  180. package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
  181. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
  182. package/src/config/bundled-skills/settings/SKILL.md +1 -1
  183. package/src/config/bundled-skills/settings/TOOLS.json +2 -8
  184. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
  185. package/src/config/bundled-tool-registry.ts +2 -5
  186. package/src/config/env-registry.ts +14 -83
  187. package/src/config/env.ts +11 -50
  188. package/src/config/feature-flag-registry.json +16 -16
  189. package/src/config/loader.ts +0 -6
  190. package/src/config/schema.ts +4 -13
  191. package/src/config/schemas/memory-lifecycle.ts +0 -9
  192. package/src/config/schemas/memory-processing.ts +0 -180
  193. package/src/config/schemas/memory-retrieval.ts +32 -104
  194. package/src/config/schemas/memory.ts +0 -10
  195. package/src/config/skills.ts +21 -2
  196. package/src/config/types.ts +0 -4
  197. package/src/context/image-dimensions.ts +229 -0
  198. package/src/context/token-estimator.ts +75 -12
  199. package/src/context/window-manager.ts +53 -11
  200. package/src/daemon/assistant-attachments.ts +1 -13
  201. package/src/daemon/config-watcher.ts +61 -3
  202. package/src/daemon/daemon-control.ts +1 -1
  203. package/src/daemon/date-context.ts +114 -31
  204. package/src/daemon/handlers/config-ingress.ts +8 -33
  205. package/src/daemon/handlers/config-slack-channel.ts +49 -46
  206. package/src/daemon/handlers/config-telegram.ts +32 -16
  207. package/src/daemon/handlers/sessions.ts +27 -36
  208. package/src/daemon/handlers/shared.ts +0 -130
  209. package/src/daemon/handlers/skills.ts +20 -1
  210. package/src/daemon/history-repair.ts +72 -8
  211. package/src/daemon/host-cu-proxy.ts +430 -0
  212. package/src/daemon/lifecycle.ts +67 -71
  213. package/src/daemon/mcp-reload-service.ts +2 -2
  214. package/src/daemon/message-protocol.ts +3 -0
  215. package/src/daemon/message-types/computer-use.ts +1 -129
  216. package/src/daemon/message-types/host-cu.ts +19 -0
  217. package/src/daemon/message-types/memory.ts +4 -16
  218. package/src/daemon/message-types/messages.ts +4 -0
  219. package/src/daemon/message-types/sessions.ts +4 -0
  220. package/src/daemon/server.ts +25 -21
  221. package/src/daemon/session-agent-loop-handlers.ts +40 -0
  222. package/src/daemon/session-agent-loop.ts +334 -48
  223. package/src/daemon/session-attachments.ts +1 -2
  224. package/src/daemon/session-error.ts +89 -6
  225. package/src/daemon/session-history.ts +17 -7
  226. package/src/daemon/session-media-retry.ts +6 -2
  227. package/src/daemon/session-memory.ts +69 -149
  228. package/src/daemon/session-process.ts +10 -1
  229. package/src/daemon/session-runtime-assembly.ts +49 -19
  230. package/src/daemon/session-slash.ts +1 -1
  231. package/src/daemon/session-surfaces.ts +43 -28
  232. package/src/daemon/session-tool-setup.ts +9 -10
  233. package/src/daemon/session.ts +150 -17
  234. package/src/daemon/tool-side-effects.ts +2 -8
  235. package/src/daemon/watch-handler.ts +2 -2
  236. package/src/events/tool-metrics-listener.ts +2 -2
  237. package/src/hooks/manager.ts +1 -4
  238. package/src/inbound/public-ingress-urls.ts +7 -7
  239. package/src/instrument.ts +61 -1
  240. package/src/logfire.ts +16 -5
  241. package/src/memory/admin.ts +2 -191
  242. package/src/memory/canonical-guardian-store.ts +38 -2
  243. package/src/memory/conversation-crud.ts +0 -33
  244. package/src/memory/conversation-key-store.ts +21 -0
  245. package/src/memory/conversation-queries.ts +22 -3
  246. package/src/memory/db-init.ts +32 -0
  247. package/src/memory/embedding-backend.ts +84 -8
  248. package/src/memory/embedding-types.ts +9 -1
  249. package/src/memory/indexer.ts +7 -46
  250. package/src/memory/items-extractor.ts +274 -76
  251. package/src/memory/job-handlers/backfill.ts +2 -127
  252. package/src/memory/job-handlers/cleanup.ts +2 -16
  253. package/src/memory/job-handlers/extraction.ts +2 -138
  254. package/src/memory/job-handlers/index-maintenance.ts +1 -6
  255. package/src/memory/job-handlers/summarization.ts +3 -148
  256. package/src/memory/job-utils.ts +21 -59
  257. package/src/memory/jobs-store.ts +1 -159
  258. package/src/memory/jobs-worker.ts +9 -52
  259. package/src/memory/migrations/104-core-indexes.ts +3 -3
  260. package/src/memory/migrations/149-oauth-tables.ts +62 -0
  261. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
  262. package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
  263. package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
  264. package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
  265. package/src/memory/migrations/154-drop-fts.ts +20 -0
  266. package/src/memory/migrations/155-drop-conflicts.ts +7 -0
  267. package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
  268. package/src/memory/migrations/index.ts +8 -0
  269. package/src/memory/qdrant-client.ts +148 -51
  270. package/src/memory/raw-query.ts +1 -1
  271. package/src/memory/retriever.test.ts +294 -273
  272. package/src/memory/retriever.ts +421 -645
  273. package/src/memory/schema/calls.ts +2 -0
  274. package/src/memory/schema/index.ts +1 -0
  275. package/src/memory/schema/memory-core.ts +3 -48
  276. package/src/memory/schema/oauth.ts +67 -0
  277. package/src/memory/search/formatting.ts +263 -176
  278. package/src/memory/search/lexical.ts +1 -254
  279. package/src/memory/search/ranking.ts +0 -455
  280. package/src/memory/search/semantic.ts +100 -14
  281. package/src/memory/search/staleness.ts +47 -0
  282. package/src/memory/search/tier-classifier.ts +21 -0
  283. package/src/memory/search/types.ts +15 -77
  284. package/src/memory/task-memory-cleanup.ts +4 -6
  285. package/src/messaging/provider.ts +4 -4
  286. package/src/messaging/providers/gmail/client.ts +82 -2
  287. package/src/messaging/providers/gmail/mime-builder.ts +17 -7
  288. package/src/messaging/providers/gmail/people-client.ts +10 -10
  289. package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
  290. package/src/messaging/providers/whatsapp/adapter.ts +11 -8
  291. package/src/messaging/registry.ts +2 -32
  292. package/src/notifications/copy-composer.ts +0 -5
  293. package/src/notifications/signal.ts +4 -5
  294. package/src/oauth/byo-connection.test.ts +133 -25
  295. package/src/oauth/byo-connection.ts +22 -6
  296. package/src/oauth/connect-orchestrator.ts +113 -57
  297. package/src/oauth/connect-types.ts +17 -23
  298. package/src/oauth/connection-resolver.ts +35 -11
  299. package/src/oauth/connection.ts +1 -1
  300. package/src/oauth/manual-token-connection.ts +104 -0
  301. package/src/oauth/oauth-store.ts +582 -0
  302. package/src/oauth/platform-connection.test.ts +29 -0
  303. package/src/oauth/platform-connection.ts +6 -5
  304. package/src/oauth/provider-behaviors.ts +124 -0
  305. package/src/oauth/scope-policy.ts +9 -2
  306. package/src/oauth/seed-providers.ts +167 -0
  307. package/src/oauth/token-persistence.ts +81 -77
  308. package/src/permissions/checker.ts +3 -3
  309. package/src/permissions/defaults.ts +1 -1
  310. package/src/permissions/prompter.ts +10 -1
  311. package/src/permissions/trust-store.ts +36 -1
  312. package/src/playbooks/playbook-compiler.ts +1 -1
  313. package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
  314. package/src/prompts/system-prompt.ts +46 -42
  315. package/src/providers/anthropic/client.ts +59 -20
  316. package/src/providers/retry.ts +1 -27
  317. package/src/providers/types.ts +7 -1
  318. package/src/runtime/AGENTS.md +9 -0
  319. package/src/runtime/auth/route-policy.ts +6 -6
  320. package/src/runtime/channel-reply-delivery.ts +0 -40
  321. package/src/runtime/gateway-client.ts +0 -7
  322. package/src/runtime/guardian-reply-router.ts +24 -22
  323. package/src/runtime/http-server.ts +10 -8
  324. package/src/runtime/http-types.ts +2 -2
  325. package/src/runtime/invite-redemption-service.ts +19 -1
  326. package/src/runtime/invite-service.ts +25 -0
  327. package/src/runtime/middleware/twilio-validation.ts +1 -11
  328. package/src/runtime/pending-interactions.ts +14 -12
  329. package/src/runtime/routes/brain-graph-routes.ts +10 -90
  330. package/src/runtime/routes/channel-delivery-routes.ts +0 -1
  331. package/src/runtime/routes/conversation-routes.ts +81 -19
  332. package/src/runtime/routes/events-routes.ts +21 -11
  333. package/src/runtime/routes/host-cu-routes.ts +97 -0
  334. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
  335. package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
  336. package/src/runtime/routes/integrations/slack/share.ts +6 -7
  337. package/src/runtime/routes/log-export-routes.ts +126 -8
  338. package/src/runtime/routes/memory-item-routes.test.ts +754 -0
  339. package/src/runtime/routes/memory-item-routes.ts +503 -0
  340. package/src/runtime/routes/session-management-routes.ts +3 -3
  341. package/src/runtime/routes/settings-routes.ts +55 -48
  342. package/src/runtime/routes/surface-action-routes.ts +1 -1
  343. package/src/runtime/routes/trust-rules-routes.ts +14 -0
  344. package/src/runtime/routes/watch-routes.ts +128 -0
  345. package/src/runtime/routes/workspace-routes.ts +2 -1
  346. package/src/schedule/integration-status.ts +10 -9
  347. package/src/security/credential-key.ts +0 -156
  348. package/src/security/keychain-broker-client.ts +22 -10
  349. package/src/security/oauth2.ts +1 -1
  350. package/src/security/secure-keys.ts +25 -3
  351. package/src/security/token-manager.ts +137 -64
  352. package/src/skills/catalog-install.ts +414 -0
  353. package/src/skills/include-graph.ts +32 -0
  354. package/src/skills/skillssh-registry.ts +503 -0
  355. package/src/telegram/bot-username.ts +2 -3
  356. package/src/tools/assets/search.ts +5 -1
  357. package/src/tools/browser/network-recorder.ts +1 -1
  358. package/src/tools/browser/network-recording-types.ts +1 -1
  359. package/src/tools/computer-use/definitions.ts +36 -11
  360. package/src/tools/computer-use/registry.ts +5 -6
  361. package/src/tools/credentials/broker.ts +1 -2
  362. package/src/tools/credentials/metadata-store.ts +17 -121
  363. package/src/tools/credentials/vault.ts +92 -167
  364. package/src/tools/memory/definitions.ts +4 -13
  365. package/src/tools/memory/handlers.test.ts +83 -103
  366. package/src/tools/memory/handlers.ts +50 -85
  367. package/src/tools/registry.ts +2 -7
  368. package/src/tools/schedule/create.ts +8 -1
  369. package/src/tools/schedule/update.ts +8 -1
  370. package/src/tools/skills/load.ts +85 -3
  371. package/src/tools/watch/watch-state.ts +0 -12
  372. package/src/util/logger.ts +7 -41
  373. package/src/util/platform.ts +9 -28
  374. package/src/watcher/providers/google-calendar.ts +2 -1
  375. package/src/__tests__/clarification-resolver.test.ts +0 -193
  376. package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
  377. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
  378. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
  379. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
  380. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
  381. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
  382. package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
  383. package/src/__tests__/conflict-policy.test.ts +0 -269
  384. package/src/__tests__/conflict-store.test.ts +0 -372
  385. package/src/__tests__/contradiction-checker.test.ts +0 -361
  386. package/src/__tests__/entity-extractor.test.ts +0 -211
  387. package/src/__tests__/entity-search.test.ts +0 -1117
  388. package/src/__tests__/profile-compiler.test.ts +0 -392
  389. package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
  390. package/src/__tests__/session-conflict-gate.test.ts +0 -1228
  391. package/src/__tests__/session-profile-injection.test.ts +0 -557
  392. package/src/cli/commands/dev.ts +0 -129
  393. package/src/cli/commands/map.ts +0 -391
  394. package/src/cli/commands/oauth.ts +0 -77
  395. package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
  396. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
  397. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
  398. package/src/daemon/computer-use-session.ts +0 -1026
  399. package/src/daemon/ride-shotgun-handler.ts +0 -569
  400. package/src/daemon/session-conflict-gate.ts +0 -167
  401. package/src/daemon/session-dynamic-profile.ts +0 -77
  402. package/src/memory/clarification-resolver.ts +0 -417
  403. package/src/memory/conflict-intent.ts +0 -205
  404. package/src/memory/conflict-policy.ts +0 -127
  405. package/src/memory/conflict-store.ts +0 -410
  406. package/src/memory/contradiction-checker.ts +0 -508
  407. package/src/memory/entity-extractor.ts +0 -535
  408. package/src/memory/format-recall.ts +0 -47
  409. package/src/memory/fts-reconciler.ts +0 -165
  410. package/src/memory/job-handlers/conflict.ts +0 -200
  411. package/src/memory/profile-compiler.ts +0 -195
  412. package/src/memory/recall-cache.ts +0 -117
  413. package/src/memory/search/entity.ts +0 -535
  414. package/src/memory/search/query-expansion.test.ts +0 -70
  415. package/src/memory/search/query-expansion.ts +0 -118
  416. package/src/oauth/provider-base-urls.ts +0 -21
  417. package/src/oauth/provider-profiles.ts +0 -192
  418. package/src/prompts/computer-use-prompt.ts +0 -98
  419. package/src/runtime/routes/computer-use-routes.ts +0 -641
  420. package/src/runtime/routes/mcp-routes.ts +0 -20
  421. package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
  422. package/src/runtime/telegram-streaming-delivery.ts +0 -393
  423. package/src/tools/computer-use/request-computer-control.ts +0 -56
package/src/cli.ts CHANGED
@@ -3,7 +3,7 @@ import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
3
3
  import { dirname } from "node:path";
4
4
  import * as readline from "node:readline";
5
5
 
6
- import { httpHealthCheck, httpSend, readHttpToken } from "./cli/http-client.js";
6
+ import { httpSend } from "./cli/http-client.js";
7
7
  import {
8
8
  type MainScreenLayout,
9
9
  renderMainScreen,
@@ -11,6 +11,7 @@ import {
11
11
  updateStatusText,
12
12
  } from "./cli/main-screen.jsx";
13
13
  import { shouldAutoStartDaemon } from "./daemon/connection-policy.js";
14
+ import { isHttpHealthy } from "./daemon/daemon-control.js";
14
15
  import { ensureDaemonRunning } from "./daemon/lifecycle.js";
15
16
  import type {
16
17
  ConfirmationRequest,
@@ -637,7 +638,7 @@ export async function startCli(): Promise<void> {
637
638
  case "memory_recalled":
638
639
  spinner.stop();
639
640
  process.stdout.write(
640
- `\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens | lexical ${msg.lexicalHits} | semantic ${msg.semanticHits} | recency ${msg.recencyHits} | entity ${msg.entityHits} | merged ${msg.mergedCount} → selected ${msg.selectedCount}${msg.rerankApplied ? " (reranked)" : ""} | ${msg.provider}/${msg.model} | ${msg.latencyMs}ms]\x1B[0m\n`,
641
+ `\n\x1B[2m[Memory recalled: ${msg.injectedTokens} tokens | t1 ${msg.tier1Count} t2 ${msg.tier2Count} | semantic ${msg.semanticHits} | recency ${msg.recencyHits} | merged ${msg.mergedCount} → selected ${msg.selectedCount}${msg.sparseVectorUsed ? " (sparse)" : ""} | hybrid ${msg.hybridSearchLatencyMs}ms | ${msg.provider}/${msg.model} | ${msg.latencyMs}ms]\x1B[0m\n`,
641
642
  );
642
643
  spinner.start("Thinking...");
643
644
  break;
@@ -885,17 +886,10 @@ export async function startCli(): Promise<void> {
885
886
 
886
887
  /** Connect the SSE event stream for the current conversation. */
887
888
  async function connectSse(): Promise<void> {
888
- const token = readHttpToken();
889
889
  const controller = new AbortController();
890
890
  sseAbortController = controller;
891
891
 
892
892
  const url = `/v1/events?conversationKey=${encodeURIComponent(conversationKey)}`;
893
- const headers: Record<string, string> = {
894
- Accept: "text/event-stream",
895
- };
896
- if (token) {
897
- headers["Authorization"] = `Bearer ${token}`;
898
- }
899
893
 
900
894
  try {
901
895
  const response = await httpSend(url, {
@@ -1010,7 +1004,7 @@ export async function startCli(): Promise<void> {
1010
1004
  try {
1011
1005
  if (shouldAutoStartDaemon()) await ensureDaemonRunning();
1012
1006
  // Verify the daemon is healthy before attempting SSE
1013
- const healthy = await httpHealthCheck(2000);
1007
+ const healthy = await isHttpHealthy();
1014
1008
  if (!healthy) throw new Error("Health check failed");
1015
1009
  await connectSse();
1016
1010
  reconnectDelay = RECONNECT_BASE_DELAY_MS;
@@ -42,10 +42,7 @@ function loadDefaultsRegistry(): FeatureFlagDefaultsRegistry {
42
42
  if (cachedDefaults) return cachedDefaults;
43
43
 
44
44
  const thisDir = import.meta.dirname ?? __dirname;
45
- const envPath = process.env.FEATURE_FLAG_DEFAULTS_PATH?.trim();
46
45
  const candidates = [
47
- // Explicit override (primarily for tests / controlled environments)
48
- ...(envPath ? [envPath] : []),
49
46
  // Bundled: co-located copy in the same directory as this source file.
50
47
  // Works in Docker / packaged builds where the repo-root `meta/` dir
51
48
  // is not available.
@@ -6,7 +6,7 @@ For account and auth workflows, prefer documented `assistant` CLI commands over
6
6
  any generic account registry:
7
7
 
8
8
  - `assistant credentials ...` for stored secrets and credential metadata
9
- - `assistant oauth token <service>` for OAuth-backed integrations
9
+ - `assistant oauth connections token <provider-key>` for OAuth-backed integrations
10
10
  - `assistant mcp auth <name>` when an MCP server needs browser login
11
11
  - `assistant platform status` for platform-linked deployment/auth context
12
12
 
@@ -10,13 +10,10 @@ metadata:
10
10
  disable-model-invocation: true
11
11
  ---
12
12
 
13
- This skill provides the 12 computer*use*\* action tools for controlling
14
- the macOS desktop (used by CU sessions).
13
+ This skill provides the computer_use_* action tools for controlling
14
+ the macOS desktop. CU tools run through the main agent loop via HostCuProxy.
15
15
 
16
- The `computer_use_request_control` escalation tool is registered in the core
17
- registry (not this skill) so text_qa sessions can execute it directly.
18
-
19
- The skill is internally preactivated for computer-use sessions.
16
+ The skill is internally preactivated for sessions with a connected desktop client.
20
17
 
21
18
  Tools in this skill are proxy tools — execution is forwarded to the connected
22
19
  macOS client, never handled locally by the assistant.
@@ -1,9 +1,27 @@
1
1
  {
2
2
  "version": 1,
3
3
  "tools": [
4
+ {
5
+ "name": "computer_use_observe",
6
+ "description": "Capture the current screen state. Returns the accessibility tree with [ID] element references and optionally a screenshot.\n\nThe accessibility tree shows interactive elements like [3] AXButton 'Save' or [17] AXTextField 'Search'. Use element_id to target these elements in subsequent actions — this is much more reliable than pixel coordinates.\n\nCall this before your first computer use action, or to check screen state without acting.",
7
+ "category": "computer-use",
8
+ "risk": "low",
9
+ "input_schema": {
10
+ "type": "object",
11
+ "properties": {
12
+ "reason": {
13
+ "type": "string",
14
+ "description": "Brief non-technical explanation of why this tool is being called"
15
+ }
16
+ },
17
+ "required": ["reason"]
18
+ },
19
+ "executor": "tools/computer-use-observe.ts",
20
+ "execution_target": "host"
21
+ },
4
22
  {
5
23
  "name": "computer_use_click",
6
- "description": "Click on a UI element by its [ID] from the accessibility tree, or at raw screen coordinates as fallback. Supports single click, double-click, and right-click via the click_type parameter.",
24
+ "description": "Click an element on screen. Prefer element_id (from the accessibility tree) over x/y coordinates.",
7
25
  "category": "computer-use",
8
26
  "risk": "low",
9
27
  "input_schema": {
@@ -42,7 +60,7 @@
42
60
  },
43
61
  {
44
62
  "name": "computer_use_type_text",
45
- "description": "Type text at the current cursor position. The target field must already be focused (click it first).",
63
+ "description": "Type text at the current cursor position. First click a text field (by element_id) to focus it, then call this tool. If a field shows 'FOCUSED', skip the click.",
46
64
  "category": "computer-use",
47
65
  "risk": "low",
48
66
  "input_schema": {
@@ -235,7 +253,7 @@
235
253
  },
236
254
  {
237
255
  "name": "computer_use_run_applescript",
238
- "description": "Execute an AppleScript to control applications via Apple's scripting bridge. Use this for operations that are more reliable through scripting than UI interaction: setting a browser URL directly, navigating Finder to a path, querying app state (tab count, window titles, document status), or clicking deeply nested menu items. The script's return value (if any) will be reported back. NEVER use \"do shell script\" \u2014 it is blocked for security. Keep scripts short and targeted to a single operation.",
256
+ "description": "Run an AppleScript command. Prefer this over click/type when possible \u2014 it doesn't move the cursor or interrupt the user. Never use 'do shell script' inside AppleScript (blocked for security).",
239
257
  "category": "computer-use",
240
258
  "risk": "low",
241
259
  "input_schema": {
@@ -261,7 +279,7 @@
261
279
  },
262
280
  {
263
281
  "name": "computer_use_done",
264
- "description": "Task is complete",
282
+ "description": "Signal that the computer use task is complete. Provide a summary of what was accomplished. This ends the computer use session.",
265
283
  "category": "computer-use",
266
284
  "risk": "low",
267
285
  "input_schema": {
@@ -283,7 +301,7 @@
283
301
  },
284
302
  {
285
303
  "name": "computer_use_respond",
286
- "description": "Respond directly to the user with a text answer. Use this when the user is asking a question (about their schedule, meetings, calendar, etc.) rather than asking you to control the computer.",
304
+ "description": "Respond to the user with a text answer instead of performing computer actions. Use this when you can answer directly without interacting with the screen.",
287
305
  "category": "computer-use",
288
306
  "risk": "low",
289
307
  "input_schema": {
@@ -8,9 +8,5 @@ export async function run(
8
8
  input: Record<string, unknown>,
9
9
  context: ToolContext,
10
10
  ): Promise<ToolExecutionResult> {
11
- return forwardComputerUseProxyTool(
12
- "computer_use_request_control",
13
- input,
14
- context,
15
- );
11
+ return forwardComputerUseProxyTool("computer_use_observe", input, context);
16
12
  }
@@ -1,5 +1,6 @@
1
1
  import type { OAuthConnection } from "../../../oauth/connection.js";
2
- import { GOOGLE_CALENDAR_BASE_URL } from "../../../oauth/provider-base-urls.js";
2
+
3
+ const GOOGLE_CALENDAR_BASE_URL = "https://www.googleapis.com/calendar/v3";
3
4
  import type {
4
5
  CalendarEvent,
5
6
  CalendarEventsListResponse,
@@ -23,6 +24,7 @@ async function request<T>(
23
24
  connection: OAuthConnection,
24
25
  path: string,
25
26
  options?: RequestInit,
27
+ query?: Record<string, string | string[]>,
26
28
  ): Promise<T> {
27
29
  const method = (options?.method ?? "GET").toUpperCase();
28
30
 
@@ -65,6 +67,7 @@ async function request<T>(
65
67
  const resp = await connection.request({
66
68
  method,
67
69
  path,
70
+ query,
68
71
  baseUrl: GOOGLE_CALENDAR_BASE_URL,
69
72
  headers: {
70
73
  "Content-Type": "application/json",
@@ -106,29 +109,31 @@ export async function listEvents(
106
109
  syncToken?: string;
107
110
  },
108
111
  ): Promise<CalendarEventsListResponse> {
109
- const params = new URLSearchParams();
112
+ const query: Record<string, string> = {};
110
113
 
111
- if (options?.timeMin) params.set("timeMin", options.timeMin);
112
- if (options?.timeMax) params.set("timeMax", options.timeMax);
113
- params.set("maxResults", String(options?.maxResults ?? 25));
114
- if (options?.query) params.set("q", options.query);
114
+ if (options?.timeMin) query.timeMin = options.timeMin;
115
+ if (options?.timeMax) query.timeMax = options.timeMax;
116
+ query.maxResults = String(options?.maxResults ?? 25);
117
+ if (options?.query) query.q = options.query;
115
118
 
116
119
  // Default to expanding recurring events into instances
117
120
  const singleEvents = options?.singleEvents ?? true;
118
- params.set("singleEvents", String(singleEvents));
121
+ query.singleEvents = String(singleEvents);
119
122
 
120
123
  if (singleEvents && options?.orderBy) {
121
- params.set("orderBy", options.orderBy);
124
+ query.orderBy = options.orderBy;
122
125
  } else if (singleEvents) {
123
- params.set("orderBy", "startTime");
126
+ query.orderBy = "startTime";
124
127
  }
125
128
 
126
- if (options?.pageToken) params.set("pageToken", options.pageToken);
127
- if (options?.syncToken) params.set("syncToken", options.syncToken);
129
+ if (options?.pageToken) query.pageToken = options.pageToken;
130
+ if (options?.syncToken) query.syncToken = options.syncToken;
128
131
 
129
132
  return request<CalendarEventsListResponse>(
130
133
  connection,
131
- `/calendars/${encodeURIComponent(calendarId)}/events?${params}`,
134
+ `/calendars/${encodeURIComponent(calendarId)}/events`,
135
+ undefined,
136
+ query,
132
137
  );
133
138
  }
134
139
 
@@ -160,14 +165,14 @@ export async function createEvent(
160
165
  calendarId = "primary",
161
166
  sendUpdates: "all" | "externalOnly" | "none" = "all",
162
167
  ): Promise<CalendarEvent> {
163
- const params = new URLSearchParams({ sendUpdates });
164
168
  return request<CalendarEvent>(
165
169
  connection,
166
- `/calendars/${encodeURIComponent(calendarId)}/events?${params}`,
170
+ `/calendars/${encodeURIComponent(calendarId)}/events`,
167
171
  {
168
172
  method: "POST",
169
173
  body: JSON.stringify(event),
170
174
  },
175
+ { sendUpdates },
171
176
  );
172
177
  }
173
178
 
@@ -186,16 +191,16 @@ export async function patchEvent(
186
191
  calendarId = "primary",
187
192
  sendUpdates: "all" | "externalOnly" | "none" = "all",
188
193
  ): Promise<CalendarEvent> {
189
- const params = new URLSearchParams({ sendUpdates });
190
194
  return request<CalendarEvent>(
191
195
  connection,
192
196
  `/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(
193
197
  eventId,
194
- )}?${params}`,
198
+ )}`,
195
199
  {
196
200
  method: "PATCH",
197
201
  body: JSON.stringify(updates),
198
202
  },
203
+ { sendUpdates },
199
204
  );
200
205
  }
201
206
 
@@ -6,7 +6,6 @@ import type { MessagingProvider } from "../../../../messaging/provider.js";
6
6
  import {
7
7
  getConnectedProviders,
8
8
  getMessagingProvider,
9
- isPlatformEnabled,
10
9
  } from "../../../../messaging/registry.js";
11
10
  import type { OAuthConnection } from "../../../../oauth/connection.js";
12
11
  import { resolveOAuthConnection } from "../../../../oauth/connection-resolver.js";
@@ -110,9 +109,7 @@ export function extractEmail(address: string): string {
110
109
  export function resolveProvider(platformInput?: string): MessagingProvider {
111
110
  if (platformInput) return getMessagingProvider(platformInput);
112
111
 
113
- const connected = getConnectedProviders().filter((p) =>
114
- isPlatformEnabled(p.id),
115
- );
112
+ const connected = getConnectedProviders();
116
113
  if (connected.length === 1) return connected[0];
117
114
  if (connected.length === 0) {
118
115
  throw new Error(
@@ -9,4 +9,4 @@ metadata:
9
9
  user-invocable: true
10
10
  ---
11
11
 
12
- Tools for managing assistant settings: voice configuration (TTS voice, PTT activation key, wake word), avatar generation, system settings navigation, and in-app settings tab navigation.
12
+ Tools for managing assistant settings: voice configuration (TTS voice, PTT activation key, conversation timeout), avatar generation, system settings navigation, and in-app settings tab navigation.
@@ -3,7 +3,7 @@
3
3
  "tools": [
4
4
  {
5
5
  "name": "voice_config_update",
6
- "description": "Update a voice configuration setting (TTS voice ID, PTT activation key, wake word enabled/keyword/timeout). Changes take effect immediately.",
6
+ "description": "Update a voice configuration setting (TTS voice ID, PTT activation key, conversation timeout). Changes take effect immediately.",
7
7
  "category": "system",
8
8
  "risk": "low",
9
9
  "input_schema": {
@@ -11,13 +11,7 @@
11
11
  "properties": {
12
12
  "setting": {
13
13
  "type": "string",
14
- "enum": [
15
- "activation_key",
16
- "wake_word_enabled",
17
- "wake_word_keyword",
18
- "wake_word_timeout",
19
- "tts_voice_id"
20
- ],
14
+ "enum": ["activation_key", "conversation_timeout", "tts_voice_id"],
21
15
  "description": "The voice setting to change"
22
16
  },
23
17
  "value": {
@@ -18,16 +18,8 @@ const VOICE_SETTINGS = {
18
18
  userDefaultsKey: "pttActivationKey",
19
19
  type: "string" as const,
20
20
  },
21
- wake_word_enabled: {
22
- userDefaultsKey: "wakeWordEnabled",
23
- type: "boolean" as const,
24
- },
25
- wake_word_keyword: {
26
- userDefaultsKey: "wakeWordKeyword",
27
- type: "string" as const,
28
- },
29
- wake_word_timeout: {
30
- userDefaultsKey: "wakeWordTimeoutSeconds",
21
+ conversation_timeout: {
22
+ userDefaultsKey: "voiceConversationTimeoutSeconds",
31
23
  type: "number" as const,
32
24
  },
33
25
  tts_voice_id: { userDefaultsKey: "ttsVoiceId", type: "string" as const },
@@ -41,9 +33,7 @@ const VALID_TIMEOUTS = [5, 10, 15, 30, 60];
41
33
 
42
34
  const FRIENDLY_NAMES: Record<VoiceSettingName, string> = {
43
35
  activation_key: "PTT activation key",
44
- wake_word_enabled: "Wake word",
45
- wake_word_keyword: "Wake word keyword",
46
- wake_word_timeout: "Wake word timeout",
36
+ conversation_timeout: "Conversation timeout",
47
37
  tts_voice_id: "ElevenLabs voice",
48
38
  };
49
39
 
@@ -76,30 +66,12 @@ function validateSetting(
76
66
  }
77
67
  return { ok: true, coerced: result.value };
78
68
  }
79
- case "wake_word_enabled": {
80
- if (typeof value === "boolean") return { ok: true, coerced: value };
81
- if (value === "true") return { ok: true, coerced: true };
82
- if (value === "false") return { ok: true, coerced: false };
83
- return {
84
- ok: false,
85
- error: 'wake_word_enabled must be a boolean (or "true"/"false" string)',
86
- };
87
- }
88
- case "wake_word_keyword": {
89
- if (typeof value !== "string" || value.trim().length === 0) {
90
- return {
91
- ok: false,
92
- error: "wake_word_keyword must be a non-empty string",
93
- };
94
- }
95
- return { ok: true, coerced: value.trim() };
96
- }
97
- case "wake_word_timeout": {
69
+ case "conversation_timeout": {
98
70
  const num = typeof value === "number" ? value : Number(value);
99
71
  if (Number.isNaN(num) || !VALID_TIMEOUTS.includes(num)) {
100
72
  return {
101
73
  ok: false,
102
- error: `wake_word_timeout must be one of: ${VALID_TIMEOUTS.join(
74
+ error: `conversation_timeout must be one of: ${VALID_TIMEOUTS.join(
103
75
  ", ",
104
76
  )}`,
105
77
  };
@@ -48,6 +48,7 @@ import * as computerUseClick from "./bundled-skills/computer-use/tools/computer-
48
48
  import * as computerUseDone from "./bundled-skills/computer-use/tools/computer-use-done.js";
49
49
  import * as computerUseDrag from "./bundled-skills/computer-use/tools/computer-use-drag.js";
50
50
  import * as computerUseKey from "./bundled-skills/computer-use/tools/computer-use-key.js";
51
+ import * as computerUseObserve from "./bundled-skills/computer-use/tools/computer-use-observe.js";
51
52
  import * as computerUseOpenApp from "./bundled-skills/computer-use/tools/computer-use-open-app.js";
52
53
  import * as computerUseRespond from "./bundled-skills/computer-use/tools/computer-use-respond.js";
53
54
  import * as computerUseRunApplescript from "./bundled-skills/computer-use/tools/computer-use-run-applescript.js";
@@ -88,8 +89,6 @@ import * as calendarListEvents from "./bundled-skills/google-calendar/tools/cale
88
89
  import * as calendarRsvp from "./bundled-skills/google-calendar/tools/calendar-rsvp.js";
89
90
  // ── image-studio ───────────────────────────────────────────────────────────────
90
91
  import * as mediaGenerateImage from "./bundled-skills/image-studio/tools/media-generate-image.js";
91
- // ── knowledge-graph ────────────────────────────────────────────────────────────
92
- import * as graphQuery from "./bundled-skills/knowledge-graph/tools/graph-query.js";
93
92
  // ── media-processing ───────────────────────────────────────────────────────────
94
93
  import * as analyzeKeyframes from "./bundled-skills/media-processing/tools/analyze-keyframes.js";
95
94
  import * as extractKeyframes from "./bundled-skills/media-processing/tools/extract-keyframes.js";
@@ -219,6 +218,7 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
219
218
  ["claude-code:tools/claude-code.ts", claudeCode],
220
219
 
221
220
  // computer-use
221
+ ["computer-use:tools/computer-use-observe.ts", computerUseObserve],
222
222
  ["computer-use:tools/computer-use-click.ts", computerUseClick],
223
223
  ["computer-use:tools/computer-use-type-text.ts", computerUseTypeText],
224
224
  ["computer-use:tools/computer-use-key.ts", computerUseKey],
@@ -276,9 +276,6 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
276
276
  // image-studio
277
277
  ["image-studio:tools/media-generate-image.ts", mediaGenerateImage],
278
278
 
279
- // knowledge-graph
280
- ["knowledge-graph:tools/graph-query.ts", graphQuery],
281
-
282
279
  // media-processing
283
280
  ["media-processing:tools/ingest-media.ts", ingestMedia],
284
281
  ["media-processing:tools/media-status.ts", mediaStatus],
@@ -24,13 +24,6 @@ function flag(name: string): boolean {
24
24
  return raw === "true" || raw === "1";
25
25
  }
26
26
 
27
- function flagTriState(name: string): boolean | undefined {
28
- const raw = str(name);
29
- if (raw === "true" || raw === "1") return true;
30
- if (raw === "false" || raw === "0") return false;
31
- return undefined;
32
- }
33
-
34
27
  // ── Registry ─────────────────────────────────────────────────────────────────
35
28
  // Each entry documents the env var name, type, default, and purpose.
36
29
 
@@ -43,62 +36,6 @@ export function getBaseDataDir(): string | undefined {
43
36
  return str("BASE_DATA_DIR");
44
37
  }
45
38
 
46
- /**
47
- * VELLUM_DAEMON_TCP_PORT — number, default: 8765
48
- * TCP port for the daemon's TCP listener (used by iOS clients).
49
- */
50
- export function getDaemonTcpPort(): number {
51
- const raw = str("VELLUM_DAEMON_TCP_PORT");
52
- if (raw) {
53
- const port = parseInt(raw, 10);
54
- if (!isNaN(port) && port > 0 && port <= 65535) return port;
55
- }
56
- return 8765;
57
- }
58
-
59
- /**
60
- * VELLUM_DAEMON_TCP_ENABLED — boolean tri-state, default: undefined (falls back to flag file)
61
- * Whether the daemon TCP listener should be active.
62
- * 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
63
- */
64
- export function getDaemonTcpEnabled(): boolean | undefined {
65
- return flagTriState("VELLUM_DAEMON_TCP_ENABLED");
66
- }
67
-
68
- /**
69
- * VELLUM_DAEMON_TCP_HOST — string, default: context-dependent (127.0.0.1 or 0.0.0.0)
70
- * Hostname/address for the TCP listener. When unset, platform.ts resolves
71
- * based on whether iOS pairing is enabled.
72
- */
73
- export function getDaemonTcpHost(): string | undefined {
74
- return str("VELLUM_DAEMON_TCP_HOST");
75
- }
76
-
77
- /**
78
- * VELLUM_DAEMON_IOS_PAIRING — boolean tri-state, default: undefined (falls back to flag file)
79
- * Whether iOS pairing mode is enabled. When on, TCP binds to 0.0.0.0.
80
- * 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
81
- */
82
- export function getDaemonIosPairing(): boolean | undefined {
83
- return flagTriState("VELLUM_DAEMON_IOS_PAIRING");
84
- }
85
-
86
- /**
87
- * VELLUM_DEBUG — boolean, default: false
88
- * Enables debug-level logging and verbose output.
89
- */
90
- export function getDebugMode(): boolean {
91
- return flag("VELLUM_DEBUG");
92
- }
93
-
94
- /**
95
- * VELLUM_LOG_STDERR — boolean, default: false
96
- * Forces logger output to stderr instead of log files.
97
- */
98
- export function getLogStderr(): boolean {
99
- return flag("VELLUM_LOG_STDERR");
100
- }
101
-
102
39
  /**
103
40
  * DEBUG_STDOUT_LOGS — boolean, default: false
104
41
  * Enables additional log output to stdout (alongside file logging).
@@ -107,14 +44,6 @@ export function getDebugStdoutLogs(): boolean {
107
44
  return flag("DEBUG_STDOUT_LOGS");
108
45
  }
109
46
 
110
- /**
111
- * VELLUM_ENABLE_MONITORING — boolean, default: false
112
- * Enables monitoring/telemetry (Logfire, etc.).
113
- */
114
- export function getEnableMonitoring(): boolean {
115
- return flag("VELLUM_ENABLE_MONITORING");
116
- }
117
-
118
47
  /**
119
48
  * IS_CONTAINERIZED — boolean, default: false
120
49
  * When true, indicates the assistant is running inside a container (e.g. Docker).
@@ -132,24 +61,26 @@ export function getIsContainerized(): boolean {
132
61
  * to warn about typos or unrecognized variables.
133
62
  */
134
63
  const KNOWN_VELLUM_VARS = new Set([
135
- "VELLUM_DAEMON_TCP_PORT",
136
- "VELLUM_DAEMON_TCP_ENABLED",
137
- "VELLUM_DAEMON_TCP_HOST",
138
- "VELLUM_DAEMON_IOS_PAIRING",
139
- "VELLUM_DAEMON_NOAUTH",
64
+ "VELLUM_ASSISTANT_NAME",
65
+ "VELLUM_AWS_ROLE_ARN",
66
+ "VELLUM_CLAUDE_CODE_DEPTH",
67
+ "VELLUM_CUSTOM_QR_CODE_PATH",
140
68
  "VELLUM_DAEMON_AUTOSTART",
141
- "VELLUM_DEBUG",
142
- "VELLUM_LOG_STDERR",
143
- "VELLUM_ENABLE_MONITORING",
69
+ "VELLUM_DAEMON_NOAUTH",
70
+ "VELLUM_DATA_DIR",
71
+ "VELLUM_DESKTOP_APP",
72
+ "VELLUM_DEV",
73
+ "VELLUM_ENABLE_INSECURE_LAN_PAIRING",
74
+ "VELLUM_HATCHED_BY",
144
75
  "VELLUM_HOOK_EVENT",
145
76
  "VELLUM_HOOK_NAME",
146
77
  "VELLUM_HOOK_SETTINGS",
78
+ "VELLUM_LOCKFILE_DIR",
79
+ "VELLUM_PLATFORM_URL",
147
80
  "VELLUM_ROOT_DIR",
148
- "VELLUM_WORKSPACE_DIR",
149
- "VELLUM_CLAUDE_CODE_DEPTH",
150
- "VELLUM_ASSISTANT_PLATFORM_URL",
81
+ "VELLUM_SSH_USER",
151
82
  "VELLUM_UNSAFE_AUTH_BYPASS",
152
- "VELLUM_DATA_DIR",
83
+ "VELLUM_WORKSPACE_DIR",
153
84
  ]);
154
85
 
155
86
  /**
package/src/config/env.ts CHANGED
@@ -8,17 +8,13 @@
8
8
  * - Fail-fast validation via validateEnv() at startup
9
9
  * - Shared derived values (e.g. gateway base URL) instead of duplicated logic
10
10
  *
11
- * Bootstrap-level env vars (BASE_DATA_DIR, VELLUM_DAEMON_*, VELLUM_DEBUG,
12
- * VELLUM_LOG_STDERR, DEBUG_STDOUT_LOGS) are defined in config/env-registry.ts
13
- * which has no internal dependencies and can be imported from platform/logger
14
- * without circular imports.
11
+ * Bootstrap-level env vars (BASE_DATA_DIR, DEBUG_STDOUT_LOGS) are defined
12
+ * in config/env-registry.ts which has no internal dependencies and can be
13
+ * imported from platform/logger without circular imports.
15
14
  */
16
15
 
17
16
  import { getLogger } from "../util/logger.js";
18
- import {
19
- checkUnrecognizedEnvVars,
20
- getEnableMonitoring,
21
- } from "./env-registry.js";
17
+ import { checkUnrecognizedEnvVars } from "./env-registry.js";
22
18
 
23
19
  const log = getLogger("env");
24
20
 
@@ -55,33 +51,23 @@ export function getGatewayPort(): number {
55
51
  return int("GATEWAY_PORT", DEFAULT_GATEWAY_PORT);
56
52
  }
57
53
 
58
- /**
59
- * Resolve the gateway base URL for internal service-to-service calls.
60
- * Prefers GATEWAY_INTERNAL_BASE_URL if set, then INTERNAL_GATEWAY_BASE_URL
61
- * (used by skill subprocesses), otherwise derives from port.
62
- */
54
+ /** Resolve the gateway base URL for internal service-to-service calls. */
63
55
  export function getGatewayInternalBaseUrl(): string {
64
- const explicit = str("GATEWAY_INTERNAL_BASE_URL");
65
- if (explicit) return explicit.replace(/\/+$/, "");
66
- const skillInjected = str("INTERNAL_GATEWAY_BASE_URL");
67
- if (skillInjected) return skillInjected.replace(/\/+$/, "");
68
56
  return `http://127.0.0.1:${getGatewayPort()}`;
69
57
  }
70
58
 
71
59
  // ── Ingress ──────────────────────────────────────────────────────────────────
72
60
 
73
- /** Read the INGRESS_PUBLIC_BASE_URL env var (may be mutated at runtime by config handlers). */
61
+ let _ingressPublicBaseUrl: string | undefined;
62
+
63
+ /** Read the ingress public base URL (module-level state, mutated at runtime by config handlers). */
74
64
  export function getIngressPublicBaseUrl(): string | undefined {
75
- return str("INGRESS_PUBLIC_BASE_URL");
65
+ return _ingressPublicBaseUrl;
76
66
  }
77
67
 
78
- /** Set or clear the INGRESS_PUBLIC_BASE_URL env var (used by config handlers). */
68
+ /** Set or clear the ingress public base URL (used by config handlers). */
79
69
  export function setIngressPublicBaseUrl(value: string | undefined): void {
80
- if (value) {
81
- process.env.INGRESS_PUBLIC_BASE_URL = value;
82
- } else {
83
- delete process.env.INGRESS_PUBLIC_BASE_URL;
84
- }
70
+ _ingressPublicBaseUrl = value;
85
71
  }
86
72
 
87
73
  // ── Runtime HTTP ─────────────────────────────────────────────────────────────
@@ -117,37 +103,12 @@ export function hasUngatedHttpAuthDisabled(): boolean {
117
103
  return str("VELLUM_UNSAFE_AUTH_BYPASS")?.trim() !== "1";
118
104
  }
119
105
 
120
- // ── Twilio ───────────────────────────────────────────────────────────────────
121
-
122
- export function getTwilioPhoneNumberEnv(): string | undefined {
123
- return str("TWILIO_PHONE_NUMBER");
124
- }
125
-
126
- export function getTwilioUserPhoneNumber(): string | undefined {
127
- return str("TWILIO_USER_PHONE_NUMBER");
128
- }
129
-
130
- export function isTwilioWebhookValidationDisabled(): boolean {
131
- // Intentionally strict: only exact "true" disables validation (not "1").
132
- // This is a security-sensitive bypass — we don't want environments that
133
- // template booleans as "1" to silently skip webhook signature checks.
134
- return process.env.TWILIO_WEBHOOK_VALIDATION_DISABLED === "true";
135
- }
136
-
137
- export function getCallWelcomeGreeting(): string | undefined {
138
- return str("CALL_WELCOME_GREETING");
139
- }
140
-
141
106
  // ── Monitoring ───────────────────────────────────────────────────────────────
142
107
 
143
108
  export function getLogfireToken(): string | undefined {
144
109
  return str("LOGFIRE_TOKEN");
145
110
  }
146
111
 
147
- export function isMonitoringEnabled(): boolean {
148
- return getEnableMonitoring();
149
- }
150
-
151
112
  const DEFAULT_SENTRY_DSN =
152
113
  "https://db2d38a082e4ee35eeaea08c44b376ec@o4504590528675840.ingest.us.sentry.io/4510874712276992";
153
114