@vellumai/assistant 0.4.43 → 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 (713) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +46 -44
  3. package/README.md +15 -16
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -215
  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 -3
  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-asset.test.ts +1 -1
  40. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  41. package/src/__tests__/call-controller.test.ts +0 -1
  42. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  43. package/src/__tests__/call-domain.test.ts +0 -1
  44. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  45. package/src/__tests__/call-recovery.test.ts +0 -1
  46. package/src/__tests__/call-routes-http.test.ts +0 -1
  47. package/src/__tests__/call-store.test.ts +0 -1
  48. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  49. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  50. package/src/__tests__/channel-approvals.test.ts +1 -1
  51. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  52. package/src/__tests__/channel-guardian.test.ts +5 -7
  53. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  54. package/src/__tests__/checker.test.ts +32 -36
  55. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  56. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  57. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  58. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  59. package/src/__tests__/computer-use-tools.test.ts +35 -31
  60. package/src/__tests__/config-schema.test.ts +11 -15
  61. package/src/__tests__/config-watcher.test.ts +0 -1
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  63. package/src/__tests__/conflict-store.test.ts +0 -1
  64. package/src/__tests__/connection-policy.test.ts +4 -7
  65. package/src/__tests__/contacts-tools.test.ts +0 -1
  66. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  67. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  68. package/src/__tests__/context-window-manager.test.ts +147 -60
  69. package/src/__tests__/contradiction-checker.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  71. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  72. package/src/__tests__/conversation-pairing.test.ts +2 -2
  73. package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
  74. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  75. package/src/__tests__/conversation-store.test.ts +0 -1
  76. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  77. package/src/__tests__/credential-security-invariants.test.ts +8 -8
  78. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  79. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  80. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  81. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  82. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  83. package/src/__tests__/diagnostics-export.test.ts +189 -0
  84. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  86. package/src/__tests__/entity-extractor.test.ts +0 -1
  87. package/src/__tests__/entity-search.test.ts +0 -1
  88. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  89. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  90. package/src/__tests__/file-read-tool.test.ts +86 -0
  91. package/src/__tests__/followup-tools.test.ts +0 -1
  92. package/src/__tests__/frontmatter.test.ts +77 -34
  93. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  94. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  95. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  96. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  97. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  98. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  99. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  100. package/src/__tests__/guardian-action-store.test.ts +0 -1
  101. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  102. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  103. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  104. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  105. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  106. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  107. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  108. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  110. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  112. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  113. package/src/__tests__/host-file-proxy.test.ts +374 -0
  114. package/src/__tests__/host-shell-tool.test.ts +147 -1
  115. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  116. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  117. package/src/__tests__/integration-status.test.ts +3 -8
  118. package/src/__tests__/intent-routing.test.ts +7 -46
  119. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  120. package/src/__tests__/invite-routes-http.test.ts +0 -1
  121. package/src/__tests__/llm-usage-store.test.ts +0 -1
  122. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  123. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  124. package/src/__tests__/managed-store.test.ts +94 -21
  125. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  126. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  127. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  128. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  129. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  130. package/src/__tests__/memory-regressions.test.ts +0 -1
  131. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  132. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  133. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  134. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  136. package/src/__tests__/migration-export-http.test.ts +2 -3
  137. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  138. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  139. package/src/__tests__/migration-validate-http.test.ts +1 -2
  140. package/src/__tests__/native-web-search.test.ts +475 -0
  141. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  142. package/src/__tests__/non-member-access-request.test.ts +0 -1
  143. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  144. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  145. package/src/__tests__/notification-deep-link.test.ts +7 -7
  146. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  147. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  148. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  149. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  150. package/src/__tests__/onboarding-template-contract.test.ts +0 -10
  151. package/src/__tests__/playbook-execution.test.ts +0 -1
  152. package/src/__tests__/playbook-tools.test.ts +0 -1
  153. package/src/__tests__/profile-compiler.test.ts +0 -1
  154. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  155. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  156. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  157. package/src/__tests__/recording-handler.test.ts +30 -94
  158. package/src/__tests__/registry.test.ts +28 -35
  159. package/src/__tests__/relay-server.test.ts +0 -1
  160. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  163. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  164. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  165. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  166. package/src/__tests__/schedule-store.test.ts +441 -1
  167. package/src/__tests__/schedule-tools.test.ts +468 -7
  168. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  169. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  170. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  171. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  172. package/src/__tests__/secret-response-routing.test.ts +4 -1
  173. package/src/__tests__/send-endpoint-busy.test.ts +14 -5
  174. package/src/__tests__/send-notification-tool.test.ts +0 -7
  175. package/src/__tests__/sequence-store.test.ts +0 -1
  176. package/src/__tests__/server-history-render.test.ts +1 -2
  177. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  178. package/src/__tests__/session-agent-loop.test.ts +46 -6
  179. package/src/__tests__/session-confirmation-signals.test.ts +7 -46
  180. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  181. package/src/__tests__/session-error.test.ts +5 -14
  182. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  183. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  184. package/src/__tests__/session-media-retry.test.ts +12 -74
  185. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  186. package/src/__tests__/session-profile-injection.test.ts +2 -6
  187. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  188. package/src/__tests__/session-queue.test.ts +94 -139
  189. package/src/__tests__/session-skill-tools.test.ts +115 -115
  190. package/src/__tests__/session-slash-known.test.ts +0 -1
  191. package/src/__tests__/session-slash-queue.test.ts +0 -1
  192. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  193. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  194. package/src/__tests__/session-usage.test.ts +0 -1
  195. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  196. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  199. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  200. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  201. package/src/__tests__/skill-load-tool.test.ts +194 -2
  202. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  203. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  204. package/src/__tests__/skills.test.ts +14 -53
  205. package/src/__tests__/slack-channel-config.test.ts +0 -1
  206. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  207. package/src/__tests__/slack-skill.test.ts +1 -1
  208. package/src/__tests__/starter-task-flow.test.ts +9 -19
  209. package/src/__tests__/subagent-tools.test.ts +2 -2
  210. package/src/__tests__/system-prompt.test.ts +7 -7
  211. package/src/__tests__/task-compiler.test.ts +0 -1
  212. package/src/__tests__/task-management-tools.test.ts +0 -1
  213. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  214. package/src/__tests__/task-runner.test.ts +0 -1
  215. package/src/__tests__/task-scheduler.test.ts +0 -1
  216. package/src/__tests__/terminal-tools.test.ts +0 -1
  217. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  218. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  219. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  220. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  221. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  222. package/src/__tests__/tool-executor.test.ts +8 -86
  223. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  224. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  225. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  226. package/src/__tests__/trust-store.test.ts +84 -8
  227. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  228. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  229. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  230. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  231. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  232. package/src/__tests__/twilio-provider.test.ts +0 -1
  233. package/src/__tests__/twilio-routes.test.ts +0 -1
  234. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  235. package/src/__tests__/update-bulletin.test.ts +0 -1
  236. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  237. package/src/__tests__/usage-routes.test.ts +0 -1
  238. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  239. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  240. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  241. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  242. package/src/__tests__/web-fetch.test.ts +57 -0
  243. package/src/__tests__/workspace-git-service.test.ts +5 -14
  244. package/src/__tests__/workspace-policy.test.ts +0 -1
  245. package/src/agent/loop.ts +22 -34
  246. package/src/bundler/bundle-signer.ts +4 -4
  247. package/src/calls/call-controller.ts +1 -1
  248. package/src/calls/relay-server.ts +1 -1
  249. package/src/calls/twilio-rest.ts +1 -1
  250. package/src/calls/voice-session-bridge.ts +3 -1
  251. package/src/cli/__tests__/notifications.test.ts +3 -4
  252. package/src/cli/commands/map.ts +2 -6
  253. package/src/cli/commands/mcp.ts +73 -15
  254. package/src/cli/commands/notifications.ts +4 -4
  255. package/src/cli/commands/sessions.ts +9 -1
  256. package/src/cli/commands/skills.ts +6 -10
  257. package/src/cli/http-client.ts +2 -3
  258. package/src/cli/main-screen.tsx +10 -10
  259. package/src/cli/program.ts +0 -4
  260. package/src/cli/reference.ts +0 -2
  261. package/src/cli.ts +15 -9
  262. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  263. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  264. package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
  265. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  266. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  267. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  268. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  269. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  270. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  271. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  272. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  273. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  274. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  275. package/src/config/bundled-skills/document/SKILL.md +4 -1
  276. package/src/config/bundled-skills/doordash/SKILL.md +8 -2
  277. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
  278. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
  279. package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
  280. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  281. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  282. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  283. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  284. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  285. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  288. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  289. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  290. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  291. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  292. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  293. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  294. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  295. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  296. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  297. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  298. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  299. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  300. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  301. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  302. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  303. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  304. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  305. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  306. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  308. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  309. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  310. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  311. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  312. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  313. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  314. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  315. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  316. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  317. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  318. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  319. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  320. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  321. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  322. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  323. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  324. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  325. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  326. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  327. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  328. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  329. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  330. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  331. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  332. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  333. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  334. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  335. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  336. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  337. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  338. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  339. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  340. package/src/config/bundled-tool-registry.ts +118 -107
  341. package/src/config/env.ts +5 -2
  342. package/src/config/feature-flag-registry.json +33 -9
  343. package/src/config/loader.ts +10 -2
  344. package/src/config/schema.ts +19 -16
  345. package/src/config/schemas/inference.ts +12 -22
  346. package/src/config/schemas/memory-storage.ts +19 -1
  347. package/src/config/schemas/platform.ts +0 -16
  348. package/src/config/skill-state.ts +11 -8
  349. package/src/config/skills.ts +83 -32
  350. package/src/context/token-estimator.ts +11 -0
  351. package/src/context/window-manager.ts +180 -151
  352. package/src/daemon/computer-use-session.ts +11 -43
  353. package/src/daemon/daemon-control.ts +4 -1
  354. package/src/daemon/handlers/config-channels.ts +5 -9
  355. package/src/daemon/handlers/config-ingress.ts +0 -4
  356. package/src/daemon/handlers/config-model.ts +7 -13
  357. package/src/daemon/handlers/config-telegram.ts +4 -8
  358. package/src/daemon/handlers/config-voice.ts +2 -5
  359. package/src/daemon/handlers/dictation.ts +2 -12
  360. package/src/daemon/handlers/identity.ts +0 -105
  361. package/src/daemon/handlers/recording.ts +3 -23
  362. package/src/daemon/handlers/session-history.ts +42 -10
  363. package/src/daemon/handlers/sessions.ts +53 -72
  364. package/src/daemon/handlers/shared.ts +7 -28
  365. package/src/daemon/handlers/skills.ts +31 -27
  366. package/src/daemon/host-bash-proxy.ts +148 -0
  367. package/src/daemon/host-file-proxy.ts +135 -0
  368. package/src/daemon/lifecycle.ts +53 -41
  369. package/src/daemon/mcp-reload-service.ts +123 -0
  370. package/src/daemon/message-protocol.ts +6 -0
  371. package/src/daemon/message-types/apps.ts +0 -25
  372. package/src/daemon/message-types/browser.ts +1 -1
  373. package/src/daemon/message-types/computer-use.ts +1 -4
  374. package/src/daemon/message-types/guardian-actions.ts +1 -1
  375. package/src/daemon/message-types/host-bash.ts +18 -0
  376. package/src/daemon/message-types/host-file.ts +44 -0
  377. package/src/daemon/message-types/integrations.ts +1 -73
  378. package/src/daemon/message-types/messages.ts +15 -0
  379. package/src/daemon/message-types/schedules.ts +11 -27
  380. package/src/daemon/message-types/sessions.ts +8 -2
  381. package/src/daemon/message-types/settings.ts +1 -1
  382. package/src/daemon/message-types/shared.ts +1 -1
  383. package/src/daemon/message-types/surfaces.ts +2 -0
  384. package/src/daemon/ride-shotgun-handler.ts +35 -43
  385. package/src/daemon/seed-files.ts +3 -27
  386. package/src/daemon/server.ts +45 -28
  387. package/src/daemon/session-agent-loop-handlers.ts +72 -9
  388. package/src/daemon/session-agent-loop.ts +97 -66
  389. package/src/daemon/session-attachments.ts +1 -1
  390. package/src/daemon/session-error.ts +17 -16
  391. package/src/daemon/session-lifecycle.ts +20 -1
  392. package/src/daemon/session-media-retry.ts +1 -15
  393. package/src/daemon/session-messaging.ts +14 -6
  394. package/src/daemon/session-process.ts +36 -7
  395. package/src/daemon/session-queue-manager.ts +62 -103
  396. package/src/daemon/session-runtime-assembly.ts +27 -7
  397. package/src/daemon/session-skill-tools.ts +12 -11
  398. package/src/daemon/session-slash.ts +7 -0
  399. package/src/daemon/session-surfaces.ts +192 -118
  400. package/src/daemon/session-tool-setup.ts +146 -6
  401. package/src/daemon/session.ts +75 -37
  402. package/src/errors.ts +0 -2
  403. package/src/export/formatter.ts +6 -0
  404. package/src/mcp/mcp-oauth-provider.ts +1 -3
  405. package/src/media/avatar-router.ts +20 -28
  406. package/src/media/avatar-types.ts +7 -14
  407. package/src/media/managed-avatar-client.ts +70 -34
  408. package/src/memory/app-store.ts +0 -18
  409. package/src/memory/conversation-title-service.ts +1 -2
  410. package/src/memory/db-init.ts +16 -0
  411. package/src/memory/embedding-backend.ts +129 -27
  412. package/src/memory/embedding-gemini.test.ts +256 -0
  413. package/src/memory/embedding-gemini.ts +47 -13
  414. package/src/memory/embedding-local.ts +14 -2
  415. package/src/memory/embedding-ollama.ts +15 -2
  416. package/src/memory/embedding-openai.ts +15 -2
  417. package/src/memory/embedding-types.test.ts +116 -0
  418. package/src/memory/embedding-types.ts +61 -0
  419. package/src/memory/fingerprint.ts +1 -1
  420. package/src/memory/indexer.ts +25 -1
  421. package/src/memory/job-handlers/embedding.test.ts +258 -0
  422. package/src/memory/job-handlers/embedding.ts +81 -1
  423. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  424. package/src/memory/job-handlers/media-processing.ts +11 -1
  425. package/src/memory/job-utils.ts +21 -6
  426. package/src/memory/jobs-store.ts +5 -1
  427. package/src/memory/jobs-worker.ts +8 -0
  428. package/src/memory/message-content.ts +66 -0
  429. package/src/memory/migrations/100-core-tables.ts +1 -31
  430. package/src/memory/migrations/104-core-indexes.ts +0 -11
  431. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  432. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  433. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  434. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  435. package/src/memory/migrations/index.ts +4 -0
  436. package/src/memory/migrations/registry.ts +19 -0
  437. package/src/memory/qdrant-client.ts +158 -43
  438. package/src/memory/retriever.test.ts +0 -1
  439. package/src/memory/retriever.ts +12 -2
  440. package/src/memory/schema/infrastructure.ts +5 -37
  441. package/src/memory/search/formatting.ts +34 -9
  442. package/src/memory/search/semantic.ts +57 -2
  443. package/src/memory/search/types.ts +2 -1
  444. package/src/notifications/AGENTS.md +2 -2
  445. package/src/notifications/README.md +59 -58
  446. package/src/notifications/adapters/macos.ts +1 -1
  447. package/src/notifications/broadcaster.ts +5 -5
  448. package/src/notifications/copy-composer.ts +1 -1
  449. package/src/notifications/decision-engine.ts +2 -2
  450. package/src/notifications/destination-resolver.ts +2 -2
  451. package/src/notifications/emit-signal.ts +8 -8
  452. package/src/notifications/signal.ts +1 -1
  453. package/src/notifications/thread-seed-composer.ts +1 -1
  454. package/src/oauth/connect-orchestrator.ts +1 -1
  455. package/src/oauth/token-persistence.ts +1 -1
  456. package/src/permissions/checker.ts +12 -1
  457. package/src/permissions/defaults.ts +13 -17
  458. package/src/permissions/trust-store.ts +37 -0
  459. package/src/permissions/workspace-policy.ts +0 -1
  460. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  461. package/src/prompts/computer-use-prompt.ts +1 -1
  462. package/src/prompts/system-prompt.ts +33 -35
  463. package/src/prompts/templates/BOOTSTRAP.md +0 -3
  464. package/src/prompts/templates/SOUL.md +1 -2
  465. package/src/prompts/templates/UPDATES.md +16 -7
  466. package/src/providers/anthropic/client.ts +87 -33
  467. package/src/providers/gemini/client.ts +6 -0
  468. package/src/providers/managed-proxy/constants.ts +5 -0
  469. package/src/providers/openai/client.ts +15 -0
  470. package/src/providers/registry.ts +4 -6
  471. package/src/providers/types.ts +24 -2
  472. package/src/runtime/AGENTS.md +18 -0
  473. package/src/runtime/assistant-event-hub.ts +2 -3
  474. package/src/runtime/assistant-event.ts +4 -4
  475. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  476. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  477. package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
  478. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  479. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  480. package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
  481. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  482. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  483. package/src/runtime/auth/route-policy.ts +8 -8
  484. package/src/runtime/auth/scopes.ts +2 -1
  485. package/src/runtime/auth/subject.ts +4 -4
  486. package/src/runtime/auth/token-service.ts +1 -24
  487. package/src/runtime/auth/types.ts +3 -3
  488. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  489. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  490. package/src/runtime/guardian-action-service.ts +3 -3
  491. package/src/runtime/http-server.ts +15 -2
  492. package/src/runtime/http-types.ts +10 -0
  493. package/src/runtime/invite-service.ts +3 -3
  494. package/src/runtime/local-actor-identity.ts +17 -22
  495. package/src/runtime/middleware/error-handler.ts +14 -1
  496. package/src/runtime/pending-interactions.ts +21 -9
  497. package/src/runtime/routes/app-management-routes.ts +63 -67
  498. package/src/runtime/routes/approval-routes.ts +1 -3
  499. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  500. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  501. package/src/runtime/routes/btw-routes.ts +155 -0
  502. package/src/runtime/routes/computer-use-routes.ts +77 -31
  503. package/src/runtime/routes/conversation-routes.ts +234 -47
  504. package/src/runtime/routes/diagnostics-routes.ts +154 -43
  505. package/src/runtime/routes/documents-routes.ts +2 -2
  506. package/src/runtime/routes/global-search-routes.ts +1 -1
  507. package/src/runtime/routes/host-bash-routes.ts +83 -0
  508. package/src/runtime/routes/host-file-routes.ts +79 -0
  509. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  510. package/src/runtime/routes/log-export-routes.ts +120 -0
  511. package/src/runtime/routes/mcp-routes.ts +20 -0
  512. package/src/runtime/routes/migration-routes.ts +3 -3
  513. package/src/runtime/routes/pairing-routes.ts +1 -1
  514. package/src/runtime/routes/recording-routes.ts +6 -4
  515. package/src/runtime/routes/schedule-routes.ts +31 -5
  516. package/src/runtime/routes/session-management-routes.ts +2 -6
  517. package/src/runtime/routes/session-query-routes.ts +18 -15
  518. package/src/runtime/routes/settings-routes.ts +7 -351
  519. package/src/runtime/routes/skills-routes.ts +7 -6
  520. package/src/runtime/routes/subagents-routes.ts +4 -10
  521. package/src/runtime/routes/surface-action-routes.ts +3 -14
  522. package/src/runtime/routes/surface-content-routes.ts +22 -5
  523. package/src/runtime/routes/work-items-routes.ts +21 -25
  524. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  525. package/src/runtime/routes/workspace-utils.ts +1 -1
  526. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  527. package/src/runtime/verification-outbound-actions.ts +2 -2
  528. package/src/schedule/integration-status.ts +0 -6
  529. package/src/schedule/schedule-store.ts +234 -43
  530. package/src/schedule/scheduler.ts +73 -74
  531. package/src/security/oauth2.ts +1 -1
  532. package/src/sequence/store.ts +12 -2
  533. package/src/skills/frontmatter.ts +19 -77
  534. package/src/skills/managed-store.ts +11 -2
  535. package/src/subagent/manager.ts +5 -3
  536. package/src/tasks/ephemeral-permissions.ts +3 -5
  537. package/src/tools/AGENTS.md +37 -0
  538. package/src/tools/apps/executors.ts +0 -6
  539. package/src/tools/browser/browser-manager.ts +17 -11
  540. package/src/tools/browser/jit-auth.ts +4 -1
  541. package/src/tools/claude-code/claude-code.ts +1 -1
  542. package/src/tools/computer-use/definitions.ts +48 -60
  543. package/src/tools/document/document-tool.ts +6 -6
  544. package/src/tools/document/editor-template.ts +10 -8
  545. package/src/tools/filesystem/edit.ts +2 -1
  546. package/src/tools/filesystem/read.ts +20 -2
  547. package/src/tools/filesystem/write.ts +2 -1
  548. package/src/tools/host-filesystem/edit.ts +17 -1
  549. package/src/tools/host-filesystem/read.ts +16 -1
  550. package/src/tools/host-filesystem/write.ts +15 -1
  551. package/src/tools/host-terminal/host-shell.ts +24 -0
  552. package/src/tools/memory/definitions.ts +45 -81
  553. package/src/tools/memory/handlers.test.ts +0 -1
  554. package/src/tools/memory/handlers.ts +1 -1
  555. package/src/tools/memory/register.ts +26 -60
  556. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  557. package/src/tools/network/web-fetch.ts +7 -1
  558. package/src/tools/network/web-search.ts +2 -1
  559. package/src/tools/registry.ts +23 -0
  560. package/src/tools/schedule/create.ts +113 -5
  561. package/src/tools/schedule/list.ts +57 -15
  562. package/src/tools/schedule/update.ts +73 -3
  563. package/src/tools/shared/filesystem/image-read.ts +192 -0
  564. package/src/tools/side-effects.ts +1 -7
  565. package/src/tools/skills/delete-managed.ts +27 -64
  566. package/src/tools/skills/execute.ts +54 -0
  567. package/src/tools/skills/load.ts +127 -5
  568. package/src/tools/skills/scaffold-managed.ts +93 -172
  569. package/src/tools/subagent/message.ts +0 -7
  570. package/src/tools/subagent/spawn.ts +1 -1
  571. package/src/tools/swarm/delegate.ts +0 -3
  572. package/src/tools/system/avatar-generator.ts +13 -19
  573. package/src/tools/system/request-permission.ts +2 -1
  574. package/src/tools/terminal/safe-env.ts +1 -0
  575. package/src/tools/tool-manifest.ts +41 -47
  576. package/src/tools/types.ts +6 -2
  577. package/src/tools/ui-surface/definitions.ts +0 -55
  578. package/src/util/errors.ts +12 -10
  579. package/src/workspace/git-service.ts +0 -2
  580. package/src/__tests__/account-registry.test.ts +0 -258
  581. package/src/__tests__/email-classifier.test.ts +0 -25
  582. package/src/__tests__/gmail-integration.test.ts +0 -97
  583. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  584. package/src/__tests__/home-base-bootstrap.test.ts +0 -84
  585. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
  586. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  587. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  588. package/src/__tests__/recording-intent.test.ts +0 -985
  589. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  590. package/src/__tests__/reminder-store.test.ts +0 -350
  591. package/src/__tests__/reminder.test.ts +0 -337
  592. package/src/__tests__/scan-result-store.test.ts +0 -121
  593. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
  594. package/src/__tests__/view-image-tool.test.ts +0 -241
  595. package/src/cli/commands/amazon/cart.ts +0 -513
  596. package/src/cli/commands/amazon/checkout.ts +0 -394
  597. package/src/cli/commands/amazon/client.ts +0 -513
  598. package/src/cli/commands/amazon/index.ts +0 -920
  599. package/src/cli/commands/amazon/product-details.ts +0 -145
  600. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  601. package/src/cli/commands/amazon/search.ts +0 -76
  602. package/src/cli/commands/amazon/session.ts +0 -116
  603. package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
  604. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
  605. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
  606. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
  607. package/src/cli/commands/twitter/client.ts +0 -989
  608. package/src/cli/commands/twitter/index.ts +0 -1160
  609. package/src/cli/commands/twitter/oauth-client.ts +0 -94
  610. package/src/cli/commands/twitter/router.ts +0 -396
  611. package/src/cli/commands/twitter/session.ts +0 -121
  612. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  613. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  614. package/src/config/bundled-skills/amazon/SKILL.md +0 -137
  615. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  616. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  617. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  618. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  619. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  620. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  621. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  622. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  623. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  624. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  625. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  626. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  627. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  628. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  629. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  630. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  631. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  632. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  633. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  634. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  635. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  636. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  637. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  638. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  639. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  640. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  641. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  642. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  643. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  644. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  645. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  646. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  647. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  648. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  649. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  650. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  651. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  652. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  653. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  654. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  655. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  656. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  657. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  658. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  659. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  660. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  661. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  662. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  663. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  664. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  665. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  666. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  667. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  668. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  669. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  670. package/src/config/bundled-skills/twitter/SKILL.md +0 -319
  671. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  672. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  673. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  674. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  675. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  676. package/src/daemon/handlers/pairing.ts +0 -119
  677. package/src/daemon/handlers/session-user-message.ts +0 -961
  678. package/src/daemon/recording-executor.ts +0 -180
  679. package/src/daemon/recording-intent-fallback.ts +0 -162
  680. package/src/daemon/recording-intent.ts +0 -493
  681. package/src/home-base/app-link-store.ts +0 -78
  682. package/src/home-base/bootstrap.ts +0 -74
  683. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  684. package/src/home-base/prebuilt/index.html +0 -702
  685. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  686. package/src/home-base/prebuilt/seed.ts +0 -122
  687. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  688. package/src/memory/account-store.ts +0 -117
  689. package/src/messaging/activity-analyzer.ts +0 -76
  690. package/src/messaging/email-classifier.ts +0 -208
  691. package/src/messaging/index.ts +0 -2
  692. package/src/messaging/outreach-classifier.ts +0 -185
  693. package/src/messaging/thread-summarizer.ts +0 -346
  694. package/src/messaging/types.ts +0 -17
  695. package/src/tools/browser/x-auto-navigate.ts +0 -254
  696. package/src/tools/credentials/account-registry.ts +0 -144
  697. package/src/tools/filesystem/view-image.ts +0 -244
  698. package/src/tools/reminder/reminder-store.ts +0 -194
  699. package/src/tools/reminder/reminder.ts +0 -158
  700. package/src/tools/system/navigate-settings.ts +0 -74
  701. package/src/tools/system/open-system-settings.ts +0 -85
  702. package/src/tools/system/version.ts +0 -54
  703. package/src/twitter/platform-proxy-client.ts +0 -405
  704. package/src/util/cookie-session.ts +0 -98
  705. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  706. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  707. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  708. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  709. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  710. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  711. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  712. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  713. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -34,10 +33,6 @@ import {
34
33
  } from "../schedule/schedule-store.js";
35
34
  import { startScheduler } from "../schedule/scheduler.js";
36
35
  import { createTask } from "../tasks/task-store.js";
37
- import {
38
- getReminder,
39
- insertReminder,
40
- } from "../tools/reminder/reminder-store.js";
41
36
 
42
37
  initializeDb();
43
38
 
@@ -97,7 +92,6 @@ describe("scheduler RRULE execution", () => {
97
92
  const db = getDb();
98
93
  db.run("DELETE FROM cron_runs");
99
94
  db.run("DELETE FROM cron_jobs");
100
- db.run("DELETE FROM reminders");
101
95
  db.run("DELETE FROM task_runs");
102
96
  db.run("DELETE FROM tasks");
103
97
  db.run("DELETE FROM messages");
@@ -545,31 +539,71 @@ describe("scheduler RRULE execution", () => {
545
539
  expect(after!.lastRunAt).not.toBeNull();
546
540
  });
547
541
 
548
- test("notify reminder passes routing metadata to notifyReminder callback", async () => {
549
- const reminder = insertReminder({
550
- label: "Route this reminder",
551
- message: "Reminder body",
552
- fireAt: Date.now() - 1000,
542
+ // ── One-shot schedule tests ───────────────────────────────────────
543
+
544
+ test("one-shot execute mode fires and marks schedule as fired", async () => {
545
+ const schedule = createSchedule({
546
+ name: "One-shot execute",
547
+ message: "Execute this once",
548
+ mode: "execute",
549
+ nextRunAt: Date.now() - 1000,
550
+ // No expression = one-shot
551
+ });
552
+
553
+ expect(getSchedule(schedule.id)!.status).toBe("active");
554
+
555
+ const processedMessages: { conversationId: string; message: string }[] = [];
556
+ const processMessage = async (conversationId: string, message: string) => {
557
+ processedMessages.push({ conversationId, message });
558
+ };
559
+
560
+ const scheduler = startScheduler(
561
+ processMessage,
562
+ () => {},
563
+ () => {},
564
+ );
565
+ await new Promise((resolve) => setTimeout(resolve, 500));
566
+ scheduler.stop();
567
+
568
+ expect(
569
+ processedMessages.some((m) => m.message === "Execute this once"),
570
+ ).toBe(true);
571
+
572
+ const after = getSchedule(schedule.id);
573
+ expect(after).not.toBeNull();
574
+ expect(after!.status).toBe("fired");
575
+ expect(after!.enabled).toBe(false);
576
+
577
+ // A cron_runs entry should have been created
578
+ const runs = getScheduleRuns(schedule.id);
579
+ expect(runs.length).toBeGreaterThanOrEqual(1);
580
+ expect(runs[0].status).toBe("ok");
581
+ });
582
+
583
+ test("one-shot notify mode emits notification and marks schedule as fired", async () => {
584
+ const schedule = createSchedule({
585
+ name: "One-shot notify",
586
+ message: "Notify about this",
553
587
  mode: "notify",
588
+ nextRunAt: Date.now() - 1000,
554
589
  routingIntent: "multi_channel",
555
- routingHints: {
556
- requestedByUser: true,
557
- channelMentions: ["telegram", "slack"],
558
- },
590
+ routingHints: { channel: "slack" },
559
591
  });
560
592
 
593
+ expect(getSchedule(schedule.id)!.status).toBe("active");
594
+
561
595
  const notifyCalls: Array<{
562
596
  id: string;
563
597
  label: string;
564
598
  message: string;
565
- routingIntent: "single_channel" | "multi_channel" | "all_channels";
599
+ routingIntent: string;
566
600
  routingHints: Record<string, unknown>;
567
601
  }> = [];
568
- const notifyReminder = (payload: {
602
+ const notifyScheduleOneShot = (payload: {
569
603
  id: string;
570
604
  label: string;
571
605
  message: string;
572
- routingIntent: "single_channel" | "multi_channel" | "all_channels";
606
+ routingIntent: string;
573
607
  routingHints: Record<string, unknown>;
574
608
  }) => {
575
609
  notifyCalls.push(payload);
@@ -577,7 +611,7 @@ describe("scheduler RRULE execution", () => {
577
611
 
578
612
  const scheduler = startScheduler(
579
613
  async () => {},
580
- notifyReminder,
614
+ notifyScheduleOneShot,
581
615
  () => {},
582
616
  );
583
617
  await new Promise((resolve) => setTimeout(resolve, 500));
@@ -585,15 +619,154 @@ describe("scheduler RRULE execution", () => {
585
619
 
586
620
  expect(notifyCalls).toHaveLength(1);
587
621
  expect(notifyCalls[0]).toEqual({
588
- id: reminder.id,
589
- label: reminder.label,
590
- message: reminder.message,
622
+ id: schedule.id,
623
+ label: "One-shot notify",
624
+ message: "Notify about this",
591
625
  routingIntent: "multi_channel",
626
+ routingHints: { channel: "slack" },
627
+ });
628
+
629
+ const after = getSchedule(schedule.id);
630
+ expect(after).not.toBeNull();
631
+ expect(after!.status).toBe("fired");
632
+ expect(after!.enabled).toBe(false);
633
+ });
634
+
635
+ test("one-shot failure reverts to active for retry", async () => {
636
+ const schedule = createSchedule({
637
+ name: "One-shot fail",
638
+ message: "This will fail",
639
+ mode: "execute",
640
+ nextRunAt: Date.now() - 1000,
641
+ });
642
+
643
+ expect(getSchedule(schedule.id)!.status).toBe("active");
644
+
645
+ const processMessage = async () => {
646
+ throw new Error("Simulated failure");
647
+ };
648
+
649
+ const scheduler = startScheduler(
650
+ processMessage,
651
+ () => {},
652
+ () => {},
653
+ );
654
+ await new Promise((resolve) => setTimeout(resolve, 500));
655
+ scheduler.stop();
656
+
657
+ const after = getSchedule(schedule.id);
658
+ expect(after).not.toBeNull();
659
+ expect(after!.status).toBe("active");
660
+ expect(after!.enabled).toBe(true);
661
+ });
662
+
663
+ test("recurring + notify mode emits notification and continues recurring", async () => {
664
+ const rruleExpr = buildEveryMinuteRrule();
665
+ const schedule = createSchedule({
666
+ name: "Recurring notify",
667
+ cronExpression: rruleExpr,
668
+ message: "Recurring notification",
669
+ syntax: "rrule",
670
+ expression: rruleExpr,
671
+ mode: "notify",
672
+ routingIntent: "single_channel",
673
+ routingHints: { preferred: "email" },
674
+ });
675
+
676
+ forceScheduleDue(schedule.id);
677
+
678
+ const notifyCalls: Array<{
679
+ id: string;
680
+ label: string;
681
+ message: string;
682
+ routingIntent: string;
683
+ routingHints: Record<string, unknown>;
684
+ }> = [];
685
+ const notifyScheduleOneShot = (payload: {
686
+ id: string;
687
+ label: string;
688
+ message: string;
689
+ routingIntent: string;
690
+ routingHints: Record<string, unknown>;
691
+ }) => {
692
+ notifyCalls.push(payload);
693
+ };
694
+
695
+ const scheduler = startScheduler(
696
+ async () => {},
697
+ notifyScheduleOneShot,
698
+ () => {},
699
+ );
700
+ await new Promise((resolve) => setTimeout(resolve, 500));
701
+ scheduler.stop();
702
+
703
+ expect(notifyCalls).toHaveLength(1);
704
+ expect(notifyCalls[0]).toEqual({
705
+ id: schedule.id,
706
+ label: "Recurring notify",
707
+ message: "Recurring notification",
708
+ routingIntent: "single_channel",
709
+ routingHints: { preferred: "email" },
710
+ });
711
+
712
+ // Schedule should remain enabled and have a future nextRunAt (not fired/disabled)
713
+ const after = getSchedule(schedule.id);
714
+ expect(after).not.toBeNull();
715
+ expect(after!.enabled).toBe(true);
716
+ expect(after!.nextRunAt).toBeGreaterThan(Date.now() - 5000);
717
+ // Status should still be "active" (not "fired")
718
+ expect(after!.status).toBe("active");
719
+ });
720
+
721
+ test("one-shot notify mode passes routing intent and hints to notifier", async () => {
722
+ const schedule = createSchedule({
723
+ name: "Routing test",
724
+ message: "Check routing",
725
+ mode: "notify",
726
+ nextRunAt: Date.now() - 1000,
727
+ routingIntent: "all_channels",
592
728
  routingHints: {
593
729
  requestedByUser: true,
594
730
  channelMentions: ["telegram", "slack"],
731
+ priority: "high",
595
732
  },
596
733
  });
597
- expect(getReminder(reminder.id)?.status).toBe("fired");
734
+
735
+ const notifyCalls: Array<{
736
+ id: string;
737
+ label: string;
738
+ message: string;
739
+ routingIntent: string;
740
+ routingHints: Record<string, unknown>;
741
+ }> = [];
742
+ const notifyScheduleOneShot = (payload: {
743
+ id: string;
744
+ label: string;
745
+ message: string;
746
+ routingIntent: string;
747
+ routingHints: Record<string, unknown>;
748
+ }) => {
749
+ notifyCalls.push(payload);
750
+ };
751
+
752
+ const scheduler = startScheduler(
753
+ async () => {},
754
+ notifyScheduleOneShot,
755
+ () => {},
756
+ );
757
+ await new Promise((resolve) => setTimeout(resolve, 500));
758
+ scheduler.stop();
759
+
760
+ expect(notifyCalls).toHaveLength(1);
761
+ expect(notifyCalls[0].routingIntent).toBe("all_channels");
762
+ expect(notifyCalls[0].routingHints).toEqual({
763
+ requestedByUser: true,
764
+ channelMentions: ["telegram", "slack"],
765
+ priority: "high",
766
+ });
767
+
768
+ // Should be marked as fired
769
+ const after = getSchedule(schedule.id);
770
+ expect(after!.status).toBe("fired");
598
771
  });
599
772
  });
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -35,7 +35,6 @@ mock.module("../util/platform.js", () => ({
35
35
  isMacOS: () => process.platform === "darwin",
36
36
  isLinux: () => process.platform === "linux",
37
37
  isWindows: () => process.platform === "win32",
38
- getSocketPath: () => join(testDir, "test.sock"),
39
38
  getPidPath: () => join(testDir, "test.pid"),
40
39
  getDbPath: () => join(testDir, "test.db"),
41
40
  getLogPath: () => join(testDir, "test.log"),
@@ -1,6 +1,9 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
- import type { SecretRequest, ServerMessage } from "../daemon/message-protocol.js";
3
+ import type {
4
+ SecretRequest,
5
+ ServerMessage,
6
+ } from "../daemon/message-protocol.js";
4
7
 
5
8
  // Capture all logger calls so we can verify secret values never appear
6
9
  const logCalls: Array<{ level: string; args: unknown[] }> = [];
@@ -100,10 +103,10 @@ describe("secret prompt log hygiene", () => {
100
103
  }
101
104
  });
102
105
 
103
- test("sent IPC message contains value=undefined (value flows through IPC, not logs)", async () => {
106
+ test("sent message contains value=undefined (value flows through event, not logs)", async () => {
104
107
  const promise = prompter.prompt("svc", "tok", "Token");
105
108
  const msg = sentMessages[0] as SecretRequest & { value?: unknown };
106
- // The IPC message should NOT contain a value field
109
+ // The message should NOT contain a value field
107
110
  expect(msg.value).toBeUndefined();
108
111
  prompter.resolveSecret(msg.requestId, undefined);
109
112
  await promise;
@@ -1,6 +1,9 @@
1
1
  import { beforeEach, describe, expect, test } from "bun:test";
2
2
 
3
- import type { SecretRequest, ServerMessage } from "../daemon/message-protocol.js";
3
+ import type {
4
+ SecretRequest,
5
+ ServerMessage,
6
+ } from "../daemon/message-protocol.js";
4
7
  import type { SecretPromptResult } from "../permissions/secret-prompter.js";
5
8
  import { SecretPrompter } from "../permissions/secret-prompter.js";
6
9
 
@@ -29,7 +29,6 @@ mock.module("../util/platform.js", () => ({
29
29
  isMacOS: () => process.platform === "darwin",
30
30
  isLinux: () => process.platform === "linux",
31
31
  isWindows: () => process.platform === "win32",
32
- getSocketPath: () => join(testDir, "test.sock"),
33
32
  getPidPath: () => join(testDir, "test.pid"),
34
33
  getDbPath: () => join(testDir, "test.db"),
35
34
  getLogPath: () => join(testDir, "test.log"),
@@ -53,6 +52,7 @@ mock.module("../config/loader.js", () => ({
53
52
  memory: { enabled: false },
54
53
  rateLimit: { maxRequestsPerMinute: 0, maxTokensPerSession: 0 },
55
54
  secretDetection: { enabled: false },
55
+ contextWindow: { maxInputTokens: 200000 },
56
56
  }),
57
57
  }));
58
58
 
@@ -65,7 +65,7 @@ mock.module("../runtime/guardian-vellum-migration.js", () => ({
65
65
  // Mock local-actor-identity to return a stable guardian context that uses
66
66
  // the same principal as the canonical requests created in tests.
67
67
  mock.module("../runtime/local-actor-identity.js", () => ({
68
- resolveLocalIpcTrustContext: () => ({
68
+ resolveLocalTrustContext: () => ({
69
69
  sourceChannel: "vellum",
70
70
  trustClass: "guardian",
71
71
  guardianPrincipalId: "test-principal-id",
@@ -112,8 +112,11 @@ function makeCompletingSession(): Session {
112
112
  setCommandIntent: () => {},
113
113
  setTurnChannelContext: () => {},
114
114
  setTurnInterfaceContext: () => {},
115
- setStateSignalListener: () => {},
115
+ ensureActorScopedHistory: async () => {},
116
+ usageStats: { inputTokens: 0, outputTokens: 0, estimatedCost: 0 },
116
117
  updateClient: () => {},
118
+ setHostBashProxy: () => {},
119
+ setHostFileProxy: () => {},
117
120
  hasAnyPendingConfirmation: () => false,
118
121
  hasPendingConfirmation: () => false,
119
122
  denyAllPendingConfirmations: () => {},
@@ -165,8 +168,11 @@ function makeHangingSession(): Session {
165
168
  setCommandIntent: () => {},
166
169
  setTurnChannelContext: () => {},
167
170
  setTurnInterfaceContext: () => {},
168
- setStateSignalListener: () => {},
171
+ ensureActorScopedHistory: async () => {},
172
+ usageStats: { inputTokens: 0, outputTokens: 0, estimatedCost: 0 },
169
173
  updateClient: () => {},
174
+ setHostBashProxy: () => {},
175
+ setHostFileProxy: () => {},
170
176
  hasAnyPendingConfirmation: () => false,
171
177
  hasPendingConfirmation: () => false,
172
178
  denyAllPendingConfirmations: () => {},
@@ -246,8 +252,11 @@ function makePendingApprovalSession(
246
252
  setCommandIntent: () => {},
247
253
  setTurnChannelContext: () => {},
248
254
  setTurnInterfaceContext: () => {},
249
- setStateSignalListener: () => {},
255
+ ensureActorScopedHistory: async () => {},
256
+ usageStats: { inputTokens: 0, outputTokens: 0, estimatedCost: 0 },
250
257
  updateClient: () => {},
258
+ setHostBashProxy: () => {},
259
+ setHostFileProxy: () => {},
251
260
  hasAnyPendingConfirmation: () => pending.size > 0,
252
261
  hasPendingConfirmation: (candidateRequestId: string) =>
253
262
  pending.has(candidateRequestId),
@@ -7,9 +7,6 @@ mock.module("../notifications/emit-signal.js", () => ({
7
7
  emitNotificationSignalMock(params),
8
8
  }));
9
9
 
10
- // Import from the new canonical location (notifications skill)
11
- // Backward-compat: the messaging re-export should resolve to the same function
12
- import { run as messagingRun } from "../config/bundled-skills/messaging/tools/send-notification.js";
13
10
  import { run } from "../config/bundled-skills/notifications/tools/send-notification.js";
14
11
 
15
12
  describe("send-notification tool", () => {
@@ -85,8 +82,4 @@ describe("send-notification tool", () => {
85
82
  expect(result.content).toContain("database unavailable");
86
83
  expect(emitNotificationSignalMock).toHaveBeenCalledTimes(1);
87
84
  });
88
-
89
- test("messaging re-export resolves to the same run function", () => {
90
- expect(messagingRun).toBe(run);
91
- });
92
85
  });
@@ -11,7 +11,6 @@ mock.module("../util/platform.js", () => ({
11
11
  isMacOS: () => process.platform === "darwin",
12
12
  isLinux: () => process.platform === "linux",
13
13
  isWindows: () => process.platform === "win32",
14
- getSocketPath: () => join(testDir, "test.sock"),
15
14
  getPidPath: () => join(testDir, "test.pid"),
16
15
  getDbPath: () => join(testDir, "test.db"),
17
16
  getLogPath: () => join(testDir, "test.log"),
@@ -12,7 +12,6 @@ mock.module("../util/platform.js", () => ({
12
12
  isMacOS: () => process.platform === "darwin",
13
13
  isLinux: () => process.platform === "linux",
14
14
  isWindows: () => process.platform === "win32",
15
- getSocketPath: () => join(testDir, "test.sock"),
16
15
  getPidPath: () => join(testDir, "test.pid"),
17
16
  getDbPath: () => join(testDir, "test.db"),
18
17
  getLogPath: () => join(testDir, "test.log"),
@@ -240,7 +239,7 @@ describe("renderHistoryContent", () => {
240
239
  {
241
240
  type: "tool_use",
242
241
  id: "tu_1",
243
- name: "memory_save",
242
+ name: "memory_manage",
244
243
  input: { key: "task" },
245
244
  },
246
245
  { type: "tool_result", tool_use_id: "tu_1", content: "saved" },
@@ -13,7 +13,6 @@ mock.module("../util/logger.js", () => ({
13
13
  }));
14
14
 
15
15
  mock.module("../util/platform.js", () => ({
16
- getSocketPath: () => "/tmp/test.sock",
17
16
  getDataDir: () => "/tmp",
18
17
  }));
19
18
 
@@ -16,7 +16,6 @@ mock.module("../util/logger.js", () => ({
16
16
  }));
17
17
 
18
18
  mock.module("../util/platform.js", () => ({
19
- getSocketPath: () => "/tmp/test.sock",
20
19
  getDataDir: () => "/tmp",
21
20
  }));
22
21
 
@@ -229,12 +228,13 @@ mock.module("../daemon/session-usage.js", () => ({
229
228
  recordUsage: recordUsageMock,
230
229
  }));
231
230
 
231
+ const resolveAssistantAttachmentsMock = mock(async () => ({
232
+ assistantAttachments: [],
233
+ emittedAttachments: [],
234
+ directiveWarnings: [],
235
+ }));
232
236
  mock.module("../daemon/session-attachments.js", () => ({
233
- resolveAssistantAttachments: async () => ({
234
- assistantAttachments: [],
235
- emittedAttachments: [],
236
- directiveWarnings: [],
237
- }),
237
+ resolveAssistantAttachments: resolveAssistantAttachmentsMock,
238
238
  approveHostAttachmentRead: async () => true,
239
239
  formatAttachmentWarnings: () => "",
240
240
  }));
@@ -1506,6 +1506,46 @@ describe("session-agent-loop", () => {
1506
1506
  const sessionError = events.find((e) => e.type === "session_error");
1507
1507
  expect(sessionError).toBeUndefined();
1508
1508
  });
1509
+
1510
+ test("skips resolveAssistantAttachments when cancelled", async () => {
1511
+ const events: ServerMessage[] = [];
1512
+ const abortController = new AbortController();
1513
+ resolveAssistantAttachmentsMock.mockClear();
1514
+
1515
+ const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
1516
+ onEvent({
1517
+ type: "message_complete",
1518
+ message: {
1519
+ role: "assistant",
1520
+ content: [{ type: "text", text: "partial" }],
1521
+ },
1522
+ });
1523
+ onEvent({
1524
+ type: "usage",
1525
+ inputTokens: 100,
1526
+ outputTokens: 50,
1527
+ model: "test-model",
1528
+ providerDurationMs: 100,
1529
+ });
1530
+ // Simulate abort after processing
1531
+ abortController.abort();
1532
+ return [
1533
+ ...messages,
1534
+ {
1535
+ role: "assistant" as const,
1536
+ content: [{ type: "text", text: "partial" }] as ContentBlock[],
1537
+ },
1538
+ ];
1539
+ };
1540
+
1541
+ const ctx = makeCtx({ agentLoopRun, abortController });
1542
+ await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
1543
+
1544
+ const cancelled = events.find((e) => e.type === "generation_cancelled");
1545
+ expect(cancelled).toBeDefined();
1546
+ // resolveAssistantAttachments should NOT have been called
1547
+ expect(resolveAssistantAttachmentsMock).not.toHaveBeenCalled();
1548
+ });
1509
1549
  });
1510
1550
 
1511
1551
  describe("finally block cleanup", () => {
@@ -6,7 +6,7 @@
6
6
  * - handleConfirmationResponse emits both confirmation_state_changed and
7
7
  * assistant_activity_state events centrally
8
8
  * - emitActivityState produces monotonically increasing activityVersion
9
- * - setStateSignalListener routes signals to an external callback (HTTP/SSE)
9
+ * - sendToClient receives state signals (confirmation_state_changed, assistant_activity_state)
10
10
  * - "deny" decisions produce 'denied' state, "allow" produces 'approved'
11
11
  */
12
12
  import { mkdtempSync, rmSync } from "node:fs";
@@ -52,7 +52,6 @@ mock.module("../util/logger.js", () => ({
52
52
  }));
53
53
 
54
54
  mock.module("../util/platform.js", () => ({
55
- getSocketPath: () => join(testDir, "test.sock"),
56
55
  getDataDir: () => testDir,
57
56
  }));
58
57
 
@@ -521,40 +520,21 @@ describe("activity version ordering", () => {
521
520
  });
522
521
  });
523
522
 
524
- describe("state signal listener", () => {
525
- test("setStateSignalListener routes emitActivityState to external callback", () => {
523
+ describe("sendToClient receives state signals", () => {
524
+ test("emitActivityState delivers to sendToClient", () => {
526
525
  const clientMsgs: ServerMessage[] = [];
527
- const signalMsgs: ServerMessage[] = [];
528
-
529
526
  const session = makeSession((msg) => clientMsgs.push(msg));
530
- session.setStateSignalListener((msg) => signalMsgs.push(msg));
531
527
 
532
528
  session.emitActivityState("thinking", "message_dequeued", "assistant_turn");
533
529
 
534
- // Both sendToClient and signal listener should receive the message
535
530
  expect(
536
531
  clientMsgs.filter((m) => m.type === "assistant_activity_state"),
537
532
  ).toHaveLength(1);
538
- expect(
539
- signalMsgs.filter((m) => m.type === "assistant_activity_state"),
540
- ).toHaveLength(1);
541
-
542
- // Messages should be identical
543
- const clientMsg = clientMsgs.find(
544
- (m) => m.type === "assistant_activity_state",
545
- );
546
- const signalMsg = signalMsgs.find(
547
- (m) => m.type === "assistant_activity_state",
548
- );
549
- expect(clientMsg).toEqual(signalMsg);
550
533
  });
551
534
 
552
- test("setStateSignalListener routes emitConfirmationStateChanged to external callback", () => {
535
+ test("emitConfirmationStateChanged delivers to sendToClient", () => {
553
536
  const clientMsgs: ServerMessage[] = [];
554
- const signalMsgs: ServerMessage[] = [];
555
-
556
537
  const session = makeSession((msg) => clientMsgs.push(msg));
557
- session.setStateSignalListener((msg) => signalMsgs.push(msg));
558
538
 
559
539
  session.emitConfirmationStateChanged({
560
540
  sessionId: "conv-signals-test",
@@ -566,41 +546,22 @@ describe("state signal listener", () => {
566
546
  expect(
567
547
  clientMsgs.filter((m) => m.type === "confirmation_state_changed"),
568
548
  ).toHaveLength(1);
569
- expect(
570
- signalMsgs.filter((m) => m.type === "confirmation_state_changed"),
571
- ).toHaveLength(1);
572
549
  });
573
550
 
574
- test("without state signal listener, only sendToClient receives messages", () => {
551
+ test("handleConfirmationResponse delivers state signals to sendToClient", () => {
575
552
  const clientMsgs: ServerMessage[] = [];
576
-
577
553
  const session = makeSession((msg) => clientMsgs.push(msg));
578
- // No setStateSignalListener call
579
-
580
- session.emitActivityState("idle", "message_complete", "global");
581
-
582
- expect(
583
- clientMsgs.filter((m) => m.type === "assistant_activity_state"),
584
- ).toHaveLength(1);
585
- });
586
-
587
- test("state signal listener receives handleConfirmationResponse emissions", () => {
588
- const signalMsgs: ServerMessage[] = [];
589
-
590
- // Use no-op sendToClient (simulates HTTP session with no socket)
591
- const session = makeSession(() => {});
592
- session.setStateSignalListener((msg) => signalMsgs.push(msg));
593
554
 
594
555
  seedPendingConfirmation(session, "req-signal-confirm");
595
556
  session.handleConfirmationResponse("req-signal-confirm", "allow");
596
557
 
597
- const confirmSignal = signalMsgs.find(
558
+ const confirmSignal = clientMsgs.find(
598
559
  (m) =>
599
560
  m.type === "confirmation_state_changed" &&
600
561
  "requestId" in m &&
601
562
  (m as { requestId: string }).requestId === "req-signal-confirm",
602
563
  );
603
- const activitySignal = signalMsgs.find(
564
+ const activitySignal = clientMsgs.find(
604
565
  (m) =>
605
566
  m.type === "assistant_activity_state" &&
606
567
  "reason" in m &&
@@ -67,7 +67,6 @@ mock.module("../util/logger.js", () => ({
67
67
  }));
68
68
 
69
69
  mock.module("../util/platform.js", () => ({
70
- getSocketPath: () => "/tmp/test.sock",
71
70
  getDataDir: () => "/tmp",
72
71
  }));
73
72
 
@@ -102,11 +101,8 @@ mock.module("../config/loader.js", () => ({
102
101
  contextWindow: {
103
102
  enabled: true,
104
103
  maxInputTokens: 100000,
105
- targetInputTokens: 80000,
106
- compactThreshold: 0.8,
107
- preserveRecentUserTurns: 8,
108
- summaryMaxTokens: 512,
109
- chunkTokens: 12000,
104
+ targetBudgetRatio: 0.30,
105
+ compactThreshold: 0.8, summaryBudgetRatio: 0.05,
110
106
  overflowRecovery: {
111
107
  enabled: true,
112
108
  safetyMarginRatio: 0.05,