@vellumai/assistant 0.3.5 → 0.3.6

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 (486) hide show
  1. package/README.md +51 -0
  2. package/eslint.config.mjs +31 -0
  3. package/package.json +1 -1
  4. package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
  5. package/scripts/ipc/generate-swift.ts +18 -2
  6. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +338 -1
  7. package/src/__tests__/approval-conversation-turn.test.ts +214 -0
  8. package/src/__tests__/browser-manager.test.ts +1 -0
  9. package/src/__tests__/call-conversation-messages.test.ts +130 -0
  10. package/src/__tests__/call-orchestrator.test.ts +752 -271
  11. package/src/__tests__/call-pointer-messages.test.ts +148 -0
  12. package/src/__tests__/call-recovery.test.ts +3 -0
  13. package/src/__tests__/call-routes-http.test.ts +5 -0
  14. package/src/__tests__/call-store.test.ts +3 -0
  15. package/src/__tests__/channel-approval-routes.test.ts +1260 -85
  16. package/src/__tests__/channel-approval.test.ts +37 -0
  17. package/src/__tests__/channel-approvals.test.ts +4 -65
  18. package/src/__tests__/channel-guardian.test.ts +556 -0
  19. package/src/__tests__/channel-readiness-service.test.ts +74 -7
  20. package/src/__tests__/checker.test.ts +14 -7
  21. package/src/__tests__/clarification-resolver.test.ts +44 -24
  22. package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
  23. package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
  24. package/src/__tests__/config-schema.test.ts +12 -7
  25. package/src/__tests__/context-window-manager.test.ts +30 -2
  26. package/src/__tests__/contradiction-checker.test.ts +20 -5
  27. package/src/__tests__/credential-security-invariants.test.ts +6 -2
  28. package/src/__tests__/db-migration-rollback.test.ts +752 -0
  29. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
  30. package/src/__tests__/fuzzy-match-property.test.ts +5 -5
  31. package/src/__tests__/guardian-action-store.test.ts +123 -0
  32. package/src/__tests__/guardian-action-sweep.test.ts +277 -0
  33. package/src/__tests__/guardian-dispatch.test.ts +389 -0
  34. package/src/__tests__/guardian-question-copy.test.ts +47 -0
  35. package/src/__tests__/handlers-telegram-config.test.ts +4 -2
  36. package/src/__tests__/handlers-twilio-config.test.ts +126 -0
  37. package/src/__tests__/intent-routing.test.ts +2 -0
  38. package/src/__tests__/ipc-snapshot.test.ts +228 -1
  39. package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
  40. package/src/__tests__/model-intents.test.ts +96 -0
  41. package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
  42. package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
  43. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
  44. package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
  45. package/src/__tests__/provider-error-scenarios.test.ts +621 -0
  46. package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
  47. package/src/__tests__/qdrant-manager.test.ts +27 -20
  48. package/src/__tests__/relay-server.test.ts +779 -40
  49. package/src/__tests__/run-orchestrator-assistant-events.test.ts +2 -0
  50. package/src/__tests__/run-orchestrator.test.ts +20 -4
  51. package/src/__tests__/runtime-runs-http.test.ts +17 -1
  52. package/src/__tests__/runtime-runs.test.ts +16 -0
  53. package/src/__tests__/schedule-store.test.ts +18 -4
  54. package/src/__tests__/scheduler-recurrence.test.ts +13 -4
  55. package/src/__tests__/session-abort-tool-results.test.ts +6 -0
  56. package/src/__tests__/session-agent-loop.test.ts +857 -0
  57. package/src/__tests__/session-conflict-gate.test.ts +6 -0
  58. package/src/__tests__/session-pre-run-repair.test.ts +6 -0
  59. package/src/__tests__/session-profile-injection.test.ts +6 -0
  60. package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
  61. package/src/__tests__/session-queue.test.ts +6 -0
  62. package/src/__tests__/session-runtime-assembly.test.ts +237 -13
  63. package/src/__tests__/session-slash-known.test.ts +6 -0
  64. package/src/__tests__/session-slash-queue.test.ts +6 -0
  65. package/src/__tests__/session-slash-unknown.test.ts +6 -0
  66. package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
  67. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
  68. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
  69. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
  70. package/src/__tests__/session-workspace-injection.test.ts +6 -0
  71. package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
  72. package/src/__tests__/skills.test.ts +2 -0
  73. package/src/__tests__/sms-messaging-provider.test.ts +2 -1
  74. package/src/__tests__/starter-task-flow.test.ts +2 -0
  75. package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
  76. package/src/__tests__/system-prompt.test.ts +2 -0
  77. package/src/__tests__/task-management-tools.test.ts +2 -2
  78. package/src/__tests__/task-runner.test.ts +14 -4
  79. package/src/__tests__/terminal-tools.test.ts +25 -19
  80. package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
  81. package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
  82. package/src/__tests__/tool-executor.test.ts +23 -24
  83. package/src/__tests__/trust-store.test.ts +3 -3
  84. package/src/__tests__/twilio-rest.test.ts +29 -0
  85. package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
  86. package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
  87. package/src/__tests__/twilio-routes.test.ts +141 -21
  88. package/src/__tests__/user-reference.test.ts +2 -0
  89. package/src/__tests__/voice-quality.test.ts +222 -0
  90. package/src/__tests__/web-search.test.ts +45 -29
  91. package/src/agent/loop.ts +1 -1
  92. package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
  93. package/src/amazon/client.ts +1418 -0
  94. package/src/amazon/request-extractor.ts +135 -0
  95. package/src/amazon/session.ts +109 -0
  96. package/src/autonomy/autonomy-store.ts +5 -5
  97. package/src/browser-extension-relay/client.ts +124 -0
  98. package/src/browser-extension-relay/protocol.ts +63 -0
  99. package/src/browser-extension-relay/server.ts +177 -0
  100. package/src/bundler/app-bundler.ts +3 -3
  101. package/src/bundler/bundle-signer.ts +1 -1
  102. package/src/bundler/signature-verifier.ts +1 -1
  103. package/src/calls/call-conversation-messages.ts +33 -0
  104. package/src/calls/call-domain.ts +106 -5
  105. package/src/calls/call-orchestrator.ts +252 -54
  106. package/src/calls/call-pointer-messages.ts +53 -0
  107. package/src/calls/call-recovery.ts +3 -8
  108. package/src/calls/call-store.ts +69 -87
  109. package/src/calls/elevenlabs-config.ts +3 -2
  110. package/src/calls/guardian-action-sweep.ts +105 -0
  111. package/src/calls/guardian-dispatch.ts +203 -0
  112. package/src/calls/guardian-question-copy.ts +133 -0
  113. package/src/calls/relay-server.ts +466 -8
  114. package/src/calls/speaker-identification.ts +1 -1
  115. package/src/calls/twilio-config.ts +7 -5
  116. package/src/calls/twilio-provider.ts +6 -4
  117. package/src/calls/twilio-rest.ts +40 -15
  118. package/src/calls/twilio-routes.ts +60 -45
  119. package/src/calls/types.ts +3 -1
  120. package/src/channels/types.ts +25 -0
  121. package/src/cli/amazon.ts +815 -0
  122. package/src/cli/config-commands.ts +2 -2
  123. package/src/cli/core-commands.ts +4 -3
  124. package/src/cli/influencer.ts +244 -0
  125. package/src/cli/map.ts +89 -6
  126. package/src/cli.ts +1 -1
  127. package/src/config/agent-schema.ts +171 -0
  128. package/src/config/bundled-skills/amazon/SKILL.md +127 -0
  129. package/src/config/bundled-skills/amazon/icon.svg +13 -0
  130. package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
  131. package/src/config/bundled-skills/browser/SKILL.md +1 -0
  132. package/src/config/bundled-skills/browser/TOOLS.json +17 -0
  133. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
  134. package/src/config/bundled-skills/doordash/SKILL.md +51 -51
  135. package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
  136. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
  137. package/src/config/bundled-skills/influencer/SKILL.md +144 -0
  138. package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
  139. package/src/config/bundled-skills/media-processing/SKILL.md +72 -95
  140. package/src/config/bundled-skills/media-processing/TOOLS.json +57 -147
  141. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
  142. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
  143. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
  144. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
  145. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
  146. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
  147. package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
  148. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +7 -9
  149. package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
  150. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +88 -253
  151. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +22 -153
  152. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  153. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +28 -51
  154. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +35 -270
  155. package/src/config/bundled-skills/messaging/SKILL.md +12 -2
  156. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
  157. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
  158. package/src/config/bundled-skills/phone-calls/SKILL.md +86 -21
  159. package/src/config/bundled-skills/twitter/icon.svg +14 -0
  160. package/src/config/bundled-tool-registry.ts +310 -0
  161. package/src/config/calls-schema.ts +181 -0
  162. package/src/config/core-schema.ts +309 -0
  163. package/src/config/defaults.ts +26 -2
  164. package/src/config/env-registry.ts +162 -0
  165. package/src/config/env.ts +175 -0
  166. package/src/config/loader.ts +6 -6
  167. package/src/config/memory-schema.ts +528 -0
  168. package/src/config/sandbox-schema.ts +55 -0
  169. package/src/config/schema.ts +156 -1137
  170. package/src/config/skill-state.ts +1 -1
  171. package/src/config/skills-schema.ts +32 -0
  172. package/src/config/skills.ts +35 -24
  173. package/src/config/system-prompt.ts +107 -56
  174. package/src/config/templates/SOUL.md +1 -1
  175. package/src/config/types.ts +1 -0
  176. package/src/config/user-reference.ts +4 -9
  177. package/src/config/vellum-skills/catalog.json +0 -7
  178. package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
  179. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +1 -0
  180. package/src/config/vellum-skills/sms-setup/SKILL.md +112 -14
  181. package/src/context/window-manager.ts +27 -7
  182. package/src/daemon/approval-generators.ts +186 -0
  183. package/src/daemon/approved-devices-store.ts +140 -0
  184. package/src/daemon/assistant-attachments.ts +1 -1
  185. package/src/daemon/classifier.ts +35 -32
  186. package/src/daemon/config-watcher.ts +1 -1
  187. package/src/daemon/daemon-control.ts +217 -0
  188. package/src/daemon/handlers/apps.ts +2 -3
  189. package/src/daemon/handlers/config-channels.ts +158 -0
  190. package/src/daemon/handlers/config-inbox.ts +540 -0
  191. package/src/daemon/handlers/config-ingress.ts +231 -0
  192. package/src/daemon/handlers/config-integrations.ts +258 -0
  193. package/src/daemon/handlers/config-model.ts +143 -0
  194. package/src/daemon/handlers/config-parental.ts +163 -0
  195. package/src/daemon/handlers/config-scheduling.ts +172 -0
  196. package/src/daemon/handlers/config-slack.ts +92 -0
  197. package/src/daemon/handlers/config-telegram.ts +301 -0
  198. package/src/daemon/handlers/config-tools.ts +177 -0
  199. package/src/daemon/handlers/config-trust.ts +104 -0
  200. package/src/daemon/handlers/config-twilio.ts +1080 -0
  201. package/src/daemon/handlers/config.ts +53 -2463
  202. package/src/daemon/handlers/diagnostics.ts +1 -1
  203. package/src/daemon/handlers/dictation.ts +4 -6
  204. package/src/daemon/handlers/documents.ts +18 -32
  205. package/src/daemon/handlers/index.ts +9 -0
  206. package/src/daemon/handlers/misc.ts +3 -5
  207. package/src/daemon/handlers/pairing.ts +98 -0
  208. package/src/daemon/handlers/sessions.ts +54 -5
  209. package/src/daemon/handlers/shared.ts +3 -1
  210. package/src/daemon/handlers/skills.ts +1 -1
  211. package/src/daemon/handlers/twitter-auth.ts +2 -0
  212. package/src/daemon/handlers/work-items.ts +2 -2
  213. package/src/daemon/handlers/workspace-files.ts +4 -3
  214. package/src/daemon/install-cli-launchers.ts +113 -0
  215. package/src/daemon/ipc-contract/apps.ts +356 -0
  216. package/src/daemon/ipc-contract/browser.ts +74 -0
  217. package/src/daemon/ipc-contract/computer-use.ts +151 -0
  218. package/src/daemon/ipc-contract/diagnostics.ts +56 -0
  219. package/src/daemon/ipc-contract/documents.ts +74 -0
  220. package/src/daemon/ipc-contract/inbox.ts +209 -0
  221. package/src/daemon/ipc-contract/integrations.ts +284 -0
  222. package/src/daemon/ipc-contract/memory.ts +48 -0
  223. package/src/daemon/ipc-contract/messages.ts +211 -0
  224. package/src/daemon/ipc-contract/pairing.ts +45 -0
  225. package/src/daemon/ipc-contract/parental-control.ts +95 -0
  226. package/src/daemon/ipc-contract/schedules.ts +97 -0
  227. package/src/daemon/ipc-contract/sessions.ts +315 -0
  228. package/src/daemon/ipc-contract/shared.ts +42 -0
  229. package/src/daemon/ipc-contract/skills.ts +120 -0
  230. package/src/daemon/ipc-contract/subagents.ts +58 -0
  231. package/src/daemon/ipc-contract/surfaces.ts +250 -0
  232. package/src/daemon/ipc-contract/trust.ts +60 -0
  233. package/src/daemon/ipc-contract/work-items.ts +225 -0
  234. package/src/daemon/ipc-contract/workspace.ts +113 -0
  235. package/src/daemon/ipc-contract-inventory.json +60 -0
  236. package/src/daemon/ipc-contract-inventory.ts +55 -29
  237. package/src/daemon/ipc-contract.ts +226 -2527
  238. package/src/daemon/ipc-protocol.ts +1 -1
  239. package/src/daemon/ipc-validate.ts +7 -0
  240. package/src/daemon/lifecycle.ts +97 -379
  241. package/src/daemon/pairing-store.ts +177 -0
  242. package/src/daemon/providers-setup.ts +43 -0
  243. package/src/daemon/ride-shotgun-handler.ts +67 -2
  244. package/src/daemon/server.ts +60 -44
  245. package/src/daemon/session-agent-loop-handlers.ts +421 -0
  246. package/src/daemon/session-agent-loop.ts +113 -275
  247. package/src/daemon/session-dynamic-profile.ts +1 -1
  248. package/src/daemon/session-history.ts +1 -1
  249. package/src/daemon/session-media-retry.ts +1 -1
  250. package/src/daemon/session-messaging.ts +37 -2
  251. package/src/daemon/session-notifiers.ts +5 -25
  252. package/src/daemon/session-process.ts +99 -59
  253. package/src/daemon/session-queue-manager.ts +96 -4
  254. package/src/daemon/session-runtime-assembly.ts +149 -15
  255. package/src/daemon/session-surfaces.ts +19 -4
  256. package/src/daemon/session-tool-setup.ts +28 -30
  257. package/src/daemon/session-workspace.ts +1 -1
  258. package/src/daemon/session.ts +24 -1
  259. package/src/daemon/shutdown-handlers.ts +122 -0
  260. package/src/daemon/trace-emitter.ts +1 -1
  261. package/src/daemon/watch-handler.ts +36 -33
  262. package/src/doordash/cart-queries.ts +787 -0
  263. package/src/doordash/client.ts +144 -127
  264. package/src/doordash/order-queries.ts +85 -0
  265. package/src/doordash/queries.ts +10 -1308
  266. package/src/doordash/search-queries.ts +203 -0
  267. package/src/doordash/session.ts +3 -2
  268. package/src/doordash/store-queries.ts +246 -0
  269. package/src/doordash/types.ts +367 -0
  270. package/src/email/providers/agentmail.ts +2 -1
  271. package/src/email/providers/index.ts +3 -2
  272. package/src/email/service.ts +3 -2
  273. package/src/errors.ts +43 -0
  274. package/src/home-base/prebuilt/seed.ts +1 -1
  275. package/src/hooks/cli.ts +6 -5
  276. package/src/hooks/config.ts +6 -8
  277. package/src/hooks/discovery.ts +6 -5
  278. package/src/hooks/manager.ts +4 -3
  279. package/src/hooks/runner.ts +2 -2
  280. package/src/hooks/templates.ts +5 -5
  281. package/src/inbound/public-ingress-urls.ts +3 -1
  282. package/src/index.ts +4 -2
  283. package/src/influencer/client.ts +1104 -0
  284. package/src/instrument.ts +4 -3
  285. package/src/logfire.ts +4 -3
  286. package/src/memory/admin.ts +25 -35
  287. package/src/memory/attachments-store.ts +4 -7
  288. package/src/memory/channel-delivery-store.ts +30 -1
  289. package/src/memory/channel-guardian-store.ts +200 -1
  290. package/src/memory/clarification-resolver.ts +37 -33
  291. package/src/memory/conflict-store.ts +67 -61
  292. package/src/memory/contradiction-checker.ts +141 -117
  293. package/src/memory/conversation-store.ts +335 -51
  294. package/src/memory/db-connection.ts +27 -4
  295. package/src/memory/db-init.ts +121 -4
  296. package/src/memory/db.ts +14 -1
  297. package/src/memory/embedding-backend.ts +27 -5
  298. package/src/memory/embedding-ollama.ts +2 -1
  299. package/src/memory/entity-extractor.ts +38 -35
  300. package/src/memory/guardian-action-store.ts +430 -0
  301. package/src/memory/inbox-escalation-projection.ts +59 -0
  302. package/src/memory/inbox-thread-store.ts +218 -0
  303. package/src/memory/ingress-invite-store.ts +338 -0
  304. package/src/memory/ingress-member-store.ts +350 -0
  305. package/src/memory/items-extractor.ts +91 -97
  306. package/src/memory/job-handlers/index-maintenance.ts +3 -3
  307. package/src/memory/job-handlers/media-processing.ts +11 -42
  308. package/src/memory/job-handlers/summarization.ts +32 -26
  309. package/src/memory/job-utils.ts +3 -10
  310. package/src/memory/jobs-store.ts +6 -9
  311. package/src/memory/jobs-worker.ts +51 -36
  312. package/src/memory/migrations/001-job-deferrals.ts +45 -0
  313. package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
  314. package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
  315. package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
  316. package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
  317. package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
  318. package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
  319. package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
  320. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
  321. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
  322. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
  323. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
  324. package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
  325. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
  326. package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
  327. package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
  328. package/src/memory/migrations/017-memory-items-indexes.ts +10 -0
  329. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
  330. package/src/memory/migrations/index.ts +24 -0
  331. package/src/memory/migrations/registry.ts +79 -0
  332. package/src/memory/migrations/validate-migration-state.ts +69 -0
  333. package/src/memory/qdrant-manager.ts +49 -8
  334. package/src/memory/query-builder.ts +1 -1
  335. package/src/memory/raw-query.ts +119 -0
  336. package/src/memory/recall-cache.ts +4 -1
  337. package/src/memory/retriever.ts +160 -47
  338. package/src/memory/schema-migration.ts +25 -984
  339. package/src/memory/schema.ts +130 -7
  340. package/src/memory/search/entity.ts +10 -19
  341. package/src/memory/search/lexical.ts +81 -52
  342. package/src/memory/search/ranking.ts +21 -22
  343. package/src/memory/search/semantic.ts +157 -19
  344. package/src/memory/shared-app-links-store.ts +4 -5
  345. package/src/memory/validation.ts +19 -0
  346. package/src/messaging/draft-store.ts +5 -6
  347. package/src/messaging/providers/sms/adapter.ts +3 -6
  348. package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
  349. package/src/messaging/providers/whatsapp/adapter.ts +136 -0
  350. package/src/messaging/providers/whatsapp/client.ts +67 -0
  351. package/src/messaging/style-analyzer.ts +5 -4
  352. package/src/messaging/thread-summarizer.ts +61 -69
  353. package/src/messaging/triage-engine.ts +62 -71
  354. package/src/migrations/config-merge.ts +53 -0
  355. package/src/migrations/data-layout.ts +68 -0
  356. package/src/migrations/data-merge.ts +33 -0
  357. package/src/migrations/hooks-merge.ts +90 -0
  358. package/src/migrations/index.ts +6 -0
  359. package/src/migrations/log.ts +23 -0
  360. package/src/migrations/skills-merge.ts +33 -0
  361. package/src/migrations/workspace-layout.ts +79 -0
  362. package/src/permissions/checker.ts +119 -11
  363. package/src/permissions/prompter.ts +14 -0
  364. package/src/permissions/shell-identity.ts +31 -1
  365. package/src/permissions/trust-store.ts +21 -1
  366. package/src/providers/anthropic/client.ts +4 -4
  367. package/src/providers/failover.ts +2 -2
  368. package/src/providers/model-intents.ts +70 -0
  369. package/src/providers/ollama/client.ts +2 -1
  370. package/src/providers/provider-send-message.ts +176 -0
  371. package/src/providers/registry.ts +71 -30
  372. package/src/providers/retry.ts +35 -1
  373. package/src/providers/types.ts +12 -1
  374. package/src/runtime/approval-conversation-turn.ts +97 -0
  375. package/src/runtime/approval-message-composer.ts +115 -5
  376. package/src/runtime/channel-approval-parser.ts +36 -2
  377. package/src/runtime/channel-approvals.ts +0 -21
  378. package/src/runtime/channel-guardian-service.ts +48 -7
  379. package/src/runtime/channel-readiness-service.ts +160 -34
  380. package/src/runtime/channel-readiness-types.ts +10 -4
  381. package/src/runtime/channel-retry-sweep.ts +184 -0
  382. package/src/runtime/guardian-context-resolver.ts +108 -0
  383. package/src/runtime/http-server.ts +275 -743
  384. package/src/runtime/http-types.ts +56 -3
  385. package/src/runtime/middleware/auth.ts +116 -0
  386. package/src/runtime/middleware/error-handler.ts +33 -0
  387. package/src/runtime/middleware/twilio-validation.ts +127 -0
  388. package/src/runtime/routes/app-routes.ts +1 -1
  389. package/src/runtime/routes/call-routes.ts +49 -6
  390. package/src/runtime/routes/channel-delivery-routes.ts +170 -0
  391. package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
  392. package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
  393. package/src/runtime/routes/channel-route-shared.ts +144 -0
  394. package/src/runtime/routes/channel-routes.ts +32 -1634
  395. package/src/runtime/routes/conversation-routes.ts +50 -7
  396. package/src/runtime/routes/events-routes.ts +2 -2
  397. package/src/runtime/routes/identity-routes.ts +126 -0
  398. package/src/runtime/routes/pairing-routes.ts +143 -0
  399. package/src/runtime/routes/run-routes.ts +15 -1
  400. package/src/runtime/run-orchestrator.ts +52 -34
  401. package/src/schedule/schedule-store.ts +36 -32
  402. package/src/schedule/scheduler.ts +3 -3
  403. package/src/security/encrypted-store.ts +5 -7
  404. package/src/security/oauth2.ts +45 -15
  405. package/src/security/parental-control-store.ts +183 -0
  406. package/src/security/secret-allowlist.ts +4 -3
  407. package/src/security/secret-scanner.ts +5 -5
  408. package/src/security/secure-keys.ts +1 -1
  409. package/src/security/token-manager.ts +3 -2
  410. package/src/services/vercel-deploy.ts +6 -2
  411. package/src/skills/tool-manifest.ts +3 -3
  412. package/src/skills/vellum-catalog-remote.ts +75 -16
  413. package/src/slack/slack-webhook.ts +2 -1
  414. package/src/swarm/orchestrator.ts +92 -1
  415. package/src/swarm/router-planner.ts +6 -9
  416. package/src/swarm/worker-prompts.ts +9 -12
  417. package/src/tasks/task-compiler.ts +19 -28
  418. package/src/tasks/task-runner.ts +1 -1
  419. package/src/tools/assets/search.ts +15 -14
  420. package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
  421. package/src/tools/browser/auto-navigate.ts +1 -0
  422. package/src/tools/browser/browser-execution.ts +10 -1
  423. package/src/tools/browser/browser-manager.ts +119 -4
  424. package/src/tools/browser/network-recorder.ts +5 -0
  425. package/src/tools/credentials/broker.ts +11 -2
  426. package/src/tools/credentials/metadata-store.ts +18 -14
  427. package/src/tools/credentials/post-connect-hooks.ts +61 -0
  428. package/src/tools/credentials/vault.ts +49 -23
  429. package/src/tools/executor.ts +68 -9
  430. package/src/tools/host-terminal/cli-discover.ts +1 -1
  431. package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
  432. package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
  433. package/src/tools/network/script-proxy/server.ts +1 -1
  434. package/src/tools/network/script-proxy/session-manager.ts +6 -5
  435. package/src/tools/network/web-fetch.ts +18 -2
  436. package/src/tools/network/web-search.ts +7 -3
  437. package/src/tools/reminder/reminder-store.ts +14 -15
  438. package/src/tools/schedule/create.ts +1 -0
  439. package/src/tools/schedule/list.ts +2 -1
  440. package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
  441. package/src/tools/skills/skill-script-runner.ts +24 -9
  442. package/src/tools/skills/skill-tool-factory.ts +1 -0
  443. package/src/tools/tasks/work-item-enqueue.ts +2 -2
  444. package/src/tools/terminal/evaluate-typescript.ts +21 -12
  445. package/src/tools/terminal/parser.ts +50 -0
  446. package/src/tools/watcher/delete.ts +6 -0
  447. package/src/tools/weather/service.ts +1 -1
  448. package/src/twitter/client.ts +190 -24
  449. package/src/twitter/session.ts +4 -3
  450. package/src/util/clipboard.ts +1 -1
  451. package/src/util/errors.ts +65 -8
  452. package/src/util/fs.ts +40 -0
  453. package/src/util/json.ts +10 -0
  454. package/src/util/log-redact.ts +189 -0
  455. package/src/util/logger.ts +19 -17
  456. package/src/util/object.ts +3 -0
  457. package/src/util/platform.ts +72 -365
  458. package/src/util/pricing.ts +1 -1
  459. package/src/util/promise-guard.ts +1 -1
  460. package/src/util/retry.ts +19 -0
  461. package/src/util/row-mapper.ts +79 -0
  462. package/src/util/silently.ts +21 -0
  463. package/src/watcher/engine.ts +5 -1
  464. package/src/watcher/provider-types.ts +20 -0
  465. package/src/watcher/providers/github.ts +156 -0
  466. package/src/watcher/providers/gmail.ts +1 -0
  467. package/src/watcher/providers/google-calendar.ts +1 -0
  468. package/src/watcher/providers/linear.ts +460 -0
  469. package/src/watcher/providers/slack.ts +1 -0
  470. package/src/work-items/work-item-runner.ts +1 -1
  471. package/src/workspace/git-service.ts +1 -1
  472. package/src/workspace/provider-commit-message-generator.ts +51 -22
  473. package/src/__tests__/call-bridge.test.ts +0 -517
  474. package/src/__tests__/session-process-bridge.test.ts +0 -244
  475. package/src/calls/call-bridge.ts +0 -168
  476. package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
  477. package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
  478. package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
  479. package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
  480. package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
  481. package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
  482. package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
  483. package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
  484. package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
  485. package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
  486. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
@@ -1,149 +1,9 @@
1
1
  import { join, dirname } from 'node:path';
2
- import { mkdir, readdir, rename, rm } from 'node:fs/promises';
3
- import { randomUUID } from 'node:crypto';
4
2
  import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
5
- import {
6
- getMediaAssetById,
7
- getKeyframesForAsset,
8
- insertKeyframesBatch,
9
- deleteKeyframesForAsset,
10
- createProcessingStage,
11
- updateProcessingStage,
12
- getProcessingStagesForAsset,
13
- type ProcessingStage,
14
- } from '../../../../memory/media-store.js';
3
+ import { getMediaAssetById, getKeyframesForAsset } from '../../../../memory/media-store.js';
4
+ import { preprocessForAsset, type PreprocessOptions } from '../services/preprocess.js';
15
5
 
16
- const FFMPEG_TIMEOUT_MS = 300_000;
17
-
18
- function spawnWithTimeout(
19
- cmd: string[],
20
- timeoutMs: number,
21
- ): Promise<{ exitCode: number; stdout: string; stderr: string }> {
22
- return new Promise((resolve, reject) => {
23
- const proc = Bun.spawn(cmd, { stdout: 'pipe', stderr: 'pipe' });
24
- const timer = setTimeout(() => {
25
- proc.kill();
26
- reject(new Error(`Process timed out after ${timeoutMs}ms: ${cmd[0]}`));
27
- }, timeoutMs);
28
- proc.exited.then(async (exitCode) => {
29
- clearTimeout(timer);
30
- const stdout = await new Response(proc.stdout).text();
31
- const stderr = await new Response(proc.stderr).text();
32
- resolve({ exitCode, stdout, stderr });
33
- });
34
- });
35
- }
36
-
37
- export async function extractKeyframesForAsset(
38
- assetId: string,
39
- intervalSeconds?: number,
40
- onProgress?: (msg: string) => void,
41
- ): Promise<void> {
42
- const interval = intervalSeconds ?? 3;
43
-
44
- const asset = getMediaAssetById(assetId);
45
- if (!asset) {
46
- throw new Error(`Media asset not found: ${assetId}`);
47
- }
48
-
49
- if (asset.mediaType !== 'video') {
50
- throw new Error(`Keyframe extraction requires a video asset. Got: ${asset.mediaType}`);
51
- }
52
-
53
- // Find or create the keyframe_extraction processing stage
54
- let stage: ProcessingStage | undefined;
55
- const existingStages = getProcessingStagesForAsset(assetId);
56
- stage = existingStages.find((s) => s.stage === 'keyframe_extraction');
57
- if (!stage) {
58
- stage = createProcessingStage({ assetId, stage: 'keyframe_extraction' });
59
- }
60
-
61
- updateProcessingStage(stage.id, { status: 'running', startedAt: Date.now() });
62
-
63
- // Store keyframes in a durable directory alongside the source file.
64
- // Extract to a temp dir first so that if ffmpeg fails the old frames remain intact.
65
- const outputDir = join(dirname(asset.filePath), 'keyframes', assetId);
66
- const tempDir = outputDir + '-tmp-' + randomUUID();
67
- await mkdir(tempDir, { recursive: true });
68
-
69
- try {
70
- onProgress?.(`Extracting keyframes every ${interval}s from ${asset.title}...\n`);
71
-
72
- // Use ffmpeg to extract frames at the specified interval
73
- const result = await spawnWithTimeout([
74
- 'ffmpeg', '-y',
75
- '-i', asset.filePath,
76
- '-vf', `fps=1/${interval}`,
77
- '-q:v', '2',
78
- join(tempDir, 'frame-%06d.jpg'),
79
- ], FFMPEG_TIMEOUT_MS);
80
-
81
- if (result.exitCode !== 0) {
82
- await rm(tempDir, { recursive: true, force: true });
83
- updateProcessingStage(stage.id, {
84
- status: 'failed',
85
- lastError: result.stderr.slice(0, 500),
86
- });
87
- throw new Error(`ffmpeg failed: ${result.stderr.slice(0, 500)}`);
88
- }
89
-
90
- // List extracted frames
91
- const files = await readdir(tempDir);
92
- const frameFiles = files
93
- .filter((f) => f.startsWith('frame-') && f.endsWith('.jpg'))
94
- .sort();
95
-
96
- if (frameFiles.length === 0) {
97
- await rm(tempDir, { recursive: true, force: true });
98
- updateProcessingStage(stage.id, {
99
- status: 'failed',
100
- lastError: 'No frames extracted',
101
- });
102
- throw new Error('No frames were extracted from the video.');
103
- }
104
-
105
- // Extraction succeeded — atomically swap temp dir into the durable path
106
- await rm(outputDir, { recursive: true, force: true });
107
- await rename(tempDir, outputDir);
108
-
109
- onProgress?.(`Extracted ${frameFiles.length} frames. Registering in database...\n`);
110
-
111
- // Build keyframe rows
112
- const keyframeRows = frameFiles.map((file, index) => ({
113
- assetId,
114
- timestamp: index * interval,
115
- filePath: join(outputDir, file),
116
- metadata: { frameIndex: index, intervalSeconds: interval },
117
- }));
118
-
119
- // Clear existing keyframes to prevent duplicates on re-extraction
120
- deleteKeyframesForAsset(assetId);
121
-
122
- // Batch insert
123
- const keyframes = insertKeyframesBatch(keyframeRows);
124
-
125
- // Update progress
126
- updateProcessingStage(stage.id, {
127
- status: 'completed',
128
- progress: 100,
129
- completedAt: Date.now(),
130
- });
131
-
132
- onProgress?.(`Registered ${keyframes.length} keyframes.\n`);
133
- } catch (err) {
134
- // Clean up temp dir if it still exists (no-op when already removed above)
135
- await rm(tempDir, { recursive: true, force: true }).catch(() => {});
136
- // Update stage for unexpected errors (ffmpeg/no-frames cases already updated above)
137
- const msg = (err as Error).message;
138
- if (!msg.startsWith('ffmpeg failed:') && msg !== 'No frames were extracted from the video.') {
139
- updateProcessingStage(stage.id, {
140
- status: 'failed',
141
- lastError: msg.slice(0, 500),
142
- });
143
- }
144
- throw err;
145
- }
146
- }
6
+ export { preprocessForAsset } from '../services/preprocess.js';
147
7
 
148
8
  export async function run(
149
9
  input: Record<string, unknown>,
@@ -154,37 +14,46 @@ export async function run(
154
14
  return { content: 'asset_id is required.', isError: true };
155
15
  }
156
16
 
157
- const intervalSeconds = (input.interval_seconds as number) || 3;
17
+ const options: PreprocessOptions = {
18
+ intervalSeconds: (input.interval_seconds as number) || undefined,
19
+ segmentDuration: (input.segment_duration as number) || undefined,
20
+ deadTimeThreshold: (input.dead_time_threshold as number) || undefined,
21
+ sectionConfigPath: (input.section_config as string) || undefined,
22
+ skipDeadTime: input.skip_dead_time !== undefined ? Boolean(input.skip_dead_time) : undefined,
23
+ shortEdge: (input.short_edge as number) || undefined,
24
+ };
158
25
 
159
26
  try {
160
- await extractKeyframesForAsset(assetId, intervalSeconds, context.onOutput);
27
+ const manifest = await preprocessForAsset(assetId, options, context.onOutput);
161
28
 
162
29
  const asset = getMediaAssetById(assetId);
163
- const outputDir = join(dirname(asset!.filePath), 'keyframes', assetId);
30
+ const pipelineDir = join(dirname(asset!.filePath), 'pipeline', assetId);
164
31
  const keyframes = getKeyframesForAsset(assetId);
165
32
 
166
33
  return {
167
34
  content: JSON.stringify({
168
- message: `Extracted and registered ${keyframes.length} keyframes`,
35
+ message: `Preprocessed video: ${manifest.segments.length} segments, ${keyframes.length} keyframes`,
169
36
  assetId,
37
+ segmentCount: manifest.segments.length,
170
38
  keyframeCount: keyframes.length,
171
- intervalSeconds,
172
- outputDir,
39
+ deadTimeRanges: manifest.deadTimeRanges.length,
40
+ subjectGroups: manifest.subjectRegistry.groups.length,
41
+ manifestPath: join(pipelineDir, 'manifest.json'),
42
+ config: manifest.config,
173
43
  }, null, 2),
174
44
  isError: false,
175
45
  };
176
46
  } catch (err) {
177
47
  const msg = (err as Error).message;
178
- // Preserve original error message format: validation and known failures
179
- // are returned directly; unexpected errors get the prefix
180
48
  if (
181
49
  msg.startsWith('Media asset not found:') ||
182
- msg.startsWith('Keyframe extraction requires a video asset.') ||
50
+ msg.startsWith('Preprocess requires a video asset.') ||
51
+ msg.startsWith('Video asset has no duration') ||
183
52
  msg.startsWith('ffmpeg failed:') ||
184
53
  msg === 'No frames were extracted from the video.'
185
54
  ) {
186
55
  return { content: msg, isError: true };
187
56
  }
188
- return { content: `Keyframe extraction failed: ${msg}`, isError: true };
57
+ return { content: `Preprocess failed: ${msg}`, isError: true };
189
58
  }
190
59
  }
@@ -81,12 +81,12 @@ export async function run(
81
81
  }
82
82
 
83
83
  const startTime = input.start_time as number | undefined;
84
- if (startTime === undefined || startTime === null) {
84
+ if (startTime == null) {
85
85
  return { content: 'start_time is required (seconds).', isError: true };
86
86
  }
87
87
 
88
88
  const endTime = input.end_time as number | undefined;
89
- if (endTime === undefined || endTime === null) {
89
+ if (endTime == null) {
90
90
  return { content: 'end_time is required (seconds).', isError: true };
91
91
  }
92
92
 
@@ -2,28 +2,26 @@
2
2
  * Media diagnostics tool.
3
3
  *
4
4
  * Surfaces processing stats, per-stage timing, failure reasons,
5
- * cost estimation, and feedback summary for a media asset.
5
+ * and cost estimation for a media asset.
6
6
  * All metrics are generic media-processing infrastructure.
7
7
  */
8
8
 
9
+ import { join, dirname } from 'node:path';
10
+ import { readFile } from 'node:fs/promises';
9
11
  import type { ToolContext, ToolExecutionResult } from '../../../../tools/types.js';
10
12
  import {
11
13
  getMediaAssetById,
12
14
  getProcessingStagesForAsset,
13
15
  getKeyframesForAsset,
14
- getVisionOutputsForAsset,
15
- getTimelineForAsset,
16
- getEventsForAsset,
17
16
  type ProcessingStage,
18
17
  } from '../../../../memory/media-store.js';
19
- import { aggregateFeedback } from '../services/feedback-aggregation.js';
20
-
18
+ import type { PreprocessManifest } from '../services/preprocess.js';
21
19
  // ---------------------------------------------------------------------------
22
- // Cost estimation constants
20
+ // Cost estimation constants (Gemini 2.5 Flash pricing)
23
21
  // ---------------------------------------------------------------------------
24
22
 
25
- /** Estimated cost per vision API call (one keyframe analysis). */
26
- const ESTIMATED_COST_PER_FRAME_USD = 0.003;
23
+ /** Estimated cost per segment Map call (Gemini 2.5 Flash with ~10 frames). */
24
+ const ESTIMATED_COST_PER_SEGMENT_USD = 0.001;
27
25
 
28
26
  // ---------------------------------------------------------------------------
29
27
  // Types
@@ -45,29 +43,15 @@ interface DiagnosticReport {
45
43
  durationSeconds: number | null;
46
44
  processingStats: {
47
45
  totalKeyframes: number;
48
- totalVisionOutputs: number;
49
- totalTimelineSegments: number;
50
- totalEventsDetected: number;
51
46
  };
52
47
  stages: StageDiagnostic[];
53
48
  costEstimate: {
54
49
  keyframeCount: number;
55
- estimatedCostPerFrame: number;
50
+ estimatedSegments: number;
51
+ estimatedCostPerSegment: number;
56
52
  estimatedTotalCost: number;
57
53
  currency: string;
58
- };
59
- feedbackSummary: {
60
- totalFeedbackEntries: number;
61
- statsByEventType: Array<{
62
- eventType: string;
63
- totalEvents: number;
64
- correct: number;
65
- incorrect: number;
66
- boundaryEdit: number;
67
- missed: number;
68
- precision: number | null;
69
- recall: number | null;
70
- }>;
54
+ note: string;
71
55
  };
72
56
  }
73
57
 
@@ -104,11 +88,8 @@ export async function run(
104
88
 
105
89
  // Gather processing stats
106
90
  const keyframes = getKeyframesForAsset(assetId);
107
- const visionOutputs = getVisionOutputsForAsset(assetId);
108
- const timelineSegments = getTimelineForAsset(assetId);
109
- const events = getEventsForAsset(assetId);
110
91
 
111
- // Per-stage diagnostics
92
+ // Per-stage diagnostics (new pipeline: preprocess, map, reduce)
112
93
  const stages = getProcessingStagesForAsset(assetId);
113
94
  const stageDiagnostics: StageDiagnostic[] = stages.map((s) => ({
114
95
  stage: s.stage,
@@ -118,12 +99,22 @@ export async function run(
118
99
  lastError: s.lastError,
119
100
  }));
120
101
 
121
- // Cost estimation based on keyframe count
102
+ // Cost estimation: Gemini 2.5 Flash is ~$0.001 per segment (~10 frames each)
122
103
  const keyframeCount = keyframes.length;
123
- const estimatedTotalCost = keyframeCount * ESTIMATED_COST_PER_FRAME_USD;
124
104
 
125
- // Feedback summary
126
- const feedbackResult = aggregateFeedback(assetId);
105
+ // Prefer actual segment count from preprocess manifest when available
106
+ let estimatedSegments: number;
107
+ const manifestPath = join(dirname(asset.filePath), 'pipeline', asset.id, 'manifest.json');
108
+ try {
109
+ const raw = await readFile(manifestPath, 'utf-8');
110
+ const manifest: PreprocessManifest = JSON.parse(raw);
111
+ estimatedSegments = manifest.segments.length;
112
+ } catch {
113
+ // Manifest doesn't exist yet (preprocess hasn't run) — fall back to estimation
114
+ estimatedSegments = Math.ceil(keyframeCount / 10);
115
+ }
116
+
117
+ const estimatedTotalCost = estimatedSegments * ESTIMATED_COST_PER_SEGMENT_USD;
127
118
 
128
119
  const report: DiagnosticReport = {
129
120
  assetId: asset.id,
@@ -133,29 +124,15 @@ export async function run(
133
124
  durationSeconds: asset.durationSeconds,
134
125
  processingStats: {
135
126
  totalKeyframes: keyframeCount,
136
- totalVisionOutputs: visionOutputs.length,
137
- totalTimelineSegments: timelineSegments.length,
138
- totalEventsDetected: events.length,
139
127
  },
140
128
  stages: stageDiagnostics,
141
129
  costEstimate: {
142
130
  keyframeCount,
143
- estimatedCostPerFrame: ESTIMATED_COST_PER_FRAME_USD,
131
+ estimatedSegments,
132
+ estimatedCostPerSegment: ESTIMATED_COST_PER_SEGMENT_USD,
144
133
  estimatedTotalCost: Math.round(estimatedTotalCost * 1000) / 1000,
145
134
  currency: 'USD',
146
- },
147
- feedbackSummary: {
148
- totalFeedbackEntries: feedbackResult.totalFeedbackEntries,
149
- statsByEventType: feedbackResult.statsByEventType.map((s) => ({
150
- eventType: s.eventType,
151
- totalEvents: s.totalEvents,
152
- correct: s.correct,
153
- incorrect: s.incorrect,
154
- boundaryEdit: s.boundaryEdit,
155
- missed: s.missed,
156
- precision: s.precision,
157
- recall: s.recall,
158
- })),
135
+ note: 'Gemini 2.5 Flash for Map phase; Claude for Reduce phase (additional cost).',
159
136
  },
160
137
  };
161
138