@pixelbyte-software/pixcode 1.54.11 → 1.55.0

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 (331) hide show
  1. package/dist-server/server/claude-sdk.js +1 -1
  2. package/dist-server/server/claude-sdk.js.map +1 -1
  3. package/dist-server/server/index.js +6 -11
  4. package/dist-server/server/index.js.map +1 -1
  5. package/dist-server/server/modules/security/permission-policy.js.map +1 -0
  6. package/dist-server/server/modules/tasks/git-worktree.js +98 -0
  7. package/dist-server/server/modules/tasks/git-worktree.js.map +1 -0
  8. package/dist-server/server/modules/tasks/index.js +8 -0
  9. package/dist-server/server/modules/tasks/index.js.map +1 -0
  10. package/dist-server/server/modules/tasks/prompt-builder.js +85 -0
  11. package/dist-server/server/modules/tasks/prompt-builder.js.map +1 -0
  12. package/dist-server/server/modules/tasks/role-presets.js +94 -0
  13. package/dist-server/server/modules/tasks/role-presets.js.map +1 -0
  14. package/dist-server/server/modules/tasks/runners/claude-runner.js +109 -0
  15. package/dist-server/server/modules/tasks/runners/claude-runner.js.map +1 -0
  16. package/dist-server/server/modules/tasks/runners/codex-runner.js +67 -0
  17. package/dist-server/server/modules/tasks/runners/codex-runner.js.map +1 -0
  18. package/dist-server/server/modules/tasks/runners/spawn-runner.js +111 -0
  19. package/dist-server/server/modules/tasks/runners/spawn-runner.js.map +1 -0
  20. package/dist-server/server/modules/tasks/runners/types.js +5 -0
  21. package/dist-server/server/modules/tasks/runners/types.js.map +1 -0
  22. package/dist-server/server/modules/tasks/scheduler.js +69 -0
  23. package/dist-server/server/modules/tasks/scheduler.js.map +1 -0
  24. package/dist-server/server/modules/tasks/task-queue.js +81 -0
  25. package/dist-server/server/modules/tasks/task-queue.js.map +1 -0
  26. package/dist-server/server/modules/tasks/task-routes.js +195 -0
  27. package/dist-server/server/modules/tasks/task-routes.js.map +1 -0
  28. package/dist-server/server/modules/tasks/task-runner.js +187 -0
  29. package/dist-server/server/modules/tasks/task-runner.js.map +1 -0
  30. package/dist-server/server/modules/tasks/task-store.js +196 -0
  31. package/dist-server/server/modules/tasks/task-store.js.map +1 -0
  32. package/dist-server/server/modules/tasks/task-types.js +5 -0
  33. package/dist-server/server/modules/tasks/task-types.js.map +1 -0
  34. package/dist-server/server/modules/tasks/user-interaction.js +73 -0
  35. package/dist-server/server/modules/tasks/user-interaction.js.map +1 -0
  36. package/dist-server/server/services/control-room.js +9 -1
  37. package/dist-server/server/services/control-room.js.map +1 -1
  38. package/dist-server/server/services/public-api-manifest.js +5 -5
  39. package/dist-server/server/services/public-api-manifest.js.map +1 -1
  40. package/dist-server/server/services/telegram/control-center.js +10 -10
  41. package/dist-server/server/services/telegram/control-center.js.map +1 -1
  42. package/dist-server/server/services/telegram/telegram-gateway.js +2 -2
  43. package/dist-server/server/services/telegram/telegram-gateway.js.map +1 -1
  44. package/dist-server/server/services/telegram/translations.js +5 -5
  45. package/dist-server/server/services/telegram/translations.js.map +1 -1
  46. package/package.json +1 -1
  47. package/server/claude-sdk.js +1 -1
  48. package/server/index.js +6 -23
  49. package/server/modules/tasks/git-worktree.ts +102 -0
  50. package/server/modules/tasks/index.ts +9 -0
  51. package/server/modules/tasks/prompt-builder.ts +98 -0
  52. package/server/modules/tasks/role-presets.ts +113 -0
  53. package/server/modules/tasks/runners/claude-runner.ts +120 -0
  54. package/server/modules/tasks/runners/codex-runner.ts +80 -0
  55. package/server/modules/tasks/runners/spawn-runner.ts +122 -0
  56. package/server/modules/tasks/runners/types.ts +25 -0
  57. package/server/modules/tasks/scheduler.ts +75 -0
  58. package/server/modules/tasks/task-queue.ts +91 -0
  59. package/server/modules/tasks/task-routes.ts +245 -0
  60. package/server/modules/tasks/task-runner.ts +219 -0
  61. package/server/modules/tasks/task-store.ts +223 -0
  62. package/server/modules/tasks/task-types.ts +100 -0
  63. package/server/modules/tasks/user-interaction.ts +93 -0
  64. package/server/services/control-room.js +10 -1
  65. package/server/services/public-api-manifest.js +5 -5
  66. package/server/services/telegram/control-center.js +10 -10
  67. package/server/services/telegram/telegram-gateway.js +2 -2
  68. package/server/services/telegram/translations.js +5 -5
  69. package/dist/api-automation.html +0 -110
  70. package/dist/api-docs.html +0 -548
  71. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  72. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  73. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  74. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  75. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  76. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  77. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  78. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  79. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  80. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  81. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  82. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  83. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  84. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  85. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  86. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  87. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  88. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  89. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  90. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  91. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  92. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  93. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  94. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  95. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  96. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  97. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  98. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  99. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  100. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  101. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  102. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  103. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  104. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  105. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  106. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  107. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  108. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  109. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  110. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  111. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  112. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  113. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  114. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  115. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  116. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  117. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  118. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  119. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  120. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  121. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  122. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  123. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  124. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  125. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  126. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  127. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  128. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  129. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  130. package/dist/assets/index-Bcqs_1vc.js +0 -877
  131. package/dist/assets/index-Dz1luE0u.css +0 -32
  132. package/dist/assets/index-ak1p_4ew.js +0 -11
  133. package/dist/assets/localMonaco-DFIbtDNp.js +0 -1
  134. package/dist/assets/vendor-codemirror-CIYNS698.js +0 -41
  135. package/dist/assets/vendor-react-DB6V5Fl1.js +0 -59
  136. package/dist/assets/vendor-xterm-C7tpxJl7.js +0 -9
  137. package/dist/clear-cache.html +0 -85
  138. package/dist/convert-icons.md +0 -53
  139. package/dist/docs.html +0 -308
  140. package/dist/favicon.png +0 -0
  141. package/dist/favicon.svg +0 -8
  142. package/dist/features.html +0 -133
  143. package/dist/generate-icons.js +0 -49
  144. package/dist/humans.txt +0 -15
  145. package/dist/icons/claude-ai-icon.svg +0 -1
  146. package/dist/icons/codex-white.svg +0 -3
  147. package/dist/icons/codex.svg +0 -3
  148. package/dist/icons/cursor-white.svg +0 -12
  149. package/dist/icons/cursor.svg +0 -1
  150. package/dist/icons/gemini-ai-icon.svg +0 -1
  151. package/dist/icons/icon-128x128.png +0 -0
  152. package/dist/icons/icon-128x128.svg +0 -9
  153. package/dist/icons/icon-144x144.png +0 -0
  154. package/dist/icons/icon-144x144.svg +0 -9
  155. package/dist/icons/icon-152x152.png +0 -0
  156. package/dist/icons/icon-152x152.svg +0 -9
  157. package/dist/icons/icon-192x192.png +0 -0
  158. package/dist/icons/icon-192x192.svg +0 -9
  159. package/dist/icons/icon-384x384.png +0 -0
  160. package/dist/icons/icon-384x384.svg +0 -9
  161. package/dist/icons/icon-512x512.png +0 -0
  162. package/dist/icons/icon-512x512.svg +0 -9
  163. package/dist/icons/icon-72x72.png +0 -0
  164. package/dist/icons/icon-72x72.svg +0 -9
  165. package/dist/icons/icon-96x96.png +0 -0
  166. package/dist/icons/icon-96x96.svg +0 -9
  167. package/dist/icons/icon-template.svg +0 -9
  168. package/dist/icons/opencode-logo-dark.svg +0 -1
  169. package/dist/icons/opencode-logo-light.svg +0 -1
  170. package/dist/icons/qwen-ai-icon.png +0 -0
  171. package/dist/icons/qwen-logo.svg +0 -15
  172. package/dist/index.html +0 -62
  173. package/dist/landing.html +0 -268
  174. package/dist/llms-full.txt +0 -119
  175. package/dist/llms.txt +0 -53
  176. package/dist/logo-128.png +0 -0
  177. package/dist/logo-256.png +0 -0
  178. package/dist/logo-32.png +0 -0
  179. package/dist/logo-512.png +0 -0
  180. package/dist/logo-64.png +0 -0
  181. package/dist/logo.png +0 -0
  182. package/dist/logo.svg +0 -12
  183. package/dist/manifest.json +0 -61
  184. package/dist/openapi.yaml +0 -1696
  185. package/dist/orchestration.html +0 -125
  186. package/dist/robots.txt +0 -4
  187. package/dist/screenshots/cli-selection.png +0 -0
  188. package/dist/screenshots/desktop-main.png +0 -0
  189. package/dist/screenshots/mobile-chat.png +0 -0
  190. package/dist/screenshots/tools-modal.png +0 -0
  191. package/dist/site.css +0 -692
  192. package/dist/sitemap.xml +0 -51
  193. package/dist/sw.js +0 -132
  194. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js +0 -73
  195. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js.map +0 -1
  196. package/dist-server/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.js +0 -17
  197. package/dist-server/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.js.map +0 -1
  198. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js +0 -236
  199. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js.map +0 -1
  200. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js +0 -202
  201. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js.map +0 -1
  202. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js +0 -205
  203. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js.map +0 -1
  204. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js +0 -205
  205. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js.map +0 -1
  206. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js +0 -84
  207. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js.map +0 -1
  208. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js +0 -43
  209. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js.map +0 -1
  210. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js +0 -205
  211. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js.map +0 -1
  212. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js +0 -205
  213. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js.map +0 -1
  214. package/dist-server/server/modules/orchestration/a2a/agent-card.js +0 -50
  215. package/dist-server/server/modules/orchestration/a2a/agent-card.js.map +0 -1
  216. package/dist-server/server/modules/orchestration/a2a/auth.middleware.js +0 -25
  217. package/dist-server/server/modules/orchestration/a2a/auth.middleware.js.map +0 -1
  218. package/dist-server/server/modules/orchestration/a2a/bus.js +0 -34
  219. package/dist-server/server/modules/orchestration/a2a/bus.js.map +0 -1
  220. package/dist-server/server/modules/orchestration/a2a/routes.js +0 -502
  221. package/dist-server/server/modules/orchestration/a2a/routes.js.map +0 -1
  222. package/dist-server/server/modules/orchestration/a2a/task-dispatcher.js +0 -295
  223. package/dist-server/server/modules/orchestration/a2a/task-dispatcher.js.map +0 -1
  224. package/dist-server/server/modules/orchestration/a2a/task-store.js +0 -144
  225. package/dist-server/server/modules/orchestration/a2a/task-store.js.map +0 -1
  226. package/dist-server/server/modules/orchestration/a2a/types.js +0 -6
  227. package/dist-server/server/modules/orchestration/a2a/types.js.map +0 -1
  228. package/dist-server/server/modules/orchestration/a2a/validator.js +0 -101
  229. package/dist-server/server/modules/orchestration/a2a/validator.js.map +0 -1
  230. package/dist-server/server/modules/orchestration/index.js +0 -27
  231. package/dist-server/server/modules/orchestration/index.js.map +0 -1
  232. package/dist-server/server/modules/orchestration/preview/port-watcher.js +0 -90
  233. package/dist-server/server/modules/orchestration/preview/port-watcher.js.map +0 -1
  234. package/dist-server/server/modules/orchestration/preview/preview-proxy.js +0 -58
  235. package/dist-server/server/modules/orchestration/preview/preview-proxy.js.map +0 -1
  236. package/dist-server/server/modules/orchestration/preview/types.js +0 -2
  237. package/dist-server/server/modules/orchestration/preview/types.js.map +0 -1
  238. package/dist-server/server/modules/orchestration/security/permission-policy.js.map +0 -1
  239. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js +0 -34
  240. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js.map +0 -1
  241. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js +0 -70
  242. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js.map +0 -1
  243. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js +0 -181
  244. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js.map +0 -1
  245. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js +0 -2
  246. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js.map +0 -1
  247. package/dist-server/server/modules/orchestration/tasks/task-run-graph.js +0 -100
  248. package/dist-server/server/modules/orchestration/tasks/task-run-graph.js.map +0 -1
  249. package/dist-server/server/modules/orchestration/workflows/approval-queue.js +0 -72
  250. package/dist-server/server/modules/orchestration/workflows/approval-queue.js.map +0 -1
  251. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js +0 -126
  252. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js.map +0 -1
  253. package/dist-server/server/modules/orchestration/workflows/context-packet.js +0 -89
  254. package/dist-server/server/modules/orchestration/workflows/context-packet.js.map +0 -1
  255. package/dist-server/server/modules/orchestration/workflows/handoff-artifact.js +0 -123
  256. package/dist-server/server/modules/orchestration/workflows/handoff-artifact.js.map +0 -1
  257. package/dist-server/server/modules/orchestration/workflows/workflow-fallback-policy.js +0 -114
  258. package/dist-server/server/modules/orchestration/workflows/workflow-fallback-policy.js.map +0 -1
  259. package/dist-server/server/modules/orchestration/workflows/workflow-replay.js +0 -177
  260. package/dist-server/server/modules/orchestration/workflows/workflow-replay.js.map +0 -1
  261. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +0 -1718
  262. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +0 -1
  263. package/dist-server/server/modules/orchestration/workflows/workflow-store.js +0 -76
  264. package/dist-server/server/modules/orchestration/workflows/workflow-store.js.map +0 -1
  265. package/dist-server/server/modules/orchestration/workflows/workflow-templates.js +0 -242
  266. package/dist-server/server/modules/orchestration/workflows/workflow-templates.js.map +0 -1
  267. package/dist-server/server/modules/orchestration/workflows/workflow-trace.js +0 -388
  268. package/dist-server/server/modules/orchestration/workflows/workflow-trace.js.map +0 -1
  269. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js +0 -508
  270. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js.map +0 -1
  271. package/dist-server/server/modules/orchestration/workflows/workflow.types.js +0 -2
  272. package/dist-server/server/modules/orchestration/workflows/workflow.types.js.map +0 -1
  273. package/dist-server/server/modules/orchestration/workflows/workspace-target.js +0 -100
  274. package/dist-server/server/modules/orchestration/workflows/workspace-target.js.map +0 -1
  275. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js +0 -123
  276. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js.map +0 -1
  277. package/dist-server/server/modules/orchestration/workspace/path-safety.js +0 -48
  278. package/dist-server/server/modules/orchestration/workspace/path-safety.js.map +0 -1
  279. package/dist-server/server/modules/orchestration/workspace/types.js +0 -11
  280. package/dist-server/server/modules/orchestration/workspace/types.js.map +0 -1
  281. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js +0 -84
  282. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js.map +0 -1
  283. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js +0 -97
  284. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js.map +0 -1
  285. package/server/modules/orchestration/a2a/adapter-registry.ts +0 -108
  286. package/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.ts +0 -63
  287. package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +0 -286
  288. package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +0 -244
  289. package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +0 -249
  290. package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +0 -248
  291. package/server/modules/orchestration/a2a/adapters/json-event.adapter.test.ts +0 -60
  292. package/server/modules/orchestration/a2a/adapters/json-event.adapter.ts +0 -101
  293. package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +0 -248
  294. package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +0 -248
  295. package/server/modules/orchestration/a2a/agent-card.ts +0 -55
  296. package/server/modules/orchestration/a2a/auth.middleware.ts +0 -29
  297. package/server/modules/orchestration/a2a/bus.ts +0 -46
  298. package/server/modules/orchestration/a2a/routes.ts +0 -586
  299. package/server/modules/orchestration/a2a/task-dispatcher.ts +0 -345
  300. package/server/modules/orchestration/a2a/task-store.ts +0 -178
  301. package/server/modules/orchestration/a2a/types.ts +0 -126
  302. package/server/modules/orchestration/a2a/validator.ts +0 -113
  303. package/server/modules/orchestration/index.ts +0 -99
  304. package/server/modules/orchestration/preview/port-watcher.ts +0 -112
  305. package/server/modules/orchestration/preview/preview-proxy.ts +0 -60
  306. package/server/modules/orchestration/preview/types.ts +0 -19
  307. package/server/modules/orchestration/tasks/orchestration-task-store.ts +0 -41
  308. package/server/modules/orchestration/tasks/orchestration-task.routes.ts +0 -81
  309. package/server/modules/orchestration/tasks/orchestration-task.service.ts +0 -201
  310. package/server/modules/orchestration/tasks/orchestration-task.types.ts +0 -40
  311. package/server/modules/orchestration/tasks/task-run-graph.ts +0 -155
  312. package/server/modules/orchestration/workflows/approval-queue.ts +0 -106
  313. package/server/modules/orchestration/workflows/built-in-workflows.ts +0 -127
  314. package/server/modules/orchestration/workflows/context-packet.ts +0 -186
  315. package/server/modules/orchestration/workflows/handoff-artifact.ts +0 -175
  316. package/server/modules/orchestration/workflows/workflow-fallback-policy.ts +0 -161
  317. package/server/modules/orchestration/workflows/workflow-replay.ts +0 -254
  318. package/server/modules/orchestration/workflows/workflow-runner.ts +0 -2062
  319. package/server/modules/orchestration/workflows/workflow-store.ts +0 -97
  320. package/server/modules/orchestration/workflows/workflow-templates.ts +0 -272
  321. package/server/modules/orchestration/workflows/workflow-trace.ts +0 -424
  322. package/server/modules/orchestration/workflows/workflow.routes.ts +0 -586
  323. package/server/modules/orchestration/workflows/workflow.types.ts +0 -111
  324. package/server/modules/orchestration/workflows/workspace-target.ts +0 -122
  325. package/server/modules/orchestration/workspace/docker-workspace.ts +0 -136
  326. package/server/modules/orchestration/workspace/path-safety.ts +0 -55
  327. package/server/modules/orchestration/workspace/types.ts +0 -52
  328. package/server/modules/orchestration/workspace/workspace-manager.ts +0 -102
  329. package/server/modules/orchestration/workspace/worktree-workspace.ts +0 -126
  330. /package/dist-server/server/modules/{orchestration/security → security}/permission-policy.js +0 -0
  331. /package/server/modules/{orchestration/security → security}/permission-policy.ts +0 -0
@@ -1,586 +0,0 @@
1
- // server/modules/orchestration/a2a/routes.ts
2
- // Internal A2A task router. The adapter primitives stay in this folder while
3
- // orchestration uses the in-process dispatcher by default.
4
-
5
- import crypto from 'node:crypto';
6
-
7
- import type { Request, Response, Router } from 'express';
8
- import express from 'express';
9
-
10
- import { adapterRegistry } from '@/modules/orchestration/a2a/adapter-registry.js';
11
- import { buildPixcodeAgentCard } from '@/modules/orchestration/a2a/agent-card.js';
12
- import { a2aAuth } from '@/modules/orchestration/a2a/auth.middleware.js';
13
- import { a2aBus } from '@/modules/orchestration/a2a/bus.js';
14
- import { A2ATaskStore } from '@/modules/orchestration/a2a/task-store.js';
15
- import type {
16
- BusEvent,
17
- Message,
18
- Task,
19
- TaskState,
20
- } from '@/modules/orchestration/a2a/types.js';
21
- import {
22
- A2AValidationError,
23
- assertMessage,
24
- assertSubmitTaskInput,
25
- } from '@/modules/orchestration/a2a/validator.js';
26
- import { portWatcher } from '@/modules/orchestration/preview/port-watcher.js';
27
- import type { PreviewArtifactData } from '@/modules/orchestration/preview/types.js';
28
- import { workspaceManager } from '@/modules/orchestration/workspace/workspace-manager.js';
29
- import type {
30
- WorkspaceHandle,
31
- WorkspaceKind,
32
- WorkspaceMetadata,
33
- } from '@/modules/orchestration/workspace/types.js';
34
- import { WorkspaceError } from '@/modules/orchestration/workspace/types.js';
35
- import type {
36
- PermissionPolicy,
37
- PermissionPolicyContext,
38
- } from '@/modules/orchestration/security/permission-policy.js';
39
-
40
- type RoutingHints = {
41
- preferredAdapterId?: string;
42
- preferredProvider?: string;
43
- preferredSkillId?: string;
44
- };
45
-
46
- function readRoutingHints(value: unknown): RoutingHints {
47
- if (!value || typeof value !== 'object') {
48
- return {};
49
- }
50
-
51
- const source = value as Record<string, unknown>;
52
- return {
53
- preferredAdapterId:
54
- typeof source.preferredAdapterId === 'string' ? source.preferredAdapterId : undefined,
55
- preferredProvider:
56
- typeof source.preferredProvider === 'string' ? source.preferredProvider : undefined,
57
- preferredSkillId:
58
- typeof source.preferredSkillId === 'string' ? source.preferredSkillId : undefined,
59
- };
60
- }
61
-
62
- const TERMINAL: TaskState[] = ['completed', 'canceled', 'failed'];
63
- // Per-task bus unsubscribe handles; called on terminal state.
64
- const taskUnsubs = new Map<string, () => void>();
65
- // Eviction timeouts (terminal tasks live for 1 hour before being purged).
66
- const taskEvictions = new Map<string, NodeJS.Timeout>();
67
- const TERMINAL_TASK_TTL_MS = 60 * 60 * 1000; // 1 hour
68
- const MAX_TASKS = 1000;
69
- const taskStore = new A2ATaskStore({ terminalTaskTtlMs: TERMINAL_TASK_TTL_MS });
70
- const activeWorkspaces = new Map<string, WorkspaceHandle>();
71
- const previewStops = new Map<string, () => void>();
72
- const finalizingTasks = new Set<string>();
73
-
74
- function newId(prefix: string): string {
75
- return `${prefix}_${crypto.randomBytes(8).toString('hex')}`;
76
- }
77
-
78
- function isTerminalTaskState(state: TaskState): boolean {
79
- return TERMINAL.includes(state);
80
- }
81
-
82
- function getBaseUrl(req: Request): string {
83
- // TODO: this trusts X-Forwarded-Proto/Host without checking app's
84
- // trust-proxy setting. Same posture as auth.middleware.ts; revisit
85
- // when project-wide trust-proxy decision lands.
86
- const proto = req.header('x-forwarded-proto') ?? req.protocol;
87
- const host = req.header('x-forwarded-host') ?? req.get('host');
88
- return `${proto}://${host}`;
89
- }
90
-
91
- function scheduleTaskEviction(taskId: string): void {
92
- const existingTimeout = taskEvictions.get(taskId);
93
- if (existingTimeout) {
94
- clearTimeout(existingTimeout);
95
- }
96
-
97
- const task = taskStore.get(taskId);
98
- if (!task) {
99
- taskEvictions.delete(taskId);
100
- return;
101
- }
102
-
103
- const remainingMs = Math.max(0, task.updatedAt + TERMINAL_TASK_TTL_MS - Date.now());
104
- taskEvictions.set(
105
- taskId,
106
- setTimeout(() => {
107
- taskStore.delete(taskId);
108
- taskEvictions.delete(taskId);
109
- }, remainingMs),
110
- );
111
- }
112
-
113
- function parseTaskState(value: unknown): TaskState | undefined {
114
- if (typeof value !== 'string') {
115
- return undefined;
116
- }
117
-
118
- const normalized = value.trim();
119
- if (
120
- normalized === 'submitted' ||
121
- normalized === 'working' ||
122
- normalized === 'input-required' ||
123
- normalized === 'completed' ||
124
- normalized === 'canceled' ||
125
- normalized === 'failed'
126
- ) {
127
- return normalized;
128
- }
129
-
130
- return undefined;
131
- }
132
-
133
- function parsePositiveInt(value: unknown, fallback: number): number {
134
- if (typeof value !== 'string') {
135
- return fallback;
136
- }
137
-
138
- const parsed = Number.parseInt(value, 10);
139
- if (!Number.isFinite(parsed) || parsed < 0) {
140
- return fallback;
141
- }
142
-
143
- return parsed;
144
- }
145
-
146
- function readString(value: unknown): string | undefined {
147
- return typeof value === 'string' && value.trim() ? value : undefined;
148
- }
149
-
150
- function readBoolean(value: unknown): boolean | undefined {
151
- return typeof value === 'boolean' ? value : undefined;
152
- }
153
-
154
- function readObject(value: unknown): Record<string, unknown> | undefined {
155
- return value && typeof value === 'object' ? value as Record<string, unknown> : undefined;
156
- }
157
-
158
- function readWorkspaceKind(value: unknown): WorkspaceKind | undefined {
159
- return value === 'host' || value === 'worktree' || value === 'docker' ? value : undefined;
160
- }
161
-
162
- function workspaceMetadata(workspace: WorkspaceHandle, keepAfterCompletion?: boolean): WorkspaceMetadata {
163
- return {
164
- id: workspace.id,
165
- kind: workspace.kind,
166
- path: workspace.path,
167
- baseRef: workspace.baseRef,
168
- branchName: workspace.branchName,
169
- keepAfterCompletion,
170
- };
171
- }
172
-
173
- async function finalizeTerminalTask(task: Task): Promise<void> {
174
- if (finalizingTasks.has(task.id)) return;
175
- finalizingTasks.add(task.id);
176
-
177
- const stopPreview = previewStops.get(task.id);
178
- if (stopPreview) {
179
- stopPreview();
180
- previewStops.delete(task.id);
181
- }
182
-
183
- const workspace = activeWorkspaces.get(task.id);
184
- try {
185
- if (workspace) {
186
- const diff = await workspace.diff();
187
- if (diff.trim()) {
188
- a2aBus.publish({
189
- kind: 'artifact',
190
- taskId: task.id,
191
- artifact: {
192
- artifactId: newId('art'),
193
- type: 'file-diff',
194
- parts: [{ kind: 'text', text: diff }],
195
- metadata: {
196
- source: 'workspace-diff',
197
- workspaceId: workspace.id,
198
- workspaceKind: workspace.kind,
199
- baseRef: workspace.baseRef,
200
- },
201
- },
202
- });
203
- }
204
-
205
- const keepAfterCompletion = task.metadata?.workspace &&
206
- typeof task.metadata.workspace === 'object' &&
207
- readBoolean((task.metadata.workspace as Record<string, unknown>).keepAfterCompletion);
208
- if (workspace.kind !== 'host' && keepAfterCompletion !== true) {
209
- await workspace.destroy();
210
- }
211
- }
212
- } catch (error) {
213
- const message = error instanceof Error ? error.message : String(error);
214
- task.metadata = {
215
- ...task.metadata,
216
- workspaceFinalizationError: message,
217
- };
218
- task.updatedAt = Date.now();
219
- taskStore.set(task);
220
- } finally {
221
- activeWorkspaces.delete(task.id);
222
- const unsub = taskUnsubs.get(task.id);
223
- if (unsub) {
224
- unsub();
225
- taskUnsubs.delete(task.id);
226
- }
227
- scheduleTaskEviction(task.id);
228
- finalizingTasks.delete(task.id);
229
- }
230
- }
231
-
232
- function attachBusToTask(task: Task): void {
233
- const unsubscribe = a2aBus.subscribe(task.id, (event: BusEvent) => {
234
- if (event.kind === 'task-state') {
235
- task.state = event.state;
236
- if (event.error) task.error = event.error;
237
- task.updatedAt = Date.now();
238
- taskStore.set(task);
239
- if (isTerminalTaskState(event.state)) {
240
- void finalizeTerminalTask(task);
241
- }
242
- } else if (event.kind === 'message') {
243
- task.history.push(event.message);
244
- task.updatedAt = Date.now();
245
- taskStore.set(task);
246
- } else if (event.kind === 'artifact') {
247
- task.artifacts.push(event.artifact);
248
- task.updatedAt = Date.now();
249
- taskStore.set(task);
250
- }
251
- });
252
- taskUnsubs.set(task.id, unsubscribe);
253
- }
254
-
255
- for (const task of taskStore.values()) {
256
- if (isTerminalTaskState(task.state)) {
257
- scheduleTaskEviction(task.id);
258
- }
259
- }
260
-
261
- function createA2ARouter(): Router {
262
- const router: Router = express.Router();
263
-
264
- router.use(express.json({ limit: '5mb' }));
265
- router.use(a2aAuth);
266
-
267
- // Discovery
268
- router.get('/.well-known/agent-card.json', (req, res) => {
269
- res.json(buildPixcodeAgentCard(getBaseUrl(req)));
270
- });
271
-
272
- router.get('/agents', (_req, res) => {
273
- res.json({ agents: adapterRegistry.agentCards() });
274
- });
275
-
276
- router.get('/agents/:id/agent-card', (req, res) => {
277
- const adapter = adapterRegistry.get(req.params.id);
278
- if (!adapter) {
279
- res.status(404).json({ error: { code: 'AGENT_NOT_FOUND', message: req.params.id } });
280
- return;
281
- }
282
- res.json(adapter.agentCard);
283
- });
284
-
285
- router.post('/adapters/resolve', (req, res) => {
286
- const selector = typeof req.body?.adapterId === 'string' ? req.body.adapterId : '';
287
- if (!selector.trim()) {
288
- res.status(400).json({
289
- error: { code: 'ADAPTER_ID_REQUIRED', message: 'adapterId is required.' },
290
- });
291
- return;
292
- }
293
-
294
- const routing = readRoutingHints(req.body?.routing);
295
- const adapter = adapterRegistry.resolve(selector, routing);
296
- if (!adapter) {
297
- res.status(404).json({
298
- error: {
299
- code: 'ADAPTER_NOT_FOUND',
300
- message: selector,
301
- availableAdapters: adapterRegistry.list().map((candidate) => candidate.id),
302
- },
303
- });
304
- return;
305
- }
306
-
307
- res.json({
308
- selector,
309
- resolvedAdapterId: adapter.id,
310
- agentCard: adapter.agentCard,
311
- });
312
- });
313
-
314
- router.get('/tasks', (req, res) => {
315
- const state = parseTaskState(req.query.state);
316
- const contextId = typeof req.query.contextId === 'string' ? req.query.contextId : undefined;
317
- const adapterId = typeof req.query.adapterId === 'string' ? req.query.adapterId : undefined;
318
- const limit = parsePositiveInt(req.query.limit, 50);
319
-
320
- const tasks = taskStore
321
- .list({ state, contextId, adapterId, limit })
322
- .map((task) => taskStore.summarize(task));
323
-
324
- res.json({
325
- tasks,
326
- count: tasks.length,
327
- filters: {
328
- state,
329
- contextId,
330
- adapterId,
331
- limit,
332
- },
333
- });
334
- });
335
-
336
- // Task lifecycle
337
- router.post('/tasks', async (req: Request, res: Response) => {
338
- try {
339
- assertSubmitTaskInput(req.body);
340
- } catch (err) {
341
- const e = err as A2AValidationError;
342
- res.status(400).json({ error: { code: 'INVALID_INPUT', message: e.message, path: e.path } });
343
- return;
344
- }
345
-
346
- const metadata = req.body.metadata as Record<string, unknown> | undefined;
347
- const routing = readRoutingHints(metadata?.routing);
348
-
349
- const adapter = adapterRegistry.resolve(req.body.adapterId, routing);
350
- if (!adapter) {
351
- res.status(404).json({
352
- error: {
353
- code: 'ADAPTER_NOT_FOUND',
354
- message: req.body.adapterId,
355
- availableAdapters: adapterRegistry.list().map((candidate) => candidate.id),
356
- },
357
- });
358
- return;
359
- }
360
-
361
- // Enforce MAX_TASKS cap. Evict the oldest terminal task first; if all
362
- // active, fail closed with 503.
363
- if (taskStore.size >= MAX_TASKS) {
364
- let evicted = false;
365
- for (const [tid, t] of taskStore.entries()) {
366
- if (isTerminalTaskState(t.state)) {
367
- const timeout = taskEvictions.get(tid);
368
- if (timeout) clearTimeout(timeout);
369
- taskEvictions.delete(tid);
370
- const unsub = taskUnsubs.get(tid);
371
- if (unsub) {
372
- unsub();
373
- taskUnsubs.delete(tid);
374
- }
375
- taskStore.delete(tid);
376
- evicted = true;
377
- break;
378
- }
379
- }
380
- if (!evicted) {
381
- res.status(503).json({
382
- error: { code: 'TASK_LIMIT', message: `task store at capacity (${MAX_TASKS})` },
383
- });
384
- return;
385
- }
386
- }
387
-
388
- const userMessage: Message = req.body.message;
389
- const task: Task = {
390
- id: newId('task'),
391
- contextId: req.body.contextId,
392
- state: 'submitted',
393
- history: [],
394
- artifacts: [],
395
- metadata: req.body.metadata,
396
- createdAt: Date.now(),
397
- updatedAt: Date.now(),
398
- };
399
- task.history.push({ ...userMessage, taskId: task.id });
400
- const workspaceOptions = (metadata?.workspace && typeof metadata.workspace === 'object'
401
- ? metadata.workspace
402
- : {}) as Record<string, unknown>;
403
- // Persist adapterId in metadata so cancel can resolve the owning adapter
404
- // even when the original request body is no longer available.
405
- task.metadata = {
406
- ...task.metadata,
407
- adapterId: adapter.id,
408
- adapterSelector: req.body.adapterId,
409
- };
410
- taskStore.set(task);
411
- attachBusToTask(task);
412
-
413
- let workspace: WorkspaceHandle;
414
- try {
415
- workspace = await workspaceManager.create({
416
- taskId: task.id,
417
- projectPath: readString(workspaceOptions.projectPath) ?? process.cwd(),
418
- kind: readWorkspaceKind(workspaceOptions.kind) ?? readWorkspaceKind(metadata?.isolation),
419
- baseRef: readString(workspaceOptions.baseRef) ?? readString(metadata?.baseRef) ?? 'HEAD',
420
- keepAfterCompletion: readBoolean(workspaceOptions.keepAfterCompletion),
421
- metadata: workspaceOptions,
422
- });
423
- } catch (err) {
424
- const workspaceError = err instanceof WorkspaceError ? err : undefined;
425
- a2aBus.publish({
426
- kind: 'task-state',
427
- taskId: task.id,
428
- state: 'failed',
429
- error: {
430
- code: workspaceError?.code ?? 'WORKSPACE_CREATE_FAILED',
431
- message: err instanceof Error ? err.message : String(err),
432
- details: workspaceError?.details,
433
- },
434
- });
435
- res.status(202).json(task);
436
- return;
437
- }
438
-
439
- activeWorkspaces.set(task.id, workspace);
440
- task.metadata = {
441
- ...task.metadata,
442
- workspace: workspaceMetadata(workspace, readBoolean(workspaceOptions.keepAfterCompletion)),
443
- };
444
- taskStore.set(task);
445
-
446
- previewStops.set(
447
- task.id,
448
- portWatcher.watch({
449
- taskId: task.id,
450
- workspace,
451
- onPort: (event) => {
452
- const data: PreviewArtifactData = {
453
- url: event.url,
454
- proxiedUrl: `/preview/${event.port}/`,
455
- port: event.port,
456
- host: event.host,
457
- processName: event.processName,
458
- confidence: event.confidence,
459
- };
460
- a2aBus.publish({
461
- kind: 'artifact',
462
- taskId: task.id,
463
- artifact: {
464
- artifactId: newId('art'),
465
- type: 'preview-url',
466
- parts: [{ kind: 'data', data: { ...data } }],
467
- metadata: {
468
- source: 'port-watcher',
469
- workspaceId: workspace.id,
470
- },
471
- },
472
- });
473
- },
474
- }),
475
- );
476
-
477
- try {
478
- await adapter.submitTask(task, {
479
- cwd: workspace.path,
480
- workspace,
481
- model: readString(metadata?.model),
482
- permissionMode: readString(metadata?.permissionMode),
483
- permissionPolicy: readObject(metadata?.permissionPolicy) as PermissionPolicy | undefined,
484
- permissionPolicyContext: readObject(metadata?.permissionPolicyContext) as PermissionPolicyContext | undefined,
485
- toolsSettings: readObject(metadata?.toolsSettings),
486
- });
487
- } catch (err) {
488
- // Publish to bus so SSE subscribers and the attachBusToTask listener
489
- // both see the failure transition. The listener mutates the stored
490
- // task in place, so the 202 body still reflects the failed state.
491
- a2aBus.publish({
492
- kind: 'task-state',
493
- taskId: task.id,
494
- state: 'failed',
495
- error: {
496
- code: 'ADAPTER_SUBMIT_FAILED',
497
- message: err instanceof Error ? err.message : String(err),
498
- },
499
- });
500
- }
501
-
502
- res.status(202).json(task);
503
- });
504
-
505
- router.get('/tasks/:id', (req, res) => {
506
- const task = taskStore.get(req.params.id);
507
- if (!task) {
508
- res.status(404).json({ error: { code: 'TASK_NOT_FOUND', message: req.params.id } });
509
- return;
510
- }
511
- res.json(task);
512
- });
513
-
514
- router.get('/tasks/:id/stream', (req, res) => {
515
- const task = taskStore.get(req.params.id);
516
- if (!task) {
517
- res.status(404).json({ error: { code: 'TASK_NOT_FOUND', message: req.params.id } });
518
- return;
519
- }
520
- res.setHeader('Content-Type', 'text/event-stream');
521
- res.setHeader('Cache-Control', 'no-cache, no-transform');
522
- res.setHeader('Connection', 'keep-alive');
523
- res.flushHeaders();
524
-
525
- // Replay current state once so late subscribers see history.
526
- const initial = { kind: 'task-snapshot' as const, task };
527
- res.write(`event: snapshot\ndata: ${JSON.stringify(initial)}\n\n`);
528
-
529
- const unsubscribe = a2aBus.subscribe(task.id, (event) => {
530
- res.write(`event: ${event.kind}\ndata: ${JSON.stringify(event)}\n\n`);
531
- if (event.kind === 'task-state' && TERMINAL.includes(event.state)) {
532
- setTimeout(() => res.end(), 1500);
533
- }
534
- });
535
-
536
- req.on('close', () => {
537
- unsubscribe();
538
- });
539
- });
540
-
541
- router.post('/tasks/:id/cancel', async (req, res) => {
542
- const task = taskStore.get(req.params.id);
543
- if (!task) {
544
- res.status(404).json({ error: { code: 'TASK_NOT_FOUND', message: req.params.id } });
545
- return;
546
- }
547
- // Look up the adapter that owns this task. We stored adapterId in metadata.
548
- const adapterId = req.body?.adapterId ?? task.metadata?.adapterId;
549
- const adapter = typeof adapterId === 'string' ? adapterRegistry.resolve(adapterId) : undefined;
550
- if (!adapter) {
551
- res.status(400).json({
552
- error: {
553
- code: 'ADAPTER_REQUIRED',
554
- message: 'Provide adapterId to cancel a task whose adapter is unknown',
555
- },
556
- });
557
- return;
558
- }
559
- await adapter.cancelTask(task.id);
560
- res.json(taskStore.get(task.id));
561
- });
562
-
563
- router.post('/messages', (req, res) => {
564
- try {
565
- assertMessage(req.body);
566
- } catch (err) {
567
- const e = err as A2AValidationError;
568
- res.status(400).json({ error: { code: 'INVALID_INPUT', message: e.message, path: e.path } });
569
- return;
570
- }
571
- if (typeof req.body.taskId === 'string' && !taskStore.get(req.body.taskId)) {
572
- res.status(404).json({
573
- error: { code: 'TASK_NOT_FOUND', message: req.body.taskId },
574
- });
575
- return;
576
- }
577
- a2aBus.publish({
578
- kind: 'message',
579
- taskId: req.body.taskId ?? 'broadcast',
580
- message: req.body,
581
- });
582
- res.status(202).json({ accepted: true });
583
- });
584
-
585
- return router;
586
- }