@vellumai/assistant 0.4.41 → 0.4.43

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 (843) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +131 -393
  4. package/Dockerfile +0 -1
  5. package/README.md +73 -83
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +16 -21
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -1
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  33. package/src/__tests__/call-controller.test.ts +4 -8
  34. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  35. package/src/__tests__/call-domain.test.ts +250 -8
  36. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  37. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  38. package/src/__tests__/call-recovery.test.ts +47 -0
  39. package/src/__tests__/call-routes-http.test.ts +13 -0
  40. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  41. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  42. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  43. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  44. package/src/__tests__/channel-approval.test.ts +0 -201
  45. package/src/__tests__/channel-approvals.test.ts +2 -2
  46. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  47. package/src/__tests__/channel-guardian.test.ts +641 -740
  48. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  49. package/src/__tests__/channel-policy.test.ts +9 -12
  50. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  51. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  52. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  53. package/src/__tests__/checker.test.ts +10 -7
  54. package/src/__tests__/chrome-cdp.test.ts +57 -17
  55. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  56. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  57. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  58. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  59. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  60. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  61. package/src/__tests__/config-watcher.test.ts +1 -5
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  63. package/src/__tests__/connection-policy.test.ts +3 -62
  64. package/src/__tests__/contacts-tools.test.ts +0 -2
  65. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  66. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  67. package/src/__tests__/context-window-manager.test.ts +220 -61
  68. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  69. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  70. package/src/__tests__/conversation-pairing.test.ts +14 -14
  71. package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
  72. package/src/__tests__/conversation-store.test.ts +2 -2
  73. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  74. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  75. package/src/__tests__/credential-security-invariants.test.ts +9 -16
  76. package/src/__tests__/credentials-cli.test.ts +49 -5
  77. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  78. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  79. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  80. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  81. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  82. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  83. package/src/__tests__/email-cli.test.ts +12 -12
  84. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  86. package/src/__tests__/event-bus.test.ts +0 -1
  87. package/src/__tests__/followup-tools.test.ts +0 -2
  88. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  89. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  90. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  91. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  92. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  93. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  94. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  95. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  96. package/src/__tests__/guardian-action-store.test.ts +2 -2
  97. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  98. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  99. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  100. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  101. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  102. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  103. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  104. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  105. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  106. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  107. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  108. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  109. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  110. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  111. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  112. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  113. package/src/__tests__/heartbeat-service.test.ts +1 -1
  114. package/src/__tests__/home-base-bootstrap.test.ts +0 -2
  115. package/src/__tests__/host-shell-tool.test.ts +3 -12
  116. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  117. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  118. package/src/__tests__/integration-status.test.ts +8 -8
  119. package/src/__tests__/intent-routing.test.ts +9 -13
  120. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  121. package/src/__tests__/invite-routes-http.test.ts +10 -10
  122. package/src/__tests__/llm-usage-store.test.ts +45 -9
  123. package/src/__tests__/local-gateway-health.test.ts +209 -0
  124. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  125. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  126. package/src/__tests__/managed-store.test.ts +29 -12
  127. package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
  128. package/src/__tests__/mcp-cli.test.ts +1 -1
  129. package/src/__tests__/mcp-health-check.test.ts +1 -1
  130. package/src/__tests__/media-generate-image.test.ts +1 -1
  131. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  132. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  133. package/src/__tests__/memory-regressions.test.ts +1 -166
  134. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  135. package/src/__tests__/migration-export-http.test.ts +2 -2
  136. package/src/__tests__/migration-transport.test.ts +44 -0
  137. package/src/__tests__/non-member-access-request.test.ts +49 -36
  138. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  139. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  140. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  141. package/src/__tests__/notification-deep-link.test.ts +3 -3
  142. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  143. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  144. package/src/__tests__/oauth-cli.test.ts +1 -1
  145. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  146. package/src/__tests__/onboarding-template-contract.test.ts +2 -2
  147. package/src/__tests__/platform.test.ts +168 -5
  148. package/src/__tests__/playbook-execution.test.ts +0 -2
  149. package/src/__tests__/playbook-tools.test.ts +0 -2
  150. package/src/__tests__/pricing.test.ts +125 -0
  151. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  152. package/src/__tests__/recording-handler.test.ts +46 -80
  153. package/src/__tests__/recording-state-machine.test.ts +112 -183
  154. package/src/__tests__/registry.test.ts +1 -1
  155. package/src/__tests__/relay-server.test.ts +69 -71
  156. package/src/__tests__/reminder-store.test.ts +3 -3
  157. package/src/__tests__/request-file-tool.test.ts +2 -2
  158. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  159. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  160. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  162. package/src/__tests__/schedule-store.test.ts +13 -4
  163. package/src/__tests__/schedule-tools.test.ts +0 -2
  164. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  165. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  168. package/src/__tests__/secret-response-routing.test.ts +1 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  170. package/src/__tests__/sequence-store.test.ts +0 -2
  171. package/src/__tests__/server-history-render.test.ts +2 -199
  172. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  173. package/src/__tests__/session-agent-loop.test.ts +107 -3
  174. package/src/__tests__/session-confirmation-signals.test.ts +10 -4
  175. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  176. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  177. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  178. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  179. package/src/__tests__/session-profile-injection.test.ts +9 -3
  180. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  181. package/src/__tests__/session-queue.test.ts +10 -4
  182. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  183. package/src/__tests__/session-skill-tools.test.ts +2 -3
  184. package/src/__tests__/session-slash-known.test.ts +11 -4
  185. package/src/__tests__/session-slash-queue.test.ts +11 -4
  186. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  187. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  188. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  189. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  190. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  191. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  192. package/src/__tests__/session-usage.test.ts +180 -0
  193. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  194. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  195. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  196. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  197. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  198. package/src/__tests__/skill-include-graph.test.ts +1 -0
  199. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  200. package/src/__tests__/skill-load-tool.test.ts +90 -12
  201. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  202. package/src/__tests__/skills-uninstall.test.ts +131 -0
  203. package/src/__tests__/skills.test.ts +32 -16
  204. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  205. package/src/__tests__/slack-channel-config.test.ts +71 -12
  206. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  207. package/src/__tests__/slack-share-routes.test.ts +1 -1
  208. package/src/__tests__/slack-skill.test.ts +2 -2
  209. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  210. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  211. package/src/__tests__/starter-task-flow.test.ts +1 -1
  212. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  213. package/src/__tests__/subagent-tools.test.ts +2 -2
  214. package/src/__tests__/system-prompt.test.ts +4 -8
  215. package/src/__tests__/task-compiler.test.ts +0 -2
  216. package/src/__tests__/task-management-tools.test.ts +0 -2
  217. package/src/__tests__/task-runner.test.ts +0 -2
  218. package/src/__tests__/task-scheduler.test.ts +2 -2
  219. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  220. package/src/__tests__/terminal-tools.test.ts +1 -11
  221. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  222. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  223. package/src/__tests__/tool-executor.test.ts +2 -2
  224. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  225. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  226. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  227. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  228. package/src/__tests__/trace-emitter.test.ts +1 -1
  229. package/src/__tests__/trust-context-guards.test.ts +1 -1
  230. package/src/__tests__/trust-store.test.ts +44 -395
  231. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  232. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  233. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  234. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  235. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  236. package/src/__tests__/twilio-config.test.ts +11 -2
  237. package/src/__tests__/twilio-provider.test.ts +6 -4
  238. package/src/__tests__/twilio-routes.test.ts +408 -86
  239. package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
  240. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  241. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  242. package/src/__tests__/update-bulletin.test.ts +4 -8
  243. package/src/__tests__/update-template-contract.test.ts +1 -1
  244. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  245. package/src/__tests__/usage-routes.test.ts +23 -5
  246. package/src/__tests__/user-reference.test.ts +1 -1
  247. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  248. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  249. package/src/__tests__/view-image-tool.test.ts +0 -2
  250. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  251. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  252. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  253. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  254. package/src/__tests__/workspace-policy.test.ts +1 -1
  255. package/src/approvals/AGENTS.md +4 -4
  256. package/src/approvals/approval-primitive.ts +2 -2
  257. package/src/approvals/guardian-decision-primitive.ts +1 -1
  258. package/src/approvals/guardian-request-resolvers.ts +3 -4
  259. package/src/bundler/app-bundler.ts +29 -217
  260. package/src/bundler/app-compiler.ts +131 -103
  261. package/src/bundler/compiler-tools.ts +248 -0
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +116 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +263 -16
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  316. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  317. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  318. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  319. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  320. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  321. package/src/cli/commands/twitter/router.ts +396 -0
  322. package/src/cli/commands/twitter/session.ts +121 -0
  323. package/src/cli/db.ts +1 -0
  324. package/src/cli/http-client.ts +87 -0
  325. package/src/cli/logger.ts +6 -0
  326. package/src/cli/main-screen.tsx +4 -3
  327. package/src/cli/output.ts +19 -0
  328. package/src/cli/program.ts +29 -27
  329. package/src/cli/reference.ts +27 -37
  330. package/src/cli.ts +452 -240
  331. package/src/config/assistant-feature-flags.ts +3 -15
  332. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  333. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  334. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  335. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  336. package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +87 -229
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -11
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  350. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +56 -14
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +0 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +233 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +110 -96
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +168 -55
  452. package/src/daemon/main.ts +1 -0
  453. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  462. package/src/daemon/providers-setup.ts +0 -5
  463. package/src/daemon/recording-executor.ts +0 -7
  464. package/src/daemon/ride-shotgun-handler.ts +9 -13
  465. package/src/daemon/server.ts +136 -510
  466. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  467. package/src/daemon/session-agent-loop.ts +86 -24
  468. package/src/daemon/session-attachments.ts +1 -1
  469. package/src/daemon/session-error.ts +1 -1
  470. package/src/daemon/session-history.ts +20 -15
  471. package/src/daemon/session-lifecycle.ts +9 -7
  472. package/src/daemon/session-memory.ts +15 -1
  473. package/src/daemon/session-messaging.ts +10 -6
  474. package/src/daemon/session-notifiers.ts +10 -8
  475. package/src/daemon/session-process.ts +34 -25
  476. package/src/daemon/session-queue-manager.ts +1 -1
  477. package/src/daemon/session-runtime-assembly.ts +6 -25
  478. package/src/daemon/session-surfaces.ts +2 -2
  479. package/src/daemon/session-tool-setup.ts +1 -1
  480. package/src/daemon/session-usage.ts +119 -18
  481. package/src/daemon/session.ts +13 -9
  482. package/src/daemon/tool-side-effects.ts +6 -5
  483. package/src/daemon/trace-emitter.ts +1 -1
  484. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  485. package/src/daemon/watch-handler.ts +2 -5
  486. package/src/email/service.ts +8 -8
  487. package/src/events/domain-events.ts +0 -1
  488. package/src/events/tool-notification-listener.ts +1 -1
  489. package/src/followups/followup-store.ts +1 -2
  490. package/src/followups/types.ts +0 -6
  491. package/src/heartbeat/heartbeat-service.ts +1 -1
  492. package/src/inbound/platform-callback-registration.ts +1 -1
  493. package/src/inbound/public-ingress-urls.ts +0 -8
  494. package/src/index.ts +12 -0
  495. package/src/mcp/client.ts +1 -1
  496. package/src/mcp/manager.ts +1 -1
  497. package/src/memory/app-store.ts +1 -42
  498. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  499. package/src/memory/conversation-attention-store.ts +154 -0
  500. package/src/memory/conversation-bootstrap.ts +1 -1
  501. package/src/memory/conversation-crud.ts +53 -1
  502. package/src/memory/conversation-display-order-migration.ts +2 -3
  503. package/src/memory/conversation-queries.ts +1 -29
  504. package/src/memory/conversation-title-service.ts +26 -21
  505. package/src/memory/db-connection.ts +1 -8
  506. package/src/memory/db-init.ts +20 -0
  507. package/src/memory/delivery-crud.ts +4 -34
  508. package/src/memory/external-conversation-store.ts +1 -1
  509. package/src/memory/format-recall.ts +47 -0
  510. package/src/memory/guardian-action-store.ts +4 -5
  511. package/src/memory/guardian-rate-limits.ts +0 -3
  512. package/src/memory/invite-store.ts +1 -1
  513. package/src/memory/job-handlers/backfill.ts +9 -2
  514. package/src/memory/job-handlers/extraction.ts +2 -7
  515. package/src/memory/job-handlers/summarization.ts +1 -1
  516. package/src/memory/llm-usage-store.ts +11 -0
  517. package/src/memory/migrations/114-notifications.ts +12 -40
  518. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  519. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  520. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  521. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  522. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  523. package/src/memory/migrations/index.ts +5 -0
  524. package/src/memory/migrations/registry.ts +30 -0
  525. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  526. package/src/memory/retriever.test.ts +707 -0
  527. package/src/memory/retriever.ts +120 -116
  528. package/src/memory/schema/calls.ts +3 -7
  529. package/src/memory/schema/guardian.ts +2 -2
  530. package/src/memory/search/lexical.ts +4 -1
  531. package/src/memory/search/query-expansion.test.ts +70 -0
  532. package/src/memory/search/query-expansion.ts +118 -0
  533. package/src/memory/search/types.ts +18 -17
  534. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  535. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  536. package/src/messaging/registry.ts +0 -1
  537. package/src/notifications/README.md +13 -22
  538. package/src/notifications/adapters/macos.ts +1 -1
  539. package/src/notifications/conversation-pairing.ts +2 -2
  540. package/src/notifications/copy-composer.ts +2 -2
  541. package/src/notifications/decision-engine.ts +1 -10
  542. package/src/notifications/destination-resolver.ts +2 -3
  543. package/src/notifications/emit-signal.ts +2 -8
  544. package/src/notifications/guardian-question-mode.ts +5 -8
  545. package/src/notifications/signal.ts +1 -2
  546. package/src/notifications/types.ts +1 -1
  547. package/src/oauth/token-persistence.ts +25 -1
  548. package/src/permissions/checker.ts +4 -29
  549. package/src/permissions/defaults.ts +6 -6
  550. package/src/permissions/prompter.ts +1 -1
  551. package/src/permissions/secret-prompter.ts +1 -1
  552. package/src/permissions/shell-identity.ts +1 -1
  553. package/src/permissions/trust-store.ts +13 -76
  554. package/src/permissions/workspace-policy.ts +1 -1
  555. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  556. package/src/{config → prompts}/system-prompt.ts +40 -21
  557. package/src/runtime/AGENTS.md +6 -8
  558. package/src/runtime/access-request-helper.ts +36 -55
  559. package/src/runtime/actor-trust-resolver.ts +1 -24
  560. package/src/runtime/approval-message-composer.ts +6 -2
  561. package/src/runtime/assistant-event.ts +1 -1
  562. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  563. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  564. package/src/runtime/auth/route-policy.ts +140 -24
  565. package/src/runtime/auth/subject.ts +9 -0
  566. package/src/runtime/auth/token-service.ts +11 -0
  567. package/src/runtime/auth/types.ts +1 -1
  568. package/src/runtime/channel-approval-types.ts +1 -1
  569. package/src/runtime/channel-approvals.ts +1 -1
  570. package/src/runtime/channel-invite-transport.ts +0 -2
  571. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  572. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  573. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  574. package/src/runtime/channel-readiness-service.ts +24 -159
  575. package/src/runtime/channel-readiness-types.ts +5 -1
  576. package/src/runtime/channel-reply-delivery.ts +43 -3
  577. package/src/runtime/channel-retry-sweep.ts +14 -22
  578. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  579. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  580. package/src/runtime/gateway-client.ts +12 -15
  581. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  582. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  583. package/src/runtime/guardian-action-message-composer.ts +4 -4
  584. package/src/runtime/guardian-reply-router.ts +3 -3
  585. package/src/runtime/http-server.ts +133 -24
  586. package/src/runtime/http-types.ts +34 -1
  587. package/src/runtime/invite-instruction-generator.ts +1 -3
  588. package/src/runtime/invite-redemption-service.ts +5 -5
  589. package/src/runtime/invite-service.ts +7 -7
  590. package/src/runtime/local-actor-identity.ts +28 -2
  591. package/src/runtime/local-gateway-health.ts +275 -0
  592. package/src/runtime/middleware/twilio-validation.ts +3 -3
  593. package/src/runtime/migrations/migration-transport.ts +18 -3
  594. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  595. package/src/runtime/nl-approval-parser.ts +2 -3
  596. package/src/runtime/routes/access-request-decision.ts +2 -2
  597. package/src/runtime/routes/app-management-routes.ts +921 -0
  598. package/src/runtime/routes/approval-routes.ts +76 -7
  599. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  600. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  601. package/src/runtime/routes/channel-route-shared.ts +1 -3
  602. package/src/runtime/routes/channel-routes.ts +1 -4
  603. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  604. package/src/runtime/routes/computer-use-routes.ts +595 -0
  605. package/src/runtime/routes/contact-routes.ts +1 -317
  606. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  607. package/src/runtime/routes/conversation-routes.ts +11 -18
  608. package/src/runtime/routes/debug-routes.ts +1 -1
  609. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  610. package/src/runtime/routes/documents-routes.ts +227 -0
  611. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  612. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  613. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  614. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  615. package/src/runtime/routes/inbound-conversation.ts +3 -10
  616. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  617. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  618. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  619. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  620. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  622. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  623. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  624. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  625. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  626. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  627. package/src/runtime/routes/integrations/telegram.ts +111 -0
  628. package/src/runtime/routes/integrations/twilio.ts +451 -0
  629. package/src/runtime/routes/invite-routes.ts +2 -2
  630. package/src/runtime/routes/pairing-routes.ts +1 -1
  631. package/src/runtime/routes/recording-routes.ts +332 -0
  632. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  633. package/src/runtime/routes/session-management-routes.ts +167 -0
  634. package/src/runtime/routes/session-query-routes.ts +204 -0
  635. package/src/runtime/routes/settings-routes.ts +977 -0
  636. package/src/runtime/routes/skills-routes.ts +266 -0
  637. package/src/runtime/routes/subagents-routes.ts +246 -0
  638. package/src/runtime/routes/surface-action-routes.ts +100 -10
  639. package/src/runtime/routes/surface-content-routes.ts +1 -1
  640. package/src/runtime/routes/work-items-routes.ts +809 -0
  641. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  642. package/src/runtime/routes/workspace-routes.ts +410 -0
  643. package/src/runtime/routes/workspace-utils.ts +88 -0
  644. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  645. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  646. package/src/runtime/tool-grant-request-helper.ts +1 -2
  647. package/src/runtime/trust-context-resolver.ts +0 -1
  648. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  649. package/src/runtime/verification-rate-limiter.ts +2 -2
  650. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  651. package/src/schedule/integration-status.ts +2 -2
  652. package/src/schedule/schedule-store.ts +7 -9
  653. package/src/sequence/engine.ts +1 -1
  654. package/src/skills/active-skill-tools.ts +0 -8
  655. package/src/skills/clawhub.ts +1 -10
  656. package/src/skills/managed-store.ts +14 -4
  657. package/src/skills/slash-commands.ts +1 -1
  658. package/src/subagent/manager.ts +1 -1
  659. package/src/subagent/types.ts +1 -1
  660. package/src/tasks/SPEC.md +10 -10
  661. package/src/tasks/task-scheduler.ts +1 -1
  662. package/src/telegram/bot-username.ts +13 -0
  663. package/src/tools/assets/materialize.ts +1 -1
  664. package/src/tools/assets/search.ts +1 -1
  665. package/src/tools/browser/browser-execution.ts +2 -2
  666. package/src/tools/browser/browser-manager.ts +88 -11
  667. package/src/tools/browser/browser-screencast.ts +1 -1
  668. package/src/tools/browser/headless-browser.ts +0 -17
  669. package/src/tools/browser/jit-auth.ts +1 -1
  670. package/src/tools/browser/recording-store.ts +19 -1
  671. package/src/tools/browser/runtime-check.ts +4 -2
  672. package/src/tools/calls/call-start.ts +3 -3
  673. package/src/tools/credentials/metadata-store.ts +0 -13
  674. package/src/tools/credentials/vault.ts +7 -31
  675. package/src/tools/followups/followup_create.ts +0 -8
  676. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  677. package/src/tools/memory/definitions.ts +32 -10
  678. package/src/tools/memory/handlers.test.ts +573 -0
  679. package/src/tools/memory/handlers.ts +222 -65
  680. package/src/tools/memory/register.ts +53 -24
  681. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  682. package/src/tools/schedule/update.ts +0 -8
  683. package/src/tools/skills/load.ts +3 -3
  684. package/src/tools/subagent/read.ts +1 -1
  685. package/src/tools/system/voice-config.ts +2 -14
  686. package/src/tools/terminal/safe-env.ts +5 -18
  687. package/src/tools/tool-approval-handler.ts +4 -4
  688. package/src/tools/tool-manifest.ts +4 -2
  689. package/src/tools/types.ts +1 -1
  690. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  691. package/src/twitter/platform-proxy-client.ts +405 -0
  692. package/src/usage/types.ts +21 -0
  693. package/src/util/canonicalize-identity.ts +2 -6
  694. package/src/util/cookie-session.ts +35 -51
  695. package/src/util/platform.ts +93 -86
  696. package/src/util/pricing.ts +180 -43
  697. package/src/work-items/work-item-runner.ts +1 -1
  698. package/scripts/ipc/check-contract-inventory.ts +0 -107
  699. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  700. package/scripts/ipc/generate-swift.ts +0 -528
  701. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  702. package/src/__tests__/app-migration.test.ts +0 -148
  703. package/src/__tests__/config-loader-migration.test.ts +0 -85
  704. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  705. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  706. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  707. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  708. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  709. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  710. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  711. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  712. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  713. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  714. package/src/__tests__/integrations-cli.test.ts +0 -232
  715. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  716. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  717. package/src/__tests__/ipc-contract.test.ts +0 -76
  718. package/src/__tests__/ipc-protocol.test.ts +0 -120
  719. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  720. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  721. package/src/__tests__/ipc-validate.test.ts +0 -471
  722. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  723. package/src/__tests__/migration-ordering.test.ts +0 -267
  724. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  725. package/src/__tests__/platform-move-helper.test.ts +0 -108
  726. package/src/__tests__/platform-socket-path.test.ts +0 -52
  727. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  728. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  729. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  730. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  731. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  732. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  733. package/src/__tests__/work-item-output.test.ts +0 -150
  734. package/src/amazon/session.ts +0 -58
  735. package/src/cli/channels.ts +0 -51
  736. package/src/cli/influencer.ts +0 -319
  737. package/src/cli/integrations.ts +0 -372
  738. package/src/cli/ipc-client.ts +0 -88
  739. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  740. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  741. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  742. package/src/config/core-schema.ts +0 -434
  743. package/src/config/memory-schema.ts +0 -617
  744. package/src/daemon/auth-manager.ts +0 -106
  745. package/src/daemon/handlers/apps.ts +0 -758
  746. package/src/daemon/handlers/avatar.ts +0 -73
  747. package/src/daemon/handlers/browser.ts +0 -3
  748. package/src/daemon/handlers/computer-use.ts +0 -231
  749. package/src/daemon/handlers/config-dispatch.ts +0 -29
  750. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  751. package/src/daemon/handlers/config-inbox.ts +0 -457
  752. package/src/daemon/handlers/config-integrations.ts +0 -409
  753. package/src/daemon/handlers/config-platform.ts +0 -77
  754. package/src/daemon/handlers/config-slack.ts +0 -41
  755. package/src/daemon/handlers/config-tools.ts +0 -226
  756. package/src/daemon/handlers/config-trust.ts +0 -135
  757. package/src/daemon/handlers/config.ts +0 -64
  758. package/src/daemon/handlers/contacts.ts +0 -193
  759. package/src/daemon/handlers/diagnostics.ts +0 -382
  760. package/src/daemon/handlers/documents.ts +0 -188
  761. package/src/daemon/handlers/guardian-actions.ts +0 -82
  762. package/src/daemon/handlers/home-base.ts +0 -82
  763. package/src/daemon/handlers/index.ts +0 -222
  764. package/src/daemon/handlers/misc.ts +0 -1139
  765. package/src/daemon/handlers/navigate-settings.ts +0 -29
  766. package/src/daemon/handlers/oauth-connect.ts +0 -202
  767. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  768. package/src/daemon/handlers/publish.ts +0 -176
  769. package/src/daemon/handlers/signing.ts +0 -56
  770. package/src/daemon/handlers/subagents.ts +0 -286
  771. package/src/daemon/handlers/twitter-auth.ts +0 -220
  772. package/src/daemon/handlers/work-items.ts +0 -796
  773. package/src/daemon/handlers/workspace-files.ts +0 -84
  774. package/src/daemon/handlers.ts +0 -16
  775. package/src/daemon/ipc-blob-store.ts +0 -246
  776. package/src/daemon/ipc-contract-inventory.json +0 -348
  777. package/src/daemon/ipc-contract-inventory.ts +0 -202
  778. package/src/daemon/ipc-handler.ts +0 -120
  779. package/src/daemon/ipc-protocol.ts +0 -85
  780. package/src/daemon/ipc-validate.ts +0 -254
  781. package/src/memory/app-migration.ts +0 -114
  782. package/src/memory/channel-delivery-store.ts +0 -40
  783. package/src/memory/channel-guardian-store.ts +0 -83
  784. package/src/memory/conversation-store.ts +0 -102
  785. package/src/memory/schema-migration.ts +0 -38
  786. package/src/messaging/providers/sms/adapter.ts +0 -232
  787. package/src/messaging/providers/sms/client.ts +0 -93
  788. package/src/messaging/providers/sms/types.ts +0 -7
  789. package/src/migrations/config-merge.ts +0 -62
  790. package/src/migrations/data-layout.ts +0 -89
  791. package/src/migrations/data-merge.ts +0 -44
  792. package/src/migrations/hooks-merge.ts +0 -118
  793. package/src/migrations/index.ts +0 -6
  794. package/src/migrations/log.ts +0 -28
  795. package/src/migrations/skills-merge.ts +0 -44
  796. package/src/migrations/workspace-layout.ts +0 -94
  797. package/src/notifications/adapters/sms.ts +0 -94
  798. package/src/runtime/channel-approval-parser.ts +0 -123
  799. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  800. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  801. package/src/runtime/routes/integration-routes.ts +0 -381
  802. package/src/runtime/routes/twilio-routes.ts +0 -1251
  803. package/src/twitter/router.ts +0 -131
  804. package/src/twitter/session.ts +0 -54
  805. package/src/watcher/providers/slack.ts +0 -282
  806. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  807. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  808. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  809. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  810. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  811. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  812. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  813. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  814. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  815. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  816. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  829. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  830. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  831. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  832. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  833. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  834. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  835. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  836. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  837. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  838. /package/src/{config → prompts}/templates/USER.md +0 -0
  839. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  840. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  841. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  842. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  843. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -15,6 +15,9 @@ import {
15
15
  resolve,
16
16
  } from "node:path";
17
17
 
18
+ import { z } from "zod";
19
+
20
+ import { stripCommentLines } from "../prompts/system-prompt.js";
18
21
  import {
19
22
  extractAllText,
20
23
  getConfiguredProvider,
@@ -25,10 +28,57 @@ import { parseToolManifestFile } from "../skills/tool-manifest.js";
25
28
  import { computeSkillVersionHash } from "../skills/version-hash.js";
26
29
  import { getLogger } from "../util/logger.js";
27
30
  import { getWorkspaceSkillsDir } from "../util/platform.js";
28
- import { stripCommentLines } from "./system-prompt.js";
31
+ import { isAssistantFeatureFlagEnabled } from "./assistant-feature-flags.js";
32
+ import { getConfig } from "./loader.js";
29
33
 
30
34
  const log = getLogger("skills");
31
35
 
36
+ // ─── Zod schemas for frontmatter metadata validation ─────────────────────────
37
+
38
+ const VellumMetadataSchema = z
39
+ .object({
40
+ emoji: z.string().optional(),
41
+ os: z.array(z.string()).optional(),
42
+ requires: z
43
+ .object({
44
+ bins: z.array(z.string()).optional(),
45
+ anyBins: z.array(z.string()).optional(),
46
+ env: z.array(z.string()).optional(),
47
+ config: z.array(z.string()).optional(),
48
+ })
49
+ .optional(),
50
+ primaryEnv: z.string().optional(),
51
+ install: z
52
+ .array(
53
+ z
54
+ .object({
55
+ id: z.string(),
56
+ kind: z.enum(["brew", "node", "go", "uv", "download"]),
57
+ })
58
+ .passthrough(),
59
+ )
60
+ .optional(),
61
+ cli: z
62
+ .object({
63
+ command: z.string(),
64
+ entry: z.string(),
65
+ })
66
+ .optional(),
67
+ "display-name": z.string().optional(),
68
+ "user-invocable": z.union([z.boolean(), z.string()]).optional(),
69
+ "disable-model-invocation": z.union([z.boolean(), z.string()]).optional(),
70
+ includes: z.array(z.string()).optional(),
71
+ "credential-setup-for": z.string().optional(),
72
+ })
73
+ .passthrough();
74
+
75
+ const SkillMetadataSchema = z
76
+ .object({
77
+ emoji: z.string().optional(),
78
+ vellum: VellumMetadataSchema.optional(),
79
+ })
80
+ .passthrough();
81
+
32
82
  // ─── New interfaces for extended skill metadata ──────────────────────────────
33
83
 
34
84
  export interface SkillCliSpec {
@@ -68,6 +118,7 @@ export type SkillSource = "bundled" | "managed" | "workspace" | "extra";
68
118
  export interface SkillSummary {
69
119
  id: string;
70
120
  name: string;
121
+ displayName: string;
71
122
  description: string;
72
123
  directoryPath: string;
73
124
  skillFilePath: string;
@@ -270,9 +321,9 @@ function getSkillsIndexPath(skillsDir: string): string {
270
321
 
271
322
  interface ParsedFrontmatter {
272
323
  name: string;
324
+ displayName: string;
273
325
  description: string;
274
326
  body: string;
275
- homepage?: string;
276
327
  userInvocable: boolean;
277
328
  disableModelInvocation: boolean;
278
329
  metadata?: VellumMetadata;
@@ -280,47 +331,6 @@ interface ParsedFrontmatter {
280
331
  credentialSetupFor?: string;
281
332
  }
282
333
 
283
- function parseIncludes(
284
- raw: string | undefined,
285
- skillFilePath: string,
286
- ): string[] | undefined {
287
- if (!raw) return undefined;
288
-
289
- let parsed: unknown;
290
- try {
291
- parsed = JSON.parse(raw);
292
- } catch (err) {
293
- log.warn(
294
- { err, skillFilePath },
295
- "Failed to parse includes JSON in frontmatter",
296
- );
297
- return undefined;
298
- }
299
-
300
- if (!Array.isArray(parsed)) {
301
- log.warn({ skillFilePath }, "includes must be a JSON array");
302
- return undefined;
303
- }
304
-
305
- if (!parsed.every((item: unknown) => typeof item === "string")) {
306
- log.warn({ skillFilePath }, "includes must be an array of strings");
307
- return undefined;
308
- }
309
-
310
- // Normalize: trim, remove empty strings, deduplicate preserving first-seen order
311
- const seen = new Set<string>();
312
- const result: string[] = [];
313
- for (const item of parsed as string[]) {
314
- const trimmed = item.trim();
315
- if (trimmed.length === 0) continue;
316
- if (seen.has(trimmed)) continue;
317
- seen.add(trimmed);
318
- result.push(trimmed);
319
- }
320
-
321
- return result.length > 0 ? result : undefined;
322
- }
323
-
324
334
  function parseFrontmatter(
325
335
  content: string,
326
336
  skillFilePath: string,
@@ -343,25 +353,64 @@ function parseFrontmatter(
343
353
  return null;
344
354
  }
345
355
 
346
- // Parse new optional fields
347
- const homepage = fields.homepage?.trim() || undefined;
348
-
349
- const userInvocableRaw = fields["user-invocable"]?.trim().toLowerCase();
350
- const userInvocable = userInvocableRaw !== "false";
351
-
352
- const disableModelInvocationRaw = fields["disable-model-invocation"]
353
- ?.trim()
354
- .toLowerCase();
355
- const disableModelInvocation = disableModelInvocationRaw === "true";
356
-
357
- // Parse metadata as single-line JSON string, extract .vellum namespace
356
+ // Parse metadata as single-line JSON string, validate with Zod schema
358
357
  let metadata: VellumMetadata | undefined;
358
+ let parsedMeta: z.infer<typeof SkillMetadataSchema> | undefined;
359
+ let vellum: z.infer<typeof VellumMetadataSchema> | undefined;
360
+
359
361
  const metadataRaw = fields.metadata?.trim();
360
362
  if (metadataRaw) {
361
363
  try {
362
- const parsed = JSON.parse(metadataRaw);
363
- if (parsed && typeof parsed === "object" && parsed.vellum) {
364
- metadata = parsed.vellum as VellumMetadata;
364
+ const json = JSON.parse(metadataRaw);
365
+ const result = SkillMetadataSchema.safeParse(json);
366
+ if (result.success) {
367
+ parsedMeta = result.data;
368
+ vellum = parsedMeta.vellum;
369
+ if (parsedMeta.vellum) {
370
+ metadata = parsedMeta.vellum as VellumMetadata;
371
+ }
372
+ // Inject top-level emoji into metadata when metadata.vellum doesn't
373
+ // carry its own emoji. The Agent Skills spec places emoji at the
374
+ // top level of the metadata JSON, so bundled skills that follow
375
+ // this convention would otherwise lose their emoji value.
376
+ if (parsedMeta.emoji) {
377
+ if (metadata && !metadata.emoji) {
378
+ metadata.emoji = parsedMeta.emoji;
379
+ } else if (!metadata) {
380
+ metadata = { emoji: parsedMeta.emoji };
381
+ }
382
+ }
383
+ } else {
384
+ // Zod validation failed — fall back to raw JSON so we don't lose
385
+ // all metadata because of a single bad field value. We coerce
386
+ // critical array fields so downstream code that iterates them
387
+ // (e.g. `.join()`, `for...of`, `.some()`) won't crash.
388
+ log.warn(
389
+ { err: result.error, skillFilePath },
390
+ "Metadata failed schema validation; falling back to raw JSON",
391
+ );
392
+ parsedMeta = json;
393
+ vellum = json?.vellum;
394
+ if (json?.vellum && typeof json.vellum === "object") {
395
+ const raw = json.vellum as Record<string, unknown>;
396
+
397
+ // Coerce `os` to string[] — a bare string is wrapped in an array.
398
+ if (raw.os !== undefined) {
399
+ raw.os = Array.isArray(raw.os) ? raw.os : [raw.os];
400
+ }
401
+
402
+ // Coerce `requires` sub-fields to arrays.
403
+ if (raw.requires && typeof raw.requires === "object") {
404
+ const req = raw.requires as Record<string, unknown>;
405
+ for (const key of ["bins", "anyBins", "env", "config"] as const) {
406
+ if (req[key] !== undefined && !Array.isArray(req[key])) {
407
+ req[key] = typeof req[key] === "string" ? [req[key]] : [];
408
+ }
409
+ }
410
+ }
411
+
412
+ metadata = raw as unknown as VellumMetadata;
413
+ }
365
414
  }
366
415
  } catch (err) {
367
416
  log.warn(
@@ -371,25 +420,55 @@ function parseFrontmatter(
371
420
  }
372
421
  }
373
422
 
374
- // Read standalone emoji frontmatter field (written by buildSkillMarkdown)
375
- const emojiField = fields.emoji?.trim() || undefined;
423
+ // Read vellum-specific fields exclusively from metadata.vellum
424
+ const vellumUserInvocable = vellum?.["user-invocable"];
425
+ let userInvocable: boolean;
426
+ if (typeof vellumUserInvocable === "boolean") {
427
+ userInvocable = vellumUserInvocable;
428
+ } else if (typeof vellumUserInvocable === "string") {
429
+ userInvocable = vellumUserInvocable !== "false";
430
+ } else {
431
+ userInvocable = true;
432
+ }
433
+
434
+ const vellumDisableModelInvocation = vellum?.["disable-model-invocation"];
435
+ let disableModelInvocation: boolean;
436
+ if (typeof vellumDisableModelInvocation === "boolean") {
437
+ disableModelInvocation = vellumDisableModelInvocation;
438
+ } else if (typeof vellumDisableModelInvocation === "string") {
439
+ disableModelInvocation = vellumDisableModelInvocation === "true";
440
+ } else {
441
+ disableModelInvocation = false;
442
+ }
376
443
 
377
- // If metadata doesn't already have an emoji, inject the standalone field value
378
- if (emojiField && metadata && !metadata.emoji) {
379
- metadata.emoji = emojiField;
380
- } else if (emojiField && !metadata) {
381
- metadata = { emoji: emojiField };
444
+ let includes: string[] | undefined;
445
+ if (Array.isArray(vellum?.includes)) {
446
+ const normalized = [
447
+ ...new Set(
448
+ vellum.includes
449
+ .filter((item: unknown): item is string => typeof item === "string")
450
+ .map((s: string) => s.trim())
451
+ .filter((s: string) => s.length > 0),
452
+ ),
453
+ ];
454
+ includes = normalized.length > 0 ? normalized : undefined;
382
455
  }
383
456
 
384
- const includes = parseIncludes(fields.includes, skillFilePath);
385
457
  const credentialSetupFor =
386
- fields["credential-setup-for"]?.trim() || undefined;
458
+ typeof vellum?.["credential-setup-for"] === "string"
459
+ ? vellum["credential-setup-for"]
460
+ : undefined;
461
+
462
+ const displayName =
463
+ (typeof vellum?.["display-name"] === "string"
464
+ ? vellum["display-name"]
465
+ : undefined) ?? name;
387
466
 
388
467
  return {
389
468
  name,
469
+ displayName,
390
470
  description,
391
471
  body: stripCommentLines(body),
392
- homepage,
393
472
  userInvocable,
394
473
  disableModelInvocation,
395
474
  metadata,
@@ -536,12 +615,12 @@ function readSkillFromDirectory(
536
615
  return {
537
616
  id: basename(directoryPath),
538
617
  name: parsed.name,
618
+ displayName: parsed.displayName,
539
619
  description: parsed.description,
540
620
  directoryPath,
541
621
  skillFilePath,
542
622
  body: parsed.body,
543
623
  emoji: parsed.metadata?.emoji,
544
- homepage: parsed.homepage,
545
624
  userInvocable: parsed.userInvocable,
546
625
  disableModelInvocation: parsed.disableModelInvocation,
547
626
  source,
@@ -585,13 +664,13 @@ function readBundledSkillFromDirectory(
585
664
  return {
586
665
  id: basename(directoryPath),
587
666
  name: parsed.name,
667
+ displayName: parsed.displayName,
588
668
  description: parsed.description,
589
669
  directoryPath,
590
670
  skillFilePath,
591
671
  body: parsed.body,
592
672
  bundled: true,
593
673
  emoji: parsed.metadata?.emoji,
594
- homepage: parsed.homepage,
595
674
  userInvocable: parsed.userInvocable,
596
675
  disableModelInvocation: parsed.disableModelInvocation,
597
676
  source: "bundled",
@@ -644,12 +723,12 @@ function loadBundledSkills(): SkillSummary[] {
644
723
  skills.push({
645
724
  id: skill.id,
646
725
  name: skill.name,
726
+ displayName: skill.displayName,
647
727
  description: skill.description,
648
728
  directoryPath: skill.directoryPath,
649
729
  skillFilePath: skill.skillFilePath,
650
730
  bundled: true,
651
731
  emoji: skill.emoji,
652
- homepage: skill.homepage,
653
732
  userInvocable: skill.userInvocable,
654
733
  disableModelInvocation: skill.disableModelInvocation,
655
734
  source: "bundled",
@@ -781,12 +860,12 @@ function skillSummaryFromDefinition(
781
860
  return {
782
861
  id: skill.id,
783
862
  name: skill.name,
863
+ displayName: skill.displayName,
784
864
  description: skill.description,
785
865
  directoryPath: skill.directoryPath,
786
866
  skillFilePath: skill.skillFilePath,
787
867
  bundled: skill.bundled,
788
868
  emoji: skill.emoji,
789
- homepage: skill.homepage,
790
869
  userInvocable: skill.userInvocable,
791
870
  disableModelInvocation: skill.disableModelInvocation,
792
871
  source,
@@ -834,11 +913,11 @@ export function loadSkillCatalog(
834
913
  catalog.push({
835
914
  id,
836
915
  name: parsed.name,
916
+ displayName: parsed.displayName ?? parsed.name,
837
917
  description: parsed.description,
838
918
  directoryPath: directory,
839
919
  skillFilePath,
840
920
  emoji: parsed.metadata?.emoji,
841
- homepage: parsed.homepage,
842
921
  userInvocable: parsed.userInvocable,
843
922
  disableModelInvocation: parsed.disableModelInvocation,
844
923
  source: "extra",
@@ -930,11 +1009,11 @@ export function loadSkillCatalog(
930
1009
  const workspaceSkill: SkillSummary = {
931
1010
  id,
932
1011
  name: parsed.name,
1012
+ displayName: parsed.displayName ?? parsed.name,
933
1013
  description: parsed.description,
934
1014
  directoryPath: directory,
935
1015
  skillFilePath,
936
1016
  emoji: parsed.metadata?.emoji,
937
- homepage: parsed.homepage,
938
1017
  userInvocable: parsed.userInvocable,
939
1018
  disableModelInvocation: parsed.disableModelInvocation,
940
1019
  source: "workspace",
@@ -968,6 +1047,79 @@ export function loadSkillCatalog(
968
1047
  return catalog;
969
1048
  }
970
1049
 
1050
+ /**
1051
+ * Process feature-gated sections in skill body markdown.
1052
+ *
1053
+ * Markers:
1054
+ * <!-- feature:<flag-id>:start --> ... <!-- feature:<flag-id>:end -->
1055
+ * Content included only when the flag is enabled.
1056
+ * <!-- feature:<flag-id>:alt --> ... <!-- feature:<flag-id>:alt:end -->
1057
+ * Fallback content included only when the flag is disabled.
1058
+ */
1059
+ function applyFeatureGatedSections(body: string): string {
1060
+ const config = getConfig();
1061
+ // Match feature:*:start/end blocks
1062
+ const mainRe =
1063
+ /<!-- feature:([^:]+):start -->\n?([\s\S]*?)<!-- feature:\1:end -->\n?/g;
1064
+ // Match feature:*:alt/alt:end blocks
1065
+ const altRe =
1066
+ /<!-- feature:([^:]+):alt -->\n?([\s\S]*?)<!-- feature:\1:alt:end -->\n?/g;
1067
+
1068
+ let result = body;
1069
+
1070
+ result = result.replace(mainRe, (_match, flagId: string, content: string) => {
1071
+ const key = `feature_flags.${flagId}.enabled`;
1072
+ return isAssistantFeatureFlagEnabled(key, config) ? content : "";
1073
+ });
1074
+
1075
+ result = result.replace(altRe, (_match, flagId: string, content: string) => {
1076
+ const key = `feature_flags.${flagId}.enabled`;
1077
+ return isAssistantFeatureFlagEnabled(key, config) ? "" : content;
1078
+ });
1079
+
1080
+ return result;
1081
+ }
1082
+
1083
+ /**
1084
+ * Scan for a `references/` subdirectory within a skill directory and append
1085
+ * the contents of any `.md` files found there to the skill body. Each
1086
+ * reference file is labeled with a `--- Reference: <Name> ---` header.
1087
+ * Files are appended in alphabetical order for deterministic output.
1088
+ * Non-`.md` files are ignored. Errors are logged as warnings and the
1089
+ * original body is returned unchanged.
1090
+ */
1091
+ function appendReferenceFiles(body: string, directoryPath: string): string {
1092
+ try {
1093
+ const refsDir = join(directoryPath, "references");
1094
+ if (!existsSync(refsDir) || !statSync(refsDir).isDirectory()) {
1095
+ return body;
1096
+ }
1097
+
1098
+ const entries = readdirSync(refsDir);
1099
+ const mdFiles = entries
1100
+ .filter((f) => f.toLowerCase().endsWith(".md"))
1101
+ .sort((a, b) => a.localeCompare(b));
1102
+
1103
+ if (mdFiles.length === 0) return body;
1104
+
1105
+ let result = body;
1106
+ for (const filename of mdFiles) {
1107
+ const fileContents = readFileSync(join(refsDir, filename), "utf-8");
1108
+ const displayName = filename
1109
+ .replace(/\.md$/i, "")
1110
+ .replace(/[-_]/g, " ")
1111
+ .replace(/\b\w/g, (c) => c.toUpperCase())
1112
+ .replace(/\B\w+/g, (w) => w.toLowerCase());
1113
+ result += `\n\n--- Reference: ${displayName} ---\n${fileContents}`;
1114
+ }
1115
+
1116
+ return result;
1117
+ } catch (err) {
1118
+ log.warn({ err, directoryPath }, "Failed to read reference files");
1119
+ return body;
1120
+ }
1121
+ }
1122
+
971
1123
  function loadSkillDefinition(skill: SkillSummary): SkillLookupResult {
972
1124
  let loaded: SkillDefinition | null;
973
1125
  if (skill.bundled) {
@@ -992,6 +1144,10 @@ function loadSkillDefinition(skill: SkillSummary): SkillLookupResult {
992
1144
  }
993
1145
  // Replace {baseDir} placeholders with the actual skill directory path
994
1146
  loaded.body = loaded.body.replaceAll("{baseDir}", loaded.directoryPath);
1147
+ // Strip feature-gated sections based on assistant feature flags
1148
+ loaded.body = applyFeatureGatedSections(loaded.body);
1149
+ // Auto-load reference files from references/ subdirectory
1150
+ loaded.body = appendReferenceFiles(loaded.body, loaded.directoryPath);
995
1151
  return { skill: loaded };
996
1152
  }
997
1153
 
@@ -1020,7 +1176,9 @@ export function resolveSkillSelector(
1020
1176
  }
1021
1177
 
1022
1178
  const exactNameMatches = catalog.filter(
1023
- (skill) => skill.name.toLowerCase() === needle.toLowerCase(),
1179
+ (skill) =>
1180
+ skill.name.toLowerCase() === needle.toLowerCase() ||
1181
+ skill.displayName.toLowerCase() === needle.toLowerCase(),
1024
1182
  );
1025
1183
  if (exactNameMatches.length === 1) {
1026
1184
  return { skill: exactNameMatches[0] };
@@ -34,29 +34,10 @@ export type {
34
34
  SkillsConfig,
35
35
  SkillsInstallConfig,
36
36
  SkillsLoadConfig,
37
- SmsConfig,
37
+ SlackConfig,
38
38
  SwarmConfig,
39
39
  ThinkingConfig,
40
40
  TimeoutConfig,
41
41
  UiConfig,
42
42
  WorkspaceGitConfig,
43
43
  } from "./schema.js";
44
-
45
- /**
46
- * Legacy feature flags section (Record<string, boolean>).
47
- * Uses the key format `skills.<skillId>.enabled`.
48
- * Missing key defaults to `true` (enabled); explicit `false` only applies when
49
- * the corresponding canonical key is declared in the defaults registry.
50
- *
51
- * @deprecated Prefer `assistantFeatureFlagValues` with canonical key format
52
- * `feature_flags.<id>.enabled`. This section is kept for backward compatibility
53
- * and is still consulted by the resolver as a fallback.
54
- */
55
- export type FeatureFlags = Record<string, boolean>;
56
-
57
- /**
58
- * Assistant feature flag values using the canonical key format
59
- * `feature_flags.<id>.enabled`. Takes priority over the legacy
60
- * `featureFlags` section during resolution, for declared keys.
61
- */
62
- export type AssistantFeatureFlagValues = Record<string, boolean>;
@@ -91,8 +91,6 @@ interface SyncChannelData {
91
91
  isPrimary?: boolean;
92
92
  externalUserId?: string | null;
93
93
  externalChatId?: string | null;
94
- /** Raw (pre-canonicalization) address used for dedup fallback when matching contacts created before address normalization. */
95
- legacyAddress?: string;
96
94
  status?: ChannelStatus;
97
95
  policy?: ChannelPolicy;
98
96
  verifiedAt?: number | null;
@@ -185,7 +183,7 @@ export function upsertContact(params: {
185
183
  if (!contactId && params.channels && params.channels.length > 0) {
186
184
  for (const ch of params.channels) {
187
185
  // Primary lookup: match by (type, address)
188
- let existingChannel = db
186
+ const existingChannel = db
189
187
  .select()
190
188
  .from(contactChannels)
191
189
  .where(
@@ -196,27 +194,6 @@ export function upsertContact(params: {
196
194
  )
197
195
  .get();
198
196
 
199
- // Fallback: if the address was canonicalized, the old record may still
200
- // have the raw (non-canonical) address stored. Try matching by
201
- // legacyAddress so we update the existing contact instead of creating
202
- // a duplicate.
203
- if (
204
- !existingChannel &&
205
- ch.legacyAddress &&
206
- ch.legacyAddress.toLowerCase() !== ch.address.toLowerCase()
207
- ) {
208
- existingChannel = db
209
- .select()
210
- .from(contactChannels)
211
- .where(
212
- and(
213
- eq(contactChannels.type, ch.type),
214
- eq(contactChannels.address, ch.legacyAddress.toLowerCase()),
215
- ),
216
- )
217
- .get();
218
- }
219
-
220
197
  if (existingChannel) {
221
198
  contactId = existingChannel.contactId;
222
199
  const updateSet: Record<string, unknown> = {
@@ -283,7 +260,7 @@ function syncChannels(
283
260
  const normalizedAddress = ch.address.toLowerCase();
284
261
 
285
262
  // Check if this channel already exists for this contact
286
- let existing = db
263
+ const existing = db
287
264
  .select()
288
265
  .from(contactChannels)
289
266
  .where(
@@ -295,31 +272,8 @@ function syncChannels(
295
272
  )
296
273
  .get();
297
274
 
298
- // Fallback: the channel may have been stored with a pre-canonicalization
299
- // address. Try matching by legacyAddress to find it.
300
- if (
301
- !existing &&
302
- ch.legacyAddress &&
303
- ch.legacyAddress.toLowerCase() !== normalizedAddress
304
- ) {
305
- existing = db
306
- .select()
307
- .from(contactChannels)
308
- .where(
309
- and(
310
- eq(contactChannels.contactId, contactId),
311
- eq(contactChannels.type, ch.type),
312
- eq(contactChannels.address, ch.legacyAddress.toLowerCase()),
313
- ),
314
- )
315
- .get();
316
- }
317
-
318
275
  if (existing) {
319
276
  const updateSet: Record<string, unknown> = {};
320
- // Migrate address to canonical form if it changed
321
- if (existing.address !== normalizedAddress)
322
- updateSet.address = normalizedAddress;
323
277
  if (ch.isPrimary !== undefined) updateSet.isPrimary = ch.isPrimary;
324
278
  if (ch.externalUserId !== undefined)
325
279
  updateSet.externalUserId = ch.externalUserId;
@@ -416,6 +370,12 @@ export function searchContacts(params: {
416
370
  const contactIds = [...new Set(channelRows.map((r) => r.contactId))];
417
371
  if (contactIds.length === 0) return [];
418
372
 
373
+ // Pre-compute the sanitized query for display-name filtering so the
374
+ // loop body stays cheap.
375
+ const sanitizedQuery = params.query
376
+ ? escapeLike(params.query).toLowerCase()
377
+ : undefined;
378
+
419
379
  const results: ContactWithChannels[] = [];
420
380
  for (const id of contactIds) {
421
381
  if (results.length >= limit) break;
@@ -423,7 +383,10 @@ export function searchContacts(params: {
423
383
  if (
424
384
  contact &&
425
385
  (!params.role || contact.role === params.role) &&
426
- (!params.contactType || contact.contactType === params.contactType)
386
+ (!params.contactType || contact.contactType === params.contactType) &&
387
+ (!sanitizedQuery ||
388
+ (contact.displayName &&
389
+ contact.displayName.toLowerCase().includes(sanitizedQuery)))
427
390
  ) {
428
391
  results.push(contact);
429
392
  }
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import type { ChannelId } from "../channels/types.js";
10
- import type { GuardianBinding } from "../memory/channel-guardian-store.js";
10
+ import type { GuardianBinding } from "../memory/channel-verification-sessions.js";
11
11
  import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
12
12
  import { getLogger } from "../util/logger.js";
13
13
  import { emitContactChange } from "./contact-events.js";
@@ -180,10 +180,6 @@ export function upsertContactChannel(params: {
180
180
  address,
181
181
  externalUserId: canonicalId,
182
182
  externalChatId: params.externalChatId ?? null,
183
- legacyAddress:
184
- params.externalUserId && params.externalUserId !== address
185
- ? params.externalUserId
186
- : undefined,
187
183
  status: (params.status as ChannelStatus) ?? undefined,
188
184
  policy: (params.policy as ChannelPolicy) ?? undefined,
189
185
  inviteId: params.inviteId ?? null,
@@ -14,7 +14,5 @@ export type {
14
14
  ContactChannel,
15
15
  ContactRole,
16
16
  ContactWithChannels,
17
- MemberPolicy,
18
- MemberStatus,
19
17
  } from "./types.js";
20
18
  export { CHANNEL_TYPES } from "./types.js";
@@ -54,14 +54,6 @@ export type ChannelStatus =
54
54
  | "unverified";
55
55
  export type ChannelPolicy = "allow" | "deny" | "escalate";
56
56
 
57
- /**
58
- * Legacy aliases — semantic names used by API consumers and the ingress
59
- * pipeline. MemberStatus omits `"unverified"` because the external API maps
60
- * that value to `"pending"`.
61
- */
62
- export type MemberStatus = "pending" | "active" | "revoked" | "blocked";
63
- export type MemberPolicy = "allow" | "deny" | "escalate";
64
-
65
57
  export interface ContactChannel {
66
58
  id: string;
67
59
  contactId: string;