@skaile/workspaces 6.16.1 → 6.17.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 (234) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{agent-file-refresh-VRD2SNJW.js → agent-file-refresh-RZWE25KN.js} +33 -33
  3. package/dist/{agent-file-refresh-VRD2SNJW.js.map → agent-file-refresh-RZWE25KN.js.map} +1 -1
  4. package/dist/ai-sdk.js +4 -4
  5. package/dist/{asset-feeds-ON7FYHHF.js → asset-feeds-W4A2UFNX.js} +16 -16
  6. package/dist/{asset-feeds-ON7FYHHF.js.map → asset-feeds-W4A2UFNX.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +3 -3
  8. package/dist/asset-manager/history.js +3 -3
  9. package/dist/asset-manager/index.js +8 -8
  10. package/dist/asset-manager/installer.js +7 -7
  11. package/dist/asset-manager/renderers.js +4 -4
  12. package/dist/bridge/harnesses/claude-sdk.js +7 -7
  13. package/dist/bridge/harnesses/codex.js +7 -7
  14. package/dist/bridge/harnesses/continue.js +8 -8
  15. package/dist/bridge/harnesses/echo.js +3 -3
  16. package/dist/bridge/harnesses/gemini.js +6 -6
  17. package/dist/bridge/harnesses/goose.js +8 -8
  18. package/dist/bridge/harnesses/omp.js +5 -5
  19. package/dist/bridge/harnesses/opencode.js +9 -9
  20. package/dist/bridge/harnesses/qwen.js +6 -6
  21. package/dist/bridge/index.js +13 -13
  22. package/dist/{chunk-BTMSHGN3.js → chunk-2QNDAGYL.js} +4 -4
  23. package/dist/{chunk-BTMSHGN3.js.map → chunk-2QNDAGYL.js.map} +1 -1
  24. package/dist/{chunk-2ZDZJ7XQ.js → chunk-3O3HWR23.js} +3 -3
  25. package/dist/{chunk-2ZDZJ7XQ.js.map → chunk-3O3HWR23.js.map} +1 -1
  26. package/dist/{chunk-G5SUWZEU.js → chunk-3ZY6W7CL.js} +4 -3
  27. package/dist/chunk-3ZY6W7CL.js.map +1 -0
  28. package/dist/{chunk-2JUCWMIS.js → chunk-4BVE6JTM.js} +9 -9
  29. package/dist/{chunk-2JUCWMIS.js.map → chunk-4BVE6JTM.js.map} +1 -1
  30. package/dist/{chunk-Z23I2JA6.js → chunk-4CVRFWEY.js} +5 -5
  31. package/dist/{chunk-Z23I2JA6.js.map → chunk-4CVRFWEY.js.map} +1 -1
  32. package/dist/{chunk-PPSSDUN6.js → chunk-4YVQGPZ5.js} +3 -3
  33. package/dist/{chunk-PPSSDUN6.js.map → chunk-4YVQGPZ5.js.map} +1 -1
  34. package/dist/{chunk-ETGC2MEM.js → chunk-52HUF3DF.js} +3 -3
  35. package/dist/{chunk-ETGC2MEM.js.map → chunk-52HUF3DF.js.map} +1 -1
  36. package/dist/{chunk-Z7HLX4V2.js → chunk-57B4DG3Y.js} +4 -4
  37. package/dist/{chunk-Z7HLX4V2.js.map → chunk-57B4DG3Y.js.map} +1 -1
  38. package/dist/{chunk-WW22FS74.js → chunk-5L3UCHBK.js} +9 -9
  39. package/dist/{chunk-WW22FS74.js.map → chunk-5L3UCHBK.js.map} +1 -1
  40. package/dist/{chunk-72DYHOO2.js → chunk-6CTRJADR.js} +5 -5
  41. package/dist/{chunk-72DYHOO2.js.map → chunk-6CTRJADR.js.map} +1 -1
  42. package/dist/{chunk-3LAJJURV.js → chunk-6O7KIJUW.js} +5 -5
  43. package/dist/{chunk-3LAJJURV.js.map → chunk-6O7KIJUW.js.map} +1 -1
  44. package/dist/{chunk-EGKCKWWE.js → chunk-6PWQJMHM.js} +3 -3
  45. package/dist/{chunk-EGKCKWWE.js.map → chunk-6PWQJMHM.js.map} +1 -1
  46. package/dist/{chunk-SMCG4PMP.js → chunk-7D46CRUU.js} +12 -12
  47. package/dist/{chunk-SMCG4PMP.js.map → chunk-7D46CRUU.js.map} +1 -1
  48. package/dist/{chunk-IG4YQ7ER.js → chunk-7IKAKXMZ.js} +3 -3
  49. package/dist/{chunk-IG4YQ7ER.js.map → chunk-7IKAKXMZ.js.map} +1 -1
  50. package/dist/{chunk-4ZNKEDYH.js → chunk-AS4SKSXJ.js} +5 -5
  51. package/dist/{chunk-4ZNKEDYH.js.map → chunk-AS4SKSXJ.js.map} +1 -1
  52. package/dist/{chunk-K4763755.js → chunk-AVB7NLO6.js} +6 -6
  53. package/dist/{chunk-K4763755.js.map → chunk-AVB7NLO6.js.map} +1 -1
  54. package/dist/{chunk-MG6QD7GE.js → chunk-DG7OEBLI.js} +6 -6
  55. package/dist/{chunk-MG6QD7GE.js.map → chunk-DG7OEBLI.js.map} +1 -1
  56. package/dist/{chunk-4X5WXQV7.js → chunk-DTIR5W6G.js} +3 -3
  57. package/dist/{chunk-4X5WXQV7.js.map → chunk-DTIR5W6G.js.map} +1 -1
  58. package/dist/{chunk-PRB67LCK.js → chunk-E2VPBB7C.js} +11 -11
  59. package/dist/{chunk-PRB67LCK.js.map → chunk-E2VPBB7C.js.map} +1 -1
  60. package/dist/{chunk-NAQXDTF3.js → chunk-EFCRBVHL.js} +3 -3
  61. package/dist/{chunk-NAQXDTF3.js.map → chunk-EFCRBVHL.js.map} +1 -1
  62. package/dist/{chunk-U6UFPOEK.js → chunk-F6EPGAES.js} +62 -24
  63. package/dist/chunk-F6EPGAES.js.map +1 -0
  64. package/dist/{chunk-VFEZUSB6.js → chunk-FURORBXE.js} +4 -4
  65. package/dist/{chunk-VFEZUSB6.js.map → chunk-FURORBXE.js.map} +1 -1
  66. package/dist/{chunk-BRAOB37W.js → chunk-GXW4B5SE.js} +51 -17
  67. package/dist/chunk-GXW4B5SE.js.map +1 -0
  68. package/dist/{chunk-SX54OQQT.js → chunk-HTQLI3OI.js} +4 -4
  69. package/dist/{chunk-SX54OQQT.js.map → chunk-HTQLI3OI.js.map} +1 -1
  70. package/dist/{chunk-TYK752MU.js → chunk-HZU5JW2F.js} +3 -3
  71. package/dist/{chunk-TYK752MU.js.map → chunk-HZU5JW2F.js.map} +1 -1
  72. package/dist/{chunk-NJ6UCY2B.js → chunk-I46MAK4H.js} +3 -3
  73. package/dist/{chunk-NJ6UCY2B.js.map → chunk-I46MAK4H.js.map} +1 -1
  74. package/dist/{chunk-PD42JZWI.js → chunk-K7IV5FY4.js} +2 -2
  75. package/dist/{chunk-PD42JZWI.js.map → chunk-K7IV5FY4.js.map} +1 -1
  76. package/dist/{chunk-2SSG5B24.js → chunk-KNOABDPY.js} +4 -4
  77. package/dist/{chunk-2SSG5B24.js.map → chunk-KNOABDPY.js.map} +1 -1
  78. package/dist/{chunk-P6FJDT35.js → chunk-LZ6C4YMX.js} +3 -3
  79. package/dist/{chunk-P6FJDT35.js.map → chunk-LZ6C4YMX.js.map} +1 -1
  80. package/dist/{chunk-TW5AP6IF.js → chunk-MZEZCRSO.js} +5 -5
  81. package/dist/{chunk-TW5AP6IF.js.map → chunk-MZEZCRSO.js.map} +1 -1
  82. package/dist/{chunk-3UYKT62L.js → chunk-N2XZSIJW.js} +244 -19
  83. package/dist/chunk-N2XZSIJW.js.map +1 -0
  84. package/dist/{chunk-3CRZJR7E.js → chunk-NZAUPFIM.js} +11 -11
  85. package/dist/{chunk-3CRZJR7E.js.map → chunk-NZAUPFIM.js.map} +1 -1
  86. package/dist/{chunk-OD4N5O7V.js → chunk-OLGQHP4R.js} +3 -3
  87. package/dist/{chunk-OD4N5O7V.js.map → chunk-OLGQHP4R.js.map} +1 -1
  88. package/dist/{chunk-RPRMD7XV.js → chunk-OMV4ROIO.js} +4 -4
  89. package/dist/{chunk-RPRMD7XV.js.map → chunk-OMV4ROIO.js.map} +1 -1
  90. package/dist/{chunk-H3PY5DFL.js → chunk-PC54LSZP.js} +3 -3
  91. package/dist/{chunk-H3PY5DFL.js.map → chunk-PC54LSZP.js.map} +1 -1
  92. package/dist/{chunk-U2WPJHRA.js → chunk-QZS7E3DY.js} +4 -4
  93. package/dist/{chunk-U2WPJHRA.js.map → chunk-QZS7E3DY.js.map} +1 -1
  94. package/dist/{chunk-S3UOZBGE.js → chunk-SOAQP4BI.js} +3 -3
  95. package/dist/{chunk-S3UOZBGE.js.map → chunk-SOAQP4BI.js.map} +1 -1
  96. package/dist/{chunk-FPG36VC4.js → chunk-UIAGUME5.js} +6 -6
  97. package/dist/{chunk-FPG36VC4.js.map → chunk-UIAGUME5.js.map} +1 -1
  98. package/dist/{chunk-NNJQQYHY.js → chunk-URN4G32O.js} +2 -2
  99. package/dist/{chunk-NNJQQYHY.js.map → chunk-URN4G32O.js.map} +1 -1
  100. package/dist/{chunk-CU5WY6HN.js → chunk-VAO3XYN3.js} +3 -3
  101. package/dist/{chunk-CU5WY6HN.js.map → chunk-VAO3XYN3.js.map} +1 -1
  102. package/dist/{chunk-QUIK7L3Z.js → chunk-WNT54WWX.js} +9 -9
  103. package/dist/{chunk-QUIK7L3Z.js.map → chunk-WNT54WWX.js.map} +1 -1
  104. package/dist/{chunk-T65N4CIZ.js → chunk-XHWBSC53.js} +4 -4
  105. package/dist/{chunk-T65N4CIZ.js.map → chunk-XHWBSC53.js.map} +1 -1
  106. package/dist/{chunk-KDRA6FYE.js → chunk-YKN5S7PO.js} +9 -9
  107. package/dist/{chunk-KDRA6FYE.js.map → chunk-YKN5S7PO.js.map} +1 -1
  108. package/dist/{chunk-TVRL3IPZ.js → chunk-ZEUBZV7L.js} +3 -3
  109. package/dist/{chunk-TVRL3IPZ.js.map → chunk-ZEUBZV7L.js.map} +1 -1
  110. package/dist/{chunk-U7P22GEB.js → chunk-ZHI3YMGQ.js} +4 -4
  111. package/dist/{chunk-U7P22GEB.js.map → chunk-ZHI3YMGQ.js.map} +1 -1
  112. package/dist/{chunk-6M44OQKH.js → chunk-ZKLXJV37.js} +9 -9
  113. package/dist/{chunk-6M44OQKH.js.map → chunk-ZKLXJV37.js.map} +1 -1
  114. package/dist/{claude-code-VL6UM7BZ.js → claude-code-K3QSXJ35.js} +4 -4
  115. package/dist/{claude-code-VL6UM7BZ.js.map → claude-code-K3QSXJ35.js.map} +1 -1
  116. package/dist/cli/index.js +115 -90
  117. package/dist/cli/index.js.map +1 -1
  118. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  119. package/dist/cli/src/commands/serve-preflight.d.ts +38 -0
  120. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  121. package/dist/cli/src/commands/serve.d.ts +7 -6
  122. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  123. package/dist/connectors/config.js +2 -2
  124. package/dist/connectors/index.js +16 -16
  125. package/dist/{connectors-7EPJRVLJ.js → connectors-SBV254SC.js} +19 -19
  126. package/dist/{connectors-7EPJRVLJ.js.map → connectors-SBV254SC.js.map} +1 -1
  127. package/dist/core/index.js +3 -3
  128. package/dist/core/runtime-assets.js +2 -2
  129. package/dist/core/src/model-endpoint-config.d.ts +12 -0
  130. package/dist/core/src/model-endpoint-config.d.ts.map +1 -0
  131. package/dist/core/src/workspace-config.d.ts +6 -0
  132. package/dist/core/src/workspace-config.d.ts.map +1 -1
  133. package/dist/core/workspace-config.js +1 -1
  134. package/dist/deploy/index.js +4 -4
  135. package/dist/{ensure-sources-CI3JQJST.js → ensure-sources-URRZB56T.js} +22 -22
  136. package/dist/{ensure-sources-CI3JQJST.js.map → ensure-sources-URRZB56T.js.map} +1 -1
  137. package/dist/factory-assets/connectors/box.js +16 -16
  138. package/dist/factory-assets/connectors/deploy.js +16 -16
  139. package/dist/factory-assets/connectors/devserver.js +16 -16
  140. package/dist/factory-assets/connectors/flow/adapter.js +16 -16
  141. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +2 -2
  142. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  143. package/dist/factory-assets/connectors/flow/run-flow.js +17 -17
  144. package/dist/factory-assets/connectors/flow.js +16 -16
  145. package/dist/factory-assets/connectors/git.js +16 -16
  146. package/dist/factory-assets/connectors/gmail.js +16 -16
  147. package/dist/factory-assets/connectors/googledrive.js +16 -16
  148. package/dist/factory-assets/connectors/local.js +16 -16
  149. package/dist/factory-assets/connectors/mattermost.js +16 -16
  150. package/dist/factory-assets/connectors/memory.js +16 -16
  151. package/dist/factory-assets/connectors/minio.js +16 -16
  152. package/dist/factory-assets/connectors/postgres.js +16 -16
  153. package/dist/factory-assets/connectors/s3.js +16 -16
  154. package/dist/factory-assets/connectors/sharepoint.js +16 -16
  155. package/dist/factory-assets/connectors/sqlite.js +16 -16
  156. package/dist/factory-assets/connectors/static-server.js +16 -16
  157. package/dist/factory-assets/connectors/tunnel.js +16 -16
  158. package/dist/factory-assets/connectors/webdav.js +16 -16
  159. package/dist/factory-assets/connectors/xstate-store.js +16 -16
  160. package/dist/factory-assets/connectors/xstate.js +16 -16
  161. package/dist/{flows-6XQAYQS4.js → flows-YGBWX46B.js} +6 -6
  162. package/dist/{flows-6XQAYQS4.js.map → flows-YGBWX46B.js.map} +1 -1
  163. package/dist/{helpers-26MR5QPO.js → helpers-5FFJORMD.js} +22 -22
  164. package/dist/{helpers-26MR5QPO.js.map → helpers-5FFJORMD.js.map} +1 -1
  165. package/dist/library/index.js +4 -4
  166. package/dist/{library-publish-YHYGA6G5.js → library-publish-AW4525ZC.js} +39 -39
  167. package/dist/{library-publish-YHYGA6G5.js.map → library-publish-AW4525ZC.js.map} +1 -1
  168. package/dist/model-endpoint/index.js +7 -7
  169. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  170. package/dist/model-endpoint/src/transform.d.ts +49 -0
  171. package/dist/model-endpoint/src/transform.d.ts.map +1 -0
  172. package/dist/model-endpoint/src/types.d.ts +13 -0
  173. package/dist/model-endpoint/src/types.d.ts.map +1 -1
  174. package/dist/{open-library-FVV6GG4I.js → open-library-C254HCNL.js} +25 -25
  175. package/dist/{open-library-FVV6GG4I.js.map → open-library-C254HCNL.js.map} +1 -1
  176. package/dist/{open-registry-VX2BVMS5.js → open-registry-FI6EO2PN.js} +8 -8
  177. package/dist/{open-registry-VX2BVMS5.js.map → open-registry-FI6EO2PN.js.map} +1 -1
  178. package/dist/{paths-PIWSSUUG.js → paths-FYPFJ437.js} +6 -6
  179. package/dist/{paths-PIWSSUUG.js.map → paths-FYPFJ437.js.map} +1 -1
  180. package/dist/plugin-registry/index.js +1 -1
  181. package/dist/plugin-registry/src/context.d.ts +6 -0
  182. package/dist/plugin-registry/src/context.d.ts.map +1 -1
  183. package/dist/plugin-registry/src/index.d.ts +4 -3
  184. package/dist/plugin-registry/src/index.d.ts.map +1 -1
  185. package/dist/plugin-registry/src/internal.d.ts.map +1 -1
  186. package/dist/plugin-registry/src/model-transform.d.ts +15 -0
  187. package/dist/plugin-registry/src/model-transform.d.ts.map +1 -0
  188. package/dist/plugin-registry/src/registry.d.ts +5 -5
  189. package/dist/plugin-registry/src/registry.d.ts.map +1 -1
  190. package/dist/plugin-registry/src/targets.d.ts +17 -2
  191. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  192. package/dist/{plugin-store-MVTW6G7J.js → plugin-store-ITA3IADY.js} +7 -7
  193. package/dist/{plugin-store-MVTW6G7J.js.map → plugin-store-ITA3IADY.js.map} +1 -1
  194. package/dist/{project-BOAHGBMI.js → project-7XU7YX3Q.js} +35 -35
  195. package/dist/{project-BOAHGBMI.js.map → project-7XU7YX3Q.js.map} +1 -1
  196. package/dist/resolver/index.js +3 -3
  197. package/dist/runner/composition-content.js +5 -5
  198. package/dist/runner/index.js +26 -26
  199. package/dist/runner/src/model-endpoint-discovery.d.ts +18 -0
  200. package/dist/runner/src/model-endpoint-discovery.d.ts.map +1 -1
  201. package/dist/runner/src/serve.d.ts.map +1 -1
  202. package/dist/sdk/asset-manager.js +8 -8
  203. package/dist/sdk/bridge.js +13 -13
  204. package/dist/sdk/core.js +3 -3
  205. package/dist/sdk/flow.js +4 -4
  206. package/dist/sdk/index.js +26 -26
  207. package/dist/sdk/resolver.js +3 -3
  208. package/dist/sdk/runner.js +26 -26
  209. package/dist/sdk/transport/ws/server.js +4 -4
  210. package/dist/sdk/transport/ws.js +4 -4
  211. package/dist/sdk/transport.js +4 -4
  212. package/dist/{serve-preflight-XJS5OZML.js → serve-preflight-A43HQQXD.js} +81 -25
  213. package/dist/serve-preflight-A43HQQXD.js.map +1 -0
  214. package/dist/{setup-BFEBJLYF.js → setup-WD7XTLDA.js} +23 -23
  215. package/dist/{setup-BFEBJLYF.js.map → setup-WD7XTLDA.js.map} +1 -1
  216. package/dist/{skills-OCG7B5CL.js → skills-XH6OG32W.js} +5 -5
  217. package/dist/{skills-OCG7B5CL.js.map → skills-XH6OG32W.js.map} +1 -1
  218. package/dist/{source-J2MJIHDS.js → source-25TTNBDK.js} +37 -37
  219. package/dist/{source-J2MJIHDS.js.map → source-25TTNBDK.js.map} +1 -1
  220. package/dist/{source-manifest-publish-6MYDXCKZ.js → source-manifest-publish-QJTPZQBN.js} +39 -39
  221. package/dist/{source-manifest-publish-6MYDXCKZ.js.map → source-manifest-publish-QJTPZQBN.js.map} +1 -1
  222. package/dist/transport/index.js +4 -4
  223. package/dist/transport/ws/server.js +4 -4
  224. package/dist/transport/ws.js +4 -4
  225. package/dist/tui/index.js +26 -26
  226. package/dist/workspace-plugin/adapters/mcp.js +19 -19
  227. package/dist/workspace-plugin/adapters/omp.js +14 -14
  228. package/dist/workspace-plugin/index.js +1 -1
  229. package/package.json +1 -1
  230. package/dist/chunk-3UYKT62L.js.map +0 -1
  231. package/dist/chunk-BRAOB37W.js.map +0 -1
  232. package/dist/chunk-G5SUWZEU.js.map +0 -1
  233. package/dist/chunk-U6UFPOEK.js.map +0 -1
  234. package/dist/serve-preflight-XJS5OZML.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/harness-model-check.ts","../bridge/src/harness-detect.ts","../bridge/src/preflight.ts","../bridge/src/harness-model-discovery.ts","../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":["execFile","path","firstLine"],"mappings":"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","file":"chunk-PRB67LCK.js","sourcesContent":["/**\n * Pre-flight model check: would the harness refuse the selected model before it starts a turn?\n *\n * `skaile run --dry-run` uses it so a setup check learns about a refusal that a real run would\n * print. The codex harness refuses a selection up front when it cannot address the AI provider\n * surface; every harness refuses a provider nothing serves ({@link checkModelProvider}).\n */\nimport { execFile } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { openSqlite } from \"@skaile/workspaces/core/logging\";\nimport { parse } from \"yaml\";\nimport { buildCodexConfigDocument } from \"./codex/config-toml.js\";\nimport { HARNESS_BINARIES, harnessSpawnPath, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { ompRegistryModelRefusal, registryModelEntries } from \"./harnesses/omp-models-yml.js\";\nimport { sessionSurfaceNotice } from \"./claude-sdk-surface.js\";\nimport { bindSingleProviderEntry } from \"./provider-materialize/env-harnesses.js\";\nimport { AI_PROVIDER_PRESETS } from \"./provider-catalog.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"./registry.js\";\n\n/** What {@link checkHarnessModel} reads. */\nexport interface HarnessModelCheckInput {\n registry?: AIProviderRegistry | MergedAIProviderRegistry;\n /** The model selector: `<providerId>/<modelId>`, a bare id or `@role`. */\n model?: string;\n roles?: Record<string, string>;\n}\n\n/**\n * Providers a harness reaches with its own login, without a registry entry: codex talks to\n * OpenAI, the Claude SDK to Anthropic, omp to every vendor the preset catalog lists. Every\n * other harness (gemini, qwen, goose, continue, echo, a plugin's) reaches a provider only\n * through a registry entry, so its set is empty. `opencode` is not checked: it names providers\n * by its own ids (`github-copilot`, `amazon-bedrock`), which no list here can match.\n */\nfunction nativeProviders(harnessId: string): ReadonlySet<string> {\n if (harnessId === \"codex\") return new Set([\"openai\"]);\n if (harnessId === \"claude-sdk\") return new Set([\"anthropic\"]);\n if (harnessId === \"omp\") return new Set(Object.keys(AI_PROVIDER_PRESETS));\n return new Set();\n}\n\n/**\n * What omp can serve on the user's own agent directory (`PI_CODING_AGENT_DIR`, else\n * `~/.omp/agent`): the provider ids their `models.yml` defines, and whether they have a login\n * (a usable credential in `agent.db`), which may carry built-in providers this list cannot name\n * (p1111). The file alone is no login: omp creates an empty `agent.db` on its first start (p1470).\n */\nfunction ompOwnHome(): { providers: ReadonlySet<string>; hasLogin: boolean } {\n const dir = process.env.PI_CODING_AGENT_DIR || path.join(os.homedir(), \".omp\", \"agent\");\n const providers = new Set<string>();\n try {\n const doc = parse(readFileSync(path.join(dir, \"models.yml\"), \"utf-8\")) as {\n providers?: unknown;\n } | null;\n const block = doc?.providers;\n if (block && typeof block === \"object\" && !Array.isArray(block)) {\n for (const id of Object.keys(block)) providers.add(id);\n }\n } catch {\n // no models.yml, or one omp itself will reject\n }\n return { providers, hasLogin: ompHasCredential(path.join(dir, \"agent.db\")) };\n}\n\n/**\n * True when omp's auth store holds a credential that is not disabled. A missing, unreadable or\n * schema-less file holds none. Reads the `auth_credentials` table and its `disabled_cause`\n * column as omp 18.12.6 writes them (checked against that version); a different layout reads\n * as \"no login\", which is the safe side. Read-only: the check never creates or changes the file.\n */\nfunction ompHasCredential(authDb: string): boolean {\n if (!existsSync(authDb)) return false;\n try {\n const db = openSqlite(authDb, { readonly: true });\n try {\n return (\n db\n .prepare(\"SELECT 1 AS found FROM auth_credentials WHERE disabled_cause IS NULL LIMIT 1\")\n .get<{ found: number }>() != null\n );\n } finally {\n db.close();\n }\n } catch {\n return false;\n }\n}\n\n/**\n * `<provider>/<model>` whose provider nothing can serve: not a registry entry and not a\n * provider the harness has its own login for. Without this the id goes to the harness's default\n * provider verbatim and fails there with a message that blames the login.\n *\n * One rule for every harness but opencode: a `<head>/<model>` whose head is no registered provider\n * and none the harness has its own login for is refused, whatever else is registered; a bare id\n * is allowed. omp alone leaves the verdict on an unknown head to its own model check\n * ({@link ompRegistryModelRefusal} and `omp models`) while an enabled registry entry exists: it\n * may know the id as a vendor-scoped model (`meta-llama/Llama-3.3-70B`) and says so itself.\n */\nexport function checkModelProvider(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n if (harnessId === \"opencode\") return undefined;\n const native = nativeProviders(harnessId);\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n const slash = selector.indexOf(\"/\");\n if (slash <= 0 || selector.startsWith(\"@\")) return undefined;\n const head = selector.slice(0, slash);\n if (native.has(head)) return undefined;\n const entries = input.registry ? registryEntries(input.registry) : [];\n if (entries.some(([id]) => id === head)) return undefined;\n const servesVendorIds =\n harnessId === \"omp\" &&\n entries.some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n if (servesVendorIds) return undefined;\n if (harnessId === \"omp\") {\n // With no registry entry omp runs on the user's own agent directory: their `models.yml`\n // providers and the logins omp ships are served there.\n const own = ompOwnHome();\n if (own.providers.has(head) || own.hasLogin) return undefined;\n }\n return `provider '${head}' is not configured: run skaile providers list`;\n}\n\n/**\n * The surface problem of the entry the selected model routes to, for the harnesses that route\n * the model through one registry entry and cannot speak every surface: the Claude Agent SDK\n * (`sessionSurfaceNotice`), and Gemini CLI and Qwen Code (the check they run at start,\n * `bindSingleProviderEntry`). `undefined` for the others and for an entry they speak. `skaile run`\n * and `run --dry-run` print it; `config set model` and `serve` do not judge it.\n */\nexport function checkModelSurface(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const registry = input.registry;\n if (!registry) return undefined;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (harnessId === \"claude-sdk\")\n return selector ? sessionSurfaceNotice(registry, selector) : undefined;\n if (harnessId !== \"gemini\" && harnessId !== \"qwen\") return undefined;\n const merged: MergedAIProviderRegistry = Array.isArray(\n (registry as MergedAIProviderRegistry).order,\n )\n ? (registry as MergedAIProviderRegistry)\n : {\n version: 1,\n providers: registry as AIProviderRegistry,\n order: Object.keys(registry),\n origin: {},\n locked: [],\n };\n try {\n bindSingleProviderEntry(harnessId, BUILTIN_HARNESS_CATALOG[harnessId]?.name ?? harnessId, {\n registry: merged,\n lookupEnv: process.env,\n ...(selector ? { modelRef: selector } : {}),\n });\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n return undefined;\n}\n\n/**\n * The refusal message the harness prints for this model, or `undefined` when it takes it.\n * The text matches the one the harness throws at start. The provider surface the Claude SDK,\n * Gemini CLI and Qwen Code cannot speak is {@link checkModelSurface}, which `run` adds.\n */\nexport function checkHarnessModel(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const unknownProvider = checkModelProvider(harnessId, input);\n if (unknownProvider) return unknownProvider;\n if (harnessId === \"omp\") {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n return ompRegistryModelRefusal(input.registry, selector, nativeProviders(\"omp\"));\n }\n if (harnessId !== \"codex\") return undefined;\n const build = buildCodexConfigDocument({\n registry: input.registry,\n ...(input.model ? { modelRef: input.model, model: input.model } : {}),\n ...(input.roles ? { roles: input.roles } : {}),\n });\n if (!build.unaddressable) return undefined;\n const { id, reason } = build.unaddressable;\n return `AI provider '${id}' cannot be used with the codex harness: ${reason}. Pick a model of another provider.`;\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready, or `undefined`\n * when omp can take the model (p1334). Stricter than {@link checkHarnessModel}, which `run --dry-run`\n * shares: a server answers its first prompt long after start, so a model omp reports as \"not\n * found\" must fail at start.\n *\n * It judges exactly what the harness sends. `materializeOmpProviders` resolves the selector with\n * `parseModelRef` and passes `--model <entry>/<model>` to omp: an `<entry>/<model>` selector goes\n * to that entry, and so does a bare id an entry maps; omp then refuses a model that entry does\n * not declare. An id no entry names or maps (`anthropic/claude-sonnet-4-5`,\n * `meta-llama/Llama-3.3-70B`, `nosuch/foo`) goes on exactly as typed: the registry\n * cannot judge it, so this check answers `undefined` for it, and {@link isUnlistedModel} tells\n * the caller to ask omp itself ({@link checkOmpListedModel}). The refusal names the selector the\n * user typed, never the rewritten one alone.\n */\nexport function checkOmpServeModel(input: HarnessModelCheckInput): string | undefined {\n const registry = input.registry;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!registry || !selector) return undefined;\n const ref = parseModelRef(selector, registry, input.roles);\n if (!ref?.providerModelId || ref.fallback) return undefined;\n const sent = `${ref.providerId}/${ref.providerModelId}`;\n const refusal = ompRegistryModelRefusal(registry, sent, nativeProviders(\"omp\"));\n if (!refusal) return undefined;\n if (sent === selector) return refusal;\n const detail = refusal.slice(refusal.indexOf(\"': \") + 3);\n return `omp cannot serve model '${selector}': it is sent to omp as '${sent}'; ${detail}`;\n}\n\n/**\n * True when `model` is an id the registry does not list: no entry is named by its head, none maps\n * it, and it is not an `@role`. Such an id goes to the harness as typed, so only the\n * harness itself can say whether it takes it. False with no registry entry to judge against.\n */\nexport function isUnlistedModel(input: HarnessModelCheckInput): boolean {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!input.registry || !selector) return false;\n return parseModelRef(selector, input.registry, input.roles)?.fallback === true;\n}\n\n/** Thinking levels omp takes as a `:<level>` suffix of a model selector. */\nconst OMP_THINKING_SUFFIX = /:(off|minimal|low|medium|high|xhigh)$/i;\n\n/** Run `omp <args> --json` and return the `models` of its answer, or `undefined` for no answer. */\nfunction ompModels(args: string[], timeoutMs: number): Promise<unknown[] | undefined> {\n const bin = resolveHarnessBinary(HARNESS_BINARIES.omp) ?? (process.env.OMP_BRIDGE_BIN || \"omp\");\n const pre = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n return new Promise((resolve) => {\n const child = execFile(\n bin,\n [...pre, ...args, \"--json\"],\n {\n timeout: timeoutMs,\n maxBuffer: 64 * 1024 * 1024,\n env: { ...process.env, PATH: harnessSpawnPath() },\n },\n (error, out) => {\n if (error) return resolve(undefined);\n try {\n const parsed: unknown = JSON.parse(out);\n const models = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === \"object\" && \"models\" in parsed\n ? parsed.models\n : undefined;\n resolve(Array.isArray(models) ? models : undefined);\n } catch {\n resolve(undefined);\n }\n },\n );\n child.stdin?.end();\n });\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready when no registry\n * entry is involved and omp runs on the user's own agent directory, or `undefined` when omp may\n * take the model (p1334). The registry check ({@link checkOmpServeModel}) cannot judge that\n * case: omp's catalog (built-in vendors, `models.yml`, logins) lives in omp.\n *\n * Asks omp itself. `omp models find` is a substring search, but `omp --model` also takes forms it\n * does not match (`anthropic/sonnet-4-5`, `openrouter/~anthropic/claude-sonnet-latest:high`), so\n * a selector is refused only when omp cannot know it: a `:<thinking level>` suffix is dropped, a\n * non-empty `find` answer passes, and an empty one passes too when the selector's `<provider>/`\n * head is a provider omp lists models for. A bare id that matches nothing, or a provider omp does\n * not list, is refused. Anything else (omp missing, a timeout, output that is not the expected\n * JSON) is no verdict, and the harness reports its own failure at start. Honours the\n * `OMP_BRIDGE_BIN` / `OMP_BRIDGE_PREARGS` test seam the harness uses.\n *\n * @param selector - The model as typed (`<provider>/<model>` or a bare id); `@role` is not judged.\n * @param timeoutMs - Total time to wait for omp across both calls (default 20 s).\n */\nexport async function checkOmpListedModel(\n selector: string,\n timeoutMs = 20_000,\n): Promise<string | undefined> {\n const wanted = selector.trim();\n if (!wanted || wanted.startsWith(\"@\")) return undefined;\n const deadline = Date.now() + timeoutMs;\n const query = wanted.replace(OMP_THINKING_SUFFIX, \"\");\n const found = await ompModels([\"models\", \"find\", query], timeoutMs);\n if (!found || found.length > 0) return undefined;\n const refusal = `omp cannot serve model '${wanted}': omp lists no model that matches it. Run \\`omp models\\` to see what it can serve.`;\n const slash = query.indexOf(\"/\");\n if (slash <= 0) return refusal;\n // The budget covers both calls: with no time left there is no verdict.\n const left = deadline - Date.now();\n if (left <= 0) return undefined;\n const all = await ompModels([\"models\"], left);\n if (!all) return undefined;\n const provider = query.slice(0, slash).toLowerCase();\n const known = all.some(\n (m) =>\n typeof m === \"object\" &&\n m !== null &&\n \"provider\" in m &&\n typeof m.provider === \"string\" &&\n m.provider.toLowerCase() === provider,\n );\n return known ? undefined : refusal;\n}\n","/**\n * Harness detection: can each harness start on this machine, and with what. Per harness the\n * report holds the program path, its version (against the declared minimum), whether the npm\n * SDK loads (SDK harnesses) and the harness's own account login (Claude Code, Codex).\n *\n * Every harness is probed on its own, in parallel, behind a try/catch: one broken probe turns\n * into an `unknown` row and leaves the others intact. {@link detectHarnesses} keeps the answer\n * for {@link DETECT_CACHE_TTL_MS}.\n */\nimport { execFile } from \"node:child_process\";\nimport path from \"node:path\";\nimport { installCommandFor, loadHarnessSdk, sdkLookupPlaces } from \"@skaile/workspaces/core\";\nimport semver from \"semver\";\nimport {\n HARNESS_BINARIES,\n type HarnessBinary,\n harnessSearchDirs,\n harnessSpawnPath,\n isExecutableFile,\n overrideVar,\n resolveHarnessBinary,\n SDK_CLI_BINARIES,\n} from \"./harness-binaries.js\";\nimport { listHarnesses } from \"./registry.js\";\n\n/** `ok`: can start; `missing`: program or SDK not found; `outdated`: below the minimum version; `unknown`: no rule for this harness. */\nexport type HarnessDetectStatus = \"ok\" | \"missing\" | \"outdated\" | \"unknown\";\n\n/** The harness's own account login. */\nexport interface HarnessLoginState {\n status: \"ok\" | \"missing\" | \"unknown\";\n detail?: string;\n}\n\n/** What {@link detectHarness} found for one harness. */\nexport interface HarnessDetection {\n id: string;\n /** ok: can start; missing: program or SDK not found; outdated: below minVersion; unknown: no rule (plugin harness). */\n status: HarnessDetectStatus;\n /** Absolute program path when one was found (CLI harnesses; the `claude` / `codex` CLI for the SDK harnesses). */\n path?: string;\n /** Version string parsed from `<bin> --version` (first `\\d+\\.\\d+\\.\\d+[-+\\w.]*` token). */\n version?: string;\n minVersion?: string;\n /** SDK harnesses: whether the npm SDK loads from `projectDir` (then next to skaile). */\n sdk?: { pkg: string; loaded: boolean };\n /** The harness's own account login, where it has one (claude-sdk, codex). */\n login?: HarnessLoginState;\n /** One actionable line when status is not ok. */\n problem?: string;\n /** Directories searched when nothing was found. */\n searched?: string[];\n}\n\n/** Options of {@link detectHarness} and {@link detectHarnesses}. */\nexport interface DetectHarnessOptions {\n /** Environment to resolve programs and run probes in (default `process.env`). */\n env?: NodeJS.ProcessEnv;\n /** Project the SDK probe loads the npm SDK from first (default cwd). */\n projectDir?: string;\n /** Timeout of each probe process in ms (default 5000). */\n timeoutMs?: number;\n /** Skip the {@link detectHarnesses} cache. */\n fresh?: boolean;\n}\n\n/** How long {@link detectHarnesses} keeps its answer. */\nexport const DETECT_CACHE_TTL_MS = 15_000;\nconst DEFAULT_PROBE_TIMEOUT_MS = 5000;\n\n/** Optional SDK a harness needs at run time, and how to probe that it loads from a project. */\nexport const HARNESS_SDKS: Record<\n string,\n { pkg: string; load: (projectDir: string) => Promise<unknown> }\n> = {\n \"claude-sdk\": {\n pkg: \"@anthropic-ai/claude-agent-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n ),\n },\n codex: {\n pkg: \"@openai/codex-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\"@openai/codex-sdk\", projectDir, () => import(\"@openai/codex-sdk\")),\n },\n};\n\n/**\n * The one line for a harness whose SDK does not load: where it was looked for and the install\n * command. `skaile serve` and `skaile run` preflight print it, and detection reports it.\n *\n * @param harness - Harness id.\n * @param pkg - The npm package the harness needs.\n * @param projectDir - Project the SDK was looked up from.\n */\nexport function sdkMissingProblem(harness: string, pkg: string, projectDir: string): string {\n return `The ${harness} harness needs ${pkg}, which is not installed. Looked in ${sdkLookupPlaces(projectDir)}. Run in the project: ${installCommandFor(pkg, projectDir)} (or pick another harness with --harness).`;\n}\n\ninterface ProbeResult {\n stdout: string;\n stderr: string;\n /** Exit code; `undefined` after a spawn error or a timeout. */\n code?: number;\n /** Spawn error or timeout. */\n failed: boolean;\n}\n\n/**\n * Run `bin args` once with closed stdin, a timeout and the extended PATH. Never rejects. A `bin`\n * without the exec bit (a `cli.js` from `CLAUDE_CODE_PATH`) runs as a script of this runtime.\n */\nfunction runProbe(\n bin: string,\n args: string[],\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<ProbeResult> {\n return new Promise((resolve) => {\n try {\n const asScript = !isExecutableFile(bin);\n const child = execFile(\n asScript ? process.execPath : bin,\n asScript ? [bin, ...args] : args,\n {\n timeout: timeoutMs,\n // In the `bun build --compile` skaile binary, process.execPath is skaile itself;\n // BUN_BE_BUN makes it act as bun so it runs the script. Node ignores the variable.\n env: { ...env, PATH: harnessSpawnPath(env), ...(asScript ? { BUN_BE_BUN: \"1\" } : {}) },\n windowsHide: true,\n maxBuffer: 1024 * 1024,\n },\n (error, stdout, stderr) => {\n const code = error && typeof error.code === \"number\" ? error.code : error ? undefined : 0;\n resolve({\n stdout: String(stdout ?? \"\"),\n stderr: String(stderr ?? \"\"),\n ...(code !== undefined ? { code } : {}),\n failed: error != null && typeof error.code !== \"number\",\n });\n },\n );\n child.stdin?.on(\"error\", () => {});\n child.stdin?.end();\n } catch (err) {\n resolve({ stdout: \"\", stderr: (err as Error).message, failed: true });\n }\n });\n}\n\nconst VERSION_RE = /\\d+\\.\\d+\\.\\d+[-+\\w.]*/;\n\n/** The version token of a `--version` answer, or `undefined` when the probe failed. */\nasync function probeVersion(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<string | undefined> {\n const res = await runProbe(bin, [\"--version\"], env, timeoutMs);\n if (res.failed || res.code !== 0) return undefined;\n return VERSION_RE.exec(`${res.stdout}\\n${res.stderr}`)?.[0];\n}\n\nfunction firstLine(text: string): string | undefined {\n return text\n .split(\"\\n\")\n .map((l) => l.trim())\n .find(Boolean);\n}\n\n/** `claude auth status`: JSON with `loggedIn` and `authMethod` on stdout. */\nasync function probeClaudeLogin(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessLoginState> {\n const res = await runProbe(bin, [\"auth\", \"status\"], env, timeoutMs);\n const start = res.stdout.indexOf(\"{\");\n const end = res.stdout.lastIndexOf(\"}\");\n let parsed: { loggedIn?: unknown; authMethod?: unknown } | undefined;\n if (start >= 0 && end > start) {\n try {\n parsed = JSON.parse(res.stdout.slice(start, end + 1)) as typeof parsed;\n } catch {\n parsed = undefined;\n }\n }\n if (parsed?.loggedIn === true) {\n return {\n status: \"ok\",\n ...(typeof parsed.authMethod === \"string\" ? { detail: parsed.authMethod } : {}),\n };\n }\n if (parsed?.loggedIn === false) {\n return {\n status: \"missing\",\n detail:\n \"Run `claude auth login`, or configure an Anthropic provider in Settings → AI Providers.\",\n };\n }\n return { status: \"unknown\", detail: firstLine(res.stderr) ?? \"no answer\" };\n}\n\n/** `codex login status`: `Logged in using ChatGPT` (exit 0) or `Not logged in`. */\nasync function probeCodexLogin(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessLoginState> {\n const res = await runProbe(bin, [\"login\", \"status\"], env, timeoutMs);\n const text = `${res.stdout}\\n${res.stderr}`;\n if (/not logged in/i.test(text)) {\n return { status: \"missing\", detail: \"Run `codex login`, or configure an OpenAI provider.\" };\n }\n if (!res.failed && res.code === 0 && /logged in/i.test(text)) {\n return { status: \"ok\", detail: firstLine(res.stdout) ?? firstLine(res.stderr) ?? \"logged in\" };\n }\n return {\n status: \"unknown\",\n detail: firstLine(res.stderr) ?? firstLine(res.stdout) ?? \"no answer\",\n };\n}\n\nconst LOGIN_PROBES: Record<\n string,\n (bin: string, env: NodeJS.ProcessEnv, timeoutMs: number) => Promise<HarnessLoginState>\n> = {\n \"claude-sdk\": probeClaudeLogin,\n codex: probeCodexLogin,\n};\n\nfunction outdatedProblem(row: HarnessBinary, version: string, minVersion: string): string {\n return `${row.bin} ${version} is older than ${minVersion}. ${row.hint}`;\n}\n\nasync function detectBinaryHarness(\n id: string,\n row: HarnessBinary,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessDetection> {\n const found = resolveHarnessBinary(row, env);\n if (!found) {\n return {\n id,\n status: \"missing\",\n ...(row.minVersion ? { minVersion: row.minVersion } : {}),\n problem: row.hint,\n searched: harnessSearchDirs(env),\n };\n }\n const version = await probeVersion(found, env, timeoutMs);\n const detection: HarnessDetection = {\n id,\n status: \"ok\",\n path: found,\n ...(version ? { version } : {}),\n ...(row.minVersion ? { minVersion: row.minVersion } : {}),\n };\n if (version && row.minVersion) {\n const have = semver.coerce(version);\n if (have && semver.lt(have, row.minVersion)) {\n detection.status = \"outdated\";\n detection.problem = outdatedProblem(row, version, row.minVersion);\n }\n }\n return detection;\n}\n\nasync function detectSdkHarness(\n id: string,\n sdkProbe: { pkg: string; load: (projectDir: string) => Promise<unknown> },\n env: NodeJS.ProcessEnv,\n projectDir: string,\n timeoutMs: number,\n): Promise<HarnessDetection> {\n const cli = SDK_CLI_BINARIES[id as keyof typeof SDK_CLI_BINARIES];\n const cliPath = cli ? resolveHarnessBinary(cli, env) : undefined;\n const loaded = await sdkProbe.load(projectDir).then(\n () => true,\n () => false,\n );\n const detection: HarnessDetection = {\n id,\n status: loaded ? \"ok\" : \"missing\",\n sdk: { pkg: sdkProbe.pkg, loaded },\n };\n if (!loaded) detection.problem = sdkMissingProblem(id, sdkProbe.pkg, projectDir);\n if (!cliPath || !cli) {\n detection.login = { status: \"unknown\", detail: cli?.hint ?? \"no CLI to ask\" };\n return detection;\n }\n detection.path = cliPath;\n const loginProbe = LOGIN_PROBES[id];\n const [version, login] = await Promise.all([\n probeVersion(cliPath, env, timeoutMs),\n loginProbe\n ? loginProbe(cliPath, env, timeoutMs)\n : Promise.resolve<HarnessLoginState>({ status: \"unknown\" }),\n ]);\n if (version) detection.version = version;\n detection.login = login;\n return detection;\n}\n\n/**\n * Detect one harness: install, version, SDK and login, as far as the harness has them. Never\n * rejects; a probe that throws gives `{ status: \"unknown\", problem }`.\n *\n * @param id - Harness id.\n * @param options - See {@link DetectHarnessOptions}; `fresh` has no effect here (no cache).\n */\nexport async function detectHarness(\n id: string,\n options: DetectHarnessOptions = {},\n): Promise<HarnessDetection> {\n try {\n const env = options.env ?? process.env;\n const timeoutMs = options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;\n const projectDir = options.projectDir ?? process.cwd();\n const row = HARNESS_BINARIES[id];\n if (row) return await detectBinaryHarness(id, row, env, timeoutMs);\n const sdk = HARNESS_SDKS[id];\n if (sdk) return await detectSdkHarness(id, sdk, env, projectDir, timeoutMs);\n if (id === \"echo\") return { id, status: \"ok\" };\n return { id, status: \"unknown\" };\n } catch (err) {\n return { id, status: \"unknown\", problem: err instanceof Error ? err.message : String(err) };\n }\n}\n\nconst detectCache = new Map<string, { at: number; value: Promise<HarnessDetection[]> }>();\n\n/**\n * Everything that changes what a probe sees: project, PATH, HOME, timeout, the override vars and\n * the vars the toolchain dir list reads.\n */\nfunction detectCacheKey(options: DetectHarnessOptions, env: NodeJS.ProcessEnv): string {\n const overrides = [...Object.values(HARNESS_BINARIES), ...Object.values(SDK_CLI_BINARIES)].map(\n (row) => `${overrideVar(row)}=${env[overrideVar(row)] ?? \"\"}`,\n );\n return JSON.stringify([\n path.resolve(options.projectDir ?? process.cwd()),\n env.PATH ?? \"\",\n env.HOME ?? \"\",\n env.NVM_DIR ?? \"\",\n env.MISE_DATA_DIR ?? \"\",\n env.NPM_CONFIG_PREFIX ?? \"\",\n env.npm_config_prefix ?? \"\",\n env.FNM_DIR ?? \"\",\n env.APPDATA ?? \"\",\n env.LOCALAPPDATA ?? \"\",\n options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS,\n ...overrides,\n ]);\n}\n\n/**\n * Detect every registered harness, in {@link listHarnesses} order, one guarded probe each in\n * parallel. The answer is cached for 15 s per project directory, `PATH`, `HOME`, timeout and\n * override variable; `fresh: true` probes again.\n *\n * @param options - See {@link DetectHarnessOptions}.\n */\nexport async function detectHarnesses(\n options: DetectHarnessOptions = {},\n): Promise<HarnessDetection[]> {\n const env = options.env ?? process.env;\n // A key that cannot be built (an env whose reads throw) leaves the answer uncached: the\n // probes report such a fault themselves, and detectHarnesses never rejects.\n let key: string | undefined;\n try {\n key = detectCacheKey(options, env);\n } catch {\n key = undefined;\n }\n const hit = key === undefined ? undefined : detectCache.get(key);\n if (!options.fresh && hit && Date.now() - hit.at < DETECT_CACHE_TTL_MS) return hit.value;\n const value = Promise.all(listHarnesses().map((info) => detectHarness(info.id, options)));\n if (key !== undefined) detectCache.set(key, { at: Date.now(), value });\n return value;\n}\n","/**\n * The one start check of every command that starts or configures a harness: `run` (also with\n * `--dry-run`), `repl`, `serve`, `validate` and `config set harness|model`. It answers, without\n * starting a harness or a model: would this harness start with this model and this agent?\n *\n * Each problem is one line plus a {@link HarnessErrorClass}, the same four classes a failed turn\n * has (`driver-contract.ts`), so a refusal before the start and a failure after it read alike:\n *\n * - `crash`: the harness is not registered, its program or SDK is missing, an agent ref does not\n * resolve;\n * - `model-refused`: the harness does not take the model (an unknown provider prefix, ADR 0014; a\n * provider surface it cannot speak; a model omp does not list; no model for omp to start on);\n * - `auth`: codex has nothing to sign in with.\n *\n * A caller that must keep an older, narrower verdict (`validate` judges the harness name only,\n * `config set model` the refusal only, `serve` is stricter for omp and does not look for the\n * harness program) names the checks it wants in {@link PreflightOptions.checks}.\n */\n\nimport path from \"node:path\";\nimport { SUPPORTED_HARNESSES } from \"@skaile/workspaces/core\";\nimport {\n isEntryEnabled,\n type MergedAIProviderRegistry,\n pickRegistryEntries,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { HarnessErrorClass } from \"./driver-contract.js\";\nimport { checkCodexCredential } from \"./harnesses/codex.js\";\nimport { HARNESS_BINARIES, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { HARNESS_SDKS, sdkMissingProblem } from \"./harness-detect.js\";\nimport {\n checkHarnessModel,\n checkModelSurface,\n checkOmpListedModel,\n checkOmpServeModel,\n isUnlistedModel,\n} from \"./harness-model-check.js\";\nimport { loadMergedProviderRegistry } from \"./provider-registry-load.js\";\nimport { listHarnesses } from \"./registry.js\";\n\n/** One thing that would stop the harness, in the class a host acts on and the line to print. */\nexport interface PreflightProblem {\n class: HarnessErrorClass;\n line: string;\n}\n\n/** The project the harness would run in. */\nexport interface PreflightProject {\n projectDir: string;\n /** The merged provider registry; default: the project's own files and the catalog. */\n registry?: MergedAIProviderRegistry;\n /** `@role` selectors resolve through this table. */\n roles?: Record<string, string>;\n /** Ids a session is narrowed to (`serve --providers`); the registry is narrowed the same way. */\n providers?: readonly string[];\n}\n\n/** The agent definition and instances the project names, as the refs were typed. */\nexport interface PreflightAgentRef {\n /** `agent.definition`. */\n definition?: string;\n /** `agents.<id>.ref`, by instance id. */\n instances?: Readonly<Record<string, string>>;\n}\n\n/**\n * How an agent ref is resolved. The CLI owns the rule (`validate` and `serve` print its lines),\n * so it passes it in; the bridge does not read the asset tree.\n */\nexport interface AgentRefLookups {\n /** Why `agent.definition` does not resolve, or `null`. */\n definition: (projectDir: string, definition: string) => string | null;\n /** Why the `ref` of instance `id` does not resolve, or `null`. */\n instance: (projectDir: string, id: string, ref: string) => string | null;\n}\n\n/**\n * - `harness`: the harness is registered;\n * - `start`: its program or SDK is found;\n * - `refusal`: it takes the model's provider and id;\n * - `readiness`: the rest of what the model needs (provider surface, credential, omp's own list);\n * - `agent`: the agent refs resolve.\n */\nexport type PreflightCheck = \"harness\" | \"start\" | \"refusal\" | \"readiness\" | \"agent\";\n\nconst ALL_CHECKS: readonly PreflightCheck[] = [\"harness\", \"start\", \"refusal\", \"readiness\", \"agent\"];\n\n/** Replaceable lookups and switches. */\nexport interface PreflightOptions {\n /** Which checks to make; default: all. Problems come in the order of {@link PreflightCheck}. */\n checks?: readonly PreflightCheck[];\n /**\n * Judge a server, not a run: only an explicit model is checked, omp must be known to take it\n * now (a server answers its first prompt after it is ready), the provider surface and the\n * codex credential are left to the first prompt, and the harness program is not looked for.\n */\n serve?: boolean;\n /** Whether the harness's program is found. */\n hasBinary?: (harnessId: string) => boolean;\n /** The SDK probe; the line it returns, or `null`. */\n sdkProblem?: (projectDir: string, harness: string) => Promise<string | null>;\n /** Asks omp itself whether it lists a model (`omp models find`). */\n ompListed?: (model: string) => Promise<string | undefined>;\n /** The line codex gives when nothing is left to sign in with, or `undefined`. */\n codexCredential?: (input: {\n projectDir: string;\n harness: string;\n model?: string;\n registry: MergedAIProviderRegistry;\n roles?: Record<string, string>;\n }) => string | undefined;\n /**\n * Whether omp has a model to start on when none is selected and no registry entry serves one\n * (`true`), or none (`false`), or cannot say (`undefined`). Asked only when given: it costs a\n * program start.\n */\n ompHasModel?: () => Promise<boolean | undefined>;\n /** Required when an agent ref is given. */\n agentRefs?: AgentRefLookups;\n}\n\n/**\n * The one-line problem when the harness cannot load its SDK, or `null`. The probe is the same\n * lookup the harness runs in `start()` (the project's `node_modules`, then next to skaile), so a\n * compiled binary that bundles the SDK passes. A harness with no SDK passes.\n */\nexport async function harnessSdkProblem(\n projectDir: string,\n harness: string,\n probe: typeof HARNESS_SDKS = HARNESS_SDKS,\n): Promise<string | null> {\n const sdk = probe[harness];\n if (!sdk) return null;\n try {\n await sdk.load(projectDir);\n return null;\n } catch {\n return sdkMissingProblem(harness, sdk.pkg, projectDir);\n }\n}\n\n/** The commands that write harness files, so they take the harness targets only. */\nconst DEPLOY_COMMANDS = \"harness set, init --harness and add --harness\";\n\n/**\n * The refusal for a harness name nothing registers, or `undefined` when it is known. The line\n * names the other command group's names too, see `unknownHarnessTargetMessage` in the CLI.\n */\nfunction unknownHarnessLine(harness: string): string | undefined {\n const known = listHarnesses().map((d) => d.id);\n if (known.includes(harness)) return undefined;\n return (\n `Unknown agent harness: \"${harness}\". Available: ${known.join(\", \")}. ` +\n `${DEPLOY_COMMANDS} take: ${SUPPORTED_HARNESSES.join(\", \")}.`\n );\n}\n\n/** The line for a program the harness spawns that is not found. */\nfunction missingBinaryLine(harnessId: string): string {\n const hint = HARNESS_BINARIES[harnessId]?.hint ?? `${harnessId} is not installed.`;\n return `${hint} Or pick another harness with --harness.`;\n}\n\n/** Harnesses that load an SDK. */\nconst SDK_HARNESSES: Readonly<Record<string, true>> = { \"claude-sdk\": true, codex: true };\n\n/** Harnesses that spawn a program. */\nconst PROGRAM_HARNESSES: Readonly<Record<string, true>> = {\n omp: true,\n gemini: true,\n qwen: true,\n opencode: true,\n goose: true,\n continue: true,\n};\n\n/** The selector as the harness gets it: an `@role` resolved through the table. */\nfunction ownSelector(model: string | undefined, roles?: Record<string, string>): string {\n const typed = model?.trim() ?? \"\";\n return typed.startsWith(\"@\") ? (roles?.[typed.slice(1)]?.trim() ?? \"\") : typed;\n}\n\n/**\n * Everything that would stop the harness from starting this run, one problem each, empty when it\n * can start. A harness this has no check for (`echo`, a plugin's) has none beyond being\n * registered. Starts no harness and no model; the SDK probe loads the SDK the way the harness\n * does.\n *\n * @param project - The project, its registry, roles and provider narrowing.\n * @param harness - The resolved harness id.\n * @param model - The model as typed (`--model`, `skaile.yaml`, settings); none to leave it out.\n * @param agentRef - The agent refs to resolve; none to leave them out.\n * @param options - Which checks, and replaceable lookups for tests.\n */\nexport async function preflight(\n project: PreflightProject,\n harness: string,\n model: string | undefined,\n agentRef?: PreflightAgentRef,\n options: PreflightOptions = {},\n): Promise<PreflightProblem[]> {\n const checks = new Set(options.checks ?? ALL_CHECKS);\n const serve = options.serve === true;\n const { projectDir } = project;\n const problems: PreflightProblem[] = [];\n const add = (cls: HarnessErrorClass, line: string | null | undefined): boolean => {\n if (!line) return false;\n problems.push({ class: cls, line });\n return true;\n };\n\n if (checks.has(\"harness\")) add(\"crash\", unknownHarnessLine(harness));\n\n if (checks.has(\"agent\") && agentRef) {\n const lookups = options.agentRefs;\n if (!lookups) throw new Error(\"preflight: an agent ref needs options.agentRefs to resolve it\");\n if (agentRef.definition) {\n add(\"crash\", lookups.definition(projectDir, agentRef.definition));\n }\n for (const [id, ref] of Object.entries(agentRef.instances ?? {})) {\n add(\"crash\", lookups.instance(projectDir, id, ref));\n }\n }\n\n // A harness nothing registers has no program, SDK or readiness to check; the model prefix is\n // still judged, as for every harness (ADR 0014).\n const registered = listHarnesses().some((d) => d.id === harness);\n\n if (registered && checks.has(\"start\")) {\n if (SDK_HARNESSES[harness]) {\n add(\"crash\", await (options.sdkProblem ?? harnessSdkProblem)(projectDir, harness));\n } else if (PROGRAM_HARNESSES[harness] && !serve) {\n const hasBinary =\n options.hasBinary ?? ((id) => resolveHarnessBinary(HARNESS_BINARIES[id]!) !== undefined);\n // A missing program is told alone: the model is judged once the program is found.\n if (!hasBinary(harness)) {\n add(\"crash\", missingBinaryLine(harness));\n return problems;\n }\n }\n }\n\n const wantsModel = checks.has(\"refusal\") || checks.has(\"readiness\");\n if (!wantsModel || (serve && !model)) return problems;\n\n const local =\n project.registry ?? loadMergedProviderRegistry({ projectDir: path.resolve(projectDir) }).merged;\n const registry = project.providers?.length\n ? pickRegistryEntries(local, project.providers)\n : local;\n const input = { registry, ...(model ? { model } : {}), roles: project.roles };\n\n if (checks.has(\"refusal\")) {\n const refusal =\n checkHarnessModel(harness, input) ??\n (serve && harness === \"omp\" ? checkOmpServeModel(input) : undefined);\n // omp is told the refusal alone: omp is not asked about a model the registry refuses.\n if (add(\"model-refused\", refusal) && (harness === \"omp\" || serve)) return problems;\n }\n\n if (!registered || !checks.has(\"readiness\")) return problems;\n const ompListed = options.ompListed ?? checkOmpListedModel;\n if (harness === \"omp\") {\n const own = ownSelector(model, project.roles);\n const typedOwn = model && !model.startsWith(\"@\") ? model : undefined;\n const served = registryEntries(registry).some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n // An id no registry entry lists goes to omp as typed, so omp is asked whether it knows it. A\n // server asks too when no entry serves anything: omp serves it from its own catalog.\n const ask = serve ? isUnlistedModel(input) || !served : isUnlistedModel(input);\n const asked = serve ? model : typedOwn;\n if (asked && ask) add(\"model-refused\", await ompListed(asked));\n else if (!own && !served && options.ompHasModel && (await options.ompHasModel()) === false) {\n add(\n \"model-refused\",\n \"omp has no model to start on: no model is selected, no AI provider entry serves one and omp lists none. Pass --model <provider/model>, or sign in with omp first.\",\n );\n }\n return problems;\n }\n if (serve) return problems;\n if (harness === \"codex\") {\n const credential = options.codexCredential ?? checkCodexCredential;\n add(\"auth\", credential({ projectDir, harness, ...input }));\n return problems;\n }\n add(\"model-refused\", checkModelSurface(harness, input));\n return problems;\n}\n","/**\n * Ask a harness which models it can serve with the configuration a session would give it.\n *\n * {@link listModelsForHarness} answers from the registry alone: it is hermetic, never starts\n * a program, and lists every enabled entry's `model_map`. That is the right contract for a\n * session, but a picker cannot tell from it what the harness will actually serve — an entry with\n * a `discovery:` block, or one whose provider the harness resolves itself, only shows up when the\n * harness is asked. {@link discoverHarnessModels} is the explicit, opt-in call that asks: it\n * renders the registry the way the harness's own start would (omp's `models.yml`, opencode's\n * `opencode.json`, the credential env), runs the harness's model-listing command with closed\n * stdin and a timeout, and removes whatever it rendered.\n *\n * Any failure (program missing, timeout, unparsable output) and every harness without an\n * enumerator fall back to the registry list, tagged `source: \"registry\"` with the reason.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport {\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { HARNESS_BINARIES, harnessSpawnPath, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { materializeOmpProviders, renderOmpRegistry } from \"./harnesses/omp-models-yml.js\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport {\n credentialsForEveryProvider,\n harnessProviderName,\n resolveEnvHarnessSession,\n} from \"./provider-materialize/env-harnesses.js\";\nimport { materializeOpenCodeConfig } from \"./provider-materialize/opencode-config.js\";\nimport { harnessSessionConfigHome } from \"./provider-materialize/session-config-home.js\";\nimport { registryHarnessConfig } from \"./provider-registry-derive.js\";\nimport { listModelsForHarness } from \"./registry.js\";\nimport { stripRunnerPrivateEnv } from \"./runner-private-env.js\";\nimport type { AgentConfig } from \"./types.js\";\n\n/** What {@link discoverHarnessModels} found. */\nexport interface HarnessModelDiscovery {\n /** The models, in the order the harness (or the registry) listed them. */\n models: ModelEntry[];\n /** `harness`: the harness itself listed them. `registry`: derived from the registry. */\n source: \"harness\" | \"registry\";\n /** Why the harness was not asked or did not answer, when `source` is `registry` for that reason. */\n error?: string;\n}\n\n/** Options of {@link discoverHarnessModels}. */\nexport type DiscoverHarnessModelsOptions = RegistryCredentialOptions & {\n /** Working directory the program runs in (default `process.cwd()`). */\n cwd?: string;\n /** Time the harness gets to answer, in milliseconds (default per harness: omp 20 s, opencode 15 s). */\n timeoutMs?: number;\n};\n\n/** One harness's way of listing its models. */\ninterface HarnessModelEnumerator {\n /** Default time budget in milliseconds. */\n timeoutMs: number;\n /** The models, or `undefined` when the program printed no model list. Throws with the reason. */\n list(config: AgentConfig, timeoutMs: number): Promise<ModelEntry[] | undefined>;\n}\n\n/** Run `bin args`, stdin closed; resolve with stdout or reject with a one-line reason. */\nfunction runProgram(\n harnessId: string,\n bin: string,\n args: string[],\n options: { cwd: string; env: NodeJS.ProcessEnv; timeoutMs: number },\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const child = execFile(\n bin,\n args,\n {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n maxBuffer: 64 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (!error) return resolve(stdout);\n const failure: { code?: string | number | null; killed?: boolean } = error;\n if (failure.code === \"ENOENT\") {\n return reject(new Error(HARNESS_BINARIES[harnessId]?.hint ?? `${harnessId} not found`));\n }\n if (failure.killed) {\n return reject(\n new Error(`${harnessId} did not answer within ${options.timeoutMs / 1000} s`),\n );\n }\n const firstLine = String(stderr)\n .split(\"\\n\")\n .find((line) => line.trim())\n ?.trim();\n reject(\n new Error(\n `${harnessId} exited with ${failure.code ?? \"an error\"}${firstLine ? `: ${firstLine}` : \"\"}`,\n ),\n );\n },\n );\n child.stdin?.end();\n });\n}\n\n/** The program to run for `harnessId` and the leading args its test seam supplies. */\nfunction programFor(harnessId: string): { bin: string; preArgs: string[] } {\n const row = HARNESS_BINARIES[harnessId];\n if (!row) throw new Error(`${harnessId} has no known program`);\n const bin = resolveHarnessBinary(row);\n if (!bin) throw new Error(row.hint);\n // The leading args belong to the `<PREFIX>_BRIDGE_BIN` override, exactly as in the harness.\n const overridden = Boolean(process.env[row.overrideEnv ?? `${row.envPrefix}_BRIDGE_BIN`]);\n const raw = process.env[`${row.envPrefix}_BRIDGE_PREARGS`];\n return { bin, preArgs: overridden && raw ? raw.split(/\\s+/).filter(Boolean) : [] };\n}\n\n/** The environment a discovery child gets: the process env, the session's env, then `extra`. */\nfunction childEnv(config: AgentConfig, extra: Record<string, string>): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env, ...config.env, ...extra };\n env.PATH = harnessSpawnPath(env);\n return stripRunnerPrivateEnv(env);\n}\n\n/**\n * The chat models of `omp models --json`'s answer, as `<provider>/<id>` selectors. Exported for\n * tests; `undefined` when the text is not that answer or lists no chat model.\n */\nexport function parseOmpModelsJson(stdout: string): ModelEntry[] | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stdout);\n } catch {\n return undefined;\n }\n const list: unknown =\n parsed && typeof parsed === \"object\" && \"models\" in parsed ? parsed.models : parsed;\n if (!Array.isArray(list)) return undefined;\n const seen = new Set<string>();\n const models: ModelEntry[] = [];\n for (const item of list) {\n if (!item || typeof item !== \"object\") continue;\n const row: Record<string, unknown> = { ...item };\n if (row.kind !== \"chat\") continue;\n const providerId = typeof row.provider === \"string\" ? row.provider : undefined;\n const providerModelId = typeof row.id === \"string\" ? row.id : undefined;\n const selector =\n typeof row.selector === \"string\" && row.selector\n ? row.selector\n : providerId && providerModelId\n ? `${providerId}/${providerModelId}`\n : undefined;\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n models.push({\n id: selector,\n name: typeof row.name === \"string\" && row.name ? row.name : (providerModelId ?? selector),\n ...(providerId ? { providerId } : {}),\n ...(providerModelId ? { providerModelId } : {}),\n source: \"harness\",\n });\n }\n return models.length > 0 ? models : undefined;\n}\n\n/**\n * The `<provider>/<model>` lines of `opencode models`. A model id may itself contain `/`\n * (`openrouter/anthropic/claude-sonnet-4`): the provider is the head up to the first `/`. Lines\n * that are not that shape (banners, the JSON of `--verbose`) are skipped; repeats are dropped.\n */\nexport function parseOpenCodeModelLines(stdout: string): { provider: string; model: string }[] {\n const seen = new Set<string>();\n const lines: { provider: string; model: string }[] = [];\n for (const raw of stdout.split(\"\\n\")) {\n const match = /^([^\\s/]+)\\/(\\S+)$/.exec(raw.trim());\n if (!match?.[1] || !match[2] || seen.has(raw.trim())) continue;\n seen.add(raw.trim());\n lines.push({ provider: match[1], model: match[2] });\n }\n return lines;\n}\n\nconst ompEnumerator: HarnessModelEnumerator = {\n timeoutMs: 20_000,\n async list(config, timeoutMs) {\n // The agent directory an omp session would start in (`OmpHarness._start`): the registry\n // rendered to `models.yml`, the developer's own login seeded in when it exists.\n //\n // A session that names no model leaves the registry out when the developer's own omp\n // default needs their own `models.yml`: omp then runs on their directory. A\n // discovery asks what the registry's providers serve, so it names the first usable entry;\n // that is the one input `materializeOmpProviders` takes as \"the session picked a registry\n // model\" and renders the registry for.\n let sessionConfig = config;\n if (!config.modelRef && config.registry) {\n const first = renderOmpRegistry(config.registry, {\n env: { ...process.env, ...config.env },\n }).providerIds[0];\n if (first) sessionConfig = { ...config, modelRef: first };\n }\n const mat = await materializeOmpProviders(sessionConfig);\n try {\n const { bin, preArgs } = programFor(\"omp\");\n const env = childEnv(config, {\n ...(mat ? { PI_CODING_AGENT_DIR: mat.agentDir, ...mat.credentialEnv } : {}),\n });\n const stdout = await runProgram(\"omp\", bin, [...preArgs, \"models\", \"--json\"], {\n cwd: config.cwd,\n env,\n timeoutMs,\n });\n return parseOmpModelsJson(stdout);\n } finally {\n if (mat?.ephemeral) await rm(mat.agentDir, { recursive: true, force: true });\n }\n },\n};\n\nconst opencodeEnumerator: HarnessModelEnumerator = {\n // `opencode models` fetches models.dev, which regularly takes longer than 8 s.\n timeoutMs: 15_000,\n async list(config, timeoutMs) {\n const session = resolveEnvHarnessSession(config);\n // The opencode harness renders this file before every turn and leaves it; a discovery uses\n // a session id of its own, so its config home can go once the program has answered.\n const home = harnessSessionConfigHome(\"opencode\", config);\n try {\n const mat = materializeOpenCodeConfig(session, config);\n const { bin, preArgs } = programFor(\"opencode\");\n const env = childEnv(config, { ...credentialsForEveryProvider(session), ...mat.env });\n const stdout = await runProgram(\"opencode\", bin, [...preArgs, \"models\"], {\n cwd: config.cwd,\n env,\n timeoutMs,\n });\n const lines = parseOpenCodeModelLines(stdout);\n if (lines.length === 0) return undefined;\n\n // OpenCode names a stock catalog endpoint by its preset id and a custom one by the registry\n // id; map its provider name back to the registry entry that owns it.\n const entryOf = new Map<string, string>();\n for (const [entryId, entry] of registryEntries(session.registry)) {\n if (entry.kind !== \"llm\" || !isEntryEnabled(entry)) continue;\n const name = harnessProviderName(entryId, entry);\n if (!entryOf.has(name)) entryOf.set(name, entryId);\n }\n return lines.map(({ provider, model }) => ({\n id: `${provider}/${model}`,\n name: model,\n providerId: entryOf.get(provider) ?? provider,\n providerModelId: model,\n source: \"harness\" as const,\n }));\n } finally {\n await rm(home, { recursive: true, force: true });\n }\n },\n};\n\n/** Harnesses that can list their models themselves, by harness id. */\nconst HARNESS_MODEL_ENUMERATORS: Readonly<Record<string, HarnessModelEnumerator>> = {\n omp: ompEnumerator,\n opencode: opencodeEnumerator,\n};\n\n/**\n * The models `harnessId` serves with the configuration a session over `registry` would get.\n *\n * Only omp (`omp models --json`) and opencode (`opencode models`) are asked; the other harnesses\n * run on the provider the registry hands them, so the registry list is already their catalog.\n * The answer is the registry list, `source: \"registry\"`, when the harness has no enumerator and\n * also when asking fails; then `error` carries the reason (the install hint, a timeout line, a\n * parse failure).\n *\n * @param harnessId - Registered harness id.\n * @param registry - The AI provider registry the session would carry.\n * @param options - Credential resolution (`env`, `providerId`), the working directory and the\n * time budget.\n * @throws {Error} When the registry fallback is needed and `harnessId` is unknown or not bundled\n * (same contract as {@link listModelsForHarness}).\n */\nexport async function discoverHarnessModels(\n harnessId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: DiscoverHarnessModelsOptions = {},\n): Promise<HarnessModelDiscovery> {\n const enumerator = HARNESS_MODEL_ENUMERATORS[harnessId];\n if (!enumerator) {\n return { models: await listModelsForHarness(harnessId, registry, options), source: \"registry\" };\n }\n\n const config: AgentConfig = {\n cwd: options.cwd ?? process.cwd(),\n sessionId: `model-discovery-${randomUUID().slice(0, 8)}`,\n ...registryHarnessConfig(registry, options),\n };\n let error: string;\n try {\n const models = await enumerator.list(config, options.timeoutMs ?? enumerator.timeoutMs);\n if (models && models.length > 0) return { models, source: \"harness\" };\n error = `${harnessId} printed no model list`;\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n }\n return {\n models: await listModelsForHarness(harnessId, registry, options),\n source: \"registry\",\n error,\n };\n}\n","/**\n * EventNormalizer — converts bridge-level AgentEvent (raw harness 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 {\n type AgentEvent as NormalizedEvent,\n type NativeApprovalDescription,\n stripActivityLabel,\n TOOL_ACTIVITY_LABEL_MAX_CHARS,\n TOOL_ACTIVITY_LABEL_PARAM,\n} 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(\n event: Pick<\n Extract<BridgeEvent, { type: \"result\" | \"error\" }>,\n \"tokens\" | \"modelUsage\" | \"contextTokens\" | \"contextWindow\"\n >,\n) {\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 harness 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\nconst MAX_ANNOUNCED_TOOL_USES = 64;\n\n/**\n * Bridge `tool_call` inputs are loosely typed: Codex MCP arguments may arrive\n * as a JSON string, and the echo harness passes a bare path.\n */\nfunction toolInputRecord(input: unknown): Record<string, unknown> {\n let value = input;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n return { input };\n }\n }\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return value === undefined ? {} : { input };\n}\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 /** Dev-server URLs already announced as ready: each server once, a second one too. */\n private announcedDevServers = new Set<string>();\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n /**\n * True once a `_thinkingDelta` run has been reported as `status: thinking`;\n * cleared by the next text delta or assistant message, so a run reports once.\n */\n private thinkingAnnounced = false;\n /**\n * tool_use blocks `message_start` already reported, awaiting the harness's\n * matching bridge `tool_call` — which must then not report the call again.\n */\n private announcedToolUses: Array<{ id?: string; name: string }> = [];\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 \"message_retract\":\n // The replay streams its reply afresh, so its deltas (or, failing\n // those, its message_start text) must count as a new message.\n this.hasStreamedText = false;\n return event.text ? [{ type: \"text_retract\", content: event.text }] : [];\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 this.announcedToolUses = [];\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 ...resultUsageFields(event),\n ...(event.retrying === true\n ? { retrying: true, ...(event.retryReason ? { retryReason: event.retryReason } : {}) }\n : {}),\n ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n\n case \"background_task_started\":\n return [{ type: \"background_task_started\", taskId: event.taskId }];\n\n case \"self_turn_started\":\n return [{ type: \"self_turn_started\", taskIds: [...event.taskIds] }];\n\n case \"tool_call\": {\n // The question tool parks the turn 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 // A harness that also sent the call as a `message_start` tool_use block\n // (Claude) was already reported there; the rest only ever send this.\n if (!toolName || this.consumeAnnouncedToolUse(toolName, event.toolCallId)) {\n return [{ type: \"status\", phase: \"working\" }];\n }\n return this.handleToolUse(\n {\n type: \"tool_use\",\n id: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n name: toolName,\n input: toolInputRecord(event.input),\n },\n typeof event.parentToolUseId === \"string\" ? event.parentToolUseId : undefined,\n );\n }\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n this.announcedToolUses = [];\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 — harnesses 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.announcedDevServers.clear();\n this.hasStreamedText = false;\n this.thinkingAnnounced = false;\n this.announcedToolUses = [];\n }\n\n private consumeAnnouncedToolUse(name: string, id: unknown): boolean {\n const callId = typeof id === \"string\" ? id : undefined;\n const index = this.announcedToolUses.findIndex(\n (entry) => entry.name === name && (!callId || !entry.id || entry.id === callId),\n );\n if (index === -1) return false;\n this.announcedToolUses.splice(index, 1);\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Harnesses (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 // A subagent's message is not the main reply: its text belongs to the\n // subagent's own result, and it must not reset the main stream's state.\n const parentToolUseId = message.parentToolUseId;\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 if (parentToolUseId) continue;\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 if (block.name !== QUESTION_TOOL) {\n this.announcedToolUses.push({ id: block.id, name: block.name });\n // Bounded in case a harness never echoes a block as a tool_call.\n if (this.announcedToolUses.length > MAX_ANNOUNCED_TOOL_USES) {\n this.announcedToolUses.shift();\n }\n }\n events.push(...this.handleToolUse(block, parentToolUseId));\n }\n }\n\n if (!parentToolUseId) this.hasStreamedText = false;\n if (!parentToolUseId) this.thinkingAnnounced = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock, parentToolUseId?: string): 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, parentToolUseId);\n }\n\n private handleAskUserQuestion(input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const candidate = input.approval as Partial<NativeApprovalDescription> | undefined;\n const approval =\n candidate &&\n [\"command\", \"file\", \"permissions\", \"mcp\"].includes(candidate.kind ?? \"\") &&\n Array.isArray(candidate.details) &&\n candidate.details.length > 0 &&\n candidate.details.length <= 64 &&\n candidate.details.every((detail) => typeof detail === \"string\" && detail.length <= 8192) &&\n candidate.details.reduce((total, detail) => total + detail.length, 0) <= 65536\n ? (candidate as NativeApprovalDescription)\n : undefined;\n if (Object.hasOwn(input, \"approval\") && !approval) return [];\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({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\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({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\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(\n name: string,\n input: Record<string, unknown>,\n parentToolUseId?: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const label = labelToolCall(name, input);\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n // Summarize without the label: it would eat the default branch's\n // 100-char argument budget and push the real args out.\n summary: summarizeToolCall(name, stripActivityLabel(input)),\n ...(label ? { label } : {}),\n ...(parentToolUseId ? { parentToolUseId } : {}),\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 // Bridge deltas carry no subagent tag: a harness must drop a subagent's\n // partials itself (claude-sdk does in handleStreamEvent), or they read as main text.\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n this.thinkingAnnounced = false;\n return [{ type: \"text\", content: delta }];\n }\n // The protocol has no thinking-content event, so reasoning surfaces as the\n // existing `thinking` phase, once per run. The text is never forwarded as\n // `text`; a harness keeps it out of `_textDelta`.\n const thinking: unknown = \"_thinkingDelta\" in event ? event._thinkingDelta : undefined;\n if (typeof thinking === \"string\" && thinking && !this.thinkingAnnounced) {\n this.thinkingAnnounced = true;\n return [{ type: \"status\", phase: \"thinking\" }];\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, result.parentToolUseId));\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\") events.push(...this.detectDevServerReady(output));\n return events;\n }\n\n private handleToolResult(\n toolName: string,\n outputData: unknown,\n output: string,\n parentToolUseId?: 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 ...(parentToolUseId ? { parentToolUseId } : {}),\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 servers from Bash output\n if (toolName === \"Bash\") events.push(...this.detectDevServerReady(output));\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 harness\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 ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk harness uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (harnesses 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 ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\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 /** One `ready` event per URL in `text` not announced before in this session. */\n private detectDevServerReady(text: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n for (const url of devServerReadyUrls(text)) {\n if (this.announcedDevServers.has(url)) continue;\n this.announcedDevServers.add(url);\n events.push({ type: \"dev_server\", url, status: \"ready\" });\n }\n return events;\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\nconst ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n/**\n * CSI (`ESC [ … m`, cursor moves) and OSC (`ESC ] … BEL`, hyperlinks) escape sequences, plus\n * CSI written as the text `\\u001b[` / `\\x1b[`: a non-string tool result reaches the detector\n * JSON-encoded, which spells ESC out.\n */\nconst ANSI_ESCAPE = new RegExp(\n `(?:${ESC}|\\\\\\\\u001b|\\\\\\\\x1b)\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\\\\\)`,\n \"g\",\n);\n\n/** A dev server's `Local:` line on a loopback host (Vite, Nuxt, Storybook, Next). */\nconst LOCAL_URL = /Local:\\s+(https?):\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0):(\\d+)\\/?/g;\nconst EXPLICIT_URL = /DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/g;\n\n/**\n * The URLs a dev server's ready output announces, without duplicates; empty\n * when there are none. One output can hold several servers\n * (`concurrently \"vite\" \"storybook dev\"`, a combined log). Explicit\n * `DEVSERVER_READY:<url>` lines come first (a bare trailing `/` after the\n * port dropped, so it matches the `Local:` form), then every `Local:` line, after\n * stripping ANSI colours, on any loopback host, announced as `localhost` (what\n * a browser opens; `0.0.0.0` is not one). `FRONTEND_READY` →\n * `http://localhost:3000` only when neither is present. A `Network:` line (LAN\n * address) never matches.\n */\nfunction devServerReadyUrls(text: string): string[] {\n const explicit = [...text.matchAll(EXPLICIT_URL)].map((m) =>\n m[1]!.replace(/^(https?:\\/\\/[^/]+)\\/$/, \"$1\"),\n );\n const local = [...text.replace(ANSI_ESCAPE, \"\").matchAll(LOCAL_URL)].map(\n (m) => `${m[1]}://localhost:${m[2]}`,\n );\n const urls = [...new Set([...explicit, ...local])];\n if (urls.length > 0) return urls;\n return text.includes(\"FRONTEND_READY\") ? [\"http://localhost:3000\"] : [];\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 // A harness that sent a bare value instead of named args has it under `input`.\n const arg = (key: string) => String(input[key] ?? input.input);\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? input.input ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${arg(\"file_path\")}`;\n case \"Edit\":\n return `Edit ${arg(\"file_path\")}`;\n case \"Read\":\n return `Read ${arg(\"file_path\")}`;\n case \"Glob\":\n return `Find ${arg(\"pattern\")}`;\n case \"Grep\":\n return `Search for ${arg(\"pattern\")}`;\n case \"ApplyPatch\": {\n // Paths only: stringifying the input would serialize every full diff.\n const changes = Array.isArray(input.changes) ? input.changes : [];\n const paths = changes\n .map((change) => (change as { path?: unknown } | null)?.path)\n .filter((path): path is string => typeof path === \"string\");\n return `Edit ${paths.join(\", \").slice(0, 200) || \"files\"}`;\n }\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/**\n * Produce the plain-language label shown to non-technical users while a tool\n * call runs: the agent's own `activity_label`, Bash's `description`, else a\n * derived phrase for Claude Code built-ins. `undefined` for any other tool —\n * the UI then falls back to a generic \"working\" line rather than raw input.\n *\n * @param tool - Tool name as the model called it.\n * @param input - Tool input record, still carrying `activity_label`.\n * @returns A trimmed label capped at `TOOL_ACTIVITY_LABEL_MAX_CHARS`, or `undefined`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function labelToolCall(tool: string, input: Record<string, unknown>): string | undefined {\n const authored =\n nonEmpty(input[TOOL_ACTIVITY_LABEL_PARAM]) ??\n (tool === \"Bash\" ? nonEmpty(input.description) : undefined);\n const label = authored ?? builtinToolLabel(tool, input);\n if (!label) return undefined;\n return label.length > TOOL_ACTIVITY_LABEL_MAX_CHARS\n ? `${label.slice(0, TOOL_ACTIVITY_LABEL_MAX_CHARS - 1).trimEnd()}…`\n : label;\n}\n\nfunction nonEmpty(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction builtinToolLabel(tool: string, input: Record<string, unknown>): string | undefined {\n switch (tool) {\n case \"Read\":\n return withTarget(\"Reading\", baseName(input.file_path));\n case \"Edit\":\n case \"MultiEdit\":\n case \"NotebookEdit\":\n return withTarget(\"Editing\", baseName(input.file_path ?? input.notebook_path));\n case \"Write\":\n return withTarget(\"Creating\", baseName(input.file_path));\n case \"Grep\":\n case \"Glob\":\n return \"Searching files\";\n case \"WebSearch\":\n return \"Searching the web\";\n case \"WebFetch\":\n return withTarget(\"Fetching\", hostOf(input.url), \"a web page\");\n case \"TodoWrite\":\n return \"Updating the task list\";\n case \"ApplyPatch\":\n return \"Editing files\";\n default:\n return undefined;\n }\n}\n\nfunction withTarget(verb: string, target: string | undefined, fallback = \"a file\"): string {\n return `${verb} ${target ?? fallback}`;\n}\n\nfunction baseName(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n return value.split(/[\\\\/]/).filter(Boolean).pop();\n}\n\nfunction hostOf(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return new URL(value).host || undefined;\n } catch {\n return undefined;\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 AgentHarness + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any harness.\n */\n\nimport type {\n AgentEvent,\n AgentPromptInput,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { toMergedRegistry } from \"./provider-registry-derive.js\";\nimport { createHarness } from \"./registry.js\";\nimport type { AgentConfig, AgentHarness } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentHarness}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any harness without managing the harness 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 harness: AgentHarness | 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 harnessId: string;\n\n constructor(harnessId: string = \"claude-sdk\") {\n this.harnessId = harnessId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous harness if any\n if (this.harness) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n model: config.model,\n systemPrompt: config.systemPrompt,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n ...(config.registry ? { registry: toMergedRegistry(config.registry, \"runtime\") } : {}),\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n };\n\n this.harness = await createHarness(this.harnessId, 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.harness.on(\"agent-event\", this.boundEventHandler);\n\n await this.harness.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.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.prompt(message);\n }\n\n async promptInput(input: AgentPromptInput): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.promptInput(input);\n }\n\n async reply(answer: string, question?: string, requestId?: string): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\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 (\n this.harness?.hasPendingQuestion() &&\n this.harness.answerQuestion(answer, question, requestId)\n )\n return;\n if (this.harness?.acceptsReplyAsPrompt) await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.harness) {\n await this.harness.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.harness) {\n if (this.boundEventHandler) {\n this.harness.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.harness.kill();\n this.harness = 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.harness?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified harness.\n *\n * @param harnessId - Registered harness id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected harness with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(harnessId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(harnessId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\nimport {\n buildCredentialHeaders,\n expandPreset,\n getProviderPreset,\n resolvePresetBaseUrl,\n resolveProbeUrl,\n} from \"./provider-catalog.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 - Catalog preset id (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 `base_url_env` 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 preset = getProviderPreset(provider);\n if (!preset) 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 const baseUrl = resolvePresetBaseUrl(preset, {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n env: options.env ?? process.env,\n });\n const entry = expandPreset(preset, baseUrl ? { baseUrl } : {});\n const url = resolveProbeUrl(entry);\n if (!url) return { ok: false, error: `Provider ${provider} exposes no models endpoint` };\n // Static non-secret headers (Anthropic's `anthropic-version`) plus the\n // credential carrier the preset's `auth_header` names.\n const headers = { ...entry.headers, ...buildCredentialHeaders(entry, 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,\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
+ {"version":3,"sources":["../bridge/src/harness-model-check.ts","../bridge/src/harness-detect.ts","../bridge/src/preflight.ts","../bridge/src/harness-model-discovery.ts","../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":["execFile","path","firstLine"],"mappings":"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","file":"chunk-E2VPBB7C.js","sourcesContent":["/**\n * Pre-flight model check: would the harness refuse the selected model before it starts a turn?\n *\n * `skaile run --dry-run` uses it so a setup check learns about a refusal that a real run would\n * print. The codex harness refuses a selection up front when it cannot address the AI provider\n * surface; every harness refuses a provider nothing serves ({@link checkModelProvider}).\n */\nimport { execFile } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { openSqlite } from \"@skaile/workspaces/core/logging\";\nimport { parse } from \"yaml\";\nimport { buildCodexConfigDocument } from \"./codex/config-toml.js\";\nimport { HARNESS_BINARIES, harnessSpawnPath, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { ompRegistryModelRefusal, registryModelEntries } from \"./harnesses/omp-models-yml.js\";\nimport { sessionSurfaceNotice } from \"./claude-sdk-surface.js\";\nimport { bindSingleProviderEntry } from \"./provider-materialize/env-harnesses.js\";\nimport { AI_PROVIDER_PRESETS } from \"./provider-catalog.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"./registry.js\";\n\n/** What {@link checkHarnessModel} reads. */\nexport interface HarnessModelCheckInput {\n registry?: AIProviderRegistry | MergedAIProviderRegistry;\n /** The model selector: `<providerId>/<modelId>`, a bare id or `@role`. */\n model?: string;\n roles?: Record<string, string>;\n}\n\n/**\n * Providers a harness reaches with its own login, without a registry entry: codex talks to\n * OpenAI, the Claude SDK to Anthropic, omp to every vendor the preset catalog lists. Every\n * other harness (gemini, qwen, goose, continue, echo, a plugin's) reaches a provider only\n * through a registry entry, so its set is empty. `opencode` is not checked: it names providers\n * by its own ids (`github-copilot`, `amazon-bedrock`), which no list here can match.\n */\nfunction nativeProviders(harnessId: string): ReadonlySet<string> {\n if (harnessId === \"codex\") return new Set([\"openai\"]);\n if (harnessId === \"claude-sdk\") return new Set([\"anthropic\"]);\n if (harnessId === \"omp\") return new Set(Object.keys(AI_PROVIDER_PRESETS));\n return new Set();\n}\n\n/**\n * What omp can serve on the user's own agent directory (`PI_CODING_AGENT_DIR`, else\n * `~/.omp/agent`): the provider ids their `models.yml` defines, and whether they have a login\n * (a usable credential in `agent.db`), which may carry built-in providers this list cannot name\n * (p1111). The file alone is no login: omp creates an empty `agent.db` on its first start (p1470).\n */\nfunction ompOwnHome(): { providers: ReadonlySet<string>; hasLogin: boolean } {\n const dir = process.env.PI_CODING_AGENT_DIR || path.join(os.homedir(), \".omp\", \"agent\");\n const providers = new Set<string>();\n try {\n const doc = parse(readFileSync(path.join(dir, \"models.yml\"), \"utf-8\")) as {\n providers?: unknown;\n } | null;\n const block = doc?.providers;\n if (block && typeof block === \"object\" && !Array.isArray(block)) {\n for (const id of Object.keys(block)) providers.add(id);\n }\n } catch {\n // no models.yml, or one omp itself will reject\n }\n return { providers, hasLogin: ompHasCredential(path.join(dir, \"agent.db\")) };\n}\n\n/**\n * True when omp's auth store holds a credential that is not disabled. A missing, unreadable or\n * schema-less file holds none. Reads the `auth_credentials` table and its `disabled_cause`\n * column as omp 18.12.6 writes them (checked against that version); a different layout reads\n * as \"no login\", which is the safe side. Read-only: the check never creates or changes the file.\n */\nfunction ompHasCredential(authDb: string): boolean {\n if (!existsSync(authDb)) return false;\n try {\n const db = openSqlite(authDb, { readonly: true });\n try {\n return (\n db\n .prepare(\"SELECT 1 AS found FROM auth_credentials WHERE disabled_cause IS NULL LIMIT 1\")\n .get<{ found: number }>() != null\n );\n } finally {\n db.close();\n }\n } catch {\n return false;\n }\n}\n\n/**\n * `<provider>/<model>` whose provider nothing can serve: not a registry entry and not a\n * provider the harness has its own login for. Without this the id goes to the harness's default\n * provider verbatim and fails there with a message that blames the login.\n *\n * One rule for every harness but opencode: a `<head>/<model>` whose head is no registered provider\n * and none the harness has its own login for is refused, whatever else is registered; a bare id\n * is allowed. omp alone leaves the verdict on an unknown head to its own model check\n * ({@link ompRegistryModelRefusal} and `omp models`) while an enabled registry entry exists: it\n * may know the id as a vendor-scoped model (`meta-llama/Llama-3.3-70B`) and says so itself.\n */\nexport function checkModelProvider(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n if (harnessId === \"opencode\") return undefined;\n const native = nativeProviders(harnessId);\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n const slash = selector.indexOf(\"/\");\n if (slash <= 0 || selector.startsWith(\"@\")) return undefined;\n const head = selector.slice(0, slash);\n if (native.has(head)) return undefined;\n const entries = input.registry ? registryEntries(input.registry) : [];\n if (entries.some(([id]) => id === head)) return undefined;\n const servesVendorIds =\n harnessId === \"omp\" &&\n entries.some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n if (servesVendorIds) return undefined;\n if (harnessId === \"omp\") {\n // With no registry entry omp runs on the user's own agent directory: their `models.yml`\n // providers and the logins omp ships are served there.\n const own = ompOwnHome();\n if (own.providers.has(head) || own.hasLogin) return undefined;\n }\n return `provider '${head}' is not configured: run skaile providers list`;\n}\n\n/**\n * The surface problem of the entry the selected model routes to, for the harnesses that route\n * the model through one registry entry and cannot speak every surface: the Claude Agent SDK\n * (`sessionSurfaceNotice`), and Gemini CLI and Qwen Code (the check they run at start,\n * `bindSingleProviderEntry`). `undefined` for the others and for an entry they speak. `skaile run`\n * and `run --dry-run` print it; `config set model` and `serve` do not judge it.\n */\nexport function checkModelSurface(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const registry = input.registry;\n if (!registry) return undefined;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (harnessId === \"claude-sdk\")\n return selector ? sessionSurfaceNotice(registry, selector) : undefined;\n if (harnessId !== \"gemini\" && harnessId !== \"qwen\") return undefined;\n const merged: MergedAIProviderRegistry = Array.isArray(\n (registry as MergedAIProviderRegistry).order,\n )\n ? (registry as MergedAIProviderRegistry)\n : {\n version: 1,\n providers: registry as AIProviderRegistry,\n order: Object.keys(registry),\n origin: {},\n locked: [],\n };\n try {\n bindSingleProviderEntry(harnessId, BUILTIN_HARNESS_CATALOG[harnessId]?.name ?? harnessId, {\n registry: merged,\n lookupEnv: process.env,\n ...(selector ? { modelRef: selector } : {}),\n });\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n return undefined;\n}\n\n/**\n * The refusal message the harness prints for this model, or `undefined` when it takes it.\n * The text matches the one the harness throws at start. The provider surface the Claude SDK,\n * Gemini CLI and Qwen Code cannot speak is {@link checkModelSurface}, which `run` adds.\n */\nexport function checkHarnessModel(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const unknownProvider = checkModelProvider(harnessId, input);\n if (unknownProvider) return unknownProvider;\n if (harnessId === \"omp\") {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n return ompRegistryModelRefusal(input.registry, selector, nativeProviders(\"omp\"));\n }\n if (harnessId !== \"codex\") return undefined;\n const build = buildCodexConfigDocument({\n registry: input.registry,\n ...(input.model ? { modelRef: input.model, model: input.model } : {}),\n ...(input.roles ? { roles: input.roles } : {}),\n });\n if (!build.unaddressable) return undefined;\n const { id, reason } = build.unaddressable;\n return `AI provider '${id}' cannot be used with the codex harness: ${reason}. Pick a model of another provider.`;\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready, or `undefined`\n * when omp can take the model (p1334). Stricter than {@link checkHarnessModel}, which `run --dry-run`\n * shares: a server answers its first prompt long after start, so a model omp reports as \"not\n * found\" must fail at start.\n *\n * It judges exactly what the harness sends. `materializeOmpProviders` resolves the selector with\n * `parseModelRef` and passes `--model <entry>/<model>` to omp: an `<entry>/<model>` selector goes\n * to that entry, and so does a bare id an entry maps; omp then refuses a model that entry does\n * not declare. An id no entry names or maps (`anthropic/claude-sonnet-4-5`,\n * `meta-llama/Llama-3.3-70B`, `nosuch/foo`) goes on exactly as typed: the registry\n * cannot judge it, so this check answers `undefined` for it, and {@link isUnlistedModel} tells\n * the caller to ask omp itself ({@link checkOmpListedModel}). The refusal names the selector the\n * user typed, never the rewritten one alone.\n */\nexport function checkOmpServeModel(input: HarnessModelCheckInput): string | undefined {\n const registry = input.registry;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!registry || !selector) return undefined;\n const ref = parseModelRef(selector, registry, input.roles);\n if (!ref?.providerModelId || ref.fallback) return undefined;\n const sent = `${ref.providerId}/${ref.providerModelId}`;\n const refusal = ompRegistryModelRefusal(registry, sent, nativeProviders(\"omp\"));\n if (!refusal) return undefined;\n if (sent === selector) return refusal;\n const detail = refusal.slice(refusal.indexOf(\"': \") + 3);\n return `omp cannot serve model '${selector}': it is sent to omp as '${sent}'; ${detail}`;\n}\n\n/**\n * True when `model` is an id the registry does not list: no entry is named by its head, none maps\n * it, and it is not an `@role`. Such an id goes to the harness as typed, so only the\n * harness itself can say whether it takes it. False with no registry entry to judge against.\n */\nexport function isUnlistedModel(input: HarnessModelCheckInput): boolean {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!input.registry || !selector) return false;\n return parseModelRef(selector, input.registry, input.roles)?.fallback === true;\n}\n\n/** Thinking levels omp takes as a `:<level>` suffix of a model selector. */\nconst OMP_THINKING_SUFFIX = /:(off|minimal|low|medium|high|xhigh)$/i;\n\n/** Run `omp <args> --json` and return the `models` of its answer, or `undefined` for no answer. */\nfunction ompModels(args: string[], timeoutMs: number): Promise<unknown[] | undefined> {\n const bin = resolveHarnessBinary(HARNESS_BINARIES.omp) ?? (process.env.OMP_BRIDGE_BIN || \"omp\");\n const pre = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n return new Promise((resolve) => {\n const child = execFile(\n bin,\n [...pre, ...args, \"--json\"],\n {\n timeout: timeoutMs,\n maxBuffer: 64 * 1024 * 1024,\n env: { ...process.env, PATH: harnessSpawnPath() },\n },\n (error, out) => {\n if (error) return resolve(undefined);\n try {\n const parsed: unknown = JSON.parse(out);\n const models = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === \"object\" && \"models\" in parsed\n ? parsed.models\n : undefined;\n resolve(Array.isArray(models) ? models : undefined);\n } catch {\n resolve(undefined);\n }\n },\n );\n child.stdin?.end();\n });\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready when no registry\n * entry is involved and omp runs on the user's own agent directory, or `undefined` when omp may\n * take the model (p1334). The registry check ({@link checkOmpServeModel}) cannot judge that\n * case: omp's catalog (built-in vendors, `models.yml`, logins) lives in omp.\n *\n * Asks omp itself. `omp models find` is a substring search, but `omp --model` also takes forms it\n * does not match (`anthropic/sonnet-4-5`, `openrouter/~anthropic/claude-sonnet-latest:high`), so\n * a selector is refused only when omp cannot know it: a `:<thinking level>` suffix is dropped, a\n * non-empty `find` answer passes, and an empty one passes too when the selector's `<provider>/`\n * head is a provider omp lists models for. A bare id that matches nothing, or a provider omp does\n * not list, is refused. Anything else (omp missing, a timeout, output that is not the expected\n * JSON) is no verdict, and the harness reports its own failure at start. Honours the\n * `OMP_BRIDGE_BIN` / `OMP_BRIDGE_PREARGS` test seam the harness uses.\n *\n * @param selector - The model as typed (`<provider>/<model>` or a bare id); `@role` is not judged.\n * @param timeoutMs - Total time to wait for omp across both calls (default 20 s).\n */\nexport async function checkOmpListedModel(\n selector: string,\n timeoutMs = 20_000,\n): Promise<string | undefined> {\n const wanted = selector.trim();\n if (!wanted || wanted.startsWith(\"@\")) return undefined;\n const deadline = Date.now() + timeoutMs;\n const query = wanted.replace(OMP_THINKING_SUFFIX, \"\");\n const found = await ompModels([\"models\", \"find\", query], timeoutMs);\n if (!found || found.length > 0) return undefined;\n const refusal = `omp cannot serve model '${wanted}': omp lists no model that matches it. Run \\`omp models\\` to see what it can serve.`;\n const slash = query.indexOf(\"/\");\n if (slash <= 0) return refusal;\n // The budget covers both calls: with no time left there is no verdict.\n const left = deadline - Date.now();\n if (left <= 0) return undefined;\n const all = await ompModels([\"models\"], left);\n if (!all) return undefined;\n const provider = query.slice(0, slash).toLowerCase();\n const known = all.some(\n (m) =>\n typeof m === \"object\" &&\n m !== null &&\n \"provider\" in m &&\n typeof m.provider === \"string\" &&\n m.provider.toLowerCase() === provider,\n );\n return known ? undefined : refusal;\n}\n","/**\n * Harness detection: can each harness start on this machine, and with what. Per harness the\n * report holds the program path, its version (against the declared minimum), whether the npm\n * SDK loads (SDK harnesses) and the harness's own account login (Claude Code, Codex).\n *\n * Every harness is probed on its own, in parallel, behind a try/catch: one broken probe turns\n * into an `unknown` row and leaves the others intact. {@link detectHarnesses} keeps the answer\n * for {@link DETECT_CACHE_TTL_MS}.\n */\nimport { execFile } from \"node:child_process\";\nimport path from \"node:path\";\nimport { installCommandFor, loadHarnessSdk, sdkLookupPlaces } from \"@skaile/workspaces/core\";\nimport semver from \"semver\";\nimport {\n HARNESS_BINARIES,\n type HarnessBinary,\n harnessSearchDirs,\n harnessSpawnPath,\n isExecutableFile,\n overrideVar,\n resolveHarnessBinary,\n SDK_CLI_BINARIES,\n} from \"./harness-binaries.js\";\nimport { listHarnesses } from \"./registry.js\";\n\n/** `ok`: can start; `missing`: program or SDK not found; `outdated`: below the minimum version; `unknown`: no rule for this harness. */\nexport type HarnessDetectStatus = \"ok\" | \"missing\" | \"outdated\" | \"unknown\";\n\n/** The harness's own account login. */\nexport interface HarnessLoginState {\n status: \"ok\" | \"missing\" | \"unknown\";\n detail?: string;\n}\n\n/** What {@link detectHarness} found for one harness. */\nexport interface HarnessDetection {\n id: string;\n /** ok: can start; missing: program or SDK not found; outdated: below minVersion; unknown: no rule (plugin harness). */\n status: HarnessDetectStatus;\n /** Absolute program path when one was found (CLI harnesses; the `claude` / `codex` CLI for the SDK harnesses). */\n path?: string;\n /** Version string parsed from `<bin> --version` (first `\\d+\\.\\d+\\.\\d+[-+\\w.]*` token). */\n version?: string;\n minVersion?: string;\n /** SDK harnesses: whether the npm SDK loads from `projectDir` (then next to skaile). */\n sdk?: { pkg: string; loaded: boolean };\n /** The harness's own account login, where it has one (claude-sdk, codex). */\n login?: HarnessLoginState;\n /** One actionable line when status is not ok. */\n problem?: string;\n /** Directories searched when nothing was found. */\n searched?: string[];\n}\n\n/** Options of {@link detectHarness} and {@link detectHarnesses}. */\nexport interface DetectHarnessOptions {\n /** Environment to resolve programs and run probes in (default `process.env`). */\n env?: NodeJS.ProcessEnv;\n /** Project the SDK probe loads the npm SDK from first (default cwd). */\n projectDir?: string;\n /** Timeout of each probe process in ms (default 5000). */\n timeoutMs?: number;\n /** Skip the {@link detectHarnesses} cache. */\n fresh?: boolean;\n}\n\n/** How long {@link detectHarnesses} keeps its answer. */\nexport const DETECT_CACHE_TTL_MS = 15_000;\nconst DEFAULT_PROBE_TIMEOUT_MS = 5000;\n\n/** Optional SDK a harness needs at run time, and how to probe that it loads from a project. */\nexport const HARNESS_SDKS: Record<\n string,\n { pkg: string; load: (projectDir: string) => Promise<unknown> }\n> = {\n \"claude-sdk\": {\n pkg: \"@anthropic-ai/claude-agent-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n ),\n },\n codex: {\n pkg: \"@openai/codex-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\"@openai/codex-sdk\", projectDir, () => import(\"@openai/codex-sdk\")),\n },\n};\n\n/**\n * The one line for a harness whose SDK does not load: where it was looked for and the install\n * command. `skaile serve` and `skaile run` preflight print it, and detection reports it.\n *\n * @param harness - Harness id.\n * @param pkg - The npm package the harness needs.\n * @param projectDir - Project the SDK was looked up from.\n */\nexport function sdkMissingProblem(harness: string, pkg: string, projectDir: string): string {\n return `The ${harness} harness needs ${pkg}, which is not installed. Looked in ${sdkLookupPlaces(projectDir)}. Run in the project: ${installCommandFor(pkg, projectDir)} (or pick another harness with --harness).`;\n}\n\ninterface ProbeResult {\n stdout: string;\n stderr: string;\n /** Exit code; `undefined` after a spawn error or a timeout. */\n code?: number;\n /** Spawn error or timeout. */\n failed: boolean;\n}\n\n/**\n * Run `bin args` once with closed stdin, a timeout and the extended PATH. Never rejects. A `bin`\n * without the exec bit (a `cli.js` from `CLAUDE_CODE_PATH`) runs as a script of this runtime.\n */\nfunction runProbe(\n bin: string,\n args: string[],\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<ProbeResult> {\n return new Promise((resolve) => {\n try {\n const asScript = !isExecutableFile(bin);\n const child = execFile(\n asScript ? process.execPath : bin,\n asScript ? [bin, ...args] : args,\n {\n timeout: timeoutMs,\n // In the `bun build --compile` skaile binary, process.execPath is skaile itself;\n // BUN_BE_BUN makes it act as bun so it runs the script. Node ignores the variable.\n env: { ...env, PATH: harnessSpawnPath(env), ...(asScript ? { BUN_BE_BUN: \"1\" } : {}) },\n windowsHide: true,\n maxBuffer: 1024 * 1024,\n },\n (error, stdout, stderr) => {\n const code = error && typeof error.code === \"number\" ? error.code : error ? undefined : 0;\n resolve({\n stdout: String(stdout ?? \"\"),\n stderr: String(stderr ?? \"\"),\n ...(code !== undefined ? { code } : {}),\n failed: error != null && typeof error.code !== \"number\",\n });\n },\n );\n child.stdin?.on(\"error\", () => {});\n child.stdin?.end();\n } catch (err) {\n resolve({ stdout: \"\", stderr: (err as Error).message, failed: true });\n }\n });\n}\n\nconst VERSION_RE = /\\d+\\.\\d+\\.\\d+[-+\\w.]*/;\n\n/** The version token of a `--version` answer, or `undefined` when the probe failed. */\nasync function probeVersion(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<string | undefined> {\n const res = await runProbe(bin, [\"--version\"], env, timeoutMs);\n if (res.failed || res.code !== 0) return undefined;\n return VERSION_RE.exec(`${res.stdout}\\n${res.stderr}`)?.[0];\n}\n\nfunction firstLine(text: string): string | undefined {\n return text\n .split(\"\\n\")\n .map((l) => l.trim())\n .find(Boolean);\n}\n\n/** `claude auth status`: JSON with `loggedIn` and `authMethod` on stdout. */\nasync function probeClaudeLogin(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessLoginState> {\n const res = await runProbe(bin, [\"auth\", \"status\"], env, timeoutMs);\n const start = res.stdout.indexOf(\"{\");\n const end = res.stdout.lastIndexOf(\"}\");\n let parsed: { loggedIn?: unknown; authMethod?: unknown } | undefined;\n if (start >= 0 && end > start) {\n try {\n parsed = JSON.parse(res.stdout.slice(start, end + 1)) as typeof parsed;\n } catch {\n parsed = undefined;\n }\n }\n if (parsed?.loggedIn === true) {\n return {\n status: \"ok\",\n ...(typeof parsed.authMethod === \"string\" ? { detail: parsed.authMethod } : {}),\n };\n }\n if (parsed?.loggedIn === false) {\n return {\n status: \"missing\",\n detail:\n \"Run `claude auth login`, or configure an Anthropic provider in Settings → AI Providers.\",\n };\n }\n return { status: \"unknown\", detail: firstLine(res.stderr) ?? \"no answer\" };\n}\n\n/** `codex login status`: `Logged in using ChatGPT` (exit 0) or `Not logged in`. */\nasync function probeCodexLogin(\n bin: string,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessLoginState> {\n const res = await runProbe(bin, [\"login\", \"status\"], env, timeoutMs);\n const text = `${res.stdout}\\n${res.stderr}`;\n if (/not logged in/i.test(text)) {\n return { status: \"missing\", detail: \"Run `codex login`, or configure an OpenAI provider.\" };\n }\n if (!res.failed && res.code === 0 && /logged in/i.test(text)) {\n return { status: \"ok\", detail: firstLine(res.stdout) ?? firstLine(res.stderr) ?? \"logged in\" };\n }\n return {\n status: \"unknown\",\n detail: firstLine(res.stderr) ?? firstLine(res.stdout) ?? \"no answer\",\n };\n}\n\nconst LOGIN_PROBES: Record<\n string,\n (bin: string, env: NodeJS.ProcessEnv, timeoutMs: number) => Promise<HarnessLoginState>\n> = {\n \"claude-sdk\": probeClaudeLogin,\n codex: probeCodexLogin,\n};\n\nfunction outdatedProblem(row: HarnessBinary, version: string, minVersion: string): string {\n return `${row.bin} ${version} is older than ${minVersion}. ${row.hint}`;\n}\n\nasync function detectBinaryHarness(\n id: string,\n row: HarnessBinary,\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): Promise<HarnessDetection> {\n const found = resolveHarnessBinary(row, env);\n if (!found) {\n return {\n id,\n status: \"missing\",\n ...(row.minVersion ? { minVersion: row.minVersion } : {}),\n problem: row.hint,\n searched: harnessSearchDirs(env),\n };\n }\n const version = await probeVersion(found, env, timeoutMs);\n const detection: HarnessDetection = {\n id,\n status: \"ok\",\n path: found,\n ...(version ? { version } : {}),\n ...(row.minVersion ? { minVersion: row.minVersion } : {}),\n };\n if (version && row.minVersion) {\n const have = semver.coerce(version);\n if (have && semver.lt(have, row.minVersion)) {\n detection.status = \"outdated\";\n detection.problem = outdatedProblem(row, version, row.minVersion);\n }\n }\n return detection;\n}\n\nasync function detectSdkHarness(\n id: string,\n sdkProbe: { pkg: string; load: (projectDir: string) => Promise<unknown> },\n env: NodeJS.ProcessEnv,\n projectDir: string,\n timeoutMs: number,\n): Promise<HarnessDetection> {\n const cli = SDK_CLI_BINARIES[id as keyof typeof SDK_CLI_BINARIES];\n const cliPath = cli ? resolveHarnessBinary(cli, env) : undefined;\n const loaded = await sdkProbe.load(projectDir).then(\n () => true,\n () => false,\n );\n const detection: HarnessDetection = {\n id,\n status: loaded ? \"ok\" : \"missing\",\n sdk: { pkg: sdkProbe.pkg, loaded },\n };\n if (!loaded) detection.problem = sdkMissingProblem(id, sdkProbe.pkg, projectDir);\n if (!cliPath || !cli) {\n detection.login = { status: \"unknown\", detail: cli?.hint ?? \"no CLI to ask\" };\n return detection;\n }\n detection.path = cliPath;\n const loginProbe = LOGIN_PROBES[id];\n const [version, login] = await Promise.all([\n probeVersion(cliPath, env, timeoutMs),\n loginProbe\n ? loginProbe(cliPath, env, timeoutMs)\n : Promise.resolve<HarnessLoginState>({ status: \"unknown\" }),\n ]);\n if (version) detection.version = version;\n detection.login = login;\n return detection;\n}\n\n/**\n * Detect one harness: install, version, SDK and login, as far as the harness has them. Never\n * rejects; a probe that throws gives `{ status: \"unknown\", problem }`.\n *\n * @param id - Harness id.\n * @param options - See {@link DetectHarnessOptions}; `fresh` has no effect here (no cache).\n */\nexport async function detectHarness(\n id: string,\n options: DetectHarnessOptions = {},\n): Promise<HarnessDetection> {\n try {\n const env = options.env ?? process.env;\n const timeoutMs = options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;\n const projectDir = options.projectDir ?? process.cwd();\n const row = HARNESS_BINARIES[id];\n if (row) return await detectBinaryHarness(id, row, env, timeoutMs);\n const sdk = HARNESS_SDKS[id];\n if (sdk) return await detectSdkHarness(id, sdk, env, projectDir, timeoutMs);\n if (id === \"echo\") return { id, status: \"ok\" };\n return { id, status: \"unknown\" };\n } catch (err) {\n return { id, status: \"unknown\", problem: err instanceof Error ? err.message : String(err) };\n }\n}\n\nconst detectCache = new Map<string, { at: number; value: Promise<HarnessDetection[]> }>();\n\n/**\n * Everything that changes what a probe sees: project, PATH, HOME, timeout, the override vars and\n * the vars the toolchain dir list reads.\n */\nfunction detectCacheKey(options: DetectHarnessOptions, env: NodeJS.ProcessEnv): string {\n const overrides = [...Object.values(HARNESS_BINARIES), ...Object.values(SDK_CLI_BINARIES)].map(\n (row) => `${overrideVar(row)}=${env[overrideVar(row)] ?? \"\"}`,\n );\n return JSON.stringify([\n path.resolve(options.projectDir ?? process.cwd()),\n env.PATH ?? \"\",\n env.HOME ?? \"\",\n env.NVM_DIR ?? \"\",\n env.MISE_DATA_DIR ?? \"\",\n env.NPM_CONFIG_PREFIX ?? \"\",\n env.npm_config_prefix ?? \"\",\n env.FNM_DIR ?? \"\",\n env.APPDATA ?? \"\",\n env.LOCALAPPDATA ?? \"\",\n options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS,\n ...overrides,\n ]);\n}\n\n/**\n * Detect every registered harness, in {@link listHarnesses} order, one guarded probe each in\n * parallel. The answer is cached for 15 s per project directory, `PATH`, `HOME`, timeout and\n * override variable; `fresh: true` probes again.\n *\n * @param options - See {@link DetectHarnessOptions}.\n */\nexport async function detectHarnesses(\n options: DetectHarnessOptions = {},\n): Promise<HarnessDetection[]> {\n const env = options.env ?? process.env;\n // A key that cannot be built (an env whose reads throw) leaves the answer uncached: the\n // probes report such a fault themselves, and detectHarnesses never rejects.\n let key: string | undefined;\n try {\n key = detectCacheKey(options, env);\n } catch {\n key = undefined;\n }\n const hit = key === undefined ? undefined : detectCache.get(key);\n if (!options.fresh && hit && Date.now() - hit.at < DETECT_CACHE_TTL_MS) return hit.value;\n const value = Promise.all(listHarnesses().map((info) => detectHarness(info.id, options)));\n if (key !== undefined) detectCache.set(key, { at: Date.now(), value });\n return value;\n}\n","/**\n * The one start check of every command that starts or configures a harness: `run` (also with\n * `--dry-run`), `repl`, `serve`, `validate` and `config set harness|model`. It answers, without\n * starting a harness or a model: would this harness start with this model and this agent?\n *\n * Each problem is one line plus a {@link HarnessErrorClass}, the same four classes a failed turn\n * has (`driver-contract.ts`), so a refusal before the start and a failure after it read alike:\n *\n * - `crash`: the harness is not registered, its program or SDK is missing, an agent ref does not\n * resolve;\n * - `model-refused`: the harness does not take the model (an unknown provider prefix, ADR 0014; a\n * provider surface it cannot speak; a model omp does not list; no model for omp to start on);\n * - `auth`: codex has nothing to sign in with.\n *\n * A caller that must keep an older, narrower verdict (`validate` judges the harness name only,\n * `config set model` the refusal only, `serve` is stricter for omp and does not look for the\n * harness program) names the checks it wants in {@link PreflightOptions.checks}.\n */\n\nimport path from \"node:path\";\nimport { SUPPORTED_HARNESSES } from \"@skaile/workspaces/core\";\nimport {\n isEntryEnabled,\n type MergedAIProviderRegistry,\n pickRegistryEntries,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { HarnessErrorClass } from \"./driver-contract.js\";\nimport { checkCodexCredential } from \"./harnesses/codex.js\";\nimport { HARNESS_BINARIES, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { HARNESS_SDKS, sdkMissingProblem } from \"./harness-detect.js\";\nimport {\n checkHarnessModel,\n checkModelSurface,\n checkOmpListedModel,\n checkOmpServeModel,\n isUnlistedModel,\n} from \"./harness-model-check.js\";\nimport { loadMergedProviderRegistry } from \"./provider-registry-load.js\";\nimport { listHarnesses } from \"./registry.js\";\n\n/** One thing that would stop the harness, in the class a host acts on and the line to print. */\nexport interface PreflightProblem {\n class: HarnessErrorClass;\n line: string;\n}\n\n/** The project the harness would run in. */\nexport interface PreflightProject {\n projectDir: string;\n /** The merged provider registry; default: the project's own files and the catalog. */\n registry?: MergedAIProviderRegistry;\n /** `@role` selectors resolve through this table. */\n roles?: Record<string, string>;\n /** Ids a session is narrowed to (`serve --providers`); the registry is narrowed the same way. */\n providers?: readonly string[];\n}\n\n/** The agent definition and instances the project names, as the refs were typed. */\nexport interface PreflightAgentRef {\n /** `agent.definition`. */\n definition?: string;\n /** `agents.<id>.ref`, by instance id. */\n instances?: Readonly<Record<string, string>>;\n}\n\n/**\n * How an agent ref is resolved. The CLI owns the rule (`validate` and `serve` print its lines),\n * so it passes it in; the bridge does not read the asset tree.\n */\nexport interface AgentRefLookups {\n /** Why `agent.definition` does not resolve, or `null`. */\n definition: (projectDir: string, definition: string) => string | null;\n /** Why the `ref` of instance `id` does not resolve, or `null`. */\n instance: (projectDir: string, id: string, ref: string) => string | null;\n}\n\n/**\n * - `harness`: the harness is registered;\n * - `start`: its program or SDK is found;\n * - `refusal`: it takes the model's provider and id;\n * - `readiness`: the rest of what the model needs (provider surface, credential, omp's own list);\n * - `agent`: the agent refs resolve.\n */\nexport type PreflightCheck = \"harness\" | \"start\" | \"refusal\" | \"readiness\" | \"agent\";\n\nconst ALL_CHECKS: readonly PreflightCheck[] = [\"harness\", \"start\", \"refusal\", \"readiness\", \"agent\"];\n\n/** Replaceable lookups and switches. */\nexport interface PreflightOptions {\n /** Which checks to make; default: all. Problems come in the order of {@link PreflightCheck}. */\n checks?: readonly PreflightCheck[];\n /**\n * Judge a server, not a run: only an explicit model is checked, omp must be known to take it\n * now (a server answers its first prompt after it is ready), the provider surface and the\n * codex credential are left to the first prompt, and the harness program is not looked for.\n */\n serve?: boolean;\n /** Whether the harness's program is found. */\n hasBinary?: (harnessId: string) => boolean;\n /** The SDK probe; the line it returns, or `null`. */\n sdkProblem?: (projectDir: string, harness: string) => Promise<string | null>;\n /** Asks omp itself whether it lists a model (`omp models find`). */\n ompListed?: (model: string) => Promise<string | undefined>;\n /** The line codex gives when nothing is left to sign in with, or `undefined`. */\n codexCredential?: (input: {\n projectDir: string;\n harness: string;\n model?: string;\n registry: MergedAIProviderRegistry;\n roles?: Record<string, string>;\n }) => string | undefined;\n /**\n * Whether omp has a model to start on when none is selected and no registry entry serves one\n * (`true`), or none (`false`), or cannot say (`undefined`). Asked only when given: it costs a\n * program start.\n */\n ompHasModel?: () => Promise<boolean | undefined>;\n /** Required when an agent ref is given. */\n agentRefs?: AgentRefLookups;\n}\n\n/**\n * The one-line problem when the harness cannot load its SDK, or `null`. The probe is the same\n * lookup the harness runs in `start()` (the project's `node_modules`, then next to skaile), so a\n * compiled binary that bundles the SDK passes. A harness with no SDK passes.\n */\nexport async function harnessSdkProblem(\n projectDir: string,\n harness: string,\n probe: typeof HARNESS_SDKS = HARNESS_SDKS,\n): Promise<string | null> {\n const sdk = probe[harness];\n if (!sdk) return null;\n try {\n await sdk.load(projectDir);\n return null;\n } catch {\n return sdkMissingProblem(harness, sdk.pkg, projectDir);\n }\n}\n\n/** The commands that write harness files, so they take the harness targets only. */\nconst DEPLOY_COMMANDS = \"harness set, init --harness and add --harness\";\n\n/**\n * The refusal for a harness name nothing registers, or `undefined` when it is known. The line\n * names the other command group's names too, see `unknownHarnessTargetMessage` in the CLI.\n */\nfunction unknownHarnessLine(harness: string): string | undefined {\n const known = listHarnesses().map((d) => d.id);\n if (known.includes(harness)) return undefined;\n return (\n `Unknown agent harness: \"${harness}\". Available: ${known.join(\", \")}. ` +\n `${DEPLOY_COMMANDS} take: ${SUPPORTED_HARNESSES.join(\", \")}.`\n );\n}\n\n/** The line for a program the harness spawns that is not found. */\nfunction missingBinaryLine(harnessId: string): string {\n const hint = HARNESS_BINARIES[harnessId]?.hint ?? `${harnessId} is not installed.`;\n return `${hint} Or pick another harness with --harness.`;\n}\n\n/** Harnesses that load an SDK. */\nconst SDK_HARNESSES: Readonly<Record<string, true>> = { \"claude-sdk\": true, codex: true };\n\n/** Harnesses that spawn a program. */\nconst PROGRAM_HARNESSES: Readonly<Record<string, true>> = {\n omp: true,\n gemini: true,\n qwen: true,\n opencode: true,\n goose: true,\n continue: true,\n};\n\n/** The selector as the harness gets it: an `@role` resolved through the table. */\nfunction ownSelector(model: string | undefined, roles?: Record<string, string>): string {\n const typed = model?.trim() ?? \"\";\n return typed.startsWith(\"@\") ? (roles?.[typed.slice(1)]?.trim() ?? \"\") : typed;\n}\n\n/**\n * Everything that would stop the harness from starting this run, one problem each, empty when it\n * can start. A harness this has no check for (`echo`, a plugin's) has none beyond being\n * registered. Starts no harness and no model; the SDK probe loads the SDK the way the harness\n * does.\n *\n * @param project - The project, its registry, roles and provider narrowing.\n * @param harness - The resolved harness id.\n * @param model - The model as typed (`--model`, `skaile.yaml`, settings); none to leave it out.\n * @param agentRef - The agent refs to resolve; none to leave them out.\n * @param options - Which checks, and replaceable lookups for tests.\n */\nexport async function preflight(\n project: PreflightProject,\n harness: string,\n model: string | undefined,\n agentRef?: PreflightAgentRef,\n options: PreflightOptions = {},\n): Promise<PreflightProblem[]> {\n const checks = new Set(options.checks ?? ALL_CHECKS);\n const serve = options.serve === true;\n const { projectDir } = project;\n const problems: PreflightProblem[] = [];\n const add = (cls: HarnessErrorClass, line: string | null | undefined): boolean => {\n if (!line) return false;\n problems.push({ class: cls, line });\n return true;\n };\n\n if (checks.has(\"harness\")) add(\"crash\", unknownHarnessLine(harness));\n\n if (checks.has(\"agent\") && agentRef) {\n const lookups = options.agentRefs;\n if (!lookups) throw new Error(\"preflight: an agent ref needs options.agentRefs to resolve it\");\n if (agentRef.definition) {\n add(\"crash\", lookups.definition(projectDir, agentRef.definition));\n }\n for (const [id, ref] of Object.entries(agentRef.instances ?? {})) {\n add(\"crash\", lookups.instance(projectDir, id, ref));\n }\n }\n\n // A harness nothing registers has no program, SDK or readiness to check; the model prefix is\n // still judged, as for every harness (ADR 0014).\n const registered = listHarnesses().some((d) => d.id === harness);\n\n if (registered && checks.has(\"start\")) {\n if (SDK_HARNESSES[harness]) {\n add(\"crash\", await (options.sdkProblem ?? harnessSdkProblem)(projectDir, harness));\n } else if (PROGRAM_HARNESSES[harness] && !serve) {\n const hasBinary =\n options.hasBinary ?? ((id) => resolveHarnessBinary(HARNESS_BINARIES[id]!) !== undefined);\n // A missing program is told alone: the model is judged once the program is found.\n if (!hasBinary(harness)) {\n add(\"crash\", missingBinaryLine(harness));\n return problems;\n }\n }\n }\n\n const wantsModel = checks.has(\"refusal\") || checks.has(\"readiness\");\n if (!wantsModel || (serve && !model)) return problems;\n\n const local =\n project.registry ?? loadMergedProviderRegistry({ projectDir: path.resolve(projectDir) }).merged;\n const registry = project.providers?.length\n ? pickRegistryEntries(local, project.providers)\n : local;\n const input = { registry, ...(model ? { model } : {}), roles: project.roles };\n\n if (checks.has(\"refusal\")) {\n const refusal =\n checkHarnessModel(harness, input) ??\n (serve && harness === \"omp\" ? checkOmpServeModel(input) : undefined);\n // omp is told the refusal alone: omp is not asked about a model the registry refuses.\n if (add(\"model-refused\", refusal) && (harness === \"omp\" || serve)) return problems;\n }\n\n if (!registered || !checks.has(\"readiness\")) return problems;\n const ompListed = options.ompListed ?? checkOmpListedModel;\n if (harness === \"omp\") {\n const own = ownSelector(model, project.roles);\n const typedOwn = model && !model.startsWith(\"@\") ? model : undefined;\n const served = registryEntries(registry).some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n // An id no registry entry lists goes to omp as typed, so omp is asked whether it knows it. A\n // server asks too when no entry serves anything: omp serves it from its own catalog.\n const ask = serve ? isUnlistedModel(input) || !served : isUnlistedModel(input);\n const asked = serve ? model : typedOwn;\n if (asked && ask) add(\"model-refused\", await ompListed(asked));\n else if (!own && !served && options.ompHasModel && (await options.ompHasModel()) === false) {\n add(\n \"model-refused\",\n \"omp has no model to start on: no model is selected, no AI provider entry serves one and omp lists none. Pass --model <provider/model>, or sign in with omp first.\",\n );\n }\n return problems;\n }\n if (serve) return problems;\n if (harness === \"codex\") {\n const credential = options.codexCredential ?? checkCodexCredential;\n add(\"auth\", credential({ projectDir, harness, ...input }));\n return problems;\n }\n add(\"model-refused\", checkModelSurface(harness, input));\n return problems;\n}\n","/**\n * Ask a harness which models it can serve with the configuration a session would give it.\n *\n * {@link listModelsForHarness} answers from the registry alone: it is hermetic, never starts\n * a program, and lists every enabled entry's `model_map`. That is the right contract for a\n * session, but a picker cannot tell from it what the harness will actually serve — an entry with\n * a `discovery:` block, or one whose provider the harness resolves itself, only shows up when the\n * harness is asked. {@link discoverHarnessModels} is the explicit, opt-in call that asks: it\n * renders the registry the way the harness's own start would (omp's `models.yml`, opencode's\n * `opencode.json`, the credential env), runs the harness's model-listing command with closed\n * stdin and a timeout, and removes whatever it rendered.\n *\n * Any failure (program missing, timeout, unparsable output) and every harness without an\n * enumerator fall back to the registry list, tagged `source: \"registry\"` with the reason.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport {\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { HARNESS_BINARIES, harnessSpawnPath, resolveHarnessBinary } from \"./harness-binaries.js\";\nimport { materializeOmpProviders, renderOmpRegistry } from \"./harnesses/omp-models-yml.js\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport {\n credentialsForEveryProvider,\n harnessProviderName,\n resolveEnvHarnessSession,\n} from \"./provider-materialize/env-harnesses.js\";\nimport { materializeOpenCodeConfig } from \"./provider-materialize/opencode-config.js\";\nimport { harnessSessionConfigHome } from \"./provider-materialize/session-config-home.js\";\nimport { registryHarnessConfig } from \"./provider-registry-derive.js\";\nimport { listModelsForHarness } from \"./registry.js\";\nimport { stripRunnerPrivateEnv } from \"./runner-private-env.js\";\nimport type { AgentConfig } from \"./types.js\";\n\n/** What {@link discoverHarnessModels} found. */\nexport interface HarnessModelDiscovery {\n /** The models, in the order the harness (or the registry) listed them. */\n models: ModelEntry[];\n /** `harness`: the harness itself listed them. `registry`: derived from the registry. */\n source: \"harness\" | \"registry\";\n /** Why the harness was not asked or did not answer, when `source` is `registry` for that reason. */\n error?: string;\n}\n\n/** Options of {@link discoverHarnessModels}. */\nexport type DiscoverHarnessModelsOptions = RegistryCredentialOptions & {\n /** Working directory the program runs in (default `process.cwd()`). */\n cwd?: string;\n /** Time the harness gets to answer, in milliseconds (default per harness: omp 20 s, opencode 15 s). */\n timeoutMs?: number;\n};\n\n/** One harness's way of listing its models. */\ninterface HarnessModelEnumerator {\n /** Default time budget in milliseconds. */\n timeoutMs: number;\n /** The models, or `undefined` when the program printed no model list. Throws with the reason. */\n list(config: AgentConfig, timeoutMs: number): Promise<ModelEntry[] | undefined>;\n}\n\n/** Run `bin args`, stdin closed; resolve with stdout or reject with a one-line reason. */\nfunction runProgram(\n harnessId: string,\n bin: string,\n args: string[],\n options: { cwd: string; env: NodeJS.ProcessEnv; timeoutMs: number },\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const child = execFile(\n bin,\n args,\n {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n maxBuffer: 64 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (!error) return resolve(stdout);\n const failure: { code?: string | number | null; killed?: boolean } = error;\n if (failure.code === \"ENOENT\") {\n return reject(new Error(HARNESS_BINARIES[harnessId]?.hint ?? `${harnessId} not found`));\n }\n if (failure.killed) {\n return reject(\n new Error(`${harnessId} did not answer within ${options.timeoutMs / 1000} s`),\n );\n }\n const firstLine = String(stderr)\n .split(\"\\n\")\n .find((line) => line.trim())\n ?.trim();\n reject(\n new Error(\n `${harnessId} exited with ${failure.code ?? \"an error\"}${firstLine ? `: ${firstLine}` : \"\"}`,\n ),\n );\n },\n );\n child.stdin?.end();\n });\n}\n\n/** The program to run for `harnessId` and the leading args its test seam supplies. */\nfunction programFor(harnessId: string): { bin: string; preArgs: string[] } {\n const row = HARNESS_BINARIES[harnessId];\n if (!row) throw new Error(`${harnessId} has no known program`);\n const bin = resolveHarnessBinary(row);\n if (!bin) throw new Error(row.hint);\n // The leading args belong to the `<PREFIX>_BRIDGE_BIN` override, exactly as in the harness.\n const overridden = Boolean(process.env[row.overrideEnv ?? `${row.envPrefix}_BRIDGE_BIN`]);\n const raw = process.env[`${row.envPrefix}_BRIDGE_PREARGS`];\n return { bin, preArgs: overridden && raw ? raw.split(/\\s+/).filter(Boolean) : [] };\n}\n\n/** The environment a discovery child gets: the process env, the session's env, then `extra`. */\nfunction childEnv(config: AgentConfig, extra: Record<string, string>): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env, ...config.env, ...extra };\n env.PATH = harnessSpawnPath(env);\n return stripRunnerPrivateEnv(env);\n}\n\n/**\n * The chat models of `omp models --json`'s answer, as `<provider>/<id>` selectors. Exported for\n * tests; `undefined` when the text is not that answer or lists no chat model.\n */\nexport function parseOmpModelsJson(stdout: string): ModelEntry[] | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stdout);\n } catch {\n return undefined;\n }\n const list: unknown =\n parsed && typeof parsed === \"object\" && \"models\" in parsed ? parsed.models : parsed;\n if (!Array.isArray(list)) return undefined;\n const seen = new Set<string>();\n const models: ModelEntry[] = [];\n for (const item of list) {\n if (!item || typeof item !== \"object\") continue;\n const row: Record<string, unknown> = { ...item };\n if (row.kind !== \"chat\") continue;\n const providerId = typeof row.provider === \"string\" ? row.provider : undefined;\n const providerModelId = typeof row.id === \"string\" ? row.id : undefined;\n const selector =\n typeof row.selector === \"string\" && row.selector\n ? row.selector\n : providerId && providerModelId\n ? `${providerId}/${providerModelId}`\n : undefined;\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n models.push({\n id: selector,\n name: typeof row.name === \"string\" && row.name ? row.name : (providerModelId ?? selector),\n ...(providerId ? { providerId } : {}),\n ...(providerModelId ? { providerModelId } : {}),\n source: \"harness\",\n });\n }\n return models.length > 0 ? models : undefined;\n}\n\n/**\n * The `<provider>/<model>` lines of `opencode models`. A model id may itself contain `/`\n * (`openrouter/anthropic/claude-sonnet-4`): the provider is the head up to the first `/`. Lines\n * that are not that shape (banners, the JSON of `--verbose`) are skipped; repeats are dropped.\n */\nexport function parseOpenCodeModelLines(stdout: string): { provider: string; model: string }[] {\n const seen = new Set<string>();\n const lines: { provider: string; model: string }[] = [];\n for (const raw of stdout.split(\"\\n\")) {\n const match = /^([^\\s/]+)\\/(\\S+)$/.exec(raw.trim());\n if (!match?.[1] || !match[2] || seen.has(raw.trim())) continue;\n seen.add(raw.trim());\n lines.push({ provider: match[1], model: match[2] });\n }\n return lines;\n}\n\nconst ompEnumerator: HarnessModelEnumerator = {\n timeoutMs: 20_000,\n async list(config, timeoutMs) {\n // The agent directory an omp session would start in (`OmpHarness._start`): the registry\n // rendered to `models.yml`, the developer's own login seeded in when it exists.\n //\n // A session that names no model leaves the registry out when the developer's own omp\n // default needs their own `models.yml`: omp then runs on their directory. A\n // discovery asks what the registry's providers serve, so it names the first usable entry;\n // that is the one input `materializeOmpProviders` takes as \"the session picked a registry\n // model\" and renders the registry for.\n let sessionConfig = config;\n if (!config.modelRef && config.registry) {\n const first = renderOmpRegistry(config.registry, {\n env: { ...process.env, ...config.env },\n }).providerIds[0];\n if (first) sessionConfig = { ...config, modelRef: first };\n }\n const mat = await materializeOmpProviders(sessionConfig);\n try {\n const { bin, preArgs } = programFor(\"omp\");\n const env = childEnv(config, {\n ...(mat ? { PI_CODING_AGENT_DIR: mat.agentDir, ...mat.credentialEnv } : {}),\n });\n const stdout = await runProgram(\"omp\", bin, [...preArgs, \"models\", \"--json\"], {\n cwd: config.cwd,\n env,\n timeoutMs,\n });\n return parseOmpModelsJson(stdout);\n } finally {\n if (mat?.ephemeral) await rm(mat.agentDir, { recursive: true, force: true });\n }\n },\n};\n\nconst opencodeEnumerator: HarnessModelEnumerator = {\n // `opencode models` fetches models.dev, which regularly takes longer than 8 s.\n timeoutMs: 15_000,\n async list(config, timeoutMs) {\n const session = resolveEnvHarnessSession(config);\n // The opencode harness renders this file before every turn and leaves it; a discovery uses\n // a session id of its own, so its config home can go once the program has answered.\n const home = harnessSessionConfigHome(\"opencode\", config);\n try {\n const mat = materializeOpenCodeConfig(session, config);\n const { bin, preArgs } = programFor(\"opencode\");\n const env = childEnv(config, { ...credentialsForEveryProvider(session), ...mat.env });\n const stdout = await runProgram(\"opencode\", bin, [...preArgs, \"models\"], {\n cwd: config.cwd,\n env,\n timeoutMs,\n });\n const lines = parseOpenCodeModelLines(stdout);\n if (lines.length === 0) return undefined;\n\n // OpenCode names a stock catalog endpoint by its preset id and a custom one by the registry\n // id; map its provider name back to the registry entry that owns it.\n const entryOf = new Map<string, string>();\n for (const [entryId, entry] of registryEntries(session.registry)) {\n if (entry.kind !== \"llm\" || !isEntryEnabled(entry)) continue;\n const name = harnessProviderName(entryId, entry);\n if (!entryOf.has(name)) entryOf.set(name, entryId);\n }\n return lines.map(({ provider, model }) => ({\n id: `${provider}/${model}`,\n name: model,\n providerId: entryOf.get(provider) ?? provider,\n providerModelId: model,\n source: \"harness\" as const,\n }));\n } finally {\n await rm(home, { recursive: true, force: true });\n }\n },\n};\n\n/** Harnesses that can list their models themselves, by harness id. */\nconst HARNESS_MODEL_ENUMERATORS: Readonly<Record<string, HarnessModelEnumerator>> = {\n omp: ompEnumerator,\n opencode: opencodeEnumerator,\n};\n\n/**\n * The models `harnessId` serves with the configuration a session over `registry` would get.\n *\n * Only omp (`omp models --json`) and opencode (`opencode models`) are asked; the other harnesses\n * run on the provider the registry hands them, so the registry list is already their catalog.\n * The answer is the registry list, `source: \"registry\"`, when the harness has no enumerator and\n * also when asking fails; then `error` carries the reason (the install hint, a timeout line, a\n * parse failure).\n *\n * @param harnessId - Registered harness id.\n * @param registry - The AI provider registry the session would carry.\n * @param options - Credential resolution (`env`, `providerId`), the working directory and the\n * time budget.\n * @throws {Error} When the registry fallback is needed and `harnessId` is unknown or not bundled\n * (same contract as {@link listModelsForHarness}).\n */\nexport async function discoverHarnessModels(\n harnessId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: DiscoverHarnessModelsOptions = {},\n): Promise<HarnessModelDiscovery> {\n const enumerator = HARNESS_MODEL_ENUMERATORS[harnessId];\n if (!enumerator) {\n return { models: await listModelsForHarness(harnessId, registry, options), source: \"registry\" };\n }\n\n const config: AgentConfig = {\n cwd: options.cwd ?? process.cwd(),\n sessionId: `model-discovery-${randomUUID().slice(0, 8)}`,\n ...registryHarnessConfig(registry, options),\n };\n let error: string;\n try {\n const models = await enumerator.list(config, options.timeoutMs ?? enumerator.timeoutMs);\n if (models && models.length > 0) return { models, source: \"harness\" };\n error = `${harnessId} printed no model list`;\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n }\n return {\n models: await listModelsForHarness(harnessId, registry, options),\n source: \"registry\",\n error,\n };\n}\n","/**\n * EventNormalizer — converts bridge-level AgentEvent (raw harness 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 {\n type AgentEvent as NormalizedEvent,\n type NativeApprovalDescription,\n stripActivityLabel,\n TOOL_ACTIVITY_LABEL_MAX_CHARS,\n TOOL_ACTIVITY_LABEL_PARAM,\n} 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(\n event: Pick<\n Extract<BridgeEvent, { type: \"result\" | \"error\" }>,\n \"tokens\" | \"modelUsage\" | \"contextTokens\" | \"contextWindow\"\n >,\n) {\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 harness 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\nconst MAX_ANNOUNCED_TOOL_USES = 64;\n\n/**\n * Bridge `tool_call` inputs are loosely typed: Codex MCP arguments may arrive\n * as a JSON string, and the echo harness passes a bare path.\n */\nfunction toolInputRecord(input: unknown): Record<string, unknown> {\n let value = input;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n return { input };\n }\n }\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return value === undefined ? {} : { input };\n}\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 /** Dev-server URLs already announced as ready: each server once, a second one too. */\n private announcedDevServers = new Set<string>();\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n /**\n * True once a `_thinkingDelta` run has been reported as `status: thinking`;\n * cleared by the next text delta or assistant message, so a run reports once.\n */\n private thinkingAnnounced = false;\n /**\n * tool_use blocks `message_start` already reported, awaiting the harness's\n * matching bridge `tool_call` — which must then not report the call again.\n */\n private announcedToolUses: Array<{ id?: string; name: string }> = [];\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 \"message_retract\":\n // The replay streams its reply afresh, so its deltas (or, failing\n // those, its message_start text) must count as a new message.\n this.hasStreamedText = false;\n return event.text ? [{ type: \"text_retract\", content: event.text }] : [];\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 this.announcedToolUses = [];\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 ...resultUsageFields(event),\n ...(event.retrying === true\n ? { retrying: true, ...(event.retryReason ? { retryReason: event.retryReason } : {}) }\n : {}),\n ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n\n case \"background_task_started\":\n return [{ type: \"background_task_started\", taskId: event.taskId }];\n\n case \"self_turn_started\":\n return [{ type: \"self_turn_started\", taskIds: [...event.taskIds] }];\n\n case \"tool_call\": {\n // The question tool parks the turn 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 // A harness that also sent the call as a `message_start` tool_use block\n // (Claude) was already reported there; the rest only ever send this.\n if (!toolName || this.consumeAnnouncedToolUse(toolName, event.toolCallId)) {\n return [{ type: \"status\", phase: \"working\" }];\n }\n return this.handleToolUse(\n {\n type: \"tool_use\",\n id: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n name: toolName,\n input: toolInputRecord(event.input),\n },\n typeof event.parentToolUseId === \"string\" ? event.parentToolUseId : undefined,\n );\n }\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n this.announcedToolUses = [];\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 — harnesses 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.announcedDevServers.clear();\n this.hasStreamedText = false;\n this.thinkingAnnounced = false;\n this.announcedToolUses = [];\n }\n\n private consumeAnnouncedToolUse(name: string, id: unknown): boolean {\n const callId = typeof id === \"string\" ? id : undefined;\n const index = this.announcedToolUses.findIndex(\n (entry) => entry.name === name && (!callId || !entry.id || entry.id === callId),\n );\n if (index === -1) return false;\n this.announcedToolUses.splice(index, 1);\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Harnesses (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 // A subagent's message is not the main reply: its text belongs to the\n // subagent's own result, and it must not reset the main stream's state.\n const parentToolUseId = message.parentToolUseId;\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 if (parentToolUseId) continue;\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 if (block.name !== QUESTION_TOOL) {\n this.announcedToolUses.push({ id: block.id, name: block.name });\n // Bounded in case a harness never echoes a block as a tool_call.\n if (this.announcedToolUses.length > MAX_ANNOUNCED_TOOL_USES) {\n this.announcedToolUses.shift();\n }\n }\n events.push(...this.handleToolUse(block, parentToolUseId));\n }\n }\n\n if (!parentToolUseId) this.hasStreamedText = false;\n if (!parentToolUseId) this.thinkingAnnounced = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock, parentToolUseId?: string): 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, parentToolUseId);\n }\n\n private handleAskUserQuestion(input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const candidate = input.approval as Partial<NativeApprovalDescription> | undefined;\n const approval =\n candidate &&\n [\"command\", \"file\", \"permissions\", \"mcp\"].includes(candidate.kind ?? \"\") &&\n Array.isArray(candidate.details) &&\n candidate.details.length > 0 &&\n candidate.details.length <= 64 &&\n candidate.details.every((detail) => typeof detail === \"string\" && detail.length <= 8192) &&\n candidate.details.reduce((total, detail) => total + detail.length, 0) <= 65536\n ? (candidate as NativeApprovalDescription)\n : undefined;\n if (Object.hasOwn(input, \"approval\") && !approval) return [];\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({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\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({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\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(\n name: string,\n input: Record<string, unknown>,\n parentToolUseId?: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const label = labelToolCall(name, input);\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n // Summarize without the label: it would eat the default branch's\n // 100-char argument budget and push the real args out.\n summary: summarizeToolCall(name, stripActivityLabel(input)),\n ...(label ? { label } : {}),\n ...(parentToolUseId ? { parentToolUseId } : {}),\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 // Bridge deltas carry no subagent tag: a harness must drop a subagent's\n // partials itself (claude-sdk does in handleStreamEvent), or they read as main text.\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n this.thinkingAnnounced = false;\n return [{ type: \"text\", content: delta }];\n }\n // The protocol has no thinking-content event, so reasoning surfaces as the\n // existing `thinking` phase, once per run. The text is never forwarded as\n // `text`; a harness keeps it out of `_textDelta`.\n const thinking: unknown = \"_thinkingDelta\" in event ? event._thinkingDelta : undefined;\n if (typeof thinking === \"string\" && thinking && !this.thinkingAnnounced) {\n this.thinkingAnnounced = true;\n return [{ type: \"status\", phase: \"thinking\" }];\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, result.parentToolUseId));\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\") events.push(...this.detectDevServerReady(output));\n return events;\n }\n\n private handleToolResult(\n toolName: string,\n outputData: unknown,\n output: string,\n parentToolUseId?: 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 ...(parentToolUseId ? { parentToolUseId } : {}),\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 servers from Bash output\n if (toolName === \"Bash\") events.push(...this.detectDevServerReady(output));\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 harness\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 ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk harness uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (harnesses 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 ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\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 /** One `ready` event per URL in `text` not announced before in this session. */\n private detectDevServerReady(text: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n for (const url of devServerReadyUrls(text)) {\n if (this.announcedDevServers.has(url)) continue;\n this.announcedDevServers.add(url);\n events.push({ type: \"dev_server\", url, status: \"ready\" });\n }\n return events;\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\nconst ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n/**\n * CSI (`ESC [ … m`, cursor moves) and OSC (`ESC ] … BEL`, hyperlinks) escape sequences, plus\n * CSI written as the text `\\u001b[` / `\\x1b[`: a non-string tool result reaches the detector\n * JSON-encoded, which spells ESC out.\n */\nconst ANSI_ESCAPE = new RegExp(\n `(?:${ESC}|\\\\\\\\u001b|\\\\\\\\x1b)\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\\\\\)`,\n \"g\",\n);\n\n/** A dev server's `Local:` line on a loopback host (Vite, Nuxt, Storybook, Next). */\nconst LOCAL_URL = /Local:\\s+(https?):\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0):(\\d+)\\/?/g;\nconst EXPLICIT_URL = /DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/g;\n\n/**\n * The URLs a dev server's ready output announces, without duplicates; empty\n * when there are none. One output can hold several servers\n * (`concurrently \"vite\" \"storybook dev\"`, a combined log). Explicit\n * `DEVSERVER_READY:<url>` lines come first (a bare trailing `/` after the\n * port dropped, so it matches the `Local:` form), then every `Local:` line, after\n * stripping ANSI colours, on any loopback host, announced as `localhost` (what\n * a browser opens; `0.0.0.0` is not one). `FRONTEND_READY` →\n * `http://localhost:3000` only when neither is present. A `Network:` line (LAN\n * address) never matches.\n */\nfunction devServerReadyUrls(text: string): string[] {\n const explicit = [...text.matchAll(EXPLICIT_URL)].map((m) =>\n m[1]!.replace(/^(https?:\\/\\/[^/]+)\\/$/, \"$1\"),\n );\n const local = [...text.replace(ANSI_ESCAPE, \"\").matchAll(LOCAL_URL)].map(\n (m) => `${m[1]}://localhost:${m[2]}`,\n );\n const urls = [...new Set([...explicit, ...local])];\n if (urls.length > 0) return urls;\n return text.includes(\"FRONTEND_READY\") ? [\"http://localhost:3000\"] : [];\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 // A harness that sent a bare value instead of named args has it under `input`.\n const arg = (key: string) => String(input[key] ?? input.input);\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? input.input ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${arg(\"file_path\")}`;\n case \"Edit\":\n return `Edit ${arg(\"file_path\")}`;\n case \"Read\":\n return `Read ${arg(\"file_path\")}`;\n case \"Glob\":\n return `Find ${arg(\"pattern\")}`;\n case \"Grep\":\n return `Search for ${arg(\"pattern\")}`;\n case \"ApplyPatch\": {\n // Paths only: stringifying the input would serialize every full diff.\n const changes = Array.isArray(input.changes) ? input.changes : [];\n const paths = changes\n .map((change) => (change as { path?: unknown } | null)?.path)\n .filter((path): path is string => typeof path === \"string\");\n return `Edit ${paths.join(\", \").slice(0, 200) || \"files\"}`;\n }\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/**\n * Produce the plain-language label shown to non-technical users while a tool\n * call runs: the agent's own `activity_label`, Bash's `description`, else a\n * derived phrase for Claude Code built-ins. `undefined` for any other tool —\n * the UI then falls back to a generic \"working\" line rather than raw input.\n *\n * @param tool - Tool name as the model called it.\n * @param input - Tool input record, still carrying `activity_label`.\n * @returns A trimmed label capped at `TOOL_ACTIVITY_LABEL_MAX_CHARS`, or `undefined`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function labelToolCall(tool: string, input: Record<string, unknown>): string | undefined {\n const authored =\n nonEmpty(input[TOOL_ACTIVITY_LABEL_PARAM]) ??\n (tool === \"Bash\" ? nonEmpty(input.description) : undefined);\n const label = authored ?? builtinToolLabel(tool, input);\n if (!label) return undefined;\n return label.length > TOOL_ACTIVITY_LABEL_MAX_CHARS\n ? `${label.slice(0, TOOL_ACTIVITY_LABEL_MAX_CHARS - 1).trimEnd()}…`\n : label;\n}\n\nfunction nonEmpty(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction builtinToolLabel(tool: string, input: Record<string, unknown>): string | undefined {\n switch (tool) {\n case \"Read\":\n return withTarget(\"Reading\", baseName(input.file_path));\n case \"Edit\":\n case \"MultiEdit\":\n case \"NotebookEdit\":\n return withTarget(\"Editing\", baseName(input.file_path ?? input.notebook_path));\n case \"Write\":\n return withTarget(\"Creating\", baseName(input.file_path));\n case \"Grep\":\n case \"Glob\":\n return \"Searching files\";\n case \"WebSearch\":\n return \"Searching the web\";\n case \"WebFetch\":\n return withTarget(\"Fetching\", hostOf(input.url), \"a web page\");\n case \"TodoWrite\":\n return \"Updating the task list\";\n case \"ApplyPatch\":\n return \"Editing files\";\n default:\n return undefined;\n }\n}\n\nfunction withTarget(verb: string, target: string | undefined, fallback = \"a file\"): string {\n return `${verb} ${target ?? fallback}`;\n}\n\nfunction baseName(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n return value.split(/[\\\\/]/).filter(Boolean).pop();\n}\n\nfunction hostOf(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return new URL(value).host || undefined;\n } catch {\n return undefined;\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 AgentHarness + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any harness.\n */\n\nimport type {\n AgentEvent,\n AgentPromptInput,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { toMergedRegistry } from \"./provider-registry-derive.js\";\nimport { createHarness } from \"./registry.js\";\nimport type { AgentConfig, AgentHarness } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentHarness}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any harness without managing the harness 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 harness: AgentHarness | 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 harnessId: string;\n\n constructor(harnessId: string = \"claude-sdk\") {\n this.harnessId = harnessId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous harness if any\n if (this.harness) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n model: config.model,\n systemPrompt: config.systemPrompt,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n ...(config.registry ? { registry: toMergedRegistry(config.registry, \"runtime\") } : {}),\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n };\n\n this.harness = await createHarness(this.harnessId, 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.harness.on(\"agent-event\", this.boundEventHandler);\n\n await this.harness.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.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.prompt(message);\n }\n\n async promptInput(input: AgentPromptInput): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.promptInput(input);\n }\n\n async reply(answer: string, question?: string, requestId?: string): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\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 (\n this.harness?.hasPendingQuestion() &&\n this.harness.answerQuestion(answer, question, requestId)\n )\n return;\n if (this.harness?.acceptsReplyAsPrompt) await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.harness) {\n await this.harness.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.harness) {\n if (this.boundEventHandler) {\n this.harness.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.harness.kill();\n this.harness = 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.harness?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified harness.\n *\n * @param harnessId - Registered harness id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected harness with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(harnessId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(harnessId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\nimport {\n buildCredentialHeaders,\n expandPreset,\n getProviderPreset,\n resolvePresetBaseUrl,\n resolveProbeUrl,\n} from \"./provider-catalog.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 - Catalog preset id (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 `base_url_env` 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 preset = getProviderPreset(provider);\n if (!preset) 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 const baseUrl = resolvePresetBaseUrl(preset, {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n env: options.env ?? process.env,\n });\n const entry = expandPreset(preset, baseUrl ? { baseUrl } : {});\n const url = resolveProbeUrl(entry);\n if (!url) return { ok: false, error: `Provider ${provider} exposes no models endpoint` };\n // Static non-secret headers (Anthropic's `anthropic-version`) plus the\n // credential carrier the preset's `auth_header` names.\n const headers = { ...entry.headers, ...buildCredentialHeaders(entry, 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,\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"]}