@elizaos/agent 2.0.0-alpha.144 → 2.0.0-alpha.151

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 (598) hide show
  1. package/apps/app-lifeops/src/actions/inbox-digest.d.ts +2 -0
  2. package/apps/app-lifeops/src/actions/inbox-digest.d.ts.map +1 -0
  3. package/apps/app-lifeops/src/actions/inbox-digest.js +1 -0
  4. package/apps/app-lifeops/src/actions/inbox-respond.d.ts +2 -0
  5. package/apps/app-lifeops/src/actions/inbox-respond.d.ts.map +1 -0
  6. package/apps/app-lifeops/src/actions/inbox-respond.js +1 -0
  7. package/apps/app-lifeops/src/actions/inbox-triage.d.ts +2 -0
  8. package/apps/app-lifeops/src/actions/inbox-triage.d.ts.map +1 -0
  9. package/apps/app-lifeops/src/actions/inbox-triage.js +1 -0
  10. package/apps/app-lifeops/src/actions/inbox.d.ts +3 -0
  11. package/apps/app-lifeops/src/actions/inbox.d.ts.map +1 -0
  12. package/apps/app-lifeops/src/actions/inbox.js +856 -0
  13. package/apps/app-lifeops/src/actions/update-owner-profile.d.ts +3 -0
  14. package/apps/app-lifeops/src/actions/update-owner-profile.d.ts.map +1 -0
  15. package/apps/app-lifeops/src/actions/update-owner-profile.js +131 -0
  16. package/apps/app-lifeops/src/inbox/channel-deep-links.d.ts.map +1 -0
  17. package/apps/app-lifeops/src/inbox/config.d.ts.map +1 -0
  18. package/{packages/agent → apps/app-lifeops}/src/inbox/config.js +1 -1
  19. package/apps/app-lifeops/src/inbox/message-fetcher.d.ts.map +1 -0
  20. package/apps/app-lifeops/src/inbox/reflection.d.ts.map +1 -0
  21. package/apps/app-lifeops/src/inbox/repository.d.ts.map +1 -0
  22. package/apps/app-lifeops/src/inbox/triage-classifier.d.ts.map +1 -0
  23. package/apps/app-lifeops/src/inbox/types.d.ts.map +1 -0
  24. package/apps/app-lifeops/src/lifeops/index.d.ts +25 -0
  25. package/apps/app-lifeops/src/lifeops/index.d.ts.map +1 -0
  26. package/apps/app-lifeops/src/lifeops/index.js +24 -0
  27. package/apps/app-lifeops/src/lifeops/screen-context.d.ts +52 -0
  28. package/apps/app-lifeops/src/lifeops/screen-context.d.ts.map +1 -0
  29. package/apps/app-lifeops/src/lifeops/screen-context.js +332 -0
  30. package/apps/app-lifeops/src/plugin.d.ts +3 -0
  31. package/apps/app-lifeops/src/plugin.d.ts.map +1 -1
  32. package/apps/app-lifeops/src/plugin.js +16 -3
  33. package/apps/app-lifeops/src/providers/inbox-triage.d.ts +3 -0
  34. package/apps/app-lifeops/src/providers/inbox-triage.d.ts.map +1 -0
  35. package/apps/app-lifeops/src/providers/inbox-triage.js +89 -0
  36. package/package.json +6 -4
  37. package/packages/agent/src/actions/calendar.d.ts +1 -18
  38. package/packages/agent/src/actions/calendar.d.ts.map +1 -1
  39. package/packages/agent/src/actions/calendar.js +1 -3143
  40. package/packages/agent/src/actions/check-balance.d.ts +17 -0
  41. package/packages/agent/src/actions/check-balance.d.ts.map +1 -0
  42. package/packages/agent/src/actions/check-balance.js +167 -0
  43. package/packages/agent/src/actions/connector-resolver.d.ts +75 -0
  44. package/packages/agent/src/actions/connector-resolver.d.ts.map +1 -0
  45. package/packages/agent/src/actions/connector-resolver.js +245 -0
  46. package/packages/agent/src/actions/context-signal-lexicon.d.ts +1 -1
  47. package/packages/agent/src/actions/context-signal-lexicon.d.ts.map +1 -1
  48. package/packages/agent/src/actions/context-signal-lexicon.js +6 -0
  49. package/packages/agent/src/actions/eject-plugin.d.ts +3 -0
  50. package/packages/agent/src/actions/eject-plugin.d.ts.map +1 -0
  51. package/packages/agent/src/actions/eject-plugin.js +48 -0
  52. package/packages/agent/src/actions/execute-trade.d.ts +17 -0
  53. package/packages/agent/src/actions/execute-trade.d.ts.map +1 -0
  54. package/packages/agent/src/actions/execute-trade.js +299 -0
  55. package/packages/agent/src/actions/get-self-status.d.ts +13 -0
  56. package/packages/agent/src/actions/get-self-status.d.ts.map +1 -0
  57. package/packages/agent/src/actions/get-self-status.js +66 -0
  58. package/packages/agent/src/actions/gmail.d.ts +1 -32
  59. package/packages/agent/src/actions/gmail.d.ts.map +1 -1
  60. package/packages/agent/src/actions/gmail.js +1 -1734
  61. package/packages/agent/src/actions/inbox-digest.d.ts +1 -1
  62. package/packages/agent/src/actions/inbox-digest.d.ts.map +1 -1
  63. package/packages/agent/src/actions/inbox-digest.js +1 -1
  64. package/packages/agent/src/actions/inbox-respond.d.ts +1 -1
  65. package/packages/agent/src/actions/inbox-respond.d.ts.map +1 -1
  66. package/packages/agent/src/actions/inbox-respond.js +1 -1
  67. package/packages/agent/src/actions/inbox-triage.d.ts +1 -1
  68. package/packages/agent/src/actions/inbox-triage.d.ts.map +1 -1
  69. package/packages/agent/src/actions/inbox-triage.js +1 -1
  70. package/packages/agent/src/actions/inbox.d.ts +1 -2
  71. package/packages/agent/src/actions/inbox.d.ts.map +1 -1
  72. package/packages/agent/src/actions/inbox.js +1 -856
  73. package/packages/agent/src/actions/index.d.ts +13 -0
  74. package/packages/agent/src/actions/index.d.ts.map +1 -1
  75. package/packages/agent/src/actions/index.js +13 -0
  76. package/packages/agent/src/actions/install-plugin.d.ts +3 -0
  77. package/packages/agent/src/actions/install-plugin.d.ts.map +1 -0
  78. package/packages/agent/src/actions/install-plugin.js +65 -0
  79. package/packages/agent/src/actions/life-goal-extractor.d.ts +1 -68
  80. package/packages/agent/src/actions/life-goal-extractor.d.ts.map +1 -1
  81. package/packages/agent/src/actions/life-goal-extractor.js +1 -354
  82. package/packages/agent/src/actions/life-param-extractor.d.ts +1 -77
  83. package/packages/agent/src/actions/life-param-extractor.d.ts.map +1 -1
  84. package/packages/agent/src/actions/life-param-extractor.js +1 -423
  85. package/packages/agent/src/actions/life-recent-context.d.ts +1 -8
  86. package/packages/agent/src/actions/life-recent-context.d.ts.map +1 -1
  87. package/packages/agent/src/actions/life-recent-context.js +1 -84
  88. package/packages/agent/src/actions/life-update-extractor.d.ts +1 -26
  89. package/packages/agent/src/actions/life-update-extractor.d.ts.map +1 -1
  90. package/packages/agent/src/actions/life-update-extractor.js +1 -195
  91. package/packages/agent/src/actions/life.d.ts +1 -8
  92. package/packages/agent/src/actions/life.d.ts.map +1 -1
  93. package/packages/agent/src/actions/life.extractor.d.ts +1 -17
  94. package/packages/agent/src/actions/life.extractor.d.ts.map +1 -1
  95. package/packages/agent/src/actions/life.extractor.js +1 -264
  96. package/packages/agent/src/actions/life.js +1 -3379
  97. package/packages/agent/src/actions/lifeops-extraction-config.d.ts +1 -15
  98. package/packages/agent/src/actions/lifeops-extraction-config.d.ts.map +1 -1
  99. package/packages/agent/src/actions/lifeops-extraction-config.js +1 -25
  100. package/packages/agent/src/actions/lifeops-google-helpers.d.ts +1 -61
  101. package/packages/agent/src/actions/lifeops-google-helpers.d.ts.map +1 -1
  102. package/packages/agent/src/actions/lifeops-google-helpers.js +1 -607
  103. package/packages/agent/src/actions/list-ejected.d.ts +3 -0
  104. package/packages/agent/src/actions/list-ejected.d.ts.map +1 -0
  105. package/packages/agent/src/actions/list-ejected.js +35 -0
  106. package/packages/agent/src/actions/log-level.d.ts +3 -0
  107. package/packages/agent/src/actions/log-level.d.ts.map +1 -0
  108. package/packages/agent/src/actions/log-level.js +125 -0
  109. package/packages/agent/src/actions/manage-tasks.d.ts.map +1 -1
  110. package/packages/agent/src/actions/manage-tasks.js +51 -15
  111. package/packages/agent/src/actions/media.d.ts +21 -0
  112. package/packages/agent/src/actions/media.d.ts.map +1 -0
  113. package/packages/agent/src/actions/media.js +384 -0
  114. package/packages/agent/src/actions/read-messages.d.ts +14 -0
  115. package/packages/agent/src/actions/read-messages.d.ts.map +1 -0
  116. package/packages/agent/src/actions/read-messages.js +228 -0
  117. package/packages/agent/src/actions/reinject-plugin.d.ts +3 -0
  118. package/packages/agent/src/actions/reinject-plugin.d.ts.map +1 -0
  119. package/packages/agent/src/actions/reinject-plugin.js +47 -0
  120. package/packages/agent/src/actions/send-message.d.ts +0 -7
  121. package/packages/agent/src/actions/send-message.d.ts.map +1 -1
  122. package/packages/agent/src/actions/send-message.js +170 -49
  123. package/packages/agent/src/actions/sync-plugin.d.ts +3 -0
  124. package/packages/agent/src/actions/sync-plugin.d.ts.map +1 -0
  125. package/packages/agent/src/actions/sync-plugin.js +47 -0
  126. package/packages/agent/src/actions/timezone-normalization.d.ts +1 -2
  127. package/packages/agent/src/actions/timezone-normalization.d.ts.map +1 -1
  128. package/packages/agent/src/actions/timezone-normalization.js +1 -107
  129. package/packages/agent/src/actions/transfer-token.d.ts +17 -0
  130. package/packages/agent/src/actions/transfer-token.d.ts.map +1 -0
  131. package/packages/agent/src/actions/transfer-token.js +470 -0
  132. package/packages/agent/src/actions/update-owner-profile.d.ts +1 -2
  133. package/packages/agent/src/actions/update-owner-profile.d.ts.map +1 -1
  134. package/packages/agent/src/actions/update-owner-profile.js +1 -131
  135. package/packages/agent/src/actions/wallet-action-shared.d.ts +15 -0
  136. package/packages/agent/src/actions/wallet-action-shared.d.ts.map +1 -0
  137. package/packages/agent/src/actions/wallet-action-shared.js +24 -0
  138. package/packages/agent/src/api/agent-admin-routes.d.ts.map +1 -1
  139. package/packages/agent/src/api/agent-admin-routes.js +1 -1
  140. package/packages/agent/src/api/binance-skill-helpers.d.ts.map +1 -1
  141. package/packages/agent/src/api/binance-skill-helpers.js +8 -3
  142. package/packages/agent/src/api/chat-routes.d.ts.map +1 -1
  143. package/packages/agent/src/api/chat-routes.js +20 -5
  144. package/packages/agent/src/api/coding-agents-auth-sanitize.d.ts +1 -22
  145. package/packages/agent/src/api/coding-agents-auth-sanitize.d.ts.map +1 -1
  146. package/packages/agent/src/api/coding-agents-auth-sanitize.js +1 -39
  147. package/packages/agent/src/api/coding-agents-preflight-normalize.d.ts +1 -28
  148. package/packages/agent/src/api/coding-agents-preflight-normalize.d.ts.map +1 -1
  149. package/packages/agent/src/api/coding-agents-preflight-normalize.js +1 -45
  150. package/packages/agent/src/api/coordinator-types.d.ts +1 -46
  151. package/packages/agent/src/api/coordinator-types.d.ts.map +1 -1
  152. package/packages/agent/src/api/coordinator-types.js +1 -1
  153. package/packages/agent/src/api/coordinator-wiring.d.ts +1 -45
  154. package/packages/agent/src/api/coordinator-wiring.d.ts.map +1 -1
  155. package/packages/agent/src/api/coordinator-wiring.js +1 -108
  156. package/packages/agent/src/api/index.d.ts +1 -1
  157. package/packages/agent/src/api/index.d.ts.map +1 -1
  158. package/packages/agent/src/api/index.js +1 -1
  159. package/packages/agent/src/api/lifeops-browser-packaging.d.ts +1 -15
  160. package/packages/agent/src/api/lifeops-browser-packaging.d.ts.map +1 -1
  161. package/packages/agent/src/api/lifeops-browser-packaging.js +1 -305
  162. package/packages/agent/src/api/lifeops-routes.d.ts +1 -19
  163. package/packages/agent/src/api/lifeops-routes.d.ts.map +1 -1
  164. package/packages/agent/src/api/lifeops-routes.js +1 -1173
  165. package/packages/agent/src/api/server.d.ts.map +1 -1
  166. package/packages/agent/src/api/server.js +6 -6
  167. package/packages/agent/src/api/task-agent-message-routing.d.ts +1 -9
  168. package/packages/agent/src/api/task-agent-message-routing.d.ts.map +1 -1
  169. package/packages/agent/src/api/task-agent-message-routing.js +1 -62
  170. package/packages/agent/src/api/website-blocker-routes.d.ts +1 -6
  171. package/packages/agent/src/api/website-blocker-routes.d.ts.map +1 -1
  172. package/packages/agent/src/api/website-blocker-routes.js +1 -174
  173. package/packages/agent/src/config/types.agent-defaults.d.ts +1 -1
  174. package/packages/agent/src/config/types.agent-defaults.d.ts.map +1 -1
  175. package/packages/agent/src/evals/coordinator-eval-client.d.ts +1 -38
  176. package/packages/agent/src/evals/coordinator-eval-client.d.ts.map +1 -1
  177. package/packages/agent/src/evals/coordinator-eval-client.js +1 -138
  178. package/packages/agent/src/evals/coordinator-live-runner.d.ts +1 -56
  179. package/packages/agent/src/evals/coordinator-live-runner.d.ts.map +1 -1
  180. package/packages/agent/src/evals/coordinator-live-runner.js +1 -546
  181. package/packages/agent/src/evals/coordinator-preflight.d.ts +1 -31
  182. package/packages/agent/src/evals/coordinator-preflight.d.ts.map +1 -1
  183. package/packages/agent/src/evals/coordinator-preflight.js +1 -296
  184. package/packages/agent/src/evals/coordinator-scenarios.d.ts +1 -23
  185. package/packages/agent/src/evals/coordinator-scenarios.d.ts.map +1 -1
  186. package/packages/agent/src/evals/coordinator-scenarios.js +1 -1141
  187. package/packages/agent/src/lifeops/app-state.d.ts +1 -10
  188. package/packages/agent/src/lifeops/app-state.d.ts.map +1 -1
  189. package/packages/agent/src/lifeops/app-state.js +1 -32
  190. package/packages/agent/src/lifeops/apple-reminders.d.ts +1 -57
  191. package/packages/agent/src/lifeops/apple-reminders.d.ts.map +1 -1
  192. package/packages/agent/src/lifeops/apple-reminders.js +1 -325
  193. package/packages/agent/src/lifeops/defaults.d.ts +1 -23
  194. package/packages/agent/src/lifeops/defaults.d.ts.map +1 -1
  195. package/packages/agent/src/lifeops/defaults.js +1 -205
  196. package/packages/agent/src/lifeops/engine.d.ts +1 -7
  197. package/packages/agent/src/lifeops/engine.d.ts.map +1 -1
  198. package/packages/agent/src/lifeops/engine.js +1 -389
  199. package/packages/agent/src/lifeops/goal-grounding.d.ts +1 -53
  200. package/packages/agent/src/lifeops/goal-grounding.d.ts.map +1 -1
  201. package/packages/agent/src/lifeops/goal-grounding.js +1 -147
  202. package/packages/agent/src/lifeops/goal-semantic-evaluator.d.ts +1 -11
  203. package/packages/agent/src/lifeops/goal-semantic-evaluator.d.ts.map +1 -1
  204. package/packages/agent/src/lifeops/goal-semantic-evaluator.js +1 -154
  205. package/packages/agent/src/lifeops/google-api-error.d.ts +1 -6
  206. package/packages/agent/src/lifeops/google-api-error.d.ts.map +1 -1
  207. package/packages/agent/src/lifeops/google-api-error.js +1 -35
  208. package/packages/agent/src/lifeops/google-calendar.d.ts +1 -52
  209. package/packages/agent/src/lifeops/google-calendar.d.ts.map +1 -1
  210. package/packages/agent/src/lifeops/google-calendar.js +1 -268
  211. package/packages/agent/src/lifeops/google-connector-gateway.d.ts +1 -18
  212. package/packages/agent/src/lifeops/google-connector-gateway.d.ts.map +1 -1
  213. package/packages/agent/src/lifeops/google-connector-gateway.js +1 -65
  214. package/packages/agent/src/lifeops/google-fetch.d.ts +1 -10
  215. package/packages/agent/src/lifeops/google-fetch.d.ts.map +1 -1
  216. package/packages/agent/src/lifeops/google-fetch.js +1 -85
  217. package/packages/agent/src/lifeops/google-gmail.d.ts +1 -53
  218. package/packages/agent/src/lifeops/google-gmail.d.ts.map +1 -1
  219. package/packages/agent/src/lifeops/google-gmail.js +1 -471
  220. package/packages/agent/src/lifeops/google-managed-client.d.ts +1 -126
  221. package/packages/agent/src/lifeops/google-managed-client.d.ts.map +1 -1
  222. package/packages/agent/src/lifeops/google-managed-client.js +1 -294
  223. package/packages/agent/src/lifeops/google-oauth.d.ts +1 -60
  224. package/packages/agent/src/lifeops/google-oauth.d.ts.map +1 -1
  225. package/packages/agent/src/lifeops/google-oauth.js +1 -494
  226. package/packages/agent/src/lifeops/google-scopes.d.ts +1 -12
  227. package/packages/agent/src/lifeops/google-scopes.d.ts.map +1 -1
  228. package/packages/agent/src/lifeops/google-scopes.js +1 -96
  229. package/packages/agent/src/lifeops/index.d.ts +1 -2
  230. package/packages/agent/src/lifeops/index.d.ts.map +1 -1
  231. package/packages/agent/src/lifeops/index.js +1 -2
  232. package/packages/agent/src/lifeops/owner-profile.d.ts +1 -14
  233. package/packages/agent/src/lifeops/owner-profile.d.ts.map +1 -1
  234. package/packages/agent/src/lifeops/owner-profile.js +1 -194
  235. package/packages/agent/src/lifeops/repository.d.ts +1 -208
  236. package/packages/agent/src/lifeops/repository.d.ts.map +1 -1
  237. package/packages/agent/src/lifeops/repository.js +1 -3187
  238. package/packages/agent/src/lifeops/runtime.d.ts +1 -13
  239. package/packages/agent/src/lifeops/runtime.d.ts.map +1 -1
  240. package/packages/agent/src/lifeops/runtime.js +1 -120
  241. package/packages/agent/src/lifeops/screen-context.d.ts +1 -51
  242. package/packages/agent/src/lifeops/screen-context.d.ts.map +1 -1
  243. package/packages/agent/src/lifeops/screen-context.js +1 -332
  244. package/packages/agent/src/lifeops/seed-routines.d.ts +1 -19
  245. package/packages/agent/src/lifeops/seed-routines.d.ts.map +1 -1
  246. package/packages/agent/src/lifeops/seed-routines.js +1 -111
  247. package/packages/agent/src/lifeops/service.d.ts +1 -274
  248. package/packages/agent/src/lifeops/service.d.ts.map +1 -1
  249. package/packages/agent/src/lifeops/service.js +1 -9260
  250. package/packages/agent/src/lifeops/sql.d.ts +1 -30
  251. package/packages/agent/src/lifeops/sql.d.ts.map +1 -1
  252. package/packages/agent/src/lifeops/sql.js +1 -247
  253. package/packages/agent/src/lifeops/time.d.ts +1 -16
  254. package/packages/agent/src/lifeops/time.d.ts.map +1 -1
  255. package/packages/agent/src/lifeops/time.js +1 -132
  256. package/packages/agent/src/lifeops/twilio.d.ts +1 -24
  257. package/packages/agent/src/lifeops/twilio.d.ts.map +1 -1
  258. package/packages/agent/src/lifeops/twilio.js +1 -157
  259. package/packages/agent/src/lifeops/x-poster.d.ts +1 -18
  260. package/packages/agent/src/lifeops/x-poster.d.ts.map +1 -1
  261. package/packages/agent/src/lifeops/x-poster.js +1 -148
  262. package/packages/agent/src/providers/inbox-triage.d.ts +1 -2
  263. package/packages/agent/src/providers/inbox-triage.d.ts.map +1 -1
  264. package/packages/agent/src/providers/inbox-triage.js +1 -89
  265. package/packages/agent/src/providers/index.d.ts +4 -1
  266. package/packages/agent/src/providers/index.d.ts.map +1 -1
  267. package/packages/agent/src/providers/index.js +4 -1
  268. package/packages/agent/src/providers/lifeops.d.ts +1 -2
  269. package/packages/agent/src/providers/lifeops.d.ts.map +1 -1
  270. package/packages/agent/src/providers/lifeops.js +1 -157
  271. package/packages/agent/src/providers/local-models.d.ts +118 -0
  272. package/packages/agent/src/providers/local-models.d.ts.map +1 -0
  273. package/packages/agent/src/providers/local-models.js +427 -0
  274. package/packages/agent/src/providers/media-provider.d.ts +192 -0
  275. package/packages/agent/src/providers/media-provider.d.ts.map +1 -0
  276. package/packages/agent/src/providers/media-provider.js +1088 -0
  277. package/packages/agent/src/providers/self-status.d.ts +4 -0
  278. package/packages/agent/src/providers/self-status.d.ts.map +1 -0
  279. package/packages/agent/src/providers/self-status.js +12 -0
  280. package/packages/agent/src/providers/tasks.d.ts.map +1 -1
  281. package/packages/agent/src/providers/tasks.js +7 -7
  282. package/packages/agent/src/runtime/core-plugins.js +1 -1
  283. package/packages/agent/src/runtime/eliza-plugin.d.ts.map +1 -1
  284. package/packages/agent/src/runtime/eliza-plugin.js +1 -7
  285. package/packages/agent/src/runtime/eliza.js +2 -2
  286. package/packages/agent/src/runtime/plugin-collector.js +3 -3
  287. package/packages/agent/src/runtime/plugin-lifecycle.d.ts.map +1 -1
  288. package/packages/agent/src/runtime/plugin-lifecycle.js +3 -13
  289. package/packages/agent/src/runtime/trajectory-internals.d.ts.map +1 -1
  290. package/packages/agent/src/runtime/trajectory-internals.js +1 -3
  291. package/packages/agent/src/services/built-in-app-routes/hyperscape.d.ts.map +1 -1
  292. package/packages/agent/src/services/coding-task-executor.d.ts +3 -3
  293. package/packages/agent/src/services/coding-task-executor.js +3 -3
  294. package/packages/shared/src/awareness/index.d.ts +2 -0
  295. package/packages/shared/src/awareness/index.d.ts.map +1 -0
  296. package/packages/shared/src/awareness/index.js +1 -0
  297. package/packages/shared/src/awareness/registry.d.ts +27 -0
  298. package/packages/shared/src/awareness/registry.d.ts.map +1 -0
  299. package/packages/shared/src/awareness/registry.js +161 -0
  300. package/packages/shared/src/i18n/generated/validation-keyword-data.d.ts +24 -0
  301. package/packages/shared/src/i18n/generated/validation-keyword-data.d.ts.map +1 -1
  302. package/packages/shared/src/i18n/generated/validation-keyword-data.js +24 -0
  303. package/packages/shared/src/runtime-env.d.ts.map +1 -1
  304. package/packages/shared/src/runtime-env.js +5 -1
  305. package/packages/typescript/src/generated/action-docs.d.ts +135 -0
  306. package/packages/typescript/src/generated/action-docs.d.ts.map +1 -1
  307. package/packages/typescript/src/generated/action-docs.js +237 -0
  308. package/packages/typescript/src/i18n/generated/validation-keyword-data.d.ts +24 -0
  309. package/packages/typescript/src/i18n/generated/validation-keyword-data.d.ts.map +1 -1
  310. package/packages/typescript/src/i18n/generated/validation-keyword-data.js +24 -0
  311. package/packages/typescript/src/index.node.d.ts +2 -2
  312. package/packages/typescript/src/index.node.d.ts.map +1 -1
  313. package/packages/typescript/src/index.node.js +4 -3
  314. package/packages/typescript/src/plugin-lifecycle.d.ts.map +1 -1
  315. package/packages/typescript/src/plugin-lifecycle.js +42 -3
  316. package/packages/typescript/src/services/message.d.ts.map +1 -1
  317. package/packages/typescript/src/services/message.js +32 -0
  318. package/apps/app-training/src/core/cli.d.ts +0 -11
  319. package/apps/app-training/src/core/cli.d.ts.map +0 -1
  320. package/apps/app-training/src/core/cli.js +0 -302
  321. package/apps/app-training/src/core/context-audit.d.ts +0 -51
  322. package/apps/app-training/src/core/context-audit.d.ts.map +0 -1
  323. package/apps/app-training/src/core/context-audit.js +0 -141
  324. package/apps/app-training/src/core/context-catalog.d.ts +0 -47
  325. package/apps/app-training/src/core/context-catalog.d.ts.map +0 -1
  326. package/apps/app-training/src/core/context-catalog.js +0 -259
  327. package/apps/app-training/src/core/context-types.d.ts +0 -3
  328. package/apps/app-training/src/core/context-types.d.ts.map +0 -1
  329. package/apps/app-training/src/core/context-types.js +0 -11
  330. package/apps/app-training/src/core/dataset-generator.d.ts +0 -135
  331. package/apps/app-training/src/core/dataset-generator.d.ts.map +0 -1
  332. package/apps/app-training/src/core/dataset-generator.js +0 -703
  333. package/apps/app-training/src/core/replay-validator.d.ts +0 -96
  334. package/apps/app-training/src/core/replay-validator.d.ts.map +0 -1
  335. package/apps/app-training/src/core/replay-validator.js +0 -265
  336. package/apps/app-training/src/core/roleplay-executor.d.ts +0 -123
  337. package/apps/app-training/src/core/roleplay-executor.d.ts.map +0 -1
  338. package/apps/app-training/src/core/roleplay-executor.js +0 -645
  339. package/apps/app-training/src/core/roleplay-trajectories.d.ts +0 -54
  340. package/apps/app-training/src/core/roleplay-trajectories.d.ts.map +0 -1
  341. package/apps/app-training/src/core/roleplay-trajectories.js +0 -73
  342. package/apps/app-training/src/core/scenario-blueprints.d.ts +0 -62
  343. package/apps/app-training/src/core/scenario-blueprints.d.ts.map +0 -1
  344. package/apps/app-training/src/core/scenario-blueprints.js +0 -790
  345. package/apps/app-training/src/core/trajectory-task-datasets.d.ts +0 -38
  346. package/apps/app-training/src/core/trajectory-task-datasets.d.ts.map +0 -1
  347. package/apps/app-training/src/core/trajectory-task-datasets.js +0 -281
  348. package/apps/app-training/src/core/vertex-tuning.d.ts +0 -139
  349. package/apps/app-training/src/core/vertex-tuning.d.ts.map +0 -1
  350. package/apps/app-training/src/core/vertex-tuning.js +0 -234
  351. package/packages/agent/src/inbox/channel-deep-links.d.ts.map +0 -1
  352. package/packages/agent/src/inbox/config.d.ts.map +0 -1
  353. package/packages/agent/src/inbox/message-fetcher.d.ts.map +0 -1
  354. package/packages/agent/src/inbox/reflection.d.ts.map +0 -1
  355. package/packages/agent/src/inbox/repository.d.ts.map +0 -1
  356. package/packages/agent/src/inbox/triage-classifier.d.ts.map +0 -1
  357. package/packages/agent/src/inbox/types.d.ts.map +0 -1
  358. package/packages/agent/src/training/cli.d.ts +0 -2
  359. package/packages/agent/src/training/cli.d.ts.map +0 -1
  360. package/packages/agent/src/training/cli.js +0 -2
  361. package/packages/agent/src/training/context-audit.d.ts +0 -2
  362. package/packages/agent/src/training/context-audit.d.ts.map +0 -1
  363. package/packages/agent/src/training/context-audit.js +0 -2
  364. package/packages/agent/src/training/context-catalog.d.ts +0 -2
  365. package/packages/agent/src/training/context-catalog.d.ts.map +0 -1
  366. package/packages/agent/src/training/context-catalog.js +0 -2
  367. package/packages/agent/src/training/context-types.d.ts +0 -2
  368. package/packages/agent/src/training/context-types.d.ts.map +0 -1
  369. package/packages/agent/src/training/context-types.js +0 -2
  370. package/packages/agent/src/training/dataset-generator.d.ts +0 -2
  371. package/packages/agent/src/training/dataset-generator.d.ts.map +0 -1
  372. package/packages/agent/src/training/dataset-generator.js +0 -2
  373. package/packages/agent/src/training/replay-validator.d.ts +0 -2
  374. package/packages/agent/src/training/replay-validator.d.ts.map +0 -1
  375. package/packages/agent/src/training/replay-validator.js +0 -2
  376. package/packages/agent/src/training/roleplay-executor.d.ts +0 -2
  377. package/packages/agent/src/training/roleplay-executor.d.ts.map +0 -1
  378. package/packages/agent/src/training/roleplay-executor.js +0 -2
  379. package/packages/agent/src/training/roleplay-trajectories.d.ts +0 -2
  380. package/packages/agent/src/training/roleplay-trajectories.d.ts.map +0 -1
  381. package/packages/agent/src/training/roleplay-trajectories.js +0 -2
  382. package/packages/agent/src/training/scenario-blueprints.d.ts +0 -2
  383. package/packages/agent/src/training/scenario-blueprints.d.ts.map +0 -1
  384. package/packages/agent/src/training/scenario-blueprints.js +0 -2
  385. package/packages/agent/src/training/trajectory-task-datasets.d.ts +0 -2
  386. package/packages/agent/src/training/trajectory-task-datasets.d.ts.map +0 -1
  387. package/packages/agent/src/training/trajectory-task-datasets.js +0 -2
  388. package/packages/agent/src/training/vertex-tuning.d.ts +0 -2
  389. package/packages/agent/src/training/vertex-tuning.d.ts.map +0 -1
  390. package/packages/agent/src/training/vertex-tuning.js +0 -2
  391. package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.d.ts +0 -41
  392. package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.d.ts.map +0 -1
  393. package/packages/typescript/src/features/orchestrator/actions/coding-task-handlers.js +0 -443
  394. package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.d.ts +0 -34
  395. package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.d.ts.map +0 -1
  396. package/packages/typescript/src/features/orchestrator/actions/coding-task-helpers.js +0 -171
  397. package/packages/typescript/src/features/orchestrator/actions/eval-metadata.d.ts +0 -11
  398. package/packages/typescript/src/features/orchestrator/actions/eval-metadata.d.ts.map +0 -1
  399. package/packages/typescript/src/features/orchestrator/actions/eval-metadata.js +0 -55
  400. package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.d.ts +0 -11
  401. package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.d.ts.map +0 -1
  402. package/packages/typescript/src/features/orchestrator/actions/finalize-workspace.js +0 -214
  403. package/packages/typescript/src/features/orchestrator/actions/list-agents.d.ts +0 -13
  404. package/packages/typescript/src/features/orchestrator/actions/list-agents.d.ts.map +0 -1
  405. package/packages/typescript/src/features/orchestrator/actions/list-agents.js +0 -174
  406. package/packages/typescript/src/features/orchestrator/actions/manage-issues.d.ts +0 -11
  407. package/packages/typescript/src/features/orchestrator/actions/manage-issues.d.ts.map +0 -1
  408. package/packages/typescript/src/features/orchestrator/actions/manage-issues.js +0 -428
  409. package/packages/typescript/src/features/orchestrator/actions/provision-workspace.d.ts +0 -11
  410. package/packages/typescript/src/features/orchestrator/actions/provision-workspace.d.ts.map +0 -1
  411. package/packages/typescript/src/features/orchestrator/actions/provision-workspace.js +0 -189
  412. package/packages/typescript/src/features/orchestrator/actions/send-to-agent.d.ts +0 -12
  413. package/packages/typescript/src/features/orchestrator/actions/send-to-agent.d.ts.map +0 -1
  414. package/packages/typescript/src/features/orchestrator/actions/send-to-agent.js +0 -265
  415. package/packages/typescript/src/features/orchestrator/actions/spawn-agent.d.ts +0 -12
  416. package/packages/typescript/src/features/orchestrator/actions/spawn-agent.d.ts.map +0 -1
  417. package/packages/typescript/src/features/orchestrator/actions/spawn-agent.js +0 -356
  418. package/packages/typescript/src/features/orchestrator/actions/start-coding-task.d.ts +0 -22
  419. package/packages/typescript/src/features/orchestrator/actions/start-coding-task.d.ts.map +0 -1
  420. package/packages/typescript/src/features/orchestrator/actions/start-coding-task.js +0 -270
  421. package/packages/typescript/src/features/orchestrator/actions/stop-agent.d.ts +0 -12
  422. package/packages/typescript/src/features/orchestrator/actions/stop-agent.d.ts.map +0 -1
  423. package/packages/typescript/src/features/orchestrator/actions/stop-agent.js +0 -192
  424. package/packages/typescript/src/features/orchestrator/actions/task-control.d.ts +0 -3
  425. package/packages/typescript/src/features/orchestrator/actions/task-control.d.ts.map +0 -1
  426. package/packages/typescript/src/features/orchestrator/actions/task-control.js +0 -217
  427. package/packages/typescript/src/features/orchestrator/actions/task-history.d.ts +0 -3
  428. package/packages/typescript/src/features/orchestrator/actions/task-history.d.ts.map +0 -1
  429. package/packages/typescript/src/features/orchestrator/actions/task-history.js +0 -323
  430. package/packages/typescript/src/features/orchestrator/actions/task-share.d.ts +0 -3
  431. package/packages/typescript/src/features/orchestrator/actions/task-share.d.ts.map +0 -1
  432. package/packages/typescript/src/features/orchestrator/actions/task-share.js +0 -168
  433. package/packages/typescript/src/features/orchestrator/actions/task-thread-target.d.ts +0 -11
  434. package/packages/typescript/src/features/orchestrator/actions/task-thread-target.d.ts.map +0 -1
  435. package/packages/typescript/src/features/orchestrator/actions/task-thread-target.js +0 -68
  436. package/packages/typescript/src/features/orchestrator/api/agent-routes.d.ts +0 -18
  437. package/packages/typescript/src/features/orchestrator/api/agent-routes.d.ts.map +0 -1
  438. package/packages/typescript/src/features/orchestrator/api/agent-routes.js +0 -654
  439. package/packages/typescript/src/features/orchestrator/api/coordinator-routes.d.ts +0 -22
  440. package/packages/typescript/src/features/orchestrator/api/coordinator-routes.d.ts.map +0 -1
  441. package/packages/typescript/src/features/orchestrator/api/coordinator-routes.js +0 -403
  442. package/packages/typescript/src/features/orchestrator/api/hook-routes.d.ts +0 -18
  443. package/packages/typescript/src/features/orchestrator/api/hook-routes.d.ts.map +0 -1
  444. package/packages/typescript/src/features/orchestrator/api/hook-routes.js +0 -164
  445. package/packages/typescript/src/features/orchestrator/api/issue-routes.d.ts +0 -17
  446. package/packages/typescript/src/features/orchestrator/api/issue-routes.d.ts.map +0 -1
  447. package/packages/typescript/src/features/orchestrator/api/issue-routes.js +0 -132
  448. package/packages/typescript/src/features/orchestrator/api/routes.d.ts +0 -37
  449. package/packages/typescript/src/features/orchestrator/api/routes.d.ts.map +0 -1
  450. package/packages/typescript/src/features/orchestrator/api/routes.js +0 -96
  451. package/packages/typescript/src/features/orchestrator/api/workspace-routes.d.ts +0 -17
  452. package/packages/typescript/src/features/orchestrator/api/workspace-routes.d.ts.map +0 -1
  453. package/packages/typescript/src/features/orchestrator/api/workspace-routes.js +0 -149
  454. package/packages/typescript/src/features/orchestrator/base-plugin.d.ts +0 -19
  455. package/packages/typescript/src/features/orchestrator/base-plugin.d.ts.map +0 -1
  456. package/packages/typescript/src/features/orchestrator/base-plugin.js +0 -75
  457. package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.d.ts +0 -101
  458. package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.d.ts.map +0 -1
  459. package/packages/typescript/src/features/orchestrator/claude-jsonl-completion-watcher.js +0 -310
  460. package/packages/typescript/src/features/orchestrator/index.d.ts +0 -33
  461. package/packages/typescript/src/features/orchestrator/index.d.ts.map +0 -1
  462. package/packages/typescript/src/features/orchestrator/index.js +0 -30
  463. package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.d.ts +0 -15
  464. package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.d.ts.map +0 -1
  465. package/packages/typescript/src/features/orchestrator/patch-agent-orchestrator-plugin.js +0 -1449
  466. package/packages/typescript/src/features/orchestrator/providers/action-examples.d.ts +0 -14
  467. package/packages/typescript/src/features/orchestrator/providers/action-examples.d.ts.map +0 -1
  468. package/packages/typescript/src/features/orchestrator/providers/action-examples.js +0 -151
  469. package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.d.ts +0 -13
  470. package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.d.ts.map +0 -1
  471. package/packages/typescript/src/features/orchestrator/providers/active-workspace-context.js +0 -142
  472. package/packages/typescript/src/features/orchestrator/services/agent-credentials.d.ts +0 -6
  473. package/packages/typescript/src/features/orchestrator/services/agent-credentials.d.ts.map +0 -1
  474. package/packages/typescript/src/features/orchestrator/services/agent-credentials.js +0 -91
  475. package/packages/typescript/src/features/orchestrator/services/agent-metrics.d.ts +0 -30
  476. package/packages/typescript/src/features/orchestrator/services/agent-metrics.d.ts.map +0 -1
  477. package/packages/typescript/src/features/orchestrator/services/agent-metrics.js +0 -54
  478. package/packages/typescript/src/features/orchestrator/services/agent-selection.d.ts +0 -53
  479. package/packages/typescript/src/features/orchestrator/services/agent-selection.d.ts.map +0 -1
  480. package/packages/typescript/src/features/orchestrator/services/agent-selection.js +0 -70
  481. package/packages/typescript/src/features/orchestrator/services/ansi-utils.d.ts +0 -61
  482. package/packages/typescript/src/features/orchestrator/services/ansi-utils.d.ts.map +0 -1
  483. package/packages/typescript/src/features/orchestrator/services/ansi-utils.js +0 -252
  484. package/packages/typescript/src/features/orchestrator/services/config-env.d.ts +0 -13
  485. package/packages/typescript/src/features/orchestrator/services/config-env.d.ts.map +0 -1
  486. package/packages/typescript/src/features/orchestrator/services/config-env.js +0 -37
  487. package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.d.ts +0 -50
  488. package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.d.ts.map +0 -1
  489. package/packages/typescript/src/features/orchestrator/services/coordinator-event-normalizer.js +0 -184
  490. package/packages/typescript/src/features/orchestrator/services/debug-capture.d.ts +0 -38
  491. package/packages/typescript/src/features/orchestrator/services/debug-capture.d.ts.map +0 -1
  492. package/packages/typescript/src/features/orchestrator/services/debug-capture.js +0 -113
  493. package/packages/typescript/src/features/orchestrator/services/pty-auto-response.d.ts +0 -30
  494. package/packages/typescript/src/features/orchestrator/services/pty-auto-response.d.ts.map +0 -1
  495. package/packages/typescript/src/features/orchestrator/services/pty-auto-response.js +0 -146
  496. package/packages/typescript/src/features/orchestrator/services/pty-init.d.ts +0 -54
  497. package/packages/typescript/src/features/orchestrator/services/pty-init.d.ts.map +0 -1
  498. package/packages/typescript/src/features/orchestrator/services/pty-init.js +0 -315
  499. package/packages/typescript/src/features/orchestrator/services/pty-service.d.ts +0 -175
  500. package/packages/typescript/src/features/orchestrator/services/pty-service.d.ts.map +0 -1
  501. package/packages/typescript/src/features/orchestrator/services/pty-service.js +0 -1469
  502. package/packages/typescript/src/features/orchestrator/services/pty-session-io.d.ts +0 -49
  503. package/packages/typescript/src/features/orchestrator/services/pty-session-io.d.ts.map +0 -1
  504. package/packages/typescript/src/features/orchestrator/services/pty-session-io.js +0 -180
  505. package/packages/typescript/src/features/orchestrator/services/pty-spawn.d.ts +0 -53
  506. package/packages/typescript/src/features/orchestrator/services/pty-spawn.d.ts.map +0 -1
  507. package/packages/typescript/src/features/orchestrator/services/pty-spawn.js +0 -280
  508. package/packages/typescript/src/features/orchestrator/services/pty-types.d.ts +0 -80
  509. package/packages/typescript/src/features/orchestrator/services/pty-types.d.ts.map +0 -1
  510. package/packages/typescript/src/features/orchestrator/services/pty-types.js +0 -51
  511. package/packages/typescript/src/features/orchestrator/services/repo-input.d.ts +0 -16
  512. package/packages/typescript/src/features/orchestrator/services/repo-input.d.ts.map +0 -1
  513. package/packages/typescript/src/features/orchestrator/services/repo-input.js +0 -88
  514. package/packages/typescript/src/features/orchestrator/services/stall-classifier.d.ts +0 -69
  515. package/packages/typescript/src/features/orchestrator/services/stall-classifier.d.ts.map +0 -1
  516. package/packages/typescript/src/features/orchestrator/services/stall-classifier.js +0 -446
  517. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.d.ts +0 -97
  518. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.d.ts.map +0 -1
  519. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator-prompts.js +0 -342
  520. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.d.ts +0 -421
  521. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.d.ts.map +0 -1
  522. package/packages/typescript/src/features/orchestrator/services/swarm-coordinator.js +0 -2356
  523. package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.d.ts +0 -52
  524. package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.d.ts.map +0 -1
  525. package/packages/typescript/src/features/orchestrator/services/swarm-decision-loop.js +0 -1538
  526. package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.d.ts +0 -49
  527. package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.d.ts.map +0 -1
  528. package/packages/typescript/src/features/orchestrator/services/swarm-event-triage.js +0 -171
  529. package/packages/typescript/src/features/orchestrator/services/swarm-history.d.ts +0 -27
  530. package/packages/typescript/src/features/orchestrator/services/swarm-history.d.ts.map +0 -1
  531. package/packages/typescript/src/features/orchestrator/services/swarm-history.js +0 -148
  532. package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.d.ts +0 -22
  533. package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.d.ts.map +0 -1
  534. package/packages/typescript/src/features/orchestrator/services/swarm-idle-watchdog.js +0 -265
  535. package/packages/typescript/src/features/orchestrator/services/task-acceptance.d.ts +0 -8
  536. package/packages/typescript/src/features/orchestrator/services/task-acceptance.d.ts.map +0 -1
  537. package/packages/typescript/src/features/orchestrator/services/task-acceptance.js +0 -114
  538. package/packages/typescript/src/features/orchestrator/services/task-agent-auth.d.ts +0 -68
  539. package/packages/typescript/src/features/orchestrator/services/task-agent-auth.d.ts.map +0 -1
  540. package/packages/typescript/src/features/orchestrator/services/task-agent-auth.js +0 -559
  541. package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.d.ts +0 -82
  542. package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.d.ts.map +0 -1
  543. package/packages/typescript/src/features/orchestrator/services/task-agent-frameworks.js +0 -738
  544. package/packages/typescript/src/features/orchestrator/services/task-kind.d.ts +0 -3
  545. package/packages/typescript/src/features/orchestrator/services/task-kind.d.ts.map +0 -1
  546. package/packages/typescript/src/features/orchestrator/services/task-kind.js +0 -40
  547. package/packages/typescript/src/features/orchestrator/services/task-policy.d.ts +0 -17
  548. package/packages/typescript/src/features/orchestrator/services/task-policy.d.ts.map +0 -1
  549. package/packages/typescript/src/features/orchestrator/services/task-policy.js +0 -226
  550. package/packages/typescript/src/features/orchestrator/services/task-registry.d.ts +0 -550
  551. package/packages/typescript/src/features/orchestrator/services/task-registry.d.ts.map +0 -1
  552. package/packages/typescript/src/features/orchestrator/services/task-registry.js +0 -2182
  553. package/packages/typescript/src/features/orchestrator/services/task-share.d.ts +0 -18
  554. package/packages/typescript/src/features/orchestrator/services/task-share.d.ts.map +0 -1
  555. package/packages/typescript/src/features/orchestrator/services/task-share.js +0 -159
  556. package/packages/typescript/src/features/orchestrator/services/task-validation.d.ts +0 -69
  557. package/packages/typescript/src/features/orchestrator/services/task-validation.d.ts.map +0 -1
  558. package/packages/typescript/src/features/orchestrator/services/task-validation.js +0 -587
  559. package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.d.ts +0 -5
  560. package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.d.ts.map +0 -1
  561. package/packages/typescript/src/features/orchestrator/services/task-verifier-runner.js +0 -372
  562. package/packages/typescript/src/features/orchestrator/services/trajectory-context.d.ts +0 -73
  563. package/packages/typescript/src/features/orchestrator/services/trajectory-context.d.ts.map +0 -1
  564. package/packages/typescript/src/features/orchestrator/services/trajectory-context.js +0 -64
  565. package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.d.ts +0 -53
  566. package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.d.ts.map +0 -1
  567. package/packages/typescript/src/features/orchestrator/services/trajectory-feedback.js +0 -260
  568. package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.d.ts +0 -28
  569. package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.d.ts.map +0 -1
  570. package/packages/typescript/src/features/orchestrator/services/workspace-git-ops.js +0 -105
  571. package/packages/typescript/src/features/orchestrator/services/workspace-github.d.ts +0 -58
  572. package/packages/typescript/src/features/orchestrator/services/workspace-github.d.ts.map +0 -1
  573. package/packages/typescript/src/features/orchestrator/services/workspace-github.js +0 -139
  574. package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.d.ts +0 -18
  575. package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.d.ts.map +0 -1
  576. package/packages/typescript/src/features/orchestrator/services/workspace-lifecycle.js +0 -86
  577. package/packages/typescript/src/features/orchestrator/services/workspace-service.d.ts +0 -118
  578. package/packages/typescript/src/features/orchestrator/services/workspace-service.d.ts.map +0 -1
  579. package/packages/typescript/src/features/orchestrator/services/workspace-service.js +0 -533
  580. package/packages/typescript/src/features/orchestrator/services/workspace-types.d.ts +0 -81
  581. package/packages/typescript/src/features/orchestrator/services/workspace-types.d.ts.map +0 -1
  582. package/packages/typescript/src/features/orchestrator/services/workspace-types.js +0 -8
  583. package/packages/typescript/src/features/orchestrator/task-progress-streamer.d.ts +0 -38
  584. package/packages/typescript/src/features/orchestrator/task-progress-streamer.d.ts.map +0 -1
  585. package/packages/typescript/src/features/orchestrator/task-progress-streamer.js +0 -293
  586. /package/{packages/agent → apps/app-lifeops}/src/inbox/channel-deep-links.d.ts +0 -0
  587. /package/{packages/agent → apps/app-lifeops}/src/inbox/channel-deep-links.js +0 -0
  588. /package/{packages/agent → apps/app-lifeops}/src/inbox/config.d.ts +0 -0
  589. /package/{packages/agent → apps/app-lifeops}/src/inbox/message-fetcher.d.ts +0 -0
  590. /package/{packages/agent → apps/app-lifeops}/src/inbox/message-fetcher.js +0 -0
  591. /package/{packages/agent → apps/app-lifeops}/src/inbox/reflection.d.ts +0 -0
  592. /package/{packages/agent → apps/app-lifeops}/src/inbox/reflection.js +0 -0
  593. /package/{packages/agent → apps/app-lifeops}/src/inbox/repository.d.ts +0 -0
  594. /package/{packages/agent → apps/app-lifeops}/src/inbox/repository.js +0 -0
  595. /package/{packages/agent → apps/app-lifeops}/src/inbox/triage-classifier.d.ts +0 -0
  596. /package/{packages/agent → apps/app-lifeops}/src/inbox/triage-classifier.js +0 -0
  597. /package/{packages/agent → apps/app-lifeops}/src/inbox/types.d.ts +0 -0
  598. /package/{packages/agent → apps/app-lifeops}/src/inbox/types.js +0 -0
@@ -1,2182 +0,0 @@
1
- import crypto from "node:crypto";
2
- let cachedSqlRaw = null;
3
- const schemaReady = new WeakSet();
4
- function asObject(value) {
5
- if (!value || typeof value !== "object" || Array.isArray(value))
6
- return null;
7
- return value;
8
- }
9
- function toText(value, fallback = "") {
10
- if (typeof value === "string")
11
- return value;
12
- if (value === null || value === undefined)
13
- return fallback;
14
- return String(value);
15
- }
16
- function toNumber(value, fallback = 0) {
17
- if (typeof value === "number" && Number.isFinite(value))
18
- return value;
19
- if (typeof value === "string") {
20
- const parsed = Number(value);
21
- if (Number.isFinite(parsed))
22
- return parsed;
23
- }
24
- return fallback;
25
- }
26
- function toNullableText(value) {
27
- if (value === null || value === undefined || value === "")
28
- return null;
29
- return toText(value);
30
- }
31
- function toNullableNumber(value) {
32
- if (value === null || value === undefined || value === "")
33
- return null;
34
- const parsed = toNumber(value, Number.NaN);
35
- return Number.isFinite(parsed) ? parsed : null;
36
- }
37
- function toBoolean(value, fallback = false) {
38
- if (typeof value === "boolean")
39
- return value;
40
- if (typeof value === "number")
41
- return value !== 0;
42
- if (typeof value === "string") {
43
- const normalized = value.trim().toLowerCase();
44
- if (["1", "true", "yes", "on"].includes(normalized))
45
- return true;
46
- if (["0", "false", "no", "off"].includes(normalized))
47
- return false;
48
- }
49
- return fallback;
50
- }
51
- function parseJsonRecord(value) {
52
- if (value === null || value === undefined || value === "")
53
- return {};
54
- if (typeof value !== "string")
55
- return asObject(value) ?? {};
56
- try {
57
- return asObject(JSON.parse(value)) ?? {};
58
- }
59
- catch {
60
- return {};
61
- }
62
- }
63
- function parseJsonArray(value) {
64
- if (value === null || value === undefined || value === "")
65
- return [];
66
- if (Array.isArray(value)) {
67
- return value.filter((entry) => typeof entry === "string");
68
- }
69
- if (typeof value !== "string")
70
- return [];
71
- try {
72
- const parsed = JSON.parse(value);
73
- return Array.isArray(parsed)
74
- ? parsed.filter((entry) => typeof entry === "string")
75
- : [];
76
- }
77
- catch {
78
- return [];
79
- }
80
- }
81
- function isoNow() {
82
- return new Date().toISOString();
83
- }
84
- function sqlQuote(value) {
85
- return `'${value.replace(/'/g, "''")}'`;
86
- }
87
- function sqlText(value) {
88
- if (value === null || value === undefined)
89
- return "NULL";
90
- return sqlQuote(value);
91
- }
92
- function sqlInteger(value) {
93
- if (value === null || value === undefined)
94
- return "NULL";
95
- if (!Number.isFinite(value)) {
96
- throw new Error("invalid numeric SQL literal");
97
- }
98
- return String(Math.trunc(value));
99
- }
100
- function sqlBoolean(value) {
101
- return value ? "TRUE" : "FALSE";
102
- }
103
- function sqlJson(value) {
104
- return sqlQuote(JSON.stringify(value ?? null));
105
- }
106
- function sqlStringList(values) {
107
- return values.map((value) => sqlQuote(value)).join(", ");
108
- }
109
- function normalizeThreadStatus(value) {
110
- switch (toText(value).toLowerCase()) {
111
- case "active":
112
- case "waiting_on_user":
113
- case "blocked":
114
- case "validating":
115
- case "done":
116
- case "failed":
117
- case "archived":
118
- case "interrupted":
119
- return toText(value).toLowerCase();
120
- default:
121
- return "open";
122
- }
123
- }
124
- function normalizeSessionStatus(value) {
125
- switch (toText(value).toLowerCase()) {
126
- case "blocked":
127
- case "waiting_on_user":
128
- case "completed":
129
- case "stopped":
130
- case "error":
131
- case "tool_running":
132
- case "interrupted":
133
- return toText(value).toLowerCase();
134
- default:
135
- return "active";
136
- }
137
- }
138
- function normalizeTaskNodeKind(value) {
139
- switch (toText(value).toLowerCase()) {
140
- case "goal":
141
- case "execution":
142
- case "research":
143
- case "planning":
144
- case "verification":
145
- case "handoff":
146
- return toText(value).toLowerCase();
147
- default:
148
- return "execution";
149
- }
150
- }
151
- function normalizeTaskNodeStatus(value) {
152
- switch (toText(value).toLowerCase()) {
153
- case "ready":
154
- case "claimed":
155
- case "running":
156
- case "blocked":
157
- case "waiting_on_user":
158
- case "verifying":
159
- case "completed":
160
- case "failed":
161
- case "canceled":
162
- case "interrupted":
163
- return toText(value).toLowerCase();
164
- default:
165
- return "planned";
166
- }
167
- }
168
- function normalizeTaskDependencyKind(value) {
169
- switch (toText(value).toLowerCase()) {
170
- case "parent_child":
171
- case "artifact":
172
- case "handoff":
173
- return toText(value).toLowerCase();
174
- default:
175
- return "blocks";
176
- }
177
- }
178
- function normalizeTaskClaimType(value) {
179
- switch (toText(value).toLowerCase()) {
180
- case "verification":
181
- case "ownership":
182
- return toText(value).toLowerCase();
183
- default:
184
- return "execution";
185
- }
186
- }
187
- function normalizeTaskClaimStatus(value) {
188
- switch (toText(value).toLowerCase()) {
189
- case "released":
190
- case "completed":
191
- case "failed":
192
- case "interrupted":
193
- return toText(value).toLowerCase();
194
- default:
195
- return "active";
196
- }
197
- }
198
- function normalizeMailboxDeliveryState(value) {
199
- switch (toText(value).toLowerCase()) {
200
- case "delivered":
201
- case "consumed":
202
- return toText(value).toLowerCase();
203
- default:
204
- return "pending";
205
- }
206
- }
207
- function normalizeVerifierJobStatus(value) {
208
- switch (toText(value).toLowerCase()) {
209
- case "running":
210
- case "passed":
211
- case "failed":
212
- case "canceled":
213
- return toText(value).toLowerCase();
214
- default:
215
- return "pending";
216
- }
217
- }
218
- function extractRows(result) {
219
- if (Array.isArray(result)) {
220
- return result
221
- .map((row) => asObject(row))
222
- .filter((row) => row !== null);
223
- }
224
- const obj = asObject(result);
225
- if (!obj || !Array.isArray(obj.rows))
226
- return [];
227
- return obj.rows
228
- .map((row) => asObject(row))
229
- .filter((row) => row !== null);
230
- }
231
- async function getSqlRaw() {
232
- if (cachedSqlRaw)
233
- return cachedSqlRaw;
234
- const drizzle = (await import("drizzle-orm"));
235
- cachedSqlRaw = drizzle.sql.raw;
236
- return cachedSqlRaw;
237
- }
238
- function getRuntimeDb(runtime) {
239
- const runtimeLike = runtime;
240
- const db = runtimeLike.adapter?.db ?? runtimeLike.databaseAdapter?.db;
241
- if (!db || typeof db.execute !== "function") {
242
- throw new Error("runtime database adapter unavailable");
243
- }
244
- return db;
245
- }
246
- async function executeRawSql(runtime, sqlTextValue) {
247
- const raw = await getSqlRaw();
248
- const result = await getRuntimeDb(runtime).execute(raw(sqlTextValue));
249
- return extractRows(result);
250
- }
251
- function parseThreadRow(row) {
252
- return {
253
- id: toText(row.id),
254
- agentId: toText(row.agent_id),
255
- roomId: toNullableText(row.room_id),
256
- worldId: toNullableText(row.world_id),
257
- ownerUserId: toNullableText(row.owner_user_id),
258
- scenarioId: toNullableText(row.scenario_id),
259
- batchId: toNullableText(row.batch_id),
260
- title: toText(row.title),
261
- kind: toText(row.kind, "coding"),
262
- status: normalizeThreadStatus(row.status),
263
- originalRequest: toText(row.original_request),
264
- summary: toText(row.summary),
265
- acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),
266
- currentPlan: parseJsonRecord(row.current_plan_json),
267
- searchText: toText(row.search_text),
268
- createdAt: toText(row.created_at),
269
- updatedAt: toText(row.updated_at),
270
- closedAt: toNullableText(row.closed_at),
271
- archivedAt: toNullableText(row.archived_at),
272
- lastUserTurnAt: toNullableText(row.last_user_turn_at),
273
- lastCoordinatorTurnAt: toNullableText(row.last_coordinator_turn_at),
274
- metadata: parseJsonRecord(row.metadata_json),
275
- };
276
- }
277
- function parseThreadSummaryRow(row) {
278
- return {
279
- ...parseThreadRow(row),
280
- sessionCount: toNumber(row.session_count, 0),
281
- activeSessionCount: toNumber(row.active_session_count, 0),
282
- latestSessionId: toNullableText(row.latest_session_id),
283
- latestSessionLabel: toNullableText(row.latest_session_label),
284
- latestWorkdir: toNullableText(row.latest_workdir),
285
- latestRepo: toNullableText(row.latest_repo),
286
- latestActivityAt: toNullableNumber(row.latest_activity_at),
287
- decisionCount: toNumber(row.decision_count, 0),
288
- nodeCount: toNumber(row.node_count, 0),
289
- readyNodeCount: toNumber(row.ready_node_count, 0),
290
- completedNodeCount: toNumber(row.completed_node_count, 0),
291
- verifierJobCount: toNumber(row.verifier_job_count, 0),
292
- evidenceCount: toNumber(row.evidence_count, 0),
293
- };
294
- }
295
- function parseSessionRow(row) {
296
- return {
297
- id: toText(row.id),
298
- threadId: toText(row.thread_id),
299
- agentId: toText(row.agent_id),
300
- sessionId: toText(row.session_id),
301
- framework: toText(row.framework, "claude"),
302
- providerSource: toNullableText(row.provider_source),
303
- label: toText(row.label),
304
- originalTask: toText(row.original_task),
305
- workdir: toText(row.workdir),
306
- repo: toNullableText(row.repo),
307
- status: normalizeSessionStatus(row.status),
308
- decisionCount: toNumber(row.decision_count, 0),
309
- autoResolvedCount: toNumber(row.auto_resolved_count, 0),
310
- registeredAt: toNumber(row.registered_at, 0),
311
- lastActivityAt: toNumber(row.last_activity_at, 0),
312
- idleCheckCount: toNumber(row.idle_check_count, 0),
313
- taskDelivered: toBoolean(row.task_delivered),
314
- completionSummary: toNullableText(row.completion_summary),
315
- lastSeenDecisionIndex: toNumber(row.last_seen_decision_index, 0),
316
- lastInputSentAt: toNullableNumber(row.last_input_sent_at),
317
- stoppedAt: toNullableNumber(row.stopped_at),
318
- createdAt: toText(row.created_at),
319
- updatedAt: toText(row.updated_at),
320
- metadata: parseJsonRecord(row.metadata_json),
321
- };
322
- }
323
- function parseDecisionRow(row) {
324
- return {
325
- id: toText(row.id),
326
- threadId: toText(row.thread_id),
327
- sessionId: toText(row.session_id),
328
- timestamp: toNumber(row.timestamp, 0),
329
- event: toText(row.event_type),
330
- promptText: toText(row.prompt_text),
331
- decision: toText(row.decision),
332
- response: toNullableText(row.response),
333
- reasoning: toText(row.reasoning),
334
- metadata: parseJsonRecord(row.metadata_json),
335
- };
336
- }
337
- function parseEventRow(row) {
338
- return {
339
- id: toText(row.id),
340
- threadId: toText(row.thread_id),
341
- sessionId: toNullableText(row.session_id),
342
- eventType: toText(row.event_type),
343
- timestamp: toNumber(row.timestamp, 0),
344
- summary: toText(row.summary),
345
- data: parseJsonRecord(row.data_json),
346
- createdAt: toText(row.created_at),
347
- };
348
- }
349
- function parseArtifactRow(row) {
350
- return {
351
- id: toText(row.id),
352
- threadId: toText(row.thread_id),
353
- sessionId: toNullableText(row.session_id),
354
- artifactType: toText(row.artifact_type),
355
- title: toText(row.title),
356
- path: toNullableText(row.path),
357
- uri: toNullableText(row.uri),
358
- mimeType: toNullableText(row.mime_type),
359
- metadata: parseJsonRecord(row.metadata_json),
360
- createdAt: toText(row.created_at),
361
- };
362
- }
363
- function parseTranscriptRow(row) {
364
- return {
365
- id: toText(row.id),
366
- threadId: toText(row.thread_id),
367
- sessionId: toText(row.session_id),
368
- timestamp: toNumber(row.timestamp, 0),
369
- direction: toText(row.direction),
370
- content: toText(row.content),
371
- metadata: parseJsonRecord(row.metadata_json),
372
- createdAt: toText(row.created_at),
373
- };
374
- }
375
- function parsePendingDecisionRow(row) {
376
- return {
377
- sessionId: toText(row.session_id),
378
- threadId: toText(row.thread_id),
379
- promptText: toText(row.prompt_text),
380
- recentOutput: toText(row.recent_output),
381
- llmDecision: parseJsonRecord(row.llm_decision_json),
382
- taskContext: parseJsonRecord(row.task_context_json),
383
- createdAt: toNumber(row.created_at, 0),
384
- updatedAt: toText(row.updated_at),
385
- };
386
- }
387
- function parseTaskNodeRow(row) {
388
- return {
389
- id: toText(row.id),
390
- threadId: toText(row.thread_id),
391
- parentNodeId: toNullableText(row.parent_node_id),
392
- kind: normalizeTaskNodeKind(row.kind),
393
- status: normalizeTaskNodeStatus(row.status),
394
- title: toText(row.title),
395
- instructions: toText(row.instructions),
396
- acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),
397
- requiredCapabilities: parseJsonArray(row.required_capabilities_json),
398
- expectedArtifacts: parseJsonArray(row.expected_artifacts_json),
399
- assignedSessionId: toNullableText(row.assigned_session_id),
400
- assignedLabel: toNullableText(row.assigned_label),
401
- agentType: toNullableText(row.agent_type),
402
- workdir: toNullableText(row.workdir),
403
- repo: toNullableText(row.repo),
404
- priority: toNumber(row.priority, 0),
405
- depth: toNumber(row.depth, 0),
406
- sequence: toNumber(row.sequence, 0),
407
- createdFrom: toNullableText(row.created_from),
408
- metadata: parseJsonRecord(row.metadata_json),
409
- createdAt: toText(row.created_at),
410
- updatedAt: toText(row.updated_at),
411
- startedAt: toNullableText(row.started_at),
412
- completedAt: toNullableText(row.completed_at),
413
- };
414
- }
415
- function parseTaskDependencyRow(row) {
416
- return {
417
- id: toText(row.id),
418
- threadId: toText(row.thread_id),
419
- fromNodeId: toText(row.from_node_id),
420
- toNodeId: toText(row.to_node_id),
421
- dependencyKind: normalizeTaskDependencyKind(row.dependency_kind),
422
- requiredStatus: normalizeTaskNodeStatus(row.required_status),
423
- metadata: parseJsonRecord(row.metadata_json),
424
- createdAt: toText(row.created_at),
425
- };
426
- }
427
- function parseTaskClaimRow(row) {
428
- return {
429
- id: toText(row.id),
430
- threadId: toText(row.thread_id),
431
- nodeId: toText(row.node_id),
432
- sessionId: toText(row.session_id),
433
- claimType: normalizeTaskClaimType(row.claim_type),
434
- status: normalizeTaskClaimStatus(row.status),
435
- claimedAt: toText(row.claimed_at),
436
- releasedAt: toNullableText(row.released_at),
437
- metadata: parseJsonRecord(row.metadata_json),
438
- };
439
- }
440
- function parseTaskMailboxMessageRow(row) {
441
- return {
442
- id: toText(row.id),
443
- threadId: toText(row.thread_id),
444
- nodeId: toNullableText(row.node_id),
445
- sessionId: toNullableText(row.session_id),
446
- sender: toText(row.sender),
447
- recipient: toText(row.recipient),
448
- subject: toText(row.subject),
449
- body: toText(row.body),
450
- deliveryState: normalizeMailboxDeliveryState(row.delivery_state),
451
- metadata: parseJsonRecord(row.metadata_json),
452
- createdAt: toText(row.created_at),
453
- deliveredAt: toNullableText(row.delivered_at),
454
- };
455
- }
456
- function parseTaskVerifierJobRow(row) {
457
- return {
458
- id: toText(row.id),
459
- threadId: toText(row.thread_id),
460
- nodeId: toText(row.node_id),
461
- status: normalizeVerifierJobStatus(row.status),
462
- verifierType: toText(row.verifier_type),
463
- title: toText(row.title),
464
- instructions: toText(row.instructions),
465
- config: parseJsonRecord(row.config_json),
466
- metadata: parseJsonRecord(row.metadata_json),
467
- createdAt: toText(row.created_at),
468
- startedAt: toNullableText(row.started_at),
469
- completedAt: toNullableText(row.completed_at),
470
- };
471
- }
472
- function parseTaskEvidenceRow(row) {
473
- return {
474
- id: toText(row.id),
475
- threadId: toText(row.thread_id),
476
- nodeId: toNullableText(row.node_id),
477
- sessionId: toNullableText(row.session_id),
478
- verifierJobId: toNullableText(row.verifier_job_id),
479
- evidenceType: toText(row.evidence_type),
480
- title: toText(row.title),
481
- summary: toText(row.summary),
482
- path: toNullableText(row.path),
483
- uri: toNullableText(row.uri),
484
- content: parseJsonRecord(row.content_json),
485
- metadata: parseJsonRecord(row.metadata_json),
486
- createdAt: toText(row.created_at),
487
- };
488
- }
489
- function buildSearchText(parts) {
490
- return parts
491
- .map((part) => (part ?? "").trim().toLowerCase())
492
- .filter(Boolean)
493
- .join(" ");
494
- }
495
- function isTerminalTaskNodeStatus(status) {
496
- return (status === "completed" ||
497
- status === "failed" ||
498
- status === "canceled" ||
499
- status === "interrupted");
500
- }
501
- function dependencyStatusSatisfied(actual, required) {
502
- if (actual === required)
503
- return true;
504
- return false;
505
- }
506
- function buildThreadListWhereClauses(options) {
507
- const clauses = [];
508
- if (options.threadId) {
509
- clauses.push(`thread.id = ${sqlQuote(options.threadId)}`);
510
- }
511
- if (!options.includeArchived) {
512
- clauses.push("thread.archived_at IS NULL");
513
- }
514
- if (options.status) {
515
- clauses.push(`thread.status = ${sqlQuote(options.status)}`);
516
- }
517
- if (Array.isArray(options.statuses) && options.statuses.length > 0) {
518
- const normalizedStatuses = options.statuses
519
- .map((status) => normalizeThreadStatus(status))
520
- .filter(Boolean);
521
- if (normalizedStatuses.length > 0) {
522
- clauses.push(`thread.status IN (${sqlStringList(normalizedStatuses)})`);
523
- }
524
- }
525
- if (options.kind) {
526
- clauses.push(`thread.kind = ${sqlQuote(options.kind)}`);
527
- }
528
- if (options.roomId) {
529
- clauses.push(`thread.room_id = ${sqlQuote(options.roomId)}`);
530
- }
531
- if (options.worldId) {
532
- clauses.push(`thread.world_id = ${sqlQuote(options.worldId)}`);
533
- }
534
- if (options.ownerUserId) {
535
- clauses.push(`thread.owner_user_id = ${sqlQuote(options.ownerUserId)}`);
536
- }
537
- if (options.scenarioId) {
538
- clauses.push(`thread.scenario_id = ${sqlQuote(options.scenarioId)}`);
539
- }
540
- if (options.batchId) {
541
- clauses.push(`thread.batch_id = ${sqlQuote(options.batchId)}`);
542
- }
543
- if (options.createdAfter) {
544
- clauses.push(`thread.created_at >= ${sqlQuote(options.createdAfter)}`);
545
- }
546
- if (options.createdBefore) {
547
- clauses.push(`thread.created_at <= ${sqlQuote(options.createdBefore)}`);
548
- }
549
- if (options.updatedAfter) {
550
- clauses.push(`thread.updated_at >= ${sqlQuote(options.updatedAfter)}`);
551
- }
552
- if (options.updatedBefore) {
553
- clauses.push(`thread.updated_at <= ${sqlQuote(options.updatedBefore)}`);
554
- }
555
- if (typeof options.latestActivityAfter === "number") {
556
- clauses.push(`COALESCE(latest.last_activity_at, 0) >= ${sqlInteger(options.latestActivityAfter)}`);
557
- }
558
- if (typeof options.latestActivityBefore === "number") {
559
- clauses.push(`COALESCE(latest.last_activity_at, 0) <= ${sqlInteger(options.latestActivityBefore)}`);
560
- }
561
- if (typeof options.hasActiveSession === "boolean") {
562
- clauses.push(options.hasActiveSession
563
- ? "COALESCE(session_counts.active_session_count, 0) > 0"
564
- : "COALESCE(session_counts.active_session_count, 0) = 0");
565
- }
566
- if (options.search?.trim()) {
567
- const q = options.search.trim().toLowerCase().replace(/[%_]/g, "\\$&");
568
- clauses.push(`thread.search_text LIKE ${sqlQuote(`%${q}%`)}`);
569
- }
570
- return clauses;
571
- }
572
- export class TaskRegistry {
573
- runtime;
574
- constructor(runtime) {
575
- this.runtime = runtime;
576
- }
577
- schemaKey() {
578
- const runtimeLike = this.runtime;
579
- return (runtimeLike.adapter ??
580
- runtimeLike.databaseAdapter ??
581
- this.runtime);
582
- }
583
- async ensureSchema() {
584
- const key = this.schemaKey();
585
- if (schemaReady.has(key))
586
- return;
587
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_threads (
588
- id TEXT PRIMARY KEY,
589
- agent_id TEXT NOT NULL,
590
- room_id TEXT,
591
- world_id TEXT,
592
- owner_user_id TEXT,
593
- scenario_id TEXT,
594
- batch_id TEXT,
595
- title TEXT NOT NULL,
596
- kind TEXT NOT NULL DEFAULT 'coding',
597
- status TEXT NOT NULL DEFAULT 'open',
598
- original_request TEXT NOT NULL,
599
- summary TEXT NOT NULL DEFAULT '',
600
- acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',
601
- current_plan_json TEXT NOT NULL DEFAULT '{}',
602
- search_text TEXT NOT NULL DEFAULT '',
603
- created_at TEXT NOT NULL,
604
- updated_at TEXT NOT NULL,
605
- closed_at TEXT,
606
- archived_at TEXT,
607
- last_user_turn_at TEXT,
608
- last_coordinator_turn_at TEXT,
609
- metadata_json TEXT NOT NULL DEFAULT '{}'
610
- )`);
611
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_sessions (
612
- id TEXT PRIMARY KEY,
613
- thread_id TEXT NOT NULL,
614
- agent_id TEXT NOT NULL,
615
- session_id TEXT NOT NULL UNIQUE,
616
- framework TEXT NOT NULL,
617
- provider_source TEXT,
618
- label TEXT NOT NULL,
619
- original_task TEXT NOT NULL,
620
- workdir TEXT NOT NULL,
621
- repo TEXT,
622
- status TEXT NOT NULL DEFAULT 'active',
623
- decision_count INTEGER NOT NULL DEFAULT 0,
624
- auto_resolved_count INTEGER NOT NULL DEFAULT 0,
625
- registered_at BIGINT NOT NULL,
626
- last_activity_at BIGINT NOT NULL,
627
- idle_check_count INTEGER NOT NULL DEFAULT 0,
628
- task_delivered BOOLEAN NOT NULL DEFAULT FALSE,
629
- completion_summary TEXT,
630
- last_seen_decision_index INTEGER NOT NULL DEFAULT 0,
631
- last_input_sent_at BIGINT,
632
- stopped_at BIGINT,
633
- created_at TEXT NOT NULL,
634
- updated_at TEXT NOT NULL,
635
- metadata_json TEXT NOT NULL DEFAULT '{}'
636
- )`);
637
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_decisions (
638
- id TEXT PRIMARY KEY,
639
- thread_id TEXT NOT NULL,
640
- session_id TEXT NOT NULL,
641
- timestamp BIGINT NOT NULL,
642
- event_type TEXT NOT NULL,
643
- prompt_text TEXT NOT NULL DEFAULT '',
644
- decision TEXT NOT NULL,
645
- response TEXT,
646
- reasoning TEXT NOT NULL,
647
- metadata_json TEXT NOT NULL DEFAULT '{}',
648
- created_at TEXT NOT NULL
649
- )`);
650
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_events (
651
- id TEXT PRIMARY KEY,
652
- thread_id TEXT NOT NULL,
653
- session_id TEXT,
654
- event_type TEXT NOT NULL,
655
- timestamp BIGINT NOT NULL,
656
- summary TEXT NOT NULL DEFAULT '',
657
- data_json TEXT NOT NULL DEFAULT '{}',
658
- created_at TEXT NOT NULL
659
- )`);
660
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_artifacts (
661
- id TEXT PRIMARY KEY,
662
- thread_id TEXT NOT NULL,
663
- session_id TEXT,
664
- artifact_type TEXT NOT NULL,
665
- title TEXT NOT NULL,
666
- path TEXT,
667
- uri TEXT,
668
- mime_type TEXT,
669
- metadata_json TEXT NOT NULL DEFAULT '{}',
670
- created_at TEXT NOT NULL
671
- )`);
672
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_transcripts (
673
- id TEXT PRIMARY KEY,
674
- thread_id TEXT NOT NULL,
675
- session_id TEXT NOT NULL,
676
- timestamp BIGINT NOT NULL,
677
- direction TEXT NOT NULL,
678
- content TEXT NOT NULL,
679
- metadata_json TEXT NOT NULL DEFAULT '{}',
680
- created_at TEXT NOT NULL
681
- )`);
682
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_pending_decisions (
683
- session_id TEXT PRIMARY KEY,
684
- thread_id TEXT NOT NULL,
685
- prompt_text TEXT NOT NULL,
686
- recent_output TEXT NOT NULL DEFAULT '',
687
- llm_decision_json TEXT NOT NULL DEFAULT '{}',
688
- task_context_json TEXT NOT NULL DEFAULT '{}',
689
- created_at BIGINT NOT NULL,
690
- updated_at TEXT NOT NULL
691
- )`);
692
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_nodes (
693
- id TEXT PRIMARY KEY,
694
- thread_id TEXT NOT NULL,
695
- parent_node_id TEXT,
696
- kind TEXT NOT NULL DEFAULT 'execution',
697
- status TEXT NOT NULL DEFAULT 'planned',
698
- title TEXT NOT NULL,
699
- instructions TEXT NOT NULL DEFAULT '',
700
- acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',
701
- required_capabilities_json TEXT NOT NULL DEFAULT '[]',
702
- expected_artifacts_json TEXT NOT NULL DEFAULT '[]',
703
- assigned_session_id TEXT,
704
- assigned_label TEXT,
705
- agent_type TEXT,
706
- workdir TEXT,
707
- repo TEXT,
708
- priority INTEGER NOT NULL DEFAULT 0,
709
- depth INTEGER NOT NULL DEFAULT 0,
710
- sequence INTEGER NOT NULL DEFAULT 0,
711
- created_from TEXT,
712
- metadata_json TEXT NOT NULL DEFAULT '{}',
713
- created_at TEXT NOT NULL,
714
- updated_at TEXT NOT NULL,
715
- started_at TEXT,
716
- completed_at TEXT
717
- )`);
718
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_dependencies (
719
- id TEXT PRIMARY KEY,
720
- thread_id TEXT NOT NULL,
721
- from_node_id TEXT NOT NULL,
722
- to_node_id TEXT NOT NULL,
723
- dependency_kind TEXT NOT NULL DEFAULT 'blocks',
724
- required_status TEXT NOT NULL DEFAULT 'completed',
725
- metadata_json TEXT NOT NULL DEFAULT '{}',
726
- created_at TEXT NOT NULL
727
- )`);
728
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_claims (
729
- id TEXT PRIMARY KEY,
730
- thread_id TEXT NOT NULL,
731
- node_id TEXT NOT NULL,
732
- session_id TEXT NOT NULL,
733
- claim_type TEXT NOT NULL DEFAULT 'execution',
734
- status TEXT NOT NULL DEFAULT 'active',
735
- claimed_at TEXT NOT NULL,
736
- released_at TEXT,
737
- metadata_json TEXT NOT NULL DEFAULT '{}'
738
- )`);
739
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_mailbox (
740
- id TEXT PRIMARY KEY,
741
- thread_id TEXT NOT NULL,
742
- node_id TEXT,
743
- session_id TEXT,
744
- sender TEXT NOT NULL,
745
- recipient TEXT NOT NULL,
746
- subject TEXT NOT NULL DEFAULT '',
747
- body TEXT NOT NULL,
748
- delivery_state TEXT NOT NULL DEFAULT 'pending',
749
- metadata_json TEXT NOT NULL DEFAULT '{}',
750
- created_at TEXT NOT NULL,
751
- delivered_at TEXT
752
- )`);
753
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_verifier_jobs (
754
- id TEXT PRIMARY KEY,
755
- thread_id TEXT NOT NULL,
756
- node_id TEXT NOT NULL,
757
- status TEXT NOT NULL DEFAULT 'pending',
758
- verifier_type TEXT NOT NULL,
759
- title TEXT NOT NULL,
760
- instructions TEXT NOT NULL DEFAULT '',
761
- config_json TEXT NOT NULL DEFAULT '{}',
762
- metadata_json TEXT NOT NULL DEFAULT '{}',
763
- created_at TEXT NOT NULL,
764
- started_at TEXT,
765
- completed_at TEXT
766
- )`);
767
- await executeRawSql(this.runtime, `CREATE TABLE IF NOT EXISTS orchestrator_task_evidence (
768
- id TEXT PRIMARY KEY,
769
- thread_id TEXT NOT NULL,
770
- node_id TEXT,
771
- session_id TEXT,
772
- verifier_job_id TEXT,
773
- evidence_type TEXT NOT NULL,
774
- title TEXT NOT NULL,
775
- summary TEXT NOT NULL DEFAULT '',
776
- path TEXT,
777
- uri TEXT,
778
- content_json TEXT NOT NULL DEFAULT '{}',
779
- metadata_json TEXT NOT NULL DEFAULT '{}',
780
- created_at TEXT NOT NULL
781
- )`);
782
- await executeRawSql(this.runtime, `ALTER TABLE orchestrator_task_threads ADD COLUMN scenario_id TEXT`).catch(() => undefined);
783
- await executeRawSql(this.runtime, `ALTER TABLE orchestrator_task_threads ADD COLUMN batch_id TEXT`).catch(() => undefined);
784
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_status
785
- ON orchestrator_task_threads(status)`);
786
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_scenario_id
787
- ON orchestrator_task_threads(scenario_id)`);
788
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_batch_id
789
- ON orchestrator_task_threads(batch_id)`);
790
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_updated_at
791
- ON orchestrator_task_threads(updated_at)`);
792
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_archived_at
793
- ON orchestrator_task_threads(archived_at)`);
794
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_thread_id
795
- ON orchestrator_task_sessions(thread_id)`);
796
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_status
797
- ON orchestrator_task_sessions(status)`);
798
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_decisions_thread_id
799
- ON orchestrator_task_decisions(thread_id, timestamp DESC)`);
800
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_events_thread_id
801
- ON orchestrator_task_events(thread_id, timestamp DESC)`);
802
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_transcripts_thread_id
803
- ON orchestrator_task_transcripts(thread_id, timestamp DESC)`);
804
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_thread_id
805
- ON orchestrator_task_pending_decisions(thread_id)`);
806
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_created_at
807
- ON orchestrator_task_pending_decisions(created_at DESC)`);
808
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_thread_id
809
- ON orchestrator_task_nodes(thread_id, sequence ASC, created_at ASC)`);
810
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_status
811
- ON orchestrator_task_nodes(thread_id, status)`);
812
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_thread_id
813
- ON orchestrator_task_dependencies(thread_id)`);
814
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_to_node_id
815
- ON orchestrator_task_dependencies(to_node_id)`);
816
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_thread_id
817
- ON orchestrator_task_claims(thread_id, status, claimed_at DESC)`);
818
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_node_id
819
- ON orchestrator_task_claims(node_id, status)`);
820
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_mailbox_thread_id
821
- ON orchestrator_task_mailbox(thread_id, created_at ASC)`);
822
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_verifier_jobs_thread_id
823
- ON orchestrator_task_verifier_jobs(thread_id, status, created_at ASC)`);
824
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_evidence_thread_id
825
- ON orchestrator_task_evidence(thread_id, created_at ASC)`);
826
- await executeRawSql(this.runtime, `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_search_text
827
- ON orchestrator_task_threads(search_text)`);
828
- schemaReady.add(key);
829
- }
830
- async recoverInterruptedTasks() {
831
- await this.ensureSchema();
832
- const impactedSessions = await executeRawSql(this.runtime, `SELECT session_id, thread_id
833
- FROM orchestrator_task_sessions
834
- WHERE status IN ('active', 'blocked', 'tool_running')`);
835
- if (impactedSessions.length === 0)
836
- return;
837
- const nowIso = isoNow();
838
- const now = Date.now();
839
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_sessions
840
- SET status = 'interrupted',
841
- updated_at = ${sqlQuote(nowIso)},
842
- stopped_at = COALESCE(stopped_at, ${sqlInteger(now)})
843
- WHERE status IN ('active', 'blocked', 'tool_running')`);
844
- const affectedThreadIds = new Set();
845
- for (const row of impactedSessions) {
846
- const sessionId = toText(row.session_id);
847
- const threadId = toText(row.thread_id);
848
- if (!threadId)
849
- continue;
850
- affectedThreadIds.add(threadId);
851
- await this.appendEvent({
852
- threadId,
853
- sessionId,
854
- eventType: "session_interrupted",
855
- timestamp: now,
856
- summary: "Session interrupted by runtime restart or shutdown",
857
- data: { reason: "runtime_restart" },
858
- });
859
- }
860
- for (const threadId of affectedThreadIds) {
861
- await this.recomputeThreadStatus(threadId);
862
- }
863
- }
864
- async createThread(input) {
865
- await this.ensureSchema();
866
- const id = input.id?.trim() || `task-${crypto.randomUUID()}`;
867
- const createdAt = isoNow();
868
- const acceptanceCriteria = input.acceptanceCriteria ?? [];
869
- const currentPlan = input.currentPlan ?? {};
870
- const summary = input.summary?.trim() ?? "";
871
- const scenarioId = input.scenarioId ??
872
- (typeof input.metadata?.scenarioId === "string"
873
- ? input.metadata.scenarioId
874
- : typeof input.metadata?.scenario_id === "string"
875
- ? input.metadata.scenario_id
876
- : null);
877
- const batchId = input.batchId ??
878
- (typeof input.metadata?.batchId === "string"
879
- ? input.metadata.batchId
880
- : typeof input.metadata?.batch_id === "string"
881
- ? input.metadata.batch_id
882
- : null);
883
- const searchText = buildSearchText([
884
- input.title,
885
- input.originalRequest,
886
- summary,
887
- scenarioId,
888
- batchId,
889
- input.metadata ? JSON.stringify(input.metadata) : "",
890
- ]);
891
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_threads (
892
- id, agent_id, room_id, world_id, owner_user_id, scenario_id, batch_id, title, kind, status,
893
- original_request, summary, acceptance_criteria_json, current_plan_json,
894
- search_text, created_at, updated_at, closed_at, archived_at,
895
- last_user_turn_at, last_coordinator_turn_at, metadata_json
896
- ) VALUES (
897
- ${sqlQuote(id)},
898
- ${sqlQuote(this.runtime.agentId)},
899
- ${sqlText(input.roomId ?? null)},
900
- ${sqlText(input.worldId ?? null)},
901
- ${sqlText(input.ownerUserId ?? null)},
902
- ${sqlText(scenarioId ?? null)},
903
- ${sqlText(batchId ?? null)},
904
- ${sqlQuote(input.title.trim())},
905
- ${sqlQuote(input.kind ?? "coding")},
906
- 'open',
907
- ${sqlQuote(input.originalRequest)},
908
- ${sqlQuote(summary)},
909
- ${sqlJson(acceptanceCriteria)},
910
- ${sqlJson(currentPlan)},
911
- ${sqlQuote(searchText)},
912
- ${sqlQuote(createdAt)},
913
- ${sqlQuote(createdAt)},
914
- NULL,
915
- NULL,
916
- ${sqlText(input.lastUserTurnAt ?? createdAt)},
917
- NULL,
918
- ${sqlJson(input.metadata ?? {})}
919
- )`);
920
- await this.appendEvent({
921
- threadId: id,
922
- eventType: "task_created",
923
- timestamp: Date.now(),
924
- summary: `Created task thread "${input.title.trim()}"`,
925
- data: {
926
- kind: input.kind ?? "coding",
927
- roomId: input.roomId ?? null,
928
- worldId: input.worldId ?? null,
929
- },
930
- });
931
- const created = await this.getThreadRecord(id);
932
- if (!created) {
933
- throw new Error(`Failed to create task thread ${id}`);
934
- }
935
- return created;
936
- }
937
- async getThreadRecord(threadId) {
938
- await this.ensureSchema();
939
- const rows = await executeRawSql(this.runtime, `SELECT *
940
- FROM orchestrator_task_threads
941
- WHERE id = ${sqlQuote(threadId)}
942
- LIMIT 1`);
943
- return rows[0] ? parseThreadRow(rows[0]) : null;
944
- }
945
- async getThread(threadId) {
946
- await this.ensureSchema();
947
- const summary = await this.getThreadSummary(threadId);
948
- if (!summary)
949
- return null;
950
- const [sessions, decisions, events, artifacts, transcripts, pendingDecisions, nodes, dependencies, claims, mailbox, verifierJobs, evidence,] = await Promise.all([
951
- this.listSessionsForThread(threadId),
952
- this.listDecisionsForThread(threadId),
953
- this.listEventsForThread(threadId),
954
- this.listArtifactsForThread(threadId),
955
- this.listTranscriptsForThread(threadId),
956
- this.listPendingDecisionsForThread(threadId),
957
- this.listTaskNodesForThread(threadId),
958
- this.listTaskDependenciesForThread(threadId),
959
- this.listTaskClaimsForThread(threadId),
960
- this.listTaskMailboxMessagesForThread(threadId),
961
- this.listTaskVerifierJobsForThread(threadId),
962
- this.listTaskEvidenceForThread(threadId),
963
- ]);
964
- return {
965
- ...summary,
966
- sessions,
967
- decisions,
968
- events,
969
- artifacts,
970
- transcripts,
971
- pendingDecisions,
972
- nodes,
973
- dependencies,
974
- claims,
975
- mailbox,
976
- verifierJobs,
977
- evidence,
978
- };
979
- }
980
- async listThreads(options = {}) {
981
- await this.ensureSchema();
982
- const clauses = buildThreadListWhereClauses(options);
983
- const whereClause = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
984
- const limitClause = typeof options.limit === "number" && options.limit > 0
985
- ? `LIMIT ${Math.trunc(options.limit)}`
986
- : "";
987
- const rows = await executeRawSql(this.runtime, `SELECT
988
- thread.*,
989
- COALESCE(session_counts.session_count, 0) AS session_count,
990
- COALESCE(session_counts.active_session_count, 0) AS active_session_count,
991
- latest.session_id AS latest_session_id,
992
- latest.label AS latest_session_label,
993
- latest.workdir AS latest_workdir,
994
- latest.repo AS latest_repo,
995
- latest.last_activity_at AS latest_activity_at,
996
- COALESCE(decision_counts.decision_count, 0) AS decision_count,
997
- COALESCE(node_counts.node_count, 0) AS node_count,
998
- COALESCE(node_counts.ready_node_count, 0) AS ready_node_count,
999
- COALESCE(node_counts.completed_node_count, 0) AS completed_node_count,
1000
- COALESCE(verifier_counts.verifier_job_count, 0) AS verifier_job_count,
1001
- COALESCE(evidence_counts.evidence_count, 0) AS evidence_count
1002
- FROM orchestrator_task_threads AS thread
1003
- LEFT JOIN (
1004
- SELECT
1005
- thread_id,
1006
- COUNT(*) AS session_count,
1007
- SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count
1008
- FROM orchestrator_task_sessions
1009
- GROUP BY thread_id
1010
- ) AS session_counts
1011
- ON session_counts.thread_id = thread.id
1012
- LEFT JOIN (
1013
- SELECT latest_session.thread_id,
1014
- latest_session.session_id,
1015
- latest_session.label,
1016
- latest_session.workdir,
1017
- latest_session.repo,
1018
- latest_session.last_activity_at
1019
- FROM orchestrator_task_sessions AS latest_session
1020
- INNER JOIN (
1021
- SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at
1022
- FROM orchestrator_task_sessions
1023
- GROUP BY thread_id
1024
- ) AS grouped
1025
- ON grouped.thread_id = latest_session.thread_id
1026
- AND grouped.max_last_activity_at = latest_session.last_activity_at
1027
- ) AS latest
1028
- ON latest.thread_id = thread.id
1029
- LEFT JOIN (
1030
- SELECT thread_id, COUNT(*) AS decision_count
1031
- FROM orchestrator_task_decisions
1032
- GROUP BY thread_id
1033
- ) AS decision_counts
1034
- ON decision_counts.thread_id = thread.id
1035
- LEFT JOIN (
1036
- SELECT
1037
- thread_id,
1038
- COUNT(*) AS node_count,
1039
- SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,
1040
- SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count
1041
- FROM orchestrator_task_nodes
1042
- GROUP BY thread_id
1043
- ) AS node_counts
1044
- ON node_counts.thread_id = thread.id
1045
- LEFT JOIN (
1046
- SELECT thread_id, COUNT(*) AS verifier_job_count
1047
- FROM orchestrator_task_verifier_jobs
1048
- GROUP BY thread_id
1049
- ) AS verifier_counts
1050
- ON verifier_counts.thread_id = thread.id
1051
- LEFT JOIN (
1052
- SELECT thread_id, COUNT(*) AS evidence_count
1053
- FROM orchestrator_task_evidence
1054
- GROUP BY thread_id
1055
- ) AS evidence_counts
1056
- ON evidence_counts.thread_id = thread.id
1057
- ${whereClause}
1058
- ORDER BY thread.updated_at DESC
1059
- ${limitClause}`);
1060
- return rows.map(parseThreadSummaryRow);
1061
- }
1062
- async countThreads(options = {}) {
1063
- await this.ensureSchema();
1064
- const clauses = buildThreadListWhereClauses(options);
1065
- const whereClause = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
1066
- const rows = await executeRawSql(this.runtime, `SELECT COUNT(*) AS total
1067
- FROM orchestrator_task_threads AS thread
1068
- LEFT JOIN (
1069
- SELECT
1070
- thread_id,
1071
- COUNT(*) AS session_count,
1072
- SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count
1073
- FROM orchestrator_task_sessions
1074
- GROUP BY thread_id
1075
- ) AS session_counts
1076
- ON session_counts.thread_id = thread.id
1077
- LEFT JOIN (
1078
- SELECT latest_session.thread_id,
1079
- latest_session.session_id,
1080
- latest_session.label,
1081
- latest_session.workdir,
1082
- latest_session.repo,
1083
- latest_session.last_activity_at
1084
- FROM orchestrator_task_sessions AS latest_session
1085
- INNER JOIN (
1086
- SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at
1087
- FROM orchestrator_task_sessions
1088
- GROUP BY thread_id
1089
- ) AS grouped
1090
- ON grouped.thread_id = latest_session.thread_id
1091
- AND grouped.max_last_activity_at = latest_session.last_activity_at
1092
- ) AS latest
1093
- ON latest.thread_id = thread.id
1094
- LEFT JOIN (
1095
- SELECT
1096
- thread_id,
1097
- COUNT(*) AS node_count,
1098
- SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,
1099
- SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count
1100
- FROM orchestrator_task_nodes
1101
- GROUP BY thread_id
1102
- ) AS node_counts
1103
- ON node_counts.thread_id = thread.id
1104
- LEFT JOIN (
1105
- SELECT thread_id, COUNT(*) AS verifier_job_count
1106
- FROM orchestrator_task_verifier_jobs
1107
- GROUP BY thread_id
1108
- ) AS verifier_counts
1109
- ON verifier_counts.thread_id = thread.id
1110
- LEFT JOIN (
1111
- SELECT thread_id, COUNT(*) AS evidence_count
1112
- FROM orchestrator_task_evidence
1113
- GROUP BY thread_id
1114
- ) AS evidence_counts
1115
- ON evidence_counts.thread_id = thread.id
1116
- ${whereClause}`);
1117
- return toNumber(rows[0]?.total, 0);
1118
- }
1119
- async getThreadSummary(threadId) {
1120
- const rows = await this.listThreads({
1121
- threadId,
1122
- includeArchived: true,
1123
- });
1124
- return rows[0] ?? null;
1125
- }
1126
- async findThreadIdBySessionId(sessionId) {
1127
- await this.ensureSchema();
1128
- const rows = await executeRawSql(this.runtime, `SELECT thread_id
1129
- FROM orchestrator_task_sessions
1130
- WHERE session_id = ${sqlQuote(sessionId)}
1131
- LIMIT 1`);
1132
- return rows[0] ? toText(rows[0].thread_id) : null;
1133
- }
1134
- async getSession(sessionId) {
1135
- await this.ensureSchema();
1136
- const rows = await executeRawSql(this.runtime, `SELECT *
1137
- FROM orchestrator_task_sessions
1138
- WHERE session_id = ${sqlQuote(sessionId)}
1139
- LIMIT 1`);
1140
- return rows[0] ? parseSessionRow(rows[0]) : null;
1141
- }
1142
- async registerSession(input) {
1143
- await this.ensureSchema();
1144
- const nowIso = isoNow();
1145
- const registeredAt = input.registeredAt ?? Date.now();
1146
- const lastActivityAt = input.lastActivityAt ?? registeredAt;
1147
- const existingThread = await this.getThreadRecord(input.threadId);
1148
- if (!existingThread) {
1149
- throw new Error(`Task thread ${input.threadId} not found`);
1150
- }
1151
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_sessions (
1152
- id, thread_id, agent_id, session_id, framework, provider_source, label,
1153
- original_task, workdir, repo, status, decision_count, auto_resolved_count,
1154
- registered_at, last_activity_at, idle_check_count, task_delivered,
1155
- completion_summary, last_seen_decision_index, last_input_sent_at, stopped_at,
1156
- created_at, updated_at, metadata_json
1157
- ) VALUES (
1158
- ${sqlQuote(input.sessionId)},
1159
- ${sqlQuote(input.threadId)},
1160
- ${sqlQuote(this.runtime.agentId)},
1161
- ${sqlQuote(input.sessionId)},
1162
- ${sqlQuote(input.framework)},
1163
- ${sqlText(input.providerSource ?? null)},
1164
- ${sqlQuote(input.label)},
1165
- ${sqlQuote(input.originalTask)},
1166
- ${sqlQuote(input.workdir)},
1167
- ${sqlText(input.repo ?? null)},
1168
- ${sqlQuote(input.status ?? "active")},
1169
- ${sqlInteger(input.decisionCount ?? 0)},
1170
- ${sqlInteger(input.autoResolvedCount ?? 0)},
1171
- ${sqlInteger(registeredAt)},
1172
- ${sqlInteger(lastActivityAt)},
1173
- ${sqlInteger(input.idleCheckCount ?? 0)},
1174
- ${sqlBoolean(input.taskDelivered ?? false)},
1175
- ${sqlText(input.completionSummary ?? null)},
1176
- ${sqlInteger(input.lastSeenDecisionIndex ?? 0)},
1177
- ${sqlInteger(input.lastInputSentAt ?? null)},
1178
- ${sqlInteger(input.stoppedAt ?? null)},
1179
- ${sqlQuote(nowIso)},
1180
- ${sqlQuote(nowIso)},
1181
- ${sqlJson(input.metadata ?? {})}
1182
- )
1183
- ON CONFLICT(id) DO UPDATE SET
1184
- thread_id = EXCLUDED.thread_id,
1185
- framework = EXCLUDED.framework,
1186
- provider_source = EXCLUDED.provider_source,
1187
- label = EXCLUDED.label,
1188
- original_task = EXCLUDED.original_task,
1189
- workdir = EXCLUDED.workdir,
1190
- repo = EXCLUDED.repo,
1191
- status = EXCLUDED.status,
1192
- decision_count = EXCLUDED.decision_count,
1193
- auto_resolved_count = EXCLUDED.auto_resolved_count,
1194
- registered_at = EXCLUDED.registered_at,
1195
- last_activity_at = EXCLUDED.last_activity_at,
1196
- idle_check_count = EXCLUDED.idle_check_count,
1197
- task_delivered = EXCLUDED.task_delivered,
1198
- completion_summary = EXCLUDED.completion_summary,
1199
- last_seen_decision_index = EXCLUDED.last_seen_decision_index,
1200
- last_input_sent_at = EXCLUDED.last_input_sent_at,
1201
- stopped_at = EXCLUDED.stopped_at,
1202
- updated_at = EXCLUDED.updated_at,
1203
- metadata_json = EXCLUDED.metadata_json`);
1204
- await this.appendEvent({
1205
- threadId: input.threadId,
1206
- sessionId: input.sessionId,
1207
- eventType: "session_registered",
1208
- timestamp: registeredAt,
1209
- summary: `Registered session "${input.label}"`,
1210
- data: {
1211
- framework: input.framework,
1212
- repo: input.repo ?? null,
1213
- workdir: input.workdir,
1214
- },
1215
- });
1216
- await this.recomputeThreadStatus(input.threadId);
1217
- }
1218
- async updateSession(sessionId, patch) {
1219
- await this.ensureSchema();
1220
- const threadId = await this.findThreadIdBySessionId(sessionId);
1221
- if (!threadId)
1222
- return;
1223
- const existingRows = await executeRawSql(this.runtime, `SELECT *
1224
- FROM orchestrator_task_sessions
1225
- WHERE session_id = ${sqlQuote(sessionId)}
1226
- LIMIT 1`);
1227
- if (!existingRows[0])
1228
- return;
1229
- const existing = parseSessionRow(existingRows[0]);
1230
- const nextMeta = patch.metadata
1231
- ? { ...existing.metadata, ...patch.metadata }
1232
- : existing.metadata;
1233
- const nowIso = isoNow();
1234
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_sessions
1235
- SET status = ${sqlQuote(patch.status ?? existing.status)},
1236
- decision_count = ${sqlInteger(patch.decisionCount ?? existing.decisionCount)},
1237
- auto_resolved_count = ${sqlInteger(patch.autoResolvedCount ?? existing.autoResolvedCount)},
1238
- last_activity_at = ${sqlInteger(patch.lastActivityAt ?? existing.lastActivityAt)},
1239
- idle_check_count = ${sqlInteger(patch.idleCheckCount ?? existing.idleCheckCount)},
1240
- task_delivered = ${sqlBoolean(patch.taskDelivered ?? existing.taskDelivered)},
1241
- completion_summary = ${sqlText(patch.completionSummary ?? existing.completionSummary)},
1242
- last_seen_decision_index = ${sqlInteger(patch.lastSeenDecisionIndex ?? existing.lastSeenDecisionIndex)},
1243
- last_input_sent_at = ${sqlInteger(patch.lastInputSentAt ?? existing.lastInputSentAt)},
1244
- stopped_at = ${sqlInteger(patch.stoppedAt ?? existing.stoppedAt)},
1245
- updated_at = ${sqlQuote(nowIso)},
1246
- metadata_json = ${sqlJson(nextMeta)}
1247
- WHERE session_id = ${sqlQuote(sessionId)}`);
1248
- await this.appendEvent({
1249
- threadId,
1250
- sessionId,
1251
- eventType: "session_updated",
1252
- timestamp: patch.lastActivityAt ?? Date.now(),
1253
- summary: `Updated session "${existing.label}"`,
1254
- data: {
1255
- status: patch.status ?? existing.status,
1256
- decisionCount: patch.decisionCount ?? existing.decisionCount,
1257
- autoResolvedCount: patch.autoResolvedCount ?? existing.autoResolvedCount,
1258
- },
1259
- });
1260
- await this.recomputeThreadStatus(threadId);
1261
- }
1262
- async recordDecision(input) {
1263
- await this.ensureSchema();
1264
- const createdAt = isoNow();
1265
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_decisions (
1266
- id, thread_id, session_id, timestamp, event_type, prompt_text, decision,
1267
- response, reasoning, metadata_json, created_at
1268
- ) VALUES (
1269
- ${sqlQuote(`decision-${crypto.randomUUID()}`)},
1270
- ${sqlQuote(input.threadId)},
1271
- ${sqlQuote(input.sessionId)},
1272
- ${sqlInteger(input.timestamp)},
1273
- ${sqlQuote(input.event)},
1274
- ${sqlQuote(input.promptText)},
1275
- ${sqlQuote(input.decision)},
1276
- ${sqlText(input.response ?? null)},
1277
- ${sqlQuote(input.reasoning)},
1278
- ${sqlJson(input.metadata ?? {})},
1279
- ${sqlQuote(createdAt)}
1280
- )`);
1281
- await this.appendEvent({
1282
- threadId: input.threadId,
1283
- sessionId: input.sessionId,
1284
- eventType: "decision_recorded",
1285
- timestamp: input.timestamp,
1286
- summary: `${input.decision} decision recorded`,
1287
- data: {
1288
- event: input.event,
1289
- promptText: input.promptText,
1290
- response: input.response ?? null,
1291
- },
1292
- });
1293
- }
1294
- async appendEvent(input) {
1295
- await this.ensureSchema();
1296
- const createdAt = isoNow();
1297
- const timestamp = input.timestamp ?? Date.now();
1298
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_events (
1299
- id, thread_id, session_id, event_type, timestamp, summary, data_json, created_at
1300
- ) VALUES (
1301
- ${sqlQuote(`event-${crypto.randomUUID()}`)},
1302
- ${sqlQuote(input.threadId)},
1303
- ${sqlText(input.sessionId ?? null)},
1304
- ${sqlQuote(input.eventType)},
1305
- ${sqlInteger(timestamp)},
1306
- ${sqlQuote(input.summary ?? "")},
1307
- ${sqlJson(input.data ?? {})},
1308
- ${sqlQuote(createdAt)}
1309
- )`);
1310
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1311
- SET updated_at = ${sqlQuote(createdAt)}
1312
- WHERE id = ${sqlQuote(input.threadId)}`);
1313
- }
1314
- async recordArtifact(input) {
1315
- await this.ensureSchema();
1316
- const createdAt = isoNow();
1317
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_artifacts (
1318
- id, thread_id, session_id, artifact_type, title, path, uri, mime_type, metadata_json, created_at
1319
- ) VALUES (
1320
- ${sqlQuote(`artifact-${crypto.randomUUID()}`)},
1321
- ${sqlQuote(input.threadId)},
1322
- ${sqlText(input.sessionId ?? null)},
1323
- ${sqlQuote(input.artifactType)},
1324
- ${sqlQuote(input.title)},
1325
- ${sqlText(input.path ?? null)},
1326
- ${sqlText(input.uri ?? null)},
1327
- ${sqlText(input.mimeType ?? null)},
1328
- ${sqlJson(input.metadata ?? {})},
1329
- ${sqlQuote(createdAt)}
1330
- )`);
1331
- await this.appendEvent({
1332
- threadId: input.threadId,
1333
- sessionId: input.sessionId ?? null,
1334
- eventType: "artifact_recorded",
1335
- summary: `Recorded ${input.artifactType} artifact`,
1336
- data: {
1337
- artifactType: input.artifactType,
1338
- title: input.title,
1339
- path: input.path ?? null,
1340
- uri: input.uri ?? null,
1341
- },
1342
- });
1343
- }
1344
- async recordTranscript(input) {
1345
- await this.ensureSchema();
1346
- const createdAt = isoNow();
1347
- const timestamp = input.timestamp ?? Date.now();
1348
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_transcripts (
1349
- id, thread_id, session_id, timestamp, direction, content, metadata_json, created_at
1350
- ) VALUES (
1351
- ${sqlQuote(`transcript-${crypto.randomUUID()}`)},
1352
- ${sqlQuote(input.threadId)},
1353
- ${sqlQuote(input.sessionId)},
1354
- ${sqlInteger(timestamp)},
1355
- ${sqlQuote(input.direction)},
1356
- ${sqlQuote(input.content)},
1357
- ${sqlJson(input.metadata ?? {})},
1358
- ${sqlQuote(createdAt)}
1359
- )`);
1360
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1361
- SET updated_at = ${sqlQuote(createdAt)}
1362
- WHERE id = ${sqlQuote(input.threadId)}`);
1363
- }
1364
- async updateThreadSummary(threadId, summary) {
1365
- await this.ensureSchema();
1366
- const thread = await this.getThreadRecord(threadId);
1367
- if (!thread)
1368
- return;
1369
- const nextSearchText = buildSearchText([
1370
- thread.title,
1371
- thread.originalRequest,
1372
- summary,
1373
- thread.searchText,
1374
- ]);
1375
- const nowIso = isoNow();
1376
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1377
- SET summary = ${sqlQuote(summary)},
1378
- search_text = ${sqlQuote(nextSearchText)},
1379
- updated_at = ${sqlQuote(nowIso)}
1380
- WHERE id = ${sqlQuote(threadId)}`);
1381
- await this.appendEvent({
1382
- threadId,
1383
- eventType: "summary_updated",
1384
- summary: "Updated task summary",
1385
- data: { summary },
1386
- });
1387
- }
1388
- async updateThread(threadId, patch) {
1389
- await this.ensureSchema();
1390
- const existing = await this.getThreadRecord(threadId);
1391
- if (!existing)
1392
- return;
1393
- const nextMetadata = patch.metadata
1394
- ? { ...existing.metadata, ...patch.metadata }
1395
- : existing.metadata;
1396
- const nextSummary = patch.summary ?? existing.summary;
1397
- const nextSearchText = buildSearchText([
1398
- existing.title,
1399
- existing.originalRequest,
1400
- nextSummary,
1401
- patch.status ?? existing.status,
1402
- existing.scenarioId,
1403
- existing.batchId,
1404
- JSON.stringify(nextMetadata),
1405
- ]);
1406
- const nowIso = isoNow();
1407
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1408
- SET status = ${sqlQuote(patch.status ?? existing.status)},
1409
- summary = ${sqlQuote(nextSummary)},
1410
- current_plan_json = ${sqlJson(patch.currentPlan ?? existing.currentPlan)},
1411
- search_text = ${sqlQuote(nextSearchText)},
1412
- closed_at = ${sqlText(patch.closedAt !== undefined
1413
- ? patch.closedAt
1414
- : existing.closedAt)},
1415
- archived_at = ${sqlText(patch.archivedAt !== undefined
1416
- ? patch.archivedAt
1417
- : existing.archivedAt)},
1418
- last_user_turn_at = ${sqlText(patch.lastUserTurnAt !== undefined
1419
- ? patch.lastUserTurnAt
1420
- : existing.lastUserTurnAt)},
1421
- last_coordinator_turn_at = ${sqlText(patch.lastCoordinatorTurnAt !== undefined
1422
- ? patch.lastCoordinatorTurnAt
1423
- : existing.lastCoordinatorTurnAt)},
1424
- updated_at = ${sqlQuote(nowIso)},
1425
- metadata_json = ${sqlJson(nextMetadata)}
1426
- WHERE id = ${sqlQuote(threadId)}`);
1427
- }
1428
- async archiveThread(threadId) {
1429
- await this.ensureSchema();
1430
- const nowIso = isoNow();
1431
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1432
- SET status = 'archived',
1433
- archived_at = ${sqlQuote(nowIso)},
1434
- closed_at = COALESCE(closed_at, ${sqlQuote(nowIso)}),
1435
- updated_at = ${sqlQuote(nowIso)}
1436
- WHERE id = ${sqlQuote(threadId)}`);
1437
- await this.appendEvent({
1438
- threadId,
1439
- eventType: "task_archived",
1440
- summary: "Archived task thread",
1441
- data: {},
1442
- });
1443
- }
1444
- async reopenThread(threadId) {
1445
- await this.ensureSchema();
1446
- const nowIso = isoNow();
1447
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1448
- SET status = 'open',
1449
- archived_at = NULL,
1450
- closed_at = NULL,
1451
- updated_at = ${sqlQuote(nowIso)}
1452
- WHERE id = ${sqlQuote(threadId)}`);
1453
- await this.appendEvent({
1454
- threadId,
1455
- eventType: "task_reopened",
1456
- summary: "Reopened task thread",
1457
- data: {},
1458
- });
1459
- await this.recomputeThreadStatus(threadId);
1460
- }
1461
- async upsertPendingDecision(input) {
1462
- await this.ensureSchema();
1463
- const createdAt = input.createdAt ?? Date.now();
1464
- const nowIso = isoNow();
1465
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_pending_decisions (
1466
- session_id,
1467
- thread_id,
1468
- prompt_text,
1469
- recent_output,
1470
- llm_decision_json,
1471
- task_context_json,
1472
- created_at,
1473
- updated_at
1474
- ) VALUES (
1475
- ${sqlQuote(input.sessionId)},
1476
- ${sqlQuote(input.threadId)},
1477
- ${sqlQuote(input.promptText)},
1478
- ${sqlQuote(input.recentOutput)},
1479
- ${sqlJson(input.llmDecision)},
1480
- ${sqlJson(input.taskContext)},
1481
- ${sqlInteger(createdAt)},
1482
- ${sqlQuote(nowIso)}
1483
- )
1484
- ON CONFLICT(session_id) DO UPDATE SET
1485
- thread_id = EXCLUDED.thread_id,
1486
- prompt_text = EXCLUDED.prompt_text,
1487
- recent_output = EXCLUDED.recent_output,
1488
- llm_decision_json = EXCLUDED.llm_decision_json,
1489
- task_context_json = EXCLUDED.task_context_json,
1490
- created_at = EXCLUDED.created_at,
1491
- updated_at = EXCLUDED.updated_at`);
1492
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1493
- SET updated_at = ${sqlQuote(nowIso)}
1494
- WHERE id = ${sqlQuote(input.threadId)}`);
1495
- }
1496
- async deletePendingDecision(sessionId) {
1497
- await this.ensureSchema();
1498
- const rows = await executeRawSql(this.runtime, `SELECT thread_id
1499
- FROM orchestrator_task_pending_decisions
1500
- WHERE session_id = ${sqlQuote(sessionId)}
1501
- LIMIT 1`);
1502
- if (rows.length === 0)
1503
- return;
1504
- const threadId = toText(rows[0]?.thread_id);
1505
- await executeRawSql(this.runtime, `DELETE FROM orchestrator_task_pending_decisions
1506
- WHERE session_id = ${sqlQuote(sessionId)}`);
1507
- if (threadId) {
1508
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
1509
- SET updated_at = ${sqlQuote(isoNow())}
1510
- WHERE id = ${sqlQuote(threadId)}`);
1511
- }
1512
- }
1513
- async listPendingDecisions() {
1514
- await this.ensureSchema();
1515
- const rows = await executeRawSql(this.runtime, `SELECT *
1516
- FROM orchestrator_task_pending_decisions
1517
- ORDER BY created_at ASC`);
1518
- return rows.map(parsePendingDecisionRow);
1519
- }
1520
- async listPendingDecisionsForThread(threadId) {
1521
- await this.ensureSchema();
1522
- const rows = await executeRawSql(this.runtime, `SELECT *
1523
- FROM orchestrator_task_pending_decisions
1524
- WHERE thread_id = ${sqlQuote(threadId)}
1525
- ORDER BY created_at ASC`);
1526
- return rows.map(parsePendingDecisionRow);
1527
- }
1528
- async createTaskNode(input) {
1529
- await this.ensureSchema();
1530
- const nowIso = isoNow();
1531
- const id = input.id?.trim() || `node-${crypto.randomUUID()}`;
1532
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_nodes (
1533
- id, thread_id, parent_node_id, kind, status, title, instructions,
1534
- acceptance_criteria_json, required_capabilities_json, expected_artifacts_json,
1535
- assigned_session_id, assigned_label, agent_type, workdir, repo, priority,
1536
- depth, sequence, created_from, metadata_json, created_at, updated_at,
1537
- started_at, completed_at
1538
- ) VALUES (
1539
- ${sqlQuote(id)},
1540
- ${sqlQuote(input.threadId)},
1541
- ${sqlText(input.parentNodeId ?? null)},
1542
- ${sqlQuote(input.kind ?? "execution")},
1543
- ${sqlQuote(input.status ?? "planned")},
1544
- ${sqlQuote(input.title)},
1545
- ${sqlQuote(input.instructions ?? "")},
1546
- ${sqlJson(input.acceptanceCriteria ?? [])},
1547
- ${sqlJson(input.requiredCapabilities ?? [])},
1548
- ${sqlJson(input.expectedArtifacts ?? [])},
1549
- ${sqlText(input.assignedSessionId ?? null)},
1550
- ${sqlText(input.assignedLabel ?? null)},
1551
- ${sqlText(input.agentType ?? null)},
1552
- ${sqlText(input.workdir ?? null)},
1553
- ${sqlText(input.repo ?? null)},
1554
- ${sqlInteger(input.priority ?? 0)},
1555
- ${sqlInteger(input.depth ?? 0)},
1556
- ${sqlInteger(input.sequence ?? 0)},
1557
- ${sqlText(input.createdFrom ?? null)},
1558
- ${sqlJson(input.metadata ?? {})},
1559
- ${sqlQuote(nowIso)},
1560
- ${sqlQuote(nowIso)},
1561
- ${sqlText(input.startedAt ?? null)},
1562
- ${sqlText(input.completedAt ?? null)}
1563
- )`);
1564
- await this.appendEvent({
1565
- threadId: input.threadId,
1566
- sessionId: input.assignedSessionId ?? null,
1567
- eventType: "task_node_created",
1568
- summary: `Created task node "${input.title}"`,
1569
- data: {
1570
- nodeId: id,
1571
- kind: input.kind ?? "execution",
1572
- status: input.status ?? "planned",
1573
- parentNodeId: input.parentNodeId ?? null,
1574
- },
1575
- });
1576
- const node = await this.getTaskNode(id);
1577
- if (!node) {
1578
- throw new Error(`Failed to create task node ${id}`);
1579
- }
1580
- await this.recomputeTaskGraphState(input.threadId);
1581
- return node;
1582
- }
1583
- async getTaskNode(nodeId) {
1584
- await this.ensureSchema();
1585
- const rows = await executeRawSql(this.runtime, `SELECT *
1586
- FROM orchestrator_task_nodes
1587
- WHERE id = ${sqlQuote(nodeId)}
1588
- LIMIT 1`);
1589
- return rows[0] ? parseTaskNodeRow(rows[0]) : null;
1590
- }
1591
- async updateTaskNode(nodeId, patch) {
1592
- await this.ensureSchema();
1593
- const existing = await this.getTaskNode(nodeId);
1594
- if (!existing)
1595
- return;
1596
- const nextMetadata = patch.metadata
1597
- ? { ...existing.metadata, ...patch.metadata }
1598
- : existing.metadata;
1599
- const nextStatus = patch.status ?? existing.status;
1600
- const nextStartedAt = patch.startedAt !== undefined
1601
- ? patch.startedAt
1602
- : nextStatus === "running" || nextStatus === "verifying"
1603
- ? (existing.startedAt ?? isoNow())
1604
- : existing.startedAt;
1605
- const nextCompletedAt = patch.completedAt !== undefined
1606
- ? patch.completedAt
1607
- : ["completed", "failed", "canceled", "interrupted"].includes(nextStatus)
1608
- ? (existing.completedAt ?? isoNow())
1609
- : null;
1610
- const nowIso = isoNow();
1611
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_nodes
1612
- SET parent_node_id = ${sqlText(patch.parentNodeId !== undefined
1613
- ? patch.parentNodeId
1614
- : existing.parentNodeId)},
1615
- kind = ${sqlQuote(patch.kind ?? existing.kind)},
1616
- status = ${sqlQuote(nextStatus)},
1617
- title = ${sqlQuote(patch.title ?? existing.title)},
1618
- instructions = ${sqlQuote(patch.instructions ?? existing.instructions)},
1619
- acceptance_criteria_json = ${sqlJson(patch.acceptanceCriteria ?? existing.acceptanceCriteria)},
1620
- required_capabilities_json = ${sqlJson(patch.requiredCapabilities ?? existing.requiredCapabilities)},
1621
- expected_artifacts_json = ${sqlJson(patch.expectedArtifacts ?? existing.expectedArtifacts)},
1622
- assigned_session_id = ${sqlText(patch.assignedSessionId !== undefined
1623
- ? patch.assignedSessionId
1624
- : existing.assignedSessionId)},
1625
- assigned_label = ${sqlText(patch.assignedLabel !== undefined
1626
- ? patch.assignedLabel
1627
- : existing.assignedLabel)},
1628
- agent_type = ${sqlText(patch.agentType !== undefined
1629
- ? patch.agentType
1630
- : existing.agentType)},
1631
- workdir = ${sqlText(patch.workdir !== undefined ? patch.workdir : existing.workdir)},
1632
- repo = ${sqlText(patch.repo !== undefined ? patch.repo : existing.repo)},
1633
- priority = ${sqlInteger(patch.priority ?? existing.priority)},
1634
- depth = ${sqlInteger(patch.depth ?? existing.depth)},
1635
- sequence = ${sqlInteger(patch.sequence ?? existing.sequence)},
1636
- created_from = ${sqlText(patch.createdFrom !== undefined
1637
- ? patch.createdFrom
1638
- : existing.createdFrom)},
1639
- metadata_json = ${sqlJson(nextMetadata)},
1640
- updated_at = ${sqlQuote(nowIso)},
1641
- started_at = ${sqlText(nextStartedAt)},
1642
- completed_at = ${sqlText(nextCompletedAt)}
1643
- WHERE id = ${sqlQuote(nodeId)}`);
1644
- await this.appendEvent({
1645
- threadId: existing.threadId,
1646
- sessionId: patch.assignedSessionId !== undefined
1647
- ? patch.assignedSessionId
1648
- : existing.assignedSessionId,
1649
- eventType: "task_node_updated",
1650
- summary: `Updated task node "${patch.title ?? existing.title}"`,
1651
- data: {
1652
- nodeId,
1653
- status: nextStatus,
1654
- },
1655
- });
1656
- await this.recomputeTaskGraphState(existing.threadId);
1657
- }
1658
- async listTaskNodesForThread(threadId) {
1659
- await this.ensureSchema();
1660
- const rows = await executeRawSql(this.runtime, `SELECT *
1661
- FROM orchestrator_task_nodes
1662
- WHERE thread_id = ${sqlQuote(threadId)}
1663
- ORDER BY depth ASC, sequence ASC, created_at ASC`);
1664
- return rows.map(parseTaskNodeRow);
1665
- }
1666
- async listReadyTaskNodesForThread(threadId) {
1667
- await this.ensureSchema();
1668
- const rows = await executeRawSql(this.runtime, `SELECT *
1669
- FROM orchestrator_task_nodes
1670
- WHERE thread_id = ${sqlQuote(threadId)}
1671
- AND status = 'ready'
1672
- ORDER BY priority DESC, depth ASC, sequence ASC, created_at ASC`);
1673
- return rows.map(parseTaskNodeRow);
1674
- }
1675
- async createTaskDependency(input) {
1676
- await this.ensureSchema();
1677
- const createdAt = isoNow();
1678
- const id = input.id?.trim() || `dep-${crypto.randomUUID()}`;
1679
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_dependencies (
1680
- id, thread_id, from_node_id, to_node_id, dependency_kind, required_status,
1681
- metadata_json, created_at
1682
- ) VALUES (
1683
- ${sqlQuote(id)},
1684
- ${sqlQuote(input.threadId)},
1685
- ${sqlQuote(input.fromNodeId)},
1686
- ${sqlQuote(input.toNodeId)},
1687
- ${sqlQuote(input.dependencyKind ?? "blocks")},
1688
- ${sqlQuote(input.requiredStatus ?? "completed")},
1689
- ${sqlJson(input.metadata ?? {})},
1690
- ${sqlQuote(createdAt)}
1691
- )`);
1692
- await this.appendEvent({
1693
- threadId: input.threadId,
1694
- eventType: "task_dependency_created",
1695
- summary: `Created dependency ${input.fromNodeId} -> ${input.toNodeId}`,
1696
- data: {
1697
- dependencyId: id,
1698
- fromNodeId: input.fromNodeId,
1699
- toNodeId: input.toNodeId,
1700
- dependencyKind: input.dependencyKind ?? "blocks",
1701
- requiredStatus: input.requiredStatus ?? "completed",
1702
- },
1703
- });
1704
- const dependency = await this.getTaskDependency(id);
1705
- if (!dependency) {
1706
- throw new Error(`Failed to create task dependency ${id}`);
1707
- }
1708
- await this.recomputeTaskGraphState(input.threadId);
1709
- return dependency;
1710
- }
1711
- async getTaskDependency(dependencyId) {
1712
- await this.ensureSchema();
1713
- const rows = await executeRawSql(this.runtime, `SELECT *
1714
- FROM orchestrator_task_dependencies
1715
- WHERE id = ${sqlQuote(dependencyId)}
1716
- LIMIT 1`);
1717
- return rows[0] ? parseTaskDependencyRow(rows[0]) : null;
1718
- }
1719
- async listTaskDependenciesForThread(threadId) {
1720
- await this.ensureSchema();
1721
- const rows = await executeRawSql(this.runtime, `SELECT *
1722
- FROM orchestrator_task_dependencies
1723
- WHERE thread_id = ${sqlQuote(threadId)}
1724
- ORDER BY created_at ASC`);
1725
- return rows.map(parseTaskDependencyRow);
1726
- }
1727
- async createTaskClaim(input) {
1728
- await this.ensureSchema();
1729
- const claimedAt = input.claimedAt ?? isoNow();
1730
- const id = input.id?.trim() || `claim-${crypto.randomUUID()}`;
1731
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_claims (
1732
- id, thread_id, node_id, session_id, claim_type, status, claimed_at,
1733
- released_at, metadata_json
1734
- ) VALUES (
1735
- ${sqlQuote(id)},
1736
- ${sqlQuote(input.threadId)},
1737
- ${sqlQuote(input.nodeId)},
1738
- ${sqlQuote(input.sessionId)},
1739
- ${sqlQuote(input.claimType ?? "execution")},
1740
- ${sqlQuote(input.status ?? "active")},
1741
- ${sqlQuote(claimedAt)},
1742
- ${sqlText(input.releasedAt ?? null)},
1743
- ${sqlJson(input.metadata ?? {})}
1744
- )`);
1745
- await this.appendEvent({
1746
- threadId: input.threadId,
1747
- sessionId: input.sessionId,
1748
- eventType: "task_claim_created",
1749
- summary: `Claimed task node ${input.nodeId}`,
1750
- data: {
1751
- claimId: id,
1752
- nodeId: input.nodeId,
1753
- sessionId: input.sessionId,
1754
- claimType: input.claimType ?? "execution",
1755
- status: input.status ?? "active",
1756
- },
1757
- });
1758
- const claim = await this.getTaskClaim(id);
1759
- if (!claim) {
1760
- throw new Error(`Failed to create task claim ${id}`);
1761
- }
1762
- return claim;
1763
- }
1764
- async getTaskClaim(claimId) {
1765
- await this.ensureSchema();
1766
- const rows = await executeRawSql(this.runtime, `SELECT *
1767
- FROM orchestrator_task_claims
1768
- WHERE id = ${sqlQuote(claimId)}
1769
- LIMIT 1`);
1770
- return rows[0] ? parseTaskClaimRow(rows[0]) : null;
1771
- }
1772
- async findActiveTaskClaim(nodeId, sessionId) {
1773
- await this.ensureSchema();
1774
- const rows = await executeRawSql(this.runtime, `SELECT *
1775
- FROM orchestrator_task_claims
1776
- WHERE node_id = ${sqlQuote(nodeId)}
1777
- AND session_id = ${sqlQuote(sessionId)}
1778
- AND status = 'active'
1779
- ORDER BY claimed_at DESC
1780
- LIMIT 1`);
1781
- return rows[0] ? parseTaskClaimRow(rows[0]) : null;
1782
- }
1783
- async updateTaskClaim(claimId, patch) {
1784
- await this.ensureSchema();
1785
- const existing = await this.getTaskClaim(claimId);
1786
- if (!existing)
1787
- return;
1788
- const nextMetadata = patch.metadata
1789
- ? { ...existing.metadata, ...patch.metadata }
1790
- : existing.metadata;
1791
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_claims
1792
- SET status = ${sqlQuote(patch.status ?? existing.status)},
1793
- released_at = ${sqlText(patch.releasedAt !== undefined
1794
- ? patch.releasedAt
1795
- : existing.releasedAt)},
1796
- metadata_json = ${sqlJson(nextMetadata)}
1797
- WHERE id = ${sqlQuote(claimId)}`);
1798
- }
1799
- async listTaskClaimsForThread(threadId) {
1800
- await this.ensureSchema();
1801
- const rows = await executeRawSql(this.runtime, `SELECT *
1802
- FROM orchestrator_task_claims
1803
- WHERE thread_id = ${sqlQuote(threadId)}
1804
- ORDER BY claimed_at ASC`);
1805
- return rows.map(parseTaskClaimRow);
1806
- }
1807
- async appendTaskMailboxMessage(input) {
1808
- await this.ensureSchema();
1809
- const id = input.id?.trim() || `mail-${crypto.randomUUID()}`;
1810
- const createdAt = input.createdAt ?? isoNow();
1811
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_mailbox (
1812
- id, thread_id, node_id, session_id, sender, recipient, subject, body,
1813
- delivery_state, metadata_json, created_at, delivered_at
1814
- ) VALUES (
1815
- ${sqlQuote(id)},
1816
- ${sqlQuote(input.threadId)},
1817
- ${sqlText(input.nodeId ?? null)},
1818
- ${sqlText(input.sessionId ?? null)},
1819
- ${sqlQuote(input.sender)},
1820
- ${sqlQuote(input.recipient)},
1821
- ${sqlQuote(input.subject ?? "")},
1822
- ${sqlQuote(input.body)},
1823
- ${sqlQuote(input.deliveryState ?? "pending")},
1824
- ${sqlJson(input.metadata ?? {})},
1825
- ${sqlQuote(createdAt)},
1826
- ${sqlText(input.deliveredAt ?? null)}
1827
- )`);
1828
- await this.appendEvent({
1829
- threadId: input.threadId,
1830
- sessionId: input.sessionId ?? null,
1831
- eventType: "task_mailbox_message",
1832
- summary: `Mailbox message "${input.subject ?? ""}" queued for ${input.recipient}`,
1833
- data: {
1834
- messageId: id,
1835
- nodeId: input.nodeId ?? null,
1836
- sender: input.sender,
1837
- recipient: input.recipient,
1838
- deliveryState: input.deliveryState ?? "pending",
1839
- },
1840
- });
1841
- const message = await this.getTaskMailboxMessage(id);
1842
- if (!message) {
1843
- throw new Error(`Failed to create mailbox message ${id}`);
1844
- }
1845
- return message;
1846
- }
1847
- async getTaskMailboxMessage(messageId) {
1848
- await this.ensureSchema();
1849
- const rows = await executeRawSql(this.runtime, `SELECT *
1850
- FROM orchestrator_task_mailbox
1851
- WHERE id = ${sqlQuote(messageId)}
1852
- LIMIT 1`);
1853
- return rows[0] ? parseTaskMailboxMessageRow(rows[0]) : null;
1854
- }
1855
- async markTaskMailboxMessageDelivered(messageId) {
1856
- await this.ensureSchema();
1857
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_mailbox
1858
- SET delivery_state = 'delivered',
1859
- delivered_at = ${sqlQuote(isoNow())}
1860
- WHERE id = ${sqlQuote(messageId)}`);
1861
- }
1862
- async listTaskMailboxMessagesForThread(threadId) {
1863
- await this.ensureSchema();
1864
- const rows = await executeRawSql(this.runtime, `SELECT *
1865
- FROM orchestrator_task_mailbox
1866
- WHERE thread_id = ${sqlQuote(threadId)}
1867
- ORDER BY created_at ASC`);
1868
- return rows.map(parseTaskMailboxMessageRow);
1869
- }
1870
- async createTaskVerifierJob(input) {
1871
- await this.ensureSchema();
1872
- const id = input.id?.trim() || `verify-${crypto.randomUUID()}`;
1873
- const createdAt = input.createdAt ?? isoNow();
1874
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_verifier_jobs (
1875
- id, thread_id, node_id, status, verifier_type, title, instructions,
1876
- config_json, metadata_json, created_at, started_at, completed_at
1877
- ) VALUES (
1878
- ${sqlQuote(id)},
1879
- ${sqlQuote(input.threadId)},
1880
- ${sqlQuote(input.nodeId)},
1881
- ${sqlQuote(input.status ?? "pending")},
1882
- ${sqlQuote(input.verifierType)},
1883
- ${sqlQuote(input.title)},
1884
- ${sqlQuote(input.instructions ?? "")},
1885
- ${sqlJson(input.config ?? {})},
1886
- ${sqlJson(input.metadata ?? {})},
1887
- ${sqlQuote(createdAt)},
1888
- ${sqlText(input.startedAt ?? null)},
1889
- ${sqlText(input.completedAt ?? null)}
1890
- )`);
1891
- await this.appendEvent({
1892
- threadId: input.threadId,
1893
- eventType: "verifier_job_created",
1894
- summary: `Created verifier job "${input.title}"`,
1895
- data: {
1896
- verifierJobId: id,
1897
- nodeId: input.nodeId,
1898
- verifierType: input.verifierType,
1899
- status: input.status ?? "pending",
1900
- },
1901
- });
1902
- const job = await this.getTaskVerifierJob(id);
1903
- if (!job) {
1904
- throw new Error(`Failed to create verifier job ${id}`);
1905
- }
1906
- return job;
1907
- }
1908
- async getTaskVerifierJob(verifierJobId) {
1909
- await this.ensureSchema();
1910
- const rows = await executeRawSql(this.runtime, `SELECT *
1911
- FROM orchestrator_task_verifier_jobs
1912
- WHERE id = ${sqlQuote(verifierJobId)}
1913
- LIMIT 1`);
1914
- return rows[0] ? parseTaskVerifierJobRow(rows[0]) : null;
1915
- }
1916
- async updateTaskVerifierJob(verifierJobId, patch) {
1917
- await this.ensureSchema();
1918
- const existing = await this.getTaskVerifierJob(verifierJobId);
1919
- if (!existing)
1920
- return;
1921
- const nextMetadata = patch.metadata
1922
- ? { ...existing.metadata, ...patch.metadata }
1923
- : existing.metadata;
1924
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_verifier_jobs
1925
- SET status = ${sqlQuote(patch.status ?? existing.status)},
1926
- title = ${sqlQuote(patch.title ?? existing.title)},
1927
- instructions = ${sqlQuote(patch.instructions ?? existing.instructions)},
1928
- config_json = ${sqlJson(patch.config ?? existing.config)},
1929
- metadata_json = ${sqlJson(nextMetadata)},
1930
- started_at = ${sqlText(patch.startedAt !== undefined
1931
- ? patch.startedAt
1932
- : existing.startedAt)},
1933
- completed_at = ${sqlText(patch.completedAt !== undefined
1934
- ? patch.completedAt
1935
- : existing.completedAt)}
1936
- WHERE id = ${sqlQuote(verifierJobId)}`);
1937
- }
1938
- async listTaskVerifierJobsForThread(threadId) {
1939
- await this.ensureSchema();
1940
- const rows = await executeRawSql(this.runtime, `SELECT *
1941
- FROM orchestrator_task_verifier_jobs
1942
- WHERE thread_id = ${sqlQuote(threadId)}
1943
- ORDER BY created_at ASC`);
1944
- return rows.map(parseTaskVerifierJobRow);
1945
- }
1946
- async recordTaskEvidence(input) {
1947
- await this.ensureSchema();
1948
- const id = input.id?.trim() || `evidence-${crypto.randomUUID()}`;
1949
- const createdAt = isoNow();
1950
- await executeRawSql(this.runtime, `INSERT INTO orchestrator_task_evidence (
1951
- id, thread_id, node_id, session_id, verifier_job_id, evidence_type, title,
1952
- summary, path, uri, content_json, metadata_json, created_at
1953
- ) VALUES (
1954
- ${sqlQuote(id)},
1955
- ${sqlQuote(input.threadId)},
1956
- ${sqlText(input.nodeId ?? null)},
1957
- ${sqlText(input.sessionId ?? null)},
1958
- ${sqlText(input.verifierJobId ?? null)},
1959
- ${sqlQuote(input.evidenceType)},
1960
- ${sqlQuote(input.title)},
1961
- ${sqlQuote(input.summary ?? "")},
1962
- ${sqlText(input.path ?? null)},
1963
- ${sqlText(input.uri ?? null)},
1964
- ${sqlJson(input.content ?? {})},
1965
- ${sqlJson(input.metadata ?? {})},
1966
- ${sqlQuote(createdAt)}
1967
- )`);
1968
- await this.appendEvent({
1969
- threadId: input.threadId,
1970
- sessionId: input.sessionId ?? null,
1971
- eventType: "task_evidence_recorded",
1972
- summary: `Recorded ${input.evidenceType} evidence`,
1973
- data: {
1974
- evidenceId: id,
1975
- nodeId: input.nodeId ?? null,
1976
- verifierJobId: input.verifierJobId ?? null,
1977
- title: input.title,
1978
- },
1979
- });
1980
- const evidence = await this.getTaskEvidence(id);
1981
- if (!evidence) {
1982
- throw new Error(`Failed to create task evidence ${id}`);
1983
- }
1984
- return evidence;
1985
- }
1986
- async getTaskEvidence(evidenceId) {
1987
- await this.ensureSchema();
1988
- const rows = await executeRawSql(this.runtime, `SELECT *
1989
- FROM orchestrator_task_evidence
1990
- WHERE id = ${sqlQuote(evidenceId)}
1991
- LIMIT 1`);
1992
- return rows[0] ? parseTaskEvidenceRow(rows[0]) : null;
1993
- }
1994
- async listTaskEvidenceForThread(threadId) {
1995
- await this.ensureSchema();
1996
- const rows = await executeRawSql(this.runtime, `SELECT *
1997
- FROM orchestrator_task_evidence
1998
- WHERE thread_id = ${sqlQuote(threadId)}
1999
- ORDER BY created_at ASC`);
2000
- return rows.map(parseTaskEvidenceRow);
2001
- }
2002
- deriveDependentNodeStatus(node, incomingDependencies, nodesById) {
2003
- if (isTerminalTaskNodeStatus(node.status)) {
2004
- return node.status;
2005
- }
2006
- if (node.status === "running" ||
2007
- node.status === "blocked" ||
2008
- node.status === "waiting_on_user" ||
2009
- node.status === "verifying" ||
2010
- node.status === "claimed") {
2011
- return node.status;
2012
- }
2013
- const prerequisiteStatuses = incomingDependencies
2014
- .map((dependency) => nodesById.get(dependency.fromNodeId))
2015
- .filter((entry) => Boolean(entry))
2016
- .map((entry) => entry.status);
2017
- const allSatisfied = incomingDependencies.length === 0 ||
2018
- incomingDependencies.every((dependency) => {
2019
- const source = nodesById.get(dependency.fromNodeId);
2020
- return (source !== undefined &&
2021
- dependencyStatusSatisfied(source.status, dependency.requiredStatus));
2022
- });
2023
- const hasFailedPrerequisite = prerequisiteStatuses.some((status) => status === "failed" ||
2024
- status === "canceled" ||
2025
- status === "interrupted");
2026
- if (node.kind === "goal" && incomingDependencies.length > 0) {
2027
- if (allSatisfied) {
2028
- return "completed";
2029
- }
2030
- return hasFailedPrerequisite ? "failed" : "planned";
2031
- }
2032
- if (node.assignedSessionId) {
2033
- return node.status;
2034
- }
2035
- if (allSatisfied) {
2036
- return "ready";
2037
- }
2038
- return hasFailedPrerequisite ? "blocked" : "planned";
2039
- }
2040
- async recomputeTaskGraphState(threadId) {
2041
- const [nodes, dependencies] = await Promise.all([
2042
- this.listTaskNodesForThread(threadId),
2043
- this.listTaskDependenciesForThread(threadId),
2044
- ]);
2045
- if (nodes.length === 0) {
2046
- return;
2047
- }
2048
- const nodesById = new Map(nodes.map((node) => [node.id, node]));
2049
- const incomingDependencies = new Map();
2050
- for (const dependency of dependencies) {
2051
- const bucket = incomingDependencies.get(dependency.toNodeId) ?? [];
2052
- bucket.push(dependency);
2053
- incomingDependencies.set(dependency.toNodeId, bucket);
2054
- }
2055
- const nowIso = isoNow();
2056
- for (const node of nodes) {
2057
- const nextStatus = this.deriveDependentNodeStatus(node, incomingDependencies.get(node.id) ?? [], nodesById);
2058
- if (nextStatus === node.status) {
2059
- continue;
2060
- }
2061
- const nextCompletedAt = nextStatus === "completed" || nextStatus === "failed"
2062
- ? (node.completedAt ?? nowIso)
2063
- : null;
2064
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_nodes
2065
- SET status = ${sqlQuote(nextStatus)},
2066
- updated_at = ${sqlQuote(nowIso)},
2067
- completed_at = ${sqlText(nextCompletedAt)}
2068
- WHERE id = ${sqlQuote(node.id)}`);
2069
- }
2070
- }
2071
- async getLastUsedRepo() {
2072
- await this.ensureSchema();
2073
- const rows = await executeRawSql(this.runtime, `SELECT repo
2074
- FROM orchestrator_task_sessions
2075
- WHERE repo IS NOT NULL AND repo <> ''
2076
- ORDER BY last_activity_at DESC
2077
- LIMIT 1`);
2078
- return rows[0] ? toText(rows[0].repo) : undefined;
2079
- }
2080
- async listSessionsForThread(threadId) {
2081
- const rows = await executeRawSql(this.runtime, `SELECT *
2082
- FROM orchestrator_task_sessions
2083
- WHERE thread_id = ${sqlQuote(threadId)}
2084
- ORDER BY registered_at ASC`);
2085
- return rows.map(parseSessionRow);
2086
- }
2087
- async listDecisionsForThread(threadId) {
2088
- const rows = await executeRawSql(this.runtime, `SELECT *
2089
- FROM orchestrator_task_decisions
2090
- WHERE thread_id = ${sqlQuote(threadId)}
2091
- ORDER BY timestamp ASC`);
2092
- return rows.map(parseDecisionRow);
2093
- }
2094
- async listDecisionsForSession(sessionId) {
2095
- const rows = await executeRawSql(this.runtime, `SELECT *
2096
- FROM orchestrator_task_decisions
2097
- WHERE session_id = ${sqlQuote(sessionId)}
2098
- ORDER BY timestamp ASC`);
2099
- return rows.map(parseDecisionRow);
2100
- }
2101
- async listEventsForThread(threadId) {
2102
- const rows = await executeRawSql(this.runtime, `SELECT *
2103
- FROM orchestrator_task_events
2104
- WHERE thread_id = ${sqlQuote(threadId)}
2105
- ORDER BY timestamp ASC`);
2106
- return rows.map(parseEventRow);
2107
- }
2108
- async listArtifactsForThread(threadId) {
2109
- const rows = await executeRawSql(this.runtime, `SELECT *
2110
- FROM orchestrator_task_artifacts
2111
- WHERE thread_id = ${sqlQuote(threadId)}
2112
- ORDER BY created_at ASC`);
2113
- return rows.map(parseArtifactRow);
2114
- }
2115
- async listTranscriptsForThread(threadId) {
2116
- const rows = await executeRawSql(this.runtime, `SELECT *
2117
- FROM orchestrator_task_transcripts
2118
- WHERE thread_id = ${sqlQuote(threadId)}
2119
- ORDER BY timestamp ASC`);
2120
- return rows.map(parseTranscriptRow);
2121
- }
2122
- async recomputeThreadStatus(threadId) {
2123
- await this.ensureSchema();
2124
- const thread = await this.getThreadRecord(threadId);
2125
- if (!thread)
2126
- return;
2127
- if (thread.archivedAt)
2128
- return;
2129
- const controlState = toText(thread.metadata.controlState)
2130
- .trim()
2131
- .toLowerCase();
2132
- const sessions = await this.listSessionsForThread(threadId);
2133
- const nowIso = isoNow();
2134
- let nextStatus = "open";
2135
- let closedAt = null;
2136
- const activeCount = sessions.filter((session) => ["active", "tool_running"].includes(session.status)).length;
2137
- const waitingOnUserCount = sessions.filter((session) => session.status === "waiting_on_user").length;
2138
- const blockedCount = sessions.filter((session) => session.status === "blocked").length;
2139
- const interruptedCount = sessions.filter((session) => ["interrupted", "stopped"].includes(session.status)).length;
2140
- const errorCount = sessions.filter((session) => session.status === "error").length;
2141
- const completedCount = sessions.filter((session) => session.status === "completed").length;
2142
- if (controlState === "paused" && activeCount === 0 && blockedCount === 0) {
2143
- nextStatus = "waiting_on_user";
2144
- }
2145
- else if (controlState === "stopped" &&
2146
- activeCount === 0 &&
2147
- blockedCount === 0 &&
2148
- waitingOnUserCount === 0) {
2149
- nextStatus = "interrupted";
2150
- closedAt = nowIso;
2151
- }
2152
- else if (sessions.length === 0) {
2153
- nextStatus = "open";
2154
- }
2155
- else if (activeCount > 0) {
2156
- nextStatus = "active";
2157
- }
2158
- else if (waitingOnUserCount > 0) {
2159
- nextStatus = "waiting_on_user";
2160
- }
2161
- else if (blockedCount > 0) {
2162
- nextStatus = "blocked";
2163
- }
2164
- else if (interruptedCount > 0) {
2165
- nextStatus = "interrupted";
2166
- closedAt = nowIso;
2167
- }
2168
- else if (completedCount === sessions.length) {
2169
- nextStatus = "done";
2170
- closedAt = nowIso;
2171
- }
2172
- else if (errorCount > 0) {
2173
- nextStatus = "failed";
2174
- closedAt = nowIso;
2175
- }
2176
- await executeRawSql(this.runtime, `UPDATE orchestrator_task_threads
2177
- SET status = ${sqlQuote(nextStatus)},
2178
- closed_at = ${sqlText(closedAt)},
2179
- updated_at = ${sqlQuote(nowIso)}
2180
- WHERE id = ${sqlQuote(threadId)}`);
2181
- }
2182
- }