verbolab 0.1.0-alpha.1

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 (493) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/bin/verbo.d.ts +3 -0
  4. package/dist/bin/verbo.d.ts.map +1 -0
  5. package/dist/bin/verbo.js +1156 -0
  6. package/dist/bin/verbo.js.map +1 -0
  7. package/dist/relay/index.d.ts +2 -0
  8. package/dist/relay/index.d.ts.map +1 -0
  9. package/dist/relay/index.js +15 -0
  10. package/dist/relay/index.js.map +1 -0
  11. package/dist/src/agent/agent-launcher.d.ts +64 -0
  12. package/dist/src/agent/agent-launcher.d.ts.map +1 -0
  13. package/dist/src/agent/agent-launcher.js +326 -0
  14. package/dist/src/agent/agent-launcher.js.map +1 -0
  15. package/dist/src/agent/agent-monitor.d.ts +16 -0
  16. package/dist/src/agent/agent-monitor.d.ts.map +1 -0
  17. package/dist/src/agent/agent-monitor.js +41 -0
  18. package/dist/src/agent/agent-monitor.js.map +1 -0
  19. package/dist/src/agent/fun-names.d.ts +9 -0
  20. package/dist/src/agent/fun-names.d.ts.map +1 -0
  21. package/dist/src/agent/fun-names.js +118 -0
  22. package/dist/src/agent/fun-names.js.map +1 -0
  23. package/dist/src/agent/mcp-shim.d.ts +45 -0
  24. package/dist/src/agent/mcp-shim.d.ts.map +1 -0
  25. package/dist/src/agent/mcp-shim.js +192 -0
  26. package/dist/src/agent/mcp-shim.js.map +1 -0
  27. package/dist/src/agent/personas.d.ts +47 -0
  28. package/dist/src/agent/personas.d.ts.map +1 -0
  29. package/dist/src/agent/personas.js +86 -0
  30. package/dist/src/agent/personas.js.map +1 -0
  31. package/dist/src/agent/provider-detection.d.ts +21 -0
  32. package/dist/src/agent/provider-detection.d.ts.map +1 -0
  33. package/dist/src/agent/provider-detection.js +47 -0
  34. package/dist/src/agent/provider-detection.js.map +1 -0
  35. package/dist/src/agent/providers/claude-provider.d.ts +3 -0
  36. package/dist/src/agent/providers/claude-provider.d.ts.map +1 -0
  37. package/dist/src/agent/providers/claude-provider.js +119 -0
  38. package/dist/src/agent/providers/claude-provider.js.map +1 -0
  39. package/dist/src/agent/providers/gemini-provider.d.ts +13 -0
  40. package/dist/src/agent/providers/gemini-provider.d.ts.map +1 -0
  41. package/dist/src/agent/providers/gemini-provider.js +143 -0
  42. package/dist/src/agent/providers/gemini-provider.js.map +1 -0
  43. package/dist/src/agent/providers/openai-provider.d.ts +3 -0
  44. package/dist/src/agent/providers/openai-provider.d.ts.map +1 -0
  45. package/dist/src/agent/providers/openai-provider.js +127 -0
  46. package/dist/src/agent/providers/openai-provider.js.map +1 -0
  47. package/dist/src/agent/providers/registry.d.ts +19 -0
  48. package/dist/src/agent/providers/registry.d.ts.map +1 -0
  49. package/dist/src/agent/providers/registry.js +30 -0
  50. package/dist/src/agent/providers/registry.js.map +1 -0
  51. package/dist/src/agent/providers/types.d.ts +118 -0
  52. package/dist/src/agent/providers/types.d.ts.map +1 -0
  53. package/dist/src/agent/providers/types.js +2 -0
  54. package/dist/src/agent/providers/types.js.map +1 -0
  55. package/dist/src/approval/approval-server.d.ts +17 -0
  56. package/dist/src/approval/approval-server.d.ts.map +1 -0
  57. package/dist/src/approval/approval-server.js +90 -0
  58. package/dist/src/approval/approval-server.js.map +1 -0
  59. package/dist/src/approval/approval-store.d.ts +29 -0
  60. package/dist/src/approval/approval-store.d.ts.map +1 -0
  61. package/dist/src/approval/approval-store.js +94 -0
  62. package/dist/src/approval/approval-store.js.map +1 -0
  63. package/dist/src/auth/auth-store.d.ts +18 -0
  64. package/dist/src/auth/auth-store.d.ts.map +1 -0
  65. package/dist/src/auth/auth-store.js +34 -0
  66. package/dist/src/auth/auth-store.js.map +1 -0
  67. package/dist/src/auth/device-code-client.d.ts +32 -0
  68. package/dist/src/auth/device-code-client.d.ts.map +1 -0
  69. package/dist/src/auth/device-code-client.js +41 -0
  70. package/dist/src/auth/device-code-client.js.map +1 -0
  71. package/dist/src/auth/plan-enforcer.d.ts +8 -0
  72. package/dist/src/auth/plan-enforcer.d.ts.map +1 -0
  73. package/dist/src/auth/plan-enforcer.js +14 -0
  74. package/dist/src/auth/plan-enforcer.js.map +1 -0
  75. package/dist/src/commands/audit.d.ts +7 -0
  76. package/dist/src/commands/audit.d.ts.map +1 -0
  77. package/dist/src/commands/audit.js +92 -0
  78. package/dist/src/commands/audit.js.map +1 -0
  79. package/dist/src/commands/team.d.ts +48 -0
  80. package/dist/src/commands/team.d.ts.map +1 -0
  81. package/dist/src/commands/team.js +175 -0
  82. package/dist/src/commands/team.js.map +1 -0
  83. package/dist/src/config/verbo-config.d.ts +43 -0
  84. package/dist/src/config/verbo-config.d.ts.map +1 -0
  85. package/dist/src/config/verbo-config.js +111 -0
  86. package/dist/src/config/verbo-config.js.map +1 -0
  87. package/dist/src/core/agent-session-store.d.ts +69 -0
  88. package/dist/src/core/agent-session-store.d.ts.map +1 -0
  89. package/dist/src/core/agent-session-store.js +168 -0
  90. package/dist/src/core/agent-session-store.js.map +1 -0
  91. package/dist/src/core/audit-log-store.d.ts +33 -0
  92. package/dist/src/core/audit-log-store.d.ts.map +1 -0
  93. package/dist/src/core/audit-log-store.js +104 -0
  94. package/dist/src/core/audit-log-store.js.map +1 -0
  95. package/dist/src/core/compliance.d.ts +50 -0
  96. package/dist/src/core/compliance.d.ts.map +1 -0
  97. package/dist/src/core/compliance.js +59 -0
  98. package/dist/src/core/compliance.js.map +1 -0
  99. package/dist/src/core/conflict-detector.d.ts +19 -0
  100. package/dist/src/core/conflict-detector.d.ts.map +1 -0
  101. package/dist/src/core/conflict-detector.js +87 -0
  102. package/dist/src/core/conflict-detector.js.map +1 -0
  103. package/dist/src/core/conflict-enforcer.d.ts +37 -0
  104. package/dist/src/core/conflict-enforcer.d.ts.map +1 -0
  105. package/dist/src/core/conflict-enforcer.js +139 -0
  106. package/dist/src/core/conflict-enforcer.js.map +1 -0
  107. package/dist/src/core/cost-store.d.ts +55 -0
  108. package/dist/src/core/cost-store.d.ts.map +1 -0
  109. package/dist/src/core/cost-store.js +140 -0
  110. package/dist/src/core/cost-store.js.map +1 -0
  111. package/dist/src/core/hot-files.d.ts +19 -0
  112. package/dist/src/core/hot-files.d.ts.map +1 -0
  113. package/dist/src/core/hot-files.js +64 -0
  114. package/dist/src/core/hot-files.js.map +1 -0
  115. package/dist/src/core/human-action-store.d.ts +33 -0
  116. package/dist/src/core/human-action-store.d.ts.map +1 -0
  117. package/dist/src/core/human-action-store.js +92 -0
  118. package/dist/src/core/human-action-store.js.map +1 -0
  119. package/dist/src/core/learning-store.d.ts +32 -0
  120. package/dist/src/core/learning-store.d.ts.map +1 -0
  121. package/dist/src/core/learning-store.js +95 -0
  122. package/dist/src/core/learning-store.js.map +1 -0
  123. package/dist/src/core/merge-queue.d.ts +28 -0
  124. package/dist/src/core/merge-queue.d.ts.map +1 -0
  125. package/dist/src/core/merge-queue.js +92 -0
  126. package/dist/src/core/merge-queue.js.map +1 -0
  127. package/dist/src/core/notification-service.d.ts +13 -0
  128. package/dist/src/core/notification-service.d.ts.map +1 -0
  129. package/dist/src/core/notification-service.js +126 -0
  130. package/dist/src/core/notification-service.js.map +1 -0
  131. package/dist/src/core/notifications.d.ts +10 -0
  132. package/dist/src/core/notifications.d.ts.map +1 -0
  133. package/dist/src/core/notifications.js +33 -0
  134. package/dist/src/core/notifications.js.map +1 -0
  135. package/dist/src/core/orchestrator-store.d.ts +44 -0
  136. package/dist/src/core/orchestrator-store.d.ts.map +1 -0
  137. package/dist/src/core/orchestrator-store.js +69 -0
  138. package/dist/src/core/orchestrator-store.js.map +1 -0
  139. package/dist/src/core/parallelizer.d.ts +47 -0
  140. package/dist/src/core/parallelizer.d.ts.map +1 -0
  141. package/dist/src/core/parallelizer.js +224 -0
  142. package/dist/src/core/parallelizer.js.map +1 -0
  143. package/dist/src/core/pipeline-rollback.d.ts +29 -0
  144. package/dist/src/core/pipeline-rollback.d.ts.map +1 -0
  145. package/dist/src/core/pipeline-rollback.js +84 -0
  146. package/dist/src/core/pipeline-rollback.js.map +1 -0
  147. package/dist/src/core/pipeline-runner.d.ts +73 -0
  148. package/dist/src/core/pipeline-runner.d.ts.map +1 -0
  149. package/dist/src/core/pipeline-runner.js +165 -0
  150. package/dist/src/core/pipeline-runner.js.map +1 -0
  151. package/dist/src/core/pr-creator.d.ts +22 -0
  152. package/dist/src/core/pr-creator.d.ts.map +1 -0
  153. package/dist/src/core/pr-creator.js +55 -0
  154. package/dist/src/core/pr-creator.js.map +1 -0
  155. package/dist/src/core/rbac.d.ts +27 -0
  156. package/dist/src/core/rbac.d.ts.map +1 -0
  157. package/dist/src/core/rbac.js +76 -0
  158. package/dist/src/core/rbac.js.map +1 -0
  159. package/dist/src/core/startup-cleanup.d.ts +47 -0
  160. package/dist/src/core/startup-cleanup.d.ts.map +1 -0
  161. package/dist/src/core/startup-cleanup.js +150 -0
  162. package/dist/src/core/startup-cleanup.js.map +1 -0
  163. package/dist/src/core/task-store.d.ts +96 -0
  164. package/dist/src/core/task-store.d.ts.map +1 -0
  165. package/dist/src/core/task-store.js +309 -0
  166. package/dist/src/core/task-store.js.map +1 -0
  167. package/dist/src/core/verbo-config-editor.d.ts +44 -0
  168. package/dist/src/core/verbo-config-editor.d.ts.map +1 -0
  169. package/dist/src/core/verbo-config-editor.js +204 -0
  170. package/dist/src/core/verbo-config-editor.js.map +1 -0
  171. package/dist/src/core/verbo-config.d.ts +35 -0
  172. package/dist/src/core/verbo-config.d.ts.map +1 -0
  173. package/dist/src/core/verbo-config.js +55 -0
  174. package/dist/src/core/verbo-config.js.map +1 -0
  175. package/dist/src/core/verbo-md.d.ts +96 -0
  176. package/dist/src/core/verbo-md.d.ts.map +1 -0
  177. package/dist/src/core/verbo-md.js +410 -0
  178. package/dist/src/core/verbo-md.js.map +1 -0
  179. package/dist/src/db/database.d.ts +9 -0
  180. package/dist/src/db/database.d.ts.map +1 -0
  181. package/dist/src/db/database.js +37 -0
  182. package/dist/src/db/database.js.map +1 -0
  183. package/dist/src/db/migrations/001-personas-subtasks.d.ts +10 -0
  184. package/dist/src/db/migrations/001-personas-subtasks.d.ts.map +1 -0
  185. package/dist/src/db/migrations/001-personas-subtasks.js +32 -0
  186. package/dist/src/db/migrations/001-personas-subtasks.js.map +1 -0
  187. package/dist/src/db/migrations/002-rbac.d.ts +9 -0
  188. package/dist/src/db/migrations/002-rbac.d.ts.map +1 -0
  189. package/dist/src/db/migrations/002-rbac.js +31 -0
  190. package/dist/src/db/migrations/002-rbac.js.map +1 -0
  191. package/dist/src/db/migrations/003-provider-column.d.ts +8 -0
  192. package/dist/src/db/migrations/003-provider-column.d.ts.map +1 -0
  193. package/dist/src/db/migrations/003-provider-column.js +12 -0
  194. package/dist/src/db/migrations/003-provider-column.js.map +1 -0
  195. package/dist/src/db/migrations/004-pipeline-cost.d.ts +8 -0
  196. package/dist/src/db/migrations/004-pipeline-cost.d.ts.map +1 -0
  197. package/dist/src/db/migrations/004-pipeline-cost.js +23 -0
  198. package/dist/src/db/migrations/004-pipeline-cost.js.map +1 -0
  199. package/dist/src/db/migrations/005-audit-log-timestamp.d.ts +10 -0
  200. package/dist/src/db/migrations/005-audit-log-timestamp.d.ts.map +1 -0
  201. package/dist/src/db/migrations/005-audit-log-timestamp.js +39 -0
  202. package/dist/src/db/migrations/005-audit-log-timestamp.js.map +1 -0
  203. package/dist/src/db/migrations/006-human-action-type.d.ts +9 -0
  204. package/dist/src/db/migrations/006-human-action-type.d.ts.map +1 -0
  205. package/dist/src/db/migrations/006-human-action-type.js +16 -0
  206. package/dist/src/db/migrations/006-human-action-type.js.map +1 -0
  207. package/dist/src/db/schema.d.ts +6 -0
  208. package/dist/src/db/schema.d.ts.map +1 -0
  209. package/dist/src/db/schema.js +255 -0
  210. package/dist/src/db/schema.js.map +1 -0
  211. package/dist/src/deps/dependabot-generator.d.ts +22 -0
  212. package/dist/src/deps/dependabot-generator.d.ts.map +1 -0
  213. package/dist/src/deps/dependabot-generator.js +83 -0
  214. package/dist/src/deps/dependabot-generator.js.map +1 -0
  215. package/dist/src/deps/dependabot-monitor.d.ts +22 -0
  216. package/dist/src/deps/dependabot-monitor.d.ts.map +1 -0
  217. package/dist/src/deps/dependabot-monitor.js +28 -0
  218. package/dist/src/deps/dependabot-monitor.js.map +1 -0
  219. package/dist/src/deps/package-auditor.d.ts +24 -0
  220. package/dist/src/deps/package-auditor.d.ts.map +1 -0
  221. package/dist/src/deps/package-auditor.js +118 -0
  222. package/dist/src/deps/package-auditor.js.map +1 -0
  223. package/dist/src/init/ensure-init.d.ts +6 -0
  224. package/dist/src/init/ensure-init.d.ts.map +1 -0
  225. package/dist/src/init/ensure-init.js +27 -0
  226. package/dist/src/init/ensure-init.js.map +1 -0
  227. package/dist/src/init/project-detector.d.ts +11 -0
  228. package/dist/src/init/project-detector.d.ts.map +1 -0
  229. package/dist/src/init/project-detector.js +117 -0
  230. package/dist/src/init/project-detector.js.map +1 -0
  231. package/dist/src/init/questionnaire.d.ts +5 -0
  232. package/dist/src/init/questionnaire.d.ts.map +1 -0
  233. package/dist/src/init/questionnaire.js +112 -0
  234. package/dist/src/init/questionnaire.js.map +1 -0
  235. package/dist/src/init/template.d.ts +17 -0
  236. package/dist/src/init/template.d.ts.map +1 -0
  237. package/dist/src/init/template.js +46 -0
  238. package/dist/src/init/template.js.map +1 -0
  239. package/dist/src/intelligence/claude-client.d.ts +3 -0
  240. package/dist/src/intelligence/claude-client.d.ts.map +1 -0
  241. package/dist/src/intelligence/claude-client.js +12 -0
  242. package/dist/src/intelligence/claude-client.js.map +1 -0
  243. package/dist/src/intelligence/conflict-mediator.d.ts +17 -0
  244. package/dist/src/intelligence/conflict-mediator.d.ts.map +1 -0
  245. package/dist/src/intelligence/conflict-mediator.js +83 -0
  246. package/dist/src/intelligence/conflict-mediator.js.map +1 -0
  247. package/dist/src/intelligence/github-orchestrator.d.ts +30 -0
  248. package/dist/src/intelligence/github-orchestrator.d.ts.map +1 -0
  249. package/dist/src/intelligence/github-orchestrator.js +270 -0
  250. package/dist/src/intelligence/github-orchestrator.js.map +1 -0
  251. package/dist/src/intelligence/kill-switch.d.ts +10 -0
  252. package/dist/src/intelligence/kill-switch.d.ts.map +1 -0
  253. package/dist/src/intelligence/kill-switch.js +12 -0
  254. package/dist/src/intelligence/kill-switch.js.map +1 -0
  255. package/dist/src/intelligence/learnings-extractor.d.ts +13 -0
  256. package/dist/src/intelligence/learnings-extractor.d.ts.map +1 -0
  257. package/dist/src/intelligence/learnings-extractor.js +74 -0
  258. package/dist/src/intelligence/learnings-extractor.js.map +1 -0
  259. package/dist/src/intelligence/project-scanner.d.ts +2 -0
  260. package/dist/src/intelligence/project-scanner.d.ts.map +1 -0
  261. package/dist/src/intelligence/project-scanner.js +28 -0
  262. package/dist/src/intelligence/project-scanner.js.map +1 -0
  263. package/dist/src/intelligence/task-decomposer.d.ts +14 -0
  264. package/dist/src/intelligence/task-decomposer.d.ts.map +1 -0
  265. package/dist/src/intelligence/task-decomposer.js +97 -0
  266. package/dist/src/intelligence/task-decomposer.js.map +1 -0
  267. package/dist/src/intelligence/types.d.ts +14 -0
  268. package/dist/src/intelligence/types.d.ts.map +1 -0
  269. package/dist/src/intelligence/types.js +2 -0
  270. package/dist/src/intelligence/types.js.map +1 -0
  271. package/dist/src/mcp/server.d.ts +63 -0
  272. package/dist/src/mcp/server.d.ts.map +1 -0
  273. package/dist/src/mcp/server.js +537 -0
  274. package/dist/src/mcp/server.js.map +1 -0
  275. package/dist/src/mcp/stdio-entry.d.ts +2 -0
  276. package/dist/src/mcp/stdio-entry.d.ts.map +1 -0
  277. package/dist/src/mcp/stdio-entry.js +124 -0
  278. package/dist/src/mcp/stdio-entry.js.map +1 -0
  279. package/dist/src/mcp/subtask-handlers.d.ts +7 -0
  280. package/dist/src/mcp/subtask-handlers.d.ts.map +1 -0
  281. package/dist/src/mcp/subtask-handlers.js +50 -0
  282. package/dist/src/mcp/subtask-handlers.js.map +1 -0
  283. package/dist/src/security/network-proxy.d.ts +20 -0
  284. package/dist/src/security/network-proxy.d.ts.map +1 -0
  285. package/dist/src/security/network-proxy.js +125 -0
  286. package/dist/src/security/network-proxy.js.map +1 -0
  287. package/dist/src/security/network-sandbox.d.ts +19 -0
  288. package/dist/src/security/network-sandbox.d.ts.map +1 -0
  289. package/dist/src/security/network-sandbox.js +100 -0
  290. package/dist/src/security/network-sandbox.js.map +1 -0
  291. package/dist/src/security/sanitize.d.ts +13 -0
  292. package/dist/src/security/sanitize.d.ts.map +1 -0
  293. package/dist/src/security/sanitize.js +19 -0
  294. package/dist/src/security/sanitize.js.map +1 -0
  295. package/dist/src/security/secrets-patterns.d.ts +29 -0
  296. package/dist/src/security/secrets-patterns.d.ts.map +1 -0
  297. package/dist/src/security/secrets-patterns.js +430 -0
  298. package/dist/src/security/secrets-patterns.js.map +1 -0
  299. package/dist/src/security/secrets-scanner.d.ts +26 -0
  300. package/dist/src/security/secrets-scanner.d.ts.map +1 -0
  301. package/dist/src/security/secrets-scanner.js +62 -0
  302. package/dist/src/security/secrets-scanner.js.map +1 -0
  303. package/dist/src/skills/classifier.d.ts +9 -0
  304. package/dist/src/skills/classifier.d.ts.map +1 -0
  305. package/dist/src/skills/classifier.js +41 -0
  306. package/dist/src/skills/classifier.js.map +1 -0
  307. package/dist/src/skills/registry.d.ts +16 -0
  308. package/dist/src/skills/registry.d.ts.map +1 -0
  309. package/dist/src/skills/registry.js +61 -0
  310. package/dist/src/skills/registry.js.map +1 -0
  311. package/dist/src/sync/events.d.ts +9 -0
  312. package/dist/src/sync/events.d.ts.map +1 -0
  313. package/dist/src/sync/events.js +2 -0
  314. package/dist/src/sync/events.js.map +1 -0
  315. package/dist/src/sync/relay-server.d.ts +18 -0
  316. package/dist/src/sync/relay-server.d.ts.map +1 -0
  317. package/dist/src/sync/relay-server.js +131 -0
  318. package/dist/src/sync/relay-server.js.map +1 -0
  319. package/dist/src/sync/sync-client.d.ts +31 -0
  320. package/dist/src/sync/sync-client.d.ts.map +1 -0
  321. package/dist/src/sync/sync-client.js +314 -0
  322. package/dist/src/sync/sync-client.js.map +1 -0
  323. package/dist/src/tui/app.d.ts +35 -0
  324. package/dist/src/tui/app.d.ts.map +1 -0
  325. package/dist/src/tui/app.js +676 -0
  326. package/dist/src/tui/app.js.map +1 -0
  327. package/dist/src/tui/components/activity-feed.d.ts +12 -0
  328. package/dist/src/tui/components/activity-feed.d.ts.map +1 -0
  329. package/dist/src/tui/components/activity-feed.js +82 -0
  330. package/dist/src/tui/components/activity-feed.js.map +1 -0
  331. package/dist/src/tui/components/agent-list.d.ts +19 -0
  332. package/dist/src/tui/components/agent-list.d.ts.map +1 -0
  333. package/dist/src/tui/components/agent-list.js +33 -0
  334. package/dist/src/tui/components/agent-list.js.map +1 -0
  335. package/dist/src/tui/components/agent-row.d.ts +12 -0
  336. package/dist/src/tui/components/agent-row.d.ts.map +1 -0
  337. package/dist/src/tui/components/agent-row.js +37 -0
  338. package/dist/src/tui/components/agent-row.js.map +1 -0
  339. package/dist/src/tui/components/approval-terminal.d.ts +13 -0
  340. package/dist/src/tui/components/approval-terminal.d.ts.map +1 -0
  341. package/dist/src/tui/components/approval-terminal.js +34 -0
  342. package/dist/src/tui/components/approval-terminal.js.map +1 -0
  343. package/dist/src/tui/components/audit-viewer.d.ts +16 -0
  344. package/dist/src/tui/components/audit-viewer.d.ts.map +1 -0
  345. package/dist/src/tui/components/audit-viewer.js +46 -0
  346. package/dist/src/tui/components/audit-viewer.js.map +1 -0
  347. package/dist/src/tui/components/auth-gate.d.ts +9 -0
  348. package/dist/src/tui/components/auth-gate.d.ts.map +1 -0
  349. package/dist/src/tui/components/auth-gate.js +112 -0
  350. package/dist/src/tui/components/auth-gate.js.map +1 -0
  351. package/dist/src/tui/components/command-palette.d.ts +12 -0
  352. package/dist/src/tui/components/command-palette.d.ts.map +1 -0
  353. package/dist/src/tui/components/command-palette.js +51 -0
  354. package/dist/src/tui/components/command-palette.js.map +1 -0
  355. package/dist/src/tui/components/compliance-badge.d.ts +11 -0
  356. package/dist/src/tui/components/compliance-badge.d.ts.map +1 -0
  357. package/dist/src/tui/components/compliance-badge.js +12 -0
  358. package/dist/src/tui/components/compliance-badge.js.map +1 -0
  359. package/dist/src/tui/components/decomposition-review.d.ts +10 -0
  360. package/dist/src/tui/components/decomposition-review.d.ts.map +1 -0
  361. package/dist/src/tui/components/decomposition-review.js +19 -0
  362. package/dist/src/tui/components/decomposition-review.js.map +1 -0
  363. package/dist/src/tui/components/dependency-graph.d.ts +13 -0
  364. package/dist/src/tui/components/dependency-graph.d.ts.map +1 -0
  365. package/dist/src/tui/components/dependency-graph.js +143 -0
  366. package/dist/src/tui/components/dependency-graph.js.map +1 -0
  367. package/dist/src/tui/components/diff-viewer.d.ts +11 -0
  368. package/dist/src/tui/components/diff-viewer.d.ts.map +1 -0
  369. package/dist/src/tui/components/diff-viewer.js +82 -0
  370. package/dist/src/tui/components/diff-viewer.js.map +1 -0
  371. package/dist/src/tui/components/edit-task-input.d.ts +10 -0
  372. package/dist/src/tui/components/edit-task-input.d.ts.map +1 -0
  373. package/dist/src/tui/components/edit-task-input.js +20 -0
  374. package/dist/src/tui/components/edit-task-input.js.map +1 -0
  375. package/dist/src/tui/components/footer.d.ts +12 -0
  376. package/dist/src/tui/components/footer.d.ts.map +1 -0
  377. package/dist/src/tui/components/footer.js +41 -0
  378. package/dist/src/tui/components/footer.js.map +1 -0
  379. package/dist/src/tui/components/header.d.ts +8 -0
  380. package/dist/src/tui/components/header.d.ts.map +1 -0
  381. package/dist/src/tui/components/header.js +20 -0
  382. package/dist/src/tui/components/header.js.map +1 -0
  383. package/dist/src/tui/components/human-actions.d.ts +14 -0
  384. package/dist/src/tui/components/human-actions.d.ts.map +1 -0
  385. package/dist/src/tui/components/human-actions.js +43 -0
  386. package/dist/src/tui/components/human-actions.js.map +1 -0
  387. package/dist/src/tui/components/log-panel.d.ts +10 -0
  388. package/dist/src/tui/components/log-panel.d.ts.map +1 -0
  389. package/dist/src/tui/components/log-panel.js +38 -0
  390. package/dist/src/tui/components/log-panel.js.map +1 -0
  391. package/dist/src/tui/components/memory-viewer.d.ts +10 -0
  392. package/dist/src/tui/components/memory-viewer.d.ts.map +1 -0
  393. package/dist/src/tui/components/memory-viewer.js +44 -0
  394. package/dist/src/tui/components/memory-viewer.js.map +1 -0
  395. package/dist/src/tui/components/new-task-input.d.ts +9 -0
  396. package/dist/src/tui/components/new-task-input.d.ts.map +1 -0
  397. package/dist/src/tui/components/new-task-input.js +21 -0
  398. package/dist/src/tui/components/new-task-input.js.map +1 -0
  399. package/dist/src/tui/components/orchestrator-status.d.ts +9 -0
  400. package/dist/src/tui/components/orchestrator-status.d.ts.map +1 -0
  401. package/dist/src/tui/components/orchestrator-status.js +15 -0
  402. package/dist/src/tui/components/orchestrator-status.js.map +1 -0
  403. package/dist/src/tui/components/parallelize-banner.d.ts +8 -0
  404. package/dist/src/tui/components/parallelize-banner.d.ts.map +1 -0
  405. package/dist/src/tui/components/parallelize-banner.js +9 -0
  406. package/dist/src/tui/components/parallelize-banner.js.map +1 -0
  407. package/dist/src/tui/components/progress-bar.d.ts +9 -0
  408. package/dist/src/tui/components/progress-bar.d.ts.map +1 -0
  409. package/dist/src/tui/components/progress-bar.js +15 -0
  410. package/dist/src/tui/components/progress-bar.js.map +1 -0
  411. package/dist/src/tui/components/review-queue.d.ts +13 -0
  412. package/dist/src/tui/components/review-queue.d.ts.map +1 -0
  413. package/dist/src/tui/components/review-queue.js +78 -0
  414. package/dist/src/tui/components/review-queue.js.map +1 -0
  415. package/dist/src/tui/components/rich-header.d.ts +11 -0
  416. package/dist/src/tui/components/rich-header.d.ts.map +1 -0
  417. package/dist/src/tui/components/rich-header.js +25 -0
  418. package/dist/src/tui/components/rich-header.js.map +1 -0
  419. package/dist/src/tui/components/spinner.d.ts +7 -0
  420. package/dist/src/tui/components/spinner.d.ts.map +1 -0
  421. package/dist/src/tui/components/spinner.js +8 -0
  422. package/dist/src/tui/components/spinner.js.map +1 -0
  423. package/dist/src/tui/components/status-bar.d.ts +23 -0
  424. package/dist/src/tui/components/status-bar.d.ts.map +1 -0
  425. package/dist/src/tui/components/status-bar.js +28 -0
  426. package/dist/src/tui/components/status-bar.js.map +1 -0
  427. package/dist/src/tui/components/task-queue.d.ts +11 -0
  428. package/dist/src/tui/components/task-queue.d.ts.map +1 -0
  429. package/dist/src/tui/components/task-queue.js +30 -0
  430. package/dist/src/tui/components/task-queue.js.map +1 -0
  431. package/dist/src/tui/components/team-view.d.ts +13 -0
  432. package/dist/src/tui/components/team-view.d.ts.map +1 -0
  433. package/dist/src/tui/components/team-view.js +12 -0
  434. package/dist/src/tui/components/team-view.js.map +1 -0
  435. package/dist/src/tui/graph-renderer.d.ts +11 -0
  436. package/dist/src/tui/graph-renderer.d.ts.map +1 -0
  437. package/dist/src/tui/graph-renderer.js +296 -0
  438. package/dist/src/tui/graph-renderer.js.map +1 -0
  439. package/dist/src/tui/hooks/use-bell.d.ts +21 -0
  440. package/dist/src/tui/hooks/use-bell.d.ts.map +1 -0
  441. package/dist/src/tui/hooks/use-bell.js +38 -0
  442. package/dist/src/tui/hooks/use-bell.js.map +1 -0
  443. package/dist/src/tui/hooks/use-ci-status.d.ts +16 -0
  444. package/dist/src/tui/hooks/use-ci-status.d.ts.map +1 -0
  445. package/dist/src/tui/hooks/use-ci-status.js +97 -0
  446. package/dist/src/tui/hooks/use-ci-status.js.map +1 -0
  447. package/dist/src/tui/hooks/use-command-palette.d.ts +37 -0
  448. package/dist/src/tui/hooks/use-command-palette.d.ts.map +1 -0
  449. package/dist/src/tui/hooks/use-command-palette.js +108 -0
  450. package/dist/src/tui/hooks/use-command-palette.js.map +1 -0
  451. package/dist/src/tui/hooks/use-diff-view.d.ts +16 -0
  452. package/dist/src/tui/hooks/use-diff-view.d.ts.map +1 -0
  453. package/dist/src/tui/hooks/use-diff-view.js +75 -0
  454. package/dist/src/tui/hooks/use-diff-view.js.map +1 -0
  455. package/dist/src/tui/hooks/use-keyboard.d.ts +3 -0
  456. package/dist/src/tui/hooks/use-keyboard.d.ts.map +1 -0
  457. package/dist/src/tui/hooks/use-keyboard.js +70 -0
  458. package/dist/src/tui/hooks/use-keyboard.js.map +1 -0
  459. package/dist/src/tui/hooks/use-log-stream.d.ts +25 -0
  460. package/dist/src/tui/hooks/use-log-stream.d.ts.map +1 -0
  461. package/dist/src/tui/hooks/use-log-stream.js +83 -0
  462. package/dist/src/tui/hooks/use-log-stream.js.map +1 -0
  463. package/dist/src/tui/hooks/use-spinner.d.ts +3 -0
  464. package/dist/src/tui/hooks/use-spinner.d.ts.map +1 -0
  465. package/dist/src/tui/hooks/use-spinner.js +13 -0
  466. package/dist/src/tui/hooks/use-spinner.js.map +1 -0
  467. package/dist/src/tui/hooks/use-store.d.ts +33 -0
  468. package/dist/src/tui/hooks/use-store.d.ts.map +1 -0
  469. package/dist/src/tui/hooks/use-store.js +21 -0
  470. package/dist/src/tui/hooks/use-store.js.map +1 -0
  471. package/dist/src/tui/lib/diff-parser.d.ts +24 -0
  472. package/dist/src/tui/lib/diff-parser.d.ts.map +1 -0
  473. package/dist/src/tui/lib/diff-parser.js +115 -0
  474. package/dist/src/tui/lib/diff-parser.js.map +1 -0
  475. package/dist/src/tui/lib/palette-commands.d.ts +14 -0
  476. package/dist/src/tui/lib/palette-commands.d.ts.map +1 -0
  477. package/dist/src/tui/lib/palette-commands.js +101 -0
  478. package/dist/src/tui/lib/palette-commands.js.map +1 -0
  479. package/dist/src/tui/tui.d.ts +8 -0
  480. package/dist/src/tui/tui.d.ts.map +1 -0
  481. package/dist/src/tui/tui.js +8 -0
  482. package/dist/src/tui/tui.js.map +1 -0
  483. package/package.json +66 -0
  484. package/skills/api-design.md +84 -0
  485. package/skills/backend-typescript.md +76 -0
  486. package/skills/data-modeling.md +73 -0
  487. package/skills/devops-ci.md +82 -0
  488. package/skills/frontend-design.md +69 -0
  489. package/skills/observability.md +73 -0
  490. package/skills/react-nextjs.md +76 -0
  491. package/skills/refactoring.md +77 -0
  492. package/skills/security.md +75 -0
  493. package/skills/testing.md +69 -0
@@ -0,0 +1,13 @@
1
+ import type { NotificationConfig } from './verbo-md.js';
2
+ export type NotificationEventType = 'task_completed' | 'agent_blocked' | 'pr_created' | 'budget_alert' | 'pipeline_step_failed' | 'pipeline_completed' | 'pipeline_rolled_back';
3
+ export interface NotificationEvent {
4
+ type: NotificationEventType;
5
+ title: string;
6
+ message: string;
7
+ metadata?: Record<string, string>;
8
+ }
9
+ export interface NotificationService {
10
+ send(event: NotificationEvent): Promise<void>;
11
+ }
12
+ export declare function createNotificationService(config: NotificationConfig): NotificationService;
13
+ //# sourceMappingURL=notification-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.d.ts","sourceRoot":"","sources":["../../../src/core/notification-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AA0BD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,mBAAmB,CA+BzF"}
@@ -0,0 +1,126 @@
1
+ // ---- Color palette per event type ----
2
+ const EVENT_COLORS = {
3
+ task_completed: 0x2ecc71, // green
4
+ agent_blocked: 0xe74c3c, // red
5
+ pr_created: 0x3498db, // blue
6
+ budget_alert: 0xe67e22, // orange
7
+ pipeline_step_failed: 0xe74c3c, // red
8
+ pipeline_completed: 0x2ecc71, // green
9
+ pipeline_rolled_back: 0x9b59b6, // purple
10
+ };
11
+ const EVENT_EMOJI = {
12
+ task_completed: '\u2705',
13
+ agent_blocked: '\ud83d\udea8',
14
+ pr_created: '\ud83d\udd17',
15
+ budget_alert: '\ud83d\udcb0',
16
+ pipeline_step_failed: '\u274c',
17
+ pipeline_completed: '\ud83c\udf89',
18
+ pipeline_rolled_back: '\u23ea',
19
+ };
20
+ // ---- Factory ----
21
+ export function createNotificationService(config) {
22
+ async function send(event) {
23
+ // Event filtering
24
+ if (config.events.length > 0 && !config.events.includes(event.type)) {
25
+ return;
26
+ }
27
+ // Quiet hours check
28
+ if (config.quietHours && isQuietHour(config.quietHours)) {
29
+ return;
30
+ }
31
+ // Dispatch to all configured webhooks concurrently; never throw
32
+ const dispatches = [];
33
+ if (config.slackWebhookUrl) {
34
+ dispatches.push(postJSON(config.slackWebhookUrl, buildSlackPayload(event)).catch(() => { }));
35
+ }
36
+ if (config.discordWebhookUrl) {
37
+ dispatches.push(postJSON(config.discordWebhookUrl, buildDiscordPayload(event)).catch(() => { }));
38
+ }
39
+ await Promise.all(dispatches);
40
+ }
41
+ return { send };
42
+ }
43
+ // ---- Slack Block Kit ----
44
+ function buildSlackPayload(event) {
45
+ const emoji = EVENT_EMOJI[event.type] ?? '\ud83d\udd14';
46
+ const blocks = [
47
+ {
48
+ type: 'header',
49
+ text: { type: 'plain_text', text: `${emoji} ${event.title}`, emoji: true },
50
+ },
51
+ {
52
+ type: 'section',
53
+ text: { type: 'mrkdwn', text: event.message },
54
+ },
55
+ ];
56
+ // Metadata fields
57
+ if (event.metadata && Object.keys(event.metadata).length > 0) {
58
+ blocks.push({
59
+ type: 'section',
60
+ fields: Object.entries(event.metadata).map(([key, value]) => ({
61
+ type: 'mrkdwn',
62
+ text: `*${key}:*\n${value}`,
63
+ })),
64
+ });
65
+ }
66
+ // Context footer with event type
67
+ blocks.push({
68
+ type: 'context',
69
+ elements: [
70
+ { type: 'mrkdwn', text: `Event: \`${event.type}\` | Verbo Orchestra` },
71
+ ],
72
+ });
73
+ return { blocks };
74
+ }
75
+ // ---- Discord Embeds ----
76
+ function buildDiscordPayload(event) {
77
+ const emoji = EVENT_EMOJI[event.type] ?? '\ud83d\udd14';
78
+ const color = EVENT_COLORS[event.type] ?? 0x95a5a6;
79
+ const embed = {
80
+ title: event.title,
81
+ description: `${emoji} ${event.message}`,
82
+ color,
83
+ footer: { text: `Event: ${event.type} | Verbo Orchestra` },
84
+ timestamp: new Date().toISOString(),
85
+ };
86
+ if (event.metadata && Object.keys(event.metadata).length > 0) {
87
+ embed.fields = Object.entries(event.metadata).map(([name, value]) => ({
88
+ name,
89
+ value,
90
+ inline: true,
91
+ }));
92
+ }
93
+ return { embeds: [embed] };
94
+ }
95
+ // ---- Quiet hours ----
96
+ function isQuietHour(quietHours) {
97
+ const match = quietHours.match(/^(\d{1,2}):(\d{2})\s*-\s*(\d{1,2}):(\d{2})$/);
98
+ if (!match)
99
+ return false;
100
+ const startHour = parseInt(match[1], 10);
101
+ const startMin = parseInt(match[2], 10);
102
+ const endHour = parseInt(match[3], 10);
103
+ const endMin = parseInt(match[4], 10);
104
+ const now = new Date();
105
+ const currentMinutes = now.getUTCHours() * 60 + now.getUTCMinutes();
106
+ const startMinutes = startHour * 60 + startMin;
107
+ const endMinutes = endHour * 60 + endMin;
108
+ if (startMinutes <= endMinutes) {
109
+ // Same-day range: e.g. 09:00-17:00
110
+ return currentMinutes >= startMinutes && currentMinutes < endMinutes;
111
+ }
112
+ // Spans midnight: e.g. 22:00-06:00
113
+ return currentMinutes >= startMinutes || currentMinutes < endMinutes;
114
+ }
115
+ // ---- HTTP helper ----
116
+ async function postJSON(url, body) {
117
+ const response = await fetch(url, {
118
+ method: 'POST',
119
+ headers: { 'Content-Type': 'application/json' },
120
+ body: JSON.stringify(body),
121
+ });
122
+ if (!response.ok) {
123
+ throw new Error(`Webhook POST to ${url} failed: ${response.status}`);
124
+ }
125
+ }
126
+ //# sourceMappingURL=notification-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.js","sourceRoot":"","sources":["../../../src/core/notification-service.ts"],"names":[],"mappings":"AAwBA,yCAAyC;AAEzC,MAAM,YAAY,GAA0C;IAC1D,cAAc,EAAQ,QAAQ,EAAE,QAAQ;IACxC,aAAa,EAAS,QAAQ,EAAE,MAAM;IACtC,UAAU,EAAY,QAAQ,EAAE,OAAO;IACvC,YAAY,EAAU,QAAQ,EAAE,SAAS;IACzC,oBAAoB,EAAE,QAAQ,EAAE,MAAM;IACtC,kBAAkB,EAAI,QAAQ,EAAE,QAAQ;IACxC,oBAAoB,EAAE,QAAQ,EAAE,SAAS;CAC1C,CAAC;AAEF,MAAM,WAAW,GAA0C;IACzD,cAAc,EAAQ,QAAQ;IAC9B,aAAa,EAAS,cAAc;IACpC,UAAU,EAAY,cAAc;IACpC,YAAY,EAAU,cAAc;IACpC,oBAAoB,EAAE,QAAQ;IAC9B,kBAAkB,EAAI,cAAc;IACpC,oBAAoB,EAAE,QAAQ;CAC/B,CAAC;AAEF,oBAAoB;AAEpB,MAAM,UAAU,yBAAyB,CAAC,MAA0B;IAClE,KAAK,UAAU,IAAI,CAAC,KAAwB;QAC1C,kBAAkB;QAClB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,MAAM,UAAU,GAAoB,EAAE,CAAC;QAEvC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CACb,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAC3E,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CACb,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAC/E,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,4BAA4B;AAE5B,SAAS,iBAAiB,CAAC,KAAwB;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;IACxD,MAAM,MAAM,GAAmC;QAC7C;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC3E;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;SAC9C;KACF,CAAC;IAEF,kBAAkB;IAClB,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5D,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,IAAI,GAAG,OAAO,KAAK,EAAE;aAC5B,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,CAAC,IAAI,sBAAsB,EAAE;SACvE;KACF,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,2BAA2B;AAE3B,SAAS,mBAAmB,CAAC,KAAwB;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;IAEnD,MAAM,KAAK,GAA4B;QACrC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;QACxC,KAAK;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,IAAI,oBAAoB,EAAE;QAC1D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACpE,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,IAAI;SACb,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7B,CAAC;AAED,wBAAwB;AAExB,SAAS,WAAW,CAAC,UAAkB;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;IACpE,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC;IAEzC,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;QAC/B,mCAAmC;QACnC,OAAO,cAAc,IAAI,YAAY,IAAI,cAAc,GAAG,UAAU,CAAC;IACvE,CAAC;IACD,mCAAmC;IACnC,OAAO,cAAc,IAAI,YAAY,IAAI,cAAc,GAAG,UAAU,CAAC;AACvE,CAAC;AAED,wBAAwB;AAExB,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAA6B;IAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NotificationConfig } from './verbo-md.js';
2
+ export interface Notifications {
3
+ /**
4
+ * Send a notification for the given event.
5
+ * Emits a terminal bell and optionally dispatches to configured webhooks.
6
+ */
7
+ send(event: string, message: string): Promise<void>;
8
+ }
9
+ export declare function createNotifications(config?: NotificationConfig): Notifications;
10
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/core/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAID,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,kBAAmC,GAAG,aAAa,CA4B9F"}
@@ -0,0 +1,33 @@
1
+ // ---- Factory ----
2
+ export function createNotifications(config = { events: [] }) {
3
+ async function send(event, message) {
4
+ // Always emit terminal bell for local audible feedback
5
+ process.stderr.write('\x07');
6
+ // Only dispatch webhooks if this event is in the configured events list
7
+ // (empty events list = no webhook filtering, send all events)
8
+ const shouldDispatch = config.events.length === 0 || config.events.includes(event);
9
+ if (!shouldDispatch)
10
+ return;
11
+ // Dispatch to Slack webhook if configured
12
+ if (config.slackWebhookUrl) {
13
+ await sendWebhook(config.slackWebhookUrl, { text: `[verbo] ${event}: ${message}` }).catch(() => { });
14
+ }
15
+ // Dispatch to Discord webhook if configured
16
+ if (config.discordWebhookUrl) {
17
+ await sendWebhook(config.discordWebhookUrl, { content: `[verbo] ${event}: ${message}` }).catch(() => { });
18
+ }
19
+ }
20
+ return { send };
21
+ }
22
+ // ---- Helpers ----
23
+ async function sendWebhook(url, body) {
24
+ const response = await fetch(url, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify(body),
28
+ });
29
+ if (!response.ok) {
30
+ throw new Error(`Webhook POST to ${url} failed: ${response.status}`);
31
+ }
32
+ }
33
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../src/core/notifications.ts"],"names":[],"mappings":"AAYA,oBAAoB;AAEpB,MAAM,UAAU,mBAAmB,CAAC,SAA6B,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7E,KAAK,UAAU,IAAI,CAAC,KAAa,EAAE,OAAe;QAChD,uDAAuD;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE7B,wEAAwE;QACxE,8DAA8D;QAC9D,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9D,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,0CAA0C;QAC1C,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CACvF,GAAG,EAAE,GAA+D,CAAC,CACtE,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,WAAW,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,WAAW,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAC5F,GAAG,EAAE,GAAiB,CAAC,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,oBAAoB;AAEpB,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAA4B;IAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,44 @@
1
+ export type ReviewLevel = 'BLOCKING' | 'WARNING' | 'SUGGESTION';
2
+ export interface ReviewComment {
3
+ level: ReviewLevel;
4
+ message: string;
5
+ file?: string;
6
+ line?: number;
7
+ }
8
+ export type PushStatus = 'pending' | 'pushed' | 'blocked' | 'failed' | 'skipped';
9
+ export interface OrchestratorState {
10
+ id: string;
11
+ taskId: string;
12
+ taskTitle: string;
13
+ summary: string;
14
+ branch: string;
15
+ baseBranch: string;
16
+ worktreePath: string;
17
+ pushStatus: PushStatus;
18
+ reviewComments: ReviewComment[];
19
+ humanActionId?: string;
20
+ prUrl?: string;
21
+ pushedAt?: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ }
25
+ export interface CreateOrchestratorStateInput {
26
+ taskId: string;
27
+ taskTitle: string;
28
+ summary: string;
29
+ branch: string;
30
+ baseBranch: string;
31
+ worktreePath: string;
32
+ }
33
+ export interface OrchestratorStore {
34
+ create(input: CreateOrchestratorStateInput): OrchestratorState;
35
+ get(taskId: string): OrchestratorState | null;
36
+ update(taskId: string, changes: Partial<Omit<OrchestratorState, 'id' | 'taskId' | 'createdAt'>>): OrchestratorState | null;
37
+ delete(taskId: string): void;
38
+ listBlocked(): OrchestratorState[];
39
+ list(): OrchestratorState[];
40
+ }
41
+ export declare function createOrchestratorStore(): OrchestratorStore;
42
+ /** Returns the number of orchestrator states with pushStatus 'pushed' and pushedAt today (local date). */
43
+ export declare function countPrsToday(states: OrchestratorState[]): number;
44
+ //# sourceMappingURL=orchestrator-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-store.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator-store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,iBAAiB,CAAC;IAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IAC9C,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC,GACvE,iBAAiB,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,IAAI,iBAAiB,EAAE,CAAC;IACnC,IAAI,IAAI,iBAAiB,EAAE,CAAC;CAC7B;AAID,wBAAgB,uBAAuB,IAAI,iBAAiB,CAsE3D;AAED,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAQjE"}
@@ -0,0 +1,69 @@
1
+ import { ulid } from 'ulid';
2
+ // ---- Factory ----
3
+ export function createOrchestratorStore() {
4
+ const store = new Map();
5
+ function create(input) {
6
+ const now = new Date().toISOString();
7
+ const state = {
8
+ id: ulid(),
9
+ taskId: input.taskId,
10
+ taskTitle: input.taskTitle,
11
+ summary: input.summary,
12
+ branch: input.branch,
13
+ baseBranch: input.baseBranch,
14
+ worktreePath: input.worktreePath,
15
+ pushStatus: 'pending',
16
+ reviewComments: [],
17
+ createdAt: now,
18
+ updatedAt: now,
19
+ };
20
+ store.set(input.taskId, state);
21
+ return { ...state };
22
+ }
23
+ function get(taskId) {
24
+ const state = store.get(taskId);
25
+ return state ? { ...state } : null;
26
+ }
27
+ function update(taskId, changes) {
28
+ const existing = store.get(taskId);
29
+ if (!existing)
30
+ return null;
31
+ const now = new Date().toISOString();
32
+ const pushedAt = changes.pushStatus === 'pushed' && !existing.pushedAt ? now : undefined;
33
+ const updated = {
34
+ ...existing,
35
+ ...changes,
36
+ ...(pushedAt ? { pushedAt } : {}),
37
+ updatedAt: now,
38
+ };
39
+ store.set(taskId, updated);
40
+ return { ...updated };
41
+ }
42
+ function deleteState(taskId) {
43
+ store.delete(taskId);
44
+ }
45
+ function listBlocked() {
46
+ return Array.from(store.values())
47
+ .filter((s) => s.pushStatus === 'blocked')
48
+ .map((s) => ({ ...s }));
49
+ }
50
+ function list() {
51
+ return Array.from(store.values()).map((s) => ({ ...s }));
52
+ }
53
+ return {
54
+ create,
55
+ get,
56
+ update,
57
+ delete: deleteState,
58
+ listBlocked,
59
+ list,
60
+ };
61
+ }
62
+ /** Returns the number of orchestrator states with pushStatus 'pushed' and pushedAt today (local date). */
63
+ export function countPrsToday(states) {
64
+ const today = new Date().toLocaleDateString();
65
+ return states.filter((s) => s.pushStatus === 'pushed' &&
66
+ s.pushedAt !== undefined &&
67
+ new Date(s.pushedAt).toLocaleDateString() === today).length;
68
+ }
69
+ //# sourceMappingURL=orchestrator-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-store.js","sourceRoot":"","sources":["../../../src/core/orchestrator-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Task, TaskStore } from './task-store.js';
2
+ export interface ParallelizerOptions {
3
+ maxAgents: number;
4
+ }
5
+ export interface ConflictInfo {
6
+ candidateTask: Task;
7
+ conflictingTask: Task;
8
+ file: string;
9
+ }
10
+ export interface MergeOrderSuggestion {
11
+ task: Task;
12
+ /** 1-based merge position (lower = merge first) */
13
+ position: number;
14
+ /** Human-readable reason for this position */
15
+ reason: string;
16
+ /** Task IDs that should be merged before this one */
17
+ mergeAfter: string[];
18
+ /** Number of done tasks whose files overlap with this task's files */
19
+ overlapCount: number;
20
+ }
21
+ export interface Parallelizer {
22
+ /** Compute a safe batch of tasks that can run concurrently. */
23
+ findSafeBatch(): Task[];
24
+ /**
25
+ * Find the first non-conflicting todo task starting from startIndex.
26
+ * Returns the task to launch plus any skip info, or null if all conflict.
27
+ */
28
+ findLaunchable(todoTasks: Task[], startIndex: number): {
29
+ task: Task;
30
+ index: number;
31
+ skipped: ConflictInfo[];
32
+ } | null;
33
+ /**
34
+ * Suggest an optimal merge order for all done tasks based on
35
+ * dependency graph (topological sort) and file overlap (fewer overlaps first).
36
+ */
37
+ suggestMergeOrder(): MergeOrderSuggestion[];
38
+ }
39
+ /**
40
+ * Returns true if any file path in filesA overlaps with any file path in filesB.
41
+ * Overlap means identical paths or one is a glob pattern that matches the other.
42
+ */
43
+ export declare function hasFileOverlap(filesA: string[], filesB: string[]): boolean;
44
+ export declare function createParallelizer(tasks: TaskStore, options: ParallelizerOptions, hotFiles?: {
45
+ isHot(filePath: string): boolean;
46
+ }): Parallelizer;
47
+ //# sourceMappingURL=parallelizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallelizer.d.ts","sourceRoot":"","sources":["../../../src/core/parallelizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIvD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,aAAa,IAAI,IAAI,EAAE,CAAC;IAExB;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG;QACrD,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC;IAET;;;OAGG;IACH,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;CAC7C;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAS1E;AAID,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,CAAC,EAAE;IAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAC9C,YAAY,CAwOd"}
@@ -0,0 +1,224 @@
1
+ import { minimatch } from 'minimatch';
2
+ // ---- Helper ----
3
+ /**
4
+ * Returns true if any file path in filesA overlaps with any file path in filesB.
5
+ * Overlap means identical paths or one is a glob pattern that matches the other.
6
+ */
7
+ export function hasFileOverlap(filesA, filesB) {
8
+ for (const pathA of filesA) {
9
+ for (const pathB of filesB) {
10
+ if (pathA === pathB)
11
+ return true;
12
+ if (minimatch(pathA, pathB))
13
+ return true;
14
+ if (minimatch(pathB, pathA))
15
+ return true;
16
+ }
17
+ }
18
+ return false;
19
+ }
20
+ // ---- Factory ----
21
+ export function createParallelizer(tasks, options, hotFiles) {
22
+ function findSafeBatch() {
23
+ // Step 1: Get all tasks, separate active (in_progress) and candidates (todo)
24
+ const allTasks = tasks.list();
25
+ const activeTasks = allTasks.filter((t) => t.status === 'in_progress');
26
+ let candidates = allTasks.filter((t) => t.status === 'todo' && !t.title.startsWith('HUMANO:'));
27
+ // Step 2: Sort candidates by priority (p0 < p1 < p2 < p3 lexicographically)
28
+ candidates = candidates.sort((a, b) => a.priority.localeCompare(b.priority));
29
+ // Step 3: Filter out candidates with unmet dependencies
30
+ // (deps where dep.status !== 'done')
31
+ const taskById = new Map(allTasks.map((t) => [t.id, t]));
32
+ candidates = candidates.filter((candidate) => {
33
+ for (const depId of candidate.dependencies) {
34
+ const dep = taskById.get(depId);
35
+ if (!dep || dep.status !== 'done') {
36
+ return false;
37
+ }
38
+ }
39
+ return true;
40
+ });
41
+ // Step 4: Collect all files from active tasks (already being worked on)
42
+ const activeFiles = activeTasks.flatMap((t) => t.filePaths);
43
+ // Step 5: Build the batch greedily in priority order
44
+ const batch = [];
45
+ const batchFiles = [];
46
+ for (const candidate of candidates) {
47
+ // Respect max agents limit
48
+ if (batch.length >= options.maxAgents)
49
+ break;
50
+ // Skip tasks with no declared filePaths — can't verify safety
51
+ if (candidate.filePaths.length === 0)
52
+ continue;
53
+ // Skip if file overlap with active tasks
54
+ if (activeFiles.length > 0 && hasFileOverlap(candidate.filePaths, activeFiles)) {
55
+ continue;
56
+ }
57
+ // Skip if file overlap with other batch members
58
+ if (batchFiles.length > 0 && hasFileOverlap(candidate.filePaths, batchFiles)) {
59
+ continue;
60
+ }
61
+ // Skip if candidate touches a hot file that an active task also touches
62
+ if (hotFiles) {
63
+ const candidateHotFiles = candidate.filePaths.filter((f) => hotFiles.isHot(f));
64
+ if (candidateHotFiles.length > 0) {
65
+ const activeHotFiles = activeFiles.filter((f) => hotFiles.isHot(f));
66
+ if (hasFileOverlap(candidateHotFiles, activeHotFiles)) {
67
+ continue;
68
+ }
69
+ }
70
+ }
71
+ // Safe to add
72
+ batch.push(candidate);
73
+ batchFiles.push(...candidate.filePaths);
74
+ }
75
+ // Step 6: Return the batch
76
+ return batch;
77
+ }
78
+ function findLaunchable(todoTasks, startIndex) {
79
+ const allTasks = tasks.list();
80
+ const activeTasks = allTasks.filter((t) => t.status === 'in_progress');
81
+ const activeFiles = activeTasks.flatMap((t) => t.filePaths);
82
+ const skipped = [];
83
+ const clampedStart = Math.min(startIndex, todoTasks.length - 1);
84
+ for (let offset = 0; offset < todoTasks.length; offset++) {
85
+ const idx = (clampedStart + offset) % todoTasks.length;
86
+ const candidate = todoTasks[idx];
87
+ // Check for file overlap with active tasks
88
+ if (activeFiles.length > 0 && candidate.filePaths.length > 0) {
89
+ let foundConflict = null;
90
+ for (const activeTask of activeTasks) {
91
+ for (const candidateFile of candidate.filePaths) {
92
+ for (const activeFile of activeTask.filePaths) {
93
+ if (candidateFile === activeFile ||
94
+ minimatch(candidateFile, activeFile) ||
95
+ minimatch(activeFile, candidateFile)) {
96
+ foundConflict = {
97
+ candidateTask: candidate,
98
+ conflictingTask: activeTask,
99
+ file: candidateFile,
100
+ };
101
+ break;
102
+ }
103
+ }
104
+ if (foundConflict)
105
+ break;
106
+ }
107
+ if (foundConflict)
108
+ break;
109
+ }
110
+ if (foundConflict) {
111
+ skipped.push(foundConflict);
112
+ continue;
113
+ }
114
+ }
115
+ // No conflict — this task is safe to launch
116
+ return { task: candidate, index: idx, skipped };
117
+ }
118
+ // All todo tasks conflict
119
+ return null;
120
+ }
121
+ function suggestMergeOrder() {
122
+ const allTasks = tasks.list();
123
+ const doneTasks = allTasks.filter((t) => t.status === 'done');
124
+ if (doneTasks.length === 0)
125
+ return [];
126
+ const doneIds = new Set(doneTasks.map((t) => t.id));
127
+ const taskById = new Map(doneTasks.map((t) => [t.id, t]));
128
+ // Build overlap counts between done tasks
129
+ const overlapCounts = new Map();
130
+ for (const t of doneTasks) {
131
+ let count = 0;
132
+ for (const other of doneTasks) {
133
+ if (other.id === t.id)
134
+ continue;
135
+ if (t.filePaths.length > 0 && other.filePaths.length > 0 &&
136
+ hasFileOverlap(t.filePaths, other.filePaths)) {
137
+ count++;
138
+ }
139
+ }
140
+ overlapCounts.set(t.id, count);
141
+ }
142
+ // Topological sort (Kahn's algorithm) respecting only deps within done tasks
143
+ // Build in-degree map and adjacency list
144
+ const inDegree = new Map();
145
+ const dependents = new Map(); // depId -> [tasks that depend on it]
146
+ for (const t of doneTasks) {
147
+ if (!inDegree.has(t.id))
148
+ inDegree.set(t.id, 0);
149
+ if (!dependents.has(t.id))
150
+ dependents.set(t.id, []);
151
+ for (const depId of t.dependencies) {
152
+ if (doneIds.has(depId)) {
153
+ inDegree.set(t.id, (inDegree.get(t.id) ?? 0) + 1);
154
+ if (!dependents.has(depId))
155
+ dependents.set(depId, []);
156
+ dependents.get(depId).push(t.id);
157
+ }
158
+ }
159
+ }
160
+ // Process in topological layers
161
+ const result = [];
162
+ const merged = new Set();
163
+ // Collect nodes with zero in-degree
164
+ let queue = doneTasks
165
+ .filter((t) => (inDegree.get(t.id) ?? 0) === 0)
166
+ .sort((a, b) => (overlapCounts.get(a.id) ?? 0) - (overlapCounts.get(b.id) ?? 0));
167
+ while (queue.length > 0) {
168
+ const nextQueue = [];
169
+ for (const task of queue) {
170
+ // Determine which done dependencies this task must merge after
171
+ const mergeAfter = task.dependencies.filter((depId) => doneIds.has(depId));
172
+ let reason;
173
+ if (mergeAfter.length > 0) {
174
+ const depTitles = mergeAfter
175
+ .map((id) => taskById.get(id)?.title ?? id)
176
+ .join(', ');
177
+ reason = `Depends on: ${depTitles}`;
178
+ }
179
+ else if ((overlapCounts.get(task.id) ?? 0) === 0) {
180
+ reason = 'No dependencies or file overlaps — safe to merge at any time';
181
+ }
182
+ else {
183
+ reason = `${overlapCounts.get(task.id)} file overlap(s) with other done tasks`;
184
+ }
185
+ result.push({
186
+ task,
187
+ position: result.length + 1,
188
+ reason,
189
+ mergeAfter,
190
+ overlapCount: overlapCounts.get(task.id) ?? 0,
191
+ });
192
+ merged.add(task.id);
193
+ // Reduce in-degree of dependents
194
+ for (const depId of dependents.get(task.id) ?? []) {
195
+ const newDegree = (inDegree.get(depId) ?? 1) - 1;
196
+ inDegree.set(depId, newDegree);
197
+ if (newDegree === 0) {
198
+ const depTask = taskById.get(depId);
199
+ if (depTask)
200
+ nextQueue.push(depTask);
201
+ }
202
+ }
203
+ }
204
+ // Sort next layer by overlap count (fewer overlaps first)
205
+ queue = nextQueue.sort((a, b) => (overlapCounts.get(a.id) ?? 0) - (overlapCounts.get(b.id) ?? 0));
206
+ }
207
+ // Handle any tasks not reached (e.g. dependency on a non-done task — still include them)
208
+ for (const t of doneTasks) {
209
+ if (!merged.has(t.id)) {
210
+ const mergeAfter = t.dependencies.filter((depId) => doneIds.has(depId));
211
+ result.push({
212
+ task: t,
213
+ position: result.length + 1,
214
+ reason: 'Has unresolved dependencies outside done tasks',
215
+ mergeAfter,
216
+ overlapCount: overlapCounts.get(t.id) ?? 0,
217
+ });
218
+ }
219
+ }
220
+ return result;
221
+ }
222
+ return { findSafeBatch, findLaunchable, suggestMergeOrder };
223
+ }
224
+ //# sourceMappingURL=parallelizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallelizer.js","sourceRoot":"","sources":["../../../src/core/parallelizer.ts"],"names":[],"mappings":"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"}