@skaile/workspaces 3.16.2 → 3.18.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 (274) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-FQT6GH24.js → asset-feeds-LT4GI576.js} +7 -7
  4. package/dist/{asset-feeds-FQT6GH24.js.map → asset-feeds-LT4GI576.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +3 -3
  6. package/dist/asset-manager/index.js +6 -6
  7. package/dist/asset-manager/installer.js +4 -4
  8. package/dist/bridge/codex-app-server.d.ts +2 -0
  9. package/dist/bridge/codex-app-server.js +5 -0
  10. package/dist/bridge/codex-app-server.js.map +1 -0
  11. package/dist/bridge/drivers/claude-sdk.js +5 -5
  12. package/dist/bridge/drivers/codex.js +1137 -4
  13. package/dist/bridge/drivers/codex.js.map +1 -1
  14. package/dist/bridge/drivers/continue.js +2 -2
  15. package/dist/bridge/drivers/echo.js +2 -2
  16. package/dist/bridge/drivers/gemini.js +3 -3
  17. package/dist/bridge/drivers/goose.js +2 -2
  18. package/dist/bridge/drivers/omp.js +1 -1
  19. package/dist/bridge/drivers/opencode.js +2 -2
  20. package/dist/bridge/drivers/qwen.js +3 -3
  21. package/dist/bridge/index.js +7 -6
  22. package/dist/bridge/src/capability-dispatch.d.ts +1 -1
  23. package/dist/bridge/src/capability-dispatch.d.ts.map +1 -1
  24. package/dist/bridge/src/codex/credentials.d.ts +12 -0
  25. package/dist/bridge/src/codex/credentials.d.ts.map +1 -0
  26. package/dist/bridge/src/codex/inputs.d.ts +8 -0
  27. package/dist/bridge/src/codex/inputs.d.ts.map +1 -0
  28. package/dist/bridge/src/codex/instance-state.d.ts +16 -0
  29. package/dist/bridge/src/codex/instance-state.d.ts.map +1 -0
  30. package/dist/bridge/src/codex/managed-driver.d.ts +71 -0
  31. package/dist/bridge/src/codex/managed-driver.d.ts.map +1 -0
  32. package/dist/bridge/src/codex/native-approvals.d.ts +22 -0
  33. package/dist/bridge/src/codex/native-approvals.d.ts.map +1 -0
  34. package/dist/bridge/src/codex/native-policy.d.ts +38 -0
  35. package/dist/bridge/src/codex/native-policy.d.ts.map +1 -0
  36. package/dist/bridge/src/codex/native-protocol.generated.d.ts +1411 -0
  37. package/dist/bridge/src/codex/native-protocol.generated.d.ts.map +1 -0
  38. package/dist/bridge/src/codex/native-state.d.ts +7 -0
  39. package/dist/bridge/src/codex/native-state.d.ts.map +1 -0
  40. package/dist/bridge/src/codex/questions.d.ts +19 -0
  41. package/dist/bridge/src/codex/questions.d.ts.map +1 -0
  42. package/dist/bridge/src/codex-app-server.d.ts +60 -0
  43. package/dist/bridge/src/codex-app-server.d.ts.map +1 -0
  44. package/dist/bridge/src/drivers/codex.d.ts +9 -1
  45. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  46. package/dist/bridge/src/index.d.ts +1 -0
  47. package/dist/bridge/src/index.d.ts.map +1 -1
  48. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  49. package/dist/bridge/src/runtime.d.ts +3 -2
  50. package/dist/bridge/src/runtime.d.ts.map +1 -1
  51. package/dist/bridge/src/types.d.ts +77 -4
  52. package/dist/bridge/src/types.d.ts.map +1 -1
  53. package/dist/{chunk-2KBA5OO2.js → chunk-23L3P7IB.js} +4 -4
  54. package/dist/{chunk-2KBA5OO2.js.map → chunk-23L3P7IB.js.map} +1 -1
  55. package/dist/{chunk-NC5YXVZF.js → chunk-2FDKUKDE.js} +3 -3
  56. package/dist/{chunk-NC5YXVZF.js.map → chunk-2FDKUKDE.js.map} +1 -1
  57. package/dist/{chunk-GRVSSAAQ.js → chunk-2IROGAS7.js} +2 -2
  58. package/dist/{chunk-GRVSSAAQ.js.map → chunk-2IROGAS7.js.map} +1 -1
  59. package/dist/{chunk-BUKPS4YL.js → chunk-4JDCKPTM.js} +2 -2
  60. package/dist/{chunk-BUKPS4YL.js.map → chunk-4JDCKPTM.js.map} +1 -1
  61. package/dist/{chunk-5KSIVLOX.js → chunk-5T7Y3AZU.js} +3 -3
  62. package/dist/{chunk-5KSIVLOX.js.map → chunk-5T7Y3AZU.js.map} +1 -1
  63. package/dist/{chunk-SWUVULBU.js → chunk-67KB2A77.js} +7 -7
  64. package/dist/{chunk-SWUVULBU.js.map → chunk-67KB2A77.js.map} +1 -1
  65. package/dist/{chunk-RRVQAE5D.js → chunk-7ZO3MUP3.js} +6 -5
  66. package/dist/chunk-7ZO3MUP3.js.map +1 -0
  67. package/dist/{chunk-EO7IJY3Q.js → chunk-AI2PZX4H.js} +3 -3
  68. package/dist/{chunk-EO7IJY3Q.js.map → chunk-AI2PZX4H.js.map} +1 -1
  69. package/dist/{chunk-CMGYUF5P.js → chunk-BJI7IGZF.js} +7 -7
  70. package/dist/{chunk-CMGYUF5P.js.map → chunk-BJI7IGZF.js.map} +1 -1
  71. package/dist/{chunk-HY6CIKFH.js → chunk-CP62G5PK.js} +8 -7
  72. package/dist/chunk-CP62G5PK.js.map +1 -0
  73. package/dist/{chunk-PBRMY64S.js → chunk-CQY7XKRV.js} +30 -9
  74. package/dist/chunk-CQY7XKRV.js.map +1 -0
  75. package/dist/{chunk-OIDFK7SG.js → chunk-DCG4UWJM.js} +3 -3
  76. package/dist/{chunk-OIDFK7SG.js.map → chunk-DCG4UWJM.js.map} +1 -1
  77. package/dist/{chunk-VT4MPCRK.js → chunk-FBD5SOIH.js} +3 -3
  78. package/dist/{chunk-VT4MPCRK.js.map → chunk-FBD5SOIH.js.map} +1 -1
  79. package/dist/{chunk-DUMD4AA2.js → chunk-FYVDBIZV.js} +6 -6
  80. package/dist/{chunk-DUMD4AA2.js.map → chunk-FYVDBIZV.js.map} +1 -1
  81. package/dist/{chunk-RTM4SFLA.js → chunk-GMKNGIIB.js} +7 -4
  82. package/dist/chunk-GMKNGIIB.js.map +1 -0
  83. package/dist/{chunk-NIQPSQFN.js → chunk-GMMACS5W.js} +4 -4
  84. package/dist/{chunk-NIQPSQFN.js.map → chunk-GMMACS5W.js.map} +1 -1
  85. package/dist/{chunk-QFYEDM63.js → chunk-GRA4BWCV.js} +5 -5
  86. package/dist/{chunk-QFYEDM63.js.map → chunk-GRA4BWCV.js.map} +1 -1
  87. package/dist/{chunk-CIPK5JMJ.js → chunk-H662SXKS.js} +4 -4
  88. package/dist/{chunk-CIPK5JMJ.js.map → chunk-H662SXKS.js.map} +1 -1
  89. package/dist/{chunk-4W2OOVN5.js → chunk-IST2V7RU.js} +3 -3
  90. package/dist/{chunk-4W2OOVN5.js.map → chunk-IST2V7RU.js.map} +1 -1
  91. package/dist/{chunk-L2UE4YJO.js → chunk-IT42ZT3T.js} +9 -9
  92. package/dist/{chunk-L2UE4YJO.js.map → chunk-IT42ZT3T.js.map} +1 -1
  93. package/dist/{chunk-FRER2PEN.js → chunk-J7VSUGGH.js} +16 -3
  94. package/dist/chunk-J7VSUGGH.js.map +1 -0
  95. package/dist/{chunk-ZNCZ7RUO.js → chunk-JVFZ5R7L.js} +3 -3
  96. package/dist/{chunk-ZNCZ7RUO.js.map → chunk-JVFZ5R7L.js.map} +1 -1
  97. package/dist/chunk-LOO5CB5M.js +12 -0
  98. package/dist/chunk-LOO5CB5M.js.map +1 -0
  99. package/dist/{chunk-AL6BU3SP.js → chunk-OJ4N4T4H.js} +12 -4
  100. package/dist/chunk-OJ4N4T4H.js.map +1 -0
  101. package/dist/chunk-QEZPFJX3.js +254 -0
  102. package/dist/chunk-QEZPFJX3.js.map +1 -0
  103. package/dist/{chunk-C4AP3XZB.js → chunk-QG2ZXU5W.js} +4 -4
  104. package/dist/{chunk-C4AP3XZB.js.map → chunk-QG2ZXU5W.js.map} +1 -1
  105. package/dist/{chunk-I3COVVFB.js → chunk-RJOGAEIY.js} +1024 -204
  106. package/dist/chunk-RJOGAEIY.js.map +1 -0
  107. package/dist/{chunk-OZ7UNMTK.js → chunk-RPVTPVGX.js} +7 -5
  108. package/dist/chunk-RPVTPVGX.js.map +1 -0
  109. package/dist/{chunk-S4UA244H.js → chunk-S635WMXH.js} +4 -4
  110. package/dist/{chunk-S4UA244H.js.map → chunk-S635WMXH.js.map} +1 -1
  111. package/dist/{chunk-BQMRUH7J.js → chunk-SFCVAEJ5.js} +4 -4
  112. package/dist/{chunk-BQMRUH7J.js.map → chunk-SFCVAEJ5.js.map} +1 -1
  113. package/dist/{chunk-EXT2LNST.js → chunk-SH7GXS7V.js} +125 -37
  114. package/dist/chunk-SH7GXS7V.js.map +1 -0
  115. package/dist/chunk-T3YLZQS4.js +336 -0
  116. package/dist/chunk-T3YLZQS4.js.map +1 -0
  117. package/dist/{chunk-X7FJ3ES3.js → chunk-X3LUB275.js} +4 -4
  118. package/dist/{chunk-X7FJ3ES3.js.map → chunk-X3LUB275.js.map} +1 -1
  119. package/dist/chunk-XKSGEYZC.js +244 -0
  120. package/dist/chunk-XKSGEYZC.js.map +1 -0
  121. package/dist/{chunk-SUPIVTLX.js → chunk-XL45U3C5.js} +3 -3
  122. package/dist/{chunk-SUPIVTLX.js.map → chunk-XL45U3C5.js.map} +1 -1
  123. package/dist/{chunk-AXEOG4B5.js → chunk-YCMHWNZA.js} +3 -3
  124. package/dist/{chunk-AXEOG4B5.js.map → chunk-YCMHWNZA.js.map} +1 -1
  125. package/dist/cli/index.js +75 -53
  126. package/dist/cli/index.js.map +1 -1
  127. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  128. package/dist/client/index.js +1 -1
  129. package/dist/client/src/client.d.ts +3 -2
  130. package/dist/client/src/client.d.ts.map +1 -1
  131. package/dist/connectors/config.js +4 -4
  132. package/dist/connectors/index.js +12 -11
  133. package/dist/connectors/src/connector-prompt.d.ts +11 -0
  134. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  135. package/dist/core/index.js +3 -3
  136. package/dist/core/runtime-assets.js +2 -2
  137. package/dist/core/src/workspace-config.d.ts.map +1 -1
  138. package/dist/core/workspace-config.js +1 -1
  139. package/dist/deploy/index.js +3 -3
  140. package/dist/{ensure-sources-4GBXK6UR.js → ensure-sources-4BQ6GMYG.js} +9 -9
  141. package/dist/{ensure-sources-4GBXK6UR.js.map → ensure-sources-4BQ6GMYG.js.map} +1 -1
  142. package/dist/factory-assets/connectors/box.js +12 -11
  143. package/dist/factory-assets/connectors/deploy.js +12 -11
  144. package/dist/factory-assets/connectors/devserver.js +12 -11
  145. package/dist/factory-assets/connectors/flow/CONNECTOR.md +4 -5
  146. package/dist/factory-assets/connectors/flow/adapter.d.ts +8 -0
  147. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  148. package/dist/factory-assets/connectors/flow/adapter.js +12 -11
  149. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
  150. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  151. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +50 -17
  152. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  153. package/dist/factory-assets/connectors/flow/contract.js +3 -3
  154. package/dist/factory-assets/connectors/flow/engine/index.d.ts +1 -0
  155. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  156. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  157. package/dist/factory-assets/connectors/flow/run-flow.js +13 -12
  158. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +10 -1
  159. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
  160. package/dist/factory-assets/connectors/flow.js +12 -11
  161. package/dist/factory-assets/connectors/git.js +12 -11
  162. package/dist/factory-assets/connectors/gmail.js +12 -11
  163. package/dist/factory-assets/connectors/googledrive.js +12 -11
  164. package/dist/factory-assets/connectors/local.js +12 -11
  165. package/dist/factory-assets/connectors/mattermost.js +12 -11
  166. package/dist/factory-assets/connectors/memory.js +12 -11
  167. package/dist/factory-assets/connectors/minio.js +12 -11
  168. package/dist/factory-assets/connectors/postgres.js +12 -11
  169. package/dist/factory-assets/connectors/s3.js +12 -11
  170. package/dist/factory-assets/connectors/sharepoint.js +12 -11
  171. package/dist/factory-assets/connectors/sqlite.js +12 -11
  172. package/dist/factory-assets/connectors/static-server.js +12 -11
  173. package/dist/factory-assets/connectors/tunnel.js +12 -11
  174. package/dist/factory-assets/connectors/webdav.js +12 -11
  175. package/dist/factory-assets/connectors/xstate-store.js +12 -11
  176. package/dist/factory-assets/connectors/xstate.js +12 -11
  177. package/dist/{flows-2SUFOVVO.js → flows-COBS26MK.js} +6 -6
  178. package/dist/{flows-2SUFOVVO.js.map → flows-COBS26MK.js.map} +1 -1
  179. package/dist/{helpers-26LW4IXY.js → helpers-4UJMSN6T.js} +9 -9
  180. package/dist/{helpers-26LW4IXY.js.map → helpers-4UJMSN6T.js.map} +1 -1
  181. package/dist/library/index.js +4 -4
  182. package/dist/library/install.js +3 -3
  183. package/dist/{library-publish-IYGHOPEK.js → library-publish-QHQDN4IC.js} +14 -14
  184. package/dist/{library-publish-IYGHOPEK.js.map → library-publish-QHQDN4IC.js.map} +1 -1
  185. package/dist/{open-library-HH5LST7Z.js → open-library-ZDM6DUKJ.js} +12 -12
  186. package/dist/{open-library-HH5LST7Z.js.map → open-library-ZDM6DUKJ.js.map} +1 -1
  187. package/dist/{paths-4APA2PKT.js → paths-CZPCCBYX.js} +6 -6
  188. package/dist/{paths-4APA2PKT.js.map → paths-CZPCCBYX.js.map} +1 -1
  189. package/dist/{plugin-store-JQAIKR3R.js → plugin-store-ZEIBSNTO.js} +5 -5
  190. package/dist/{plugin-store-JQAIKR3R.js.map → plugin-store-ZEIBSNTO.js.map} +1 -1
  191. package/dist/{project-U5QRUCBN.js → project-JJUAAI7N.js} +10 -10
  192. package/dist/{project-U5QRUCBN.js.map → project-JJUAAI7N.js.map} +1 -1
  193. package/dist/resolver/index.js +3 -3
  194. package/dist/runner/index.js +25 -16
  195. package/dist/runner/src/capability-registry.d.ts +4 -0
  196. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  197. package/dist/runner/src/codex-init.d.ts +5 -0
  198. package/dist/runner/src/codex-init.d.ts.map +1 -0
  199. package/dist/runner/src/codex-resource-tools.d.ts +16 -0
  200. package/dist/runner/src/codex-resource-tools.d.ts.map +1 -0
  201. package/dist/runner/src/codex-tools.d.ts +12 -0
  202. package/dist/runner/src/codex-tools.d.ts.map +1 -0
  203. package/dist/runner/src/define-capability.d.ts +2 -0
  204. package/dist/runner/src/define-capability.d.ts.map +1 -1
  205. package/dist/runner/src/external-mcp.d.ts +8 -3
  206. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  207. package/dist/runner/src/index.d.ts +2 -0
  208. package/dist/runner/src/index.d.ts.map +1 -1
  209. package/dist/runner/src/managed-codex-bootstrap.d.ts +54 -0
  210. package/dist/runner/src/managed-codex-bootstrap.d.ts.map +1 -0
  211. package/dist/runner/src/resources.d.ts +1 -0
  212. package/dist/runner/src/resources.d.ts.map +1 -1
  213. package/dist/runner/src/serve.d.ts +5 -0
  214. package/dist/runner/src/serve.d.ts.map +1 -1
  215. package/dist/runner/src/session-builder.d.ts +18 -1
  216. package/dist/runner/src/session-builder.d.ts.map +1 -1
  217. package/dist/sdk/asset-manager.js +6 -6
  218. package/dist/sdk/bridge.js +7 -6
  219. package/dist/sdk/client.js +1 -1
  220. package/dist/sdk/core.js +3 -3
  221. package/dist/sdk/flow.js +5 -5
  222. package/dist/sdk/index.js +26 -17
  223. package/dist/sdk/index.js.map +1 -1
  224. package/dist/sdk/resolver.js +3 -3
  225. package/dist/sdk/runner.js +25 -16
  226. package/dist/sdk/session.js +2 -2
  227. package/dist/sdk/store.js +1 -1
  228. package/dist/sdk/types.js +1 -1
  229. package/dist/session/index.js +2 -2
  230. package/dist/{setup-XKTBHRWM.js → setup-PS6ZERZ5.js} +9 -8
  231. package/dist/setup-PS6ZERZ5.js.map +1 -0
  232. package/dist/{skills-Q7PJVB3W.js → skills-LG6IQSSN.js} +5 -5
  233. package/dist/{skills-Q7PJVB3W.js.map → skills-LG6IQSSN.js.map} +1 -1
  234. package/dist/{source-6PBVTACZ.js → source-QLDIZCI3.js} +13 -13
  235. package/dist/{source-6PBVTACZ.js.map → source-QLDIZCI3.js.map} +1 -1
  236. package/dist/{source-manifest-publish-VBVNW7KL.js → source-manifest-publish-J3AVCTLX.js} +15 -15
  237. package/dist/{source-manifest-publish-VBVNW7KL.js.map → source-manifest-publish-J3AVCTLX.js.map} +1 -1
  238. package/dist/store/index.js +1 -1
  239. package/dist/store/react.js +1 -1
  240. package/dist/store/react.js.map +1 -1
  241. package/dist/store/src/react.d.ts +1 -1
  242. package/dist/store/src/react.d.ts.map +1 -1
  243. package/dist/store/src/store.d.ts +2 -1
  244. package/dist/store/src/store.d.ts.map +1 -1
  245. package/dist/tui/index.js +25 -16
  246. package/dist/tui/index.js.map +1 -1
  247. package/dist/types/index.js +1 -1
  248. package/dist/types/src/events.d.ts +14 -1
  249. package/dist/types/src/events.d.ts.map +1 -1
  250. package/dist/types/src/index.d.ts +3 -3
  251. package/dist/types/src/index.d.ts.map +1 -1
  252. package/dist/types/src/lifecycle.d.ts +43 -0
  253. package/dist/types/src/lifecycle.d.ts.map +1 -1
  254. package/dist/types/src/protocol.d.ts +18 -0
  255. package/dist/types/src/protocol.d.ts.map +1 -1
  256. package/dist/types/src/runtime.d.ts +3 -1
  257. package/dist/types/src/runtime.d.ts.map +1 -1
  258. package/dist/types/src/version.d.ts +7 -1
  259. package/dist/types/src/version.d.ts.map +1 -1
  260. package/dist/workspace-plugin/adapters/mcp.js +9 -255
  261. package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
  262. package/dist/workspace-plugin/adapters/omp.js +7 -7
  263. package/dist/workspace-plugin/index.js +1 -1
  264. package/package.json +10 -1
  265. package/dist/chunk-AL6BU3SP.js.map +0 -1
  266. package/dist/chunk-EXT2LNST.js.map +0 -1
  267. package/dist/chunk-FRER2PEN.js.map +0 -1
  268. package/dist/chunk-HY6CIKFH.js.map +0 -1
  269. package/dist/chunk-I3COVVFB.js.map +0 -1
  270. package/dist/chunk-OZ7UNMTK.js.map +0 -1
  271. package/dist/chunk-PBRMY64S.js.map +0 -1
  272. package/dist/chunk-RRVQAE5D.js.map +0 -1
  273. package/dist/chunk-RTM4SFLA.js.map +0 -1
  274. package/dist/setup-XKTBHRWM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":[],"mappings":"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","file":"chunk-PBRMY64S.js","sourcesContent":["/**\n * EventNormalizer — converts bridge-level AgentEvent (raw driver events) to\n * skaile-agent-types AgentEvent (normalized, human-readable events).\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call reset() between sessions.\n */\n\nimport type { AgentEvent as NormalizedEvent } from \"@skaile/workspaces/types\";\nimport { classifyClaudeSdkError } from \"./error-classifier.js\";\nimport type { AgentMessage, AgentEvent as BridgeEvent, ContentBlock } from \"./types.js\";\n\n/**\n * The optional usage keys a `result` event carries, in the shape both\n * `finished` and a result-sourced `error` emit them. Absent keys stay absent.\n */\nfunction resultUsageFields(event: BridgeEvent & { type: \"result\" }) {\n return {\n ...(event.tokens ? { tokens: event.tokens } : {}),\n ...(event.modelUsage ? { modelUsage: event.modelUsage } : {}),\n ...(typeof event.contextTokens === \"number\" ? { contextTokens: event.contextTokens } : {}),\n ...(typeof event.contextWindow === \"number\" ? { contextWindow: event.contextWindow } : {}),\n };\n}\n\n/**\n * The tool a driver uses to park a turn on a human answer. Both branches that\n * recognise it must use this constant: `message_start` turns it into a\n * `question`, and `tool_call` must then stay silent about it.\n */\nconst QUESTION_TOOL = \"AskUserQuestion\";\n\n/**\n * Converts raw bridge-level {@link BridgeEvent} payloads into normalized\n * `@skaile/workspaces/types` `AgentEvent` payloads consumed by the runner and transport.\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call {@link EventNormalizer.reset} between sessions to clear accumulated state.\n *\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport class EventNormalizer {\n private activeSubagents = new Map<string, string>();\n private devServerStartingEmitted = false;\n private devServerReadyEmitted = false;\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n\n /**\n * Convert a single bridge event into zero or more normalized events.\n * One bridge event can produce multiple normalized events (e.g., a message_start\n * with text + tool_use blocks produces both text and tool_call events).\n */\n normalize(event: BridgeEvent): NormalizedEvent[] {\n switch (event.type) {\n case \"message_start\":\n return this.handleMessageStart(event.message);\n\n case \"message_update\":\n return this.handleMessageUpdate(event);\n\n case \"message_end\":\n return [];\n\n case \"turn_end\":\n return this.handleTurnEnd(event.toolResults);\n\n case \"result\":\n return this.handleResult(event);\n\n case \"error\":\n return [\n {\n type: \"error\",\n message: event.error,\n fatal: event.fatal ?? true,\n category: event.detail?.category,\n ...(event.detail?.hint ? { hint: event.detail.hint } : {}),\n },\n ];\n\n case \"tool_call\": {\n // Already handled in message_start — emit status only. The question tool\n // is the exception: the turn parks on the user's answer, so reporting\n // work here would undo the idle its `question` event just set, and\n // nothing follows to correct it while the user reads the prompt.\n const toolName = event.name ?? event.tool?.name;\n if (toolName === QUESTION_TOOL) return [];\n return [{ type: \"status\", phase: \"working\" }];\n }\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n return [{ type: \"status\", phase: \"idle\" }];\n\n case \"commands_available\":\n // Pass through to transport — the gateway caches this event\n return [event as unknown as NormalizedEvent];\n\n case \"session_info\":\n // Pass through to transport — the forge layer stores the OMP session ID\n return [event as unknown as NormalizedEvent];\n\n case \"ui_render\":\n case \"ui_render_update\":\n case \"ui_clear\":\n // Pass through verbatim — drivers that implement the Agent UI Protocol emit these directly\n return [event as unknown as NormalizedEvent];\n\n default:\n return [];\n }\n }\n\n /** Clear all stateful tracking between sessions. */\n reset(): void {\n this.activeSubagents.clear();\n this.devServerStartingEmitted = false;\n this.devServerReadyEmitted = false;\n this.hasStreamedText = false;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Drivers (e.g. omp) may echo the user's\n // message as a message_start with role:\"user\" before streaming the response.\n // Emitting a text event for that echo would prepend the user's input to the\n // assistant bubble on the frontend.\n if (message.role !== \"assistant\") return [];\n\n const events: NormalizedEvent[] = [];\n const blocks = this.getContentBlocks(message);\n\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n // Skip full text if we already streamed it via message_update deltas\n if (!this.hasStreamedText) {\n events.push({ type: \"text\", content: block.text });\n }\n } else if (block.type === \"tool_use\" && block.name) {\n events.push(...this.handleToolUse(block));\n }\n }\n\n this.hasStreamedText = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock): NormalizedEvent[] {\n const name = block.name!;\n const input = (block.input ?? {}) as Record<string, unknown>;\n\n if (name === QUESTION_TOOL) {\n return this.handleAskUserQuestion(input);\n }\n if (name === \"Agent\") {\n return this.handleAgentToolUse(block, input);\n }\n return this.handleGenericToolUse(name, input);\n }\n\n private handleAskUserQuestion(input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n // Claude SDK sends { questions: [{ question, header, options: [{ label, description }] }] }\n // Legacy/simple format sends { question: string, options?: string[] }\n const questions = input.questions;\n if (Array.isArray(questions)) {\n for (const q of questions) {\n const qObj = q as Record<string, unknown>;\n const question = String(qObj.question ?? \"\");\n const rawOpts = qObj.options;\n const options = Array.isArray(rawOpts)\n ? rawOpts.map((o: any) => (typeof o === \"string\" ? o : String(o.label ?? o)))\n : undefined;\n events.push({ type: \"question\", question, options });\n }\n } else {\n const question = String(input.question ?? input.text ?? \"\");\n const rawOptions = input.options;\n const options = Array.isArray(rawOptions) ? rawOptions.map(String) : undefined;\n events.push({ type: \"question\", question, options });\n }\n return events;\n }\n\n private handleAgentToolUse(\n block: ContentBlock,\n input: Record<string, unknown>,\n ): NormalizedEvent[] {\n const agentName = String(input.subagent_type ?? input.description ?? \"unknown\");\n const description = String(input.description ?? input.prompt ?? \"\").slice(0, 200);\n if (block.id) {\n this.activeSubagents.set(block.id, agentName);\n }\n return [\n { type: \"subagent\", name: agentName, status: \"started\", description },\n { type: \"status\", phase: \"working\" },\n ];\n }\n\n private handleGenericToolUse(name: string, input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n summary: summarizeToolCall(name, input),\n });\n events.push({ type: \"status\", phase: \"working\" });\n\n if (name === \"Bash\" && typeof input.command === \"string\") {\n const devEvent = this.detectDevServerStarting(input.command);\n if (devEvent) events.push(devEvent);\n }\n\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // message_update → streaming text\n // ---------------------------------------------------------------------------\n\n private handleMessageUpdate(event: BridgeEvent): NormalizedEvent[] {\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n return [{ type: \"text\", content: delta }];\n }\n return [];\n }\n\n // ---------------------------------------------------------------------------\n // turn_end → tool_result, subagent finished, file_changed, dev_server\n // ---------------------------------------------------------------------------\n\n private handleTurnEnd(toolResults?: AgentMessage[]): NormalizedEvent[] {\n if (!toolResults?.length) return [];\n\n const events: NormalizedEvent[] = [];\n\n for (const result of toolResults) {\n const toolName = result.toolName ?? \"unknown\";\n const outputData = result.data ?? result.content;\n const output = typeof outputData === \"string\" ? outputData : JSON.stringify(outputData);\n\n // Check if this is a subagent result\n if (toolName === \"Agent\" || this.isSubagentResult(result)) {\n events.push(...this.handleSubagentResult(result, output));\n } else {\n events.push(...this.handleToolResult(toolName, outputData, output));\n }\n }\n\n return events;\n }\n\n private handleSubagentResult(result: AgentMessage, output: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const agentName = this.resolveSubagentName(result);\n const description = output.slice(0, 200);\n events.push({ type: \"subagent\", name: agentName, status: \"finished\", description });\n\n if (agentName === \"dev-server\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n return events;\n }\n\n private handleToolResult(\n toolName: string,\n outputData: unknown,\n output: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n events.push({\n type: \"tool_result\",\n tool: toolName,\n output: outputData,\n summary: summarizeToolResult(toolName, outputData),\n });\n\n // Detect file changes from Write/Edit results\n const fileEvents = detectFileChanges(toolName, outputData);\n if (fileEvents.length > 0) events.push(...fileEvents);\n\n // Detect dev server from Bash output\n if (toolName === \"Bash\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n return events;\n }\n\n private isSubagentResult(result: AgentMessage): boolean {\n // Check if the tool result's id maps to a tracked subagent\n if (result.toolName && this.activeSubagents.has(result.toolName)) return true;\n return false;\n }\n\n private resolveSubagentName(result: AgentMessage): string {\n // toolName on bridge AgentMessage is resolved from toolIdToName in the driver\n const name = result.toolName ? this.activeSubagents.get(result.toolName) : undefined;\n if (name) {\n this.activeSubagents.delete(result.toolName!);\n return name;\n }\n return result.toolName ?? \"unknown\";\n }\n\n // ---------------------------------------------------------------------------\n // result → finished or error\n // ---------------------------------------------------------------------------\n\n private handleResult(event: BridgeEvent & { type: \"result\" }): NormalizedEvent[] {\n const usage = resultUsageFields(event);\n if (event.subtype === \"success\") {\n return [\n {\n type: \"finished\",\n summary: event.summary ?? \"Task completed\",\n costUsd: event.costUsd ?? 0,\n ...usage,\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk driver uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (drivers other than claude-sdk emit `result` without a paired\n // `error`, so this is the only place they get classified).\n const detail = classifyClaudeSdkError({ errors, subtype: event.subtype });\n // The turn billed even though it failed: carry its usage so a ledger\n // that only writes on `finished` can write here too. Unlike the finished\n // branch, no `costUsd: 0` fallback — an absent figure stays absent.\n return [\n {\n type: \"error\",\n message: `Agent stopped: ${event.subtype}${errors.length ? ` — ${errors.join(\"; \")}` : \"\"}`,\n fatal: event.subtype === \"error_during_execution\",\n category: detail.category,\n ...(detail.hint ? { hint: detail.hint } : {}),\n ...(typeof event.costUsd === \"number\" ? { costUsd: event.costUsd } : {}),\n ...usage,\n },\n ];\n }\n\n // ---------------------------------------------------------------------------\n // Dev server detection\n // ---------------------------------------------------------------------------\n\n private detectDevServerStarting(command: string): NormalizedEvent | null {\n if (this.devServerStartingEmitted) return null;\n const cmd = command.toLowerCase();\n const isFrontendStart =\n (cmd.includes(\"pnpm run dev\") || cmd.includes(\"pnpm dev\") || cmd.includes(\"vite\")) &&\n (cmd.includes(\"frontend\") || cmd.includes(\"dev:preview\"));\n if (isFrontendStart) {\n this.devServerStartingEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"starting\" };\n }\n return null;\n }\n\n private detectDevServerReady(text: string): NormalizedEvent | null {\n if (this.devServerReadyEmitted) return null;\n\n const explicitMatch = text.match(/DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/);\n if (explicitMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: explicitMatch[1]!, status: \"ready\" };\n }\n\n const viteMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+)/);\n if (viteMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: viteMatch[1]!, status: \"ready\" };\n }\n\n if (text.includes(\"FRONTEND_READY\")) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"ready\" };\n }\n\n return null;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private getContentBlocks(message: AgentMessage): ContentBlock[] {\n if (Array.isArray(message.content)) return message.content;\n if (typeof message.content === \"string\" && message.content) {\n return [{ type: \"text\", text: message.content }];\n }\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable one-line summary of a tool call for the activity log.\n *\n * Returns a string like `$ git status` for Bash, `Read src/index.ts` for Read, etc.\n * Falls back to `ToolName({...input...})` for unrecognised tools.\n *\n * @param tool - Tool name (e.g. `\"Bash\"`, `\"Write\"`, `\"Grep\"`).\n * @param input - Tool input record passed to the call.\n * @returns A short display string suitable for the activity feed.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolCall(tool: string, input: Record<string, unknown>): string {\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${String(input.file_path)}`;\n case \"Edit\":\n return `Edit ${String(input.file_path)}`;\n case \"Read\":\n return `Read ${String(input.file_path)}`;\n case \"Glob\":\n return `Find ${String(input.pattern)}`;\n case \"Grep\":\n return `Search for ${String(input.pattern)}`;\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/** Extract plain text from an Anthropic content-block array (e.g. tool results returned by Claude SDK). */\nfunction extractContentBlockText(blocks: unknown[]): string | null {\n const textBlocks = blocks.filter(\n (b): b is { type: \"text\"; text: string } =>\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\" &&\n typeof (b as Record<string, unknown>).text === \"string\",\n );\n if (textBlocks.length === 0) return null;\n return textBlocks.map((b) => b.text).join(\"\\n\");\n}\n\n/**\n * Produce a human-readable one-line summary of a tool result for the activity log.\n *\n * Handles Bash stdout/stderr, Write/Edit file paths, ApplyPatch change counts, and\n * Anthropic content-block arrays. Falls back to `JSON.stringify` for unknown shapes.\n *\n * @param tool - Tool name.\n * @param result - Raw tool result payload.\n * @returns A short display string, truncated to 200 characters.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolResult(tool: string, result: unknown): string {\n // Handle Anthropic content-block arrays: [{ type: \"text\", text: \"...\" }, ...]\n if (Array.isArray(result)) {\n const text = extractContentBlockText(result);\n return (text ?? JSON.stringify(result)).slice(0, 200);\n }\n if (typeof result !== \"object\" || !result) {\n return String(result).slice(0, 200);\n }\n const r = result as Record<string, unknown>;\n switch (tool) {\n case \"Bash\": {\n const stderr = String(r.stderr ?? \"\").trim();\n if (stderr) return `stderr: ${stderr.slice(0, 200)}`;\n return (\n String(r.stdout ?? \"\")\n .trim()\n .slice(0, 200) || \"(no output)\"\n );\n }\n case \"Write\":\n return `${String(r.type)}: ${String(r.filePath)}`;\n case \"Edit\":\n return `Edited ${String(r.filePath)}`;\n case \"ApplyPatch\":\n return `${Array.isArray(r.changes) ? r.changes.length : 0} file changes`;\n default:\n return JSON.stringify(result).slice(0, 200);\n }\n}\n\n/**\n * Detect file-change events from a tool result, returning zero or more `file_changed` events.\n *\n * Handles `Write` (single create/edit), `Edit` (single edit), and `ApplyPatch` (multi-file\n * patch with per-change `kind` classification). Returns an empty array for all other tools.\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns Array of `file_changed` normalized events.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChanges(toolName: string, result: unknown): NormalizedEvent[] {\n if (typeof result !== \"object\" || !result) return [];\n const r = result as Record<string, unknown>;\n\n if (toolName === \"Write\" && r.filePath) {\n return [\n {\n type: \"file_changed\",\n path: String(r.filePath),\n action: r.type === \"create\" ? \"create\" : \"edit\",\n },\n ];\n }\n if (toolName === \"Edit\" && r.filePath) {\n return [{ type: \"file_changed\", path: String(r.filePath), action: \"edit\" }];\n }\n if (toolName === \"ApplyPatch\" && Array.isArray(r.changes)) {\n return r.changes\n .filter(\n (change): change is { path: string; kind: \"add\" | \"delete\" | \"update\" } =>\n typeof change === \"object\" &&\n change !== null &&\n typeof (change as Record<string, unknown>).path === \"string\" &&\n typeof (change as Record<string, unknown>).kind === \"string\",\n )\n .map((change) => ({\n type: \"file_changed\" as const,\n path: change.path,\n action: change.kind === \"add\" ? \"create\" : change.kind === \"delete\" ? \"delete\" : \"edit\",\n }));\n }\n\n return [];\n}\n\n/**\n * Backward-compatible single-event helper; returns the first `file_changed` event or `null`.\n *\n * Prefer {@link detectFileChanges} for multi-file patches (e.g. `ApplyPatch`).\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns First detected `file_changed` event, or `null`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChange(toolName: string, result: unknown): NormalizedEvent | null {\n return detectFileChanges(toolName, result)[0] ?? null;\n}\n","/**\n * BridgeRuntime — implements IAgentRuntime from @skaile/workspaces/types by wrapping\n * an AgentDriver + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any driver.\n */\n\nimport type {\n AgentEvent,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { createDriver } from \"./registry.js\";\nimport type { AgentConfig, AgentDriver } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentDriver}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any driver without managing the driver lifecycle directly. Create via\n * {@link createRuntime} to avoid coupling to `BridgeRuntime` directly.\n *\n * @docLink packages/bridge/api-reference#runtime\n */\nexport class BridgeRuntime implements IAgentRuntime {\n private driver: AgentDriver | null = null;\n private normalizer = new EventNormalizer();\n private handlers = new Set<(event: AgentEvent) => void>();\n private boundEventHandler: ((event: any) => void) | null = null;\n private driverId: string;\n\n constructor(driverId: string = \"claude-sdk\") {\n this.driverId = driverId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous driver if any\n if (this.driver) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n provider: config.provider,\n model: config.model,\n systemPrompt: config.systemPrompt,\n apiKeys: config.apiKeys,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n };\n\n this.driver = await createDriver(this.driverId, bridgeConfig);\n\n // Wire bridge events through normalizer to handlers\n this.boundEventHandler = (bridgeEvent: any) => {\n const normalized = this.normalizer.normalize(bridgeEvent);\n for (const event of normalized) {\n for (const handler of this.handlers) {\n handler(event);\n }\n }\n };\n this.driver.on(\"agent-event\", this.boundEventHandler);\n\n await this.driver.start();\n }\n\n async configure(_config: AgentReconfigureOptions): Promise<void> {\n // Runtime reconfiguration for BridgeRuntime is a no-op for now.\n // Future: reconnect connectors, reload ai-assets, update subagents.\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.driver) throw new Error(\"Runtime not started — call start() first\");\n await this.driver.prompt(message);\n }\n\n async reply(answer: string): Promise<void> {\n // Mirror serve.ts handleReply: an answer must resume the paused turn. Falling through to\n // prompt() would deny the question as superseded and drop the structured answer.\n if (this.driver?.hasPendingQuestion() && this.driver.answerQuestion(answer)) return;\n await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.driver) {\n await this.driver.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.driver) {\n if (this.boundEventHandler) {\n this.driver.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.driver.kill();\n this.driver = null;\n }\n this.normalizer.reset();\n }\n\n onEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.add(handler);\n }\n\n offEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.delete(handler);\n }\n\n get isRunning(): boolean {\n return this.driver?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified driver.\n *\n * @param driverId - Registered driver id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected driver with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(driverId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(driverId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\nimport { PROVIDER_ENDPOINTS, resolveProviderModelsUrl } from \"./provider-endpoints.js\";\n\n/**\n * Result of an API key validation check performed by {@link validateApiKey}.\n *\n * @docLink packages/bridge/api-reference#validation\n */\nexport interface ValidationResult {\n /** `true` when the API key was accepted by the provider's models endpoint. */\n ok: boolean;\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n}\n\n/**\n * Validate an API key by sending a lightweight GET request to the provider's models endpoint.\n *\n * Returns `{ ok: true }` when the provider accepts the key (HTTP 2xx). Returns\n * `{ ok: false, error }` on 401/403 (invalid key), other HTTP errors, network failures,\n * or unsupported providers. Requests time out after 8 seconds.\n *\n * @param provider - Provider name matching a key in the shared `PROVIDER_ENDPOINTS` map\n * (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param key - API key to validate.\n * @param options - Optional base-URL / environment overrides; defaults to the\n * provider's own API, or its `baseUrlEnv` value when one is set.\n * @returns Validation result with optional error description.\n * @docLink packages/bridge/api-reference#validation\n */\nexport async function validateApiKey(\n provider: string,\n key: string,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): Promise<ValidationResult> {\n const endpoint = PROVIDER_ENDPOINTS[provider];\n if (!endpoint) return { ok: false, error: `Unknown provider: ${provider}` };\n\n // Validate against the same endpoint discovery/dispatch use: behind a gateway\n // the key is the gateway's, and the provider's public API would reject it.\n let url =\n resolveProviderModelsUrl(provider, {\n baseUrl: options.baseUrl,\n env: options.env ?? process.env,\n }) ?? endpoint.url;\n if (endpoint.queryParam) url += `?${endpoint.queryParam}=${encodeURIComponent(key)}`;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: endpoint.headers(key),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) return { ok: true };\n\n const status = response.status;\n if (status === 401 || status === 403) {\n return { ok: false, error: \"Invalid API key (authentication failed)\" };\n }\n return { ok: false, error: `API returned HTTP ${status}` };\n } catch (err: any) {\n if (err.name === \"AbortError\") return { ok: false, error: \"Request timed out (8s)\" };\n return { ok: false, error: err.message ?? \"Network error\" };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/capability-dispatch.ts"],"names":[],"mappings":";AA+DA,eAAsB,mBACpB,KAAA,EACA,MAAA,EACA,IAAA,EACA,KAAA,EACA,oBAA4C,MAAM;AAAC,CAAA,EAChB;AACnC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAK9B,EAAA,IAAI,GAAA,EAAK,MAAA,IAAU,KAAA,CAAM,UAAA,EAAY;AACnC,IAAA,KAAA,CAAM,UAAA,CAAW;AAAA,MACf,IAAA,EAAM,gBAAA;AAAA,MACN,cAAA,EAAgB,IAAA;AAAA,MAChB,KAAA,EAAO,KAAA;AAAA,MACP;AAAA,KACD,CAAA;AACD,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,KAAA,CAAM,QAAA,EAAU;AACzC,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,UAAU,KAAK,CAAA;AAC1D,MAAA,KAAA,CAAM,SAAS,QAAQ,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,aAAA,EAAe;AAEtB,IAAA,KAAK,MAAM,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,CAAE,MAAM,iBAAiB,CAAA;AACtD,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,YAAY,IAAA,EAAK;AAAA,EACxC;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA;AAC7C,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAM;AACrC;AAqBO,SAAS,cAAA,CAAe,UAAkB,KAAA,EAAwB;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,0BAAA,EAA4B,CAAC,QAAQ,IAAA,KAAiB;AAC5E,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAClC,IAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAEA,SAAS,QAAA,CAAS,KAA8B,IAAA,EAAuB;AACrE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,OAAO,YAAY,QAAA,EAAU;AAC5E,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,IAAI,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,OAAA;AACT;AAYO,SAAS,yBAAyB,IAAA,EAAkC;AACzE,EAAA,OAAO,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAS,CAAA;AAClD","file":"chunk-RRVQAE5D.js","sourcesContent":["/**\n * Capability dispatch helpers for bridge drivers.\n *\n * The runner builds a {@link BridgeCapabilityHooks} bundle from its\n * `CapabilityRegistry` and threads it through `AgentConfig.capabilities`.\n * Drivers consume the bundle via these helpers without taking a runtime\n * dependency on `@skaile/workspaces/runner` (which would create a circular dep).\n *\n * Three behaviours are layered into a single dispatch path:\n *\n * 1. **Standard tool call** — the LLM invokes a capability; the bridge calls\n * `hooks.invoke()`, awaits the result, and returns it to the LLM.\n * 2. **Fire-and-forget** — when the resolved Capability has `fireAndForget`\n * set, the bridge resolves to `{}` immediately and runs the handler in\n * the background. Background errors are logged but never surfaced to the\n * LLM since the call is already settled.\n * 3. **Render capability** — when the resolved Capability has a non-undefined\n * `render`, the bridge emits `RenderInvokedEvent` to the runner via\n * `hooks.emitRender` and (when `render.fallback` is set) a parallel text\n * event via `hooks.emitText` with simple `{{prop}}` substitution. The\n * placeholder convention follows the v2 spec — top-level keys of `props`\n * only, with optional dotted-path traversal (`{{user.name}}`). The legacy\n * AAP `{{props.x}}` form was retired in Phase 6.\n *\n * @category Capabilities\n * @since 2.0.0\n */\nimport type { Capability } from \"@skaile/workspaces/types\";\nimport type { BridgeCapabilityHooks } from \"./types.js\";\n\n/**\n * Result of a capability dispatch returned by {@link dispatchCapability}.\n *\n * The bridge feeds `{ result }` back to the LLM tool-use response. For\n * fire-and-forget capabilities `result` is always `{}` and `background` is `true`.\n *\n * @docLink packages/bridge/concepts#capability-dispatch-result\n */\nexport interface CapabilityDispatchResult {\n /** Value returned to the LLM. `{}` for fire-and-forget capabilities. */\n result: unknown;\n /** True when the handler is still running in the background (fire-and-forget). */\n background: boolean;\n}\n\n/**\n * Run a capability invocation through the runner-provided hooks, applying\n * render-event emission and fire-and-forget short-circuit.\n *\n * The result is always shaped for direct return to the LLM. For\n * fire-and-forget capabilities the background promise is fired and any error\n * is logged through `onBackgroundError` (defaulting to a no-op). For all\n * other capabilities the handler is awaited; errors propagate as a rejection\n * so the driver can surface them as tool errors.\n *\n * @param hooks - Capability dispatch bundle from `AgentConfig.capabilities`.\n * @param callId - Correlation ID for the tool-use invocation (used in render events).\n * @param name - Registered capability name.\n * @param input - Raw tool input from the LLM.\n * @param onBackgroundError - Optional error handler for fire-and-forget failures.\n * @returns Resolved dispatch result with the LLM-facing value and background flag.\n * @docLink packages/bridge/concepts#dispatch-capability\n */\nexport async function dispatchCapability(\n hooks: BridgeCapabilityHooks,\n callId: string,\n name: string,\n input: unknown,\n onBackgroundError: (err: unknown) => void = () => {},\n): Promise<CapabilityDispatchResult> {\n const cap = hooks.resolve(name);\n\n // Render emission happens before invocation so clients see the props the\n // LLM passed in even if the handler errors. The runner's gateway forwards\n // the event over the transport.\n if (cap?.render && hooks.emitRender) {\n hooks.emitRender({\n type: \"render_invoked\",\n capabilityName: name,\n props: input,\n callId,\n });\n if (cap.render.fallback && hooks.emitText) {\n const fallback = renderFallback(cap.render.fallback, input);\n hooks.emitText(fallback);\n }\n }\n\n if (cap?.fireAndForget) {\n // Resolve immediately; run handler in background.\n void hooks.invoke(name, input).catch(onBackgroundError);\n return { result: {}, background: true };\n }\n\n const result = await hooks.invoke(name, input);\n return { result, background: false };\n}\n\n/**\n * Substitute `{{prop}}` placeholders inside a fallback template using the\n * input record. Top-level keys of `props` resolve directly\n * (`{{name}}` → `props.name`); dotted paths traverse nested records\n * (`{{user.name}}` → `props.user.name`). Missing keys collapse to an empty\n * string; non-record inputs collapse all placeholders.\n *\n * The convention is fixed by the v2 spec (§1, `RenderSpec.fallback`). The\n * legacy AAP form `{{props.x}}` is no longer accepted — author fallbacks\n * with bare keys.\n *\n * Intentionally minimal — full template engines belong in the platform's\n * render layer, not the bridge.\n *\n * @param template - Fallback string from `RenderSpec.fallback` with `{{key}}` placeholders.\n * @param input - LLM tool input object; non-object values collapse all placeholders.\n * @returns Template with all resolvable placeholders replaced.\n * @docLink packages/bridge/concepts#render-fallback\n */\nexport function renderFallback(template: string, input: unknown): string {\n if (!input || typeof input !== \"object\") {\n return template.replace(/\\{\\{\\s*[\\w$.]+\\s*\\}\\}/g, \"\");\n }\n const props = input as Record<string, unknown>;\n return template.replace(/\\{\\{\\s*([\\w$.]+)\\s*\\}\\}/g, (_match, path: string) => {\n const value = readPath(props, path);\n return value === undefined || value === null ? \"\" : String(value);\n });\n}\n\nfunction readPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Filter a capability list to those marked as render-capable (having a `render` spec).\n *\n * Used by drivers that emit a separate render manifest at registration time.\n * Currently unused in production drivers; reserved for future phases.\n *\n * @param caps - Full capability list to filter.\n * @returns Subset of capabilities with a non-undefined `render` property.\n * @docLink packages/bridge/concepts#filter-render-capabilities\n */\nexport function filterRenderCapabilities(caps: Capability[]): Capability[] {\n return caps.filter((c) => c.render !== undefined);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../store/src/resource-client.ts","../store/src/store.ts"],"names":[],"mappings":"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","file":"chunk-RTM4SFLA.js","sourcesContent":["import type {\n AgentEvent,\n ConnectorContent,\n ConnectorEntry,\n ConnectorInfo,\n ConnectorResponseEvent,\n ConnectorStatusEvent,\n ListOptions,\n MountInfo,\n SearchOptions,\n} from \"@skaile/workspaces/types\";\nimport type {\n ConnectorStatus,\n ResourceClientSnapshot,\n StoreTransport,\n SubscribableStore,\n} from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Lazy resource browser for agent connectors.\n *\n * Provides a reactive list of connected mounts and connectors, and\n * request/response methods for browsing connector contents. Shares\n * the same transport (`send` + `onEvent`) as `AgentStore`.\n * @docLink packages/store/concepts#resource-client\n */\nexport class ResourceClient implements SubscribableStore<ResourceClientSnapshot> {\n private readonly _send: StoreTransport[\"send\"];\n private _mounts: readonly MountInfo[] = [];\n private _connectors: readonly ConnectorInfo[] = [];\n\n /** Live connection status per connector, keyed by connector ID. Updated by connector_status events. */\n connectorStatus: Map<string, ConnectorStatus> = new Map();\n\n private _snapshot: ResourceClientSnapshot | null = null;\n private readonly _listeners = new Set<() => void>();\n private readonly _pendingRequests = new Map<\n string,\n {\n resolve: (event: ConnectorResponseEvent) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private readonly _unsubEvent: () => void;\n\n /**\n * @param transport - Shared transport (same instance as the AgentStore for this session).\n */\n constructor(transport: StoreTransport) {\n this._send = transport.send;\n this._unsubEvent = transport.onEvent((event) => this._handleEvent(event));\n }\n\n // -- Reactive state --------------------------------------------------------\n\n /** Mounts available in this session, populated from `resources_available` events. */\n get mounts(): readonly MountInfo[] {\n return this._mounts;\n }\n\n /** Tool-based connectors available in this session, populated from `resources_available` events. */\n get connectors(): readonly ConnectorInfo[] {\n return this._connectors;\n }\n\n // -- Resource operations ---------------------------------------------------\n\n /**\n * List directory entries at the given path within a connector.\n *\n * @param connectorId - ID of the connector to query.\n * @param path - Directory path to list. Omit for the connector root.\n * @param opts - Optional pagination and filter options.\n * @returns Array of entries (files, directories, etc.) at the given path.\n * @throws If the request times out or the connector returns an error.\n */\n async list(connectorId: string, path?: string, opts?: ListOptions): Promise<ConnectorEntry[]> {\n const response = await this._request(connectorId, \"list\", path, opts);\n return (response.data as ConnectorEntry[]) ?? [];\n }\n\n /**\n * Read the content of a single resource.\n *\n * @param connectorId - ID of the connector to query.\n * @param path - Full path to the resource within the connector.\n * @returns The resource content object.\n * @throws If the request times out or the connector returns an error.\n */\n async read(connectorId: string, path: string): Promise<ConnectorContent> {\n const response = await this._request(connectorId, \"read\", path);\n return response.data as ConnectorContent;\n }\n\n /**\n * Write content to a resource, creating it if it does not exist.\n *\n * @param connectorId - ID of the connector to write to.\n * @param path - Full path to the resource within the connector.\n * @param content - Content to write.\n * @throws If the request times out or the connector returns an error.\n */\n async write(connectorId: string, path: string, content: ConnectorContent): Promise<void> {\n await this._request(connectorId, \"write\", path, undefined, content);\n }\n\n /**\n * Delete a resource from a connector.\n *\n * @param connectorId - ID of the connector to delete from.\n * @param path - Full path to the resource within the connector.\n * @throws If the request times out or the connector returns an error.\n */\n async delete(connectorId: string, path: string): Promise<void> {\n await this._request(connectorId, \"delete\", path);\n }\n\n /**\n * Full-text search within a connector.\n *\n * @param connectorId - ID of the connector to search.\n * @param query - Search query string.\n * @param opts - Optional search options (e.g. path prefix, result limit).\n * @returns Matching entries, ordered by relevance as determined by the connector.\n * @throws If the request times out or the connector returns an error.\n */\n async search(\n connectorId: string,\n query: string,\n opts?: SearchOptions,\n ): Promise<ConnectorEntry[]> {\n const response = await this._request(connectorId, \"search\", query, opts);\n return (response.data as ConnectorEntry[]) ?? [];\n }\n\n // -- useSyncExternalStore interface ----------------------------------------\n\n /**\n * Register a change listener. Called after every resource availability change.\n *\n * Conforms to the `subscribe` parameter of React's `useSyncExternalStore`.\n *\n * @param listener - Callback invoked whenever mounts or connectors change.\n * @returns Unsubscribe function — call to stop receiving notifications.\n */\n subscribe = (listener: () => void): (() => void) => {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n };\n\n /**\n * Return the current immutable resource snapshot.\n *\n * A new object is produced lazily after each `resources_available` event.\n * Conforms to the `getSnapshot` parameter of React's `useSyncExternalStore`.\n */\n getSnapshot = (): ResourceClientSnapshot => {\n if (!this._snapshot) {\n this._snapshot = { mounts: this._mounts, connectors: this._connectors };\n }\n return this._snapshot;\n };\n\n // -- Connector config mutations --------------------------------------------\n\n /**\n * Send a `connector_config` add command to wire a new connector at runtime,\n * without restarting the session. The runner receives this command and\n * calls `ConnectorManager.connect()`, which fires a `connector_status` event\n * back to the store once the connector is live.\n *\n * @param declaration - Connector declaration (id, driver, access level, options).\n */\n addConnector(declaration: {\n id: string;\n driver: string;\n access?: \"read-only\" | \"read-write\";\n options?: Record<string, unknown>;\n }): void {\n this._send({ type: \"connector_config\", action: \"add\", declaration });\n }\n\n /**\n * Send a `connector_config` remove command to disconnect a connector by ID\n * without restarting the session.\n *\n * @param connectorId - ID of the connector to disconnect and remove.\n */\n removeConnector(connectorId: string): void {\n this._send({ type: \"connector_config\", action: \"remove\", connectorId });\n }\n\n /**\n * Send a `connector_config` refresh command to reconnect all configured\n * connectors (e.g. after a credentials change).\n */\n refreshConnectors(): void {\n this._send({ type: \"connector_config\", action: \"refresh\" });\n }\n\n // -- Cleanup ---------------------------------------------------------------\n\n /**\n * Unsubscribe from transport events, reject all pending requests, and\n * clear all change listeners.\n *\n * All in-flight `list`/`read`/`write`/`delete`/`search` calls will reject\n * with `\"ResourceClient disposed\"`.\n */\n dispose(): void {\n this._unsubEvent();\n for (const [, pending] of this._pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"ResourceClient disposed\"));\n }\n this._pendingRequests.clear();\n this._listeners.clear();\n }\n\n // -- Internal --------------------------------------------------------------\n\n private _handleEvent(event: AgentEvent): void {\n if (event.type === \"connector_status\") {\n const e = event as ConnectorStatusEvent;\n const existing = this.connectorStatus.get(e.connectorId);\n const next = new Map(this.connectorStatus);\n next.set(e.connectorId, {\n id: e.connectorId,\n driver:\n existing?.driver ?? this._connectors.find((c) => c.id === e.connectorId)?.driver ?? \"\",\n state: e.status,\n ...(e.error !== undefined ? { error: e.error } : {}),\n ...(e.latencyMs !== undefined ? { latencyMs: e.latencyMs } : {}),\n lastUpdated: new Date(),\n });\n this.connectorStatus = next;\n for (const listener of this._listeners) {\n listener();\n }\n return;\n }\n\n if (event.type === \"resources_available\") {\n this._mounts = event.mounts;\n this._connectors = event.connectors;\n this._snapshot = null;\n for (const listener of this._listeners) {\n listener();\n }\n return;\n }\n\n if (event.type === \"resource_response\") {\n const pending = this._pendingRequests.get(event.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingRequests.delete(event.requestId);\n\n if (event.error) {\n pending.reject(new Error(event.error));\n } else {\n pending.resolve(event);\n }\n }\n }\n\n private _request(\n connectorId: string,\n operation: \"list\" | \"read\" | \"write\" | \"delete\" | \"search\",\n path?: string,\n options?: ListOptions | SearchOptions,\n content?: ConnectorContent,\n ): Promise<ConnectorResponseEvent> {\n const requestId = crypto.randomUUID();\n\n return new Promise<ConnectorResponseEvent>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingRequests.delete(requestId);\n reject(\n new Error(\n `Resource request timed out after ${DEFAULT_TIMEOUT_MS}ms: ${operation} ${connectorId}${path ? ` ${path}` : \"\"}`,\n ),\n );\n }, DEFAULT_TIMEOUT_MS);\n\n this._pendingRequests.set(requestId, { resolve, reject, timer });\n\n this._send({\n type: \"resource_request\",\n requestId,\n connectorId,\n operation,\n ...(path !== undefined ? { path } : {}),\n ...(options ? { options } : {}),\n ...(content ? { content } : {}),\n });\n });\n }\n}\n","import type {\n AgentCommand,\n AgentEvent,\n AgentPhase,\n Capability,\n IncompatibleProtocolEvent,\n Message,\n ProtocolInfoEvent,\n RenderInvokedEvent,\n} from \"@skaile/workspaces/types\";\nimport type {\n AgentClientLike,\n AgentStoreOptions,\n AgentStoreSnapshot,\n ConnectionStatus,\n SubscribableStore,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** Conservative equality for plain JSON data; unsupported or unverifiable values fail open. */\nfunction isSameJsonValue<T>(a: T | undefined, b: T, conservativeCommandInput = false): boolean {\n const aObjects = new WeakSet<object>();\n const bObjects = new WeakSet<object>();\n\n const compare = (left: unknown, right: unknown): boolean => {\n if (left === null || right === null) return left === right;\n if (typeof left !== typeof right) return false;\n\n switch (typeof left) {\n case \"string\":\n case \"boolean\":\n return left === right;\n case \"number\":\n return (\n Number.isFinite(left) &&\n Number.isFinite(right) &&\n !Object.is(left, -0) &&\n !Object.is(right, -0) &&\n left === right\n );\n case \"object\":\n break;\n default:\n return false;\n }\n\n const leftObject = left as object;\n const rightObject = right as object;\n if (aObjects.has(leftObject) || bObjects.has(rightObject)) return false;\n if (conservativeCommandInput) {\n if (leftObject === rightObject || bObjects.has(leftObject) || aObjects.has(rightObject)) {\n return false;\n }\n }\n aObjects.add(leftObject);\n bObjects.add(rightObject);\n\n const leftIsArray = Array.isArray(leftObject);\n if (leftIsArray !== Array.isArray(rightObject)) return false;\n\n const leftPrototype = Object.getPrototypeOf(leftObject);\n const rightPrototype = Object.getPrototypeOf(rightObject);\n const leftHasPlainPrototype = leftIsArray\n ? leftPrototype === Array.prototype\n : leftPrototype === Object.prototype || leftPrototype === null;\n const rightHasPlainPrototype = leftIsArray\n ? rightPrototype === Array.prototype\n : rightPrototype === Object.prototype || rightPrototype === null;\n if (\n !leftHasPlainPrototype ||\n !rightHasPlainPrototype ||\n leftPrototype !== rightPrototype ||\n !Object.isExtensible(leftObject) ||\n !Object.isExtensible(rightObject)\n ) {\n return false;\n }\n\n const leftKeys = Reflect.ownKeys(leftObject);\n const rightKeys = Reflect.ownKeys(rightObject);\n if (\n leftKeys.length !== rightKeys.length ||\n leftKeys.some((key) => typeof key !== \"string\") ||\n rightKeys.some((key) => typeof key !== \"string\")\n ) {\n return false;\n }\n\n if (leftIsArray) {\n const leftLengthDescriptor = Object.getOwnPropertyDescriptor(leftObject, \"length\");\n const rightLengthDescriptor = Object.getOwnPropertyDescriptor(rightObject, \"length\");\n const leftLength = leftLengthDescriptor?.value;\n const rightLength = rightLengthDescriptor?.value;\n if (\n !leftLengthDescriptor ||\n !(\"value\" in leftLengthDescriptor) ||\n !leftLengthDescriptor.writable ||\n leftLengthDescriptor.enumerable ||\n leftLengthDescriptor.configurable ||\n !rightLengthDescriptor ||\n !(\"value\" in rightLengthDescriptor) ||\n !rightLengthDescriptor.writable ||\n rightLengthDescriptor.enumerable ||\n rightLengthDescriptor.configurable ||\n typeof leftLength !== \"number\" ||\n leftLength !== rightLength ||\n leftKeys.length !== leftLength + 1\n ) {\n return false;\n }\n\n for (let index = 0; index < leftLength; index++) {\n const key = String(index);\n const leftDescriptor = Object.getOwnPropertyDescriptor(leftObject, key);\n const rightDescriptor = Object.getOwnPropertyDescriptor(rightObject, key);\n if (\n !leftDescriptor?.enumerable ||\n !(\"value\" in leftDescriptor) ||\n !leftDescriptor.writable ||\n !leftDescriptor.configurable ||\n !rightDescriptor?.enumerable ||\n !(\"value\" in rightDescriptor) ||\n !rightDescriptor.writable ||\n !rightDescriptor.configurable ||\n !compare(leftDescriptor.value, rightDescriptor.value)\n ) {\n return false;\n }\n }\n return true;\n }\n\n for (let index = 0; index < leftKeys.length; index++) {\n const leftKey = leftKeys[index] as string;\n const rightKey = rightKeys[index] as string;\n if (leftKey !== rightKey) return false;\n\n const leftDescriptor = Object.getOwnPropertyDescriptor(leftObject, leftKey);\n const rightDescriptor = Object.getOwnPropertyDescriptor(rightObject, rightKey);\n if (\n !leftDescriptor?.enumerable ||\n !(\"value\" in leftDescriptor) ||\n !leftDescriptor.writable ||\n !leftDescriptor.configurable ||\n !rightDescriptor?.enumerable ||\n !(\"value\" in rightDescriptor) ||\n !rightDescriptor.writable ||\n !rightDescriptor.configurable ||\n !compare(leftDescriptor.value, rightDescriptor.value)\n ) {\n return false;\n }\n }\n return true;\n };\n\n try {\n const same = compare(a, b);\n if (!same || !conservativeCommandInput) return same;\n structuredClone(a);\n structuredClone(b);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Headless reactive store for agent conversation state.\n *\n * Framework-agnostic — works with React (`useSyncExternalStore`),\n * Vue (`shallowRef` + `subscribe`), or any other UI framework.\n *\n * Accepts a minimal transport interface (`send` + `onEvent`) so it works\n * with WebSocket, tRPC, SSE, or any other delivery mechanism.\n * @docLink packages/store/concepts#agent-store\n */\nexport class AgentStore implements SubscribableStore<AgentStoreSnapshot> {\n private readonly _options: AgentStoreOptions;\n private _messages: Message[];\n private _streamingText = \"\";\n private _cancelledText = \"\";\n private _status: ConnectionStatus = \"idle\";\n private _phase: AgentPhase = \"idle\";\n private _pendingQuestion: AgentStoreSnapshot[\"pendingQuestion\"] = null;\n private _error: AgentStoreSnapshot[\"error\"] = null;\n private _isAllLoaded: boolean;\n private _seq: number;\n private _streamingFlushed = true;\n /** Shared state per store namespace — new Map instance on every mutation. */\n private _sharedState: Map<string, Record<string, unknown>> = new Map();\n /** Protocol v2 capability registry — new Map instance on every mutation. */\n private _capabilities: Map<string, Capability> = new Map();\n /** Protocol v2 active render invocations — new Map instance on every mutation. */\n private _activeRenderInvocations: Map<string, RenderInvokedEvent> = new Map();\n /** Protocol v2 — most recent `protocol_info` event from the runner. */\n private _protocolInfo: ProtocolInfoEvent | null = null;\n /** Protocol v2 — latest incompatible-protocol notice. */\n private _incompatibleProtocol: IncompatibleProtocolEvent | null = null;\n\n private _snapshot: AgentStoreSnapshot | null = null;\n private readonly _listeners = new Set<() => void>();\n private readonly _unsubEvent: () => void;\n private readonly _unsubStatus: (() => void) | undefined;\n\n /**\n * @param options - Store configuration including transport and optional pagination support.\n */\n constructor(options: AgentStoreOptions) {\n this._options = options;\n this._messages = options.initialMessages ? [...options.initialMessages] : [];\n this._isAllLoaded = !options.loadMessages;\n this._seq = this._messages.reduce((max, m) => Math.max(max, m.seq), 0);\n\n this._unsubEvent = options.onEvent((event) => this._handleEvent(event));\n this._unsubStatus = options.onStatusChange?.((status) => this.setStatus(status));\n }\n\n // -- Reactive state --------------------------------------------------------\n\n /** Accumulated conversation messages, oldest first. */\n get messages(): readonly Message[] {\n return this._messages;\n }\n\n /** Text currently streaming from the agent. Empty when not streaming. */\n get streamingText(): string {\n return this._streamingText;\n }\n\n /** Current connection lifecycle state. */\n get status(): ConnectionStatus {\n return this._status;\n }\n\n /** Current agent execution phase (e.g. `\"idle\"`, `\"thinking\"`, `\"executing\"`). */\n get phase(): AgentPhase {\n return this._phase;\n }\n\n /** The pending question the agent is waiting for the user to answer, or null. */\n get pendingQuestion(): AgentStoreSnapshot[\"pendingQuestion\"] {\n return this._pendingQuestion;\n }\n\n /** Most recent error, or null when no error is active. */\n get error(): AgentStoreSnapshot[\"error\"] {\n return this._error;\n }\n\n /** Partial text that was visible when the user cancelled. Empty when not cancelled. */\n get cancelledText(): string {\n return this._cancelledText;\n }\n\n /** True when there are no more older messages to load via pagination. */\n get isAllLoaded(): boolean {\n return this._isAllLoaded;\n }\n\n // -- Commands --------------------------------------------------------------\n\n /**\n * Send a user prompt to the agent and optimistically update local state.\n *\n * Clears any previous error and cancelled text, sets phase to `\"thinking\"`,\n * and appends the prompt as a local message before forwarding to the agent.\n *\n * @param text - The user's prompt text.\n */\n prompt(text: string): void {\n // A prompt sent mid-turn (sender interjecting while the agent streams) is a\n // boundary: finalize the in-flight text before this prompt so the two don't\n // merge into one bubble. No-op at turn start (nothing streaming).\n this._flushStreaming();\n this._error = null;\n this._cancelledText = \"\";\n this._streamingFlushed = false;\n // A free-form prompt abandons any unanswered question: the turn it belonged\n // to is over. Left set, it would gate every status of the new turn.\n this._pendingQuestion = null;\n this._phase = \"thinking\";\n this._appendMessage({ type: \"prompt\", prompt: text }, \"user\");\n this._options.send({ type: \"prompt\", prompt: text });\n this._notify();\n }\n\n /**\n * Send a reply to the agent's pending question.\n *\n * Clears the pending question locally before forwarding the reply command.\n *\n * @param answer - The user's answer text.\n * @param question - The sub-question being answered, verbatim from its\n * `question` event. Required for correctness in hosts that surface several\n * queued questions at once ({@link pendingQuestion} tracks only the latest,\n * so those hosts drive this from their own message history): without it the\n * agent files the answer under its next unanswered sub-question, which\n * mismatches any non-sequential reply.\n */\n reply(answer: string, question?: string): void {\n this._pendingQuestion = null;\n // Answering a pending question resumes the agent turn — restore the busy\n // phase (mirrors prompt()) so the thinking indicator reappears immediately\n // rather than after the agent's first resumed event lands.\n this._phase = \"thinking\";\n const command = {\n type: \"reply\",\n answer,\n ...(question !== undefined ? { question } : {}),\n } as const;\n this._appendMessage(command, \"user\");\n this._options.send(command);\n this._notify();\n }\n\n /**\n * Cancel the current agent turn.\n *\n * Preserves partial streaming text in {@link cancelledText} so the UI can\n * display it. Clears streaming state, sets phase to `\"cancelling\"` (not\n * yet confirmed idle — see {@link AgentPhase}), and sends a `cancel`\n * command to the agent.\n */\n cancel(): void {\n // Preserve partial streaming text so the UI can still display it\n this._cancelledText = this._streamingText;\n this._streamingText = \"\";\n this._streamingFlushed = true;\n this._phase = \"cancelling\";\n this._options.send({ type: \"cancel\" });\n this._notify();\n }\n\n /**\n * Update shared state for a store namespace.\n *\n * Sends a `state_update` command to the agent and optimistically\n * updates local state so the change is reflected immediately.\n *\n * @param store - Store namespace (e.g. \"app\", \"component:render-123\").\n * @param state - Full state snapshot (replaces previous).\n */\n updateState(store: string, state: Record<string, unknown>): void {\n this._options.send({ type: \"state_update\", store, state });\n if (isSameJsonValue(this._sharedState.get(store), state, true)) return;\n // Optimistic local update\n this._sharedState = new Map(this._sharedState);\n this._sharedState.set(store, state);\n this._notify();\n }\n\n /**\n * Send an arbitrary command to the agent.\n *\n * Use this for commands that don't have a dedicated convenience method\n * (e.g. `ui_interaction`). No local state changes — the command is\n * forwarded as-is to the transport.\n *\n * @param cmd - The command to send.\n */\n send(cmd: AgentCommand): void {\n this._options.send(cmd);\n }\n\n /**\n * Load the previous page of messages and prepend them to the current list.\n *\n * No-op when `loadMessages` was not provided at construction time or when\n * all history has already been loaded ({@link isAllLoaded} is true).\n * Sets {@link isAllLoaded} to true once the server returns fewer messages\n * than the configured page size.\n */\n async loadPreviousMessages(): Promise<void> {\n if (!this._options.loadMessages || this._isAllLoaded) return;\n\n const pageSize = this._options.pageSize ?? DEFAULT_PAGE_SIZE;\n const before = this._messages.length > 0 ? this._messages[0].seq : undefined;\n const older = await this._options.loadMessages({ before, limit: pageSize });\n\n if (older.length < pageSize) this._isAllLoaded = true;\n\n const existingIds = new Set(this._messages.map((m) => m.id));\n const unique = older.filter((m) => !existingIds.has(m.id));\n this._messages = [...unique, ...this._messages];\n\n this._notify();\n }\n\n // -- External control ------------------------------------------------------\n\n /**\n * Programmatically update the connection status.\n *\n * Called by transport wrappers that cannot use the `onStatusChange`\n * callback (e.g. tRPC subscriptions that track status externally).\n *\n * Writing the status the store already holds is a no-op: it neither rotates\n * the snapshot nor notifies listeners.\n *\n * @param status - The new connection status.\n */\n setStatus(status: ConnectionStatus): void {\n if (this._status === status) return;\n this._status = status;\n this._notify();\n }\n\n // -- useSyncExternalStore interface ----------------------------------------\n\n /**\n * Register a change listener. Called synchronously after every state change.\n *\n * Conforms to the `subscribe` parameter of React's `useSyncExternalStore`.\n *\n * @param listener - Callback invoked whenever state changes.\n * @returns Unsubscribe function — call to stop receiving notifications.\n */\n subscribe = (listener: () => void): (() => void) => {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n };\n\n /**\n * Return the current immutable state snapshot.\n *\n * A new object is produced lazily on the first call after each state change.\n * Subsequent calls return the same cached object until the next change.\n * Conforms to the `getSnapshot` parameter of React's `useSyncExternalStore`.\n */\n getSnapshot = (): AgentStoreSnapshot => {\n if (!this._snapshot) {\n this._snapshot = {\n messages: this._messages,\n streamingText: this._streamingText,\n cancelledText: this._cancelledText,\n status: this._status,\n phase: this._phase,\n pendingQuestion: this._pendingQuestion,\n error: this._error,\n isAllLoaded: this._isAllLoaded,\n sharedState: this._sharedState,\n capabilities: this._capabilities,\n activeRenderInvocations: this._activeRenderInvocations,\n protocolInfo: this._protocolInfo,\n incompatibleProtocol: this._incompatibleProtocol,\n };\n }\n return this._snapshot;\n };\n\n // -- Cleanup ---------------------------------------------------------------\n\n /**\n * Unsubscribe from transport events and clear all change listeners.\n *\n * Call this when the component or service that owns the store unmounts or\n * shuts down to prevent memory leaks.\n */\n dispose(): void {\n this._unsubEvent();\n this._unsubStatus?.();\n this._listeners.clear();\n }\n\n // -- Factory ---------------------------------------------------------------\n\n /**\n * Create an {@link AgentStore} connected to a duck-typed agent client.\n *\n * Adapts the client's `send`/`onEvent`/`offEvent` API to the\n * {@link StoreTransport} interface expected by the constructor, without\n * creating a hard runtime dependency on `@skaile/workspaces/client`.\n *\n * @param client - Any object implementing {@link AgentClientLike}.\n * @param opts - Optional store configuration.\n * @param opts.sessionId - Session ID for message envelopes (defaults to a new UUID).\n * @param opts.initialMessages - Messages to pre-populate the store with.\n *\n * @example\n * ```ts\n * const store = AgentStore.fromClient(agentClient, { sessionId: 'sess-123' })\n * ```\n */\n static fromClient(\n client: AgentClientLike,\n opts?: { sessionId?: string; initialMessages?: Message[] },\n ): AgentStore {\n return new AgentStore({\n sessionId: opts?.sessionId ?? crypto.randomUUID(),\n send: (cmd) => client.send(cmd),\n onEvent: (handler) => {\n client.onEvent(handler);\n return () => client.offEvent(handler);\n },\n initialMessages: opts?.initialMessages,\n });\n }\n\n // -- Internal --------------------------------------------------------------\n\n private _handleEvent(event: AgentEvent): void {\n switch (event.type) {\n case \"text\":\n this._cancelledText = \"\";\n this._streamingText += event.content;\n this._streamingFlushed = false;\n break;\n\n case \"finished\":\n this._cancelledText = \"\";\n this._flushStreaming();\n this._appendMessage(event);\n // A cancelled finished is synthetic (persisted immediately for reload-\n // durability) and precedes the driver's real abort/kill sequence — stay\n // \"cancelling\" until the later, genuine status event reports \"idle\".\n if (!event.cancelled) this._phase = \"idle\";\n this._pendingQuestion = null;\n break;\n\n case \"status\":\n // While cancelling, the driver's interrupt/unwind window can still emit\n // stale \"working\" statuses for already-buffered tool activity — ignore\n // anything but the genuine idle confirmation.\n if (this._phase === \"cancelling\" && event.phase !== \"idle\") return;\n // A parked question is the same shape: the driver re-emits the turn's\n // buffered tool activity — including one call for the question tool\n // itself — while nothing is actually running. Only the genuine idle\n // confirmation may move the phase until the user answers.\n if (this._pendingQuestion !== null && event.phase !== \"idle\") return;\n // The bridge re-emits phase:\"working\" on every tool call, so most status\n // events in a turn carry the phase we already hold. `_notify()` rotates\n // the snapshot, so notifying for them re-renders consumers for nothing.\n if (this._phase === event.phase) return;\n this._phase = event.phase;\n break;\n\n case \"user_message\":\n // A peer's message mid-turn is a boundary: finalize the in-flight text\n // so it renders before the interjection. Flush-only — the peer message\n // is delivered via the host's history, not this transient echo. The\n // flush is internally conditional, so an echo arriving while nothing is\n // streaming (the common case — peers talk between turns) changed no\n // state and notifying for it was a pure fanout.\n if (!this._flushStreaming()) return;\n break;\n\n case \"question_reply\":\n // An answer ends the parked turn whoever sent it, so it opens the status\n // gate the same way `reply()` does. A complete arm rather than a fall\n // through into the group below: sharing that body once let a tool_call\n // clear the flag, dropping the question card the user still had to\n // answer. No runner emits this event today — see this package's CLAUDE.md.\n this._pendingQuestion = null;\n this._flushStreaming();\n this._appendMessage(event);\n break;\n\n case \"tool_call\":\n case \"tool_result\":\n case \"file_changed\":\n case \"subagent\":\n case \"dev_server\":\n case \"handoff\":\n // Flush in-flight text first so each text block becomes its own\n // Message, interleaved with tool activity in order — otherwise text\n // before and after a tool call merges into one wall-of-text blob.\n this._flushStreaming();\n this._appendMessage(event);\n break;\n\n case \"question\":\n // A pending question is a human-in-the-loop pause — the agent is waiting\n // for the user, not working. Reset to idle (like finished/error) so any\n // phase-derived busy indicator clears until the user replies.\n this._flushStreaming();\n this._phase = \"idle\";\n this._pendingQuestion = event;\n this._appendMessage(event);\n break;\n\n case \"error\":\n this._error = { message: event.message, fatal: event.fatal };\n this._streamingText = \"\";\n this._streamingFlushed = true;\n this._phase = \"idle\";\n this._appendMessage(event);\n break;\n\n case \"state_changed\": {\n // Accumulate state per store namespace (notify only — no message).\n // Re-emits of unchanged state are routine, not exceptional: `serve.ts`\n // replays every namespace on connect (`buildStoreSnapshotReplay`), on a\n // seeded execution, on re-registering an already-registered store, and\n // immediately after registration — and the `xstate-store` adapter is\n // equality-free, so writing a key its current value emits too. Each of\n // those rebuilt the Map and rotated the snapshot for identical state.\n if (isSameJsonValue(this._sharedState.get(event.store), event.state)) return;\n this._sharedState = new Map(this._sharedState);\n this._sharedState.set(event.store, event.state);\n break;\n }\n\n // ── Protocol v2 ────────────────────────────────────────────────────────\n\n case \"capability_register\": {\n // TRANSIENT — accumulate v2 capabilities into the registry (no message).\n // The gateway replays the whole set on every (re)attach; a byte-identical\n // replay must not rotate the Map identity or notify, or a reconnect storm\n // compounds into an unbounded render loop in consumers.\n if (\n event.capabilities.every((cap) => isSameJsonValue(this._capabilities.get(cap.name), cap))\n ) {\n return;\n }\n this._capabilities = new Map(this._capabilities);\n for (const cap of event.capabilities) {\n this._capabilities.set(cap.name, cap);\n }\n break;\n }\n\n case \"capability_deregister\": {\n // TRANSIENT — drop capabilities by name. Names we never had are a no-op:\n // rebuilding the Map for them would notify with an identical registry.\n const present = event.names.filter((name) => this._capabilities.has(name));\n if (present.length === 0) return;\n this._capabilities = new Map(this._capabilities);\n for (const name of present) {\n this._capabilities.delete(name);\n }\n break;\n }\n\n case \"render_invoked\":\n // TRANSIENT — record latest render invocation (frontend pairs with\n // the matching `Capability.render` for placement).\n this._activeRenderInvocations = new Map(this._activeRenderInvocations);\n this._activeRenderInvocations.set(event.callId, event);\n break;\n\n case \"protocol_info\": {\n // TRANSIENT — runner announced its protocol version. It announces on\n // every attach, so tab mounts, StrictMode remounts and SSE reconnects\n // almost always carry the version we already hold. `ProtocolInfoEvent`\n // is nothing but `version`, and `ProtocolVersion` is exactly three\n // numbers, so the field comparison is complete, not conservative.\n //\n // A fresh announcement also retires any incompatibility notice: the\n // platform restarts the session on `incompatible_protocol`, and this\n // event is the replacement container introducing itself. Nothing cleared\n // `_incompatibleProtocol` before, so the restart banner was sticky for\n // the life of the store even though the platform's debug pane documents\n // this clear as already happening. Guarding without clearing would make\n // that permanent, since a repeat announcement would never get here.\n const held = this._protocolInfo?.version;\n const sameVersion =\n held !== undefined &&\n held.major === event.version.major &&\n held.minor === event.version.minor &&\n held.patch === event.version.patch;\n if (sameVersion && this._incompatibleProtocol === null) return;\n // Keep the held event object when the version is unchanged so consumers\n // with an effect keyed on `snapshot.protocolInfo` do not re-fire.\n if (!sameVersion) this._protocolInfo = event;\n this._incompatibleProtocol = null;\n break;\n }\n\n case \"incompatible_protocol\":\n // TRANSIENT — runner detected version drift; platform restarts session.\n this._incompatibleProtocol = event;\n break;\n\n case \"capability_invoked\":\n // Backend intercepts client-side invocations and dispatches them\n // through V2CapabilityRegistryService — frontends should not see\n // these. Drop silently if one slips through.\n return;\n\n case \"resource_response\":\n case \"resources_available\":\n // Transient — handled by ResourceClient, not AgentStore\n return;\n\n default:\n // The switch names 22 of `AgentEvent`'s 56 members. The other 34 —\n // `log_entry` above all, one per line of container output — hold no\n // AgentStore state, so falling through to the trailing `_notify()`\n // rotated the snapshot and re-rendered every consumer for state that\n // had not changed. Unlike the guarded cases this was not a replay\n // artifact: it happened on every single occurrence. Hosts that need\n // these events (log panels, mount indicators, typing bubbles) read them\n // off the transport upstream of the store, not out of the snapshot.\n //\n // Deliberately not an `assertNever` exhaustiveness check: that is a\n // compile error while 34 members are unnamed, and naming all 56 would\n // enumerate events the store holds no state for just to satisfy it.\n return;\n }\n\n this._notify();\n }\n\n /**\n * Finalize buffered streaming text as a `text` Message.\n *\n * @returns true when text was flushed; false when there was nothing to flush,\n * so callers can skip a notify that would change nothing.\n */\n private _flushStreaming(): boolean {\n if (this._streamingFlushed || !this._streamingText) return false;\n this._appendMessage({ type: \"text\", content: this._streamingText });\n this._streamingText = \"\";\n this._streamingFlushed = true;\n return true;\n }\n\n private _appendMessage(payload: AgentCommand | AgentEvent, senderId?: string): void {\n this._seq++;\n this._messages = [\n ...this._messages,\n {\n id: crypto.randomUUID(),\n seq: this._seq,\n timestamp: new Date().toISOString(),\n sessionId: this._options.sessionId,\n ...(senderId ? { senderId } : {}),\n payload,\n },\n ];\n }\n\n private _notify(): void {\n this._snapshot = null;\n for (const listener of this._listeners) {\n listener();\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/setup.ts"],"names":["p","isCancel","result"],"mappings":"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","file":"setup-XKTBHRWM.js","sourcesContent":["/**\n * skaile setup — Interactive provider setup wizard\n *\n * Discovers existing config, lets the user pick providers, enter/validate API keys,\n * choose where to store them, and set defaults.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { getModels, validateApiKey } from \"@skaile/workspaces/bridge\";\nimport {\n ALL_PROVIDERS,\n detectEnvApiKeys,\n loadSettings,\n maskApiKey,\n projectSettingsPath,\n providerEnvKey,\n resolveSettings,\n type SkaileSettings,\n saveSettings,\n WorkspaceYamlEditor,\n} from \"@skaile/workspaces/core\";\n\n// ---------------------------------------------------------------------------\n// Provider metadata\n// ---------------------------------------------------------------------------\n\n/** LLM providers only (excludes voice providers) */\nconst LLM_PROVIDERS = ALL_PROVIDERS.filter((p) => p !== \"deepgram\" && p !== \"elevenlabs\");\n\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: \"Anthropic (Claude)\",\n openai: \"OpenAI (GPT)\",\n google: \"Google (Gemini)\",\n mistral: \"Mistral AI\",\n groq: \"Groq (fast inference)\",\n openrouter: \"OpenRouter (multi-provider gateway)\",\n deepseek: \"DeepSeek\",\n xai: \"xAI (Grok)\",\n together: \"Together AI\",\n fireworks: \"Fireworks AI\",\n};\n\nconst PROVIDER_KEY_URLS: Record<string, string> = {\n anthropic: \"https://console.anthropic.com/settings/keys\",\n openai: \"https://platform.openai.com/api-keys\",\n google: \"https://aistudio.google.com/apikey\",\n mistral: \"https://console.mistral.ai/api-keys\",\n groq: \"https://console.groq.com/keys\",\n openrouter: \"https://openrouter.ai/settings/keys\",\n deepseek: \"https://platform.deepseek.com/api_keys\",\n xai: \"https://console.x.ai/\",\n together: \"https://api.together.ai/settings/api-keys\",\n fireworks: \"https://fireworks.ai/api-keys\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype StorageTarget = \"settings\" | \"env-project\" | \"env-global\" | \"skip\";\ntype DefaultsTarget = \"project\" | \"personal\";\n\ninterface SetupPlan {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultsTarget: DefaultsTarget;\n defaultProvider: string;\n defaultModel: string;\n defaultDriver: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCancel(value: unknown): value is symbol {\n return p.isCancel(value);\n}\n\nfunction exitOnCancel<T>(value: T): asserts value is Exclude<T, symbol> {\n if (isCancel(value)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n}\n\n/** Load .env files from common locations and parse key=value pairs */\nfunction loadDotenvKeys(): Record<string, string> {\n const locations = [path.join(process.cwd(), \".env\"), path.join(os.homedir(), \".env\")];\n const result: Record<string, string> = {};\n for (const loc of locations) {\n try {\n const content = fs.readFileSync(loc, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let val = trimmed.slice(eq + 1).trim();\n // Strip surrounding quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n } catch {\n // file doesn't exist, skip\n }\n }\n return result;\n}\n\n/** Append key=value entries to a .env file without overwriting existing keys */\nfunction appendEnvFile(filePath: string, entries: Record<string, string>): void {\n let existing = \"\";\n try {\n existing = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n\n const existingKeys = new Set<string>();\n for (const line of existing.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq !== -1) existingKeys.add(trimmed.slice(0, eq).trim());\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(entries)) {\n if (existingKeys.has(key)) {\n p.log.warn(` ${key} already exists in ${filePath} — skipping`);\n continue;\n }\n lines.push(`${key}=${value}`);\n }\n\n if (lines.length === 0) return;\n\n const separator = existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\";\n const content = `${separator + lines.join(\"\\n\")}\\n`;\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.appendFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Wizard steps\n// ---------------------------------------------------------------------------\n\nasync function showCurrentState(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n): Promise<void> {\n const apiKeys = settings.apiKeys ?? {};\n const lines: string[] = [\"Provider keys:\"];\n for (const provider of LLM_PROVIDERS) {\n const envVal = envKeys[provider];\n const storedVal = apiKeys[provider];\n if (envVal) {\n lines.push(` ${provider.padEnd(12)} [env] ${maskApiKey(envVal)}`);\n } else if (storedVal) {\n lines.push(` ${provider.padEnd(12)} [stored] ${maskApiKey(storedVal)}`);\n } else {\n lines.push(` ${provider.padEnd(12)} (not configured)`);\n }\n }\n lines.push(\"\");\n lines.push(\"Current defaults:\");\n lines.push(` Provider: ${settings.provider ?? \"(not set)\"}`);\n lines.push(` Model: ${settings.model ?? \"(not set)\"}`);\n lines.push(` Driver: ${settings.driver ?? \"(not set)\"}`);\n\n p.note(lines.join(\"\\n\"), \"Current configuration\");\n}\n\nasync function selectProviders(\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string[]> {\n const result = await p.multiselect({\n message: \"Which providers do you want to configure?\",\n options: LLM_PROVIDERS.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n hint: envKeys[id]\n ? `env: ${maskApiKey(envKeys[id])}`\n : storedKeys[id]\n ? `stored: ${maskApiKey(storedKeys[id])}`\n : undefined,\n })),\n initialValues: LLM_PROVIDERS.filter((id) => envKeys[id] || storedKeys[id]),\n required: true,\n });\n exitOnCancel(result);\n return result as string[];\n}\n\n/**\n * Run the optional validation step for a freshly entered key.\n * Returns true if the key should be kept (valid, or user opted to keep anyway),\n * false if it should be discarded.\n */\nasync function confirmKeyAfterValidation(provider: string, key: string): Promise<boolean> {\n const shouldValidate = await p.confirm({\n message: \"Validate this key?\",\n initialValue: true,\n });\n exitOnCancel(shouldValidate);\n\n if (!shouldValidate) return true;\n\n const s = p.spinner();\n s.start(`Validating ${provider} key...`);\n const result = await validateApiKey(provider, key);\n if (result.ok) {\n s.stop(`${provider} key is valid`);\n return true;\n }\n s.stop(`${provider} validation failed: ${result.error}`);\n const retry = await p.confirm({\n message: \"Use this key anyway?\",\n initialValue: false,\n });\n exitOnCancel(retry);\n return retry;\n}\n\n/**\n * Collect (or skip) the API key for a single provider.\n * Returns the entered key, or undefined when the provider is already configured,\n * the user declines to update, leaves it blank, or rejects a failed validation.\n */\nasync function collectProviderKey(\n provider: string,\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string | undefined> {\n const envVar = providerEnvKey(provider);\n\n if (envKeys[provider]) {\n p.log.info(`${PROVIDER_LABELS[provider] ?? provider}: already set via ${envVar}`);\n return undefined;\n }\n\n if (storedKeys[provider]) {\n const update = await p.confirm({\n message: `${PROVIDER_LABELS[provider] ?? provider}: key already stored (${maskApiKey(storedKeys[provider])}). Update it?`,\n initialValue: false,\n });\n exitOnCancel(update);\n if (!update) return undefined;\n }\n\n const keyUrl = PROVIDER_KEY_URLS[provider];\n const key = await p.password({\n message: `${PROVIDER_LABELS[provider] ?? provider} API key${keyUrl ? ` (get one at ${keyUrl})` : \"\"}:`,\n });\n exitOnCancel(key);\n\n if (!key) return undefined;\n\n const keep = await confirmKeyAfterValidation(provider, key);\n if (!keep) return undefined;\n\n return key;\n}\n\nasync function collectApiKeys(\n providers: string[],\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<Record<string, string>> {\n const newKeys: Record<string, string> = {};\n\n for (const provider of providers) {\n const key = await collectProviderKey(provider, envKeys, storedKeys);\n if (key !== undefined) newKeys[provider] = key;\n }\n\n return newKeys;\n}\n\nasync function selectStorageTarget(): Promise<StorageTarget> {\n const result = await p.select({\n message: \"Where should API keys be stored?\",\n options: [\n { value: \"settings\" as const, label: \".skaile/settings.json (project-local, gitignored)\" },\n { value: \"env-project\" as const, label: `${process.cwd()}/.env (project-level)` },\n { value: \"env-global\" as const, label: `${os.homedir()}/.env (global)` },\n { value: \"skip\" as const, label: \"Skip — I'll set env vars myself\" },\n ],\n });\n exitOnCancel(result);\n return result as StorageTarget;\n}\n\nasync function selectDefaultProvider(providers: string[], current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default LLM provider:\",\n options: providers.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n })),\n initialValue: current && providers.includes(current) ? current : providers[0],\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultModel(\n provider: string,\n current?: string,\n apiKey?: string,\n): Promise<string> {\n // Try live model list from provider API, fall back to static catalog\n const s = apiKey ? p.spinner() : undefined;\n if (s) s.start(`Fetching models from ${provider}...`);\n\n const fetchResult = await getModels(provider, apiKey);\n\n if (s) {\n if (fetchResult.source === \"api\") {\n s.stop(`Loaded ${fetchResult.models.length} models from ${provider} API`);\n } else if (fetchResult.error) {\n s.stop(`Could not fetch live models (${fetchResult.error}) — using built-in catalog`);\n } else {\n s.stop(`Using built-in model catalog`);\n }\n }\n\n const models = fetchResult.models;\n if (models.length === 0) {\n p.log.warn(`No models found for ${provider} — enter a model ID manually`);\n const result = await p.text({\n message: \"Model ID:\",\n initialValue: current ?? \"\",\n });\n exitOnCancel(result);\n return result as string;\n }\n\n const result = await p.select({\n message: `Default model (${provider}):`,\n options: models.map((m) => ({\n value: m.id,\n label: `${m.name} (${m.id})`,\n })),\n initialValue: current && models.some((m) => m.id === current) ? current : models[0].id,\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDriver(current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default agent driver:\",\n options: [\n { value: \"omp\", label: \"omp (oh-my-pi — multi-provider, recommended)\" },\n { value: \"claude-sdk\", label: \"claude-sdk (Anthropic Agent SDK, Claude only)\" },\n { value: \"codex\", label: \"codex (OpenAI Codex SDK, OpenAI only)\" },\n ],\n initialValue: current ?? \"omp\",\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultsTarget(projectDir: string): Promise<DefaultsTarget> {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const hasYaml = fs.existsSync(yamlPath);\n\n if (!hasYaml) {\n // No skaile.yaml — can only save personally\n return \"personal\";\n }\n\n const result = await p.select({\n message: \"Where should driver, provider, and model defaults be saved?\",\n options: [\n {\n value: \"project\" as const,\n label: \"skaile.yaml (project-wide, shared with team)\",\n hint: \"recommended\",\n },\n {\n value: \"personal\" as const,\n label: \".skaile/settings.json (personal only, gitignored)\",\n },\n ],\n initialValue: \"project\" as const,\n });\n exitOnCancel(result);\n return result as DefaultsTarget;\n}\n\n/** Build the human-readable summary shown before applying the plan. */\nfunction buildSummaryLines(plan: SetupPlan, settingsFile: string): string[] {\n const lines: string[] = [];\n\n if (Object.keys(plan.newKeys).length > 0) {\n lines.push(\"New API keys:\");\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n lines.push(` ${provider.padEnd(12)} ${maskApiKey(key)}`);\n }\n const targetLabels: Record<StorageTarget, string> = {\n settings: `.skaile/settings.json (${settingsFile})`,\n \"env-project\": `${process.cwd()}/.env`,\n \"env-global\": `${os.homedir()}/.env`,\n skip: \"not saved (set env vars manually)\",\n };\n lines.push(` Storage: ${targetLabels[plan.storageTarget]}`);\n lines.push(\"\");\n }\n\n const defaultsLabel =\n plan.defaultsTarget === \"project\"\n ? \"skaile.yaml (project-wide)\"\n : \".skaile/settings.json (personal)\";\n lines.push(\"Defaults:\");\n lines.push(` Provider: ${plan.defaultProvider}`);\n lines.push(` Model: ${plan.defaultModel}`);\n lines.push(` Driver: ${plan.defaultDriver}`);\n lines.push(` Saved to: ${defaultsLabel}`);\n\n return lines;\n}\n\n/**\n * Write the new API keys to the chosen storage target.\n * For the `settings` target the keys are merged into `merged.apiKeys` (mutated\n * in place); for the env targets they are appended to the relevant `.env` file.\n */\nfunction persistApiKeys(plan: SetupPlan, merged: SkaileSettings): void {\n const hasNewKeys = Object.keys(plan.newKeys).length > 0;\n\n if (hasNewKeys && plan.storageTarget === \"settings\") {\n const apiKeys = { ...(merged.apiKeys ?? {}) };\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n apiKeys[provider] = key;\n }\n merged.apiKeys = apiKeys;\n } else if (hasNewKeys && plan.storageTarget === \"env-project\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(process.cwd(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${process.cwd()}/.env`);\n } else if (hasNewKeys && plan.storageTarget === \"env-global\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(os.homedir(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${os.homedir()}/.env`);\n }\n}\n\n/**\n * Apply the plan's defaults: write them to skaile.yaml when saving project-wide,\n * and set/strip the corresponding personal settings fields on `merged` (mutated\n * in place) so they don't shadow project-wide values.\n */\nfunction applyDefaults(plan: SetupPlan, projectDir: string, merged: SkaileSettings): void {\n // Save defaults to skaile.yaml or settings.json depending on user choice\n if (plan.defaultsTarget === \"project\") {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const editor = WorkspaceYamlEditor.load(yamlPath);\n editor.setAgentConfig(\"default\", {\n provider: plan.defaultProvider,\n model: plan.defaultModel,\n driver: plan.defaultDriver,\n });\n editor.save();\n p.log.success(`Saved defaults to ${yamlPath}`);\n }\n\n // Personal settings: only include defaults if saving personally, always include API keys.\n // When saving to project (skaile.yaml), strip driver/provider/model from settings.json\n // so they don't shadow the project-wide values.\n if (plan.defaultsTarget === \"personal\") {\n merged.provider = plan.defaultProvider;\n merged.model = plan.defaultModel;\n merged.driver = plan.defaultDriver;\n } else {\n delete merged.provider;\n delete merged.model;\n delete merged.driver;\n }\n}\n\nasync function reviewAndSave(plan: SetupPlan, projectDir: string): Promise<void> {\n const settingsFile = projectSettingsPath(projectDir);\n\n p.note(buildSummaryLines(plan, settingsFile).join(\"\\n\"), \"Summary\");\n\n const confirmed = await p.confirm({\n message: \"Apply these settings?\",\n initialValue: true,\n });\n exitOnCancel(confirmed);\n\n if (!confirmed) {\n p.cancel(\"Setup cancelled — no changes were made.\");\n process.exit(0);\n }\n\n // Load existing project settings (or empty)\n const existing = await loadSettings(settingsFile);\n\n const merged: SkaileSettings = { ...existing };\n applyDefaults(plan, projectDir, merged);\n persistApiKeys(plan, merged);\n\n // Write unified settings file\n await saveSettings(merged, settingsFile);\n p.log.success(`Saved settings to ${settingsFile}`);\n}\n\n// ---------------------------------------------------------------------------\n// Main entry\n// ---------------------------------------------------------------------------\n\n/** Check whether Claude Code OAuth credentials exist on disk */\nfunction hasClaudeCodeCredentials(): boolean {\n const credPath = path.join(os.homedir(), \".claude\", \".credentials.json\");\n try {\n const content = fs.readFileSync(credPath, \"utf-8\");\n const parsed = JSON.parse(content);\n // Check that it has at least one non-empty field\n return parsed && (parsed.accessToken || parsed.refreshToken || parsed.oauthToken);\n } catch {\n return false;\n }\n}\n\n/** The provider/key/model portion of a SetupPlan produced by a per-driver flow. */\ninterface DriverSetupResult {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultProvider: string;\n defaultModel: string;\n}\n\n/**\n * Claude SDK path: Anthropic only. Honours an existing API key (env or stored)\n * or Claude Code OAuth credentials, otherwise offers to enter a key.\n */\nasync function runClaudeSdkSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"anthropic\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n // Check for existing auth: API key or Claude Code OAuth credentials\n const hasEnvKey = !!envKeys.anthropic;\n const hasStoredKey = !!apiKeys.anthropic;\n const hasOAuth = hasClaudeCodeCredentials();\n\n if (hasEnvKey) {\n p.log.info(`Anthropic API key found in environment (${maskApiKey(envKeys.anthropic)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`Anthropic API key found in settings (${maskApiKey(apiKeys.anthropic)})`);\n newKeys = {};\n } else if (hasOAuth) {\n p.log.info(\"Claude Code subscription detected (OAuth credentials found)\");\n p.log.info(\"The Claude SDK will use your Claude Code login — no API key needed.\");\n newKeys = {};\n } else {\n // No auth found — prompt for Anthropic API key\n p.log.warn(\"No Anthropic API key or Claude Code subscription found.\");\n p.log.info(\"You can either:\");\n p.log.info(\" 1. Enter an Anthropic API key now\");\n p.log.info(\" 2. Run `claude login` to authenticate with Claude Code\");\n\n const wantsKey = await p.confirm({\n message: \"Enter an Anthropic API key?\",\n initialValue: true,\n });\n exitOnCancel(wantsKey);\n\n if (wantsKey) {\n newKeys = await collectApiKeys([\"anthropic\"], envKeys, apiKeys);\n } else {\n newKeys = {};\n }\n }\n\n // Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // Model selection — only Anthropic models (try live fetch with available key)\n const anthropicKey = newKeys.anthropic ?? envKeys.anthropic ?? apiKeys.anthropic;\n const defaultModel = await selectDefaultModel(\"anthropic\", settings.model, anthropicKey);\n\n return { providers: [\"anthropic\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** Codex path: OpenAI only. Honours an existing key, otherwise prompts for one. */\nasync function runCodexSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"openai\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n const hasEnvKey = !!envKeys.openai;\n const hasStoredKey = !!apiKeys.openai;\n\n if (hasEnvKey) {\n p.log.info(`OpenAI API key found in environment (${maskApiKey(envKeys.openai)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`OpenAI API key found in settings (${maskApiKey(apiKeys.openai)})`);\n newKeys = {};\n } else {\n p.log.warn(\"No OpenAI API key found.\");\n newKeys = await collectApiKeys([\"openai\"], envKeys, apiKeys);\n }\n\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n const openaiKey = newKeys.openai ?? envKeys.openai ?? apiKeys.openai;\n const defaultModel = await selectDefaultModel(\"openai\", settings.model, openaiKey);\n\n return { providers: [\"openai\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** omp / pi path: multi-provider flow (existing behavior). */\nasync function runMultiProviderSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n let storageTarget: StorageTarget = \"skip\";\n\n // 4. Select providers\n const providers = await selectProviders(envKeys, apiKeys);\n\n // 5. Collect API keys\n const newKeys = await collectApiKeys(providers, envKeys, apiKeys);\n\n // 6. Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // 7. Default provider (from selected providers + any already configured)\n const allConfigured = [\n ...new Set([\n ...providers,\n ...Object.keys(envKeys),\n ...Object.keys(apiKeys).filter((k) => apiKeys[k]),\n ]),\n ].filter((p) => LLM_PROVIDERS.includes(p as any));\n const defaultProvider = await selectDefaultProvider(\n allConfigured.length > 0 ? allConfigured : providers,\n settings.provider,\n );\n\n // 8. Default model (try live fetch with available key)\n const providerKey =\n newKeys[defaultProvider] ?? envKeys[defaultProvider] ?? apiKeys[defaultProvider];\n const defaultModel = await selectDefaultModel(defaultProvider, settings.model, providerKey);\n\n return { providers, newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/**\n * Interactive provider setup wizard: discovers existing config, prompts for\n * provider/model/driver preferences and API keys, then writes the results to\n * `skaile.yaml` or `.skaile/settings.json` depending on the user's choice.\n *\n * @param _args - Unused positional args (reserved for future use).\n * @param opts - Options including an optional `projectDir` override.\n * @docLink cli/dev-guide#setup\n */\nexport async function cmdSetup(_args: string[], opts: { projectDir?: string }): Promise<void> {\n p.intro(\"skaile setup\");\n\n const projectDir = opts.projectDir ?? process.cwd();\n\n // 1. Detect existing state via layered resolution\n const dotenvKeys = loadDotenvKeys();\n const envKeys = detectEnvApiKeys(dotenvKeys);\n const settings = await resolveSettings(projectDir);\n\n // 2. Show current state\n await showCurrentState(settings, envKeys);\n\n // 3. Select driver FIRST — it determines which providers/models are relevant\n const defaultDriver = await selectDriver(settings.driver);\n\n const apiKeys = settings.apiKeys ?? {};\n\n // Per-driver provider/key/model flow\n let result: DriverSetupResult;\n if (defaultDriver === \"claude-sdk\") {\n result = await runClaudeSdkSetup(settings, envKeys, apiKeys);\n } else if (defaultDriver === \"codex\") {\n result = await runCodexSetup(settings, envKeys, apiKeys);\n } else {\n result = await runMultiProviderSetup(settings, envKeys, apiKeys);\n }\n\n // 9. Choose where to save defaults (project-wide vs personal)\n const defaultsTarget = await selectDefaultsTarget(projectDir);\n\n // 10. Review and save\n await reviewAndSave(\n {\n providers: result.providers,\n newKeys: result.newKeys,\n storageTarget: result.storageTarget,\n defaultsTarget,\n defaultProvider: result.defaultProvider,\n defaultModel: result.defaultModel,\n defaultDriver,\n },\n projectDir,\n );\n\n p.outro(\"Setup complete!\");\n}\n"]}