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,104 @@
1
+ import { ulid } from 'ulid';
2
+ // ---- Helper: row -> AuditLogEntry ----
3
+ function rowToEntry(row) {
4
+ return {
5
+ id: row.id,
6
+ timestamp: row.timestamp,
7
+ eventType: row.event_type,
8
+ agentSessionId: row.agent_session_id,
9
+ taskId: row.task_id,
10
+ humanId: row.human_id,
11
+ details: JSON.parse(row.details),
12
+ };
13
+ }
14
+ // ---- Factory ----
15
+ export function createAuditLogStore(db) {
16
+ const raw = db.raw();
17
+ const stmtInsert = raw.prepare(`
18
+ INSERT INTO audit_log (id, timestamp, event_type, agent_session_id, task_id, human_id, details)
19
+ VALUES (@id, @timestamp, @event_type, @agent_session_id, @task_id, @human_id, @details)
20
+ `);
21
+ const stmtGetById = raw.prepare('SELECT * FROM audit_log WHERE id = ?');
22
+ function append(input) {
23
+ const id = ulid();
24
+ const timestamp = new Date().toISOString();
25
+ stmtInsert.run({
26
+ id,
27
+ timestamp,
28
+ event_type: input.eventType,
29
+ agent_session_id: input.agentSessionId ?? null,
30
+ task_id: input.taskId ?? null,
31
+ human_id: input.humanId ?? null,
32
+ details: JSON.stringify(input.details ?? {}),
33
+ });
34
+ return rowToEntry(stmtGetById.get(id));
35
+ }
36
+ function query(filter) {
37
+ const conditions = [];
38
+ const params = [];
39
+ if (filter?.eventType) {
40
+ conditions.push('event_type = ?');
41
+ params.push(filter.eventType);
42
+ }
43
+ if (filter?.agentSessionId) {
44
+ conditions.push('agent_session_id = ?');
45
+ params.push(filter.agentSessionId);
46
+ }
47
+ if (filter?.taskId) {
48
+ conditions.push('task_id = ?');
49
+ params.push(filter.taskId);
50
+ }
51
+ if (filter?.humanId) {
52
+ conditions.push('human_id = ?');
53
+ params.push(filter.humanId);
54
+ }
55
+ if (filter?.since) {
56
+ conditions.push('timestamp >= ?');
57
+ params.push(filter.since);
58
+ }
59
+ if (filter?.until) {
60
+ conditions.push('timestamp <= ?');
61
+ params.push(filter.until);
62
+ }
63
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
64
+ const sql = `SELECT * FROM audit_log ${where} ORDER BY timestamp ASC`;
65
+ const stmt = raw.prepare(sql);
66
+ const rows = stmt.all(...params);
67
+ return rows.map(rowToEntry);
68
+ }
69
+ function exportEntries(filter, format) {
70
+ const entries = query(filter);
71
+ if (format === 'json') {
72
+ return JSON.stringify(entries, null, 2);
73
+ }
74
+ // CSV
75
+ const header = 'id,timestamp,event_type,agent_session_id,task_id,human_id,details';
76
+ if (entries.length === 0)
77
+ return header;
78
+ const escape = (v) => {
79
+ if (v === null)
80
+ return '';
81
+ const s = String(v);
82
+ if (s.includes(',') || s.includes('"') || s.includes('\n')) {
83
+ return `"${s.replace(/"/g, '""')}"`;
84
+ }
85
+ return s;
86
+ };
87
+ const rows = entries.map((e) => [
88
+ escape(e.id),
89
+ escape(e.timestamp),
90
+ escape(e.eventType),
91
+ escape(e.agentSessionId),
92
+ escape(e.taskId),
93
+ escape(e.humanId),
94
+ escape(JSON.stringify(e.details)),
95
+ ].join(','));
96
+ return [header, ...rows].join('\n');
97
+ }
98
+ return {
99
+ append,
100
+ query,
101
+ export: exportEntries,
102
+ };
103
+ }
104
+ //# sourceMappingURL=audit-log-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-store.js","sourceRoot":"","sources":["../../../src/core/audit-log-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { AuditLogStore } from './audit-log-store.js';
2
+ import type { ParsedVerboConfig, VerboCLIFlags } from './verbo-config.js';
3
+ import type { ComplianceMode } from './verbo-config.js';
4
+ export type { ComplianceMode } from './verbo-config.js';
5
+ /**
6
+ * Thrown when a CLI flag or runtime action violates compliance mode rules.
7
+ */
8
+ export declare class ComplianceModeError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ /**
12
+ * Frozen enforcement state produced by {@link createComplianceState}.
13
+ *
14
+ * Once created, this object is permanently immutable — compliance mode cannot
15
+ * be downgraded at runtime.
16
+ */
17
+ export interface ComplianceState {
18
+ /** Active enforcement mode. */
19
+ readonly mode: ComplianceMode;
20
+ /** True when mode === 'compliance'. Convenience flag for guard clauses. */
21
+ readonly isCompliance: boolean;
22
+ /**
23
+ * When true, every agent action must be approved by a Lead before execution.
24
+ * Always true in compliance mode; always false in standard mode.
25
+ */
26
+ readonly requireLeadApproval: boolean;
27
+ /**
28
+ * The configuration source that determined the active mode:
29
+ * 'cli' when --mode was passed on the command line, 'verbo_md' otherwise.
30
+ */
31
+ readonly modeSource: 'cli' | 'verbo_md';
32
+ }
33
+ /**
34
+ * Merge VERBO.md config and CLI flags to produce an immutable {@link ComplianceState}.
35
+ *
36
+ * Resolution rules:
37
+ * - CLI `--mode` takes precedence over VERBO.md `## Compliance / mode`.
38
+ * - `--no-sandbox` is rejected when the resolved mode is 'compliance'.
39
+ * - `compliance_mode_activated` audit event is emitted whenever compliance mode
40
+ * is activated, regardless of source.
41
+ *
42
+ * The returned object is frozen with {@link Object.freeze} — it cannot be mutated
43
+ * or downgraded after creation.
44
+ *
45
+ * @param config Parsed VERBO.md config (see {@link ParsedVerboConfig}).
46
+ * @param cliFlags Flags passed on the CLI.
47
+ * @param auditLog Optional audit store; receives a `compliance_mode_activated` entry.
48
+ */
49
+ export declare function createComplianceState(config: ParsedVerboConfig, cliFlags: VerboCLIFlags, auditLog?: AuditLogStore): Readonly<ComplianceState>;
50
+ //# sourceMappingURL=compliance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.d.ts","sourceRoot":"","sources":["../../../src/core/compliance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAID;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,UAAU,CAAC;CACzC;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,aAAa,GACvB,QAAQ,CAAC,eAAe,CAAC,CAqC3B"}
@@ -0,0 +1,59 @@
1
+ // ---- Errors ----
2
+ /**
3
+ * Thrown when a CLI flag or runtime action violates compliance mode rules.
4
+ */
5
+ export class ComplianceModeError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'ComplianceModeError';
9
+ }
10
+ }
11
+ // ---- Factory ----
12
+ /**
13
+ * Merge VERBO.md config and CLI flags to produce an immutable {@link ComplianceState}.
14
+ *
15
+ * Resolution rules:
16
+ * - CLI `--mode` takes precedence over VERBO.md `## Compliance / mode`.
17
+ * - `--no-sandbox` is rejected when the resolved mode is 'compliance'.
18
+ * - `compliance_mode_activated` audit event is emitted whenever compliance mode
19
+ * is activated, regardless of source.
20
+ *
21
+ * The returned object is frozen with {@link Object.freeze} — it cannot be mutated
22
+ * or downgraded after creation.
23
+ *
24
+ * @param config Parsed VERBO.md config (see {@link ParsedVerboConfig}).
25
+ * @param cliFlags Flags passed on the CLI.
26
+ * @param auditLog Optional audit store; receives a `compliance_mode_activated` entry.
27
+ */
28
+ export function createComplianceState(config, cliFlags, auditLog) {
29
+ // CLI flag takes precedence over VERBO.md setting
30
+ const modeSource = cliFlags.mode !== undefined ? 'cli' : 'verbo_md';
31
+ const mode = cliFlags.mode ?? config.compliance.mode;
32
+ // --no-sandbox is incompatible with compliance mode
33
+ if (mode === 'compliance' && cliFlags.noSandbox === true) {
34
+ throw new ComplianceModeError('--no-sandbox is not permitted in compliance mode. ' +
35
+ 'Sandbox enforcement is required when mode=compliance.');
36
+ }
37
+ const isCompliance = mode === 'compliance';
38
+ const requireLeadApproval = isCompliance;
39
+ const state = Object.freeze({
40
+ mode,
41
+ isCompliance,
42
+ requireLeadApproval,
43
+ modeSource,
44
+ });
45
+ // Emit audit event whenever compliance mode is activated
46
+ if (isCompliance && auditLog) {
47
+ auditLog.append({
48
+ eventType: 'compliance_mode_activated',
49
+ details: {
50
+ mode,
51
+ modeSource,
52
+ requireLeadApproval,
53
+ noSandboxAttempted: false, // would have thrown above if true
54
+ },
55
+ });
56
+ }
57
+ return state;
58
+ }
59
+ //# sourceMappingURL=compliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.js","sourceRoot":"","sources":["../../../src/core/compliance.ts"],"names":[],"mappings":"AAMA,mBAAmB;AAEnB;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AA2BD,oBAAoB;AAEpB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAyB,EACzB,QAAuB,EACvB,QAAwB;IAExB,kDAAkD;IAClD,MAAM,UAAU,GAAuB,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IACxF,MAAM,IAAI,GAAmB,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IAErE,oDAAoD;IACpD,IAAI,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,mBAAmB,CAC3B,oDAAoD;YAClD,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,KAAK,YAAY,CAAC;IAC3C,MAAM,mBAAmB,GAAG,YAAY,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAkB;QAC3C,IAAI;QACJ,YAAY;QACZ,mBAAmB;QACnB,UAAU;KACX,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC;YACd,SAAS,EAAE,2BAA2B;YACtC,OAAO,EAAE;gBACP,IAAI;gBACJ,UAAU;gBACV,mBAAmB;gBACnB,kBAAkB,EAAE,KAAK,EAAE,kCAAkC;aAC9D;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { TaskStore } from './task-store.js';
2
+ export interface FileConflict {
3
+ file: string;
4
+ taskIds: string[];
5
+ taskTitles: string[];
6
+ }
7
+ export interface ConflictDetector {
8
+ /** Compare all in_progress tasks pairwise and return file-level conflicts. */
9
+ findOverlaps(): FileConflict[];
10
+ /** Check candidate file paths against all in_progress tasks for conflicts. */
11
+ checkTask(filePaths: string[]): FileConflict[];
12
+ }
13
+ /**
14
+ * Returns true if pathA and pathB refer to the same file or one is a glob
15
+ * pattern that matches the other.
16
+ */
17
+ export declare function filesOverlap(pathA: string, pathB: string): boolean;
18
+ export declare function createConflictDetector(tasks: TaskStore): ConflictDetector;
19
+ //# sourceMappingURL=conflict-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../../../src/core/conflict-detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,YAAY,IAAI,YAAY,EAAE,CAAC;IAE/B,8EAA8E;IAC9E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;CAChD;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGlE;AAID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAgFzE"}
@@ -0,0 +1,87 @@
1
+ import { minimatch } from 'minimatch';
2
+ // ---- Helper ----
3
+ /**
4
+ * Returns true if pathA and pathB refer to the same file or one is a glob
5
+ * pattern that matches the other.
6
+ */
7
+ export function filesOverlap(pathA, pathB) {
8
+ if (pathA === pathB)
9
+ return true;
10
+ return minimatch(pathA, pathB) || minimatch(pathB, pathA);
11
+ }
12
+ // ---- Factory ----
13
+ export function createConflictDetector(tasks) {
14
+ function findOverlaps() {
15
+ const activeTasks = tasks.list({ status: 'in_progress' });
16
+ // Map from a canonical "file key" to conflict info.
17
+ // We use a Map keyed by a sorted pair of conflicting paths to avoid
18
+ // duplicate entries, but the FileConflict.file field reports one of the two paths.
19
+ const conflictMap = new Map();
20
+ for (let i = 0; i < activeTasks.length; i++) {
21
+ for (let j = i + 1; j < activeTasks.length; j++) {
22
+ const taskA = activeTasks[i];
23
+ const taskB = activeTasks[j];
24
+ for (const fileA of taskA.filePaths) {
25
+ for (const fileB of taskB.filePaths) {
26
+ if (filesOverlap(fileA, fileB)) {
27
+ // Use a stable key: sort the two paths
28
+ const key = [fileA, fileB].sort().join('::');
29
+ if (!conflictMap.has(key)) {
30
+ conflictMap.set(key, {
31
+ file: fileA,
32
+ taskIds: [taskA.id, taskB.id],
33
+ taskTitles: [taskA.title, taskB.title],
34
+ });
35
+ }
36
+ else {
37
+ // Merge additional task info if the same file conflict appears
38
+ // across more than two tasks (rare but handled)
39
+ const existing = conflictMap.get(key);
40
+ if (!existing.taskIds.includes(taskA.id)) {
41
+ existing.taskIds.push(taskA.id);
42
+ existing.taskTitles.push(taskA.title);
43
+ }
44
+ if (!existing.taskIds.includes(taskB.id)) {
45
+ existing.taskIds.push(taskB.id);
46
+ existing.taskTitles.push(taskB.title);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ return Array.from(conflictMap.values());
55
+ }
56
+ function checkTask(filePaths) {
57
+ const activeTasks = tasks.list({ status: 'in_progress' });
58
+ // Map from conflicting file pair key to conflict info
59
+ const conflictMap = new Map();
60
+ for (const candidatePath of filePaths) {
61
+ for (const activeTask of activeTasks) {
62
+ for (const activeFile of activeTask.filePaths) {
63
+ if (filesOverlap(candidatePath, activeFile)) {
64
+ const key = [candidatePath, activeFile].sort().join('::');
65
+ if (!conflictMap.has(key)) {
66
+ conflictMap.set(key, {
67
+ file: candidatePath,
68
+ taskIds: [activeTask.id],
69
+ taskTitles: [activeTask.title],
70
+ });
71
+ }
72
+ else {
73
+ const existing = conflictMap.get(key);
74
+ if (!existing.taskIds.includes(activeTask.id)) {
75
+ existing.taskIds.push(activeTask.id);
76
+ existing.taskTitles.push(activeTask.title);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return Array.from(conflictMap.values());
84
+ }
85
+ return { findOverlaps, checkTask };
86
+ }
87
+ //# sourceMappingURL=conflict-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../../../src/core/conflict-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { TaskStore } from './task-store.js';
2
+ import type { AgentSessionStore } from './agent-session-store.js';
3
+ import type { ConflictDetector } from './conflict-detector.js';
4
+ import type { ConflictMediator } from '../intelligence/conflict-mediator.js';
5
+ export interface ConflictAction {
6
+ pausedTaskId: string;
7
+ pausedSessionId: string;
8
+ earlierTaskId: string;
9
+ file: string;
10
+ }
11
+ export interface ConflictEnforcer {
12
+ /** Detect file conflicts and kill/pause the later agent. Returns actions taken. */
13
+ enforce(): Promise<ConflictAction[]>;
14
+ /**
15
+ * Check if any todo tasks were paused due to conflict with the completed task.
16
+ * Removes the paused-by-conflict label and returns task IDs ready for relaunch.
17
+ * Only returns a task if ALL its paused-by-conflict labels have been cleared.
18
+ */
19
+ checkRelaunch(completedTaskId: string): string[];
20
+ }
21
+ export interface ConflictEnforcerDeps {
22
+ tasks: TaskStore;
23
+ sessions: AgentSessionStore;
24
+ detector: ConflictDetector;
25
+ /** Kill an agent session: terminate its process, clean up approvals, mark errored. */
26
+ killSession: (sessionId: string) => void;
27
+ /** Optional: attempt auto-merge before pausing agent. */
28
+ mediator?: ConflictMediator;
29
+ /** Root project directory. Required when mediator is set to locate agent worktrees. */
30
+ projectDir?: string;
31
+ /** Called for each file that was auto-merged instead of killing the agent. */
32
+ onAutoMerged?: (file: string) => void;
33
+ /** Reads a file from disk. Defaults to readFileSync. Injectable for testing. */
34
+ readWorktreeFile?: (filePath: string) => string;
35
+ }
36
+ export declare function createConflictEnforcer(deps: ConflictEnforcerDeps): ConflictEnforcer;
37
+ //# sourceMappingURL=conflict-enforcer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-enforcer.d.ts","sourceRoot":"","sources":["../../../src/core/conflict-enforcer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAErC;;;;OAIG;IACH,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sFAAsF;IACtF,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAmKnF"}
@@ -0,0 +1,139 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ // ---- Factory ----
4
+ export function createConflictEnforcer(deps) {
5
+ const { tasks, sessions, detector, killSession } = deps;
6
+ async function enforce() {
7
+ const conflicts = detector.findOverlaps();
8
+ // Pass 1: Collect all pause decisions.
9
+ // A task can appear in multiple conflicts (e.g. it touches files from task A
10
+ // and task B). We need labels for ALL surviving tasks it conflicts with.
11
+ const pauseMap = new Map();
12
+ // Pre-load session info for all in_progress tasks involved in conflicts
13
+ const sessionCache = new Map();
14
+ for (const conflict of conflicts) {
15
+ for (const taskId of conflict.taskIds) {
16
+ if (sessionCache.has(taskId))
17
+ continue;
18
+ const task = tasks.get(taskId);
19
+ if (!task || task.status !== 'in_progress' || !task.agentSessionId)
20
+ continue;
21
+ const session = sessions.get(task.agentSessionId);
22
+ if (!session)
23
+ continue;
24
+ sessionCache.set(taskId, { sessionId: session.id, startedAt: session.startedAt });
25
+ }
26
+ }
27
+ for (const conflict of conflicts) {
28
+ // Gather involved tasks with session info
29
+ const taskSessions = [];
30
+ for (const taskId of conflict.taskIds) {
31
+ const info = sessionCache.get(taskId);
32
+ if (info)
33
+ taskSessions.push({ taskId, ...info });
34
+ }
35
+ if (taskSessions.length < 2)
36
+ continue;
37
+ // Sort by startedAt ascending — earliest first
38
+ taskSessions.sort((a, b) => a.startedAt.localeCompare(b.startedAt));
39
+ const earlierTaskId = taskSessions[0].taskId;
40
+ // Mark all except the earliest for pausing
41
+ for (let i = 1; i < taskSessions.length; i++) {
42
+ const { taskId, sessionId } = taskSessions[i];
43
+ if (!pauseMap.has(taskId)) {
44
+ pauseMap.set(taskId, { sessionId, labels: new Set(), actions: [] });
45
+ }
46
+ const entry = pauseMap.get(taskId);
47
+ entry.labels.add(`paused-by-conflict:${earlierTaskId}`);
48
+ entry.actions.push({
49
+ pausedTaskId: taskId,
50
+ pausedSessionId: sessionId,
51
+ earlierTaskId,
52
+ file: conflict.file,
53
+ });
54
+ }
55
+ }
56
+ // Pass 2: Execute pauses (or auto-merge if mediator resolves cleanly)
57
+ const allActions = [];
58
+ for (const [taskId, { sessionId, labels, actions }] of pauseMap) {
59
+ let autoMerged = false;
60
+ if (deps.mediator && deps.projectDir) {
61
+ // Try to auto-merge every conflicting file for this task.
62
+ // Only skip the kill if ALL files merge cleanly as ADDITIVE or COSMETIC.
63
+ const resolvedFiles = new Set();
64
+ const conflictingFiles = new Set(actions.map((a) => a.file));
65
+ const readFile = deps.readWorktreeFile ?? ((p) => readFileSync(p, 'utf-8'));
66
+ for (const action of actions) {
67
+ try {
68
+ const oursPath = join(deps.projectDir, '.verbo', 'agents', taskId, action.file);
69
+ const theirsPath = join(deps.projectDir, '.verbo', 'agents', action.earlierTaskId, action.file);
70
+ const ours = readFile(oursPath);
71
+ const theirs = readFile(theirsPath);
72
+ const result = await deps.mediator.attemptGitMergeFile('', ours, theirs);
73
+ if (result.success &&
74
+ (result.conflictType === 'ADDITIVE' || result.conflictType === 'COSMETIC')) {
75
+ resolvedFiles.add(action.file);
76
+ }
77
+ }
78
+ catch {
79
+ // Cannot read file from worktree — treat as structural and fall through to kill
80
+ }
81
+ }
82
+ if (resolvedFiles.size > 0 && resolvedFiles.size === conflictingFiles.size) {
83
+ autoMerged = true;
84
+ for (const file of resolvedFiles) {
85
+ deps.onAutoMerged?.(file);
86
+ }
87
+ }
88
+ }
89
+ if (!autoMerged) {
90
+ // Determine if we should kill or just warn
91
+ // Kill only when mediator is available and confirmed inability to auto-merge
92
+ // (which means STRUCTURAL conflicts were found)
93
+ // If no mediator: don't kill, let merge queue handle it
94
+ if (deps.mediator && deps.projectDir) {
95
+ // Mediator was available but couldn't auto-merge = STRUCTURAL
96
+ killSession(sessionId);
97
+ tasks.unclaim(taskId);
98
+ // Add all paused-by-conflict labels
99
+ const task = tasks.get(taskId);
100
+ if (task) {
101
+ const newLabels = [...labels].filter((l) => !task.labels.includes(l));
102
+ if (newLabels.length > 0) {
103
+ tasks.update(taskId, { labels: [...task.labels, ...newLabels] });
104
+ }
105
+ }
106
+ allActions.push(...actions);
107
+ }
108
+ else {
109
+ // No mediator: warn but don't kill — tag for merge queue awareness
110
+ const task = tasks.get(taskId);
111
+ if (task && !task.labels.includes('has-file-overlap')) {
112
+ tasks.update(taskId, { labels: [...task.labels, 'has-file-overlap'] });
113
+ }
114
+ }
115
+ }
116
+ }
117
+ return allActions;
118
+ }
119
+ function checkRelaunch(completedTaskId) {
120
+ const todoTasks = tasks.list({ status: 'todo' });
121
+ const toRelaunch = [];
122
+ const pauseLabel = `paused-by-conflict:${completedTaskId}`;
123
+ for (const task of todoTasks) {
124
+ if (!task.labels.includes(pauseLabel))
125
+ continue;
126
+ // Remove this specific label
127
+ const remainingLabels = task.labels.filter((l) => l !== pauseLabel);
128
+ tasks.update(task.id, { labels: remainingLabels });
129
+ // Only relaunch if no remaining paused-by-conflict labels
130
+ const stillPaused = remainingLabels.some((l) => l.startsWith('paused-by-conflict:'));
131
+ if (!stillPaused) {
132
+ toRelaunch.push(task.id);
133
+ }
134
+ }
135
+ return toRelaunch;
136
+ }
137
+ return { enforce, checkRelaunch };
138
+ }
139
+ //# sourceMappingURL=conflict-enforcer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-enforcer.js","sourceRoot":"","sources":["../../../src/core/conflict-enforcer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { VerboDatabase } from '../db/database.js';
2
+ export declare function computeCostUsd(inputTokens: number, outputTokens: number, cacheReadTokens: number, cacheWriteTokens: number): number;
3
+ export interface CostEntry {
4
+ id: string;
5
+ timestamp: string;
6
+ pipelineRunId: string;
7
+ taskId: string | null;
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ cacheReadTokens: number;
11
+ cacheWriteTokens: number;
12
+ costUsd: number;
13
+ }
14
+ export interface RecordTokenInput {
15
+ pipelineRunId: string;
16
+ taskId?: string;
17
+ inputTokens: number;
18
+ outputTokens: number;
19
+ cacheReadTokens: number;
20
+ cacheWriteTokens: number;
21
+ }
22
+ export interface CostSummary {
23
+ totalCostUsd: number;
24
+ entryCount: number;
25
+ totalInputTokens: number;
26
+ totalOutputTokens: number;
27
+ totalCacheReadTokens: number;
28
+ totalCacheWriteTokens: number;
29
+ }
30
+ export interface CostGroup {
31
+ group: string;
32
+ costUsd: number;
33
+ entryCount: number;
34
+ }
35
+ export interface ModelPricing {
36
+ model: string;
37
+ inputCostPer1mTokens: number;
38
+ outputCostPer1mTokens: number;
39
+ cacheReadCostPer1mTokens: number | null;
40
+ cacheWriteCostPer1mTokens: number | null;
41
+ }
42
+ export interface CostStore {
43
+ record(input: RecordTokenInput): CostEntry;
44
+ getTotalCostUsd(pipelineRunId: string): number;
45
+ getEntries(pipelineRunId: string): CostEntry[];
46
+ getSummary(): CostSummary;
47
+ getCostToday(): number;
48
+ getCostByTask(): CostGroup[];
49
+ getCostByDay(): CostGroup[];
50
+ getCostByPipeline(): CostGroup[];
51
+ updateModelPricing(input: ModelPricing): void;
52
+ listModelPricing(): ModelPricing[];
53
+ }
54
+ export declare function createCostStore(db: VerboDatabase): CostStore;
55
+ //# sourceMappingURL=cost-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-store.d.ts","sourceRoot":"","sources":["../../../src/core/cost-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASvD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAOR;AAID,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/C,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IAC/C,UAAU,IAAI,WAAW,CAAC;IAC1B,YAAY,IAAI,MAAM,CAAC;IACvB,aAAa,IAAI,SAAS,EAAE,CAAC;IAC7B,YAAY,IAAI,SAAS,EAAE,CAAC;IAC5B,iBAAiB,IAAI,SAAS,EAAE,CAAC;IACjC,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,gBAAgB,IAAI,YAAY,EAAE,CAAC;CACpC;AAgCD,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,GAAG,SAAS,CAsJ5D"}