@skaile/workspaces 6.6.0 → 6.7.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 (358) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/ai-sdk.js +10 -17
  3. package/dist/ai-sdk.js.map +1 -1
  4. package/dist/app-sdk/index.js +1 -1
  5. package/dist/{asset-feeds-WQ6YQPHV.js → asset-feeds-4A7PJ4OB.js} +18 -18
  6. package/dist/{asset-feeds-WQ6YQPHV.js.map → asset-feeds-4A7PJ4OB.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +4 -4
  8. package/dist/asset-manager/index.js +10 -10
  9. package/dist/asset-manager/installer.js +6 -6
  10. package/dist/asset-manager/renderers.js +5 -5
  11. package/dist/asset-manager/src/index.d.ts +89 -15
  12. package/dist/asset-manager/src/index.d.ts.map +1 -1
  13. package/dist/asset-manager/src/install-agent.d.ts +22 -1
  14. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  15. package/dist/asset-manager/src/install-instances.d.ts +30 -1
  16. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  17. package/dist/asset-manager/src/installer.d.ts +12 -0
  18. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  19. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  20. package/dist/bridge/harnesses/claude-sdk.js +21 -15
  21. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  22. package/dist/bridge/harnesses/codex.js +9 -8
  23. package/dist/bridge/harnesses/codex.js.map +1 -1
  24. package/dist/bridge/harnesses/continue.js +11 -9
  25. package/dist/bridge/harnesses/continue.js.map +1 -1
  26. package/dist/bridge/harnesses/echo.js +5 -4
  27. package/dist/bridge/harnesses/echo.js.map +1 -1
  28. package/dist/bridge/harnesses/gemini.js +8 -6
  29. package/dist/bridge/harnesses/goose.js +11 -9
  30. package/dist/bridge/harnesses/goose.js.map +1 -1
  31. package/dist/bridge/harnesses/omp.js +9 -7
  32. package/dist/bridge/harnesses/omp.js.map +1 -1
  33. package/dist/bridge/harnesses/opencode.js +11 -9
  34. package/dist/bridge/harnesses/opencode.js.map +1 -1
  35. package/dist/bridge/harnesses/qwen.js +9 -7
  36. package/dist/bridge/harnesses/qwen.js.map +1 -1
  37. package/dist/bridge/index.js +17 -15
  38. package/dist/bridge/src/ai-sdk.d.ts.map +1 -1
  39. package/dist/bridge/src/claude-sdk-surface.d.ts +2 -1
  40. package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -1
  41. package/dist/bridge/src/harness-binaries.d.ts +21 -0
  42. package/dist/bridge/src/harness-binaries.d.ts.map +1 -0
  43. package/dist/bridge/src/harness-model-check.d.ts +22 -6
  44. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  45. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  46. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  47. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  48. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  49. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -1
  50. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  51. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  52. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  53. package/dist/bridge/src/index.d.ts +2 -1
  54. package/dist/bridge/src/index.d.ts.map +1 -1
  55. package/dist/{chunk-LBJ4M5J2.js → chunk-237BMOZW.js} +4 -4
  56. package/dist/{chunk-LBJ4M5J2.js.map → chunk-237BMOZW.js.map} +1 -1
  57. package/dist/{chunk-2TLPC6TQ.js → chunk-37AYPPOO.js} +41 -19
  58. package/dist/chunk-37AYPPOO.js.map +1 -0
  59. package/dist/{chunk-GTGWRKMJ.js → chunk-37X4A6VZ.js} +6 -6
  60. package/dist/{chunk-GTGWRKMJ.js.map → chunk-37X4A6VZ.js.map} +1 -1
  61. package/dist/{chunk-MXI3XWV6.js → chunk-3HSLJAMJ.js} +4 -4
  62. package/dist/{chunk-MXI3XWV6.js.map → chunk-3HSLJAMJ.js.map} +1 -1
  63. package/dist/{chunk-RHCEX2EV.js → chunk-3W6XZQ2Y.js} +3 -3
  64. package/dist/{chunk-RHCEX2EV.js.map → chunk-3W6XZQ2Y.js.map} +1 -1
  65. package/dist/{chunk-F4CZQD3T.js → chunk-4C2E5QUP.js} +4 -3
  66. package/dist/chunk-4C2E5QUP.js.map +1 -0
  67. package/dist/{chunk-DS6UUCFG.js → chunk-4CD2R4MJ.js} +5 -4
  68. package/dist/chunk-4CD2R4MJ.js.map +1 -0
  69. package/dist/{chunk-AQNW2FET.js → chunk-6RPS7JEH.js} +92 -39
  70. package/dist/chunk-6RPS7JEH.js.map +1 -0
  71. package/dist/{chunk-BSMW3PX2.js → chunk-6UP2EDFN.js} +4 -313
  72. package/dist/chunk-6UP2EDFN.js.map +1 -0
  73. package/dist/{chunk-4J7JQX4G.js → chunk-72TLO2AG.js} +4 -4
  74. package/dist/{chunk-4J7JQX4G.js.map → chunk-72TLO2AG.js.map} +1 -1
  75. package/dist/{chunk-I5IF3JCG.js → chunk-AO57IFME.js} +3 -3
  76. package/dist/{chunk-I5IF3JCG.js.map → chunk-AO57IFME.js.map} +1 -1
  77. package/dist/{chunk-G5SYFFMD.js → chunk-ASBZOTEO.js} +2 -2
  78. package/dist/{chunk-G5SYFFMD.js.map → chunk-ASBZOTEO.js.map} +1 -1
  79. package/dist/{chunk-O7QZI6MQ.js → chunk-BB5EJLKZ.js} +2 -2
  80. package/dist/{chunk-O7QZI6MQ.js.map → chunk-BB5EJLKZ.js.map} +1 -1
  81. package/dist/{chunk-N2PBAXAA.js → chunk-BKLDBUQA.js} +3 -3
  82. package/dist/{chunk-N2PBAXAA.js.map → chunk-BKLDBUQA.js.map} +1 -1
  83. package/dist/{chunk-XD3RYAMR.js → chunk-CTRTFMCX.js} +6 -6
  84. package/dist/{chunk-XD3RYAMR.js.map → chunk-CTRTFMCX.js.map} +1 -1
  85. package/dist/{chunk-EPXZQIC6.js → chunk-DFP476EU.js} +8 -4
  86. package/dist/chunk-DFP476EU.js.map +1 -0
  87. package/dist/{chunk-MMOWIRHP.js → chunk-G44FFUMA.js} +12 -10
  88. package/dist/chunk-G44FFUMA.js.map +1 -0
  89. package/dist/{chunk-JIQUF3X2.js → chunk-G7NMF5WQ.js} +3 -3
  90. package/dist/{chunk-JIQUF3X2.js.map → chunk-G7NMF5WQ.js.map} +1 -1
  91. package/dist/{chunk-SHTXMERQ.js → chunk-GAIMSCZ7.js} +10 -8
  92. package/dist/chunk-GAIMSCZ7.js.map +1 -0
  93. package/dist/{chunk-6A6HE5LW.js → chunk-HLAEYFUN.js} +3 -3
  94. package/dist/{chunk-6A6HE5LW.js.map → chunk-HLAEYFUN.js.map} +1 -1
  95. package/dist/{chunk-YN6N3RBM.js → chunk-HMVAGPYR.js} +47 -11
  96. package/dist/chunk-HMVAGPYR.js.map +1 -0
  97. package/dist/{chunk-U3UDOX6I.js → chunk-HPXONAI2.js} +6 -4
  98. package/dist/chunk-HPXONAI2.js.map +1 -0
  99. package/dist/{chunk-5ETYBC2X.js → chunk-IRK3LNG3.js} +6 -6
  100. package/dist/{chunk-5ETYBC2X.js.map → chunk-IRK3LNG3.js.map} +1 -1
  101. package/dist/{chunk-J262X4JU.js → chunk-J7VEQORJ.js} +69 -16
  102. package/dist/chunk-J7VEQORJ.js.map +1 -0
  103. package/dist/{chunk-DI6J2PJB.js → chunk-KO3VSZQP.js} +47 -18
  104. package/dist/chunk-KO3VSZQP.js.map +1 -0
  105. package/dist/{chunk-KSH5CFQS.js → chunk-KORDNXKA.js} +3 -3
  106. package/dist/{chunk-KSH5CFQS.js.map → chunk-KORDNXKA.js.map} +1 -1
  107. package/dist/{chunk-SCRYXAHH.js → chunk-L3JQJ6D5.js} +6 -6
  108. package/dist/{chunk-SCRYXAHH.js.map → chunk-L3JQJ6D5.js.map} +1 -1
  109. package/dist/{chunk-7I5PNB2G.js → chunk-L7QOZG5V.js} +3 -3
  110. package/dist/{chunk-7I5PNB2G.js.map → chunk-L7QOZG5V.js.map} +1 -1
  111. package/dist/{chunk-VXYZ5M7Z.js → chunk-LX4TTTRR.js} +64 -27
  112. package/dist/chunk-LX4TTTRR.js.map +1 -0
  113. package/dist/{chunk-KSUT5KAE.js → chunk-LZPJOF7Y.js} +3 -3
  114. package/dist/{chunk-KSUT5KAE.js.map → chunk-LZPJOF7Y.js.map} +1 -1
  115. package/dist/{chunk-65UAC3ZR.js → chunk-N6ZGB5ES.js} +4 -3
  116. package/dist/chunk-N6ZGB5ES.js.map +1 -0
  117. package/dist/{chunk-2M3VLKT2.js → chunk-NURTGAWM.js} +3 -3
  118. package/dist/{chunk-2M3VLKT2.js.map → chunk-NURTGAWM.js.map} +1 -1
  119. package/dist/{chunk-J4WKNJHO.js → chunk-O5Y7VMVQ.js} +15 -14
  120. package/dist/chunk-O5Y7VMVQ.js.map +1 -0
  121. package/dist/{chunk-6SXSVKQY.js → chunk-O7ADRMCR.js} +63 -14
  122. package/dist/chunk-O7ADRMCR.js.map +1 -0
  123. package/dist/{chunk-7PVGND4J.js → chunk-OGTQUEAO.js} +21 -14
  124. package/dist/chunk-OGTQUEAO.js.map +1 -0
  125. package/dist/{chunk-VJRL6ZK6.js → chunk-OSABUEWA.js} +3 -3
  126. package/dist/{chunk-VJRL6ZK6.js.map → chunk-OSABUEWA.js.map} +1 -1
  127. package/dist/{chunk-WW5NAU6N.js → chunk-PLLZSKOO.js} +3 -3
  128. package/dist/{chunk-WW5NAU6N.js.map → chunk-PLLZSKOO.js.map} +1 -1
  129. package/dist/{chunk-7SJHSGUV.js → chunk-Q2NYTMT6.js} +16 -15
  130. package/dist/chunk-Q2NYTMT6.js.map +1 -0
  131. package/dist/{chunk-E2EC6SAX.js → chunk-QC5BYUED.js} +51 -15
  132. package/dist/chunk-QC5BYUED.js.map +1 -0
  133. package/dist/{chunk-RAU5QPI6.js → chunk-QCR5AE5E.js} +5 -5
  134. package/dist/{chunk-RAU5QPI6.js.map → chunk-QCR5AE5E.js.map} +1 -1
  135. package/dist/{chunk-TUFNY6OD.js → chunk-QW5B3TEO.js} +10 -4
  136. package/dist/chunk-QW5B3TEO.js.map +1 -0
  137. package/dist/{chunk-Z4FERR4U.js → chunk-RAHAZ7LP.js} +2 -2
  138. package/dist/{chunk-Z4FERR4U.js.map → chunk-RAHAZ7LP.js.map} +1 -1
  139. package/dist/{chunk-OY22B7E2.js → chunk-SBNUXJ6E.js} +3 -3
  140. package/dist/{chunk-OY22B7E2.js.map → chunk-SBNUXJ6E.js.map} +1 -1
  141. package/dist/{chunk-6ARPZHOV.js → chunk-TMJBEGS4.js} +35 -6
  142. package/dist/chunk-TMJBEGS4.js.map +1 -0
  143. package/dist/{chunk-6RHWTZPT.js → chunk-TXX3OUYI.js} +3 -3
  144. package/dist/{chunk-6RHWTZPT.js.map → chunk-TXX3OUYI.js.map} +1 -1
  145. package/dist/{chunk-SZKCE7EC.js → chunk-U52FYGK5.js} +5 -5
  146. package/dist/{chunk-SZKCE7EC.js.map → chunk-U52FYGK5.js.map} +1 -1
  147. package/dist/{chunk-TCH5UDKT.js → chunk-UCB7FK25.js} +10 -8
  148. package/dist/chunk-UCB7FK25.js.map +1 -0
  149. package/dist/{chunk-5XHQBCB5.js → chunk-WFK4MUBL.js} +21 -7
  150. package/dist/chunk-WFK4MUBL.js.map +1 -0
  151. package/dist/{chunk-HGZN6JLP.js → chunk-WIYVR24B.js} +4 -4
  152. package/dist/{chunk-HGZN6JLP.js.map → chunk-WIYVR24B.js.map} +1 -1
  153. package/dist/{chunk-B6N653ZG.js → chunk-WKENHNDM.js} +6 -6
  154. package/dist/{chunk-B6N653ZG.js.map → chunk-WKENHNDM.js.map} +1 -1
  155. package/dist/chunk-WWSRIT3J.js +59 -0
  156. package/dist/chunk-WWSRIT3J.js.map +1 -0
  157. package/dist/chunk-XON6ODIC.js +315 -0
  158. package/dist/chunk-XON6ODIC.js.map +1 -0
  159. package/dist/{chunk-4BFEPZ6J.js → chunk-ZBA4P5TD.js} +3 -3
  160. package/dist/{chunk-4BFEPZ6J.js.map → chunk-ZBA4P5TD.js.map} +1 -1
  161. package/dist/{chunk-JRVQV7WC.js → chunk-ZDTDS62B.js} +595 -126
  162. package/dist/chunk-ZDTDS62B.js.map +1 -0
  163. package/dist/{chunk-XYCYGN3Q.js → chunk-ZM4SDVUV.js} +79 -20
  164. package/dist/chunk-ZM4SDVUV.js.map +1 -0
  165. package/dist/{claude-code-LZH7Y4Y5.js → claude-code-BLFRZU2X.js} +4 -4
  166. package/dist/{claude-code-LZH7Y4Y5.js.map → claude-code-BLFRZU2X.js.map} +1 -1
  167. package/dist/cli/index.js +474 -198
  168. package/dist/cli/index.js.map +1 -1
  169. package/dist/cli/src/agent-pins.d.ts +9 -3
  170. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  171. package/dist/cli/src/commands/asset-cmd.d.ts +1 -1
  172. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  173. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  174. package/dist/cli/src/commands/catalog.d.ts +2 -0
  175. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  176. package/dist/cli/src/commands/config.d.ts.map +1 -1
  177. package/dist/cli/src/commands/harness-preflight.d.ts +38 -0
  178. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -0
  179. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  180. package/dist/cli/src/commands/library-index.d.ts +16 -0
  181. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  182. package/dist/cli/src/commands/migrate-assets.d.ts +5 -0
  183. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  184. package/dist/cli/src/commands/migrate-harness.d.ts +15 -7
  185. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  186. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  187. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  188. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  189. package/dist/cli/src/commands/project.d.ts +14 -0
  190. package/dist/cli/src/commands/project.d.ts.map +1 -1
  191. package/dist/cli/src/commands/run.d.ts.map +1 -1
  192. package/dist/cli/src/commands/serve-preflight.d.ts +6 -5
  193. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  194. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  195. package/dist/cli/src/commands/session.d.ts.map +1 -1
  196. package/dist/cli/src/commands/source.d.ts +11 -0
  197. package/dist/cli/src/commands/source.d.ts.map +1 -1
  198. package/dist/cli/src/commands/update.d.ts.map +1 -1
  199. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  200. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  201. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  202. package/dist/cli/src/commands/why.d.ts.map +1 -1
  203. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  204. package/dist/cli/src/session-hint.d.ts +7 -0
  205. package/dist/cli/src/session-hint.d.ts.map +1 -0
  206. package/dist/connectors/config.js +3 -3
  207. package/dist/connectors/index.js +21 -19
  208. package/dist/connectors/src/managed-gitconfig.d.ts +6 -4
  209. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  210. package/dist/{connectors-HU5MHSUJ.js → connectors-OJJU4LSN.js} +24 -22
  211. package/dist/{connectors-HU5MHSUJ.js.map → connectors-OJJU4LSN.js.map} +1 -1
  212. package/dist/connectors-shared/index.js +2 -2
  213. package/dist/core/index.js +4 -4
  214. package/dist/core/publish-manifest.js +1 -1
  215. package/dist/core/runtime-assets.js +3 -3
  216. package/dist/core/src/agent-instances.d.ts +11 -0
  217. package/dist/core/src/agent-instances.d.ts.map +1 -1
  218. package/dist/core/src/index.d.ts +3 -2
  219. package/dist/core/src/index.d.ts.map +1 -1
  220. package/dist/core/src/publish-manifest.d.ts +20 -6
  221. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  222. package/dist/core/src/repo-manager.d.ts +9 -0
  223. package/dist/core/src/repo-manager.d.ts.map +1 -1
  224. package/dist/core/src/run-state-ignore.d.ts +17 -0
  225. package/dist/core/src/run-state-ignore.d.ts.map +1 -0
  226. package/dist/core/src/workspace-config.d.ts.map +1 -1
  227. package/dist/core/workspace-config.js +2 -2
  228. package/dist/deploy/index.js +4 -4
  229. package/dist/discovery/index.js +2 -2
  230. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  231. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  232. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  233. package/dist/{ensure-sources-CAMWJTMR.js → ensure-sources-F6VQDCWY.js} +26 -24
  234. package/dist/ensure-sources-F6VQDCWY.js.map +1 -0
  235. package/dist/factory-assets/connectors/box.js +21 -19
  236. package/dist/factory-assets/connectors/deploy.js +21 -19
  237. package/dist/factory-assets/connectors/devserver.js +21 -19
  238. package/dist/factory-assets/connectors/flow/adapter.js +21 -19
  239. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +2 -0
  240. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -1
  241. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  242. package/dist/factory-assets/connectors/flow/run-flow.js +22 -20
  243. package/dist/factory-assets/connectors/flow.js +21 -19
  244. package/dist/factory-assets/connectors/git/CONNECTOR.md +4 -1
  245. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  246. package/dist/factory-assets/connectors/git.js +21 -19
  247. package/dist/factory-assets/connectors/gmail.js +21 -19
  248. package/dist/factory-assets/connectors/googledrive.js +21 -19
  249. package/dist/factory-assets/connectors/local.js +21 -19
  250. package/dist/factory-assets/connectors/mattermost.js +21 -19
  251. package/dist/factory-assets/connectors/memory.js +21 -19
  252. package/dist/factory-assets/connectors/minio.js +21 -19
  253. package/dist/factory-assets/connectors/postgres.js +21 -19
  254. package/dist/factory-assets/connectors/s3.js +21 -19
  255. package/dist/factory-assets/connectors/sharepoint.js +21 -19
  256. package/dist/factory-assets/connectors/sqlite.js +21 -19
  257. package/dist/factory-assets/connectors/static-server.js +21 -19
  258. package/dist/factory-assets/connectors/tunnel.js +21 -19
  259. package/dist/factory-assets/connectors/webdav.js +21 -19
  260. package/dist/factory-assets/connectors/xstate-store.js +21 -19
  261. package/dist/factory-assets/connectors/xstate.js +21 -19
  262. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +14 -1
  263. package/dist/{flows-GVOVQGQW.js → flows-I6ODIPZZ.js} +7 -7
  264. package/dist/{flows-GVOVQGQW.js.map → flows-I6ODIPZZ.js.map} +1 -1
  265. package/dist/{helpers-WMCCODAV.js → helpers-PJNUTZXZ.js} +26 -24
  266. package/dist/{helpers-WMCCODAV.js.map → helpers-PJNUTZXZ.js.map} +1 -1
  267. package/dist/library/index.js +7 -7
  268. package/dist/library/install.js +2 -2
  269. package/dist/library/src/manifest-writer.d.ts +5 -0
  270. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  271. package/dist/{library-publish-UQQMHTND.js → library-publish-FNNDWVBO.js} +47 -45
  272. package/dist/library-publish-FNNDWVBO.js.map +1 -0
  273. package/dist/model-endpoint/index.js +8 -7
  274. package/dist/{open-library-OJ4HT2X4.js → open-library-R5EZROFN.js} +29 -27
  275. package/dist/{open-library-OJ4HT2X4.js.map → open-library-R5EZROFN.js.map} +1 -1
  276. package/dist/{open-registry-LWGIOJDK.js → open-registry-RZW2AFD6.js} +11 -11
  277. package/dist/{open-registry-LWGIOJDK.js.map → open-registry-RZW2AFD6.js.map} +1 -1
  278. package/dist/{paths-FR2752HV.js → paths-RPK5PNZQ.js} +7 -7
  279. package/dist/{paths-FR2752HV.js.map → paths-RPK5PNZQ.js.map} +1 -1
  280. package/dist/{plugin-store-IALJUBN2.js → plugin-store-OJTERUEZ.js} +7 -7
  281. package/dist/{plugin-store-IALJUBN2.js.map → plugin-store-OJTERUEZ.js.map} +1 -1
  282. package/dist/{project-UQFCYHYS.js → project-S2FT3LLR.js} +43 -41
  283. package/dist/{project-UQFCYHYS.js.map → project-S2FT3LLR.js.map} +1 -1
  284. package/dist/resolver/index.js +4 -4
  285. package/dist/runner/index.js +32 -30
  286. package/dist/runner/src/capability-roundtrip.d.ts +6 -6
  287. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  288. package/dist/runner/src/composition/run-snapshot.d.ts +7 -1
  289. package/dist/runner/src/composition/run-snapshot.d.ts.map +1 -1
  290. package/dist/runner/src/serve.d.ts.map +1 -1
  291. package/dist/sdk/asset-manager.js +10 -10
  292. package/dist/sdk/bridge.js +17 -15
  293. package/dist/sdk/core.js +4 -4
  294. package/dist/sdk/flow.js +5 -5
  295. package/dist/sdk/index.js +32 -30
  296. package/dist/sdk/index.js.map +1 -1
  297. package/dist/sdk/resolver.js +4 -4
  298. package/dist/sdk/runner.js +32 -30
  299. package/dist/sdk/session.js +2 -2
  300. package/dist/sdk/transport/ws/server.js +5 -5
  301. package/dist/sdk/transport/ws.js +5 -5
  302. package/dist/sdk/transport.js +5 -5
  303. package/dist/sdk/types.js +1 -1
  304. package/dist/serve-preflight-AADSOUO2.js +58 -0
  305. package/dist/{serve-preflight-TYEKHC32.js.map → serve-preflight-AADSOUO2.js.map} +1 -1
  306. package/dist/session/index.js +2 -2
  307. package/dist/{setup-4JV2IMCB.js → setup-HOAJHUFQ.js} +27 -25
  308. package/dist/setup-HOAJHUFQ.js.map +1 -0
  309. package/dist/{skills-6QTKFMLW.js → skills-KHHW3RZ3.js} +6 -6
  310. package/dist/{skills-6QTKFMLW.js.map → skills-KHHW3RZ3.js.map} +1 -1
  311. package/dist/source-FOELFCY6.js +88 -0
  312. package/dist/{source-XYMMJVKR.js.map → source-FOELFCY6.js.map} +1 -1
  313. package/dist/{source-manifest-publish-SZFGGKB4.js → source-manifest-publish-Q7P5AEVU.js} +44 -42
  314. package/dist/source-manifest-publish-Q7P5AEVU.js.map +1 -0
  315. package/dist/transport/index.js +5 -5
  316. package/dist/transport/ws/server.js +5 -5
  317. package/dist/transport/ws.js +5 -5
  318. package/dist/tui/index.js +56 -37
  319. package/dist/tui/index.js.map +1 -1
  320. package/dist/tui/src/repl.d.ts +10 -0
  321. package/dist/tui/src/repl.d.ts.map +1 -1
  322. package/dist/types/index.js +1 -1
  323. package/dist/types/src/version.d.ts +4 -4
  324. package/dist/workspace-plugin/adapters/mcp.js +24 -22
  325. package/dist/workspace-plugin/adapters/omp.js +14 -14
  326. package/dist/workspace-plugin/index.js +1 -1
  327. package/package.json +1 -1
  328. package/dist/chunk-2TLPC6TQ.js.map +0 -1
  329. package/dist/chunk-5XHQBCB5.js.map +0 -1
  330. package/dist/chunk-65UAC3ZR.js.map +0 -1
  331. package/dist/chunk-6ARPZHOV.js.map +0 -1
  332. package/dist/chunk-6SXSVKQY.js.map +0 -1
  333. package/dist/chunk-7PVGND4J.js.map +0 -1
  334. package/dist/chunk-7SJHSGUV.js.map +0 -1
  335. package/dist/chunk-AQNW2FET.js.map +0 -1
  336. package/dist/chunk-BSMW3PX2.js.map +0 -1
  337. package/dist/chunk-DI6J2PJB.js.map +0 -1
  338. package/dist/chunk-DS6UUCFG.js.map +0 -1
  339. package/dist/chunk-E2EC6SAX.js.map +0 -1
  340. package/dist/chunk-EPXZQIC6.js.map +0 -1
  341. package/dist/chunk-F4CZQD3T.js.map +0 -1
  342. package/dist/chunk-J262X4JU.js.map +0 -1
  343. package/dist/chunk-J4WKNJHO.js.map +0 -1
  344. package/dist/chunk-JRVQV7WC.js.map +0 -1
  345. package/dist/chunk-MMOWIRHP.js.map +0 -1
  346. package/dist/chunk-SHTXMERQ.js.map +0 -1
  347. package/dist/chunk-TCH5UDKT.js.map +0 -1
  348. package/dist/chunk-TUFNY6OD.js.map +0 -1
  349. package/dist/chunk-U3UDOX6I.js.map +0 -1
  350. package/dist/chunk-VXYZ5M7Z.js.map +0 -1
  351. package/dist/chunk-XYCYGN3Q.js.map +0 -1
  352. package/dist/chunk-YN6N3RBM.js.map +0 -1
  353. package/dist/ensure-sources-CAMWJTMR.js.map +0 -1
  354. package/dist/library-publish-UQQMHTND.js.map +0 -1
  355. package/dist/serve-preflight-TYEKHC32.js +0 -56
  356. package/dist/setup-4JV2IMCB.js.map +0 -1
  357. package/dist/source-XYMMJVKR.js +0 -86
  358. package/dist/source-manifest-publish-SZFGGKB4.js.map +0 -1
package/dist/tui/index.js CHANGED
@@ -1,50 +1,52 @@
1
- import { resolveInstanceAgentDir, instanceSessionOverrides, bootstrapRunnerLogStore, createAgentSession, unresolvedCredentialNotices, createFinalTextFallback } from '../chunk-AQNW2FET.js';
2
- import '../chunk-Z4FERR4U.js';
3
- import '../chunk-GTGWRKMJ.js';
4
- import '../chunk-7I5PNB2G.js';
5
- import '../chunk-O7QZI6MQ.js';
1
+ import { resolveInstanceAgentDir, instanceSessionOverrides, bootstrapRunnerLogStore, createAgentSession, unresolvedCredentialNotices, createFinalTextFallback } from '../chunk-6RPS7JEH.js';
2
+ import '../chunk-RAHAZ7LP.js';
3
+ import '../chunk-37X4A6VZ.js';
4
+ import '../chunk-L7QOZG5V.js';
5
+ import '../chunk-BB5EJLKZ.js';
6
6
  import '../chunk-WYZXSJBK.js';
7
7
  import '../chunk-GTAHU4N4.js';
8
8
  import '../chunk-HQAPUPBE.js';
9
9
  import '../chunk-KW37WNXY.js';
10
10
  import '../chunk-3MWQKQUB.js';
11
- import '../chunk-SZKCE7EC.js';
11
+ import '../chunk-U52FYGK5.js';
12
12
  import '../chunk-O7SG5PC2.js';
13
13
  import '../chunk-7QBNJTTQ.js';
14
14
  import '../chunk-O2SYFJWP.js';
15
- import '../chunk-6A6HE5LW.js';
15
+ import '../chunk-HLAEYFUN.js';
16
16
  import '../chunk-32NA4TVC.js';
17
17
  import '../chunk-W3UDISS2.js';
18
18
  import '../chunk-CMXDFTA2.js';
19
- import '../chunk-5ETYBC2X.js';
19
+ import '../chunk-IRK3LNG3.js';
20
20
  import '../chunk-4R6DROGN.js';
21
21
  import '../chunk-PTJTOPE5.js';
22
22
  import '../chunk-USSP43U3.js';
23
- import '../chunk-VXYZ5M7Z.js';
24
- import '../chunk-2M3VLKT2.js';
25
- import { loadConnectorDeclarations } from '../chunk-4BFEPZ6J.js';
26
- import '../chunk-YN6N3RBM.js';
27
- import '../chunk-TCH5UDKT.js';
28
- import { approvalCardOf, APPROVE_ONCE, DENY } from '../chunk-U3UDOX6I.js';
29
- import '../chunk-65UAC3ZR.js';
23
+ import '../chunk-LX4TTTRR.js';
24
+ import '../chunk-NURTGAWM.js';
25
+ import { loadConnectorDeclarations } from '../chunk-ZBA4P5TD.js';
26
+ import '../chunk-HMVAGPYR.js';
27
+ import '../chunk-UCB7FK25.js';
28
+ import { approvalCardOf, APPROVE_ONCE, DENY } from '../chunk-HPXONAI2.js';
29
+ import '../chunk-N6ZGB5ES.js';
30
30
  import '../chunk-LOO5CB5M.js';
31
- import '../chunk-KSUT5KAE.js';
32
- import '../chunk-OY22B7E2.js';
31
+ import '../chunk-LZPJOF7Y.js';
32
+ import '../chunk-SBNUXJ6E.js';
33
+ import '../chunk-WWSRIT3J.js';
34
+ import '../chunk-4C2E5QUP.js';
33
35
  import '../chunk-5DE3DGVR.js';
34
36
  import '../chunk-7DN6JKP2.js';
35
- import '../chunk-WW5NAU6N.js';
36
- import '../chunk-MXI3XWV6.js';
37
- import '../chunk-F4CZQD3T.js';
38
- import '../chunk-BSMW3PX2.js';
37
+ import '../chunk-PLLZSKOO.js';
38
+ import '../chunk-XON6ODIC.js';
39
39
  import '../chunk-G5SUWZEU.js';
40
+ import '../chunk-3HSLJAMJ.js';
41
+ import '../chunk-6UP2EDFN.js';
40
42
  import '../chunk-IFGTRL2I.js';
41
- import '../chunk-5XHQBCB5.js';
43
+ import '../chunk-WFK4MUBL.js';
42
44
  import '../chunk-WD3L5QSU.js';
43
45
  import '../chunk-7RGTAEG6.js';
44
- import '../chunk-G5SYFFMD.js';
45
- import '../chunk-MMOWIRHP.js';
46
- import '../chunk-J4WKNJHO.js';
47
- import '../chunk-VJRL6ZK6.js';
46
+ import '../chunk-ASBZOTEO.js';
47
+ import '../chunk-G44FFUMA.js';
48
+ import '../chunk-O5Y7VMVQ.js';
49
+ import '../chunk-OSABUEWA.js';
48
50
  import '../chunk-F3D25RGM.js';
49
51
  import '../chunk-3TXEJN4W.js';
50
52
  import '../chunk-ISHJITXJ.js';
@@ -52,16 +54,16 @@ import '../chunk-LNFKL23K.js';
52
54
  import '../chunk-JRN5QF4C.js';
53
55
  import '../chunk-NUELZWCF.js';
54
56
  import '../chunk-VT6G5AJV.js';
55
- import { resolveSettings } from '../chunk-6ARPZHOV.js';
57
+ import { resolveSettings } from '../chunk-TMJBEGS4.js';
56
58
  import '../chunk-4GY63JU6.js';
57
- import '../chunk-JIQUF3X2.js';
59
+ import '../chunk-G7NMF5WQ.js';
58
60
  import { deployedBase } from '../chunk-5KRMNUL4.js';
59
61
  import { DEFAULT_HARNESS_ID } from '../chunk-C5HFK34M.js';
60
62
  import '../chunk-MWXYN6NY.js';
61
- import { resolveSkWorkspaceConfig, resolveAgentDir } from '../chunk-6SXSVKQY.js';
63
+ import { resolveSkWorkspaceConfig, resolveAgentDir, instanceChoiceText, unselectedInstanceIds } from '../chunk-O7ADRMCR.js';
62
64
  import '../chunk-L5VSIPQD.js';
63
65
  import { harnessNameForHarnessId } from '../chunk-VTETQCR6.js';
64
- import '../chunk-E2EC6SAX.js';
66
+ import '../chunk-QC5BYUED.js';
65
67
  import '../chunk-GNUA7XT2.js';
66
68
  import '../chunk-RVRB27AN.js';
67
69
  import '../chunk-V5KG6CCV.js';
@@ -466,6 +468,25 @@ function deployedAgentNames(projectDir, harness) {
466
468
  }
467
469
  return [...names].sort();
468
470
  }
471
+ function refAssetName(ref) {
472
+ return basename(
473
+ ref.replace(/^agent:/, "").replace(/#.*$/, "").replace(/\/+$/, "")
474
+ );
475
+ }
476
+ function bannerAgentChoices(projectDir, deployed) {
477
+ let instances = [];
478
+ let bound = /* @__PURE__ */ new Set();
479
+ try {
480
+ const config = resolveSkWorkspaceConfig(projectDir);
481
+ instances = unselectedInstanceIds(config);
482
+ bound = /* @__PURE__ */ new Set([
483
+ ...Object.keys(config.agent?.instances ?? {}),
484
+ ...Object.values(config.agent?.instances ?? {}).map((i) => refAssetName(i.ref))
485
+ ]);
486
+ } catch {
487
+ }
488
+ return { instances, delegates: deployed.filter((name) => !bound.has(name)) };
489
+ }
469
490
  function printBanner(args) {
470
491
  const { projectDir, displayHarness, displayModel, agentDir, resumeSessionId } = args;
471
492
  const skillCount = countSkills(projectDir, displayHarness);
@@ -474,7 +495,7 @@ function printBanner(args) {
474
495
  connectorCount = loadConnectorDeclarations(projectDir).length;
475
496
  } catch {
476
497
  }
477
- const deployed = agentDir ? [] : deployedAgentNames(projectDir, displayHarness);
498
+ const { instances, delegates } = agentDir ? { instances: [], delegates: [] } : bannerAgentChoices(projectDir, deployedAgentNames(projectDir, displayHarness));
478
499
  const agentName = agentDir ? basename(agentDir) : "default";
479
500
  p.intro(`${pc.bold("skaile repl")} ${pc.dim(`\u2014 ${displayHarness} / ${displayModel}`)}`);
480
501
  p.log.info(pc.dim(`Project: ${projectDir}`));
@@ -484,12 +505,10 @@ function printBanner(args) {
484
505
  `Agent: ${agentName} \xB7 ${counted(skillCount, "skill")} \xB7 ${counted(connectorCount, "connector")}`
485
506
  )
486
507
  );
487
- if (deployed.length > 0) {
488
- p.log.info(
489
- pc.dim(
490
- `Deployed agents (not selected): ${deployed.join(", ")} \xB7 run one with --instance <id> or set agent: in skaile.yaml`
491
- )
492
- );
508
+ if (instances.length > 0) p.log.info(pc.dim(`Instances: ${instanceChoiceText(instances)}`));
509
+ if (delegates.length > 0) {
510
+ const through = instances.length > 0 ? ` (reached through ${instances.join(", ")})` : "";
511
+ p.log.info(pc.dim(`Delegates${through}: ${delegates.join(", ")}`));
493
512
  }
494
513
  if (resumeSessionId) p.log.info(pc.dim(`Resumed: ${resumeSessionId.slice(0, 12)}...`));
495
514
  p.log.info(pc.dim("Type /help for commands, Ctrl+C to quit."));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../tui/src/repl-renderer.ts","../../tui/src/repl-session.ts","../../tui/src/telemetry.ts","../../tui/src/repl.ts"],"names":["text","pc","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import type { OutputLine } from \"@skaile/workspaces\";\nimport pc from \"picocolors\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Render a single OutputLine to an ANSI-colored string for terminal display.\n *\n * Each `OutputLine` variant is mapped to a distinct colour: user input (cyan/bold),\n * agent text (plain), tool calls (blue italic), questions (yellow), errors (red),\n * status/system messages (dim italic), subagent lifecycle (blue/green italic), and\n * separator lines (dim dashes). Returns an empty string for unrecognised variants.\n *\n * @param line - The typed output line to render.\n * @returns ANSI-coloured string ready for terminal output.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLine(line: OutputLine): string {\n switch (line.type) {\n case \"user\":\n return pc.cyan(pc.bold(`> ${line.content}`));\n case \"text\":\n return line.content;\n case \"tool\":\n return pc.blue(pc.italic(` Running: \\`${line.name}\\`...`));\n case \"question\":\n return pc.yellow(`?? ${line.text}\\n Reply below.`);\n case \"error\":\n return pc.red(`Error: ${line.message}`);\n case \"status\":\n return pc.dim(pc.italic(`${line.phase}...`));\n case \"system\":\n return pc.dim(pc.italic(line.message));\n case \"subagent\": {\n const icon = line.status === \"started\" ? \"▶\" : \"✓\";\n const color = line.status === \"started\" ? pc.blue : pc.green;\n return color(pc.italic(` ${icon} ${line.name}: ${line.description}`));\n }\n case \"separator\":\n return pc.dim(\"─\".repeat(60));\n default:\n return \"\";\n }\n}\n\n/**\n * Render a telemetry log entry to an ANSI string, or null to suppress.\n *\n * Formats `generation` entries with model name, token counts, cost, and duration;\n * `span_end` entries for `tool_call` and `agent_turn` kinds; and `trace_start` /\n * `trace_end` lifecycle entries. All output is styled dim for visual de-emphasis.\n * Returns `null` for entry kinds that should not appear in the log panel.\n *\n * @param entry - The structured telemetry event to render.\n * @returns Dim ANSI string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLog(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return pc.dim(`[gen] ${entry.model} ${tokens}${cost}${dur}`);\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return pc.dim(`[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`);\n }\n if (entry.spanKind === \"agent_turn\") {\n return pc.dim(`[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`);\n }\n return null;\n case \"trace_start\":\n return pc.dim(`[trace] ${entry.name} started`);\n case \"trace_end\":\n return pc.dim(`[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`);\n default:\n return null;\n }\n}\n","/**\n * Slim event bridge: maps AgentHarness events to rendered console lines.\n * No React, no ink, no UI state — just event → string → callback.\n */\n\nimport type { OutputLine, SessionState } from \"@skaile/workspaces\";\nimport { APPROVE_ONCE, type AgentEvent, approvalCardOf, DENY } from \"@skaile/workspaces/bridge\";\nimport { type AgentSession, createFinalTextFallback } from \"@skaile/workspaces/runner\";\nimport { renderLine, renderLog } from \"./repl-renderer.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Handle returned by {@link createReplSession} for controlling an active REPL session.\n *\n * `state` reflects the current lifecycle state (`idle`, `active`, or `stopped`).\n * Call `send(text)` to forward a user message to the agent harness; the state\n * transitions to `active` until the harness emits `agent_end`. Call `stop()` to\n * terminate the harness and dispose of the underlying agent session.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface ReplSessionHandle {\n readonly state: SessionState;\n /** Every error text the session showed in the conversation (for the whole session). */\n readonly shownErrors: ReadonlySet<string>;\n send(text: string): void;\n stop(): void;\n}\n\n/**\n * Options for {@link createReplSession}.\n *\n * @param session - The agent session returned by `createAgentSession`.\n * @param onLine - Callback invoked with an ANSI-rendered string for each output line.\n * @param onLog - Callback invoked with a log string for each telemetry event (if verbose).\n * @param onStateChange - Callback invoked whenever the session state changes.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface CreateReplSessionOpts {\n session: AgentSession;\n onLine?: (line: string) => void;\n onLog?: (line: string) => void;\n onStateChange?: (state: SessionState) => void;\n /**\n * Settles a tool approval card (`permission_mode: interactive`): `true` answers `Approve once`,\n * `false` denies. Without it the card is shown and nothing answers it, so the turn waits.\n */\n onApproval?: (question: string, details: string[]) => Promise<boolean>;\n}\n\n/**\n * Create a slim event bridge that maps `AgentEvent` stream to rendered console lines.\n *\n * Subscribes to `agent-event` on the session harness and converts each event type\n * (`message_update`, `tool_call`, `error`, `agent_end`, `turn_end`, `subagent`) to\n * an `OutputLine`, renders it via {@link renderLine}, and forwards the string to\n * `opts.onLine`. Text content is buffered internally and flushed line-by-line as\n * newlines arrive. Returns a {@link ReplSessionHandle} for sending messages and\n * stopping the session.\n *\n * @param opts - Session, output callbacks, and state-change hook.\n * @returns Handle for sending messages and observing session state.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createReplSession(opts: CreateReplSessionOpts): ReplSessionHandle {\n const { session, onLine, onLog, onStateChange, onApproval } = opts;\n\n let state: SessionState = \"idle\";\n let textBuffer = \"\";\n\n function emit(outputLine: OutputLine) {\n const rendered = renderLine(outputLine);\n if (rendered) onLine?.(rendered);\n }\n\n function setState(s: SessionState) {\n state = s;\n onStateChange?.(s);\n }\n\n // Append streamed text to the buffer and flush every completed\n // (newline-terminated) line; returns the new buffer holding the trailing\n // partial line.\n function appendText(buffer: string, text: string): string {\n let next = buffer + text;\n const lines = next.split(\"\\n\");\n if (lines.length > 1) {\n for (let i = 0; i < lines.length - 1; i++) {\n emit({ type: \"text\", content: lines[i]! });\n }\n next = lines[lines.length - 1]!;\n }\n return next;\n }\n\n function handleMessageUpdate(event: AgentEvent, buffer: string): string {\n const delta = (event as any)._textDelta as string | undefined;\n return delta ? appendText(buffer, delta) : buffer;\n }\n\n // omp 18.x puts the whole reply into the assistant `message_start`, so no\n // delta ever follows; the reply is taken from the message when it ends.\n const appendUnstreamed = createFinalTextFallback((text) => {\n textBuffer = appendText(textBuffer, text);\n });\n\n // Cut a replayed attempt's fragment off the unwritten partial line. Lines\n // already written to the terminal cannot be taken back, so only this tail is:\n // when the fragment spanned a newline, the whole buffer belongs to it.\n function handleMessageRetract(text: string, buffer: string): string {\n if (!text || !buffer) return buffer;\n if (buffer.endsWith(text)) return buffer.slice(0, buffer.length - text.length);\n return text.endsWith(buffer) ? \"\" : buffer;\n }\n\n /** Error texts already shown for the turn in flight. */\n const reportedErrors = new Set<string>();\n const shownErrors = new Set<string>();\n\n function handleToolCall(event: AgentEvent) {\n const name = (event as any).tool?.name ?? (event as any).name ?? \"unknown\";\n emit({ type: \"tool\", name });\n }\n\n function handleError(event: AgentEvent) {\n const msg = (event as any).error ?? \"Unknown error\";\n reportedErrors.add(String(msg));\n shownErrors.add(String(msg));\n emit({ type: \"error\", message: String(msg) });\n if ((event as any).fatal) setState(\"stopped\");\n }\n\n // Flush any buffered text, emit a separator, and (on agent_end) go idle;\n // returns the cleared buffer.\n function handleTurnBoundary(event: AgentEvent, buffer: string): string {\n if (buffer.trim()) {\n emit({ type: \"text\", content: buffer });\n }\n emit({ type: \"separator\" });\n if (event.type === \"agent_end\") setState(\"idle\");\n return \"\";\n }\n\n function handleSubagent(event: AgentEvent) {\n const raw = event as any;\n if (raw.type !== \"subagent\") return;\n const status = raw.status === \"finished\" ? \"finished\" : \"started\";\n emit({\n type: \"subagent\",\n name: raw.name ?? \"subagent\",\n status,\n description: raw.description ?? \"\",\n });\n }\n\n session.harness.on(\"agent-event\", (event: AgentEvent) => {\n appendUnstreamed(event);\n const card = onApproval ? approvalCardOf(event) : undefined;\n if (card && onApproval) {\n emit({ type: \"question\", text: card.question });\n void onApproval(card.question, card.details)\n .catch(() => false)\n .then((approved) => {\n session.harness.answerQuestion(\n approved ? APPROVE_ONCE : DENY,\n card.question,\n card.requestId,\n );\n });\n }\n switch (event.type) {\n case \"message_update\":\n textBuffer = handleMessageUpdate(event, textBuffer);\n break;\n case \"message_retract\":\n textBuffer = handleMessageRetract(event.text, textBuffer);\n break;\n case \"tool_call\":\n handleToolCall(event);\n break;\n case \"error\":\n handleError(event);\n break;\n case \"agent_end\":\n case \"turn_end\":\n textBuffer = handleTurnBoundary(event, textBuffer);\n break;\n case \"session_info\":\n break;\n default:\n handleSubagent(event);\n break;\n }\n });\n\n return {\n get state() {\n return state;\n },\n\n shownErrors,\n\n send(text: string) {\n if (state === \"stopped\") return;\n setState(\"active\");\n textBuffer = \"\";\n reportedErrors.clear();\n session.harness.prompt(text).catch((err: Error) => {\n // A harness reports a failed turn as an `error` event and then rejects `prompt()` with the\n // same text: the user reads the cause once (p598).\n if (!reportedErrors.has(err.message)) {\n shownErrors.add(err.message);\n emit({ type: \"error\", message: err.message });\n }\n setState(\"idle\");\n });\n },\n\n stop() {\n setState(\"stopped\");\n session.harness.kill();\n void session.dispose();\n },\n };\n}\n\n/**\n * Create a telemetry sink that pipes {@link TelemetryLogEntry} events to the log callback.\n *\n * Wraps {@link renderLog} so that only displayable entries (generation, span_end for\n * tool/turn, trace lifecycle) are forwarded. Entries that `renderLog` returns `null`\n * for are silently suppressed. The returned function is used in `startRepl` to drain\n * buffered telemetry and to wire up live forwarding during the session.\n *\n * @param onLog - Callback invoked with an ANSI-rendered log string.\n * @returns A function that accepts a `TelemetryLogEntry` and routes it to `onLog`.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createTelemetrySink(\n onLog: (line: string) => void,\n): (entry: TelemetryLogEntry) => void {\n return (entry) => {\n const text = renderLog(entry);\n if (text) onLog(text);\n };\n}\n","/**\n * Local telemetry sink that emits structured events to the TUI log panel.\n *\n * Implements `TelemetryProvider` so it can be injected into `createAgentSession`\n * without any HTTP or OpenTelemetry overhead. Instead of exporting spans over a\n * network, it converts each lifecycle event (trace start/end, span start/end,\n * generation, metric) into a {@link TelemetryLogEntry} and forwards it via the\n * `onEvent` callback. The REPL uses this to optionally display timing and token\n * cost inline when `--verbose` is active.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Attributes,\n GenerationEvent,\n Span,\n SpanKind,\n SpanOptions,\n SpanResult,\n TelemetryProvider,\n Trace,\n TraceOptions,\n} from \"@skaile/workspaces/telemetry\";\n\n// ── Telemetry log entry types ────────────────────────────────────────────────\n\n/**\n * A structured telemetry event emitted by {@link TuiTelemetryProvider}.\n *\n * Discriminated union over `kind`. The TUI renders a subset of these (generation,\n * span_end for tool/turn, trace lifecycle) and suppresses the rest. Used as input\n * to {@link formatTelemetryEntry} and {@link renderLog}.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport type TelemetryLogEntry =\n | { kind: \"trace_start\"; traceId: string; name: string; traceKind: string }\n | { kind: \"trace_end\"; traceId: string; status: string; durationMs: number }\n | { kind: \"span_start\"; spanId: string; name: string; spanKind: SpanKind }\n | {\n kind: \"span_end\";\n spanId: string;\n name: string;\n spanKind: SpanKind;\n status: string;\n durationMs: number;\n }\n | {\n kind: \"generation\";\n model: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n durationMs: number;\n }\n | { kind: \"metric\"; name: string; value: number };\n\n// ── Internal span tracking ───────────────────────────────────────────────────\n\ninterface SpanRecord {\n spanId: string;\n traceId: string;\n name: string;\n spanKind: SpanKind;\n startTime: number;\n}\n\n// ── Provider ─────────────────────────────────────────────────────────────────\n\nexport class TuiTelemetryProvider implements TelemetryProvider {\n private readonly onEvent: (entry: TelemetryLogEntry) => void;\n private readonly spans = new Map<string, SpanRecord>();\n private readonly traces = new Map<string, { name: string; startTime: number }>();\n\n constructor(onEvent: (entry: TelemetryLogEntry) => void) {\n this.onEvent = onEvent;\n }\n\n startTrace(opts: TraceOptions): Trace {\n const traceId = randomUUID().replace(/-/g, \"\");\n const rootSpan: Span = { spanId: randomUUID().slice(0, 16), traceId };\n\n this.traces.set(traceId, { name: opts.name, startTime: Date.now() });\n this.onEvent({ kind: \"trace_start\", traceId, name: opts.name, traceKind: opts.kind });\n\n return { traceId, rootSpan };\n }\n\n endTrace(trace: Trace, result?: SpanResult): void {\n const record = this.traces.get(trace.traceId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"trace_end\",\n traceId: trace.traceId,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.traces.delete(trace.traceId);\n }\n }\n\n startSpan(parent: Trace | Span, opts: SpanOptions): Span {\n const spanId = randomUUID().slice(0, 16);\n const traceId = parent.traceId;\n const span: Span = { spanId, traceId };\n\n this.spans.set(spanId, {\n spanId,\n traceId,\n name: opts.name,\n spanKind: opts.kind,\n startTime: Date.now(),\n });\n\n this.onEvent({ kind: \"span_start\", spanId, name: opts.name, spanKind: opts.kind });\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const record = this.spans.get(span.spanId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"span_end\",\n spanId: span.spanId,\n name: record.name,\n spanKind: record.spanKind,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.spans.delete(span.spanId);\n }\n }\n\n addEvent(_span: Span, _name: string, _attrs?: Attributes): void {\n // Silently ignored — events are not surfaced in TUI\n }\n\n logGeneration(_span: Span, generation: GenerationEvent): void {\n this.onEvent({\n kind: \"generation\",\n model: generation.model,\n inputTokens: generation.inputTokens ?? 0,\n outputTokens: generation.outputTokens ?? 0,\n costUsd: generation.costUsd ?? 0,\n durationMs: generation.durationMs,\n });\n }\n\n recordMetric(name: string, value: number, _tags?: Record<string, string>): void {\n this.onEvent({ kind: \"metric\", name, value });\n }\n\n async flush(): Promise<void> {}\n async shutdown(): Promise<void> {\n this.spans.clear();\n this.traces.clear();\n }\n}\n\n// ── Log formatting ───────────────────────────────────────────────────────────\n\n/**\n * Format a {@link TelemetryLogEntry} into a human-readable string for the log panel.\n *\n * Produces plain (no ANSI) strings suitable for structured logging or non-terminal\n * output. The format mirrors {@link renderLog} but without colour codes: generation\n * entries include model, token counts, cost, and duration; span_end entries for\n * `tool_call` and `agent_turn` kinds include name, status, and duration; trace\n * lifecycle entries include name and elapsed time. Returns `null` for entry kinds\n * that should not be displayed.\n *\n * @param entry - The structured telemetry event to format.\n * @returns Human-readable string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport function formatTelemetryEntry(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return `[gen] ${entry.model} ${tokens}${cost}${dur}`;\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return `[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`;\n }\n if (entry.spanKind === \"agent_turn\") {\n return `[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`;\n }\n return null;\n case \"trace_start\":\n return `[trace] ${entry.name} started`;\n case \"trace_end\":\n return `[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`;\n default:\n return null;\n }\n}\n","/**\n * Simple @clack-based agent REPL.\n * No React, no ink, no alt-screen — just a scrolling terminal.\n *\n * Design: clack's text() blocks until user submits, so agent output\n * flows naturally between prompts — no readline interleaving issues.\n * Loop: await text() → send → await idle → loop\n *\n * Without a terminal (a pipe, a closed stdin) the prompt is replaced by plain\n * line reads and the loop ends at EOF.\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, parse, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport * as p from \"@clack/prompts\";\nimport { loadConnectorDeclarations } from \"@skaile/workspaces/connectors\";\nimport {\n DEFAULT_HARNESS_ID,\n deployedBase,\n harnessNameForHarnessId,\n resolveAgentDir,\n resolveSettings,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n type AgentSession,\n bootstrapRunnerLogStore,\n createAgentSession,\n instanceSessionOverrides,\n resolveInstanceAgentDir,\n unresolvedCredentialNotices,\n} from \"@skaile/workspaces/runner\";\nimport pc from \"picocolors\";\nimport { createReplSession, createTelemetrySink } from \"./repl-session.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\nimport { TuiTelemetryProvider } from \"./telemetry.js\";\n\nfunction findAiAssetsRoot(startDir: string): string | undefined {\n let current = resolve(startDir);\n const root = parse(current).root;\n while (current !== root) {\n const candidate = join(current, \"ai-assets\");\n try {\n if (statSync(candidate).isDirectory()) return candidate;\n } catch {}\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\n/**\n * Skills the session can use: the ones deployed into the project folder of the harness\n * (`.claude/skills`, `.omp/skills`, `.codex/skills`) plus the ones under an `ai-assets/` tree,\n * counted once per name.\n */\nfunction countSkills(projectDir: string, harness: string): number {\n const names = new Set<string>();\n const target = harnessNameForHarnessId(harness);\n if (target) {\n const base = deployedBase(\"skill\", target, false, projectDir);\n try {\n for (const e of readdirSync(base, { withFileTypes: true })) {\n if (existsSync(join(base, e.name, \"SKILL.md\"))) names.add(e.name);\n }\n } catch {}\n }\n const aiAssetsRoot = findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return names.size;\n const walk = (dir: string) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n if (entries.some((e) => e.isFile() && e.name === \"SKILL.md\")) {\n names.add(basename(dir));\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) walk(join(dir, e.name));\n }\n };\n walk(aiAssetsRoot);\n return names.size;\n}\n\n/**\n * Options for {@link startRepl}.\n *\n * @param projectDir - Absolute path to the project root. Used to locate the agent dir, settings, and skill count.\n * @param cwd - Working directory passed to the agent process. Defaults to `projectDir`.\n * @param harness - Agent harness override (`\"omp\"` or `\"claude-sdk\"`). Falls back to settings resolution.\n * @param model - Model name passed to the agent harness.\n * @param resume - When `true`, load the last session ID from `.skaile/last_session` and resume it.\n * @param resumeSessionId - Explicit session ID to resume. Takes precedence over `resume`.\n * @param verbose - When `true`, show telemetry log lines inline between prompts. Default: `false`.\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport interface ReplOptions {\n projectDir: string;\n cwd?: string;\n harness?: string;\n model?: string;\n resume?: boolean;\n resumeSessionId?: string;\n /** `skaile.yaml` `agents:` instance to run (default `default`, the primary `agent:`), with its overrides. */\n instanceId?: string;\n /** When true, show telemetry log lines inline. Default: false. */\n verbose?: boolean;\n}\n\n/**\n * Inject the ephemeral OMP workspace extension when the resolved harness is `omp`.\n *\n * Writes `.omp/extensions/skaile.ts` under {@link agentCwd} and returns a cleanup\n * callback that removes it. For non-`omp` harnesses this is a no-op (returns `undefined`).\n * A file already there (the one `skaile integration install --harness omp` committed) is the\n * project's own: it is neither rewritten nor removed. The file holds no host path unless the\n * agent runs in another folder than the project.\n */\nasync function injectOmpExtension(\n resolvedHarness: string,\n projectDir: string,\n agentCwd: string,\n): Promise<(() => void) | undefined> {\n if (resolvedHarness !== \"omp\") return undefined;\n\n const fsAsync = await import(\"node:fs/promises\");\n const pathMod = await import(\"node:path\");\n const { WorkspacePlugin } = await import(\"@skaile/workspaces/workspace-plugin\");\n\n const extPath = pathMod.default.join(agentCwd, \".omp\", \"extensions\", \"skaile.ts\");\n if (\n await fsAsync.default.stat(extPath).then(\n () => true,\n () => false,\n )\n )\n return undefined;\n const plugin = new WorkspacePlugin({ projectDir });\n const src = await plugin.buildOmpExtensionSource({ pinProjectDir: agentCwd !== projectDir });\n await fsAsync.default.mkdir(pathMod.default.dirname(extPath), { recursive: true });\n await fsAsync.default.writeFile(extPath, src);\n return () => {\n fsAsync.default.unlink(extPath).catch(() => {});\n };\n}\n\n/**\n * Resolve the session ID to resume, honoring the explicit `resumeSessionId` first\n * and otherwise reading `.skaile/last_session` when `resume` is set.\n */\nfunction resolveResumeSessionId(projectDir: string, opts: ReplOptions): string | undefined {\n let resumeSessionId = opts.resumeSessionId;\n if (!resumeSessionId && opts.resume) {\n const sessionFile = join(projectDir, \".skaile\", \"last_session\");\n try {\n if (existsSync(sessionFile)) {\n resumeSessionId = readFileSync(sessionFile, \"utf-8\").trim() || undefined;\n }\n } catch {}\n }\n return resumeSessionId;\n}\n\n/**\n * Names of the agents deployed in the harness's agent folder (`.claude/agents/<n>.md`,\n * `.omp/agents/<n>/` with its flat `<n>.md`, `.codex/agents/<n>.toml`), sorted, once per name.\n */\nfunction deployedAgentNames(projectDir: string, harness: string): string[] {\n const target = harnessNameForHarnessId(harness);\n if (!target) return [];\n const names = new Set<string>();\n try {\n for (const e of readdirSync(deployedBase(\"agent\", target, false, projectDir), {\n withFileTypes: true,\n })) {\n const name = e.isDirectory() ? e.name : e.name.replace(/\\.(md|toml)$/, \"\");\n if (name && !name.startsWith(\".\")) names.add(name);\n }\n } catch {}\n return [...names].sort();\n}\n\n/** Print the REPL intro banner with project, agent, and resume metadata. */\nfunction printBanner(args: {\n projectDir: string;\n displayHarness: string;\n displayModel: string;\n agentDir: string | undefined;\n resumeSessionId: string | undefined;\n}): void {\n const { projectDir, displayHarness, displayModel, agentDir, resumeSessionId } = args;\n\n const skillCount = countSkills(projectDir, displayHarness);\n let connectorCount = 0;\n try {\n connectorCount = loadConnectorDeclarations(projectDir).length;\n } catch {}\n // The session runs the agent of `agentDir` (an `--instance` or the project's `agent:`). Agents\n // `skaile add agent:` deployed into the harness folder are listed apart: the harness may\n // delegate to them, the session does not run as one of them (p1672).\n const deployed = agentDir ? [] : deployedAgentNames(projectDir, displayHarness);\n const agentName = agentDir ? basename(agentDir) : \"default\";\n\n p.intro(`${pc.bold(\"skaile repl\")} ${pc.dim(`— ${displayHarness} / ${displayModel}`)}`);\n p.log.info(pc.dim(`Project: ${projectDir}`));\n const counted = (n: number, noun: string): string => `${n} ${noun}${n === 1 ? \"\" : \"s\"}`;\n p.log.info(\n pc.dim(\n `Agent: ${agentName} · ${counted(skillCount, \"skill\")} · ${counted(connectorCount, \"connector\")}`,\n ),\n );\n if (deployed.length > 0) {\n p.log.info(\n pc.dim(\n `Deployed agents (not selected): ${deployed.join(\", \")} · run one with --instance <id> or set agent: in skaile.yaml`,\n ),\n );\n }\n if (resumeSessionId) p.log.info(pc.dim(`Resumed: ${resumeSessionId.slice(0, 12)}...`));\n p.log.info(pc.dim(\"Type /help for commands, Ctrl+C to quit.\"));\n}\n\n/** Discriminated outcome of handling a single line of REPL input. */\ntype ReplInputAction = \"quit\" | \"continue\" | \"send\";\n\n/**\n * Handle a trimmed line of REPL input that is a slash command (or empty).\n *\n * Returns `\"quit\"` to terminate the loop, `\"continue\"` to skip to the next prompt,\n * or `\"send\"` to forward the line to the agent. `setShowLog` toggles verbose output\n * for the `/log` command.\n */\nfunction handleReplInput(\n trimmed: string,\n showLog: boolean,\n setShowLog: (v: boolean) => void,\n): ReplInputAction {\n if (!trimmed) return \"continue\";\n\n if (trimmed === \"/quit\" || trimmed === \"/exit\" || trimmed === \"/q\") {\n return \"quit\";\n }\n if (trimmed === \"/help\" || trimmed === \"/h\" || trimmed === \"/?\") {\n p.log.info(\n [\n \" /help, /h — this help\",\n \" /log — toggle verbose log output\",\n \" /quit, /exit, /q — exit\",\n \" Ctrl+C — exit\",\n ].join(\"\\n\"),\n );\n return \"continue\";\n }\n if (trimmed === \"/log\") {\n const next = !showLog;\n setShowLog(next);\n p.log.info(`Log output: ${next ? \"on\" : \"off\"}`);\n return \"continue\";\n }\n\n return \"send\";\n}\n\n/**\n * Log host of the REPL: `[warn]` lines go to stderr at once; `[error]` lines are handed to\n * `onError`. A failed turn is printed once in the conversation, and the bridge's `[error]`\n * record of the same failure arrives later (the log store flushes at shutdown), so the REPL\n * holds the records and prints at the end only those no turn reported (see\n * {@link unreportedErrors}).\n */\nexport function makeStderrLog(onError: (line: string) => void): (line: string) => void {\n return (line) => {\n if (line.startsWith(\"[warn]\")) process.stderr.write(`${line}\\n`);\n else if (line.startsWith(\"[error]\")) onError(line);\n };\n}\n\n/**\n * The held `[error]` records whose text does not contain any message the conversation showed:\n * an error no turn reported (a connector or MCP server failing at startup) has no other place\n * to appear. A harness's own record of a failed turn (`[error] [bridge:<harness>] turn ended with\n * error — {...}`) words the failure differently from the message the conversation showed, so\n * once a turn reported an error the `[bridge:` records are the same failure again (p598): they\n * stay in the log database.\n */\nexport function unreportedErrors(held: readonly string[], shown: Iterable<string>): string[] {\n const messages = [...shown].filter((m) => m);\n return held.filter(\n (line) =>\n !messages.some((m) => line.includes(m)) &&\n !(messages.length > 0 && line.startsWith(\"[error] [bridge:\")),\n );\n}\n\n/**\n * Start the scrolling REPL for an interactive agent conversation.\n *\n * Initialises the agent session (including OMP extension injection when the harness is `omp`),\n * prints a banner with project metadata, then enters a `@clack/prompts` input loop.\n * Each iteration awaits user input, forwards it to the agent via {@link createReplSession},\n * and blocks until the agent signals `idle` or `stopped`. Slash commands (`/help`, `/log`,\n * `/quit`) are handled before the message reaches the agent.\n *\n * @param opts - Configuration for the REPL session.\n * @returns Resolves when the session ends (user quit or fatal error).\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport async function startRepl(opts: ReplOptions): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n const agentCwd = opts.cwd ? resolve(opts.cwd) : projectDir;\n\n // An unknown instance fails before anything is written (the OMP extension below).\n const instanceAgentDir = opts.instanceId\n ? resolveInstanceAgentDir(projectDir, resolveSkWorkspaceConfig(projectDir), opts.instanceId)\n : undefined;\n\n // The instance's own model and turn budget, as an `agent.run` of it would use; an\n // explicit --model still wins.\n const overrides = opts.instanceId\n ? instanceSessionOverrides(resolveSkWorkspaceConfig(projectDir), opts.instanceId)\n : {};\n const instanceModel = opts.model ? undefined : overrides.model;\n\n // ── OMP workspace extension injection ──────────────────────────────\n const settings = await resolveSettings(projectDir, { harness: opts.harness });\n const resolvedHarness = settings.harness ?? DEFAULT_HARNESS_ID;\n const ompCleanup = await injectOmpExtension(resolvedHarness, projectDir, agentCwd);\n\n // ── Session resume ─────────────────────────────────────────────────\n const resumeSessionId = resolveResumeSessionId(projectDir, opts);\n\n // ── Telemetry ──────────────────────────────────────────────────────\n const telemetryBuffer: TelemetryLogEntry[] = [];\n const telemetry = new TuiTelemetryProvider((entry) => {\n telemetryBuffer.push(entry);\n });\n const trace = telemetry.startTrace({ name: \"skaile-repl\", kind: \"chat_session\" });\n\n // ── Create agent session ───────────────────────────────────────────\n const agentDir = instanceAgentDir ?? resolveAgentDir(projectDir) ?? undefined;\n // Records go to the project's log db, not to stdout: stdout carries the conversation.\n // Warnings and errors still reach stderr.\n const heldErrors: string[] = [];\n const { dispose: disposeLogStore } = bootstrapRunnerLogStore({\n sessionId: `repl-${Date.now().toString(36)}`,\n projectDir,\n onLog: makeStderrLog((line) => heldErrors.push(line)),\n stdout: false,\n });\n let session: AgentSession;\n try {\n session = await createAgentSession({\n projectDir,\n cwd: agentCwd !== projectDir ? agentCwd : undefined,\n agentDir,\n ...(opts.instanceId ? { instanceId: opts.instanceId } : {}),\n harness: opts.harness ?? resolvedHarness,\n model: instanceModel ?? opts.model,\n ...(instanceModel ? { modelRef: instanceModel } : {}),\n ...(overrides.maxTurns !== undefined ? { maxTurns: overrides.maxTurns } : {}),\n resumeSessionId,\n telemetry,\n trace,\n onLog: () => {},\n });\n await session.harness.start();\n } catch (err) {\n ompCleanup?.();\n disposeLogStore();\n // The caller prints the thrown error; the held records name anything else that failed.\n const thrown = err instanceof Error ? err.message : String(err);\n for (const line of unreportedErrors(heldErrors, [thrown])) process.stderr.write(`${line}\\n`);\n throw err;\n }\n\n for (const notice of unresolvedCredentialNotices(session)) p.log.warn(notice);\n\n // ── Output + state tracking ────────────────────────────────────────\n let showLog = opts.verbose ?? false;\n let idleResolve: (() => void) | undefined;\n\n const write = (line: string) => {\n p.log.message(line);\n };\n\n const writeLog = (line: string) => {\n if (showLog) p.log.step(line);\n };\n\n // ── Create REPL session ────────────────────────────────────────────\n const replSession = createReplSession({\n session,\n onLine: write,\n onLog: writeLog,\n onStateChange: (state) => {\n if (state === \"idle\" || state === \"stopped\") {\n idleResolve?.();\n }\n },\n onApproval: async (question, details) => {\n // A pipe answers with its next line, a terminal with a confirm prompt; anything but yes denies.\n if (pipedLines) {\n for (const line of details) write(pc.dim(` ${line}`));\n write(pc.yellow(`${question} Approve once? [y/N]`));\n const next = await pipedLines.next();\n return !next.done && /^y(es)?$/i.test(next.value.trim());\n }\n const ok = await p.confirm({ message: `${question} ${pc.dim(details.join(\" \"))}` });\n return ok === true;\n },\n });\n\n // Drain buffered telemetry\n const sink = createTelemetrySink(writeLog);\n for (const entry of telemetryBuffer) sink(entry);\n telemetryBuffer.length = 0;\n\n // ── Banner ─────────────────────────────────────────────────────────\n printBanner({\n projectDir,\n displayHarness: session.harnessType ?? resolvedHarness,\n displayModel: session.model ?? opts.model ?? \"default\",\n agentDir,\n resumeSessionId,\n });\n\n // ── REPL loop ──────────────────────────────────────────────────────\n function shutdown() {\n replSession.stop();\n telemetry.endTrace(trace, { status: \"ok\" });\n void telemetry.shutdown();\n ompCleanup?.();\n disposeLogStore();\n p.outro(\"Bye.\");\n for (const line of unreportedErrors(heldErrors, replSession.shownErrors)) {\n process.stderr.write(`${line}\\n`);\n }\n process.exit(0);\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // A terminal gets the interactive prompt. A pipe or a closed stdin gets plain\n // line reads: `p.text` waits for a keypress that never comes, so the REPL\n // neither answered nor exited at EOF.\n const pipedLines = process.stdin.isTTY\n ? undefined\n : createInterface({ input: process.stdin })[Symbol.asyncIterator]();\n async function readInput(): Promise<string | undefined> {\n if (pipedLines) {\n const next = await pipedLines.next();\n return next.done ? undefined : next.value;\n }\n const input = await p.text({\n message: pc.gray(\">>>\"),\n placeholder: \"\",\n });\n return p.isCancel(input) ? undefined : (input as string);\n }\n\n while (replSession.state !== \"stopped\") {\n const input = await readInput();\n\n // Cancelled (Ctrl+C) or end of piped input.\n if (input === undefined) {\n shutdown();\n return;\n }\n\n const trimmed = input.trim();\n const action = handleReplInput(trimmed, showLog, (v) => {\n showLog = v;\n });\n if (action === \"quit\") {\n shutdown();\n return;\n }\n if (action === \"continue\") continue;\n\n const idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n replSession.send(trimmed);\n await idlePromise;\n }\n\n shutdown();\n}\n"]}
1
+ {"version":3,"sources":["../../tui/src/repl-renderer.ts","../../tui/src/repl-session.ts","../../tui/src/telemetry.ts","../../tui/src/repl.ts"],"names":["text","pc","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,SAAS,WAAW,IAAA,EAA0B;AACnD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,EAAA,CAAG,KAAK,EAAA,CAAG,IAAA,CAAK,KAAK,IAAA,CAAK,OAAO,EAAE,CAAC,CAAA;AAAA,IAC7C,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd,KAAK,MAAA;AACH,MAAA,OAAO,EAAA,CAAG,KAAK,EAAA,CAAG,MAAA,CAAO,gBAAgB,IAAA,CAAK,IAAI,OAAO,CAAC,CAAA;AAAA,IAC5D,KAAK,UAAA;AACH,MAAA,OAAO,EAAA,CAAG,MAAA,CAAO,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI;AAAA,eAAA,CAAmB,CAAA;AAAA,IACrD,KAAK,OAAA;AACH,MAAA,OAAO,EAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC,KAAK,QAAA;AACH,MAAA,OAAO,EAAA,CAAG,IAAI,EAAA,CAAG,MAAA,CAAO,GAAG,IAAA,CAAK,KAAK,KAAK,CAAC,CAAA;AAAA,IAC7C,KAAK,QAAA;AACH,MAAA,OAAO,GAAG,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACvC,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,QAAA;AAC/C,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,KAAW,SAAA,GAAY,EAAA,CAAG,OAAO,EAAA,CAAG,KAAA;AACvD,MAAA,OAAO,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,WAAW,CAAA,CAAE,CAAC,CAAA;AAAA,IACvE;AAAA,IACA,KAAK,WAAA;AACH,MAAA,OAAO,EAAA,CAAG,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IAC9B;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAeO,SAAS,UAAU,KAAA,EAAyC;AACjE,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,SAAS,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,OAAA,EAAK,MAAM,YAAY,CAAA,MAAA,CAAA;AAC1D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU,CAAA,GAAI,CAAA,EAAA,EAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AACnE,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA,EAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACjF,MAAA,OAAO,EAAA,CAAG,GAAA,CAAI,CAAA,MAAA,EAAS,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,IAAI,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,IACA,KAAK,UAAA;AACH,MAAA,IAAI,KAAA,CAAM,aAAa,WAAA,EAAa;AAClC,QAAA,OAAO,EAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,MAC5E;AACA,MAAA,IAAI,KAAA,CAAM,aAAa,YAAA,EAAc;AACnC,QAAA,OAAO,EAAA,CAAG,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAA,EAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC/E;AACA,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,EAAA,CAAG,GAAA,CAAI,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,IAC/C,KAAK,WAAA;AACH,MAAA,OAAO,EAAA,CAAG,IAAI,CAAA,aAAA,EAAA,CAAiB,KAAA,CAAM,aAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;ACfO,SAAS,kBAAkB,IAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAe,aAAA,EAAe,YAAW,GAAI,IAAA;AAE9D,EAAA,IAAI,KAAA,GAAsB,MAAA;AAC1B,EAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,EAAA,SAAS,KAAK,UAAA,EAAwB;AACpC,IAAA,MAAM,QAAA,GAAW,WAAW,UAAU,CAAA;AACtC,IAAA,IAAI,QAAA,WAAmB,QAAQ,CAAA;AAAA,EACjC;AAEA,EAAA,SAAS,SAAS,CAAA,EAAiB;AACjC,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,aAAA,GAAgB,CAAC,CAAA;AAAA,EACnB;AAKA,EAAA,SAAS,UAAA,CAAW,QAAgBA,KAAAA,EAAsB;AACxD,IAAA,IAAI,OAAO,MAAA,GAASA,KAAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,QAAA,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,CAAM,CAAC,GAAI,CAAA;AAAA,MAC3C;AACA,MAAA,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAA,CAAoB,OAAmB,MAAA,EAAwB;AACtE,IAAA,MAAM,QAAS,KAAA,CAAc,UAAA;AAC7B,IAAA,OAAO,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,EAC7C;AAIA,EAAA,MAAM,gBAAA,GAAmB,uBAAA,CAAwB,CAACA,KAAAA,KAAS;AACzD,IAAA,UAAA,GAAa,UAAA,CAAW,YAAYA,KAAI,CAAA;AAAA,EAC1C,CAAC,CAAA;AAKD,EAAA,SAAS,oBAAA,CAAqBA,OAAc,MAAA,EAAwB;AAClE,IAAA,IAAI,CAACA,KAAAA,IAAQ,CAAC,MAAA,EAAQ,OAAO,MAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,QAAA,CAASA,KAAI,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAA,GAASA,KAAAA,CAAK,MAAM,CAAA;AAC7E,IAAA,OAAOA,KAAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,EAAA,GAAK,MAAA;AAAA,EACtC;AAGA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,SAAS,eAAe,KAAA,EAAmB;AACzC,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAc,IAAA,EAAM,IAAA,IAAS,MAAc,IAAA,IAAQ,SAAA;AACjE,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EAC7B;AAEA,EAAA,SAAS,YAAY,KAAA,EAAmB;AACtC,IAAA,MAAM,GAAA,GAAO,MAAc,KAAA,IAAS,eAAA;AACpC,IAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9B,IAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,MAAA,CAAO,GAAG,GAAG,CAAA;AAC5C,IAAA,IAAK,KAAA,CAAc,KAAA,EAAO,QAAA,CAAS,SAAS,CAAA;AAAA,EAC9C;AAIA,EAAA,SAAS,kBAAA,CAAmB,OAAmB,MAAA,EAAwB;AACrE,IAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AAC1B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,QAAA,CAAS,MAAM,CAAA;AAC/C,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,SAAS,eAAe,KAAA,EAAmB;AACzC,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,SAAA;AACxD,IAAA,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,IAAI,IAAA,IAAQ,UAAA;AAAA,MAClB,MAAA;AAAA,MACA,WAAA,EAAa,IAAI,WAAA,IAAe;AAAA,KACjC,CAAA;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,OAAA,CAAQ,EAAA,CAAG,aAAA,EAAe,CAAC,KAAA,KAAsB;AACvD,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,cAAA,CAAe,KAAK,CAAA,GAAI,MAAA;AAClD,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAC9C,MAAA,KAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,CAAA,CACxC,KAAA,CAAM,MAAM,KAAK,CAAA,CACjB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,QAAA,OAAA,CAAQ,OAAA,CAAQ,cAAA;AAAA,UACd,WAAW,YAAA,GAAe,IAAA;AAAA,UAC1B,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF,CAAC,CAAA;AAAA,IACL;AACA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,gBAAA;AACH,QAAA,UAAA,GAAa,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,UAAA,GAAa,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA;AAAA,MACF,KAAK,WAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,UAAA,GAAa,kBAAA,CAAmB,OAAO,UAAU,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA;AAAA,MACF;AACE,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA;AAAA;AACJ,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,WAAA;AAAA,IAEA,KAAKA,KAAAA,EAAc;AACjB,MAAA,IAAI,UAAU,SAAA,EAAW;AACzB,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,UAAA,GAAa,EAAA;AACb,MAAA,cAAA,CAAe,KAAA,EAAM;AACrB,MAAA,OAAA,CAAQ,QAAQ,MAAA,CAAOA,KAAI,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAe;AAGjD,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,EAAG;AACpC,UAAA,WAAA,CAAY,GAAA,CAAI,IAAI,OAAO,CAAA;AAC3B,UAAA,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,QAC9C;AACA,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,OAAA,CAAQ,QAAQ,IAAA,EAAK;AACrB,MAAA,KAAK,QAAQ,OAAA,EAAQ;AAAA,IACvB;AAAA,GACF;AACF;AAeO,SAAS,oBACd,KAAA,EACoC;AACpC,EAAA,OAAO,CAAC,KAAA,KAAU;AAChB,IAAA,MAAMA,KAAAA,GAAO,UAAU,KAAK,CAAA;AAC5B,IAAA,IAAIA,KAAAA,QAAYA,KAAI,CAAA;AAAA,EACtB,CAAA;AACF;ACjLO,IAAM,uBAAN,MAAwD;AAAA,EAC5C,OAAA;AAAA,EACA,KAAA,uBAAY,GAAA,EAAwB;AAAA,EACpC,MAAA,uBAAa,GAAA,EAAiD;AAAA,EAE/E,YAAY,OAAA,EAA6C;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,WAAW,IAAA,EAA2B;AACpC,IAAA,MAAM,OAAA,GAAU,UAAA,EAAW,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAiB,EAAE,MAAA,EAAQ,UAAA,GAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,OAAA,EAAQ;AAEpE,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AACnE,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,CAAA;AAEpF,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAAA,EAEA,QAAA,CAAS,OAAc,MAAA,EAA2B;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,SAAA;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,QACX,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,QAAsB,IAAA,EAAyB;AACvD,IAAA,MAAM,MAAA,GAAS,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACvC,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,IAAA,GAAa,EAAE,MAAA,EAAQ,OAAA,EAAQ;AAErC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,MAAA,EAAQ;AAAA,MACrB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,CAAA;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,MAAY,MAAA,EAA2B;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACzC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,SAAA;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,QACX,IAAA,EAAM,UAAA;AAAA,QACN,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,KAAA,EAAa,KAAA,EAAe,MAAA,EAA2B;AAAA,EAEhE;AAAA,EAEA,aAAA,CAAc,OAAa,UAAA,EAAmC;AAC5D,IAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,MACX,IAAA,EAAM,YAAA;AAAA,MACN,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,WAAA,EAAa,WAAW,WAAA,IAAe,CAAA;AAAA,MACvC,YAAA,EAAc,WAAW,YAAA,IAAgB,CAAA;AAAA,MACzC,OAAA,EAAS,WAAW,OAAA,IAAW,CAAA;AAAA,MAC/B,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AAAA,EACH;AAAA,EAEA,YAAA,CAAa,IAAA,EAAc,KAAA,EAAe,KAAA,EAAsC;AAC9E,IAAA,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAAC;AAAA,EAC9B,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AACF;AAmBO,SAAS,qBAAqB,KAAA,EAAyC;AAC5E,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,SAAS,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,OAAA,EAAK,MAAM,YAAY,CAAA,MAAA,CAAA;AAC1D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU,CAAA,GAAI,CAAA,EAAA,EAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AACnE,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA,EAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACjF,MAAA,OAAO,CAAA,MAAA,EAAS,MAAM,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,IAAI,GAAG,GAAG,CAAA,CAAA;AAAA,IACpD;AAAA,IACA,KAAK,UAAA;AACH,MAAA,IAAI,KAAA,CAAM,aAAa,WAAA,EAAa;AAClC,QAAA,OAAO,CAAA,OAAA,EAAU,MAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA,EAAI,MAAM,UAAU,CAAA,EAAA,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,KAAA,CAAM,aAAa,YAAA,EAAc;AACnC,QAAA,OAAO,CAAA,OAAA,EAAU,MAAM,IAAI,CAAA,CAAA,EAAA,CAAK,MAAM,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MACrE;AACA,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAM,IAAI,CAAA,QAAA,CAAA;AAAA,IAC9B,KAAK,WAAA;AACH,MAAA,OAAO,iBAAiB,KAAA,CAAM,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7D;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;AClKA,SAAS,iBAAiB,QAAA,EAAsC;AAC9D,EAAA,IAAI,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAC5B,EAAA,OAAO,YAAY,IAAA,EAAM;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC3C,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,CAAE,WAAA,IAAe,OAAO,SAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAAC;AACT,IAAA,MAAM,MAAA,GAAS,QAAQ,OAAO,CAAA;AAC9B,IAAA,IAAI,WAAW,OAAA,EAAS;AACxB,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAA,CAAY,YAAoB,OAAA,EAAyB;AAChE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,MAAA,GAAS,wBAAwB,OAAO,CAAA;AAC9C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,MAAA,EAAQ,OAAO,UAAU,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,KAAK,WAAA,CAAY,IAAA,EAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAC1D,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,UAAU,CAAC,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAAA,MAClE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACA,EAAA,MAAM,YAAA,GAAe,iBAAiB,UAAU,CAAA;AAChD,EAAA,IAAI,CAAC,YAAA,EAAc,OAAO,KAAA,CAAM,IAAA;AAChC,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAO,IAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG;AAC5D,MAAA,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA;AACvB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,aAAY,EAAG,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA;AACA,EAAA,IAAA,CAAK,YAAY,CAAA;AACjB,EAAA,OAAO,KAAA,CAAM,IAAA;AACf;AAqCA,eAAe,kBAAA,CACb,eAAA,EACA,UAAA,EACA,QAAA,EACmC;AACnC,EAAA,IAAI,eAAA,KAAoB,OAAO,OAAO,MAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAO,aAAkB,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,MAAM,OAAO,MAAW,CAAA;AACxC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,8BAAqC,CAAA;AAE9E,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,CAAQ,KAAK,QAAA,EAAU,MAAA,EAAQ,cAAc,WAAW,CAAA;AAChF,EAAA,IACE,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AAAA,IAClC,MAAM,IAAA;AAAA,IACN,MAAM;AAAA,GACR;AAEA,IAAA,OAAO,MAAA;AACT,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,YAAY,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,uBAAA,CAAwB,EAAE,aAAA,EAAe,QAAA,KAAa,YAAY,CAAA;AAC3F,EAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACjF,EAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAS,GAAG,CAAA;AAC5C,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChD,CAAA;AACF;AAMA,SAAS,sBAAA,CAAuB,YAAoB,IAAA,EAAuC;AACzF,EAAA,IAAI,kBAAkB,IAAA,CAAK,eAAA;AAC3B,EAAA,IAAI,CAAC,eAAA,IAAmB,IAAA,CAAK,MAAA,EAAQ;AACnC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,cAAc,CAAA;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,eAAA,GAAkB,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA,CAAE,MAAK,IAAK,KAAA,CAAA;AAAA,MACjE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACA,EAAA,OAAO,eAAA;AACT;AAMA,SAAS,kBAAA,CAAmB,YAAoB,OAAA,EAA2B;AACzE,EAAA,MAAM,MAAA,GAAS,wBAAwB,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,KAAK,WAAA,CAAY,YAAA,CAAa,SAAS,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA,EAAG;AAAA,MAC5E,aAAA,EAAe;AAAA,KAChB,CAAA,EAAG;AACF,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AACzE,MAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,IACnD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK;AACzB;AAGA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,QAAA;AAAA,IACL,GAAA,CACG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAClB,OAAA,CAAQ,MAAA,EAAQ,EAAE;AAAA,GACvB;AACF;AAQO,SAAS,kBAAA,CACd,YACA,QAAA,EAC8C;AAC9C,EAAA,IAAI,YAAsB,EAAC;AAC3B,EAAA,IAAI,KAAA,uBAAY,GAAA,EAAY;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,yBAAyB,UAAU,CAAA;AAClD,IAAA,SAAA,GAAY,sBAAsB,MAAM,CAAA;AACxC,IAAA,KAAA,uBAAY,GAAA,CAAI;AAAA,MACd,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,KAAA,EAAO,SAAA,IAAa,EAAE,CAAA;AAAA,MAC5C,GAAG,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,SAAA,IAAa,EAAE,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,GAAG,CAAC;AAAA,KAC/E,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA,EAAE;AAC7E;AAGA,SAAS,YAAY,IAAA,EAMZ;AACP,EAAA,MAAM,EAAE,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAc,QAAA,EAAU,iBAAgB,GAAI,IAAA;AAEhF,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,UAAA,EAAY,cAAc,CAAA;AACzD,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI;AACF,IAAA,cAAA,GAAiB,yBAAA,CAA0B,UAAU,CAAA,CAAE,MAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AAAA,EAAC;AAKT,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,KAAc,QAAA,GAC7B,EAAE,WAAW,EAAC,EAAG,SAAA,EAAW,IAAG,GAC/B,kBAAA,CAAmB,YAAY,kBAAA,CAAmB,UAAA,EAAY,cAAc,CAAC,CAAA;AACjF,EAAA,MAAM,SAAA,GAAY,QAAA,GAAW,QAAA,CAAS,QAAQ,CAAA,GAAI,SAAA;AAElD,EAAE,CAAA,CAAA,KAAA,CAAM,CAAA,EAAGC,EAAAA,CAAG,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAIA,EAAAA,CAAG,GAAA,CAAI,UAAK,cAAc,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AACtF,EAAE,MAAI,IAAA,CAAKA,EAAAA,CAAG,IAAI,CAAA,SAAA,EAAY,UAAU,EAAE,CAAC,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,IAAA,KAAyB,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA;AACtF,EAAE,CAAA,CAAA,GAAA,CAAI,IAAA;AAAA,IACJA,EAAAA,CAAG,GAAA;AAAA,MACD,CAAA,OAAA,EAAU,SAAS,CAAA,MAAA,EAAM,OAAA,CAAQ,UAAA,EAAY,OAAO,CAAC,CAAA,MAAA,EAAM,OAAA,CAAQ,cAAA,EAAgB,WAAW,CAAC,CAAA;AAAA;AACjG,GACF;AACA,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAK,CAAA,CAAA,GAAA,CAAI,IAAA,CAAKA,EAAAA,CAAG,GAAA,CAAI,CAAA,WAAA,EAAc,kBAAA,CAAmB,SAAS,CAAC,EAAE,CAAC,CAAA;AAC1F,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,GAAU,UAAU,MAAA,GAAS,CAAA,GAAI,qBAAqB,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACtF,IAAE,CAAA,CAAA,GAAA,CAAI,IAAA,CAAKA,EAAAA,CAAG,GAAA,CAAI,CAAA,SAAA,EAAY,OAAO,CAAA,EAAA,EAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,eAAA,EAAmB,CAAA,CAAA,GAAA,CAAI,IAAA,CAAKA,EAAAA,CAAG,GAAA,CAAI,CAAA,SAAA,EAAY,eAAA,CAAgB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACrF,EAAE,CAAA,CAAA,GAAA,CAAI,IAAA,CAAKA,EAAAA,CAAG,GAAA,CAAI,0CAA0C,CAAC,CAAA;AAC/D;AAYA,SAAS,eAAA,CACP,OAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,EAAA,IAAI,CAAC,SAAS,OAAO,UAAA;AAErB,EAAA,IAAI,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,OAAA,IAAW,YAAY,IAAA,EAAM;AAClE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,IAAA,IAAQ,YAAY,IAAA,EAAM;AAC/D,IAAE,CAAA,CAAA,GAAA,CAAI,IAAA;AAAA,MACJ;AAAA,QACE,gCAAA;AAAA,QACA,gDAAA;AAAA,QACA,gCAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,OAAO,CAAC,OAAA;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAE,MAAI,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,GAAO,IAAA,GAAO,KAAK,CAAA,CAAE,CAAA;AAC/C,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,cAAc,OAAA,EAAyD;AACrF,EAAA,OAAO,CAAC,IAAA,KAAS;AACf,IAAA,IAAI,IAAA,CAAK,WAAW,QAAQ,CAAA,UAAW,MAAA,CAAO,KAAA,CAAM,GAAG,IAAI;AAAA,CAAI,CAAA;AAAA,SAAA,IACtD,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,UAAW,IAAI,CAAA;AAAA,EACnD,CAAA;AACF;AAUO,SAAS,gBAAA,CAAiB,MAAyB,KAAA,EAAmC;AAC3F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,EAAE,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACV,CAAC,IAAA,KACC,CAAC,SAAS,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,KACtC,EAAE,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,WAAW,kBAAkB,CAAA;AAAA,GAC/D;AACF;AAgBA,eAAsB,UAAU,IAAA,EAAkC;AAChE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAC1C,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI,UAAA;AAGhD,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,UAAA,GAC1B,uBAAA,CAAwB,UAAA,EAAY,yBAAyB,UAAU,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,GACzF,MAAA;AAIJ,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,GACnB,wBAAA,CAAyB,wBAAA,CAAyB,UAAU,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,GAC9E,EAAC;AACL,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,GAAQ,MAAA,GAAY,SAAA,CAAU,KAAA;AAGzD,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,UAAA,EAAY,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAC5E,EAAA,MAAM,eAAA,GAAkB,SAAS,OAAA,IAAW,kBAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,eAAA,EAAiB,YAAY,QAAQ,CAAA;AAGjF,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,UAAA,EAAY,IAAI,CAAA;AAG/D,EAAA,MAAM,kBAAuC,EAAC;AAC9C,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB,CAAC,KAAA,KAAU;AACpD,IAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,EAC5B,CAAC,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,UAAU,UAAA,CAAW,EAAE,MAAM,aAAA,EAAe,IAAA,EAAM,gBAAgB,CAAA;AAGhF,EAAA,MAAM,QAAA,GAAW,gBAAA,IAAoB,eAAA,CAAgB,UAAU,CAAA,IAAK,MAAA;AAGpE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,EAAgB,GAAI,uBAAA,CAAwB;AAAA,IAC3D,WAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAAA,IAC1C,UAAA;AAAA,IACA,OAAO,aAAA,CAAc,CAAC,SAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACpD,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,kBAAA,CAAmB;AAAA,MACjC,UAAA;AAAA,MACA,GAAA,EAAK,QAAA,KAAa,UAAA,GAAa,QAAA,GAAW,KAAA,CAAA;AAAA,MAC1C,QAAA;AAAA,MACA,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,MACzD,OAAA,EAAS,KAAK,OAAA,IAAW,eAAA;AAAA,MACzB,KAAA,EAAO,iBAAiB,IAAA,CAAK,KAAA;AAAA,MAC7B,GAAI,aAAA,GAAgB,EAAE,QAAA,EAAU,aAAA,KAAkB,EAAC;AAAA,MACnD,GAAI,UAAU,QAAA,KAAa,KAAA,CAAA,GAAY,EAAE,QAAA,EAAU,SAAA,CAAU,QAAA,EAAS,GAAI,EAAC;AAAA,MAC3E,eAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAO,MAAM;AAAA,MAAC;AAAA,KACf,CAAA;AACD,IAAA,MAAM,OAAA,CAAQ,QAAQ,KAAA,EAAM;AAAA,EAC9B,SAAS,GAAA,EAAK;AACZ,IAAA,UAAA,IAAa;AACb,IAAA,eAAA,EAAgB;AAEhB,IAAA,MAAM,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC9D,IAAA,KAAA,MAAW,IAAA,IAAQ,gBAAA,CAAiB,UAAA,EAAY,CAAC,MAAM,CAAC,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAC3F,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,KAAA,MAAW,UAAU,2BAAA,CAA4B,OAAO,GAAK,CAAA,CAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAG5E,EAAA,IAAI,OAAA,GAAU,KAAK,OAAA,IAAW,KAAA;AAC9B,EAAA,IAAI,WAAA;AAEJ,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAiB;AAC9B,IAAE,CAAA,CAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,IAAA,IAAI,OAAA,EAAW,CAAA,CAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9B,CAAA;AAGA,EAAA,MAAM,cAAc,iBAAA,CAAkB;AAAA,IACpC,OAAA;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IAER,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,MAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,SAAA,EAAW;AAC3C,QAAA,WAAA,IAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,UAAA,EAAY,OAAO,QAAA,EAAU,OAAA,KAAY;AAEvC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,CAAMA,EAAAA,CAAG,IAAI,CAAA,EAAA,EAAK,IAAI,EAAE,CAAC,CAAA;AACrD,QAAA,KAAA,CAAMA,EAAAA,CAAG,MAAA,CAAO,CAAA,EAAG,QAAQ,sBAAsB,CAAC,CAAA;AAClD,QAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAA,EAAK;AACnC,QAAA,OAAO,CAAC,KAAK,IAAA,IAAQ,WAAA,CAAY,KAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,KAAK,MAAQ,CAAA,CAAA,OAAA,CAAQ,EAAE,OAAA,EAAS,GAAG,QAAQ,CAAA,CAAA,EAAIA,EAAAA,CAAG,GAAA,CAAI,QAAQ,IAAA,CAAK,GAAG,CAAC,CAAC,IAAI,CAAA;AAClF,MAAA,OAAO,EAAA,KAAO,IAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,IAAA,GAAO,oBAAoB,QAAQ,CAAA;AACzC,EAAA,KAAA,MAAW,KAAA,IAAS,eAAA,EAAiB,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AAGzB,EAAA,WAAA,CAAY;AAAA,IACV,UAAA;AAAA,IACA,cAAA,EAAgB,QAAQ,WAAA,IAAe,eAAA;AAAA,IACvC,YAAA,EAAc,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,SAAA;AAAA,IAC7C,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,SAAS,QAAA,GAAW;AAClB,IAAA,WAAA,CAAY,IAAA,EAAK;AACjB,IAAA,SAAA,CAAU,QAAA,CAAS,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC1C,IAAA,KAAK,UAAU,QAAA,EAAS;AACxB,IAAA,UAAA,IAAa;AACb,IAAA,eAAA,EAAgB;AAChB,IAAE,QAAM,MAAM,CAAA;AACd,IAAA,KAAA,MAAW,IAAA,IAAQ,gBAAA,CAAiB,UAAA,EAAY,WAAA,CAAY,WAAW,CAAA,EAAG;AACxE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAAA,IAClC;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,QAAQ,CAAA;AAC7B,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,QAAQ,CAAA;AAK9B,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,KAAA,GAC7B,SACA,eAAA,CAAgB,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,aAAa,CAAA,EAAE;AACpE,EAAA,eAAe,SAAA,GAAyC;AACtD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAA,EAAK;AACnC,MAAA,OAAO,IAAA,CAAK,IAAA,GAAO,MAAA,GAAY,IAAA,CAAK,KAAA;AAAA,IACtC;AACA,IAAA,MAAM,KAAA,GAAQ,MAAQ,CAAA,CAAA,IAAA,CAAK;AAAA,MACzB,OAAA,EAASA,EAAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,MACtB,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,OAAS,CAAA,CAAA,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA,GAAa,KAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,WAAA,CAAY,UAAU,SAAA,EAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,EAAU;AAG9B,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,QAAA,EAAS;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,OAAA,EAAS,OAAA,EAAS,CAAC,CAAA,KAAM;AACtD,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,QAAA,EAAS;AACT,MAAA;AAAA,IACF;AACA,IAAA,IAAI,WAAW,UAAA,EAAY;AAE3B,IAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAc,CAACC,QAAAA,KAAY;AACjD,MAAA,WAAA,GAAcA,QAAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AACxB,IAAA,MAAM,WAAA;AAAA,EACR;AAEA,EAAA,QAAA,EAAS;AACX","file":"index.js","sourcesContent":["import type { OutputLine } from \"@skaile/workspaces\";\nimport pc from \"picocolors\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Render a single OutputLine to an ANSI-colored string for terminal display.\n *\n * Each `OutputLine` variant is mapped to a distinct colour: user input (cyan/bold),\n * agent text (plain), tool calls (blue italic), questions (yellow), errors (red),\n * status/system messages (dim italic), subagent lifecycle (blue/green italic), and\n * separator lines (dim dashes). Returns an empty string for unrecognised variants.\n *\n * @param line - The typed output line to render.\n * @returns ANSI-coloured string ready for terminal output.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLine(line: OutputLine): string {\n switch (line.type) {\n case \"user\":\n return pc.cyan(pc.bold(`> ${line.content}`));\n case \"text\":\n return line.content;\n case \"tool\":\n return pc.blue(pc.italic(` Running: \\`${line.name}\\`...`));\n case \"question\":\n return pc.yellow(`?? ${line.text}\\n Reply below.`);\n case \"error\":\n return pc.red(`Error: ${line.message}`);\n case \"status\":\n return pc.dim(pc.italic(`${line.phase}...`));\n case \"system\":\n return pc.dim(pc.italic(line.message));\n case \"subagent\": {\n const icon = line.status === \"started\" ? \"▶\" : \"✓\";\n const color = line.status === \"started\" ? pc.blue : pc.green;\n return color(pc.italic(` ${icon} ${line.name}: ${line.description}`));\n }\n case \"separator\":\n return pc.dim(\"─\".repeat(60));\n default:\n return \"\";\n }\n}\n\n/**\n * Render a telemetry log entry to an ANSI string, or null to suppress.\n *\n * Formats `generation` entries with model name, token counts, cost, and duration;\n * `span_end` entries for `tool_call` and `agent_turn` kinds; and `trace_start` /\n * `trace_end` lifecycle entries. All output is styled dim for visual de-emphasis.\n * Returns `null` for entry kinds that should not appear in the log panel.\n *\n * @param entry - The structured telemetry event to render.\n * @returns Dim ANSI string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLog(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return pc.dim(`[gen] ${entry.model} ${tokens}${cost}${dur}`);\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return pc.dim(`[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`);\n }\n if (entry.spanKind === \"agent_turn\") {\n return pc.dim(`[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`);\n }\n return null;\n case \"trace_start\":\n return pc.dim(`[trace] ${entry.name} started`);\n case \"trace_end\":\n return pc.dim(`[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`);\n default:\n return null;\n }\n}\n","/**\n * Slim event bridge: maps AgentHarness events to rendered console lines.\n * No React, no ink, no UI state — just event → string → callback.\n */\n\nimport type { OutputLine, SessionState } from \"@skaile/workspaces\";\nimport { APPROVE_ONCE, type AgentEvent, approvalCardOf, DENY } from \"@skaile/workspaces/bridge\";\nimport { type AgentSession, createFinalTextFallback } from \"@skaile/workspaces/runner\";\nimport { renderLine, renderLog } from \"./repl-renderer.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Handle returned by {@link createReplSession} for controlling an active REPL session.\n *\n * `state` reflects the current lifecycle state (`idle`, `active`, or `stopped`).\n * Call `send(text)` to forward a user message to the agent harness; the state\n * transitions to `active` until the harness emits `agent_end`. Call `stop()` to\n * terminate the harness and dispose of the underlying agent session.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface ReplSessionHandle {\n readonly state: SessionState;\n /** Every error text the session showed in the conversation (for the whole session). */\n readonly shownErrors: ReadonlySet<string>;\n send(text: string): void;\n stop(): void;\n}\n\n/**\n * Options for {@link createReplSession}.\n *\n * @param session - The agent session returned by `createAgentSession`.\n * @param onLine - Callback invoked with an ANSI-rendered string for each output line.\n * @param onLog - Callback invoked with a log string for each telemetry event (if verbose).\n * @param onStateChange - Callback invoked whenever the session state changes.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface CreateReplSessionOpts {\n session: AgentSession;\n onLine?: (line: string) => void;\n onLog?: (line: string) => void;\n onStateChange?: (state: SessionState) => void;\n /**\n * Settles a tool approval card (`permission_mode: interactive`): `true` answers `Approve once`,\n * `false` denies. Without it the card is shown and nothing answers it, so the turn waits.\n */\n onApproval?: (question: string, details: string[]) => Promise<boolean>;\n}\n\n/**\n * Create a slim event bridge that maps `AgentEvent` stream to rendered console lines.\n *\n * Subscribes to `agent-event` on the session harness and converts each event type\n * (`message_update`, `tool_call`, `error`, `agent_end`, `turn_end`, `subagent`) to\n * an `OutputLine`, renders it via {@link renderLine}, and forwards the string to\n * `opts.onLine`. Text content is buffered internally and flushed line-by-line as\n * newlines arrive. Returns a {@link ReplSessionHandle} for sending messages and\n * stopping the session.\n *\n * @param opts - Session, output callbacks, and state-change hook.\n * @returns Handle for sending messages and observing session state.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createReplSession(opts: CreateReplSessionOpts): ReplSessionHandle {\n const { session, onLine, onLog, onStateChange, onApproval } = opts;\n\n let state: SessionState = \"idle\";\n let textBuffer = \"\";\n\n function emit(outputLine: OutputLine) {\n const rendered = renderLine(outputLine);\n if (rendered) onLine?.(rendered);\n }\n\n function setState(s: SessionState) {\n state = s;\n onStateChange?.(s);\n }\n\n // Append streamed text to the buffer and flush every completed\n // (newline-terminated) line; returns the new buffer holding the trailing\n // partial line.\n function appendText(buffer: string, text: string): string {\n let next = buffer + text;\n const lines = next.split(\"\\n\");\n if (lines.length > 1) {\n for (let i = 0; i < lines.length - 1; i++) {\n emit({ type: \"text\", content: lines[i]! });\n }\n next = lines[lines.length - 1]!;\n }\n return next;\n }\n\n function handleMessageUpdate(event: AgentEvent, buffer: string): string {\n const delta = (event as any)._textDelta as string | undefined;\n return delta ? appendText(buffer, delta) : buffer;\n }\n\n // omp 18.x puts the whole reply into the assistant `message_start`, so no\n // delta ever follows; the reply is taken from the message when it ends.\n const appendUnstreamed = createFinalTextFallback((text) => {\n textBuffer = appendText(textBuffer, text);\n });\n\n // Cut a replayed attempt's fragment off the unwritten partial line. Lines\n // already written to the terminal cannot be taken back, so only this tail is:\n // when the fragment spanned a newline, the whole buffer belongs to it.\n function handleMessageRetract(text: string, buffer: string): string {\n if (!text || !buffer) return buffer;\n if (buffer.endsWith(text)) return buffer.slice(0, buffer.length - text.length);\n return text.endsWith(buffer) ? \"\" : buffer;\n }\n\n /** Error texts already shown for the turn in flight. */\n const reportedErrors = new Set<string>();\n const shownErrors = new Set<string>();\n\n function handleToolCall(event: AgentEvent) {\n const name = (event as any).tool?.name ?? (event as any).name ?? \"unknown\";\n emit({ type: \"tool\", name });\n }\n\n function handleError(event: AgentEvent) {\n const msg = (event as any).error ?? \"Unknown error\";\n reportedErrors.add(String(msg));\n shownErrors.add(String(msg));\n emit({ type: \"error\", message: String(msg) });\n if ((event as any).fatal) setState(\"stopped\");\n }\n\n // Flush any buffered text, emit a separator, and (on agent_end) go idle;\n // returns the cleared buffer.\n function handleTurnBoundary(event: AgentEvent, buffer: string): string {\n if (buffer.trim()) {\n emit({ type: \"text\", content: buffer });\n }\n emit({ type: \"separator\" });\n if (event.type === \"agent_end\") setState(\"idle\");\n return \"\";\n }\n\n function handleSubagent(event: AgentEvent) {\n const raw = event as any;\n if (raw.type !== \"subagent\") return;\n const status = raw.status === \"finished\" ? \"finished\" : \"started\";\n emit({\n type: \"subagent\",\n name: raw.name ?? \"subagent\",\n status,\n description: raw.description ?? \"\",\n });\n }\n\n session.harness.on(\"agent-event\", (event: AgentEvent) => {\n appendUnstreamed(event);\n const card = onApproval ? approvalCardOf(event) : undefined;\n if (card && onApproval) {\n emit({ type: \"question\", text: card.question });\n void onApproval(card.question, card.details)\n .catch(() => false)\n .then((approved) => {\n session.harness.answerQuestion(\n approved ? APPROVE_ONCE : DENY,\n card.question,\n card.requestId,\n );\n });\n }\n switch (event.type) {\n case \"message_update\":\n textBuffer = handleMessageUpdate(event, textBuffer);\n break;\n case \"message_retract\":\n textBuffer = handleMessageRetract(event.text, textBuffer);\n break;\n case \"tool_call\":\n handleToolCall(event);\n break;\n case \"error\":\n handleError(event);\n break;\n case \"agent_end\":\n case \"turn_end\":\n textBuffer = handleTurnBoundary(event, textBuffer);\n break;\n case \"session_info\":\n break;\n default:\n handleSubagent(event);\n break;\n }\n });\n\n return {\n get state() {\n return state;\n },\n\n shownErrors,\n\n send(text: string) {\n if (state === \"stopped\") return;\n setState(\"active\");\n textBuffer = \"\";\n reportedErrors.clear();\n session.harness.prompt(text).catch((err: Error) => {\n // A harness reports a failed turn as an `error` event and then rejects `prompt()` with the\n // same text: the user reads the cause once (p598).\n if (!reportedErrors.has(err.message)) {\n shownErrors.add(err.message);\n emit({ type: \"error\", message: err.message });\n }\n setState(\"idle\");\n });\n },\n\n stop() {\n setState(\"stopped\");\n session.harness.kill();\n void session.dispose();\n },\n };\n}\n\n/**\n * Create a telemetry sink that pipes {@link TelemetryLogEntry} events to the log callback.\n *\n * Wraps {@link renderLog} so that only displayable entries (generation, span_end for\n * tool/turn, trace lifecycle) are forwarded. Entries that `renderLog` returns `null`\n * for are silently suppressed. The returned function is used in `startRepl` to drain\n * buffered telemetry and to wire up live forwarding during the session.\n *\n * @param onLog - Callback invoked with an ANSI-rendered log string.\n * @returns A function that accepts a `TelemetryLogEntry` and routes it to `onLog`.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createTelemetrySink(\n onLog: (line: string) => void,\n): (entry: TelemetryLogEntry) => void {\n return (entry) => {\n const text = renderLog(entry);\n if (text) onLog(text);\n };\n}\n","/**\n * Local telemetry sink that emits structured events to the TUI log panel.\n *\n * Implements `TelemetryProvider` so it can be injected into `createAgentSession`\n * without any HTTP or OpenTelemetry overhead. Instead of exporting spans over a\n * network, it converts each lifecycle event (trace start/end, span start/end,\n * generation, metric) into a {@link TelemetryLogEntry} and forwards it via the\n * `onEvent` callback. The REPL uses this to optionally display timing and token\n * cost inline when `--verbose` is active.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Attributes,\n GenerationEvent,\n Span,\n SpanKind,\n SpanOptions,\n SpanResult,\n TelemetryProvider,\n Trace,\n TraceOptions,\n} from \"@skaile/workspaces/telemetry\";\n\n// ── Telemetry log entry types ────────────────────────────────────────────────\n\n/**\n * A structured telemetry event emitted by {@link TuiTelemetryProvider}.\n *\n * Discriminated union over `kind`. The TUI renders a subset of these (generation,\n * span_end for tool/turn, trace lifecycle) and suppresses the rest. Used as input\n * to {@link formatTelemetryEntry} and {@link renderLog}.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport type TelemetryLogEntry =\n | { kind: \"trace_start\"; traceId: string; name: string; traceKind: string }\n | { kind: \"trace_end\"; traceId: string; status: string; durationMs: number }\n | { kind: \"span_start\"; spanId: string; name: string; spanKind: SpanKind }\n | {\n kind: \"span_end\";\n spanId: string;\n name: string;\n spanKind: SpanKind;\n status: string;\n durationMs: number;\n }\n | {\n kind: \"generation\";\n model: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n durationMs: number;\n }\n | { kind: \"metric\"; name: string; value: number };\n\n// ── Internal span tracking ───────────────────────────────────────────────────\n\ninterface SpanRecord {\n spanId: string;\n traceId: string;\n name: string;\n spanKind: SpanKind;\n startTime: number;\n}\n\n// ── Provider ─────────────────────────────────────────────────────────────────\n\nexport class TuiTelemetryProvider implements TelemetryProvider {\n private readonly onEvent: (entry: TelemetryLogEntry) => void;\n private readonly spans = new Map<string, SpanRecord>();\n private readonly traces = new Map<string, { name: string; startTime: number }>();\n\n constructor(onEvent: (entry: TelemetryLogEntry) => void) {\n this.onEvent = onEvent;\n }\n\n startTrace(opts: TraceOptions): Trace {\n const traceId = randomUUID().replace(/-/g, \"\");\n const rootSpan: Span = { spanId: randomUUID().slice(0, 16), traceId };\n\n this.traces.set(traceId, { name: opts.name, startTime: Date.now() });\n this.onEvent({ kind: \"trace_start\", traceId, name: opts.name, traceKind: opts.kind });\n\n return { traceId, rootSpan };\n }\n\n endTrace(trace: Trace, result?: SpanResult): void {\n const record = this.traces.get(trace.traceId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"trace_end\",\n traceId: trace.traceId,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.traces.delete(trace.traceId);\n }\n }\n\n startSpan(parent: Trace | Span, opts: SpanOptions): Span {\n const spanId = randomUUID().slice(0, 16);\n const traceId = parent.traceId;\n const span: Span = { spanId, traceId };\n\n this.spans.set(spanId, {\n spanId,\n traceId,\n name: opts.name,\n spanKind: opts.kind,\n startTime: Date.now(),\n });\n\n this.onEvent({ kind: \"span_start\", spanId, name: opts.name, spanKind: opts.kind });\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const record = this.spans.get(span.spanId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"span_end\",\n spanId: span.spanId,\n name: record.name,\n spanKind: record.spanKind,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.spans.delete(span.spanId);\n }\n }\n\n addEvent(_span: Span, _name: string, _attrs?: Attributes): void {\n // Silently ignored — events are not surfaced in TUI\n }\n\n logGeneration(_span: Span, generation: GenerationEvent): void {\n this.onEvent({\n kind: \"generation\",\n model: generation.model,\n inputTokens: generation.inputTokens ?? 0,\n outputTokens: generation.outputTokens ?? 0,\n costUsd: generation.costUsd ?? 0,\n durationMs: generation.durationMs,\n });\n }\n\n recordMetric(name: string, value: number, _tags?: Record<string, string>): void {\n this.onEvent({ kind: \"metric\", name, value });\n }\n\n async flush(): Promise<void> {}\n async shutdown(): Promise<void> {\n this.spans.clear();\n this.traces.clear();\n }\n}\n\n// ── Log formatting ───────────────────────────────────────────────────────────\n\n/**\n * Format a {@link TelemetryLogEntry} into a human-readable string for the log panel.\n *\n * Produces plain (no ANSI) strings suitable for structured logging or non-terminal\n * output. The format mirrors {@link renderLog} but without colour codes: generation\n * entries include model, token counts, cost, and duration; span_end entries for\n * `tool_call` and `agent_turn` kinds include name, status, and duration; trace\n * lifecycle entries include name and elapsed time. Returns `null` for entry kinds\n * that should not be displayed.\n *\n * @param entry - The structured telemetry event to format.\n * @returns Human-readable string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport function formatTelemetryEntry(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return `[gen] ${entry.model} ${tokens}${cost}${dur}`;\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return `[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`;\n }\n if (entry.spanKind === \"agent_turn\") {\n return `[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`;\n }\n return null;\n case \"trace_start\":\n return `[trace] ${entry.name} started`;\n case \"trace_end\":\n return `[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`;\n default:\n return null;\n }\n}\n","/**\n * Simple @clack-based agent REPL.\n * No React, no ink, no alt-screen — just a scrolling terminal.\n *\n * Design: clack's text() blocks until user submits, so agent output\n * flows naturally between prompts — no readline interleaving issues.\n * Loop: await text() → send → await idle → loop\n *\n * Without a terminal (a pipe, a closed stdin) the prompt is replaced by plain\n * line reads and the loop ends at EOF.\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, parse, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport * as p from \"@clack/prompts\";\nimport { loadConnectorDeclarations } from \"@skaile/workspaces/connectors\";\nimport {\n DEFAULT_HARNESS_ID,\n deployedBase,\n harnessNameForHarnessId,\n instanceChoiceText,\n unselectedInstanceIds,\n resolveAgentDir,\n resolveSettings,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n type AgentSession,\n bootstrapRunnerLogStore,\n createAgentSession,\n instanceSessionOverrides,\n resolveInstanceAgentDir,\n unresolvedCredentialNotices,\n} from \"@skaile/workspaces/runner\";\nimport pc from \"picocolors\";\nimport { createReplSession, createTelemetrySink } from \"./repl-session.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\nimport { TuiTelemetryProvider } from \"./telemetry.js\";\n\nfunction findAiAssetsRoot(startDir: string): string | undefined {\n let current = resolve(startDir);\n const root = parse(current).root;\n while (current !== root) {\n const candidate = join(current, \"ai-assets\");\n try {\n if (statSync(candidate).isDirectory()) return candidate;\n } catch {}\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\n/**\n * Skills the session can use: the ones deployed into the project folder of the harness\n * (`.claude/skills`, `.omp/skills`, `.codex/skills`) plus the ones under an `ai-assets/` tree,\n * counted once per name.\n */\nfunction countSkills(projectDir: string, harness: string): number {\n const names = new Set<string>();\n const target = harnessNameForHarnessId(harness);\n if (target) {\n const base = deployedBase(\"skill\", target, false, projectDir);\n try {\n for (const e of readdirSync(base, { withFileTypes: true })) {\n if (existsSync(join(base, e.name, \"SKILL.md\"))) names.add(e.name);\n }\n } catch {}\n }\n const aiAssetsRoot = findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return names.size;\n const walk = (dir: string) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n if (entries.some((e) => e.isFile() && e.name === \"SKILL.md\")) {\n names.add(basename(dir));\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) walk(join(dir, e.name));\n }\n };\n walk(aiAssetsRoot);\n return names.size;\n}\n\n/**\n * Options for {@link startRepl}.\n *\n * @param projectDir - Absolute path to the project root. Used to locate the agent dir, settings, and skill count.\n * @param cwd - Working directory passed to the agent process. Defaults to `projectDir`.\n * @param harness - Agent harness override (`\"omp\"` or `\"claude-sdk\"`). Falls back to settings resolution.\n * @param model - Model name passed to the agent harness.\n * @param resume - When `true`, load the last session ID from `.skaile/last_session` and resume it.\n * @param resumeSessionId - Explicit session ID to resume. Takes precedence over `resume`.\n * @param verbose - When `true`, show telemetry log lines inline between prompts. Default: `false`.\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport interface ReplOptions {\n projectDir: string;\n cwd?: string;\n harness?: string;\n model?: string;\n resume?: boolean;\n resumeSessionId?: string;\n /** `skaile.yaml` `agents:` instance to run (default `default`, the primary `agent:`), with its overrides. */\n instanceId?: string;\n /** When true, show telemetry log lines inline. Default: false. */\n verbose?: boolean;\n}\n\n/**\n * Inject the ephemeral OMP workspace extension when the resolved harness is `omp`.\n *\n * Writes `.omp/extensions/skaile.ts` under {@link agentCwd} and returns a cleanup\n * callback that removes it. For non-`omp` harnesses this is a no-op (returns `undefined`).\n * A file already there (the one `skaile integration install --harness omp` committed) is the\n * project's own: it is neither rewritten nor removed. The file holds no host path unless the\n * agent runs in another folder than the project.\n */\nasync function injectOmpExtension(\n resolvedHarness: string,\n projectDir: string,\n agentCwd: string,\n): Promise<(() => void) | undefined> {\n if (resolvedHarness !== \"omp\") return undefined;\n\n const fsAsync = await import(\"node:fs/promises\");\n const pathMod = await import(\"node:path\");\n const { WorkspacePlugin } = await import(\"@skaile/workspaces/workspace-plugin\");\n\n const extPath = pathMod.default.join(agentCwd, \".omp\", \"extensions\", \"skaile.ts\");\n if (\n await fsAsync.default.stat(extPath).then(\n () => true,\n () => false,\n )\n )\n return undefined;\n const plugin = new WorkspacePlugin({ projectDir });\n const src = await plugin.buildOmpExtensionSource({ pinProjectDir: agentCwd !== projectDir });\n await fsAsync.default.mkdir(pathMod.default.dirname(extPath), { recursive: true });\n await fsAsync.default.writeFile(extPath, src);\n return () => {\n fsAsync.default.unlink(extPath).catch(() => {});\n };\n}\n\n/**\n * Resolve the session ID to resume, honoring the explicit `resumeSessionId` first\n * and otherwise reading `.skaile/last_session` when `resume` is set.\n */\nfunction resolveResumeSessionId(projectDir: string, opts: ReplOptions): string | undefined {\n let resumeSessionId = opts.resumeSessionId;\n if (!resumeSessionId && opts.resume) {\n const sessionFile = join(projectDir, \".skaile\", \"last_session\");\n try {\n if (existsSync(sessionFile)) {\n resumeSessionId = readFileSync(sessionFile, \"utf-8\").trim() || undefined;\n }\n } catch {}\n }\n return resumeSessionId;\n}\n\n/**\n * Names of the agents deployed in the harness's agent folder (`.claude/agents/<n>.md`,\n * `.omp/agents/<n>/` with its flat `<n>.md`, `.codex/agents/<n>.toml`), sorted, once per name.\n */\nfunction deployedAgentNames(projectDir: string, harness: string): string[] {\n const target = harnessNameForHarnessId(harness);\n if (!target) return [];\n const names = new Set<string>();\n try {\n for (const e of readdirSync(deployedBase(\"agent\", target, false, projectDir), {\n withFileTypes: true,\n })) {\n const name = e.isDirectory() ? e.name : e.name.replace(/\\.(md|toml)$/, \"\");\n if (name && !name.startsWith(\".\")) names.add(name);\n }\n } catch {}\n return [...names].sort();\n}\n\n/** Asset name of an instance `ref` (`agent:@pub/captain#1.0.0` and `./agents/captain` give `captain`). */\nfunction refAssetName(ref: string): string {\n return basename(\n ref\n .replace(/^agent:/, \"\")\n .replace(/#.*$/, \"\")\n .replace(/\\/+$/, \"\"),\n );\n}\n\n/**\n * What the banner offers when the session runs no agent of its own: the declared instances\n * (`--instance <id>` takes them) and, apart, the deployed agents that are not one of them. A\n * delegate is a sub-agent the harness reaches through an instance; it is not an instance, so\n * `--instance <delegate>` fails.\n */\nexport function bannerAgentChoices(\n projectDir: string,\n deployed: readonly string[],\n): { instances: string[]; delegates: string[] } {\n let instances: string[] = [];\n let bound = new Set<string>();\n try {\n const config = resolveSkWorkspaceConfig(projectDir);\n instances = unselectedInstanceIds(config);\n bound = new Set([\n ...Object.keys(config.agent?.instances ?? {}),\n ...Object.values(config.agent?.instances ?? {}).map((i) => refAssetName(i.ref)),\n ]);\n } catch {}\n return { instances, delegates: deployed.filter((name) => !bound.has(name)) };\n}\n\n/** Print the REPL intro banner with project, agent, and resume metadata. */\nfunction printBanner(args: {\n projectDir: string;\n displayHarness: string;\n displayModel: string;\n agentDir: string | undefined;\n resumeSessionId: string | undefined;\n}): void {\n const { projectDir, displayHarness, displayModel, agentDir, resumeSessionId } = args;\n\n const skillCount = countSkills(projectDir, displayHarness);\n let connectorCount = 0;\n try {\n connectorCount = loadConnectorDeclarations(projectDir).length;\n } catch {}\n // The session runs the agent of `agentDir` (an `--instance` or the project's `agent:`). Without\n // one, the declared instances are listed for `--instance`, and the agents `skaile add agent:`\n // deployed into the harness folder that are no instance are listed as delegates: the harness\n // may reach them through an instance, the session cannot run as one of them.\n const { instances, delegates } = agentDir\n ? { instances: [], delegates: [] }\n : bannerAgentChoices(projectDir, deployedAgentNames(projectDir, displayHarness));\n const agentName = agentDir ? basename(agentDir) : \"default\";\n\n p.intro(`${pc.bold(\"skaile repl\")} ${pc.dim(`— ${displayHarness} / ${displayModel}`)}`);\n p.log.info(pc.dim(`Project: ${projectDir}`));\n const counted = (n: number, noun: string): string => `${n} ${noun}${n === 1 ? \"\" : \"s\"}`;\n p.log.info(\n pc.dim(\n `Agent: ${agentName} · ${counted(skillCount, \"skill\")} · ${counted(connectorCount, \"connector\")}`,\n ),\n );\n if (instances.length > 0) p.log.info(pc.dim(`Instances: ${instanceChoiceText(instances)}`));\n if (delegates.length > 0) {\n const through = instances.length > 0 ? ` (reached through ${instances.join(\", \")})` : \"\";\n p.log.info(pc.dim(`Delegates${through}: ${delegates.join(\", \")}`));\n }\n if (resumeSessionId) p.log.info(pc.dim(`Resumed: ${resumeSessionId.slice(0, 12)}...`));\n p.log.info(pc.dim(\"Type /help for commands, Ctrl+C to quit.\"));\n}\n\n/** Discriminated outcome of handling a single line of REPL input. */\ntype ReplInputAction = \"quit\" | \"continue\" | \"send\";\n\n/**\n * Handle a trimmed line of REPL input that is a slash command (or empty).\n *\n * Returns `\"quit\"` to terminate the loop, `\"continue\"` to skip to the next prompt,\n * or `\"send\"` to forward the line to the agent. `setShowLog` toggles verbose output\n * for the `/log` command.\n */\nfunction handleReplInput(\n trimmed: string,\n showLog: boolean,\n setShowLog: (v: boolean) => void,\n): ReplInputAction {\n if (!trimmed) return \"continue\";\n\n if (trimmed === \"/quit\" || trimmed === \"/exit\" || trimmed === \"/q\") {\n return \"quit\";\n }\n if (trimmed === \"/help\" || trimmed === \"/h\" || trimmed === \"/?\") {\n p.log.info(\n [\n \" /help, /h — this help\",\n \" /log — toggle verbose log output\",\n \" /quit, /exit, /q — exit\",\n \" Ctrl+C — exit\",\n ].join(\"\\n\"),\n );\n return \"continue\";\n }\n if (trimmed === \"/log\") {\n const next = !showLog;\n setShowLog(next);\n p.log.info(`Log output: ${next ? \"on\" : \"off\"}`);\n return \"continue\";\n }\n\n return \"send\";\n}\n\n/**\n * Log host of the REPL: `[warn]` lines go to stderr at once; `[error]` lines are handed to\n * `onError`. A failed turn is printed once in the conversation, and the bridge's `[error]`\n * record of the same failure arrives later (the log store flushes at shutdown), so the REPL\n * holds the records and prints at the end only those no turn reported (see\n * {@link unreportedErrors}).\n */\nexport function makeStderrLog(onError: (line: string) => void): (line: string) => void {\n return (line) => {\n if (line.startsWith(\"[warn]\")) process.stderr.write(`${line}\\n`);\n else if (line.startsWith(\"[error]\")) onError(line);\n };\n}\n\n/**\n * The held `[error]` records whose text does not contain any message the conversation showed:\n * an error no turn reported (a connector or MCP server failing at startup) has no other place\n * to appear. A harness's own record of a failed turn (`[error] [bridge:<harness>] turn ended with\n * error — {...}`) words the failure differently from the message the conversation showed, so\n * once a turn reported an error the `[bridge:` records are the same failure again (p598): they\n * stay in the log database.\n */\nexport function unreportedErrors(held: readonly string[], shown: Iterable<string>): string[] {\n const messages = [...shown].filter((m) => m);\n return held.filter(\n (line) =>\n !messages.some((m) => line.includes(m)) &&\n !(messages.length > 0 && line.startsWith(\"[error] [bridge:\")),\n );\n}\n\n/**\n * Start the scrolling REPL for an interactive agent conversation.\n *\n * Initialises the agent session (including OMP extension injection when the harness is `omp`),\n * prints a banner with project metadata, then enters a `@clack/prompts` input loop.\n * Each iteration awaits user input, forwards it to the agent via {@link createReplSession},\n * and blocks until the agent signals `idle` or `stopped`. Slash commands (`/help`, `/log`,\n * `/quit`) are handled before the message reaches the agent.\n *\n * @param opts - Configuration for the REPL session.\n * @returns Resolves when the session ends (user quit or fatal error).\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport async function startRepl(opts: ReplOptions): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n const agentCwd = opts.cwd ? resolve(opts.cwd) : projectDir;\n\n // An unknown instance fails before anything is written (the OMP extension below).\n const instanceAgentDir = opts.instanceId\n ? resolveInstanceAgentDir(projectDir, resolveSkWorkspaceConfig(projectDir), opts.instanceId)\n : undefined;\n\n // The instance's own model and turn budget, as an `agent.run` of it would use; an\n // explicit --model still wins.\n const overrides = opts.instanceId\n ? instanceSessionOverrides(resolveSkWorkspaceConfig(projectDir), opts.instanceId)\n : {};\n const instanceModel = opts.model ? undefined : overrides.model;\n\n // ── OMP workspace extension injection ──────────────────────────────\n const settings = await resolveSettings(projectDir, { harness: opts.harness });\n const resolvedHarness = settings.harness ?? DEFAULT_HARNESS_ID;\n const ompCleanup = await injectOmpExtension(resolvedHarness, projectDir, agentCwd);\n\n // ── Session resume ─────────────────────────────────────────────────\n const resumeSessionId = resolveResumeSessionId(projectDir, opts);\n\n // ── Telemetry ──────────────────────────────────────────────────────\n const telemetryBuffer: TelemetryLogEntry[] = [];\n const telemetry = new TuiTelemetryProvider((entry) => {\n telemetryBuffer.push(entry);\n });\n const trace = telemetry.startTrace({ name: \"skaile-repl\", kind: \"chat_session\" });\n\n // ── Create agent session ───────────────────────────────────────────\n const agentDir = instanceAgentDir ?? resolveAgentDir(projectDir) ?? undefined;\n // Records go to the project's log db, not to stdout: stdout carries the conversation.\n // Warnings and errors still reach stderr.\n const heldErrors: string[] = [];\n const { dispose: disposeLogStore } = bootstrapRunnerLogStore({\n sessionId: `repl-${Date.now().toString(36)}`,\n projectDir,\n onLog: makeStderrLog((line) => heldErrors.push(line)),\n stdout: false,\n });\n let session: AgentSession;\n try {\n session = await createAgentSession({\n projectDir,\n cwd: agentCwd !== projectDir ? agentCwd : undefined,\n agentDir,\n ...(opts.instanceId ? { instanceId: opts.instanceId } : {}),\n harness: opts.harness ?? resolvedHarness,\n model: instanceModel ?? opts.model,\n ...(instanceModel ? { modelRef: instanceModel } : {}),\n ...(overrides.maxTurns !== undefined ? { maxTurns: overrides.maxTurns } : {}),\n resumeSessionId,\n telemetry,\n trace,\n onLog: () => {},\n });\n await session.harness.start();\n } catch (err) {\n ompCleanup?.();\n disposeLogStore();\n // The caller prints the thrown error; the held records name anything else that failed.\n const thrown = err instanceof Error ? err.message : String(err);\n for (const line of unreportedErrors(heldErrors, [thrown])) process.stderr.write(`${line}\\n`);\n throw err;\n }\n\n for (const notice of unresolvedCredentialNotices(session)) p.log.warn(notice);\n\n // ── Output + state tracking ────────────────────────────────────────\n let showLog = opts.verbose ?? false;\n let idleResolve: (() => void) | undefined;\n\n const write = (line: string) => {\n p.log.message(line);\n };\n\n const writeLog = (line: string) => {\n if (showLog) p.log.step(line);\n };\n\n // ── Create REPL session ────────────────────────────────────────────\n const replSession = createReplSession({\n session,\n onLine: write,\n onLog: writeLog,\n onStateChange: (state) => {\n if (state === \"idle\" || state === \"stopped\") {\n idleResolve?.();\n }\n },\n onApproval: async (question, details) => {\n // A pipe answers with its next line, a terminal with a confirm prompt; anything but yes denies.\n if (pipedLines) {\n for (const line of details) write(pc.dim(` ${line}`));\n write(pc.yellow(`${question} Approve once? [y/N]`));\n const next = await pipedLines.next();\n return !next.done && /^y(es)?$/i.test(next.value.trim());\n }\n const ok = await p.confirm({ message: `${question} ${pc.dim(details.join(\" \"))}` });\n return ok === true;\n },\n });\n\n // Drain buffered telemetry\n const sink = createTelemetrySink(writeLog);\n for (const entry of telemetryBuffer) sink(entry);\n telemetryBuffer.length = 0;\n\n // ── Banner ─────────────────────────────────────────────────────────\n printBanner({\n projectDir,\n displayHarness: session.harnessType ?? resolvedHarness,\n displayModel: session.model ?? opts.model ?? \"default\",\n agentDir,\n resumeSessionId,\n });\n\n // ── REPL loop ──────────────────────────────────────────────────────\n function shutdown() {\n replSession.stop();\n telemetry.endTrace(trace, { status: \"ok\" });\n void telemetry.shutdown();\n ompCleanup?.();\n disposeLogStore();\n p.outro(\"Bye.\");\n for (const line of unreportedErrors(heldErrors, replSession.shownErrors)) {\n process.stderr.write(`${line}\\n`);\n }\n process.exit(0);\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // A terminal gets the interactive prompt. A pipe or a closed stdin gets plain\n // line reads: `p.text` waits for a keypress that never comes, so the REPL\n // neither answered nor exited at EOF.\n const pipedLines = process.stdin.isTTY\n ? undefined\n : createInterface({ input: process.stdin })[Symbol.asyncIterator]();\n async function readInput(): Promise<string | undefined> {\n if (pipedLines) {\n const next = await pipedLines.next();\n return next.done ? undefined : next.value;\n }\n const input = await p.text({\n message: pc.gray(\">>>\"),\n placeholder: \"\",\n });\n return p.isCancel(input) ? undefined : (input as string);\n }\n\n while (replSession.state !== \"stopped\") {\n const input = await readInput();\n\n // Cancelled (Ctrl+C) or end of piped input.\n if (input === undefined) {\n shutdown();\n return;\n }\n\n const trimmed = input.trim();\n const action = handleReplInput(trimmed, showLog, (v) => {\n showLog = v;\n });\n if (action === \"quit\") {\n shutdown();\n return;\n }\n if (action === \"continue\") continue;\n\n const idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n replSession.send(trimmed);\n await idlePromise;\n }\n\n shutdown();\n}\n"]}
@@ -34,6 +34,16 @@ export interface ReplOptions {
34
34
  /** When true, show telemetry log lines inline. Default: false. */
35
35
  verbose?: boolean;
36
36
  }
37
+ /**
38
+ * What the banner offers when the session runs no agent of its own: the declared instances
39
+ * (`--instance <id>` takes them) and, apart, the deployed agents that are not one of them. A
40
+ * delegate is a sub-agent the harness reaches through an instance; it is not an instance, so
41
+ * `--instance <delegate>` fails.
42
+ */
43
+ export declare function bannerAgentChoices(projectDir: string, deployed: readonly string[]): {
44
+ instances: string[];
45
+ delegates: string[];
46
+ };
37
47
  /**
38
48
  * Log host of the REPL: `[warn]` lines go to stderr at once; `[error]` lines are handed to
39
49
  * `onError`. A failed turn is printed once in the conversation, and the bridge's `[error]`
@@ -1 +1 @@
1
- {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../../tui/src/repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiFH;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA4JD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAKrF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAO3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqLhE"}
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../../tui/src/repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmFH;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqFD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAY9C;AAoFD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAKrF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAO3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqLhE"}
@@ -1,4 +1,4 @@
1
- export { AGENT_RUN_STATUSES, CONNECTOR_ERROR_KINDS, MENTION_GROUPS, PLATFORM_BLOCKS_RUNTIME_FEATURE, PROTOCOL_VERSION, PROTOCOL_VERSION_STRING, QUICK_REACTIONS, RANGED_WRITE_MIN_PROTOCOL, SESSION_ROOT_CONNECTOR_ID, TERMINAL_AGENT_RUN_STATUSES, TOOL_ACTIVITY_LABEL_DESCRIPTION, TOOL_ACTIVITY_LABEL_MAX_CHARS, TOOL_ACTIVITY_LABEL_PARAM, TOOL_ACTIVITY_PROMPT_SECTION, declaresActivityLabel, deliveryClassOf, formatVersion, isRenderCapability, isUserInvokable, parseVersion, stripActivityLabel, withActivityLabelDefs, withActivityLabelJsonSchema, withActivityLabelShape } from '../chunk-G5SYFFMD.js';
1
+ export { AGENT_RUN_STATUSES, CONNECTOR_ERROR_KINDS, MENTION_GROUPS, PLATFORM_BLOCKS_RUNTIME_FEATURE, PROTOCOL_VERSION, PROTOCOL_VERSION_STRING, QUICK_REACTIONS, RANGED_WRITE_MIN_PROTOCOL, SESSION_ROOT_CONNECTOR_ID, TERMINAL_AGENT_RUN_STATUSES, TOOL_ACTIVITY_LABEL_DESCRIPTION, TOOL_ACTIVITY_LABEL_MAX_CHARS, TOOL_ACTIVITY_LABEL_PARAM, TOOL_ACTIVITY_PROMPT_SECTION, declaresActivityLabel, deliveryClassOf, formatVersion, isRenderCapability, isUserInvokable, parseVersion, stripActivityLabel, withActivityLabelDefs, withActivityLabelJsonSchema, withActivityLabelShape } from '../chunk-ASBZOTEO.js';
2
2
  import '../chunk-NSBPE2FW.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -286,7 +286,7 @@ export type ProtocolVersion = {
286
286
  * rather than reject the input, which is also what allows a third rejection
287
287
  * later without a major bump. A 3.10 host against a 3.9 runner never sees the
288
288
  * field and must not read its absence as "not a limit" (feature-detect on
289
- * `major === 3 && minor >= 10`).
289
+ * `major > 3 || (major === 3 && minor >= 10)`).
290
290
  * Spec: skaile-ai/platform#3562.
291
291
  *
292
292
  * Changed in 3.9.0:
@@ -308,7 +308,7 @@ export type ProtocolVersion = {
308
308
  * A 3.8 peer is unaffected: nothing was removed or re-shaped, every addition is
309
309
  * opt-in on a field a 3.8 peer never sets. A 3.9 host against a 3.8 runner sees
310
310
  * no `provider_response_seen` and must not read that as "no limits were hit"
311
- * (feature-detect on `major === 3 && minor >= 9`).
311
+ * (feature-detect on `major > 3 || (major === 3 && minor >= 9)`).
312
312
  *
313
313
  * Changed in 3.8.0:
314
314
  * Additive `prompt` receipt acknowledgement. The `prompt` command gains an
@@ -318,7 +318,7 @@ export type ProtocolVersion = {
318
318
  * could previously drop a prompt with no trace at all. When absent nothing is
319
319
  * emitted, so a 3.7 host sees byte-identical behaviour. A 3.8 host against a
320
320
  * 3.7 runner gets no ack and must not read that as a lost prompt — feature-detect
321
- * on `major === 3 && minor >= 8`. The ack is receipt-only: it says the frame
321
+ * on `major > 3 || (major === 3 && minor >= 8)`. The ack is receipt-only: it says the frame
322
322
  * arrived, never that the turn ran.
323
323
  *
324
324
  * Changed in 3.7.0:
@@ -341,7 +341,7 @@ export type ProtocolVersion = {
341
341
  * opt-in on a field a 3.6 host never sets, and unknown fields ride through the
342
342
  * round-trip. A 3.7 host against a 3.6 runner sees `requestId` ignored and no
343
343
  * response, which it must treat as "unacknowledged" (feature-detect on
344
- * `major === 3 && minor >= 7`). Spec: `runner/MIGRATION-flow-connector.md`.
344
+ * `major > 3 || (major === 3 && minor >= 7)`). Spec: `runner/MIGRATION-flow-connector.md`.
345
345
  *
346
346
  * Changed in 3.6.0:
347
347
  * Additive resolved-agent-config wire field. `ResolvedSkaileConfig` gains an
@@ -1,6 +1,6 @@
1
- export { buildWorkspaceMcpServer, buildWorkspaceMcpStdioServer, buildWorkspaceToolDefs, runMcpServerStdio } from '../../chunk-GTGWRKMJ.js';
2
- import '../../chunk-7I5PNB2G.js';
3
- import '../../chunk-O7QZI6MQ.js';
1
+ export { buildWorkspaceMcpServer, buildWorkspaceMcpStdioServer, buildWorkspaceToolDefs, runMcpServerStdio } from '../../chunk-37X4A6VZ.js';
2
+ import '../../chunk-L7QOZG5V.js';
3
+ import '../../chunk-BB5EJLKZ.js';
4
4
  import '../../chunk-WYZXSJBK.js';
5
5
  import '../../chunk-GTAHU4N4.js';
6
6
  import '../../chunk-HQAPUPBE.js';
@@ -8,42 +8,44 @@ import '../../chunk-KW37WNXY.js';
8
8
  import '../../chunk-3MWQKQUB.js';
9
9
  import '../../chunk-PTJTOPE5.js';
10
10
  import '../../chunk-USSP43U3.js';
11
- import '../../chunk-VXYZ5M7Z.js';
12
- import '../../chunk-2M3VLKT2.js';
13
- import '../../chunk-4BFEPZ6J.js';
14
- import '../../chunk-YN6N3RBM.js';
15
- import '../../chunk-TCH5UDKT.js';
16
- import '../../chunk-U3UDOX6I.js';
17
- import '../../chunk-65UAC3ZR.js';
11
+ import '../../chunk-LX4TTTRR.js';
12
+ import '../../chunk-NURTGAWM.js';
13
+ import '../../chunk-ZBA4P5TD.js';
14
+ import '../../chunk-HMVAGPYR.js';
15
+ import '../../chunk-UCB7FK25.js';
16
+ import '../../chunk-HPXONAI2.js';
17
+ import '../../chunk-N6ZGB5ES.js';
18
18
  import '../../chunk-LOO5CB5M.js';
19
- import '../../chunk-KSUT5KAE.js';
20
- import '../../chunk-OY22B7E2.js';
19
+ import '../../chunk-LZPJOF7Y.js';
20
+ import '../../chunk-SBNUXJ6E.js';
21
+ import '../../chunk-WWSRIT3J.js';
22
+ import '../../chunk-4C2E5QUP.js';
21
23
  import '../../chunk-5DE3DGVR.js';
22
24
  import '../../chunk-7DN6JKP2.js';
23
- import '../../chunk-WW5NAU6N.js';
24
- import '../../chunk-MXI3XWV6.js';
25
- import '../../chunk-F4CZQD3T.js';
26
- import '../../chunk-BSMW3PX2.js';
25
+ import '../../chunk-PLLZSKOO.js';
26
+ import '../../chunk-XON6ODIC.js';
27
27
  import '../../chunk-G5SUWZEU.js';
28
+ import '../../chunk-3HSLJAMJ.js';
29
+ import '../../chunk-6UP2EDFN.js';
28
30
  import '../../chunk-IFGTRL2I.js';
29
- import '../../chunk-5XHQBCB5.js';
31
+ import '../../chunk-WFK4MUBL.js';
30
32
  import '../../chunk-WD3L5QSU.js';
31
33
  import '../../chunk-7RGTAEG6.js';
32
- import '../../chunk-G5SYFFMD.js';
34
+ import '../../chunk-ASBZOTEO.js';
33
35
  import '../../chunk-LNFKL23K.js';
34
36
  import '../../chunk-JRN5QF4C.js';
35
37
  import '../../chunk-NUELZWCF.js';
36
38
  import '../../chunk-VT6G5AJV.js';
37
- import '../../chunk-6ARPZHOV.js';
39
+ import '../../chunk-TMJBEGS4.js';
38
40
  import '../../chunk-4GY63JU6.js';
39
- import '../../chunk-JIQUF3X2.js';
41
+ import '../../chunk-G7NMF5WQ.js';
40
42
  import '../../chunk-5KRMNUL4.js';
41
43
  import '../../chunk-C5HFK34M.js';
42
44
  import '../../chunk-MWXYN6NY.js';
43
- import '../../chunk-6SXSVKQY.js';
45
+ import '../../chunk-O7ADRMCR.js';
44
46
  import '../../chunk-L5VSIPQD.js';
45
47
  import '../../chunk-VTETQCR6.js';
46
- import '../../chunk-E2EC6SAX.js';
48
+ import '../../chunk-QC5BYUED.js';
47
49
  import '../../chunk-GNUA7XT2.js';
48
50
  import '../../chunk-RVRB27AN.js';
49
51
  import '../../chunk-V5KG6CCV.js';