@vellumai/assistant 0.4.44 → 0.4.45

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 (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -225,7 +225,10 @@ mock.module("../config/assistant-feature-flags.js", () => ({
225
225
  }));
226
226
 
227
227
  mock.module("../config/skill-state.js", () => ({
228
- skillFlagKey: (skillId: string) => `feature_flags.${skillId}.enabled`,
228
+ skillFlagKey: (skill: { featureFlag?: string }) =>
229
+ skill.featureFlag
230
+ ? `feature_flags.${skill.featureFlag}.enabled`
231
+ : undefined,
229
232
  }));
230
233
 
231
234
  // ---------------------------------------------------------------------------
@@ -320,7 +323,7 @@ describe("projectSkillTools", () => {
320
323
  expect(result.allowedToolNames.size).toBe(0);
321
324
  });
322
325
 
323
- test("active skill with valid manifest returns tool definitions", () => {
326
+ test("active skill with valid manifest returns empty tool definitions but populates allowedToolNames", () => {
324
327
  mockCatalog = [makeSkill("deploy")];
325
328
  mockManifests = { deploy: makeManifest(["deploy_run", "deploy_status"]) };
326
329
 
@@ -332,11 +335,8 @@ describe("projectSkillTools", () => {
332
335
  previouslyActiveSkillIds: sessionState,
333
336
  });
334
337
 
335
- expect(result.toolDefinitions).toHaveLength(2);
336
- expect(result.toolDefinitions.map((d) => d.name)).toEqual([
337
- "deploy_run",
338
- "deploy_status",
339
- ]);
338
+ // Tool definitions are no longer sent to the LLM — tools are invoked via skill_execute dispatch.
339
+ expect(result.toolDefinitions).toEqual([]);
340
340
  expect(result.allowedToolNames).toEqual(
341
341
  new Set(["deploy_run", "deploy_status"]),
342
342
  );
@@ -358,7 +358,7 @@ describe("projectSkillTools", () => {
358
358
  previouslyActiveSkillIds: sessionState,
359
359
  });
360
360
 
361
- expect(result.toolDefinitions).toHaveLength(2);
361
+ expect(result.toolDefinitions).toEqual([]);
362
362
  expect(result.allowedToolNames).toEqual(
363
363
  new Set(["deploy_run", "oncall_page"]),
364
364
  );
@@ -381,7 +381,7 @@ describe("projectSkillTools", () => {
381
381
  previouslyActiveSkillIds: sessionState,
382
382
  });
383
383
 
384
- expect(result.toolDefinitions).toHaveLength(2);
384
+ expect(result.toolDefinitions).toEqual([]);
385
385
  expect(result.allowedToolNames).toEqual(
386
386
  new Set(["deploy_run", "oncall_page"]),
387
387
  );
@@ -469,8 +469,7 @@ describe("projectSkillTools", () => {
469
469
  const result2 = projectSkillTools(history, {
470
470
  previouslyActiveSkillIds: sessionState,
471
471
  });
472
- expect(result2.toolDefinitions).toHaveLength(1);
473
- expect(result2.toolDefinitions[0].name).toBe("deploy_run");
472
+ expect(result2.toolDefinitions).toEqual([]);
474
473
  expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
475
474
  expect(sessionState.has("deploy")).toBe(true);
476
475
 
@@ -499,8 +498,8 @@ describe("projectSkillTools", () => {
499
498
  const result2 = projectSkillTools(history, {
500
499
  previouslyActiveSkillIds: sessionState,
501
500
  });
502
- expect(result2.toolDefinitions).toHaveLength(1);
503
- expect(result2.toolDefinitions[0].name).toBe("deploy_run");
501
+ expect(result2.toolDefinitions).toEqual([]);
502
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
504
503
  expect(sessionState.has("deploy")).toBe(true);
505
504
  expect(mockRegisteredTools.has("deploy")).toBe(true);
506
505
  });
@@ -533,7 +532,8 @@ describe("projectSkillTools", () => {
533
532
  const result3 = projectSkillTools(history, {
534
533
  previouslyActiveSkillIds: sessionState,
535
534
  });
536
- expect(result3.toolDefinitions).toHaveLength(1);
535
+ expect(result3.toolDefinitions).toEqual([]);
536
+ expect(result3.allowedToolNames.has("deploy_run")).toBe(true);
537
537
  expect(sessionState.has("deploy")).toBe(true);
538
538
  // Ref count should be exactly 1, not 2
539
539
  expect(mockSkillRefCount.get("deploy")).toBe(1);
@@ -560,8 +560,8 @@ describe("projectSkillTools", () => {
560
560
  const result2 = projectSkillTools(history, {
561
561
  previouslyActiveSkillIds: sessionState,
562
562
  });
563
- expect(result2.toolDefinitions).toHaveLength(1);
564
- expect(result2.toolDefinitions[0].name).toBe("deploy_run");
563
+ expect(result2.toolDefinitions).toEqual([]);
564
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
565
565
  expect(sessionState.get("deploy")).toBe("v1:hash-bbb");
566
566
  // Unregister was called for the stale version
567
567
  expect(mockUnregisteredSkillIds).toContain("deploy");
@@ -587,7 +587,8 @@ describe("projectSkillTools", () => {
587
587
  const result2 = projectSkillTools(history, {
588
588
  previouslyActiveSkillIds: sessionState,
589
589
  });
590
- expect(result2.toolDefinitions).toHaveLength(1);
590
+ expect(result2.toolDefinitions).toEqual([]);
591
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
591
592
  expect(mockUnregisteredSkillIds).not.toContain("deploy");
592
593
  // Ref count should still be 1 (no additional registration)
593
594
  expect(mockSkillRefCount.get("deploy")).toBe(1);
@@ -607,7 +608,7 @@ describe("projectSkillTools", () => {
607
608
  previouslyActiveSkillIds: sessionState,
608
609
  });
609
610
 
610
- expect(result.toolDefinitions).toHaveLength(1);
611
+ expect(result.toolDefinitions).toEqual([]);
611
612
  expect(result.allowedToolNames).toEqual(new Set(["deploy_run"]));
612
613
  });
613
614
 
@@ -620,7 +621,7 @@ describe("projectSkillTools", () => {
620
621
  previouslyActiveSkillIds: sessionState,
621
622
  });
622
623
 
623
- expect(result.toolDefinitions).toHaveLength(1);
624
+ expect(result.toolDefinitions).toEqual([]);
624
625
  expect(result.allowedToolNames).toEqual(new Set(["oncall_page"]));
625
626
  });
626
627
 
@@ -718,8 +719,10 @@ describe("projectSkillTools", () => {
718
719
  // ---------------------------------------------------------------------------
719
720
 
720
721
  describe("resolveTools callback (session wiring)", () => {
721
- // Simulates the resolveTools callback wired in the Session constructor:
722
- // (history) => [...baseToolDefs, ...projectSkillTools(history).toolDefinitions]
722
+ // Simulates the resolveTools callback wired in the Session constructor.
723
+ // Since skill tool definitions are no longer sent to the LLM (tools are
724
+ // invoked via skill_execute dispatch), the definitions array only contains
725
+ // base (core + MCP) tools. Skill tool names still appear in allowedToolNames.
723
726
  const baseToolDefs: ToolDefinition[] = [
724
727
  {
725
728
  name: "file_read",
@@ -740,6 +743,7 @@ describe("resolveTools callback (session wiring)", () => {
740
743
  const projection = projectSkillTools(history, {
741
744
  previouslyActiveSkillIds: sessionState,
742
745
  });
746
+ // projection.toolDefinitions is now always [] — skill tools are dispatched via skill_execute
743
747
  return [...base, ...projection.toolDefinitions];
744
748
  };
745
749
  }
@@ -764,7 +768,7 @@ describe("resolveTools callback (session wiring)", () => {
764
768
  expect(result.map((d) => d.name)).toEqual(["file_read", "bash"]);
765
769
  });
766
770
 
767
- test("combines base tools with projected skill tools", () => {
771
+ test("skill tools are NOT appended to definitions — only base tools returned", () => {
768
772
  mockCatalog = [makeSkill("deploy")];
769
773
  mockManifests = { deploy: makeManifest(["deploy_run", "deploy_status"]) };
770
774
 
@@ -775,16 +779,12 @@ describe("resolveTools callback (session wiring)", () => {
775
779
 
776
780
  const result = resolveTools(history);
777
781
 
778
- expect(result).toHaveLength(4);
779
- expect(result.map((d) => d.name)).toEqual([
780
- "file_read",
781
- "bash",
782
- "deploy_run",
783
- "deploy_status",
784
- ]);
782
+ // Only base tools — skill tool definitions no longer sent to LLM
783
+ expect(result).toHaveLength(2);
784
+ expect(result.map((d) => d.name)).toEqual(["file_read", "bash"]);
785
785
  });
786
786
 
787
- test("skill tools appear after base tools and do not replace them", () => {
787
+ test("base tools are unchanged even when skills are active", () => {
788
788
  mockCatalog = [makeSkill("oncall")];
789
789
  mockManifests = { oncall: makeManifest(["oncall_page"]) };
790
790
 
@@ -795,13 +795,13 @@ describe("resolveTools callback (session wiring)", () => {
795
795
 
796
796
  const result = resolveTools(history);
797
797
 
798
- // Base tools come first, skill tools are appended
798
+ // Only base tools present
799
+ expect(result).toHaveLength(2);
799
800
  expect(result[0].name).toBe("file_read");
800
801
  expect(result[1].name).toBe("bash");
801
- expect(result[2].name).toBe("oncall_page");
802
802
  });
803
803
 
804
- test("multiple skills add all their tools alongside base tools", () => {
804
+ test("multiple active skills do not add tools to definitions array", () => {
805
805
  mockCatalog = [makeSkill("deploy"), makeSkill("oncall")];
806
806
  mockManifests = {
807
807
  deploy: makeManifest(["deploy_run"]),
@@ -816,13 +816,14 @@ describe("resolveTools callback (session wiring)", () => {
816
816
 
817
817
  const result = resolveTools(history);
818
818
 
819
- expect(result).toHaveLength(5);
819
+ // Only base tools — skill tool definitions no longer in the API tools array
820
+ expect(result).toHaveLength(2);
820
821
  const names = result.map((d) => d.name);
821
822
  expect(names).toContain("file_read");
822
823
  expect(names).toContain("bash");
823
- expect(names).toContain("deploy_run");
824
- expect(names).toContain("oncall_page");
825
- expect(names).toContain("oncall_ack");
824
+ expect(names).not.toContain("deploy_run");
825
+ expect(names).not.toContain("oncall_page");
826
+ expect(names).not.toContain("oncall_ack");
826
827
  });
827
828
  });
828
829
 
@@ -1033,8 +1034,7 @@ describe("skill activation requires loaded_skill marker (security invariant)", (
1033
1034
  const result = projectSkillTools(history, {
1034
1035
  previouslyActiveSkillIds: sessionState,
1035
1036
  });
1036
- expect(result.toolDefinitions).toHaveLength(1);
1037
- expect(result.toolDefinitions[0].name).toBe("approved_action");
1037
+ expect(result.toolDefinitions).toEqual([]);
1038
1038
  expect(result.allowedToolNames.has("approved_action")).toBe(true);
1039
1039
  });
1040
1040
  });
@@ -1088,7 +1088,7 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1088
1088
  sessionState = new Map<string, string>();
1089
1089
  });
1090
1090
 
1091
- test("Turn 1 calls skill_load → Turn 2 sees added tool", () => {
1091
+ test("Turn 1 calls skill_load → Turn 2 skill is in allowedToolNames but NOT in tool definitions", () => {
1092
1092
  mockCatalog = [makeSkill("deploy")];
1093
1093
  mockManifests = { deploy: makeManifest(["deploy_run"]) };
1094
1094
 
@@ -1137,10 +1137,10 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1137
1137
  ];
1138
1138
 
1139
1139
  const turn2Result = resolveTools(historyTurn2);
1140
+ // Tool definitions remain stable (only base tools) — skill tools dispatched via skill_execute
1140
1141
  expect(turn2Result.toolDefinitions.map((d) => d.name)).toEqual([
1141
1142
  "file_read",
1142
1143
  "bash",
1143
- "deploy_run",
1144
1144
  ]);
1145
1145
  expect(turn2Result.allowedToolNames.has("deploy_run")).toBe(true);
1146
1146
  });
@@ -1187,13 +1187,14 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1187
1187
 
1188
1188
  const result = resolveTools(history);
1189
1189
 
1190
- // Skill tools appear without needing another user message
1191
- expect(result.toolDefinitions.map((d) => d.name)).toContain(
1190
+ // Skill tools are NOT in the definitions array — dispatched via skill_execute
1191
+ expect(result.toolDefinitions.map((d) => d.name)).not.toContain(
1192
1192
  "monitor_check",
1193
1193
  );
1194
- expect(result.toolDefinitions.map((d) => d.name)).toContain(
1194
+ expect(result.toolDefinitions.map((d) => d.name)).not.toContain(
1195
1195
  "monitor_alert",
1196
1196
  );
1197
+ // But they ARE in the allowed set (for skill_execute dispatch)
1197
1198
  expect(result.allowedToolNames.has("monitor_check")).toBe(true);
1198
1199
  expect(result.allowedToolNames.has("monitor_alert")).toBe(true);
1199
1200
 
@@ -1248,9 +1249,11 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1248
1249
 
1249
1250
  const resultA = resolveTools(historyAfterA);
1250
1251
  const namesA = resultA.toolDefinitions.map((d) => d.name);
1251
- expect(namesA).toContain("deploy_run");
1252
+ // Skill tools not in definitions — only in allowedToolNames
1253
+ expect(namesA).not.toContain("deploy_run");
1252
1254
  expect(namesA).not.toContain("oncall_page");
1253
1255
  expect(namesA).not.toContain("metrics_query");
1256
+ expect(resultA.allowedToolNames.has("deploy_run")).toBe(true);
1254
1257
 
1255
1258
  // Step 2: Load skill B (oncall) — deploy should remain active
1256
1259
  const historyAfterB: Message[] = [
@@ -1280,9 +1283,12 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1280
1283
 
1281
1284
  const resultB = resolveTools(historyAfterB);
1282
1285
  const namesB = resultB.toolDefinitions.map((d) => d.name);
1283
- expect(namesB).toContain("deploy_run");
1284
- expect(namesB).toContain("oncall_page");
1286
+ // Skill tools not in definitions
1287
+ expect(namesB).not.toContain("deploy_run");
1288
+ expect(namesB).not.toContain("oncall_page");
1285
1289
  expect(namesB).not.toContain("metrics_query");
1290
+ expect(resultB.allowedToolNames.has("deploy_run")).toBe(true);
1291
+ expect(resultB.allowedToolNames.has("oncall_page")).toBe(true);
1286
1292
 
1287
1293
  // Step 3: Load skill C (metrics) — all three should be active
1288
1294
  const historyAfterC: Message[] = [
@@ -1312,10 +1318,12 @@ describe("mid-run skill tool activation (end-to-end)", () => {
1312
1318
 
1313
1319
  const resultC = resolveTools(historyAfterC);
1314
1320
  const namesC = resultC.toolDefinitions.map((d) => d.name);
1315
- expect(namesC).toContain("deploy_run");
1316
- expect(namesC).toContain("oncall_page");
1317
- expect(namesC).toContain("metrics_query");
1318
- expect(namesC).toContain("metrics_dashboard");
1321
+ // Skill tools not in definitions — only base tools
1322
+ expect(namesC).not.toContain("deploy_run");
1323
+ expect(namesC).not.toContain("oncall_page");
1324
+ expect(namesC).not.toContain("metrics_query");
1325
+ expect(namesC).not.toContain("metrics_dashboard");
1326
+ expect(namesC).toEqual(["file_read", "bash"]);
1319
1327
 
1320
1328
  // Verify allowed tool names include all skill tools plus core tools
1321
1329
  expect(resultC.allowedToolNames.has("deploy_run")).toBe(true);
@@ -1380,7 +1388,7 @@ describe("context-derived deactivation regression", () => {
1380
1388
  sessionState = new Map<string, string>();
1381
1389
  });
1382
1390
 
1383
- test("tool definitions shrink when skill load marker is removed from history", () => {
1391
+ test("tool definitions stay stable only allowedToolNames changes when skills deactivate", () => {
1384
1392
  mockCatalog = [makeSkill("deploy"), makeSkill("oncall")];
1385
1393
  mockManifests = {
1386
1394
  deploy: makeManifest(["deploy_run"]),
@@ -1395,9 +1403,10 @@ describe("context-derived deactivation regression", () => {
1395
1403
  ...skillLoadMessages('<loaded_skill id="oncall" />'),
1396
1404
  ];
1397
1405
  const result1 = resolveTools(history1);
1398
- expect(result1.toolDefinitions).toHaveLength(5); // 2 base + 3 skill tools
1399
- expect(result1.toolDefinitions.map((d) => d.name)).toContain("oncall_page");
1400
- expect(result1.toolDefinitions.map((d) => d.name)).toContain("oncall_ack");
1406
+ // Only base tools in definitions — skill tools dispatched via skill_execute
1407
+ expect(result1.toolDefinitions).toHaveLength(2);
1408
+ expect(result1.allowedToolNames.has("oncall_page")).toBe(true);
1409
+ expect(result1.allowedToolNames.has("oncall_ack")).toBe(true);
1401
1410
 
1402
1411
  // Turn 2: oncall marker removed from history (truncated)
1403
1412
  const history2: Message[] = [
@@ -1405,15 +1414,16 @@ describe("context-derived deactivation regression", () => {
1405
1414
  ];
1406
1415
  const result2 = resolveTools(history2);
1407
1416
 
1408
- // Tool definitions should only have base + deploy tools
1409
- expect(result2.toolDefinitions).toHaveLength(3); // 2 base + 1 skill tool
1410
- expect(result2.toolDefinitions.map((d) => d.name)).not.toContain(
1411
- "oncall_page",
1412
- );
1413
- expect(result2.toolDefinitions.map((d) => d.name)).not.toContain(
1414
- "oncall_ack",
1415
- );
1416
- expect(result2.toolDefinitions.map((d) => d.name)).toContain("deploy_run");
1417
+ // Tool definitions unchanged — still only base tools
1418
+ expect(result2.toolDefinitions).toHaveLength(2);
1419
+ expect(result2.toolDefinitions.map((d) => d.name)).toEqual([
1420
+ "file_read",
1421
+ "bash",
1422
+ ]);
1423
+ // allowedToolNames reflects deactivation
1424
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
1425
+ expect(result2.allowedToolNames.has("oncall_page")).toBe(false);
1426
+ expect(result2.allowedToolNames.has("oncall_ack")).toBe(false);
1417
1427
  });
1418
1428
 
1419
1429
  test("executor blocks the tool after deactivation — allowedToolNames excludes it", () => {
@@ -1492,7 +1502,8 @@ describe("context-derived deactivation regression", () => {
1492
1502
  ...skillLoadMessages('<loaded_skill id="oncall" />'),
1493
1503
  ];
1494
1504
  const result1 = resolveTools(history1);
1495
- expect(result1.toolDefinitions).toHaveLength(4); // 2 base + 2 skill
1505
+ // Only base tools in definitions — skill tools dispatched via skill_execute
1506
+ expect(result1.toolDefinitions).toHaveLength(2);
1496
1507
 
1497
1508
  // Clear tracking before turn 2
1498
1509
  mockUnregisteredSkillIds = [];
@@ -1503,7 +1514,7 @@ describe("context-derived deactivation regression", () => {
1503
1514
  ];
1504
1515
  const result2 = resolveTools(history2);
1505
1516
 
1506
- // Only base tools remain
1517
+ // Still only base tools (same as turn 1)
1507
1518
  expect(result2.toolDefinitions).toHaveLength(2);
1508
1519
  expect(result2.toolDefinitions.map((d) => d.name)).toEqual([
1509
1520
  "file_read",
@@ -1550,7 +1561,10 @@ describe("context-derived deactivation regression", () => {
1550
1561
  ];
1551
1562
  const result3 = resolveTools(history3);
1552
1563
  expect(result3.allowedToolNames.has("deploy_run")).toBe(true);
1553
- expect(result3.toolDefinitions.map((d) => d.name)).toContain("deploy_run");
1564
+ // Skill tools not in definitions — dispatched via skill_execute
1565
+ expect(result3.toolDefinitions.map((d) => d.name)).not.toContain(
1566
+ "deploy_run",
1567
+ );
1554
1568
  });
1555
1569
  });
1556
1570
 
@@ -1573,7 +1587,7 @@ describe("slash preactivation through session processing", () => {
1573
1587
  sessionState = new Map<string, string>();
1574
1588
  });
1575
1589
 
1576
- test("slash-known skill has its tools available on first projection (turn-0)", () => {
1590
+ test("slash-known skill has its tools in allowedToolNames on first projection (turn-0)", () => {
1577
1591
  mockCatalog = [makeSkill("deploy")];
1578
1592
  mockManifests = { deploy: makeManifest(["deploy_run", "deploy_status"]) };
1579
1593
 
@@ -1586,11 +1600,8 @@ describe("slash preactivation through session processing", () => {
1586
1600
  previouslyActiveSkillIds: sessionState,
1587
1601
  });
1588
1602
 
1589
- expect(result.toolDefinitions).toHaveLength(2);
1590
- expect(result.toolDefinitions.map((d) => d.name)).toEqual([
1591
- "deploy_run",
1592
- "deploy_status",
1593
- ]);
1603
+ // Tool definitions are no longer sent to the LLM
1604
+ expect(result.toolDefinitions).toEqual([]);
1594
1605
  expect(result.allowedToolNames).toEqual(
1595
1606
  new Set(["deploy_run", "deploy_status"]),
1596
1607
  );
@@ -1605,7 +1616,7 @@ describe("slash preactivation through session processing", () => {
1605
1616
  preactivatedSkillIds: ["deploy"],
1606
1617
  previouslyActiveSkillIds: sessionState,
1607
1618
  });
1608
- expect(result1.toolDefinitions).toHaveLength(1);
1619
+ expect(result1.toolDefinitions).toEqual([]);
1609
1620
  expect(result1.allowedToolNames.has("deploy_run")).toBe(true);
1610
1621
 
1611
1622
  // Second request: no preactivation, no history markers.
@@ -1614,7 +1625,7 @@ describe("slash preactivation through session processing", () => {
1614
1625
  previouslyActiveSkillIds: sessionState,
1615
1626
  });
1616
1627
 
1617
- expect(result2.toolDefinitions).toHaveLength(0);
1628
+ expect(result2.toolDefinitions).toEqual([]);
1618
1629
  expect(result2.allowedToolNames.has("deploy_run")).toBe(false);
1619
1630
  });
1620
1631
 
@@ -1636,7 +1647,7 @@ describe("slash preactivation through session processing", () => {
1636
1647
  previouslyActiveSkillIds: sessionState,
1637
1648
  });
1638
1649
 
1639
- expect(result.toolDefinitions).toHaveLength(2);
1650
+ expect(result.toolDefinitions).toEqual([]);
1640
1651
  expect(result.allowedToolNames).toEqual(
1641
1652
  new Set(["deploy_run", "oncall_page"]),
1642
1653
  );
@@ -1654,9 +1665,7 @@ const GMAIL_TOOL_NAMES = [
1654
1665
  "gmail_mark_read",
1655
1666
  "gmail_draft",
1656
1667
  "gmail_archive",
1657
- "gmail_batch_archive",
1658
1668
  "gmail_label",
1659
- "gmail_batch_label",
1660
1669
  "gmail_trash",
1661
1670
  "gmail_send",
1662
1671
  "gmail_unsubscribe",
@@ -1677,7 +1686,7 @@ describe("bundled skill: gmail", () => {
1677
1686
  sessionState = new Map<string, string>();
1678
1687
  });
1679
1688
 
1680
- test("gmail skill activation via loaded_skill marker projects all 12 tool definitions", () => {
1689
+ test("gmail skill activation via loaded_skill marker registers all 11 tools in allowedToolNames", () => {
1681
1690
  mockCatalog = [makeSkill("gmail", "/path/to/bundled-skills/gmail")];
1682
1691
  mockManifests = { gmail: makeManifest([...GMAIL_TOOL_NAMES]) };
1683
1692
 
@@ -1689,10 +1698,7 @@ describe("bundled skill: gmail", () => {
1689
1698
  previouslyActiveSkillIds: sessionState,
1690
1699
  });
1691
1700
 
1692
- expect(result.toolDefinitions).toHaveLength(12);
1693
- expect(result.toolDefinitions.map((d) => d.name)).toEqual([
1694
- ...GMAIL_TOOL_NAMES,
1695
- ]);
1701
+ expect(result.toolDefinitions).toEqual([]);
1696
1702
  expect(result.allowedToolNames).toEqual(new Set(GMAIL_TOOL_NAMES));
1697
1703
  });
1698
1704
 
@@ -1732,7 +1738,7 @@ describe("bundled skill: claude-code", () => {
1732
1738
  sessionState = new Map<string, string>();
1733
1739
  });
1734
1740
 
1735
- test("claude-code skill activation produces claude_code tool definition", () => {
1741
+ test("claude-code skill activation registers claude_code in allowedToolNames", () => {
1736
1742
  mockCatalog = [
1737
1743
  makeSkill("claude-code", "/path/to/bundled-skills/claude-code"),
1738
1744
  ];
@@ -1746,8 +1752,7 @@ describe("bundled skill: claude-code", () => {
1746
1752
  previouslyActiveSkillIds: sessionState,
1747
1753
  });
1748
1754
 
1749
- expect(result.toolDefinitions).toHaveLength(1);
1750
- expect(result.toolDefinitions[0].name).toBe("claude_code");
1755
+ expect(result.toolDefinitions).toEqual([]);
1751
1756
  expect(result.allowedToolNames).toEqual(new Set(["claude_code"]));
1752
1757
  });
1753
1758
 
@@ -1800,7 +1805,7 @@ describe("bundled skill: app-builder", () => {
1800
1805
  sessionState = new Map<string, string>();
1801
1806
  });
1802
1807
 
1803
- test("app-builder skill activation projects all 9 canonical non-proxy tool definitions", () => {
1808
+ test("app-builder skill activation registers all 9 canonical non-proxy tools in allowedToolNames", () => {
1804
1809
  mockCatalog = [
1805
1810
  makeSkill("app-builder", "/path/to/bundled-skills/app-builder"),
1806
1811
  ];
@@ -1816,10 +1821,7 @@ describe("bundled skill: app-builder", () => {
1816
1821
  previouslyActiveSkillIds: sessionState,
1817
1822
  });
1818
1823
 
1819
- expect(result.toolDefinitions).toHaveLength(9);
1820
- expect(result.toolDefinitions.map((d) => d.name)).toEqual([
1821
- ...APP_BUILDER_TOOL_NAMES,
1822
- ]);
1824
+ expect(result.toolDefinitions).toEqual([]);
1823
1825
  expect(result.allowedToolNames).toEqual(new Set(APP_BUILDER_TOOL_NAMES));
1824
1826
  });
1825
1827
 
@@ -1890,7 +1892,7 @@ describe("bundled skill: browser", () => {
1890
1892
  sessionState = new Map<string, string>();
1891
1893
  });
1892
1894
 
1893
- test("browser skill activation via loaded_skill marker projects all 14 tool definitions", () => {
1895
+ test("browser skill activation via loaded_skill marker registers all 14 tools in allowedToolNames", () => {
1894
1896
  mockCatalog = [makeSkill("browser", "/path/to/bundled-skills/browser")];
1895
1897
  mockManifests = { browser: makeManifest([...BROWSER_TOOL_NAMES]) };
1896
1898
 
@@ -1902,10 +1904,7 @@ describe("bundled skill: browser", () => {
1902
1904
  previouslyActiveSkillIds: sessionState,
1903
1905
  });
1904
1906
 
1905
- expect(result.toolDefinitions).toHaveLength(14);
1906
- expect(result.toolDefinitions.map((d) => d.name)).toEqual([
1907
- ...BROWSER_TOOL_NAMES,
1908
- ]);
1907
+ expect(result.toolDefinitions).toEqual([]);
1909
1908
  expect(result.allowedToolNames).toEqual(new Set(BROWSER_TOOL_NAMES));
1910
1909
  });
1911
1910
 
@@ -1980,8 +1979,8 @@ describe("tamper detection", () => {
1980
1979
  const result1 = projectSkillTools(history, {
1981
1980
  previouslyActiveSkillIds: sessionState,
1982
1981
  });
1983
- expect(result1.toolDefinitions).toHaveLength(1);
1984
- expect(result1.toolDefinitions[0].name).toBe("deploy_run");
1982
+ expect(result1.toolDefinitions).toEqual([]);
1983
+ expect(result1.allowedToolNames.has("deploy_run")).toBe(true);
1985
1984
  expect(sessionState.get("deploy")).toBe("v1:original-file-hash");
1986
1985
 
1987
1986
  // Simulate file mutation on disk — the hash changes
@@ -1994,8 +1993,8 @@ describe("tamper detection", () => {
1994
1993
  });
1995
1994
 
1996
1995
  // Tools are still available (re-registered with new hash)
1997
- expect(result2.toolDefinitions).toHaveLength(1);
1998
- expect(result2.toolDefinitions[0].name).toBe("deploy_run");
1996
+ expect(result2.toolDefinitions).toEqual([]);
1997
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
1999
1998
 
2000
1999
  // Old tools were unregistered before new ones registered
2001
2000
  expect(mockUnregisteredSkillIds).toContain("deploy");
@@ -2026,7 +2025,8 @@ describe("tamper detection", () => {
2026
2025
  const result = projectSkillTools(history, {
2027
2026
  previouslyActiveSkillIds: sessionState,
2028
2027
  });
2029
- expect(result.toolDefinitions).toHaveLength(1);
2028
+ expect(result.toolDefinitions).toEqual([]);
2029
+ expect(result.allowedToolNames.has("deploy_run")).toBe(true);
2030
2030
  expect(mockUnregisteredSkillIds).not.toContain("deploy");
2031
2031
  expect(mockSkillRefCount.get("deploy")).toBe(1);
2032
2032
  }
@@ -2053,7 +2053,7 @@ describe("tamper detection", () => {
2053
2053
  previouslyActiveSkillIds: sessionState,
2054
2054
  });
2055
2055
 
2056
- expect(result.toolDefinitions).toHaveLength(2);
2056
+ expect(result.toolDefinitions).toEqual([]);
2057
2057
  expect(result.allowedToolNames).toEqual(
2058
2058
  new Set(["deploy_run", "deploy_status"]),
2059
2059
  );
@@ -2093,7 +2093,7 @@ describe("tamper detection", () => {
2093
2093
  previouslyActiveSkillIds: sessionState,
2094
2094
  });
2095
2095
 
2096
- expect(result.toolDefinitions).toHaveLength(2);
2096
+ expect(result.toolDefinitions).toEqual([]);
2097
2097
  expect(result.allowedToolNames).toEqual(
2098
2098
  new Set(["deploy_run", "oncall_page"]),
2099
2099
  );
@@ -2127,7 +2127,8 @@ describe("tamper detection", () => {
2127
2127
  const result = projectSkillTools(history, {
2128
2128
  previouslyActiveSkillIds: sessionState,
2129
2129
  });
2130
- expect(result.toolDefinitions).toHaveLength(1);
2130
+ expect(result.toolDefinitions).toEqual([]);
2131
+ expect(result.allowedToolNames.has("deploy_run")).toBe(true);
2131
2132
 
2132
2133
  // The exception triggers re-registration since the fallback hash
2133
2134
  // (`unknown-<timestamp>`) will never match the stored hash
@@ -2219,8 +2220,7 @@ describe("versioned markers through session projection", () => {
2219
2220
  previouslyActiveSkillIds: sessionState,
2220
2221
  });
2221
2222
 
2222
- expect(result.toolDefinitions).toHaveLength(1);
2223
- expect(result.toolDefinitions[0].name).toBe("deploy_run");
2223
+ expect(result.toolDefinitions).toEqual([]);
2224
2224
  expect(result.allowedToolNames).toEqual(new Set(["deploy_run"]));
2225
2225
  });
2226
2226
 
@@ -2242,7 +2242,7 @@ describe("versioned markers through session projection", () => {
2242
2242
  previouslyActiveSkillIds: sessionState,
2243
2243
  });
2244
2244
 
2245
- expect(result.toolDefinitions).toHaveLength(2);
2245
+ expect(result.toolDefinitions).toEqual([]);
2246
2246
  expect(result.allowedToolNames).toEqual(
2247
2247
  new Set(["deploy_run", "oncall_page"]),
2248
2248
  );
@@ -2303,7 +2303,8 @@ describe("hash change re-prompt regressions (PR 35)", () => {
2303
2303
  const result1 = projectSkillTools(history, {
2304
2304
  previouslyActiveSkillIds: sessionState,
2305
2305
  });
2306
- expect(result1.toolDefinitions).toHaveLength(1);
2306
+ expect(result1.toolDefinitions).toEqual([]);
2307
+ expect(result1.allowedToolNames.has("deploy_run")).toBe(true);
2307
2308
  expect(sessionState.get("deploy")).toBe("v1:approved-hash");
2308
2309
  expect(mockSkillRefCount.get("deploy")).toBe(1);
2309
2310
 
@@ -2316,8 +2317,8 @@ describe("hash change re-prompt regressions (PR 35)", () => {
2316
2317
  previouslyActiveSkillIds: sessionState,
2317
2318
  });
2318
2319
 
2319
- expect(result2.toolDefinitions).toHaveLength(1);
2320
- expect(result2.toolDefinitions[0].name).toBe("deploy_run");
2320
+ expect(result2.toolDefinitions).toEqual([]);
2321
+ expect(result2.allowedToolNames.has("deploy_run")).toBe(true);
2321
2322
 
2322
2323
  // Old version was unregistered
2323
2324
  expect(mockUnregisteredSkillIds).toContain("deploy");
@@ -2580,8 +2581,7 @@ describe("includes metadata does not auto-activate child skill tools", () => {
2580
2581
  });
2581
2582
 
2582
2583
  // Only parent tools should be projected
2583
- expect(result.toolDefinitions).toHaveLength(1);
2584
- expect(result.toolDefinitions[0].name).toBe("parent_action");
2584
+ expect(result.toolDefinitions).toEqual([]);
2585
2585
  expect(result.allowedToolNames).toEqual(new Set(["parent_action"]));
2586
2586
 
2587
2587
  // Child tools must NOT be present
@@ -2608,7 +2608,7 @@ describe("includes metadata does not auto-activate child skill tools", () => {
2608
2608
  previouslyActiveSkillIds: sessionState,
2609
2609
  });
2610
2610
 
2611
- expect(result.toolDefinitions).toHaveLength(2);
2611
+ expect(result.toolDefinitions).toEqual([]);
2612
2612
  expect(result.allowedToolNames).toEqual(
2613
2613
  new Set(["parent_action", "child_action"]),
2614
2614
  );
@@ -2636,8 +2636,8 @@ describe("includes metadata does not auto-activate child skill tools", () => {
2636
2636
  previouslyActiveSkillIds: sessionState,
2637
2637
  });
2638
2638
 
2639
- expect(result.toolDefinitions).toHaveLength(1);
2640
- expect(result.toolDefinitions[0].name).toBe("gp_action");
2639
+ expect(result.toolDefinitions).toEqual([]);
2640
+ expect(result.allowedToolNames.has("gp_action")).toBe(true);
2641
2641
  expect(result.allowedToolNames.has("parent_action")).toBe(false);
2642
2642
  expect(result.allowedToolNames.has("child_action")).toBe(false);
2643
2643
  });
@@ -18,7 +18,6 @@ mock.module("../util/logger.js", () => ({
18
18
  }));
19
19
 
20
20
  mock.module("../util/platform.js", () => ({
21
- getSocketPath: () => "/tmp/test.sock",
22
21
  getDataDir: () => "/tmp",
23
22
  }));
24
23
 
@@ -18,7 +18,6 @@ mock.module("../util/logger.js", () => ({
18
18
  }));
19
19
 
20
20
  mock.module("../util/platform.js", () => ({
21
- getSocketPath: () => "/tmp/test.sock",
22
21
  getDataDir: () => "/tmp",
23
22
  }));
24
23
 
@@ -18,7 +18,6 @@ mock.module("../util/logger.js", () => ({
18
18
  }));
19
19
 
20
20
  mock.module("../util/platform.js", () => ({
21
- getSocketPath: () => "/tmp/test.sock",
22
21
  getDataDir: () => "/tmp",
23
22
  }));
24
23