automagik-forge 0.1.11 → 0.1.13

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 (301) hide show
  1. package/.cargo/config.toml +13 -0
  2. package/.claude/commands/commit.md +376 -0
  3. package/.claude/commands/prompt.md +871 -0
  4. package/.env.example +20 -0
  5. package/.github/actions/setup-node/action.yml +29 -0
  6. package/.github/images/automagik-logo.png +0 -0
  7. package/.github/workflows/pre-release.yml +470 -0
  8. package/.github/workflows/publish.yml +145 -0
  9. package/.github/workflows/test.yml +63 -0
  10. package/.mcp.json +57 -0
  11. package/AGENT.md +40 -0
  12. package/CLAUDE.md +40 -0
  13. package/CODE-OF-CONDUCT.md +89 -0
  14. package/Cargo.toml +19 -0
  15. package/Dockerfile +43 -0
  16. package/LICENSE +201 -0
  17. package/Makefile +97 -0
  18. package/README.md +447 -143
  19. package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +12 -0
  20. package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +12 -0
  21. package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +12 -0
  22. package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +68 -0
  23. package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +12 -0
  24. package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +12 -0
  25. package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +12 -0
  26. package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +104 -0
  27. package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +12 -0
  28. package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +32 -0
  29. package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +56 -0
  30. package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +68 -0
  31. package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +92 -0
  32. package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +12 -0
  33. package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +56 -0
  34. package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +62 -0
  35. package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +62 -0
  36. package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +56 -0
  37. package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +32 -0
  38. package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +104 -0
  39. package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +62 -0
  40. package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +56 -0
  41. package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +92 -0
  42. package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +62 -0
  43. package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +12 -0
  44. package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +104 -0
  45. package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +104 -0
  46. package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +68 -0
  47. package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +62 -0
  48. package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +62 -0
  49. package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +62 -0
  50. package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +50 -0
  51. package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +68 -0
  52. package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +12 -0
  53. package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +68 -0
  54. package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +12 -0
  55. package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +12 -0
  56. package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +62 -0
  57. package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +104 -0
  58. package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +20 -0
  59. package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +104 -0
  60. package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +56 -0
  61. package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +104 -0
  62. package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +26 -0
  63. package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +62 -0
  64. package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +12 -0
  65. package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +104 -0
  66. package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +104 -0
  67. package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +12 -0
  68. package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +68 -0
  69. package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +62 -0
  70. package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +20 -0
  71. package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +12 -0
  72. package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +12 -0
  73. package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +12 -0
  74. package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +20 -0
  75. package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +12 -0
  76. package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +12 -0
  77. package/backend/Cargo.toml +71 -0
  78. package/backend/build.rs +32 -0
  79. package/backend/migrations/20250617183714_init.sql +44 -0
  80. package/backend/migrations/20250620212427_execution_processes.sql +25 -0
  81. package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +28 -0
  82. package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +23 -0
  83. package/backend/migrations/20250623120000_executor_sessions.sql +17 -0
  84. package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +4 -0
  85. package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +4 -0
  86. package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +2 -0
  87. package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +5 -0
  88. package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +2 -0
  89. package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +2 -0
  90. package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +2 -0
  91. package/backend/migrations/20250710000000_add_setup_completion.sql +3 -0
  92. package/backend/migrations/20250715154859_add_task_templates.sql +25 -0
  93. package/backend/migrations/20250716143725_add_default_templates.sql +174 -0
  94. package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +20 -0
  95. package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +7 -0
  96. package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +9 -0
  97. package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +2 -0
  98. package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +25 -0
  99. package/backend/migrations/20250723000000_add_wish_to_tasks.sql +7 -0
  100. package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +5 -0
  101. package/backend/scripts/toast-notification.ps1 +23 -0
  102. package/backend/sounds/abstract-sound1.wav +0 -0
  103. package/backend/sounds/abstract-sound2.wav +0 -0
  104. package/backend/sounds/abstract-sound3.wav +0 -0
  105. package/backend/sounds/abstract-sound4.wav +0 -0
  106. package/backend/sounds/cow-mooing.wav +0 -0
  107. package/backend/sounds/phone-vibration.wav +0 -0
  108. package/backend/sounds/rooster.wav +0 -0
  109. package/backend/src/app_state.rs +218 -0
  110. package/backend/src/bin/generate_types.rs +189 -0
  111. package/backend/src/bin/mcp_task_server.rs +191 -0
  112. package/backend/src/execution_monitor.rs +1193 -0
  113. package/backend/src/executor.rs +1053 -0
  114. package/backend/src/executors/amp.rs +697 -0
  115. package/backend/src/executors/ccr.rs +91 -0
  116. package/backend/src/executors/charm_opencode.rs +113 -0
  117. package/backend/src/executors/claude.rs +887 -0
  118. package/backend/src/executors/cleanup_script.rs +124 -0
  119. package/backend/src/executors/dev_server.rs +53 -0
  120. package/backend/src/executors/echo.rs +79 -0
  121. package/backend/src/executors/gemini/config.rs +67 -0
  122. package/backend/src/executors/gemini/streaming.rs +363 -0
  123. package/backend/src/executors/gemini.rs +765 -0
  124. package/backend/src/executors/mod.rs +23 -0
  125. package/backend/src/executors/opencode_ai.rs +113 -0
  126. package/backend/src/executors/setup_script.rs +130 -0
  127. package/backend/src/executors/sst_opencode/filter.rs +184 -0
  128. package/backend/src/executors/sst_opencode/tools.rs +139 -0
  129. package/backend/src/executors/sst_opencode.rs +756 -0
  130. package/backend/src/lib.rs +45 -0
  131. package/backend/src/main.rs +324 -0
  132. package/backend/src/mcp/mod.rs +1 -0
  133. package/backend/src/mcp/task_server.rs +850 -0
  134. package/backend/src/middleware/mod.rs +3 -0
  135. package/backend/src/middleware/model_loaders.rs +242 -0
  136. package/backend/src/models/api_response.rs +36 -0
  137. package/backend/src/models/config.rs +375 -0
  138. package/backend/src/models/execution_process.rs +430 -0
  139. package/backend/src/models/executor_session.rs +225 -0
  140. package/backend/src/models/mod.rs +12 -0
  141. package/backend/src/models/project.rs +356 -0
  142. package/backend/src/models/task.rs +345 -0
  143. package/backend/src/models/task_attempt.rs +1214 -0
  144. package/backend/src/models/task_template.rs +146 -0
  145. package/backend/src/openapi.rs +93 -0
  146. package/backend/src/routes/auth.rs +297 -0
  147. package/backend/src/routes/config.rs +385 -0
  148. package/backend/src/routes/filesystem.rs +228 -0
  149. package/backend/src/routes/health.rs +16 -0
  150. package/backend/src/routes/mod.rs +9 -0
  151. package/backend/src/routes/projects.rs +562 -0
  152. package/backend/src/routes/stream.rs +244 -0
  153. package/backend/src/routes/task_attempts.rs +1172 -0
  154. package/backend/src/routes/task_templates.rs +229 -0
  155. package/backend/src/routes/tasks.rs +353 -0
  156. package/backend/src/services/analytics.rs +216 -0
  157. package/backend/src/services/git_service.rs +1321 -0
  158. package/backend/src/services/github_service.rs +307 -0
  159. package/backend/src/services/mod.rs +13 -0
  160. package/backend/src/services/notification_service.rs +263 -0
  161. package/backend/src/services/pr_monitor.rs +214 -0
  162. package/backend/src/services/process_service.rs +940 -0
  163. package/backend/src/utils/path.rs +96 -0
  164. package/backend/src/utils/shell.rs +19 -0
  165. package/backend/src/utils/text.rs +24 -0
  166. package/backend/src/utils/worktree_manager.rs +578 -0
  167. package/backend/src/utils.rs +125 -0
  168. package/backend/test.db +0 -0
  169. package/build-npm-package.sh +61 -0
  170. package/dev_assets_seed/config.json +19 -0
  171. package/frontend/.eslintrc.json +25 -0
  172. package/frontend/.prettierrc.json +8 -0
  173. package/frontend/components.json +17 -0
  174. package/frontend/index.html +19 -0
  175. package/frontend/package-lock.json +7321 -0
  176. package/frontend/package.json +61 -0
  177. package/frontend/postcss.config.js +6 -0
  178. package/frontend/public/android-chrome-192x192.png +0 -0
  179. package/frontend/public/android-chrome-512x512.png +0 -0
  180. package/frontend/public/apple-touch-icon.png +0 -0
  181. package/frontend/public/automagik-forge-logo-dark.svg +3 -0
  182. package/frontend/public/automagik-forge-logo.svg +3 -0
  183. package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
  184. package/frontend/public/favicon-16x16.png +0 -0
  185. package/frontend/public/favicon-32x32.png +0 -0
  186. package/frontend/public/favicon.ico +0 -0
  187. package/frontend/public/site.webmanifest +1 -0
  188. package/frontend/public/viba-kanban-favicon.png +0 -0
  189. package/frontend/src/App.tsx +157 -0
  190. package/frontend/src/components/DisclaimerDialog.tsx +106 -0
  191. package/frontend/src/components/GitHubLoginDialog.tsx +314 -0
  192. package/frontend/src/components/OnboardingDialog.tsx +185 -0
  193. package/frontend/src/components/PrivacyOptInDialog.tsx +130 -0
  194. package/frontend/src/components/ProvidePatDialog.tsx +98 -0
  195. package/frontend/src/components/TaskTemplateManager.tsx +336 -0
  196. package/frontend/src/components/config-provider.tsx +119 -0
  197. package/frontend/src/components/context/TaskDetailsContextProvider.tsx +470 -0
  198. package/frontend/src/components/context/taskDetailsContext.ts +125 -0
  199. package/frontend/src/components/keyboard-shortcuts-demo.tsx +35 -0
  200. package/frontend/src/components/layout/navbar.tsx +86 -0
  201. package/frontend/src/components/logo.tsx +44 -0
  202. package/frontend/src/components/projects/ProjectCard.tsx +155 -0
  203. package/frontend/src/components/projects/project-detail.tsx +251 -0
  204. package/frontend/src/components/projects/project-form-fields.tsx +238 -0
  205. package/frontend/src/components/projects/project-form.tsx +301 -0
  206. package/frontend/src/components/projects/project-list.tsx +200 -0
  207. package/frontend/src/components/projects/projects-page.tsx +20 -0
  208. package/frontend/src/components/tasks/BranchSelector.tsx +169 -0
  209. package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +94 -0
  210. package/frontend/src/components/tasks/EditorSelectionDialog.tsx +119 -0
  211. package/frontend/src/components/tasks/TaskCard.tsx +154 -0
  212. package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +33 -0
  213. package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +109 -0
  214. package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +135 -0
  215. package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +296 -0
  216. package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +32 -0
  217. package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +392 -0
  218. package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +256 -0
  219. package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +56 -0
  220. package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +92 -0
  221. package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +22 -0
  222. package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +49 -0
  223. package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +186 -0
  224. package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +288 -0
  225. package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +216 -0
  226. package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +93 -0
  227. package/frontend/src/components/tasks/TaskDetailsHeader.tsx +169 -0
  228. package/frontend/src/components/tasks/TaskDetailsPanel.tsx +126 -0
  229. package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +302 -0
  230. package/frontend/src/components/tasks/TaskFollowUpSection.tsx +130 -0
  231. package/frontend/src/components/tasks/TaskFormDialog.tsx +400 -0
  232. package/frontend/src/components/tasks/TaskKanbanBoard.tsx +180 -0
  233. package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +259 -0
  234. package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +243 -0
  235. package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +899 -0
  236. package/frontend/src/components/tasks/index.ts +2 -0
  237. package/frontend/src/components/theme-provider.tsx +82 -0
  238. package/frontend/src/components/theme-toggle.tsx +36 -0
  239. package/frontend/src/components/ui/alert.tsx +59 -0
  240. package/frontend/src/components/ui/auto-expanding-textarea.tsx +70 -0
  241. package/frontend/src/components/ui/badge.tsx +36 -0
  242. package/frontend/src/components/ui/button.tsx +56 -0
  243. package/frontend/src/components/ui/card.tsx +86 -0
  244. package/frontend/src/components/ui/checkbox.tsx +44 -0
  245. package/frontend/src/components/ui/chip.tsx +25 -0
  246. package/frontend/src/components/ui/dialog.tsx +124 -0
  247. package/frontend/src/components/ui/dropdown-menu.tsx +198 -0
  248. package/frontend/src/components/ui/file-search-textarea.tsx +292 -0
  249. package/frontend/src/components/ui/folder-picker.tsx +279 -0
  250. package/frontend/src/components/ui/input.tsx +25 -0
  251. package/frontend/src/components/ui/label.tsx +24 -0
  252. package/frontend/src/components/ui/loader.tsx +26 -0
  253. package/frontend/src/components/ui/markdown-renderer.tsx +75 -0
  254. package/frontend/src/components/ui/select.tsx +160 -0
  255. package/frontend/src/components/ui/separator.tsx +31 -0
  256. package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +185 -0
  257. package/frontend/src/components/ui/table.tsx +117 -0
  258. package/frontend/src/components/ui/tabs.tsx +53 -0
  259. package/frontend/src/components/ui/textarea.tsx +22 -0
  260. package/frontend/src/components/ui/tooltip.tsx +28 -0
  261. package/frontend/src/hooks/useNormalizedConversation.ts +440 -0
  262. package/frontend/src/index.css +225 -0
  263. package/frontend/src/lib/api.ts +630 -0
  264. package/frontend/src/lib/keyboard-shortcuts.ts +266 -0
  265. package/frontend/src/lib/responsive-config.ts +70 -0
  266. package/frontend/src/lib/types.ts +39 -0
  267. package/frontend/src/lib/utils.ts +10 -0
  268. package/frontend/src/main.tsx +50 -0
  269. package/frontend/src/pages/McpServers.tsx +418 -0
  270. package/frontend/src/pages/Settings.tsx +610 -0
  271. package/frontend/src/pages/project-tasks.tsx +575 -0
  272. package/frontend/src/pages/projects.tsx +18 -0
  273. package/frontend/src/vite-env.d.ts +1 -0
  274. package/frontend/tailwind.config.js +125 -0
  275. package/frontend/tsconfig.json +26 -0
  276. package/frontend/tsconfig.node.json +10 -0
  277. package/frontend/vite.config.ts +33 -0
  278. package/npx-cli/README.md +159 -0
  279. package/npx-cli/automagik-forge-0.0.55.tgz +0 -0
  280. package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
  281. package/{dist/linux-x64/automagik-forge.zip → npx-cli/automagik-forge-0.1.10.tgz} +0 -0
  282. package/npx-cli/package.json +17 -0
  283. package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
  284. package/package.json +23 -13
  285. package/pnpm-workspace.yaml +2 -0
  286. package/rust-toolchain.toml +11 -0
  287. package/rustfmt.toml +3 -0
  288. package/scripts/load-env.js +43 -0
  289. package/scripts/mcp_test.js +374 -0
  290. package/scripts/prepare-db.js +45 -0
  291. package/scripts/setup-dev-environment.js +274 -0
  292. package/scripts/start-mcp-sse.js +70 -0
  293. package/scripts/test-debug.js +32 -0
  294. package/scripts/test-mcp-sse.js +138 -0
  295. package/scripts/test-simple.js +44 -0
  296. package/scripts/test-wish-final.js +179 -0
  297. package/scripts/test-wish-system.js +221 -0
  298. package/shared/types.ts +182 -0
  299. package/test-npm-package.sh +42 -0
  300. package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
  301. /package/{bin → npx-cli/bin}/cli.js +0 -0
@@ -0,0 +1,430 @@
1
+ use chrono::{DateTime, Utc};
2
+ use serde::{Deserialize, Serialize, Serializer};
3
+ use sqlx::{FromRow, SqlitePool, Type};
4
+ use ts_rs::TS;
5
+ use uuid::Uuid;
6
+
7
+ use crate::app_state::ExecutionType;
8
+
9
+ /// Filter out stderr boundary markers from output
10
+ fn filter_stderr_boundary_markers(stderr: &Option<String>) -> Option<String> {
11
+ stderr
12
+ .as_ref()
13
+ .map(|s| s.replace("---STDERR_CHUNK_BOUNDARY---", ""))
14
+ }
15
+
16
+ /// Custom serializer for stderr field that filters out boundary markers
17
+ fn serialize_filtered_stderr<S>(stderr: &Option<String>, serializer: S) -> Result<S::Ok, S::Error>
18
+ where
19
+ S: Serializer,
20
+ {
21
+ let filtered = filter_stderr_boundary_markers(stderr);
22
+ filtered.serialize(serializer)
23
+ }
24
+
25
+ #[derive(Debug, Clone, Type, Serialize, Deserialize, PartialEq, TS)]
26
+ #[sqlx(type_name = "execution_process_status", rename_all = "lowercase")]
27
+ #[serde(rename_all = "lowercase")]
28
+ #[ts(export)]
29
+ pub enum ExecutionProcessStatus {
30
+ Running,
31
+ Completed,
32
+ Failed,
33
+ Killed,
34
+ }
35
+
36
+ #[derive(Debug, Clone, Type, Serialize, Deserialize, PartialEq, TS)]
37
+ #[sqlx(type_name = "execution_process_type", rename_all = "lowercase")]
38
+ #[serde(rename_all = "lowercase")]
39
+ #[ts(export)]
40
+ pub enum ExecutionProcessType {
41
+ SetupScript,
42
+ CleanupScript,
43
+ CodingAgent,
44
+ DevServer,
45
+ }
46
+
47
+ impl From<ExecutionType> for ExecutionProcessType {
48
+ fn from(exec_type: ExecutionType) -> Self {
49
+ match exec_type {
50
+ ExecutionType::SetupScript => ExecutionProcessType::SetupScript,
51
+ ExecutionType::CleanupScript => ExecutionProcessType::CleanupScript,
52
+ ExecutionType::CodingAgent => ExecutionProcessType::CodingAgent,
53
+ ExecutionType::DevServer => ExecutionProcessType::DevServer,
54
+ }
55
+ }
56
+ }
57
+
58
+ impl From<ExecutionProcessType> for ExecutionType {
59
+ fn from(exec_type: ExecutionProcessType) -> Self {
60
+ match exec_type {
61
+ ExecutionProcessType::SetupScript => ExecutionType::SetupScript,
62
+ ExecutionProcessType::CleanupScript => ExecutionType::CleanupScript,
63
+ ExecutionProcessType::CodingAgent => ExecutionType::CodingAgent,
64
+ ExecutionProcessType::DevServer => ExecutionType::DevServer,
65
+ }
66
+ }
67
+ }
68
+
69
+ #[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
70
+ #[ts(export)]
71
+ pub struct ExecutionProcess {
72
+ pub id: Uuid,
73
+ pub task_attempt_id: Uuid,
74
+ pub process_type: ExecutionProcessType,
75
+ pub executor_type: Option<String>, // "echo", "claude", "amp", etc. - only for CodingAgent processes
76
+ pub status: ExecutionProcessStatus,
77
+ pub command: String,
78
+ pub args: Option<String>, // JSON array of arguments
79
+ pub working_directory: String,
80
+ pub stdout: Option<String>,
81
+ #[serde(serialize_with = "serialize_filtered_stderr")]
82
+ pub stderr: Option<String>,
83
+ pub exit_code: Option<i64>,
84
+ pub started_at: DateTime<Utc>,
85
+ pub completed_at: Option<DateTime<Utc>>,
86
+ pub created_at: DateTime<Utc>,
87
+ pub updated_at: DateTime<Utc>,
88
+ }
89
+
90
+ #[derive(Debug, Deserialize, TS)]
91
+ #[ts(export)]
92
+ pub struct CreateExecutionProcess {
93
+ pub task_attempt_id: Uuid,
94
+ pub process_type: ExecutionProcessType,
95
+ pub executor_type: Option<String>,
96
+ pub command: String,
97
+ pub args: Option<String>,
98
+ pub working_directory: String,
99
+ }
100
+
101
+ #[derive(Debug, Deserialize, TS)]
102
+ #[ts(export)]
103
+ #[allow(dead_code)]
104
+ pub struct UpdateExecutionProcess {
105
+ pub status: Option<ExecutionProcessStatus>,
106
+ pub exit_code: Option<i64>,
107
+ pub completed_at: Option<DateTime<Utc>>,
108
+ }
109
+
110
+ #[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
111
+ #[ts(export)]
112
+ pub struct ExecutionProcessSummary {
113
+ pub id: Uuid,
114
+ pub task_attempt_id: Uuid,
115
+ pub process_type: ExecutionProcessType,
116
+ pub executor_type: Option<String>, // "echo", "claude", "amp", etc. - only for CodingAgent processes
117
+ pub status: ExecutionProcessStatus,
118
+ pub command: String,
119
+ pub args: Option<String>, // JSON array of arguments
120
+ pub working_directory: String,
121
+ pub exit_code: Option<i64>,
122
+ pub started_at: DateTime<Utc>,
123
+ pub completed_at: Option<DateTime<Utc>>,
124
+ pub created_at: DateTime<Utc>,
125
+ pub updated_at: DateTime<Utc>,
126
+ }
127
+
128
+ impl ExecutionProcess {
129
+ /// Find execution process by ID
130
+ pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<Self>, sqlx::Error> {
131
+ sqlx::query_as!(
132
+ ExecutionProcess,
133
+ r#"SELECT
134
+ id as "id!: Uuid",
135
+ task_attempt_id as "task_attempt_id!: Uuid",
136
+ process_type as "process_type!: ExecutionProcessType",
137
+ executor_type,
138
+ status as "status!: ExecutionProcessStatus",
139
+ command,
140
+ args,
141
+ working_directory,
142
+ stdout,
143
+ stderr,
144
+ exit_code,
145
+ started_at as "started_at!: DateTime<Utc>",
146
+ completed_at as "completed_at?: DateTime<Utc>",
147
+ created_at as "created_at!: DateTime<Utc>",
148
+ updated_at as "updated_at!: DateTime<Utc>"
149
+ FROM execution_processes
150
+ WHERE id = $1"#,
151
+ id
152
+ )
153
+ .fetch_optional(pool)
154
+ .await
155
+ }
156
+
157
+ /// Find all execution processes for a task attempt
158
+ pub async fn find_by_task_attempt_id(
159
+ pool: &SqlitePool,
160
+ task_attempt_id: Uuid,
161
+ ) -> Result<Vec<Self>, sqlx::Error> {
162
+ sqlx::query_as!(
163
+ ExecutionProcess,
164
+ r#"SELECT
165
+ id as "id!: Uuid",
166
+ task_attempt_id as "task_attempt_id!: Uuid",
167
+ process_type as "process_type!: ExecutionProcessType",
168
+ executor_type,
169
+ status as "status!: ExecutionProcessStatus",
170
+ command,
171
+ args,
172
+ working_directory,
173
+ stdout,
174
+ stderr,
175
+ exit_code,
176
+ started_at as "started_at!: DateTime<Utc>",
177
+ completed_at as "completed_at?: DateTime<Utc>",
178
+ created_at as "created_at!: DateTime<Utc>",
179
+ updated_at as "updated_at!: DateTime<Utc>"
180
+ FROM execution_processes
181
+ WHERE task_attempt_id = $1
182
+ ORDER BY created_at ASC"#,
183
+ task_attempt_id
184
+ )
185
+ .fetch_all(pool)
186
+ .await
187
+ }
188
+
189
+ /// Find execution process summaries for a task attempt (excluding stdio)
190
+ pub async fn find_summaries_by_task_attempt_id(
191
+ pool: &SqlitePool,
192
+ task_attempt_id: Uuid,
193
+ ) -> Result<Vec<ExecutionProcessSummary>, sqlx::Error> {
194
+ sqlx::query_as!(
195
+ ExecutionProcessSummary,
196
+ r#"SELECT
197
+ id as "id!: Uuid",
198
+ task_attempt_id as "task_attempt_id!: Uuid",
199
+ process_type as "process_type!: ExecutionProcessType",
200
+ executor_type,
201
+ status as "status!: ExecutionProcessStatus",
202
+ command,
203
+ args,
204
+ working_directory,
205
+ exit_code,
206
+ started_at as "started_at!: DateTime<Utc>",
207
+ completed_at as "completed_at?: DateTime<Utc>",
208
+ created_at as "created_at!: DateTime<Utc>",
209
+ updated_at as "updated_at!: DateTime<Utc>"
210
+ FROM execution_processes
211
+ WHERE task_attempt_id = $1
212
+ ORDER BY created_at ASC"#,
213
+ task_attempt_id
214
+ )
215
+ .fetch_all(pool)
216
+ .await
217
+ }
218
+
219
+ /// Find running execution processes
220
+ pub async fn find_running(pool: &SqlitePool) -> Result<Vec<Self>, sqlx::Error> {
221
+ sqlx::query_as!(
222
+ ExecutionProcess,
223
+ r#"SELECT
224
+ id as "id!: Uuid",
225
+ task_attempt_id as "task_attempt_id!: Uuid",
226
+ process_type as "process_type!: ExecutionProcessType",
227
+ executor_type,
228
+ status as "status!: ExecutionProcessStatus",
229
+ command,
230
+ args,
231
+ working_directory,
232
+ stdout,
233
+ stderr,
234
+ exit_code,
235
+ started_at as "started_at!: DateTime<Utc>",
236
+ completed_at as "completed_at?: DateTime<Utc>",
237
+ created_at as "created_at!: DateTime<Utc>",
238
+ updated_at as "updated_at!: DateTime<Utc>"
239
+ FROM execution_processes
240
+ WHERE status = 'running'
241
+ ORDER BY created_at ASC"#
242
+ )
243
+ .fetch_all(pool)
244
+ .await
245
+ }
246
+
247
+ /// Find running dev servers for a specific project
248
+ pub async fn find_running_dev_servers_by_project(
249
+ pool: &SqlitePool,
250
+ project_id: Uuid,
251
+ ) -> Result<Vec<Self>, sqlx::Error> {
252
+ sqlx::query_as!(
253
+ ExecutionProcess,
254
+ r#"SELECT
255
+ ep.id as "id!: Uuid",
256
+ ep.task_attempt_id as "task_attempt_id!: Uuid",
257
+ ep.process_type as "process_type!: ExecutionProcessType",
258
+ ep.executor_type,
259
+ ep.status as "status!: ExecutionProcessStatus",
260
+ ep.command,
261
+ ep.args,
262
+ ep.working_directory,
263
+ ep.stdout,
264
+ ep.stderr,
265
+ ep.exit_code,
266
+ ep.started_at as "started_at!: DateTime<Utc>",
267
+ ep.completed_at as "completed_at?: DateTime<Utc>",
268
+ ep.created_at as "created_at!: DateTime<Utc>",
269
+ ep.updated_at as "updated_at!: DateTime<Utc>"
270
+ FROM execution_processes ep
271
+ JOIN task_attempts ta ON ep.task_attempt_id = ta.id
272
+ JOIN tasks t ON ta.task_id = t.id
273
+ WHERE ep.status = 'running'
274
+ AND ep.process_type = 'devserver'
275
+ AND t.project_id = $1
276
+ ORDER BY ep.created_at ASC"#,
277
+ project_id
278
+ )
279
+ .fetch_all(pool)
280
+ .await
281
+ }
282
+
283
+ /// Create a new execution process
284
+ pub async fn create(
285
+ pool: &SqlitePool,
286
+ data: &CreateExecutionProcess,
287
+ process_id: Uuid,
288
+ ) -> Result<Self, sqlx::Error> {
289
+ let now = Utc::now();
290
+
291
+ sqlx::query_as!(
292
+ ExecutionProcess,
293
+ r#"INSERT INTO execution_processes (
294
+ id, task_attempt_id, process_type, executor_type, status, command, args,
295
+ working_directory, stdout, stderr, exit_code, started_at,
296
+ completed_at, created_at, updated_at
297
+ )
298
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
299
+ RETURNING
300
+ id as "id!: Uuid",
301
+ task_attempt_id as "task_attempt_id!: Uuid",
302
+ process_type as "process_type!: ExecutionProcessType",
303
+ executor_type,
304
+ status as "status!: ExecutionProcessStatus",
305
+ command,
306
+ args,
307
+ working_directory,
308
+ stdout,
309
+ stderr,
310
+ exit_code,
311
+ started_at as "started_at!: DateTime<Utc>",
312
+ completed_at as "completed_at?: DateTime<Utc>",
313
+ created_at as "created_at!: DateTime<Utc>",
314
+ updated_at as "updated_at!: DateTime<Utc>""#,
315
+ process_id,
316
+ data.task_attempt_id,
317
+ data.process_type,
318
+ data.executor_type,
319
+ ExecutionProcessStatus::Running,
320
+ data.command,
321
+ data.args,
322
+ data.working_directory,
323
+ None::<String>, // stdout
324
+ None::<String>, // stderr
325
+ None::<i64>, // exit_code
326
+ now, // started_at
327
+ None::<DateTime<Utc>>, // completed_at
328
+ now, // created_at
329
+ now // updated_at
330
+ )
331
+ .fetch_one(pool)
332
+ .await
333
+ }
334
+
335
+ /// Update execution process status and completion info
336
+ pub async fn update_completion(
337
+ pool: &SqlitePool,
338
+ id: Uuid,
339
+ status: ExecutionProcessStatus,
340
+ exit_code: Option<i64>,
341
+ ) -> Result<(), sqlx::Error> {
342
+ let completed_at = if matches!(status, ExecutionProcessStatus::Running) {
343
+ None
344
+ } else {
345
+ Some(Utc::now())
346
+ };
347
+
348
+ sqlx::query!(
349
+ r#"UPDATE execution_processes
350
+ SET status = $1, exit_code = $2, completed_at = $3, updated_at = datetime('now')
351
+ WHERE id = $4"#,
352
+ status,
353
+ exit_code,
354
+ completed_at,
355
+ id
356
+ )
357
+ .execute(pool)
358
+ .await?;
359
+
360
+ Ok(())
361
+ }
362
+
363
+ /// Append to stdout for this execution process (for streaming updates)
364
+ pub async fn append_stdout(
365
+ pool: &SqlitePool,
366
+ id: Uuid,
367
+ stdout_append: &str,
368
+ ) -> Result<(), sqlx::Error> {
369
+ sqlx::query!(
370
+ "UPDATE execution_processes SET stdout = COALESCE(stdout, '') || $1, updated_at = datetime('now') WHERE id = $2",
371
+ stdout_append,
372
+ id
373
+ )
374
+ .execute(pool)
375
+ .await?;
376
+
377
+ Ok(())
378
+ }
379
+
380
+ /// Append to stderr for this execution process (for streaming updates)
381
+ pub async fn append_stderr(
382
+ pool: &SqlitePool,
383
+ id: Uuid,
384
+ stderr_append: &str,
385
+ ) -> Result<(), sqlx::Error> {
386
+ sqlx::query!(
387
+ "UPDATE execution_processes SET stderr = COALESCE(stderr, '') || $1, updated_at = datetime('now') WHERE id = $2",
388
+ stderr_append,
389
+ id
390
+ )
391
+ .execute(pool)
392
+ .await?;
393
+
394
+ Ok(())
395
+ }
396
+
397
+ /// Append to both stdout and stderr for this execution process
398
+ pub async fn append_output(
399
+ pool: &SqlitePool,
400
+ id: Uuid,
401
+ stdout_append: Option<&str>,
402
+ stderr_append: Option<&str>,
403
+ ) -> Result<(), sqlx::Error> {
404
+ if let Some(stdout_data) = stdout_append {
405
+ Self::append_stdout(pool, id, stdout_data).await?;
406
+ }
407
+
408
+ if let Some(stderr_data) = stderr_append {
409
+ Self::append_stderr(pool, id, stderr_data).await?;
410
+ }
411
+
412
+ Ok(())
413
+ }
414
+
415
+ /// Delete execution processes for a task attempt (cleanup)
416
+ #[allow(dead_code)]
417
+ pub async fn delete_by_task_attempt_id(
418
+ pool: &SqlitePool,
419
+ task_attempt_id: Uuid,
420
+ ) -> Result<(), sqlx::Error> {
421
+ sqlx::query!(
422
+ "DELETE FROM execution_processes WHERE task_attempt_id = $1",
423
+ task_attempt_id
424
+ )
425
+ .execute(pool)
426
+ .await?;
427
+
428
+ Ok(())
429
+ }
430
+ }
@@ -0,0 +1,225 @@
1
+ use chrono::{DateTime, Utc};
2
+ use serde::{Deserialize, Serialize};
3
+ use sqlx::{FromRow, SqlitePool};
4
+ use ts_rs::TS;
5
+ use uuid::Uuid;
6
+
7
+ #[derive(Debug, Clone, FromRow, Serialize, Deserialize, TS)]
8
+ #[ts(export)]
9
+ pub struct ExecutorSession {
10
+ pub id: Uuid,
11
+ pub task_attempt_id: Uuid,
12
+ pub execution_process_id: Uuid,
13
+ pub session_id: Option<String>, // External session ID from Claude/Amp
14
+ pub prompt: Option<String>, // The prompt sent to the executor
15
+ pub summary: Option<String>, // Final assistant message/summary
16
+ pub created_at: DateTime<Utc>,
17
+ pub updated_at: DateTime<Utc>,
18
+ }
19
+
20
+ #[derive(Debug, Deserialize, TS)]
21
+ #[ts(export)]
22
+ pub struct CreateExecutorSession {
23
+ pub task_attempt_id: Uuid,
24
+ pub execution_process_id: Uuid,
25
+ pub prompt: Option<String>,
26
+ }
27
+
28
+ #[derive(Debug, Deserialize, TS)]
29
+ #[ts(export)]
30
+ #[allow(dead_code)]
31
+ pub struct UpdateExecutorSession {
32
+ pub session_id: Option<String>,
33
+ pub prompt: Option<String>,
34
+ pub summary: Option<String>,
35
+ }
36
+
37
+ impl ExecutorSession {
38
+ /// Find executor session by ID
39
+ #[allow(dead_code)]
40
+ pub async fn find_by_id(pool: &SqlitePool, id: Uuid) -> Result<Option<Self>, sqlx::Error> {
41
+ sqlx::query_as!(
42
+ ExecutorSession,
43
+ r#"SELECT
44
+ id as "id!: Uuid",
45
+ task_attempt_id as "task_attempt_id!: Uuid",
46
+ execution_process_id as "execution_process_id!: Uuid",
47
+ session_id,
48
+ prompt,
49
+ summary,
50
+ created_at as "created_at!: DateTime<Utc>",
51
+ updated_at as "updated_at!: DateTime<Utc>"
52
+ FROM executor_sessions
53
+ WHERE id = $1"#,
54
+ id
55
+ )
56
+ .fetch_optional(pool)
57
+ .await
58
+ }
59
+
60
+ /// Find executor session by execution process ID
61
+ pub async fn find_by_execution_process_id(
62
+ pool: &SqlitePool,
63
+ execution_process_id: Uuid,
64
+ ) -> Result<Option<Self>, sqlx::Error> {
65
+ sqlx::query_as!(
66
+ ExecutorSession,
67
+ r#"SELECT
68
+ id as "id!: Uuid",
69
+ task_attempt_id as "task_attempt_id!: Uuid",
70
+ execution_process_id as "execution_process_id!: Uuid",
71
+ session_id,
72
+ prompt,
73
+ summary,
74
+ created_at as "created_at!: DateTime<Utc>",
75
+ updated_at as "updated_at!: DateTime<Utc>"
76
+ FROM executor_sessions
77
+ WHERE execution_process_id = $1"#,
78
+ execution_process_id
79
+ )
80
+ .fetch_optional(pool)
81
+ .await
82
+ }
83
+
84
+ /// Find all executor sessions for a task attempt
85
+ #[allow(dead_code)]
86
+ pub async fn find_by_task_attempt_id(
87
+ pool: &SqlitePool,
88
+ task_attempt_id: Uuid,
89
+ ) -> Result<Vec<Self>, sqlx::Error> {
90
+ sqlx::query_as!(
91
+ ExecutorSession,
92
+ r#"SELECT
93
+ id as "id!: Uuid",
94
+ task_attempt_id as "task_attempt_id!: Uuid",
95
+ execution_process_id as "execution_process_id!: Uuid",
96
+ session_id,
97
+ prompt,
98
+ summary,
99
+ created_at as "created_at!: DateTime<Utc>",
100
+ updated_at as "updated_at!: DateTime<Utc>"
101
+ FROM executor_sessions
102
+ WHERE task_attempt_id = $1
103
+ ORDER BY created_at ASC"#,
104
+ task_attempt_id
105
+ )
106
+ .fetch_all(pool)
107
+ .await
108
+ }
109
+
110
+ /// Create a new executor session
111
+ pub async fn create(
112
+ pool: &SqlitePool,
113
+ data: &CreateExecutorSession,
114
+ session_id: Uuid,
115
+ ) -> Result<Self, sqlx::Error> {
116
+ let now = Utc::now();
117
+
118
+ tracing::debug!(
119
+ "Creating executor session: id={}, task_attempt_id={}, execution_process_id={}, external_session_id=None (will be set later)",
120
+ session_id, data.task_attempt_id, data.execution_process_id
121
+ );
122
+
123
+ sqlx::query_as!(
124
+ ExecutorSession,
125
+ r#"INSERT INTO executor_sessions (
126
+ id, task_attempt_id, execution_process_id, session_id, prompt, summary,
127
+ created_at, updated_at
128
+ )
129
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
130
+ RETURNING
131
+ id as "id!: Uuid",
132
+ task_attempt_id as "task_attempt_id!: Uuid",
133
+ execution_process_id as "execution_process_id!: Uuid",
134
+ session_id,
135
+ prompt,
136
+ summary,
137
+ created_at as "created_at!: DateTime<Utc>",
138
+ updated_at as "updated_at!: DateTime<Utc>""#,
139
+ session_id,
140
+ data.task_attempt_id,
141
+ data.execution_process_id,
142
+ None::<String>, // session_id initially None until parsed from output
143
+ data.prompt,
144
+ None::<String>, // summary initially None
145
+ now, // created_at
146
+ now // updated_at
147
+ )
148
+ .fetch_one(pool)
149
+ .await
150
+ }
151
+
152
+ /// Update executor session with external session ID
153
+ pub async fn update_session_id(
154
+ pool: &SqlitePool,
155
+ execution_process_id: Uuid,
156
+ external_session_id: &str,
157
+ ) -> Result<(), sqlx::Error> {
158
+ sqlx::query!(
159
+ r#"UPDATE executor_sessions
160
+ SET session_id = $1, updated_at = datetime('now')
161
+ WHERE execution_process_id = $2"#,
162
+ external_session_id,
163
+ execution_process_id
164
+ )
165
+ .execute(pool)
166
+ .await?;
167
+
168
+ Ok(())
169
+ }
170
+
171
+ /// Update executor session prompt
172
+ #[allow(dead_code)]
173
+ pub async fn update_prompt(
174
+ pool: &SqlitePool,
175
+ id: Uuid,
176
+ prompt: &str,
177
+ ) -> Result<(), sqlx::Error> {
178
+ sqlx::query!(
179
+ r#"UPDATE executor_sessions
180
+ SET prompt = $1, updated_at = datetime('now')
181
+ WHERE id = $2"#,
182
+ prompt,
183
+ id
184
+ )
185
+ .execute(pool)
186
+ .await?;
187
+
188
+ Ok(())
189
+ }
190
+
191
+ /// Update executor session summary
192
+ pub async fn update_summary(
193
+ pool: &SqlitePool,
194
+ execution_process_id: Uuid,
195
+ summary: &str,
196
+ ) -> Result<(), sqlx::Error> {
197
+ sqlx::query!(
198
+ r#"UPDATE executor_sessions
199
+ SET summary = $1, updated_at = datetime('now')
200
+ WHERE execution_process_id = $2"#,
201
+ summary,
202
+ execution_process_id
203
+ )
204
+ .execute(pool)
205
+ .await?;
206
+
207
+ Ok(())
208
+ }
209
+
210
+ /// Delete executor sessions for a task attempt (cleanup)
211
+ #[allow(dead_code)]
212
+ pub async fn delete_by_task_attempt_id(
213
+ pool: &SqlitePool,
214
+ task_attempt_id: Uuid,
215
+ ) -> Result<(), sqlx::Error> {
216
+ sqlx::query!(
217
+ "DELETE FROM executor_sessions WHERE task_attempt_id = $1",
218
+ task_attempt_id
219
+ )
220
+ .execute(pool)
221
+ .await?;
222
+
223
+ Ok(())
224
+ }
225
+ }
@@ -0,0 +1,12 @@
1
+ pub mod api_response;
2
+ pub mod config;
3
+ pub mod execution_process;
4
+ pub mod executor_session;
5
+ pub mod project;
6
+ pub mod task;
7
+ pub mod task_attempt;
8
+
9
+ pub mod task_template;
10
+
11
+ pub use api_response::ApiResponse;
12
+ pub use config::Config;