@skaile/workspaces 1.15.1 → 2.0.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 (299) hide show
  1. package/CHANGELOG.md +271 -0
  2. package/dist/{asset-feeds-MWEMXMZA.js → asset-feeds-7VQVISDI.js} +25 -24
  3. package/dist/asset-feeds-7VQVISDI.js.map +1 -0
  4. package/dist/asset-manager/catalog-deployer.js +13 -1
  5. package/dist/asset-manager/index.js +10 -9
  6. package/dist/asset-manager/installer.js +7 -6
  7. package/dist/asset-manager/src/catalog-deployer.d.ts +70 -5
  8. package/dist/asset-manager/src/catalog-deployer.d.ts.map +1 -1
  9. package/dist/asset-manager/src/index.d.ts +22 -17
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/bridge/drivers/claude-sdk.js +108 -56
  12. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  13. package/dist/bridge/drivers/codex.js +3 -2
  14. package/dist/bridge/drivers/codex.js.map +1 -1
  15. package/dist/bridge/drivers/continue.js +4 -3
  16. package/dist/bridge/drivers/continue.js.map +1 -1
  17. package/dist/bridge/drivers/echo.js +3 -2
  18. package/dist/bridge/drivers/echo.js.map +1 -1
  19. package/dist/bridge/drivers/gemini.js +5 -4
  20. package/dist/bridge/drivers/goose.js +4 -3
  21. package/dist/bridge/drivers/goose.js.map +1 -1
  22. package/dist/bridge/drivers/omp.js +3 -2
  23. package/dist/bridge/drivers/omp.js.map +1 -1
  24. package/dist/bridge/drivers/opencode.js +4 -3
  25. package/dist/bridge/drivers/opencode.js.map +1 -1
  26. package/dist/bridge/drivers/qwen.js +5 -4
  27. package/dist/bridge/drivers/qwen.js.map +1 -1
  28. package/dist/bridge/index.js +4 -3
  29. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  30. package/dist/bridge/src/drivers/scrub-transcript.d.ts +21 -1
  31. package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +1 -1
  32. package/dist/{chunk-344DEXZS.js → chunk-35ELAMQ5.js} +4 -4
  33. package/dist/{chunk-344DEXZS.js.map → chunk-35ELAMQ5.js.map} +1 -1
  34. package/dist/{chunk-73HV7RV3.js → chunk-6FJH63NN.js} +4 -4
  35. package/dist/{chunk-73HV7RV3.js.map → chunk-6FJH63NN.js.map} +1 -1
  36. package/dist/{chunk-ISA7R7PK.js → chunk-72EOJJOM.js} +82 -38
  37. package/dist/chunk-72EOJJOM.js.map +1 -0
  38. package/dist/chunk-7GOCNYUV.js +300 -0
  39. package/dist/chunk-7GOCNYUV.js.map +1 -0
  40. package/dist/{chunk-TFIFNDT2.js → chunk-A5OYCQGT.js} +4 -4
  41. package/dist/{chunk-TFIFNDT2.js.map → chunk-A5OYCQGT.js.map} +1 -1
  42. package/dist/{chunk-KY5NY7LB.js → chunk-BCTU4TN7.js} +11 -11
  43. package/dist/chunk-BCTU4TN7.js.map +1 -0
  44. package/dist/chunk-BEAIJRVF.js +159 -0
  45. package/dist/chunk-BEAIJRVF.js.map +1 -0
  46. package/dist/chunk-BK3WL3QK.js +10 -0
  47. package/dist/chunk-BK3WL3QK.js.map +1 -0
  48. package/dist/{chunk-BI2NKPA4.js → chunk-CA5CWLGN.js} +3 -2
  49. package/dist/chunk-CA5CWLGN.js.map +1 -0
  50. package/dist/{chunk-2TSSCHCQ.js → chunk-CKVIN4H3.js} +5 -5
  51. package/dist/{chunk-2TSSCHCQ.js.map → chunk-CKVIN4H3.js.map} +1 -1
  52. package/dist/{chunk-GXC3TYMQ.js → chunk-CZZRDYT4.js} +70 -32
  53. package/dist/chunk-CZZRDYT4.js.map +1 -0
  54. package/dist/{chunk-MNKUZUN2.js → chunk-DRXDEL3A.js} +3 -3
  55. package/dist/{chunk-MNKUZUN2.js.map → chunk-DRXDEL3A.js.map} +1 -1
  56. package/dist/{chunk-Z6NGK5YC.js → chunk-DY2AK577.js} +3 -3
  57. package/dist/{chunk-Z6NGK5YC.js.map → chunk-DY2AK577.js.map} +1 -1
  58. package/dist/chunk-DYMWJAL4.js +552 -0
  59. package/dist/chunk-DYMWJAL4.js.map +1 -0
  60. package/dist/{chunk-ACXLKNIM.js → chunk-E7HKNQTH.js} +10 -4
  61. package/dist/chunk-E7HKNQTH.js.map +1 -0
  62. package/dist/{chunk-O5VCUU6D.js → chunk-KUZEIKZH.js} +4 -4
  63. package/dist/{chunk-O5VCUU6D.js.map → chunk-KUZEIKZH.js.map} +1 -1
  64. package/dist/{chunk-RADBQ5XJ.js → chunk-KYLWY3A7.js} +10 -10
  65. package/dist/{chunk-RADBQ5XJ.js.map → chunk-KYLWY3A7.js.map} +1 -1
  66. package/dist/{chunk-2BQBWWFX.js → chunk-LBZP2IYG.js} +6 -6
  67. package/dist/chunk-LBZP2IYG.js.map +1 -0
  68. package/dist/{chunk-MZV6WCF3.js → chunk-MAN7AGQJ.js} +3 -3
  69. package/dist/{chunk-MZV6WCF3.js.map → chunk-MAN7AGQJ.js.map} +1 -1
  70. package/dist/{chunk-7J7LQP6T.js → chunk-MMD2KQ3A.js} +31 -19
  71. package/dist/chunk-MMD2KQ3A.js.map +1 -0
  72. package/dist/{chunk-NRXVS7E4.js → chunk-NYCJ7B27.js} +19 -11
  73. package/dist/chunk-NYCJ7B27.js.map +1 -0
  74. package/dist/{chunk-ACWCVB5Q.js → chunk-ORZW7MMO.js} +3 -3
  75. package/dist/{chunk-ACWCVB5Q.js.map → chunk-ORZW7MMO.js.map} +1 -1
  76. package/dist/{chunk-M5GJT3D7.js → chunk-OYX22NJL.js} +3 -3
  77. package/dist/{chunk-M5GJT3D7.js.map → chunk-OYX22NJL.js.map} +1 -1
  78. package/dist/{chunk-MJEUK6VJ.js → chunk-QIQTYN7F.js} +3 -3
  79. package/dist/{chunk-MJEUK6VJ.js.map → chunk-QIQTYN7F.js.map} +1 -1
  80. package/dist/{chunk-2IJFUAZB.js → chunk-RK3HU3H3.js} +123 -18
  81. package/dist/chunk-RK3HU3H3.js.map +1 -0
  82. package/dist/{chunk-5NZ56R63.js → chunk-ST3DLLNZ.js} +18 -6
  83. package/dist/chunk-ST3DLLNZ.js.map +1 -0
  84. package/dist/{chunk-MTM6C7IS.js → chunk-SVL4EZJT.js} +463 -251
  85. package/dist/chunk-SVL4EZJT.js.map +1 -0
  86. package/dist/{chunk-JB35MVBN.js → chunk-U5POE4BA.js} +4 -298
  87. package/dist/chunk-U5POE4BA.js.map +1 -0
  88. package/dist/{chunk-DB264AVQ.js → chunk-UAQVFATZ.js} +8 -8
  89. package/dist/{chunk-DB264AVQ.js.map → chunk-UAQVFATZ.js.map} +1 -1
  90. package/dist/{chunk-DPUZJI45.js → chunk-UVW3R6S7.js} +72 -37
  91. package/dist/chunk-UVW3R6S7.js.map +1 -0
  92. package/dist/{chunk-STQOPWPS.js → chunk-VCU4NPUS.js} +4 -4
  93. package/dist/{chunk-STQOPWPS.js.map → chunk-VCU4NPUS.js.map} +1 -1
  94. package/dist/{chunk-MB6563TL.js → chunk-WCWXDW22.js} +3 -3
  95. package/dist/{chunk-MB6563TL.js.map → chunk-WCWXDW22.js.map} +1 -1
  96. package/dist/{chunk-EKGB4ZWR.js → chunk-WZPADAE7.js} +255 -136
  97. package/dist/chunk-WZPADAE7.js.map +1 -0
  98. package/dist/{chunk-SRWIVMJI.js → chunk-Y3JVBJ3Y.js} +5 -5
  99. package/dist/{chunk-SRWIVMJI.js.map → chunk-Y3JVBJ3Y.js.map} +1 -1
  100. package/dist/{chunk-3EBFDMZC.js → chunk-Y662DNQQ.js} +14 -3
  101. package/dist/chunk-Y662DNQQ.js.map +1 -0
  102. package/dist/cli/index.js +348 -128
  103. package/dist/cli/index.js.map +1 -1
  104. package/dist/cli/src/asset-feeds.d.ts +2 -2
  105. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  106. package/dist/cli/src/commands/catalog.d.ts +51 -2
  107. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  108. package/dist/cli/src/commands/connector.d.ts +1 -1
  109. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  110. package/dist/cli/src/commands/logs.d.ts.map +1 -1
  111. package/dist/cli/src/commands/manage.d.ts +30 -3
  112. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  113. package/dist/cli/src/commands/project.d.ts +5 -2
  114. package/dist/cli/src/commands/project.d.ts.map +1 -1
  115. package/dist/connectors/config.js +7 -6
  116. package/dist/connectors/index.js +9 -8
  117. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  118. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  119. package/dist/connectors/src/watcher.d.ts.map +1 -1
  120. package/dist/connectors/src/worktree.d.ts +20 -2
  121. package/dist/connectors/src/worktree.d.ts.map +1 -1
  122. package/dist/core/index.js +6 -5
  123. package/dist/core/logging.js +2 -1
  124. package/dist/core/manifest.js +2 -1
  125. package/dist/core/runtime-assets.js +4 -3
  126. package/dist/core/src/fs-deadline.d.ts +84 -0
  127. package/dist/core/src/fs-deadline.d.ts.map +1 -0
  128. package/dist/core/src/index.d.ts +4 -3
  129. package/dist/core/src/index.d.ts.map +1 -1
  130. package/dist/core/src/manifest.d.ts +142 -18
  131. package/dist/core/src/manifest.d.ts.map +1 -1
  132. package/dist/core/src/repo-manager.d.ts +2 -2
  133. package/dist/core/src/repo-manager.d.ts.map +1 -1
  134. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  135. package/dist/core/src/subprocess.d.ts +33 -1
  136. package/dist/core/src/subprocess.d.ts.map +1 -1
  137. package/dist/core/src/walker.d.ts +1 -1
  138. package/dist/core/src/walker.d.ts.map +1 -1
  139. package/dist/core/src/workspace-config.d.ts +9 -2
  140. package/dist/core/src/workspace-config.d.ts.map +1 -1
  141. package/dist/core/workspace-config.js +3 -2
  142. package/dist/deploy/index.js +12 -7
  143. package/dist/deploy/index.js.map +1 -1
  144. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  145. package/dist/discovery/index.js +3 -2
  146. package/dist/{ensure-sources-QGL44IRI.js → ensure-sources-JLVHHZI2.js} +13 -12
  147. package/dist/ensure-sources-JLVHHZI2.js.map +1 -0
  148. package/dist/factory-assets/connectors/box.js +9 -8
  149. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +19 -0
  150. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -1
  151. package/dist/factory-assets/connectors/deploy.js +9 -8
  152. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -1
  153. package/dist/factory-assets/connectors/devserver.js +9 -8
  154. package/dist/factory-assets/connectors/flow/CONNECTOR.md +3 -1
  155. package/dist/factory-assets/connectors/flow/adapter.d.ts +2 -1
  156. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  157. package/dist/factory-assets/connectors/flow/adapter.js +9 -8
  158. package/dist/factory-assets/connectors/flow/engine.js +6 -5
  159. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +9 -2
  160. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
  161. package/dist/factory-assets/connectors/flow/prompt-fragments.js +1 -1
  162. package/dist/factory-assets/connectors/flow/run-flow.js +11 -10
  163. package/dist/factory-assets/connectors/flow.js +9 -8
  164. package/dist/factory-assets/connectors/git/driver.d.ts +12 -1
  165. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  166. package/dist/factory-assets/connectors/git.js +9 -8
  167. package/dist/factory-assets/connectors/gmail.js +9 -8
  168. package/dist/factory-assets/connectors/googledrive.js +9 -8
  169. package/dist/factory-assets/connectors/local/driver.d.ts +25 -1
  170. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -1
  171. package/dist/factory-assets/connectors/local.js +9 -8
  172. package/dist/factory-assets/connectors/mattermost.js +9 -8
  173. package/dist/factory-assets/connectors/memory.js +9 -8
  174. package/dist/factory-assets/connectors/minio.js +9 -8
  175. package/dist/factory-assets/connectors/postgres.js +9 -8
  176. package/dist/factory-assets/connectors/s3/driver.d.ts +15 -0
  177. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
  178. package/dist/factory-assets/connectors/s3.js +9 -8
  179. package/dist/factory-assets/connectors/sharepoint.js +9 -8
  180. package/dist/factory-assets/connectors/sqlite/adapter.d.ts +8 -1
  181. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
  182. package/dist/factory-assets/connectors/sqlite.js +9 -8
  183. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -1
  184. package/dist/factory-assets/connectors/static-server.js +9 -8
  185. package/dist/factory-assets/connectors/tunnel.js +9 -8
  186. package/dist/factory-assets/connectors/webdav.js +9 -8
  187. package/dist/factory-assets/connectors/xstate/adapter.d.ts +6 -0
  188. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -1
  189. package/dist/factory-assets/connectors/xstate-store.js +9 -8
  190. package/dist/factory-assets/connectors/xstate.js +9 -8
  191. package/dist/flows-LV5WYJ2I.js +20 -0
  192. package/dist/{flows-FHWBCLXF.js.map → flows-LV5WYJ2I.js.map} +1 -1
  193. package/dist/{helpers-FMWODXTW.js → helpers-PJ3CPUUL.js} +13 -12
  194. package/dist/{helpers-FMWODXTW.js.map → helpers-PJ3CPUUL.js.map} +1 -1
  195. package/dist/library/index.js +8 -7
  196. package/dist/library/install.js +6 -5
  197. package/dist/{library-publish-7YDHQGBN.js → library-publish-HVZRCE3C.js} +16 -15
  198. package/dist/library-publish-HVZRCE3C.js.map +1 -0
  199. package/dist/{open-library-O6T3ELPK.js → open-library-RMI2FTQ4.js} +14 -13
  200. package/dist/{open-library-O6T3ELPK.js.map → open-library-RMI2FTQ4.js.map} +1 -1
  201. package/dist/{paths-5QJJBAND.js → paths-JSVTQAVW.js} +11 -10
  202. package/dist/{paths-5QJJBAND.js.map → paths-JSVTQAVW.js.map} +1 -1
  203. package/dist/plugin-registry/src/deploy-helpers.d.ts +1 -1
  204. package/dist/{plugin-store-ZBJZ7F6D.js → plugin-store-7TVJB2TS.js} +8 -7
  205. package/dist/plugin-store-7TVJB2TS.js.map +1 -0
  206. package/dist/{project-HAMLHLD5.js → project-P636MSYT.js} +14 -13
  207. package/dist/{project-HAMLHLD5.js.map → project-P636MSYT.js.map} +1 -1
  208. package/dist/resolver/index.js +13 -1
  209. package/dist/resolver/src/types.d.ts +7 -0
  210. package/dist/resolver/src/types.d.ts.map +1 -1
  211. package/dist/resolver/src/validator.d.ts +8 -1
  212. package/dist/resolver/src/validator.d.ts.map +1 -1
  213. package/dist/runner/index.js +14 -13
  214. package/dist/runner/src/external-mcp.d.ts +1 -1
  215. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  216. package/dist/runner/src/mcp-prompt.d.ts +7 -3
  217. package/dist/runner/src/mcp-prompt.d.ts.map +1 -1
  218. package/dist/runner/src/mcp-runtime-handlers.d.ts +12 -0
  219. package/dist/runner/src/mcp-runtime-handlers.d.ts.map +1 -1
  220. package/dist/runner/src/mixin-resolver.d.ts.map +1 -1
  221. package/dist/runner/src/recipe-resolver.d.ts +20 -6
  222. package/dist/runner/src/recipe-resolver.d.ts.map +1 -1
  223. package/dist/runner/src/resource-handler.d.ts +43 -0
  224. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  225. package/dist/runner/src/resources.d.ts +12 -5
  226. package/dist/runner/src/resources.d.ts.map +1 -1
  227. package/dist/runner/src/serve.d.ts +5 -5
  228. package/dist/runner/src/serve.d.ts.map +1 -1
  229. package/dist/runner/src/session-builder.d.ts +9 -0
  230. package/dist/runner/src/session-builder.d.ts.map +1 -1
  231. package/dist/runner/src/session-capability-wiring.d.ts +5 -0
  232. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  233. package/dist/runner/src/workspace-migration.d.ts +37 -3
  234. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  235. package/dist/sdk/asset-manager.js +10 -9
  236. package/dist/sdk/bridge.js +4 -3
  237. package/dist/sdk/core.js +6 -5
  238. package/dist/sdk/flow.js +6 -5
  239. package/dist/sdk/index.js +14 -13
  240. package/dist/sdk/index.js.map +1 -1
  241. package/dist/sdk/resolver.js +13 -1
  242. package/dist/sdk/runner.js +14 -13
  243. package/dist/sdk/session.js +1 -1
  244. package/dist/sdk/store.js +1 -1
  245. package/dist/session/index.js +1 -1
  246. package/dist/session/src/dispatcher.d.ts.map +1 -1
  247. package/dist/{setup-WJPNUE32.js → setup-OYW3W3XK.js} +10 -9
  248. package/dist/setup-OYW3W3XK.js.map +1 -0
  249. package/dist/skills-QY5PHBD3.js +20 -0
  250. package/dist/{skills-BMI6H7HI.js.map → skills-QY5PHBD3.js.map} +1 -1
  251. package/dist/{source-ITDH4367.js → source-63CHWDC2.js} +15 -14
  252. package/dist/{source-ITDH4367.js.map → source-63CHWDC2.js.map} +1 -1
  253. package/dist/{source-manifest-publish-RMHC7R6M.js → source-manifest-publish-DLASGDK5.js} +17 -16
  254. package/dist/source-manifest-publish-DLASGDK5.js.map +1 -0
  255. package/dist/store/index.js +1 -1
  256. package/dist/store/src/store.d.ts +9 -0
  257. package/dist/store/src/store.d.ts.map +1 -1
  258. package/dist/tui/index.js +14 -13
  259. package/dist/tui/index.js.map +1 -1
  260. package/dist/validator-RN64BKFW.js +5 -0
  261. package/dist/{validator-VF5M764T.js.map → validator-RN64BKFW.js.map} +1 -1
  262. package/dist/workspace-plugin/adapters/mcp.js +18 -5
  263. package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
  264. package/dist/workspace-plugin/adapters/omp.js +10 -10
  265. package/dist/workspace-plugin/index.js +3 -2
  266. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  267. package/dist/workspace-plugin/src/utils/ai-assets.d.ts +11 -6
  268. package/dist/workspace-plugin/src/utils/ai-assets.d.ts.map +1 -1
  269. package/package.json +1 -1
  270. package/dist/asset-feeds-MWEMXMZA.js.map +0 -1
  271. package/dist/chunk-2BQBWWFX.js.map +0 -1
  272. package/dist/chunk-2IJFUAZB.js.map +0 -1
  273. package/dist/chunk-3EBFDMZC.js.map +0 -1
  274. package/dist/chunk-5NZ56R63.js.map +0 -1
  275. package/dist/chunk-7J7LQP6T.js.map +0 -1
  276. package/dist/chunk-ACXLKNIM.js.map +0 -1
  277. package/dist/chunk-BI2NKPA4.js.map +0 -1
  278. package/dist/chunk-BQCGFPHW.js +0 -345
  279. package/dist/chunk-BQCGFPHW.js.map +0 -1
  280. package/dist/chunk-DPUZJI45.js.map +0 -1
  281. package/dist/chunk-EKGB4ZWR.js.map +0 -1
  282. package/dist/chunk-GXC3TYMQ.js.map +0 -1
  283. package/dist/chunk-ISA7R7PK.js.map +0 -1
  284. package/dist/chunk-JB35MVBN.js.map +0 -1
  285. package/dist/chunk-KY5NY7LB.js.map +0 -1
  286. package/dist/chunk-LV2HPH3C.js +0 -73
  287. package/dist/chunk-LV2HPH3C.js.map +0 -1
  288. package/dist/chunk-MTM6C7IS.js.map +0 -1
  289. package/dist/chunk-NRXVS7E4.js.map +0 -1
  290. package/dist/chunk-XCBG2KDC.js +0 -23
  291. package/dist/chunk-XCBG2KDC.js.map +0 -1
  292. package/dist/ensure-sources-QGL44IRI.js.map +0 -1
  293. package/dist/flows-FHWBCLXF.js +0 -7
  294. package/dist/library-publish-7YDHQGBN.js.map +0 -1
  295. package/dist/plugin-store-ZBJZ7F6D.js.map +0 -1
  296. package/dist/setup-WJPNUE32.js.map +0 -1
  297. package/dist/skills-BMI6H7HI.js +0 -7
  298. package/dist/source-manifest-publish-RMHC7R6M.js.map +0 -1
  299. package/dist/validator-VF5M764T.js +0 -5
@@ -1,8 +1,9 @@
1
1
  import { fetchProviderModels } from '../../chunk-BMQKMOQY.js';
2
2
  import { classifyGenericErrorMessage } from '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ACWCVB5Q.js';
3
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
- import '../../chunk-JB35MVBN.js';
5
+ import '../../chunk-U5POE4BA.js';
6
+ import '../../chunk-7GOCNYUV.js';
6
7
  import '../../chunk-NSBPE2FW.js';
7
8
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
8
9
  import { join, dirname } from 'path';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"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","file":"codex.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n AgentMessageItem,\n Codex as CodexClient,\n CommandExecutionItem,\n FileChangeItem,\n McpToolCallItem,\n Thread,\n ThreadEvent,\n ThreadItem,\n WebSearchItem,\n} from \"@openai/codex-sdk\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, type ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type DriverInfo,\n} from \"../types.js\";\n\ntype CodexSdkModule = typeof import(\"@openai/codex-sdk\");\n\n/**\n * Build the explicit env whitelist forwarded to the Codex SDK child.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment.\n *\n * @docLink packages/bridge/concepts#codex-env-whitelist\n */\nfunction buildCodexChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (key.startsWith(\"PI_\") && typeof value === \"string\") out[key] = value;\n }\n return out;\n}\n\n/**\n * Agent driver for the OpenAI Codex SDK.\n *\n * Creates or resumes a Codex thread via `@openai/codex-sdk` (lazy-imported in `start()`)\n * and maps Codex SDK thread events to the unified {@link AgentEvent} stream.\n * OpenAI models only — uses `OPENAI_API_KEY` from `apiKeys`, `env`, or the environment.\n *\n * @remarks\n * **Event mapping** — Codex SDK items are translated: `agent_message` → `message_start/update/end`,\n * `command_execution` → Bash-shaped tool events, `mcp_tool_call` → MCP tool events,\n * `file_change` → `ApplyPatch`-shaped events, `web_search` → `WebSearch` events.\n *\n * **Sandbox** — The Codex sandbox mode, approval policy, and reasoning effort are\n * controlled via `AgentConfig.driverOptions.codex`. See {@link CodexDriverOptions}.\n *\n * **Instructions file** — System prompt and pre-rendered agent identity are combined\n * into a single instructions file written to `<cwd>/.codex/skaile-session-instructions.md`\n * and passed to the Codex SDK as `model_instructions_file`.\n *\n * @docLink packages/bridge/drivers#codex-driver\n */\nexport class CodexDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"codex\");\n private config: AgentConfig;\n private thread: Thread | null = null;\n private running = false;\n private abortController: AbortController | null = null;\n private pendingToolResults: AgentMessage[] = [];\n private activeAssistantItemId: string | null = null;\n private activeAssistantText = \"\";\n private _runtimeSessionId: string | undefined;\n /** Token usage from the most recent completed turn. */\n private _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._runtimeSessionId;\n }\n\n public async start(): Promise<void> {\n if (this.thread) return;\n\n let sdk: CodexSdkModule;\n try {\n sdk = await import(\"@openai/codex-sdk\");\n } catch (err) {\n this.log.error(\"codex SDK load failed\", err);\n throw new Error(\"Codex SDK not installed. Run: bun add @openai/codex-sdk\");\n }\n\n // Explicit env whitelist for the Codex SDK child. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned process. `this.config.env`, when\n // supplied, fully overrides the whitelist.\n const env: Record<string, string | undefined> = this.config.env\n ? { ...this.config.env }\n : buildCodexChildEnv(process.env);\n\n const instructionsFile = this.writeInstructionsFile();\n\n const client = new sdk.Codex({\n apiKey:\n this.config.apiKeys?.openai ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY,\n env: Object.fromEntries(Object.entries(env).filter(([, value]) => value != null)) as Record<\n string,\n string\n >,\n ...(instructionsFile ? { config: { model_instructions_file: instructionsFile } } : {}),\n });\n\n const codexOptions = this.config.driverOptions?.codex;\n const threadOptions = {\n model: this.config.model,\n sandboxMode: codexOptions?.sandboxMode ?? \"workspace-write\",\n workingDirectory: this.config.cwd,\n skipGitRepoCheck: true,\n modelReasoningEffort: codexOptions?.reasoningEffort ?? \"medium\",\n networkAccessEnabled: codexOptions?.networkAccessEnabled,\n approvalPolicy: codexOptions?.approvalPolicy ?? \"never\",\n additionalDirectories: codexOptions?.additionalDirectories,\n } satisfies Parameters<CodexClient[\"startThread\"]>[0];\n\n this.thread = this.config.resumeSessionId\n ? client.resumeThread(this.config.resumeSessionId, threadOptions)\n : client.startThread(threadOptions);\n this._runtimeSessionId = this.thread.id ?? this.config.resumeSessionId;\n this.log.info(\"codex driver started\", {\n model: this.config.model,\n resumed: Boolean(this.config.resumeSessionId),\n sessionId: this._runtimeSessionId,\n });\n }\n\n public async prompt(message: string): Promise<void> {\n await this.start();\n if (!this.thread) throw new Error(\"Codex thread not initialized\");\n if (this.running) throw new Error(\"Codex turn already in progress\");\n\n this.running = true;\n this.pendingToolResults = [];\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this._lastTokens = null;\n this.abortController = new AbortController();\n let turnFinished = false;\n this.log.debug(\"prompt issued\", { length: message.length });\n\n try {\n const input = message;\n const { events } = await this.thread.runStreamed(input, {\n signal: this.abortController.signal,\n });\n\n for await (const event of events) {\n turnFinished = this.handleThreadEvent(event) || turnFinished;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (error.name !== \"AbortError\") {\n this.log.error(\"prompt failed\", error);\n const detail = this.classifyErrorMessage(error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n }\n } finally {\n if (!turnFinished && this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this.abortController = null;\n this.running = false;\n }\n }\n\n public async abort(): Promise<void> {\n this.abortController?.abort();\n }\n\n public get isRunning(): boolean {\n return this.running;\n }\n\n public kill(): void {\n this.abortController?.abort();\n this.running = false;\n this.abortController = null;\n this.log.info(\"codex driver killed\");\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const apiKey =\n this.config.apiKeys?.openai || this.config.env?.OPENAI_API_KEY || process.env.OPENAI_API_KEY;\n if (!apiKey) return [];\n const result = await fetchProviderModels(\"openai\", apiKey);\n return result.ok ? (result.models as ModelEntry[]) : [];\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this.thread = null;\n this._runtimeSessionId = undefined;\n this._lastTokens = null;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * Write a combined instructions file for Codex CLI's `model_instructions_file` config.\n * Combines pre-rendered agent identity (from `skaile install`) with runtime context\n * (resources, environment, prompt-extensions).\n */\n private writeInstructionsFile(): string | undefined {\n const parts: string[] = [];\n\n // 1. Read pre-rendered agent identity if available\n if (this.config.agentDir) {\n const agentFile = join(this.config.cwd, \".codex\", \"skaile-agent.md\");\n if (existsSync(agentFile)) {\n parts.push(readFileSync(agentFile, \"utf-8\"));\n }\n }\n\n // 2. Append runtime system prompt (resources, context, environment)\n if (this.config.systemPrompt) {\n parts.push(this.config.systemPrompt);\n }\n\n if (parts.length === 0) return undefined;\n\n // Write combined instructions to a session file\n const instrFile = join(this.config.cwd, \".codex\", \"skaile-session-instructions.md\");\n mkdirSync(dirname(instrFile), { recursive: true });\n writeFileSync(instrFile, parts.join(\"\\n\\n---\\n\\n\"));\n return instrFile;\n }\n\n private handleThreadEvent(event: ThreadEvent): boolean {\n switch (event.type) {\n case \"thread.started\":\n this._runtimeSessionId = event.thread_id;\n return false;\n\n case \"turn.started\":\n return false;\n\n case \"item.started\":\n case \"item.updated\":\n case \"item.completed\":\n this.handleThreadItem(event.item, event.type === \"item.completed\", event.type);\n return false;\n\n case \"turn.completed\": {\n this.flushToolResults();\n // Map Codex SDK `Usage` shape into the unified `TokenUsage`. Note\n // OpenAI's `input_tokens` is the TOTAL including cached reads, not\n // the fresh-prompt count Anthropic reports — consumers that want\n // a strict \"fresh input\" figure must subtract `cacheReadTokens`.\n const usage = event.usage;\n const tokens: TokenUsage | null = usage\n ? {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cached_input_tokens,\n }\n : null;\n this._lastTokens = tokens;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: \"success\",\n summary: this.activeAssistantText || \"Task completed\",\n // Codex SDK does not report per-turn cost. `0` signals \"not\n // reported\" — pair with `tokens` to disambiguate from \"free\".\n costUsd: 0,\n ...(tokens ? { tokens } : {}),\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"turn.failed\": {\n this.flushToolResults();\n const detail = this.classifyErrorMessage(event.error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"error\": {\n const detail = this.classifyErrorMessage(event.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n }\n }\n\n private handleThreadItem(item: ThreadItem, completed: boolean, phase: ThreadEvent[\"type\"]): void {\n switch (item.type) {\n case \"agent_message\":\n this.handleAgentMessage(item, completed);\n break;\n\n case \"command_execution\":\n this.handleCommandExecution(item, completed, phase);\n break;\n\n case \"mcp_tool_call\":\n this.handleMcpToolCall(item, completed, phase);\n break;\n\n case \"file_change\":\n this.handleFileChange(item, completed, phase);\n break;\n\n case \"web_search\":\n this.handleWebSearch(item, completed, phase);\n break;\n\n case \"error\":\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"CodexError\",\n content: \"\",\n data: { message: item.message },\n isError: true,\n });\n }\n break;\n\n default:\n break;\n }\n }\n\n private handleAgentMessage(item: AgentMessageItem, completed: boolean): void {\n if (this.activeAssistantItemId !== item.id) {\n if (this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = item.id;\n this.activeAssistantText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: this.buildAssistantMessage(\"\"),\n } satisfies AgentEvent);\n }\n\n const nextText = item.text ?? \"\";\n const delta = nextText.startsWith(this.activeAssistantText)\n ? nextText.slice(this.activeAssistantText.length)\n : nextText;\n this.activeAssistantText = nextText;\n\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: this.buildAssistantMessage(nextText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(nextText),\n } satisfies AgentEvent);\n this.activeAssistantItemId = null;\n }\n }\n\n private handleCommandExecution(\n item: CommandExecutionItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"Bash\",\n tool: { name: \"Bash\" },\n input: { command: item.command },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"Bash\",\n content: \"\",\n data: {\n stdout: item.aggregated_output,\n stderr: \"\",\n exitCode: item.exit_code,\n status: item.status,\n command: item.command,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"Bash\",\n } satisfies AgentEvent);\n }\n }\n\n private handleMcpToolCall(\n item: McpToolCallItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n const toolName = `mcp__${item.server}__${item.tool}`;\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: toolName,\n tool: { name: toolName },\n input: this.toObject(item.arguments),\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName,\n content: \"\",\n data: {\n status: item.status,\n content: item.result?.content,\n structuredContent: item.result?.structured_content,\n error: item.error?.message,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName,\n } satisfies AgentEvent);\n }\n }\n\n private handleFileChange(\n item: FileChangeItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"ApplyPatch\",\n tool: { name: \"ApplyPatch\" },\n input: { changes: item.changes },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"ApplyPatch\",\n content: \"\",\n data: { status: item.status, changes: item.changes },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"ApplyPatch\",\n } satisfies AgentEvent);\n }\n }\n\n private handleWebSearch(\n item: WebSearchItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"WebSearch\",\n tool: { name: \"WebSearch\" },\n input: { query: item.query },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"WebSearch\",\n content: \"\",\n data: { query: item.query, status: \"completed\" },\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"WebSearch\",\n } satisfies AgentEvent);\n }\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n private buildAssistantMessage(text: string): AgentMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n };\n }\n\n private toObject(value: unknown): Record<string, unknown> {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { arguments: value };\n }\n\n private classifyErrorMessage(message: string): AgentError {\n // Shared keyword buckets live in error-classifier.ts; codex layers its own\n // hint copy plus a provider-specific `config` (sandbox/approval) bucket.\n const generic = classifyGenericErrorMessage(message);\n if (generic) {\n const hint =\n generic.category === \"auth\"\n ? \"Check your OpenAI API key configuration in settings or environment.\"\n : generic.category === \"rate_limit\"\n ? \"Codex hit an OpenAI rate limit. Wait briefly and try again.\"\n : generic.category === \"model\"\n ? \"The selected Codex model is unavailable. Choose a different model.\"\n : \"A network error occurred while talking to Codex.\";\n return { message, category: generic.category, retryable: generic.retryable, hint };\n }\n const lower = message.toLowerCase();\n if (\n lower.includes(\"sandbox\") ||\n lower.includes(\"approval\") ||\n lower.includes(\"permission\") ||\n lower.includes(\"git repo\")\n ) {\n return {\n message,\n category: \"config\",\n retryable: false,\n hint: \"Check Codex sandbox, approval, and workspace configuration.\",\n };\n }\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"An unexpected Codex error occurred. Try the prompt again.\",\n };\n }\n}\n\n/**\n * `DriverTarget` wrapper for the codex driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`. The Codex SDK is lazy-imported inside\n * `start()` — this target export never pulls it at module top.\n */\nexport const codexDriverTarget: DriverTarget<AgentConfig> = {\n id: \"codex\",\n displayName: BUILTIN_DRIVER_CATALOG.codex?.name ?? \"OpenAI Codex\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new CodexDriver(config),\n listModels: async (apiKeys) =>\n new CodexDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"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","file":"codex.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n AgentMessageItem,\n Codex as CodexClient,\n CommandExecutionItem,\n FileChangeItem,\n McpToolCallItem,\n Thread,\n ThreadEvent,\n ThreadItem,\n WebSearchItem,\n} from \"@openai/codex-sdk\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, type ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type DriverInfo,\n} from \"../types.js\";\n\ntype CodexSdkModule = typeof import(\"@openai/codex-sdk\");\n\n/**\n * Build the explicit env whitelist forwarded to the Codex SDK child.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment.\n *\n * @docLink packages/bridge/concepts#codex-env-whitelist\n */\nfunction buildCodexChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (key.startsWith(\"PI_\") && typeof value === \"string\") out[key] = value;\n }\n return out;\n}\n\n/**\n * Agent driver for the OpenAI Codex SDK.\n *\n * Creates or resumes a Codex thread via `@openai/codex-sdk` (lazy-imported in `start()`)\n * and maps Codex SDK thread events to the unified {@link AgentEvent} stream.\n * OpenAI models only — uses `OPENAI_API_KEY` from `apiKeys`, `env`, or the environment.\n *\n * @remarks\n * **Event mapping** — Codex SDK items are translated: `agent_message` → `message_start/update/end`,\n * `command_execution` → Bash-shaped tool events, `mcp_tool_call` → MCP tool events,\n * `file_change` → `ApplyPatch`-shaped events, `web_search` → `WebSearch` events.\n *\n * **Sandbox** — The Codex sandbox mode, approval policy, and reasoning effort are\n * controlled via `AgentConfig.driverOptions.codex`. See {@link CodexDriverOptions}.\n *\n * **Instructions file** — System prompt and pre-rendered agent identity are combined\n * into a single instructions file written to `<cwd>/.codex/skaile-session-instructions.md`\n * and passed to the Codex SDK as `model_instructions_file`.\n *\n * @docLink packages/bridge/drivers#codex-driver\n */\nexport class CodexDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"codex\");\n private config: AgentConfig;\n private thread: Thread | null = null;\n private running = false;\n private abortController: AbortController | null = null;\n private pendingToolResults: AgentMessage[] = [];\n private activeAssistantItemId: string | null = null;\n private activeAssistantText = \"\";\n private _runtimeSessionId: string | undefined;\n /** Token usage from the most recent completed turn. */\n private _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._runtimeSessionId;\n }\n\n public async start(): Promise<void> {\n if (this.thread) return;\n\n let sdk: CodexSdkModule;\n try {\n sdk = await import(\"@openai/codex-sdk\");\n } catch (err) {\n this.log.error(\"codex SDK load failed\", err);\n throw new Error(\"Codex SDK not installed. Run: bun add @openai/codex-sdk\");\n }\n\n // Explicit env whitelist for the Codex SDK child. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned process. `this.config.env`, when\n // supplied, fully overrides the whitelist.\n const env: Record<string, string | undefined> = this.config.env\n ? { ...this.config.env }\n : buildCodexChildEnv(process.env);\n\n const instructionsFile = this.writeInstructionsFile();\n\n const client = new sdk.Codex({\n apiKey:\n this.config.apiKeys?.openai ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY,\n env: Object.fromEntries(Object.entries(env).filter(([, value]) => value != null)) as Record<\n string,\n string\n >,\n ...(instructionsFile ? { config: { model_instructions_file: instructionsFile } } : {}),\n });\n\n const codexOptions = this.config.driverOptions?.codex;\n const threadOptions = {\n model: this.config.model,\n sandboxMode: codexOptions?.sandboxMode ?? \"workspace-write\",\n workingDirectory: this.config.cwd,\n skipGitRepoCheck: true,\n modelReasoningEffort: codexOptions?.reasoningEffort ?? \"medium\",\n networkAccessEnabled: codexOptions?.networkAccessEnabled,\n approvalPolicy: codexOptions?.approvalPolicy ?? \"never\",\n additionalDirectories: codexOptions?.additionalDirectories,\n } satisfies Parameters<CodexClient[\"startThread\"]>[0];\n\n this.thread = this.config.resumeSessionId\n ? client.resumeThread(this.config.resumeSessionId, threadOptions)\n : client.startThread(threadOptions);\n this._runtimeSessionId = this.thread.id ?? this.config.resumeSessionId;\n this.log.info(\"codex driver started\", {\n model: this.config.model,\n resumed: Boolean(this.config.resumeSessionId),\n sessionId: this._runtimeSessionId,\n });\n }\n\n public async prompt(message: string): Promise<void> {\n await this.start();\n if (!this.thread) throw new Error(\"Codex thread not initialized\");\n if (this.running) throw new Error(\"Codex turn already in progress\");\n\n this.running = true;\n this.pendingToolResults = [];\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this._lastTokens = null;\n this.abortController = new AbortController();\n let turnFinished = false;\n this.log.debug(\"prompt issued\", { length: message.length });\n\n try {\n const input = message;\n const { events } = await this.thread.runStreamed(input, {\n signal: this.abortController.signal,\n });\n\n for await (const event of events) {\n turnFinished = this.handleThreadEvent(event) || turnFinished;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (error.name !== \"AbortError\") {\n this.log.error(\"prompt failed\", error);\n const detail = this.classifyErrorMessage(error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n }\n } finally {\n if (!turnFinished && this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this.abortController = null;\n this.running = false;\n }\n }\n\n public async abort(): Promise<void> {\n this.abortController?.abort();\n }\n\n public get isRunning(): boolean {\n return this.running;\n }\n\n public kill(): void {\n this.abortController?.abort();\n this.running = false;\n this.abortController = null;\n this.log.info(\"codex driver killed\");\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const apiKey =\n this.config.apiKeys?.openai || this.config.env?.OPENAI_API_KEY || process.env.OPENAI_API_KEY;\n if (!apiKey) return [];\n const result = await fetchProviderModels(\"openai\", apiKey);\n return result.ok ? (result.models as ModelEntry[]) : [];\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this.thread = null;\n this._runtimeSessionId = undefined;\n this._lastTokens = null;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * Write a combined instructions file for Codex CLI's `model_instructions_file` config.\n * Combines pre-rendered agent identity (from `skaile install`) with runtime context\n * (resources, environment, prompt-extensions).\n */\n private writeInstructionsFile(): string | undefined {\n const parts: string[] = [];\n\n // 1. Read pre-rendered agent identity if available\n if (this.config.agentDir) {\n const agentFile = join(this.config.cwd, \".codex\", \"skaile-agent.md\");\n if (existsSync(agentFile)) {\n parts.push(readFileSync(agentFile, \"utf-8\"));\n }\n }\n\n // 2. Append runtime system prompt (resources, context, environment)\n if (this.config.systemPrompt) {\n parts.push(this.config.systemPrompt);\n }\n\n if (parts.length === 0) return undefined;\n\n // Write combined instructions to a session file\n const instrFile = join(this.config.cwd, \".codex\", \"skaile-session-instructions.md\");\n mkdirSync(dirname(instrFile), { recursive: true });\n writeFileSync(instrFile, parts.join(\"\\n\\n---\\n\\n\"));\n return instrFile;\n }\n\n private handleThreadEvent(event: ThreadEvent): boolean {\n switch (event.type) {\n case \"thread.started\":\n this._runtimeSessionId = event.thread_id;\n return false;\n\n case \"turn.started\":\n return false;\n\n case \"item.started\":\n case \"item.updated\":\n case \"item.completed\":\n this.handleThreadItem(event.item, event.type === \"item.completed\", event.type);\n return false;\n\n case \"turn.completed\": {\n this.flushToolResults();\n // Map Codex SDK `Usage` shape into the unified `TokenUsage`. Note\n // OpenAI's `input_tokens` is the TOTAL including cached reads, not\n // the fresh-prompt count Anthropic reports — consumers that want\n // a strict \"fresh input\" figure must subtract `cacheReadTokens`.\n const usage = event.usage;\n const tokens: TokenUsage | null = usage\n ? {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cached_input_tokens,\n }\n : null;\n this._lastTokens = tokens;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: \"success\",\n summary: this.activeAssistantText || \"Task completed\",\n // Codex SDK does not report per-turn cost. `0` signals \"not\n // reported\" — pair with `tokens` to disambiguate from \"free\".\n costUsd: 0,\n ...(tokens ? { tokens } : {}),\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"turn.failed\": {\n this.flushToolResults();\n const detail = this.classifyErrorMessage(event.error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"error\": {\n const detail = this.classifyErrorMessage(event.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n }\n }\n\n private handleThreadItem(item: ThreadItem, completed: boolean, phase: ThreadEvent[\"type\"]): void {\n switch (item.type) {\n case \"agent_message\":\n this.handleAgentMessage(item, completed);\n break;\n\n case \"command_execution\":\n this.handleCommandExecution(item, completed, phase);\n break;\n\n case \"mcp_tool_call\":\n this.handleMcpToolCall(item, completed, phase);\n break;\n\n case \"file_change\":\n this.handleFileChange(item, completed, phase);\n break;\n\n case \"web_search\":\n this.handleWebSearch(item, completed, phase);\n break;\n\n case \"error\":\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"CodexError\",\n content: \"\",\n data: { message: item.message },\n isError: true,\n });\n }\n break;\n\n default:\n break;\n }\n }\n\n private handleAgentMessage(item: AgentMessageItem, completed: boolean): void {\n if (this.activeAssistantItemId !== item.id) {\n if (this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = item.id;\n this.activeAssistantText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: this.buildAssistantMessage(\"\"),\n } satisfies AgentEvent);\n }\n\n const nextText = item.text ?? \"\";\n const delta = nextText.startsWith(this.activeAssistantText)\n ? nextText.slice(this.activeAssistantText.length)\n : nextText;\n this.activeAssistantText = nextText;\n\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: this.buildAssistantMessage(nextText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(nextText),\n } satisfies AgentEvent);\n this.activeAssistantItemId = null;\n }\n }\n\n private handleCommandExecution(\n item: CommandExecutionItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"Bash\",\n tool: { name: \"Bash\" },\n input: { command: item.command },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"Bash\",\n content: \"\",\n data: {\n stdout: item.aggregated_output,\n stderr: \"\",\n exitCode: item.exit_code,\n status: item.status,\n command: item.command,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"Bash\",\n } satisfies AgentEvent);\n }\n }\n\n private handleMcpToolCall(\n item: McpToolCallItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n const toolName = `mcp__${item.server}__${item.tool}`;\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: toolName,\n tool: { name: toolName },\n input: this.toObject(item.arguments),\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName,\n content: \"\",\n data: {\n status: item.status,\n content: item.result?.content,\n structuredContent: item.result?.structured_content,\n error: item.error?.message,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName,\n } satisfies AgentEvent);\n }\n }\n\n private handleFileChange(\n item: FileChangeItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"ApplyPatch\",\n tool: { name: \"ApplyPatch\" },\n input: { changes: item.changes },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"ApplyPatch\",\n content: \"\",\n data: { status: item.status, changes: item.changes },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"ApplyPatch\",\n } satisfies AgentEvent);\n }\n }\n\n private handleWebSearch(\n item: WebSearchItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"WebSearch\",\n tool: { name: \"WebSearch\" },\n input: { query: item.query },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"WebSearch\",\n content: \"\",\n data: { query: item.query, status: \"completed\" },\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"WebSearch\",\n } satisfies AgentEvent);\n }\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n private buildAssistantMessage(text: string): AgentMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n };\n }\n\n private toObject(value: unknown): Record<string, unknown> {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { arguments: value };\n }\n\n private classifyErrorMessage(message: string): AgentError {\n // Shared keyword buckets live in error-classifier.ts; codex layers its own\n // hint copy plus a provider-specific `config` (sandbox/approval) bucket.\n const generic = classifyGenericErrorMessage(message);\n if (generic) {\n const hint =\n generic.category === \"auth\"\n ? \"Check your OpenAI API key configuration in settings or environment.\"\n : generic.category === \"rate_limit\"\n ? \"Codex hit an OpenAI rate limit. Wait briefly and try again.\"\n : generic.category === \"model\"\n ? \"The selected Codex model is unavailable. Choose a different model.\"\n : \"A network error occurred while talking to Codex.\";\n return { message, category: generic.category, retryable: generic.retryable, hint };\n }\n const lower = message.toLowerCase();\n if (\n lower.includes(\"sandbox\") ||\n lower.includes(\"approval\") ||\n lower.includes(\"permission\") ||\n lower.includes(\"git repo\")\n ) {\n return {\n message,\n category: \"config\",\n retryable: false,\n hint: \"Check Codex sandbox, approval, and workspace configuration.\",\n };\n }\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"An unexpected Codex error occurred. Try the prompt again.\",\n };\n }\n}\n\n/**\n * `DriverTarget` wrapper for the codex driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`. The Codex SDK is lazy-imported inside\n * `start()` — this target export never pulls it at module top.\n */\nexport const codexDriverTarget: DriverTarget<AgentConfig> = {\n id: \"codex\",\n displayName: BUILTIN_DRIVER_CATALOG.codex?.name ?? \"OpenAI Codex\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new CodexDriver(config),\n listModels: async (apiKeys) =>\n new CodexDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,8 +1,9 @@
1
- import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-MNKUZUN2.js';
1
+ import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-DRXDEL3A.js';
2
2
  import '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ACWCVB5Q.js';
3
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
- import '../../chunk-JB35MVBN.js';
5
+ import '../../chunk-U5POE4BA.js';
6
+ import '../../chunk-7GOCNYUV.js';
6
7
  import '../../chunk-NSBPE2FW.js';
7
8
  import * as z from 'zod';
8
9
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/continue.ts"],"names":["text"],"mappings":"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","file":"continue.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed\n * by Continue Hub / `config.yaml` assistants.\n *\n * Unlike the other CLI drivers, `cn -p \"<prompt>\" --format json` emits a single\n * **final-result JSON wrapper**, not a streaming event log. This driver runs in\n * `mode: \"buffered\"`: the base accumulates all stdout and {@link handleBuffered}\n * parses it once on exit — so there are no incremental deltas or per-tool\n * events, only a final assistant message plus a result.\n *\n * @remarks\n * - Auth via `CONTINUE_API_KEY` / `cn login`; provider keys flow through the\n * environment and the selected `config.yaml`.\n * - `--config <slug>` selects the assistant; session resume via `--resume`\n * (last session only — Continue has no resume-by-id in headless mode).\n *\n * @see https://docs.continue.dev/guides/cli\n * @docLink packages/bridge/drivers#continue-driver\n */\nexport class ContinueDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"continue\");\n protected readonly defaultBin = \"cn\";\n protected readonly productName = \"Continue CLI\";\n protected readonly envPrefix = \"CONTINUE\";\n protected override readonly mode = \"buffered\" as const;\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"--format\", \"json\", \"--silent\"];\n const slug = this.config.model; // Continue selects assistants/models by config slug.\n if (slug) args.push(\"--config\", slug);\n if (resumeId) args.push(\"--resume\");\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"CONTINUE_API_KEY\"]);\n const key =\n this.config.apiKeys?.continue ??\n this.config.env?.CONTINUE_API_KEY ??\n process.env.CONTINUE_API_KEY;\n if (key) env.CONTINUE_API_KEY = key;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\";\n }\n\n protected handleBuffered(raw: string): void {\n const json = parseLastJsonObject(raw);\n if (!json) {\n // No structured wrapper — surface the raw stdout as the assistant reply.\n const text = raw.trim();\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({ summary: text || \"Task completed\" });\n return;\n }\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n const text = extractText(json) || (typeof json.output === \"string\" ? json.output : \"\");\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: text || \"Task completed\",\n });\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * Parse the last balanced top-level JSON object in `raw`. Continue may print\n * log lines before the final `--format json` blob; we want the wrapper, which\n * is the last `{...}` in the output.\n */\nfunction parseLastJsonObject(raw: string): any | null {\n const end = raw.lastIndexOf(\"}\");\n if (end < 0) return null;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = end; i >= 0; i--) {\n const ch = raw[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === \"}\") depth++;\n else if (ch === \"{\") {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(raw.slice(i, end + 1));\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * `DriverTarget` wrapper for the continue driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const continueDriverTarget: DriverTarget<AgentConfig> = {\n id: \"continue\",\n displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? \"Continue CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new ContinueDriver(config),\n};\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/continue.ts"],"names":["text"],"mappings":"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","file":"continue.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed\n * by Continue Hub / `config.yaml` assistants.\n *\n * Unlike the other CLI drivers, `cn -p \"<prompt>\" --format json` emits a single\n * **final-result JSON wrapper**, not a streaming event log. This driver runs in\n * `mode: \"buffered\"`: the base accumulates all stdout and {@link handleBuffered}\n * parses it once on exit — so there are no incremental deltas or per-tool\n * events, only a final assistant message plus a result.\n *\n * @remarks\n * - Auth via `CONTINUE_API_KEY` / `cn login`; provider keys flow through the\n * environment and the selected `config.yaml`.\n * - `--config <slug>` selects the assistant; session resume via `--resume`\n * (last session only — Continue has no resume-by-id in headless mode).\n *\n * @see https://docs.continue.dev/guides/cli\n * @docLink packages/bridge/drivers#continue-driver\n */\nexport class ContinueDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"continue\");\n protected readonly defaultBin = \"cn\";\n protected readonly productName = \"Continue CLI\";\n protected readonly envPrefix = \"CONTINUE\";\n protected override readonly mode = \"buffered\" as const;\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"--format\", \"json\", \"--silent\"];\n const slug = this.config.model; // Continue selects assistants/models by config slug.\n if (slug) args.push(\"--config\", slug);\n if (resumeId) args.push(\"--resume\");\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"CONTINUE_API_KEY\"]);\n const key =\n this.config.apiKeys?.continue ??\n this.config.env?.CONTINUE_API_KEY ??\n process.env.CONTINUE_API_KEY;\n if (key) env.CONTINUE_API_KEY = key;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\";\n }\n\n protected handleBuffered(raw: string): void {\n const json = parseLastJsonObject(raw);\n if (!json) {\n // No structured wrapper — surface the raw stdout as the assistant reply.\n const text = raw.trim();\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({ summary: text || \"Task completed\" });\n return;\n }\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n const text = extractText(json) || (typeof json.output === \"string\" ? json.output : \"\");\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: text || \"Task completed\",\n });\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * Parse the last balanced top-level JSON object in `raw`. Continue may print\n * log lines before the final `--format json` blob; we want the wrapper, which\n * is the last `{...}` in the output.\n */\nfunction parseLastJsonObject(raw: string): any | null {\n const end = raw.lastIndexOf(\"}\");\n if (end < 0) return null;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = end; i >= 0; i--) {\n const ch = raw[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === \"}\") depth++;\n else if (ch === \"{\") {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(raw.slice(i, end + 1));\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * `DriverTarget` wrapper for the continue driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const continueDriverTarget: DriverTarget<AgentConfig> = {\n id: \"continue\",\n displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? \"Continue CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new ContinueDriver(config),\n};\n"]}
@@ -1,7 +1,8 @@
1
1
  import { dispatchCapability } from '../../chunk-RRVQAE5D.js';
2
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ACWCVB5Q.js';
2
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
3
3
  import '../../chunk-6E6PKKAD.js';
4
- import '../../chunk-JB35MVBN.js';
4
+ import '../../chunk-U5POE4BA.js';
5
+ import '../../chunk-7GOCNYUV.js';
5
6
  import '../../chunk-NSBPE2FW.js';
6
7
  import * as z from 'zod';
7
8
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/flow-script.ts","../../../bridge/src/drivers/echo.ts"],"names":["events"],"mappings":"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","file":"echo.js","sourcesContent":["/**\n * Scripted-flow decision logic for the echo driver.\n *\n * Pure, deterministic policy that maps a live {@link FlowExecution} snapshot\n * (plus an optional per-node script) to the single next flow-adapter mutation\n * the driver should emit this iteration. The echo driver calls this in a loop\n * per turn (see `echo.ts`), executing each returned action against the\n * runner-injected {@link FlowTestDriverHook} until it yields (`null`) or emits\n * a turn-ending action.\n *\n * The policy mirrors what a real LLM orchestrator would do, but without an\n * LLM: it reacts to state each turn, so a host can drive a flow to `complete`,\n * park it at an approval/input gate, and exercise the reject/recover path\n * simply by applying host mutations (`applyApproval`, `applyInput`, …) between\n * turns. No new protocol, no flow-contract change — it only calls the existing\n * FlowAdapter agent-tool operations.\n *\n * @docLink packages/bridge/drivers#scripted-flow\n * @since 3.6.0\n */\n\nimport type { FlowExecution, NodeExecution } from \"@skaile/workspaces/types\";\n\n/**\n * What the scripted driver should do when a node reaches its decision point.\n *\n * - `auto` (default): follow the flow's `autonomousMode` — `complete_node`\n * when autonomous, else `request_approval`. A mandatory approval gate always\n * resolves to `request_approval`, even when autonomous (it cannot be skipped).\n * - `complete`: always `complete_node` (autonomous-style, even if the flow's\n * autonomousMode is false — the adapter allows it only when autonomous, so\n * use with autonomous flows).\n * - `approve`: always `request_approval` (park at an approval gate).\n * - `input`: `request_input` once; after the host applies input, fall back to\n * `auto` behaviour.\n * - `skip`: `skip_node` (optional nodes only).\n * - `fail`: `fail_node`. With `recoverable: false` (default) this is terminal.\n * With `recoverable: true` the node returns to `available`; the driver\n * re-emits the recoverable failure `failCount` times (default 1) and then\n * proceeds as `auto` — it never deadlocks on a recoverable fail.\n */\nexport type OnRun = \"auto\" | \"complete\" | \"approve\" | \"input\" | \"skip\" | \"fail\";\n\n/**\n * What to do when a node returns to `available` after a rejection.\n *\n * - `retry` (default): re-drive it — `start_node` again, then its `onRun`.\n * - `fail`: `fail_node(recoverable: false)` — exercises the terminal path.\n */\nexport type OnReject = \"retry\" | \"fail\";\n\n/** Per-node scripting directive. All fields optional. */\nexport interface FlowNodeDirective {\n onRun?: OnRun;\n onReject?: OnReject;\n /** For `onRun: \"input\"` — the input request shown to the host. */\n input?: { prompt?: string; schema?: unknown };\n /** For `onRun: \"fail\"` — whether the failure is recoverable. Default false. */\n recoverable?: boolean;\n /**\n * For `onRun: \"fail\"` with `recoverable: true` — how many recoverable\n * failures to emit before the node proceeds as `auto`. Default 1. Counted\n * from the node's own `errorHistory`, so the policy stays a pure function of\n * state (no driver-instance bookkeeping) and never deadlocks.\n */\n failCount?: number;\n /** Summary text used for `complete_node` / `request_approval` / failures. */\n summary?: string;\n}\n\n/**\n * A scripted-flow program. Empty (`{}`) means \"canonical policy\": start each\n * available node, then complete (autonomous) or request approval (interactive)\n * — enough to drive the autonomous-complete, approval-gate, and reject/recover\n * scenarios with no per-node scripting at all.\n */\nexport interface FlowScript {\n /** Per-node overrides, keyed by node id. */\n nodes?: Record<string, FlowNodeDirective>;\n /** Fallback directive for any node without its own entry. */\n default?: FlowNodeDirective;\n}\n\n/** A single flow-adapter mutation the driver will execute. */\nexport type FlowAction =\n | { op: \"start_node\"; nodeId: string }\n | { op: \"complete_node\"; nodeId: string; summary: string }\n | { op: \"request_approval\"; nodeId: string; summary: string }\n | { op: \"request_input\"; nodeId: string; prompt: string; schema: string }\n | { op: \"skip_node\"; nodeId: string }\n | { op: \"fail_node\"; nodeId: string; message: string; recoverable: boolean };\n\n/** Ops that end the agent turn (the runner yields until the host acts). */\nconst TURN_ENDING: ReadonlySet<FlowAction[\"op\"]> = new Set([\n \"request_approval\",\n \"request_input\",\n \"fail_node\",\n]);\n\n/** Whether an action ends the turn (driver stops looping after emitting it). */\nexport function isTurnEnding(action: FlowAction): boolean {\n return TURN_ENDING.has(action.op);\n}\n\n/** Map a {@link FlowAction} to the `executeOp` argument bag the adapter expects. */\nexport function actionArgs(action: FlowAction): Record<string, unknown> {\n switch (action.op) {\n case \"start_node\":\n case \"skip_node\":\n return { nodeId: action.nodeId };\n case \"complete_node\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_approval\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_input\":\n return { nodeId: action.nodeId, prompt: action.prompt, schema: action.schema };\n case \"fail_node\":\n return {\n nodeId: action.nodeId,\n message: action.message,\n recoverable: String(action.recoverable),\n };\n }\n}\n\nfunction summaryFor(d: FlowNodeDirective, n: NodeExecution): string {\n return d.summary ?? `Scripted output for ${n.id}`;\n}\n\n/**\n * Decide the single next flow action for the current state, or `null` to yield\n * (nothing to do this iteration — wait for a host mutation).\n *\n * Priority order: resolve approved gates → advance running nodes → start (or\n * skip / terminally-fail) available nodes. Terminal flow states and gates with\n * no decision / input yet yield.\n *\n * Pure — the fail bookkeeping (how many recoverable failures a node has already\n * emitted) is read from the node's own `errorHistory`, so no external counter is\n * needed and a recoverable `fail` directive can never deadlock.\n */\nexport function decideFlowAction(\n state: FlowExecution,\n script: FlowScript,\n mandatoryGates: ReadonlySet<string> = new Set(),\n): FlowAction | null {\n // Terminal flow — never fight a completed/failed/cancelled run.\n if (state.status === \"complete\" || state.status === \"failed\" || state.status === \"cancelled\") {\n return null;\n }\n\n const dir = (id: string): FlowNodeDirective => script.nodes?.[id] ?? script.default ?? {};\n const nodes = Object.values(state.nodes);\n // A mandatory gate can never auto-complete — `auto` resolves to `approve`\n // regardless of autonomousMode so the host can drive it deterministically.\n const canAutoComplete = (id: string): boolean => state.autonomousMode && !mandatoryGates.has(id);\n\n // 1. Approved gate → complete.\n for (const n of nodes) {\n if (n.status === \"awaiting_approval\" && n.approval?.decision === \"approved\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(dir(n.id), n) };\n }\n }\n\n // 2. Running node → per directive.\n for (const n of nodes) {\n if (n.status !== \"running\") continue;\n const d = dir(n.id);\n const onRun: OnRun = d.onRun ?? \"auto\";\n const resolved: OnRun =\n onRun === \"auto\" ? (canAutoComplete(n.id) ? \"complete\" : \"approve\") : onRun;\n\n if (resolved === \"complete\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"approve\") {\n return { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"input\") {\n const lastInput = n.inputHistory[n.inputHistory.length - 1];\n if (lastInput && lastInput.response !== undefined) {\n // Input already provided — proceed as if `auto`.\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n return {\n op: \"request_input\",\n nodeId: n.id,\n prompt: d.input?.prompt ?? `Provide input for ${n.id}`,\n schema: JSON.stringify(d.input?.schema ?? { kind: \"text\" }),\n };\n }\n if (resolved === \"fail\") {\n const recoverable = d.recoverable ?? false;\n if (!recoverable) {\n // Terminal fail — the adapter marks node + flow `failed`, so the\n // terminal-status guard above stops any re-fire on later turns.\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted failure for ${n.id}`,\n recoverable: false,\n };\n }\n // Recoverable fail — emit up to `failCount` times (counting the node's\n // own recorded recoverable errors), then proceed as `auto` so the node\n // is not stranded in a re-drive loop.\n const emitted = n.errorHistory.filter((e) => e.recoverable).length;\n const failCount = Math.max(1, d.failCount ?? 1);\n if (emitted < failCount) {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted recoverable failure for ${n.id}`,\n recoverable: true,\n };\n }\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n // `skip` while running is illegal; complete instead to avoid a deadlock.\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n\n // 3. Available node → terminally-fail (post-reject), skip, or start.\n for (const n of nodes) {\n if (n.status !== \"available\") continue;\n const d = dir(n.id);\n const lastApproval = n.approvalHistory[n.approvalHistory.length - 1];\n if (lastApproval?.decision === \"rejected\" && d.onReject === \"fail\") {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Rejected and not recoverable: ${n.id}`,\n recoverable: false,\n };\n }\n if (d.onRun === \"skip\") {\n return { op: \"skip_node\", nodeId: n.id };\n }\n return { op: \"start_node\", nodeId: n.id };\n }\n\n // 4. Nothing actionable — awaiting_approval (no decision), awaiting_input\n // (no response), or fully drained. Yield.\n return null;\n}\n\n/**\n * Parse a `[test-flow]` sentinel body into a {@link FlowScript}. An empty body\n * yields the canonical (empty) script. Malformed JSON is a hard error so tests\n * fail loudly rather than silently running the wrong policy.\n */\nexport function parseFlowScript(body: string): FlowScript {\n const trimmed = body.trim();\n if (trimmed.length === 0) return {};\n const parsed: unknown = JSON.parse(trimmed);\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"flow script must be a JSON object\");\n }\n return parsed as FlowScript;\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentEvent,\n type BridgeCapabilityTool,\n type DriverInfo,\n} from \"../types.js\";\nimport {\n actionArgs,\n type FlowScript,\n decideFlowAction,\n isTurnEnding,\n parseFlowScript,\n} from \"./flow-script.js\";\n\n/**\n * Echo/mock driver for E2E testing in docker mode.\n *\n * Runs inside a real Docker container with real WebSocket transport and\n * session lifecycle, but generates deterministic keyword-triggered responses\n * instead of calling the Anthropic API. This lets E2E tests exercise the\n * full infrastructure (containers, WebSocket, session management, message\n * persistence) without needing real AI credentials.\n *\n * Keyword triggers match the MockAgentClient in\n * `platform/backend/libs/agent-gateway/src/mock-agent-client.ts` — the\n * same test messages (\"test toolcall\", \"test question\", etc.) produce\n * the same events.\n *\n * Enable by setting `SKAILE_AGENT_DRIVER=echo` in the container env,\n * or by passing `{ driver: 'echo' }` in the runner config.\n *\n * @docLink packages/bridge/drivers#echo-driver\n */\nexport class EchoDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n private readonly log: Logger = getBridgeLogger(\"echo\");\n private running = false;\n private readonly config: AgentConfig;\n\n /**\n * Scripted-flow mode state (workspaces#396). Enabled by a `[test-flow]`\n * sentinel chat message; once on, orchestrator-prompt turns are driven\n * deterministically against `config.flowTestDriver`. `null` script ⇒ mode\n * off (default echo behaviour, unchanged).\n */\n private flowScript: FlowScript | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Test surface: returns the tool list the LLM would see for this turn.\n * Composition: the registry hooks (Protocol v2) take precedence; legacy\n * `mcpServers` is not enumerated here (the echo driver never exposed MCP\n * tools to the LLM by name).\n */\n listCapabilityTools(): BridgeCapabilityTool[] {\n return this.config.capabilities?.composeTools() ?? [];\n }\n\n /**\n * Test surface: invoke a registered capability through the dispatch\n * helper. Mirrors what a real driver would do when the LLM produced a\n * tool_use for the given name — applies fire-and-forget, render emission,\n * and fallback text. Returns the structured dispatch result so tests can\n * assert immediate-vs-background resolution.\n */\n async invokeCapabilityForTest(\n name: string,\n input: unknown,\n ): Promise<{ result: unknown; background: boolean }> {\n const hooks = this.config.capabilities;\n if (!hooks) throw new Error(\"EchoDriver: no capability hooks configured\");\n const callId = `echo-cap-${Date.now()}`;\n const out = await dispatchCapability(hooks, callId, name, input, (err) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n error: String(err),\n }),\n );\n return out;\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.log.info(\"driver started\");\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.running) return;\n const content = message.toLowerCase();\n this.log.info(\"received prompt\", { preview: message.slice(0, 80), length: message.length });\n\n // Small delay to simulate real agent processing\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Scripted-flow test seam (workspaces#396) — a `[test-flow]` sentinel\n // arms deterministic flow driving for this session and (optionally)\n // carries a JSON script. Format: `[test-flow] {json}`; empty body ⇒\n // canonical policy. Must be handled before the flow-turn branch below.\n //\n // Detection is LINE-anchored, not message-anchored (workspaces#401): hosts\n // decorate user messages (e.g. a prepended `<SESSION_MEMBERS>` block and a\n // wake-restoration preamble), so the sentinel is rarely at the start of the\n // composed prompt. We match `[test-flow]` at the start of ANY line (only\n // leading whitespace allowed), which is decoration-independent yet still\n // impossible to arm from ordinary prose — a line must BEGIN with the exact\n // token. The optional JSON script must sit on that same line.\n const flowMatch = /^[ \\t]*\\[test-flow\\][ \\t]*(.*)$/m.exec(message);\n if (flowMatch) {\n let summary: string;\n try {\n this.flowScript = parseFlowScript(flowMatch[1] ?? \"\");\n summary = \"echo[test-flow]: scripted-flow mode armed\";\n } catch (err) {\n this.flowScript = null;\n summary = `echo[test-flow]: invalid script — ${err instanceof Error ? err.message : String(err)}`;\n this.emit(\"agent-event\", { type: \"error\", error: summary, fatal: false });\n }\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n // Scripted-flow turn — the runner reassembles the orchestrator prompt on\n // every flow turn; when scripted-flow mode is armed and a flow driver hook\n // is present, drive nodes deterministically instead of echoing text.\n if (this.flowScript && this.config.flowTestDriver && isFlowTurn(message)) {\n await this.runScriptedFlowTurn();\n return;\n }\n\n // Phase 7B test seam — explicit capability invocation keyword. Lets E2E\n // tests drive `dispatchCapability` from a chat prompt without a real LLM.\n // Format: `[test-cap:<name>] {json}`. Anything after the closing bracket\n // is parsed as JSON input; on parse error we fall back to `{}`.\n const capMatch = /^\\s*\\[test-cap:([\\w.\\-_]+)\\]\\s*(.*)$/s.exec(message);\n if (capMatch) {\n const name = capMatch[1] ?? \"\";\n const rawInput = (capMatch[2] ?? \"\").trim();\n let input: unknown = {};\n if (rawInput.length > 0) {\n try {\n input = JSON.parse(rawInput);\n } catch (err) {\n this.log.warn(\"test-cap input was not valid JSON; defaulting to {}\", {\n error: String(err),\n preview: rawInput.slice(0, 80),\n });\n }\n }\n const events = await this.runCapabilityKeyword(name, input);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const events = buildEchoEvents(content, message);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n // Small gap between events to let the transport process each one\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n // Signal turn completion — the runner waits for this before accepting\n // the next prompt. Without it, the runner stays stuck after the first message.\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n /**\n * Phase 7B helper — drive a single capability through the dispatcher and\n * surface the structured outcome as a result event the LLM-side test code\n * can assert against. Used exclusively by the `[test-cap:<name>]` prompt\n * keyword above; never wired into normal chat flow.\n */\n private async runCapabilityKeyword(name: string, input: unknown): Promise<AgentEvent[]> {\n const events: AgentEvent[] = [];\n if (!this.config.capabilities) {\n return textAndResult(`echo[test-cap]: no capability hooks configured (skipping ${name})`);\n }\n try {\n const out = await this.invokeCapabilityForTest(name, input);\n const summary = `echo[test-cap]: invoked ${name} background=${String(out.background)} result=${safeStringify(out.result)}`;\n events.push(...textAndResult(summary));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n events.push({\n type: \"error\",\n error: `echo[test-cap]: ${name} failed: ${msg}`,\n fatal: false,\n });\n events.push(...textAndResult(`echo[test-cap]: ${name} errored (${msg})`));\n }\n return events;\n }\n\n /**\n * Scripted-flow turn (workspaces#396). Reads the live flow state via the\n * runner-injected `flowTestDriver` hook and executes the scripted next\n * action(s) until the policy yields or emits a turn-ending action. Each\n * mutation fires the adapter's `onChange` (→ host `state_changed`) and, when\n * the runner wires the stimulus bus, queues the follow-up turn — so the\n * driver advances one step at a time exactly like a real LLM orchestrator.\n */\n private async runScriptedFlowTurn(): Promise<void> {\n const hook = this.config.flowTestDriver;\n const script = this.flowScript;\n if (!hook || !script) {\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const executed: string[] = [];\n // Hard cap — the policy is monotonic, but never let a bug spin forever.\n const MAX_STEPS = 200;\n for (let i = 0; i < MAX_STEPS; i++) {\n const state = hook.getState();\n if (!state) break;\n const mandatoryGates = new Set(hook.mandatoryGates?.() ?? []);\n const action = decideFlowAction(state, script, mandatoryGates);\n if (!action) break;\n\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: action.op,\n tool: { name: action.op },\n input: action.nodeId,\n });\n try {\n await hook.execute(action.op, actionArgs(action));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.log.warn(\"scripted flow op failed\", {\n op: action.op,\n nodeId: action.nodeId,\n error: msg,\n });\n this.emit(\"agent-event\", {\n type: \"error\",\n error: `echo[test-flow]: ${action.op}(${action.nodeId}) failed: ${msg}`,\n fatal: false,\n });\n break;\n }\n this.emit(\"agent-event\", { type: \"tool_execution_end\", toolName: action.op });\n executed.push(`${action.op}(${action.nodeId})`);\n if (isTurnEnding(action)) break;\n }\n\n const summary =\n executed.length > 0\n ? `echo[test-flow]: ${executed.join(\" → \")}`\n : \"echo[test-flow]: no action (yielding to host)\";\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n async abort(): Promise<void> {\n this.log.info(\"abort requested\");\n }\n\n kill(): void {\n this.running = false;\n this.log.info(\"killed\");\n }\n\n async resetSession(): Promise<void> {\n this.log.info(\"session reset\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Echo response generation — mirrors MockAgentClient.buildMockEvents\n// ---------------------------------------------------------------------------\n\n/**\n * A flow turn is recognised by the orchestrator prompt's stable header\n * (`buildOrchestratorPrompt` in the flow connector). Detection is header-only —\n * the driver reads live state through the injected hook, never by parsing the\n * prompt body.\n */\nfunction isFlowTurn(message: string): boolean {\n return message.startsWith(\"# Flow Execution Context\");\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction textAndResult(summary: string): AgentEvent[] {\n return [\n {\n type: \"message_start\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"message_end\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"result\",\n subtype: \"success\",\n summary,\n costUsd: 0,\n },\n ];\n}\n\nfunction buildEchoEvents(content: string, originalPrompt: string): AgentEvent[] {\n const events: AgentEvent[] = [];\n\n if (content.includes(\"test all\")) {\n events.push(\n { type: \"tool_call\", name: \"Read\", tool: { name: \"Read\" }, input: \"prisma/schema.prisma\" },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n {\n type: \"tool_call\",\n name: \"Write\",\n tool: { name: \"Write\" },\n input: \"src/modules/sprint/sprint.service.ts\",\n },\n { type: \"tool_execution_end\", toolName: \"Write\" },\n );\n events.push(\n ...textAndResult(\n \"All operations completed successfully. Created sprint service, updated schema, started dev server, and ran E2E tests.\",\n ),\n );\n } else if (content.includes(\"test toolcall\")) {\n events.push(\n {\n type: \"tool_call\",\n name: \"Read\",\n tool: { name: \"Read\" },\n input: \"platform/prisma/schema.prisma\",\n },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n );\n events.push(\n ...textAndResult(\n \"I've read the schema and found 42 models. The data model looks well-structured.\",\n ),\n );\n } else if (content.includes(\"test question\")) {\n // Emit a message that asks the user a question (the runner normalizer\n // converts this to a `question` AgentEvent for the transport layer)\n events.push(\n ...textAndResult(\n \"The blueprint calls for a relational database. Which engine should I target? \" +\n \"This will affect the Prisma provider, Docker Compose setup, and the connection string.\\n\\n\" +\n \"Options: PostgreSQL, MySQL, SQLite\",\n ),\n );\n } else if (content.includes(\"test error\")) {\n events.push({\n type: \"error\",\n error:\n \"AI provider returned HTTP 429 — rate limit exceeded. The request will be retried automatically in 35 seconds.\",\n fatal: false,\n });\n } else if (content.includes(\"test fatal\")) {\n events.push({\n type: \"error\",\n error:\n \"Session agent was killed by the container runtime (OOM — memory limit 2 GB exceeded). The session cannot continue.\",\n fatal: true,\n });\n } else {\n // Default echo response\n const summary =\n `I received your message: \"${originalPrompt}\". I'm the Skaile AI assistant running in echo mode. ` +\n `This is a deterministic mock response for E2E testing.`;\n events.push(...textAndResult(summary));\n }\n\n return events;\n}\n\n/**\n * `DriverTarget` wrapper for the echo driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const echoDriverTarget: DriverTarget<AgentConfig> = {\n id: \"echo\",\n displayName: BUILTIN_DRIVER_CATALOG.echo?.name ?? \"Echo (E2E mock)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new EchoDriver(config),\n listModels: async (apiKeys) =>\n new EchoDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/flow-script.ts","../../../bridge/src/drivers/echo.ts"],"names":["events"],"mappings":"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","file":"echo.js","sourcesContent":["/**\n * Scripted-flow decision logic for the echo driver.\n *\n * Pure, deterministic policy that maps a live {@link FlowExecution} snapshot\n * (plus an optional per-node script) to the single next flow-adapter mutation\n * the driver should emit this iteration. The echo driver calls this in a loop\n * per turn (see `echo.ts`), executing each returned action against the\n * runner-injected {@link FlowTestDriverHook} until it yields (`null`) or emits\n * a turn-ending action.\n *\n * The policy mirrors what a real LLM orchestrator would do, but without an\n * LLM: it reacts to state each turn, so a host can drive a flow to `complete`,\n * park it at an approval/input gate, and exercise the reject/recover path\n * simply by applying host mutations (`applyApproval`, `applyInput`, …) between\n * turns. No new protocol, no flow-contract change — it only calls the existing\n * FlowAdapter agent-tool operations.\n *\n * @docLink packages/bridge/drivers#scripted-flow\n * @since 3.6.0\n */\n\nimport type { FlowExecution, NodeExecution } from \"@skaile/workspaces/types\";\n\n/**\n * What the scripted driver should do when a node reaches its decision point.\n *\n * - `auto` (default): follow the flow's `autonomousMode` — `complete_node`\n * when autonomous, else `request_approval`. A mandatory approval gate always\n * resolves to `request_approval`, even when autonomous (it cannot be skipped).\n * - `complete`: always `complete_node` (autonomous-style, even if the flow's\n * autonomousMode is false — the adapter allows it only when autonomous, so\n * use with autonomous flows).\n * - `approve`: always `request_approval` (park at an approval gate).\n * - `input`: `request_input` once; after the host applies input, fall back to\n * `auto` behaviour.\n * - `skip`: `skip_node` (optional nodes only).\n * - `fail`: `fail_node`. With `recoverable: false` (default) this is terminal.\n * With `recoverable: true` the node returns to `available`; the driver\n * re-emits the recoverable failure `failCount` times (default 1) and then\n * proceeds as `auto` — it never deadlocks on a recoverable fail.\n */\nexport type OnRun = \"auto\" | \"complete\" | \"approve\" | \"input\" | \"skip\" | \"fail\";\n\n/**\n * What to do when a node returns to `available` after a rejection.\n *\n * - `retry` (default): re-drive it — `start_node` again, then its `onRun`.\n * - `fail`: `fail_node(recoverable: false)` — exercises the terminal path.\n */\nexport type OnReject = \"retry\" | \"fail\";\n\n/** Per-node scripting directive. All fields optional. */\nexport interface FlowNodeDirective {\n onRun?: OnRun;\n onReject?: OnReject;\n /** For `onRun: \"input\"` — the input request shown to the host. */\n input?: { prompt?: string; schema?: unknown };\n /** For `onRun: \"fail\"` — whether the failure is recoverable. Default false. */\n recoverable?: boolean;\n /**\n * For `onRun: \"fail\"` with `recoverable: true` — how many recoverable\n * failures to emit before the node proceeds as `auto`. Default 1. Counted\n * from the node's own `errorHistory`, so the policy stays a pure function of\n * state (no driver-instance bookkeeping) and never deadlocks.\n */\n failCount?: number;\n /** Summary text used for `complete_node` / `request_approval` / failures. */\n summary?: string;\n}\n\n/**\n * A scripted-flow program. Empty (`{}`) means \"canonical policy\": start each\n * available node, then complete (autonomous) or request approval (interactive)\n * — enough to drive the autonomous-complete, approval-gate, and reject/recover\n * scenarios with no per-node scripting at all.\n */\nexport interface FlowScript {\n /** Per-node overrides, keyed by node id. */\n nodes?: Record<string, FlowNodeDirective>;\n /** Fallback directive for any node without its own entry. */\n default?: FlowNodeDirective;\n}\n\n/** A single flow-adapter mutation the driver will execute. */\nexport type FlowAction =\n | { op: \"start_node\"; nodeId: string }\n | { op: \"complete_node\"; nodeId: string; summary: string }\n | { op: \"request_approval\"; nodeId: string; summary: string }\n | { op: \"request_input\"; nodeId: string; prompt: string; schema: string }\n | { op: \"skip_node\"; nodeId: string }\n | { op: \"fail_node\"; nodeId: string; message: string; recoverable: boolean };\n\n/** Ops that end the agent turn (the runner yields until the host acts). */\nconst TURN_ENDING: ReadonlySet<FlowAction[\"op\"]> = new Set([\n \"request_approval\",\n \"request_input\",\n \"fail_node\",\n]);\n\n/** Whether an action ends the turn (driver stops looping after emitting it). */\nexport function isTurnEnding(action: FlowAction): boolean {\n return TURN_ENDING.has(action.op);\n}\n\n/** Map a {@link FlowAction} to the `executeOp` argument bag the adapter expects. */\nexport function actionArgs(action: FlowAction): Record<string, unknown> {\n switch (action.op) {\n case \"start_node\":\n case \"skip_node\":\n return { nodeId: action.nodeId };\n case \"complete_node\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_approval\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_input\":\n return { nodeId: action.nodeId, prompt: action.prompt, schema: action.schema };\n case \"fail_node\":\n return {\n nodeId: action.nodeId,\n message: action.message,\n recoverable: String(action.recoverable),\n };\n }\n}\n\nfunction summaryFor(d: FlowNodeDirective, n: NodeExecution): string {\n return d.summary ?? `Scripted output for ${n.id}`;\n}\n\n/**\n * Decide the single next flow action for the current state, or `null` to yield\n * (nothing to do this iteration — wait for a host mutation).\n *\n * Priority order: resolve approved gates → advance running nodes → start (or\n * skip / terminally-fail) available nodes. Terminal flow states and gates with\n * no decision / input yet yield.\n *\n * Pure — the fail bookkeeping (how many recoverable failures a node has already\n * emitted) is read from the node's own `errorHistory`, so no external counter is\n * needed and a recoverable `fail` directive can never deadlock.\n */\nexport function decideFlowAction(\n state: FlowExecution,\n script: FlowScript,\n mandatoryGates: ReadonlySet<string> = new Set(),\n): FlowAction | null {\n // Terminal flow — never fight a completed/failed/cancelled run.\n if (state.status === \"complete\" || state.status === \"failed\" || state.status === \"cancelled\") {\n return null;\n }\n\n const dir = (id: string): FlowNodeDirective => script.nodes?.[id] ?? script.default ?? {};\n const nodes = Object.values(state.nodes);\n // A mandatory gate can never auto-complete — `auto` resolves to `approve`\n // regardless of autonomousMode so the host can drive it deterministically.\n const canAutoComplete = (id: string): boolean => state.autonomousMode && !mandatoryGates.has(id);\n\n // 1. Approved gate → complete.\n for (const n of nodes) {\n if (n.status === \"awaiting_approval\" && n.approval?.decision === \"approved\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(dir(n.id), n) };\n }\n }\n\n // 2. Running node → per directive.\n for (const n of nodes) {\n if (n.status !== \"running\") continue;\n const d = dir(n.id);\n const onRun: OnRun = d.onRun ?? \"auto\";\n const resolved: OnRun =\n onRun === \"auto\" ? (canAutoComplete(n.id) ? \"complete\" : \"approve\") : onRun;\n\n if (resolved === \"complete\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"approve\") {\n return { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"input\") {\n const lastInput = n.inputHistory[n.inputHistory.length - 1];\n if (lastInput && lastInput.response !== undefined) {\n // Input already provided — proceed as if `auto`.\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n return {\n op: \"request_input\",\n nodeId: n.id,\n prompt: d.input?.prompt ?? `Provide input for ${n.id}`,\n schema: JSON.stringify(d.input?.schema ?? { kind: \"text\" }),\n };\n }\n if (resolved === \"fail\") {\n const recoverable = d.recoverable ?? false;\n if (!recoverable) {\n // Terminal fail — the adapter marks node + flow `failed`, so the\n // terminal-status guard above stops any re-fire on later turns.\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted failure for ${n.id}`,\n recoverable: false,\n };\n }\n // Recoverable fail — emit up to `failCount` times (counting the node's\n // own recorded recoverable errors), then proceed as `auto` so the node\n // is not stranded in a re-drive loop.\n const emitted = n.errorHistory.filter((e) => e.recoverable).length;\n const failCount = Math.max(1, d.failCount ?? 1);\n if (emitted < failCount) {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted recoverable failure for ${n.id}`,\n recoverable: true,\n };\n }\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n // `skip` while running is illegal; complete instead to avoid a deadlock.\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n\n // 3. Available node → terminally-fail (post-reject), skip, or start.\n for (const n of nodes) {\n if (n.status !== \"available\") continue;\n const d = dir(n.id);\n const lastApproval = n.approvalHistory[n.approvalHistory.length - 1];\n if (lastApproval?.decision === \"rejected\" && d.onReject === \"fail\") {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Rejected and not recoverable: ${n.id}`,\n recoverable: false,\n };\n }\n if (d.onRun === \"skip\") {\n return { op: \"skip_node\", nodeId: n.id };\n }\n return { op: \"start_node\", nodeId: n.id };\n }\n\n // 4. Nothing actionable — awaiting_approval (no decision), awaiting_input\n // (no response), or fully drained. Yield.\n return null;\n}\n\n/**\n * Parse a `[test-flow]` sentinel body into a {@link FlowScript}. An empty body\n * yields the canonical (empty) script. Malformed JSON is a hard error so tests\n * fail loudly rather than silently running the wrong policy.\n */\nexport function parseFlowScript(body: string): FlowScript {\n const trimmed = body.trim();\n if (trimmed.length === 0) return {};\n const parsed: unknown = JSON.parse(trimmed);\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"flow script must be a JSON object\");\n }\n return parsed as FlowScript;\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentEvent,\n type BridgeCapabilityTool,\n type DriverInfo,\n} from \"../types.js\";\nimport {\n actionArgs,\n type FlowScript,\n decideFlowAction,\n isTurnEnding,\n parseFlowScript,\n} from \"./flow-script.js\";\n\n/**\n * Echo/mock driver for E2E testing in docker mode.\n *\n * Runs inside a real Docker container with real WebSocket transport and\n * session lifecycle, but generates deterministic keyword-triggered responses\n * instead of calling the Anthropic API. This lets E2E tests exercise the\n * full infrastructure (containers, WebSocket, session management, message\n * persistence) without needing real AI credentials.\n *\n * Keyword triggers match the MockAgentClient in\n * `platform/backend/libs/agent-gateway/src/mock-agent-client.ts` — the\n * same test messages (\"test toolcall\", \"test question\", etc.) produce\n * the same events.\n *\n * Enable by setting `SKAILE_AGENT_DRIVER=echo` in the container env,\n * or by passing `{ driver: 'echo' }` in the runner config.\n *\n * @docLink packages/bridge/drivers#echo-driver\n */\nexport class EchoDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n private readonly log: Logger = getBridgeLogger(\"echo\");\n private running = false;\n private readonly config: AgentConfig;\n\n /**\n * Scripted-flow mode state (workspaces#396). Enabled by a `[test-flow]`\n * sentinel chat message; once on, orchestrator-prompt turns are driven\n * deterministically against `config.flowTestDriver`. `null` script ⇒ mode\n * off (default echo behaviour, unchanged).\n */\n private flowScript: FlowScript | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Test surface: returns the tool list the LLM would see for this turn.\n * Composition: the registry hooks (Protocol v2) take precedence; legacy\n * `mcpServers` is not enumerated here (the echo driver never exposed MCP\n * tools to the LLM by name).\n */\n listCapabilityTools(): BridgeCapabilityTool[] {\n return this.config.capabilities?.composeTools() ?? [];\n }\n\n /**\n * Test surface: invoke a registered capability through the dispatch\n * helper. Mirrors what a real driver would do when the LLM produced a\n * tool_use for the given name — applies fire-and-forget, render emission,\n * and fallback text. Returns the structured dispatch result so tests can\n * assert immediate-vs-background resolution.\n */\n async invokeCapabilityForTest(\n name: string,\n input: unknown,\n ): Promise<{ result: unknown; background: boolean }> {\n const hooks = this.config.capabilities;\n if (!hooks) throw new Error(\"EchoDriver: no capability hooks configured\");\n const callId = `echo-cap-${Date.now()}`;\n const out = await dispatchCapability(hooks, callId, name, input, (err) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n error: String(err),\n }),\n );\n return out;\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.log.info(\"driver started\");\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.running) return;\n const content = message.toLowerCase();\n this.log.info(\"received prompt\", { preview: message.slice(0, 80), length: message.length });\n\n // Small delay to simulate real agent processing\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Scripted-flow test seam (workspaces#396) — a `[test-flow]` sentinel\n // arms deterministic flow driving for this session and (optionally)\n // carries a JSON script. Format: `[test-flow] {json}`; empty body ⇒\n // canonical policy. Must be handled before the flow-turn branch below.\n //\n // Detection is LINE-anchored, not message-anchored (workspaces#401): hosts\n // decorate user messages (e.g. a prepended `<SESSION_MEMBERS>` block and a\n // wake-restoration preamble), so the sentinel is rarely at the start of the\n // composed prompt. We match `[test-flow]` at the start of ANY line (only\n // leading whitespace allowed), which is decoration-independent yet still\n // impossible to arm from ordinary prose — a line must BEGIN with the exact\n // token. The optional JSON script must sit on that same line.\n const flowMatch = /^[ \\t]*\\[test-flow\\][ \\t]*(.*)$/m.exec(message);\n if (flowMatch) {\n let summary: string;\n try {\n this.flowScript = parseFlowScript(flowMatch[1] ?? \"\");\n summary = \"echo[test-flow]: scripted-flow mode armed\";\n } catch (err) {\n this.flowScript = null;\n summary = `echo[test-flow]: invalid script — ${err instanceof Error ? err.message : String(err)}`;\n this.emit(\"agent-event\", { type: \"error\", error: summary, fatal: false });\n }\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n // Scripted-flow turn — the runner reassembles the orchestrator prompt on\n // every flow turn; when scripted-flow mode is armed and a flow driver hook\n // is present, drive nodes deterministically instead of echoing text.\n if (this.flowScript && this.config.flowTestDriver && isFlowTurn(message)) {\n await this.runScriptedFlowTurn();\n return;\n }\n\n // Phase 7B test seam — explicit capability invocation keyword. Lets E2E\n // tests drive `dispatchCapability` from a chat prompt without a real LLM.\n // Format: `[test-cap:<name>] {json}`. Anything after the closing bracket\n // is parsed as JSON input; on parse error we fall back to `{}`.\n const capMatch = /^\\s*\\[test-cap:([\\w.\\-_]+)\\]\\s*(.*)$/s.exec(message);\n if (capMatch) {\n const name = capMatch[1] ?? \"\";\n const rawInput = (capMatch[2] ?? \"\").trim();\n let input: unknown = {};\n if (rawInput.length > 0) {\n try {\n input = JSON.parse(rawInput);\n } catch (err) {\n this.log.warn(\"test-cap input was not valid JSON; defaulting to {}\", {\n error: String(err),\n preview: rawInput.slice(0, 80),\n });\n }\n }\n const events = await this.runCapabilityKeyword(name, input);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const events = buildEchoEvents(content, message);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n // Small gap between events to let the transport process each one\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n // Signal turn completion — the runner waits for this before accepting\n // the next prompt. Without it, the runner stays stuck after the first message.\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n /**\n * Phase 7B helper — drive a single capability through the dispatcher and\n * surface the structured outcome as a result event the LLM-side test code\n * can assert against. Used exclusively by the `[test-cap:<name>]` prompt\n * keyword above; never wired into normal chat flow.\n */\n private async runCapabilityKeyword(name: string, input: unknown): Promise<AgentEvent[]> {\n const events: AgentEvent[] = [];\n if (!this.config.capabilities) {\n return textAndResult(`echo[test-cap]: no capability hooks configured (skipping ${name})`);\n }\n try {\n const out = await this.invokeCapabilityForTest(name, input);\n const summary = `echo[test-cap]: invoked ${name} background=${String(out.background)} result=${safeStringify(out.result)}`;\n events.push(...textAndResult(summary));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n events.push({\n type: \"error\",\n error: `echo[test-cap]: ${name} failed: ${msg}`,\n fatal: false,\n });\n events.push(...textAndResult(`echo[test-cap]: ${name} errored (${msg})`));\n }\n return events;\n }\n\n /**\n * Scripted-flow turn (workspaces#396). Reads the live flow state via the\n * runner-injected `flowTestDriver` hook and executes the scripted next\n * action(s) until the policy yields or emits a turn-ending action. Each\n * mutation fires the adapter's `onChange` (→ host `state_changed`) and, when\n * the runner wires the stimulus bus, queues the follow-up turn — so the\n * driver advances one step at a time exactly like a real LLM orchestrator.\n */\n private async runScriptedFlowTurn(): Promise<void> {\n const hook = this.config.flowTestDriver;\n const script = this.flowScript;\n if (!hook || !script) {\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const executed: string[] = [];\n // Hard cap — the policy is monotonic, but never let a bug spin forever.\n const MAX_STEPS = 200;\n for (let i = 0; i < MAX_STEPS; i++) {\n const state = hook.getState();\n if (!state) break;\n const mandatoryGates = new Set(hook.mandatoryGates?.() ?? []);\n const action = decideFlowAction(state, script, mandatoryGates);\n if (!action) break;\n\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: action.op,\n tool: { name: action.op },\n input: action.nodeId,\n });\n try {\n await hook.execute(action.op, actionArgs(action));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.log.warn(\"scripted flow op failed\", {\n op: action.op,\n nodeId: action.nodeId,\n error: msg,\n });\n this.emit(\"agent-event\", {\n type: \"error\",\n error: `echo[test-flow]: ${action.op}(${action.nodeId}) failed: ${msg}`,\n fatal: false,\n });\n break;\n }\n this.emit(\"agent-event\", { type: \"tool_execution_end\", toolName: action.op });\n executed.push(`${action.op}(${action.nodeId})`);\n if (isTurnEnding(action)) break;\n }\n\n const summary =\n executed.length > 0\n ? `echo[test-flow]: ${executed.join(\" → \")}`\n : \"echo[test-flow]: no action (yielding to host)\";\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n async abort(): Promise<void> {\n this.log.info(\"abort requested\");\n }\n\n kill(): void {\n this.running = false;\n this.log.info(\"killed\");\n }\n\n async resetSession(): Promise<void> {\n this.log.info(\"session reset\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Echo response generation — mirrors MockAgentClient.buildMockEvents\n// ---------------------------------------------------------------------------\n\n/**\n * A flow turn is recognised by the orchestrator prompt's stable header\n * (`buildOrchestratorPrompt` in the flow connector). Detection is header-only —\n * the driver reads live state through the injected hook, never by parsing the\n * prompt body.\n */\nfunction isFlowTurn(message: string): boolean {\n return message.startsWith(\"# Flow Execution Context\");\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction textAndResult(summary: string): AgentEvent[] {\n return [\n {\n type: \"message_start\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"message_end\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"result\",\n subtype: \"success\",\n summary,\n costUsd: 0,\n },\n ];\n}\n\nfunction buildEchoEvents(content: string, originalPrompt: string): AgentEvent[] {\n const events: AgentEvent[] = [];\n\n if (content.includes(\"test all\")) {\n events.push(\n { type: \"tool_call\", name: \"Read\", tool: { name: \"Read\" }, input: \"prisma/schema.prisma\" },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n {\n type: \"tool_call\",\n name: \"Write\",\n tool: { name: \"Write\" },\n input: \"src/modules/sprint/sprint.service.ts\",\n },\n { type: \"tool_execution_end\", toolName: \"Write\" },\n );\n events.push(\n ...textAndResult(\n \"All operations completed successfully. Created sprint service, updated schema, started dev server, and ran E2E tests.\",\n ),\n );\n } else if (content.includes(\"test toolcall\")) {\n events.push(\n {\n type: \"tool_call\",\n name: \"Read\",\n tool: { name: \"Read\" },\n input: \"platform/prisma/schema.prisma\",\n },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n );\n events.push(\n ...textAndResult(\n \"I've read the schema and found 42 models. The data model looks well-structured.\",\n ),\n );\n } else if (content.includes(\"test question\")) {\n // Emit a message that asks the user a question (the runner normalizer\n // converts this to a `question` AgentEvent for the transport layer)\n events.push(\n ...textAndResult(\n \"The blueprint calls for a relational database. Which engine should I target? \" +\n \"This will affect the Prisma provider, Docker Compose setup, and the connection string.\\n\\n\" +\n \"Options: PostgreSQL, MySQL, SQLite\",\n ),\n );\n } else if (content.includes(\"test error\")) {\n events.push({\n type: \"error\",\n error:\n \"AI provider returned HTTP 429 — rate limit exceeded. The request will be retried automatically in 35 seconds.\",\n fatal: false,\n });\n } else if (content.includes(\"test fatal\")) {\n events.push({\n type: \"error\",\n error:\n \"Session agent was killed by the container runtime (OOM — memory limit 2 GB exceeded). The session cannot continue.\",\n fatal: true,\n });\n } else {\n // Default echo response\n const summary =\n `I received your message: \"${originalPrompt}\". I'm the Skaile AI assistant running in echo mode. ` +\n `This is a deterministic mock response for E2E testing.`;\n events.push(...textAndResult(summary));\n }\n\n return events;\n}\n\n/**\n * `DriverTarget` wrapper for the echo driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const echoDriverTarget: DriverTarget<AgentConfig> = {\n id: \"echo\",\n displayName: BUILTIN_DRIVER_CATALOG.echo?.name ?? \"Echo (E2E mock)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new EchoDriver(config),\n listModels: async (apiKeys) =>\n new EchoDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,10 +1,11 @@
1
- export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-O5VCUU6D.js';
2
- import '../../chunk-MNKUZUN2.js';
1
+ export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-KUZEIKZH.js';
2
+ import '../../chunk-DRXDEL3A.js';
3
3
  import '../../chunk-BMQKMOQY.js';
4
4
  import '../../chunk-GAH4YRCI.js';
5
- import '../../chunk-ACWCVB5Q.js';
5
+ import '../../chunk-ORZW7MMO.js';
6
6
  import '../../chunk-6E6PKKAD.js';
7
- import '../../chunk-JB35MVBN.js';
7
+ import '../../chunk-U5POE4BA.js';
8
+ import '../../chunk-7GOCNYUV.js';
8
9
  import '../../chunk-NSBPE2FW.js';
9
10
  //# sourceMappingURL=gemini.js.map
10
11
  //# sourceMappingURL=gemini.js.map
@@ -1,8 +1,9 @@
1
- import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-MNKUZUN2.js';
1
+ import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-DRXDEL3A.js';
2
2
  import '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ACWCVB5Q.js';
3
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
- import '../../chunk-JB35MVBN.js';
5
+ import '../../chunk-U5POE4BA.js';
6
+ import '../../chunk-7GOCNYUV.js';
6
7
  import '../../chunk-NSBPE2FW.js';
7
8
  import * as z from 'zod';
8
9
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * Model-agnostic across 15+ providers; provider/model are forwarded via\n * `GOOSE_PROVIDER` / `GOOSE_MODEL` and provider keys through the environment.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n if (this.config.provider) env.GOOSE_PROVIDER = this.config.provider;\n if (this.config.model) env.GOOSE_MODEL = this.config.model;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n};\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * Model-agnostic across 15+ providers; provider/model are forwarded via\n * `GOOSE_PROVIDER` / `GOOSE_MODEL` and provider keys through the environment.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n if (this.config.provider) env.GOOSE_PROVIDER = this.config.provider;\n if (this.config.model) env.GOOSE_MODEL = this.config.model;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n};\n"]}
@@ -1,7 +1,8 @@
1
1
  import { classifyGenericErrorMessage } from '../../chunk-GAH4YRCI.js';
2
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ACWCVB5Q.js';
2
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
3
3
  import '../../chunk-6E6PKKAD.js';
4
- import '../../chunk-JB35MVBN.js';
4
+ import '../../chunk-U5POE4BA.js';
5
+ import '../../chunk-7GOCNYUV.js';
5
6
  import '../../chunk-NSBPE2FW.js';
6
7
  import { spawn, execFile } from 'child_process';
7
8
  import fs from 'fs/promises';