@vellumai/assistant 0.5.1 → 0.5.2

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 (338) hide show
  1. package/ARCHITECTURE.md +54 -54
  2. package/docs/architecture/integrations.md +62 -67
  3. package/docs/credential-execution-service.md +3 -3
  4. package/package.json +1 -1
  5. package/src/__tests__/agent-loop.test.ts +111 -0
  6. package/src/__tests__/always-loaded-tools-guard.test.ts +3 -4
  7. package/src/__tests__/app-builder-tool-scripts.test.ts +13 -151
  8. package/src/__tests__/app-dir-path-guard.test.ts +78 -0
  9. package/src/__tests__/app-executors.test.ts +1 -291
  10. package/src/__tests__/app-git-history.test.ts +4 -4
  11. package/src/__tests__/app-routes-csp.test.ts +1 -0
  12. package/src/__tests__/app-store-dir-names.test.ts +426 -0
  13. package/src/__tests__/attachments-store.test.ts +169 -21
  14. package/src/__tests__/attachments.test.ts +115 -1
  15. package/src/__tests__/btw-routes.test.ts +1 -0
  16. package/src/__tests__/canonical-guardian-store.test.ts +38 -0
  17. package/src/__tests__/channel-reply-delivery.test.ts +55 -0
  18. package/src/__tests__/checker.test.ts +54 -0
  19. package/src/__tests__/claude-code-skill-regression.test.ts +2 -0
  20. package/src/__tests__/claude-code-tool-profiles.test.ts +2 -0
  21. package/src/__tests__/compaction.benchmark.test.ts +2 -1
  22. package/src/__tests__/config-schema-cmd.test.ts +68 -21
  23. package/src/__tests__/config-schema.test.ts +1 -1
  24. package/src/__tests__/conversation-agent-loop-overflow.test.ts +149 -5
  25. package/src/__tests__/conversation-agent-loop.test.ts +290 -2
  26. package/src/__tests__/conversation-attachments.test.ts +17 -19
  27. package/src/__tests__/conversation-disk-view-integration.test.ts +277 -0
  28. package/src/__tests__/conversation-disk-view.test.ts +810 -0
  29. package/src/__tests__/conversation-error.test.ts +1 -1
  30. package/src/__tests__/conversation-fork-crud.test.ts +551 -0
  31. package/src/__tests__/conversation-fork-route.test.ts +386 -0
  32. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  33. package/src/__tests__/conversation-key-store-disk-view.test.ts +130 -0
  34. package/src/__tests__/conversation-media-retry.test.ts +8 -2
  35. package/src/__tests__/conversation-queue.test.ts +36 -1
  36. package/src/__tests__/conversation-routes-disk-view.test.ts +439 -0
  37. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  38. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -7
  39. package/src/__tests__/conversation-runtime-assembly.test.ts +17 -2
  40. package/src/__tests__/conversation-skill-tools.test.ts +4 -9
  41. package/src/__tests__/conversation-slash-commands.test.ts +149 -0
  42. package/src/__tests__/conversation-store.test.ts +24 -21
  43. package/src/__tests__/conversation-surfaces-state-update.test.ts +246 -0
  44. package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -0
  45. package/src/__tests__/conversation-title-service.test.ts +137 -0
  46. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +25 -315
  47. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +1 -0
  48. package/src/__tests__/conversation-tool-setup-side-effect-flag.test.ts +1 -0
  49. package/src/__tests__/conversation-workspace-cache-state.test.ts +44 -2
  50. package/src/__tests__/conversation-workspace-injection.test.ts +11 -0
  51. package/src/__tests__/credential-security-invariants.test.ts +3 -0
  52. package/src/__tests__/credential-vault-unit.test.ts +5 -10
  53. package/src/__tests__/cu-unified-flow.test.ts +1 -0
  54. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +241 -0
  55. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +214 -0
  56. package/src/__tests__/diagnostics-export.test.ts +70 -1
  57. package/src/__tests__/first-greeting.test.ts +80 -0
  58. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  59. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +3 -7
  60. package/src/__tests__/history-repair.test.ts +32 -10
  61. package/src/__tests__/http-conversation-lineage.test.ts +251 -0
  62. package/src/__tests__/image-source-path-reinject.test.ts +136 -0
  63. package/src/__tests__/llm-context-normalization.test.ts +1116 -0
  64. package/src/__tests__/llm-context-route-provider.test.ts +217 -0
  65. package/src/__tests__/llm-request-log-turn-query.test.ts +270 -0
  66. package/src/__tests__/media-generate-image.test.ts +47 -94
  67. package/src/__tests__/memory-lifecycle-e2e.test.ts +3 -1
  68. package/src/__tests__/memory-recall-quality.test.ts +5 -5
  69. package/src/__tests__/migration-cross-version-compatibility.test.ts +4 -1
  70. package/src/__tests__/migration-export-http.test.ts +3 -1
  71. package/src/__tests__/migration-import-commit-http.test.ts +18 -4
  72. package/src/__tests__/migration-import-preflight-http.test.ts +1 -3
  73. package/src/__tests__/mime-builder.test.ts +3 -2
  74. package/src/__tests__/non-member-access-request.test.ts +12 -1
  75. package/src/__tests__/notification-decision-identity.test.ts +52 -0
  76. package/src/__tests__/oauth-apps-routes.test.ts +103 -0
  77. package/src/__tests__/oauth-store.test.ts +115 -0
  78. package/src/__tests__/provider-error-scenarios.test.ts +1 -3
  79. package/src/__tests__/provider-failover-actual-provider.test.ts +66 -0
  80. package/src/__tests__/recording-handler.test.ts +17 -0
  81. package/src/__tests__/registry.test.ts +3 -8
  82. package/src/__tests__/relay-server.test.ts +1 -1
  83. package/src/__tests__/runtime-attachment-metadata.test.ts +7 -3
  84. package/src/__tests__/schema-transforms.test.ts +165 -5
  85. package/src/__tests__/server-history-render.test.ts +2 -2
  86. package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
  87. package/src/__tests__/slack-inbound-verification.test.ts +2 -2
  88. package/src/__tests__/starter-task-flow.test.ts +1 -0
  89. package/src/__tests__/suggestion-routes.test.ts +443 -0
  90. package/src/__tests__/swarm-conversation-integration.test.ts +1 -0
  91. package/src/__tests__/swarm-recursion.test.ts +1 -0
  92. package/src/__tests__/swarm-tool.test.ts +1 -0
  93. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -0
  94. package/src/__tests__/tool-preview-lifecycle.test.ts +32 -5
  95. package/src/__tests__/top-level-renderer.test.ts +22 -0
  96. package/src/__tests__/turn-boundary-resolution.test.ts +243 -0
  97. package/src/__tests__/web-fetch.test.ts +6 -2
  98. package/src/__tests__/workspace-migration-006-services-config.test.ts +335 -0
  99. package/src/__tests__/workspace-migration-007-web-search-provider-rename.test.ts +312 -0
  100. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +278 -0
  101. package/src/__tests__/workspace-migration-010-app-dir-rename.test.ts +275 -0
  102. package/src/__tests__/workspace-migration-012-rename-conversation-disk-view-dirs.test.ts +77 -0
  103. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +401 -0
  104. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +328 -0
  105. package/src/__tests__/workspace-migration-seed-device-id.test.ts +6 -10
  106. package/src/agent/attachments.ts +27 -1
  107. package/src/agent/loop.ts +29 -1
  108. package/src/avatar/traits-png-sync.ts +80 -25
  109. package/src/bundler/app-bundler.ts +4 -4
  110. package/src/calls/call-domain.ts +1 -0
  111. package/src/calls/voice-session-bridge.ts +1 -0
  112. package/src/cli/commands/auth.ts +92 -0
  113. package/src/cli/commands/avatar.ts +7 -6
  114. package/src/cli/commands/config.ts +2 -0
  115. package/src/cli/commands/oauth/providers.ts +29 -0
  116. package/src/cli/program.ts +12 -0
  117. package/src/cli.ts +15 -48
  118. package/src/config/bundled-skills/app-builder/SKILL.md +103 -28
  119. package/src/config/bundled-skills/app-builder/TOOLS.json +5 -199
  120. package/src/config/bundled-skills/app-builder/tools/{app-query.ts → app-refresh.ts} +2 -2
  121. package/src/config/bundled-skills/contacts/tools/google-contacts.ts +2 -3
  122. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +6 -9
  123. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +4 -6
  124. package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +2 -3
  125. package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +2 -3
  126. package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +2 -3
  127. package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +2 -3
  128. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +4 -6
  129. package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +2 -3
  130. package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +2 -3
  131. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +2 -3
  132. package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +2 -3
  133. package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -3
  134. package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +2 -3
  135. package/src/config/bundled-skills/google-calendar/tools/shared.ts +1 -1
  136. package/src/config/bundled-skills/image-studio/SKILL.md +2 -2
  137. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -2
  138. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +45 -72
  139. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +2 -2
  140. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
  141. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -3
  142. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  143. package/src/config/bundled-skills/slack/tools/shared.ts +19 -4
  144. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +2 -3
  145. package/src/config/bundled-skills/transcribe/SKILL.md +1 -1
  146. package/src/config/bundled-skills/transcribe/TOOLS.json +2 -6
  147. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +19 -83
  148. package/src/config/bundled-tool-registry.ts +2 -14
  149. package/src/config/feature-flag-registry.json +8 -0
  150. package/src/config/loader.ts +64 -0
  151. package/src/config/raw-config-utils.ts +30 -0
  152. package/src/config/schema-utils.ts +28 -7
  153. package/src/config/schema.ts +8 -0
  154. package/src/config/schemas/elevenlabs.ts +18 -0
  155. package/src/config/schemas/memory-lifecycle.ts +4 -2
  156. package/src/config/schemas/memory-storage.ts +1 -1
  157. package/src/config/schemas/services.ts +8 -6
  158. package/src/contacts/contact-store.ts +13 -6
  159. package/src/contacts/contacts-write.ts +0 -1
  160. package/src/context/window-manager.ts +13 -2
  161. package/src/daemon/conversation-agent-loop-handlers.ts +48 -7
  162. package/src/daemon/conversation-agent-loop.ts +56 -19
  163. package/src/daemon/conversation-attachments.ts +18 -36
  164. package/src/daemon/conversation-error.ts +2 -1
  165. package/src/daemon/conversation-history.ts +18 -4
  166. package/src/daemon/conversation-lifecycle.ts +39 -15
  167. package/src/daemon/conversation-messaging.ts +70 -26
  168. package/src/daemon/conversation-process.ts +58 -34
  169. package/src/daemon/conversation-runtime-assembly.ts +21 -38
  170. package/src/daemon/conversation-slash.ts +121 -256
  171. package/src/daemon/conversation-surfaces.ts +143 -20
  172. package/src/daemon/conversation-tool-setup.ts +0 -6
  173. package/src/daemon/conversation-workspace.ts +21 -1
  174. package/src/daemon/conversation.ts +51 -29
  175. package/src/daemon/first-greeting.ts +35 -0
  176. package/src/daemon/handlers/config-embeddings.ts +148 -0
  177. package/src/daemon/handlers/config-model.ts +71 -26
  178. package/src/daemon/handlers/conversations.ts +0 -23
  179. package/src/daemon/handlers/recording.ts +26 -21
  180. package/src/daemon/host-cu-proxy.ts +2 -2
  181. package/src/daemon/lifecycle.ts +106 -64
  182. package/src/daemon/message-protocol.ts +3 -0
  183. package/src/daemon/message-types/conversations.ts +19 -0
  184. package/src/daemon/message-types/messages.ts +1 -0
  185. package/src/daemon/message-types/shared.ts +2 -0
  186. package/src/daemon/message-types/surfaces.ts +2 -0
  187. package/src/daemon/message-types/upgrades.ts +23 -0
  188. package/src/daemon/server.ts +83 -12
  189. package/src/daemon/shutdown-handlers.ts +8 -5
  190. package/src/daemon/startup-error.ts +9 -0
  191. package/src/daemon/tool-side-effects.ts +11 -28
  192. package/src/events/tool-permission-telemetry-listener.ts +1 -3
  193. package/src/instrument.ts +0 -4
  194. package/src/media/app-icon-generator.ts +2 -2
  195. package/src/memory/app-git-service.ts +28 -16
  196. package/src/memory/app-store.ts +230 -41
  197. package/src/memory/attachments-store.ts +558 -130
  198. package/src/memory/conversation-attention-store.ts +70 -0
  199. package/src/memory/conversation-crud.ts +442 -3
  200. package/src/memory/conversation-directories.ts +125 -0
  201. package/src/memory/conversation-disk-view.ts +390 -0
  202. package/src/memory/conversation-key-store.ts +17 -5
  203. package/src/memory/conversation-queries.ts +5 -1
  204. package/src/memory/conversation-title-service.ts +21 -49
  205. package/src/memory/db-init.ts +28 -0
  206. package/src/memory/embedding-backend.ts +42 -53
  207. package/src/memory/embedding-gemini.test.ts +4 -4
  208. package/src/memory/embedding-local.ts +1 -3
  209. package/src/memory/embedding-ollama.ts +1 -3
  210. package/src/memory/embedding-openai.ts +1 -3
  211. package/src/memory/indexer.ts +9 -7
  212. package/src/memory/items-extractor.ts +42 -13
  213. package/src/memory/job-handlers/conversation-starters.ts +6 -1
  214. package/src/memory/job-handlers/embedding.test.ts +1 -4
  215. package/src/memory/llm-request-log-store.ts +100 -1
  216. package/src/memory/migrations/102-alter-table-columns.ts +5 -0
  217. package/src/memory/migrations/146-schedule-oneshot-routing.ts +3 -3
  218. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +66 -70
  219. package/src/memory/migrations/148-drop-reminders-table.ts +5 -9
  220. package/src/memory/migrations/160-drop-loopback-port-column.ts +1 -3
  221. package/src/memory/migrations/174-rename-thread-starters-table.ts +0 -7
  222. package/src/memory/migrations/178-oauth-providers-managed-service-config-key.ts +15 -0
  223. package/src/memory/migrations/179-llm-request-log-message-id.ts +16 -0
  224. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +66 -0
  225. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +46 -0
  226. package/src/memory/migrations/182-oauth-providers-display-metadata.ts +20 -0
  227. package/src/memory/migrations/183-add-conversation-fork-lineage.ts +22 -0
  228. package/src/memory/migrations/184-llm-request-log-provider.ts +12 -0
  229. package/src/memory/migrations/index.ts +7 -0
  230. package/src/memory/migrations/registry.ts +13 -0
  231. package/src/memory/retriever.test.ts +601 -2
  232. package/src/memory/retriever.ts +85 -9
  233. package/src/memory/schema/conversations.ts +6 -0
  234. package/src/memory/schema/infrastructure.ts +13 -7
  235. package/src/memory/schema/oauth.ts +6 -0
  236. package/src/messaging/providers/gmail/mime-builder.ts +3 -1
  237. package/src/notifications/copy-composer.ts +26 -0
  238. package/src/notifications/decision-engine.ts +14 -1
  239. package/src/notifications/emit-signal.ts +1 -1
  240. package/src/notifications/signal.ts +36 -0
  241. package/src/oauth/byo-connection.test.ts +1 -45
  242. package/src/oauth/byo-connection.ts +2 -8
  243. package/src/oauth/connect-orchestrator.ts +15 -11
  244. package/src/oauth/connection-resolver.test.ts +191 -0
  245. package/src/oauth/connection-resolver.ts +66 -38
  246. package/src/oauth/connection.ts +0 -1
  247. package/src/oauth/oauth-store.ts +97 -47
  248. package/src/oauth/platform-connection.test.ts +0 -1
  249. package/src/oauth/platform-connection.ts +11 -3
  250. package/src/oauth/seed-providers.ts +78 -3
  251. package/src/oauth/token-persistence.ts +16 -10
  252. package/src/permissions/checker.ts +71 -8
  253. package/src/prompts/templates/BOOTSTRAP.md +2 -0
  254. package/src/providers/anthropic/client.ts +8 -1
  255. package/src/providers/failover.ts +4 -1
  256. package/src/providers/gemini/client.ts +50 -0
  257. package/src/providers/model-catalog.ts +92 -0
  258. package/src/providers/model-intents.ts +29 -20
  259. package/src/providers/openai/client.ts +49 -0
  260. package/src/providers/types.ts +2 -0
  261. package/src/runtime/access-request-helper.ts +16 -7
  262. package/src/runtime/auth/credential-service.ts +3 -1
  263. package/src/runtime/auth/route-policy.ts +14 -1
  264. package/src/runtime/btw-sidechain.ts +101 -0
  265. package/src/runtime/channel-reply-delivery.ts +17 -1
  266. package/src/runtime/http-router.ts +3 -1
  267. package/src/runtime/http-server.ts +196 -141
  268. package/src/runtime/http-types.ts +1 -0
  269. package/src/runtime/migrations/vbundle-builder.ts +5 -1
  270. package/src/runtime/routes/access-request-decision.ts +41 -0
  271. package/src/runtime/routes/app-management-routes.ts +6 -3
  272. package/src/runtime/routes/app-routes.ts +7 -3
  273. package/src/runtime/routes/approval-routes.ts +1 -0
  274. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +34 -2
  275. package/src/runtime/routes/attachment-routes.ts +45 -15
  276. package/src/runtime/routes/btw-routes.ts +21 -61
  277. package/src/runtime/routes/conversation-management-routes.ts +68 -0
  278. package/src/runtime/routes/conversation-query-routes.ts +180 -10
  279. package/src/runtime/routes/conversation-routes.ts +222 -28
  280. package/src/runtime/routes/conversation-starter-routes.ts +9 -11
  281. package/src/runtime/routes/diagnostics-routes.ts +1 -0
  282. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -2
  283. package/src/runtime/routes/llm-context-normalization.ts +1199 -0
  284. package/src/runtime/routes/log-export-routes.ts +3 -0
  285. package/src/runtime/routes/memory-item-routes.test.ts +34 -0
  286. package/src/runtime/routes/memory-item-routes.ts +4 -0
  287. package/src/runtime/routes/migration-routes.ts +4 -1
  288. package/src/runtime/routes/oauth-apps.ts +291 -0
  289. package/src/runtime/routes/secret-routes.ts +28 -1
  290. package/src/runtime/routes/settings-routes.ts +14 -0
  291. package/src/runtime/routes/trace-event-routes.ts +4 -1
  292. package/src/schedule/schedule-store.ts +9 -21
  293. package/src/security/secure-keys.ts +21 -0
  294. package/src/signals/bash.ts +1 -1
  295. package/src/swarm/backend-claude-code.ts +3 -6
  296. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -2
  297. package/src/telemetry/usage-telemetry-reporter.ts +3 -1
  298. package/src/tools/AGENTS.md +6 -10
  299. package/src/tools/apps/executors.ts +17 -232
  300. package/src/tools/claude-code/claude-code.ts +2 -3
  301. package/src/tools/credentials/vault.ts +7 -12
  302. package/src/tools/host-filesystem/read.ts +13 -10
  303. package/src/tools/network/__tests__/web-search.test.ts +4 -2
  304. package/src/tools/schedule/list.ts +2 -7
  305. package/src/tools/schema-transforms.ts +5 -0
  306. package/src/tools/shared/filesystem/format-diff.ts +2 -7
  307. package/src/tools/skills/execute.ts +1 -1
  308. package/src/tools/tool-manifest.ts +0 -6
  309. package/src/tools/ui-surface/definitions.ts +2 -2
  310. package/src/util/device-id.ts +28 -5
  311. package/src/util/platform.ts +6 -0
  312. package/src/util/pricing.ts +1 -0
  313. package/src/util/retry.ts +1 -3
  314. package/src/workspace/migrations/002-backfill-installation-id.ts +23 -12
  315. package/src/workspace/migrations/003-seed-device-id.ts +3 -4
  316. package/src/workspace/migrations/006-services-config.ts +5 -0
  317. package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +12 -0
  318. package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +10 -0
  319. package/src/workspace/migrations/010-app-dir-rename.ts +223 -0
  320. package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +64 -0
  321. package/src/workspace/migrations/013-repair-conversation-disk-view.ts +11 -0
  322. package/src/workspace/migrations/rebuild-conversation-disk-view.ts +186 -0
  323. package/src/workspace/migrations/registry.ts +10 -0
  324. package/src/workspace/top-level-renderer.ts +12 -0
  325. package/src/__tests__/asset-materialize-tool.test.ts +0 -523
  326. package/src/__tests__/asset-search-tool.test.ts +0 -536
  327. package/src/__tests__/fixtures/media-reuse-fixtures.ts +0 -56
  328. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -762
  329. package/src/__tests__/media-visibility-policy.test.ts +0 -190
  330. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +0 -14
  331. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +0 -13
  332. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +0 -21
  333. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +0 -14
  334. package/src/config/bundled-skills/app-builder/tools/app-list.ts +0 -13
  335. package/src/config/bundled-skills/app-builder/tools/app-update.ts +0 -23
  336. package/src/daemon/media-visibility-policy.ts +0 -59
  337. package/src/tools/assets/materialize.ts +0 -248
  338. package/src/tools/assets/search.ts +0 -400
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "html": {
25
25
  "type": "string",
26
- "description": "Optional HTML definition for the main index.html page. If omitted, a minimal scaffold is created and you can write index.html later via app_file_write."
26
+ "description": "Optional HTML definition for the main index.html page. If omitted, a minimal scaffold is created and you can write index.html later via file_write."
27
27
  },
28
28
  "pages": {
29
29
  "type": "object",
@@ -85,90 +85,6 @@
85
85
  "executor": "tools/app-create.ts",
86
86
  "execution_target": "host"
87
87
  },
88
- {
89
- "name": "app_list",
90
- "description": "List all persistent apps. Returns an array of {id, name, description, updatedAt}.",
91
- "category": "apps",
92
- "risk": "low",
93
- "input_schema": {
94
- "type": "object",
95
- "properties": {
96
- "activity": {
97
- "type": "string",
98
- "description": "Brief non-technical explanation of why this tool is being called"
99
- }
100
- }
101
- },
102
- "executor": "tools/app-list.ts",
103
- "execution_target": "host"
104
- },
105
- {
106
- "name": "app_query",
107
- "description": "Query all records for a persistent app. Returns an array of records.",
108
- "category": "apps",
109
- "risk": "low",
110
- "input_schema": {
111
- "type": "object",
112
- "properties": {
113
- "app_id": {
114
- "type": "string",
115
- "description": "The ID of the app to query records for"
116
- },
117
- "activity": {
118
- "type": "string",
119
- "description": "Brief non-technical explanation of why this tool is being called"
120
- }
121
- },
122
- "required": ["app_id"]
123
- },
124
- "executor": "tools/app-query.ts",
125
- "execution_target": "host"
126
- },
127
- {
128
- "name": "app_update",
129
- "description": "Update a persistent app definition. Provide the app_id and any fields to update (name, description, schema_json, html).",
130
- "category": "apps",
131
- "risk": "low",
132
- "input_schema": {
133
- "type": "object",
134
- "properties": {
135
- "app_id": {
136
- "type": "string",
137
- "description": "The ID of the app to update"
138
- },
139
- "name": {
140
- "type": "string",
141
- "description": "Updated name for the app"
142
- },
143
- "description": {
144
- "type": "string",
145
- "description": "Updated description for the app"
146
- },
147
- "schema_json": {
148
- "type": "string",
149
- "description": "Updated JSON schema"
150
- },
151
- "html": {
152
- "type": "string",
153
- "description": "Updated HTML definition"
154
- },
155
- "pages": {
156
- "type": "object",
157
- "description": "Updated additional pages as a mapping of filename to HTML content.",
158
- "additionalProperties": {
159
- "type": "string"
160
- }
161
- },
162
- "activity": {
163
- "type": "string",
164
- "description": "Brief non-technical explanation of why this tool is being called"
165
- }
166
- },
167
- "required": ["app_id"]
168
- },
169
- "executor": "tools/app-update.ts",
170
- "execution_target": "host"
171
- },
172
88
  {
173
89
  "name": "app_delete",
174
90
  "description": "Delete a persistent app and all its records.",
@@ -192,8 +108,8 @@
192
108
  "execution_target": "host"
193
109
  },
194
110
  {
195
- "name": "app_file_list",
196
- "description": "List all files in an app. Returns a JSON array of file paths.",
111
+ "name": "app_refresh",
112
+ "description": "Trigger recompilation and surface refresh for an app after making file changes. Call this once after you finish editing app files with generic file tools.",
197
113
  "category": "apps",
198
114
  "risk": "low",
199
115
  "input_schema": {
@@ -201,7 +117,7 @@
201
117
  "properties": {
202
118
  "app_id": {
203
119
  "type": "string",
204
- "description": "The ID of the app"
120
+ "description": "The ID of the app to refresh"
205
121
  },
206
122
  "activity": {
207
123
  "type": "string",
@@ -210,117 +126,7 @@
210
126
  },
211
127
  "required": ["app_id"]
212
128
  },
213
- "executor": "tools/app-file-list.ts",
214
- "execution_target": "host"
215
- },
216
- {
217
- "name": "app_file_read",
218
- "description": "Read the contents of a file in an app. Returns content with line numbers in cat -n format.",
219
- "category": "apps",
220
- "risk": "low",
221
- "input_schema": {
222
- "type": "object",
223
- "properties": {
224
- "app_id": {
225
- "type": "string",
226
- "description": "The ID of the app"
227
- },
228
- "path": {
229
- "type": "string",
230
- "description": "Relative file path within the app"
231
- },
232
- "offset": {
233
- "type": "number",
234
- "description": "1-based line number to start reading from (default: 1)"
235
- },
236
- "limit": {
237
- "type": "number",
238
- "description": "Number of lines to return (default: all)"
239
- },
240
- "activity": {
241
- "type": "string",
242
- "description": "Brief non-technical explanation of why this tool is being called"
243
- }
244
- },
245
- "required": ["app_id", "path"]
246
- },
247
- "executor": "tools/app-file-read.ts",
248
- "execution_target": "host"
249
- },
250
- {
251
- "name": "app_file_edit",
252
- "description": "Edit a file in an app by replacing a string. Uses exact match-and-replace.",
253
- "category": "apps",
254
- "risk": "low",
255
- "input_schema": {
256
- "type": "object",
257
- "properties": {
258
- "app_id": {
259
- "type": "string",
260
- "description": "The ID of the app"
261
- },
262
- "path": {
263
- "type": "string",
264
- "description": "Relative file path within the app"
265
- },
266
- "old_string": {
267
- "type": "string",
268
- "description": "The exact string to find and replace"
269
- },
270
- "new_string": {
271
- "type": "string",
272
- "description": "The replacement string"
273
- },
274
- "replace_all": {
275
- "type": "boolean",
276
- "description": "Replace all occurrences instead of just the first (default: false)"
277
- },
278
- "status": {
279
- "type": "string",
280
- "description": "Optional short human-readable progress message shown to the user (e.g. 'adding dark mode styles')"
281
- },
282
- "activity": {
283
- "type": "string",
284
- "description": "Brief non-technical explanation of why this tool is being called"
285
- }
286
- },
287
- "required": ["app_id", "path", "old_string", "new_string"]
288
- },
289
- "executor": "tools/app-file-edit.ts",
290
- "execution_target": "host"
291
- },
292
- {
293
- "name": "app_file_write",
294
- "description": "Write (create or overwrite) a file in an app.",
295
- "category": "apps",
296
- "risk": "low",
297
- "input_schema": {
298
- "type": "object",
299
- "properties": {
300
- "app_id": {
301
- "type": "string",
302
- "description": "The ID of the app"
303
- },
304
- "path": {
305
- "type": "string",
306
- "description": "Relative file path within the app"
307
- },
308
- "content": {
309
- "type": "string",
310
- "description": "The content to write to the file"
311
- },
312
- "status": {
313
- "type": "string",
314
- "description": "Optional short human-readable progress message shown to the user (e.g. 'adding dark mode styles')"
315
- },
316
- "activity": {
317
- "type": "string",
318
- "description": "Brief non-technical explanation of why this tool is being called"
319
- }
320
- },
321
- "required": ["app_id", "path", "content"]
322
- },
323
- "executor": "tools/app-file-write.ts",
129
+ "executor": "tools/app-refresh.ts",
324
130
  "execution_target": "host"
325
131
  },
326
132
  {
@@ -1,5 +1,5 @@
1
1
  import * as appStore from "../../../../memory/app-store.js";
2
- import { executeAppQuery } from "../../../../tools/apps/executors.js";
2
+ import { executeAppRefresh } from "../../../../tools/apps/executors.js";
3
3
  import type {
4
4
  ToolContext,
5
5
  ToolExecutionResult,
@@ -9,5 +9,5 @@ export async function run(
9
9
  input: Record<string, unknown>,
10
10
  _context: ToolContext,
11
11
  ): Promise<ToolExecutionResult> {
12
- return executeAppQuery({ app_id: input.app_id as string }, appStore);
12
+ return executeAppRefresh({ app_id: input.app_id as string }, appStore);
13
13
  }
@@ -44,10 +44,9 @@ export async function run(
44
44
  }
45
45
 
46
46
  try {
47
- const connection = await resolveOAuthConnection(
48
- "integration:google",
47
+ const connection = await resolveOAuthConnection("integration:google", {
49
48
  account,
50
- );
49
+ });
51
50
  switch (action) {
52
51
  case "list": {
53
52
  const pageSize = (input.page_size as number) ?? 50;
@@ -35,10 +35,9 @@ export async function run(
35
35
  }
36
36
 
37
37
  try {
38
- const connection = await resolveOAuthConnection(
39
- "integration:google",
38
+ const connection = await resolveOAuthConnection("integration:google", {
40
39
  account,
41
- );
40
+ });
42
41
  const allMessageIds: string[] = [];
43
42
  let pageToken: string | undefined;
44
43
  let truncated = false;
@@ -107,10 +106,9 @@ export async function run(
107
106
  } else if (messageId) {
108
107
  // Single message path
109
108
  try {
110
- const connection = await resolveOAuthConnection(
111
- "integration:google",
109
+ const connection = await resolveOAuthConnection("integration:google", {
112
110
  account,
113
- );
111
+ });
114
112
  await modifyMessage(connection, messageId, { removeLabelIds: ["INBOX"] });
115
113
  return ok("Message archived.");
116
114
  } catch (e) {
@@ -128,10 +126,9 @@ export async function run(
128
126
  }
129
127
 
130
128
  try {
131
- const connection = await resolveOAuthConnection(
132
- "integration:google",
129
+ const connection = await resolveOAuthConnection("integration:google", {
133
130
  account,
134
- );
131
+ });
135
132
  if (messageIds.length === 1) {
136
133
  await modifyMessage(connection, messageIds[0], {
137
134
  removeLabelIds: ["INBOX"],
@@ -57,10 +57,9 @@ export async function run(
57
57
 
58
58
  if (action === "list") {
59
59
  try {
60
- const connection = await resolveOAuthConnection(
61
- "integration:google",
60
+ const connection = await resolveOAuthConnection("integration:google", {
62
61
  account,
63
- );
62
+ });
64
63
  const message = await getMessage(connection, messageId, "full");
65
64
  const attachments = collectAttachments(message.payload?.parts);
66
65
 
@@ -82,10 +81,9 @@ export async function run(
82
81
  if (!filename) return err("filename is required for download.");
83
82
 
84
83
  try {
85
- const connection = await resolveOAuthConnection(
86
- "integration:google",
84
+ const connection = await resolveOAuthConnection("integration:google", {
87
85
  account,
88
- );
86
+ });
89
87
  const attachment = await getAttachment(
90
88
  connection,
91
89
  messageId,
@@ -23,10 +23,9 @@ export async function run(
23
23
  if (!body) return err("body is required.");
24
24
 
25
25
  try {
26
- const connection = await resolveOAuthConnection(
27
- "integration:google",
26
+ const connection = await resolveOAuthConnection("integration:google", {
28
27
  account,
29
- );
28
+ });
30
29
  const draft = await createDraft(
31
30
  connection,
32
31
  to,
@@ -26,10 +26,9 @@ export async function run(
26
26
  }
27
27
 
28
28
  try {
29
- const connection = await resolveOAuthConnection(
30
- "integration:google",
29
+ const connection = await resolveOAuthConnection("integration:google", {
31
30
  account,
32
- );
31
+ });
33
32
  switch (action) {
34
33
  case "list": {
35
34
  const filters = await listFilters(connection);
@@ -38,10 +38,9 @@ export async function run(
38
38
  }
39
39
 
40
40
  try {
41
- const connection = await resolveOAuthConnection(
42
- "integration:google",
41
+ const connection = await resolveOAuthConnection("integration:google", {
43
42
  account,
44
- );
43
+ });
45
44
  switch (action) {
46
45
  case "track": {
47
46
  const messageId = input.message_id as string;
@@ -76,10 +76,9 @@ export async function run(
76
76
  if (!forwardTo) return err("to is required.");
77
77
 
78
78
  try {
79
- const connection = await resolveOAuthConnection(
80
- "integration:google",
79
+ const connection = await resolveOAuthConnection("integration:google", {
81
80
  account,
82
- );
81
+ });
83
82
  const message = await getMessage(connection, messageId, "full");
84
83
  const headers = message.payload?.headers ?? [];
85
84
  const originalFrom = extractHeader(headers, "From");
@@ -21,10 +21,9 @@ export async function run(
21
21
 
22
22
  if (messageIds && messageIds.length > 0) {
23
23
  try {
24
- const connection = await resolveOAuthConnection(
25
- "integration:google",
24
+ const connection = await resolveOAuthConnection("integration:google", {
26
25
  account,
27
- );
26
+ });
28
27
  await batchModifyMessages(connection, messageIds, {
29
28
  addLabelIds,
30
29
  removeLabelIds,
@@ -37,10 +36,9 @@ export async function run(
37
36
 
38
37
  if (messageId) {
39
38
  try {
40
- const connection = await resolveOAuthConnection(
41
- "integration:google",
39
+ const connection = await resolveOAuthConnection("integration:google", {
42
40
  account,
43
- );
41
+ });
44
42
  await modifyMessage(connection, messageId, {
45
43
  addLabelIds,
46
44
  removeLabelIds,
@@ -56,10 +56,9 @@ export async function run(
56
56
  const query = `in:inbox -has:unsubscribe newer_than:${timeRange}`;
57
57
 
58
58
  try {
59
- const connection = await resolveOAuthConnection(
60
- "integration:google",
59
+ const connection = await resolveOAuthConnection("integration:google", {
61
60
  account,
62
- );
61
+ });
63
62
  // Pipeline: fire metadata fetches for each page of IDs as they arrive
64
63
  const allMessageIds: string[] = [];
65
64
  const fetchPromises: Promise<GmailMessage[]>[] = [];
@@ -15,10 +15,9 @@ export async function run(
15
15
  if (!draftId) return err("draft_id is required.");
16
16
 
17
17
  try {
18
- const connection = await resolveOAuthConnection(
19
- "integration:google",
18
+ const connection = await resolveOAuthConnection("integration:google", {
20
19
  account,
21
- );
20
+ });
22
21
  const msg = await sendDraft(connection, draftId);
23
22
  return ok(`Draft sent (Message ID: ${msg.id}).`);
24
23
  } catch (e) {
@@ -58,10 +58,9 @@ export async function run(
58
58
  const inputPageToken = input.page_token as string | undefined;
59
59
 
60
60
  try {
61
- const connection = await resolveOAuthConnection(
62
- "integration:google",
61
+ const connection = await resolveOAuthConnection("integration:google", {
63
62
  account,
64
- );
63
+ });
65
64
  // Pipeline: fire metadata fetches for each page of IDs as they arrive,
66
65
  // overlapping fetch latency with pagination latency
67
66
  const allMessageIds: string[] = [];
@@ -18,10 +18,9 @@ export async function run(
18
18
  }
19
19
 
20
20
  try {
21
- const connection = await resolveOAuthConnection(
22
- "integration:google",
21
+ const connection = await resolveOAuthConnection("integration:google", {
23
22
  account,
24
- );
23
+ });
25
24
  await trashMessage(connection, messageId);
26
25
  return ok("Message moved to trash.");
27
26
  } catch (e) {
@@ -32,10 +32,9 @@ export async function run(
32
32
  }
33
33
 
34
34
  try {
35
- const connection = await resolveOAuthConnection(
36
- "integration:google",
35
+ const connection = await resolveOAuthConnection("integration:google", {
37
36
  account,
38
- );
37
+ });
39
38
  const message = await getMessage(connection, messageId, "metadata", [
40
39
  "List-Unsubscribe",
41
40
  "List-Unsubscribe-Post",
@@ -22,10 +22,9 @@ export async function run(
22
22
  }
23
23
 
24
24
  try {
25
- const connection = await resolveOAuthConnection(
26
- "integration:google",
25
+ const connection = await resolveOAuthConnection("integration:google", {
27
26
  account,
28
- );
27
+ });
29
28
  switch (action) {
30
29
  case "get": {
31
30
  const settings = await getVacation(connection);
@@ -13,5 +13,5 @@ export function ok(content: string): ToolExecutionResult {
13
13
  export async function getCalendarConnection(
14
14
  account?: string,
15
15
  ): Promise<OAuthConnection> {
16
- return resolveOAuthConnection("integration:google", account);
16
+ return resolveOAuthConnection("integration:google", { account });
17
17
  }
@@ -13,13 +13,13 @@ You are an image generation assistant. When the user asks you to create or edit
13
13
  ## Usage
14
14
 
15
15
  - **Text-to-image**: "Generate an image of a sunset over the ocean"
16
- - **Image editing**: "Remove the background from this image" (requires attaching an image)
16
+ - **Image editing**: "Remove the background from this image" (requires providing source image file paths)
17
17
  - **Multiple variants**: "Generate 3 variations of a logo for a coffee shop"
18
18
 
19
19
  ## Modes
20
20
 
21
21
  - **generate** (default): Create a new image from a text prompt.
22
- - **edit**: Modify an existing image based on a text prompt. Requires one or more attached source images via `attachment_ids`.
22
+ - **edit**: Modify an existing image based on a text prompt. Requires one or more source images via `source_paths` (file paths on disk).
23
23
 
24
24
  ## Models
25
25
 
@@ -18,12 +18,12 @@
18
18
  "enum": ["generate", "edit"],
19
19
  "description": "Whether to generate a new image or edit an existing one (default: generate)"
20
20
  },
21
- "attachment_ids": {
21
+ "source_paths": {
22
22
  "type": "array",
23
23
  "items": {
24
24
  "type": "string"
25
25
  },
26
- "description": "IDs of attached source images to edit (required for edit mode)"
26
+ "description": "File paths to source images in the workspace (for edit mode)"
27
27
  },
28
28
  "model": {
29
29
  "type": "string",