@skaile/workspaces 6.9.0 → 6.10.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 (345) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/ai-sdk.js +8 -8
  3. package/dist/{asset-feeds-JWRIWLVX.js → asset-feeds-UG3PG423.js} +22 -22
  4. package/dist/{asset-feeds-JWRIWLVX.js.map → asset-feeds-UG3PG423.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +8 -8
  6. package/dist/asset-manager/history.js +8 -8
  7. package/dist/asset-manager/index.js +14 -14
  8. package/dist/asset-manager/installer.js +9 -9
  9. package/dist/asset-manager/renderers.js +8 -8
  10. package/dist/asset-manager/src/harness-switch-state.d.ts +30 -0
  11. package/dist/asset-manager/src/harness-switch-state.d.ts.map +1 -0
  12. package/dist/asset-manager/src/index.d.ts +49 -12
  13. package/dist/asset-manager/src/index.d.ts.map +1 -1
  14. package/dist/asset-manager/src/mcp-config.d.ts +6 -0
  15. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
  16. package/dist/bridge/codex-app-server.js +1 -2
  17. package/dist/bridge/harnesses/claude-sdk.js +11 -11
  18. package/dist/bridge/harnesses/codex.js +15 -1926
  19. package/dist/bridge/harnesses/codex.js.map +1 -1
  20. package/dist/bridge/harnesses/continue.js +11 -11
  21. package/dist/bridge/harnesses/echo.js +3 -3
  22. package/dist/bridge/harnesses/gemini.js +6 -6
  23. package/dist/bridge/harnesses/goose.js +11 -11
  24. package/dist/bridge/harnesses/omp.js +61 -9
  25. package/dist/bridge/harnesses/omp.js.map +1 -1
  26. package/dist/bridge/harnesses/opencode.js +11 -11
  27. package/dist/bridge/harnesses/qwen.js +6 -6
  28. package/dist/bridge/index.js +17 -16
  29. package/dist/bridge/src/harness-model-check.d.ts +5 -4
  30. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  31. package/dist/bridge/src/harnesses/codex.d.ts +13 -0
  32. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
  33. package/dist/bridge/src/harnesses/omp.d.ts +22 -0
  34. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  35. package/dist/bridge/src/index.d.ts +1 -0
  36. package/dist/bridge/src/index.d.ts.map +1 -1
  37. package/dist/{chunk-XPKUFOS3.js → chunk-2D6HZAO5.js} +8 -8
  38. package/dist/{chunk-XPKUFOS3.js.map → chunk-2D6HZAO5.js.map} +1 -1
  39. package/dist/chunk-2MUUPRIG.js +688 -0
  40. package/dist/chunk-2MUUPRIG.js.map +1 -0
  41. package/dist/{chunk-TMQFOJ6F.js → chunk-2PVYDAFN.js} +3 -3
  42. package/dist/{chunk-TMQFOJ6F.js.map → chunk-2PVYDAFN.js.map} +1 -1
  43. package/dist/{chunk-YGT3CGPD.js → chunk-2U67XYZM.js} +3 -3
  44. package/dist/{chunk-YGT3CGPD.js.map → chunk-2U67XYZM.js.map} +1 -1
  45. package/dist/{chunk-5NTB64PW.js → chunk-375HN3FD.js} +18 -14
  46. package/dist/chunk-375HN3FD.js.map +1 -0
  47. package/dist/{chunk-23Q5LT4U.js → chunk-4I4SBOCS.js} +345 -88
  48. package/dist/chunk-4I4SBOCS.js.map +1 -0
  49. package/dist/{chunk-WPLZGT5Z.js → chunk-4Z4RULWQ.js} +59 -31
  50. package/dist/chunk-4Z4RULWQ.js.map +1 -0
  51. package/dist/{chunk-72BDCGBB.js → chunk-5JBMYZNA.js} +3 -3
  52. package/dist/{chunk-72BDCGBB.js.map → chunk-5JBMYZNA.js.map} +1 -1
  53. package/dist/{chunk-3EPRTMXY.js → chunk-5KQFR4D7.js} +6 -6
  54. package/dist/{chunk-3EPRTMXY.js.map → chunk-5KQFR4D7.js.map} +1 -1
  55. package/dist/{chunk-KNY356I3.js → chunk-5KSGZP3E.js} +11 -4
  56. package/dist/chunk-5KSGZP3E.js.map +1 -0
  57. package/dist/{chunk-DZRN3SNG.js → chunk-5P7LTPBR.js} +5 -5
  58. package/dist/{chunk-DZRN3SNG.js.map → chunk-5P7LTPBR.js.map} +1 -1
  59. package/dist/{chunk-PTJZCOBH.js → chunk-6O7VDKX3.js} +2 -2
  60. package/dist/{chunk-PTJZCOBH.js.map → chunk-6O7VDKX3.js.map} +1 -1
  61. package/dist/{chunk-B2DGCYVC.js → chunk-7DUOKE73.js} +27 -33
  62. package/dist/chunk-7DUOKE73.js.map +1 -0
  63. package/dist/{chunk-V5KG6CCV.js → chunk-7HRZACI4.js} +7 -2
  64. package/dist/chunk-7HRZACI4.js.map +1 -0
  65. package/dist/{chunk-U3FI4DVT.js → chunk-7K73MCI6.js} +7 -5
  66. package/dist/chunk-7K73MCI6.js.map +1 -0
  67. package/dist/{chunk-SE6OL7Y5.js → chunk-BCID52M5.js} +6 -6
  68. package/dist/{chunk-SE6OL7Y5.js.map → chunk-BCID52M5.js.map} +1 -1
  69. package/dist/{chunk-FZO64PLQ.js → chunk-BNLXZXZN.js} +81 -8
  70. package/dist/chunk-BNLXZXZN.js.map +1 -0
  71. package/dist/{chunk-O3FYOS64.js → chunk-C5UKYTTD.js} +13 -23
  72. package/dist/chunk-C5UKYTTD.js.map +1 -0
  73. package/dist/{chunk-LYVLDGML.js → chunk-CG63XGVV.js} +3 -3
  74. package/dist/{chunk-LYVLDGML.js.map → chunk-CG63XGVV.js.map} +1 -1
  75. package/dist/{chunk-4ROXSQEG.js → chunk-CJO3XKO7.js} +4 -4
  76. package/dist/{chunk-4ROXSQEG.js.map → chunk-CJO3XKO7.js.map} +1 -1
  77. package/dist/{chunk-OSABUEWA.js → chunk-CVUMZTNO.js} +4 -4
  78. package/dist/{chunk-OSABUEWA.js.map → chunk-CVUMZTNO.js.map} +1 -1
  79. package/dist/{chunk-E675QKFG.js → chunk-DOMRBOJZ.js} +5 -5
  80. package/dist/{chunk-E675QKFG.js.map → chunk-DOMRBOJZ.js.map} +1 -1
  81. package/dist/{chunk-GTAHU4N4.js → chunk-EB2LKPI6.js} +4 -4
  82. package/dist/{chunk-GTAHU4N4.js.map → chunk-EB2LKPI6.js.map} +1 -1
  83. package/dist/{chunk-GZL6RN4Z.js → chunk-FXBKBOI5.js} +169 -49
  84. package/dist/chunk-FXBKBOI5.js.map +1 -0
  85. package/dist/{chunk-AERQFD6T.js → chunk-GA4GUDTL.js} +4 -4
  86. package/dist/{chunk-AERQFD6T.js.map → chunk-GA4GUDTL.js.map} +1 -1
  87. package/dist/{chunk-NJVHGS7X.js → chunk-HE3TZYNG.js} +4 -4
  88. package/dist/{chunk-NJVHGS7X.js.map → chunk-HE3TZYNG.js.map} +1 -1
  89. package/dist/chunk-HLFLET7S.js +2443 -0
  90. package/dist/chunk-HLFLET7S.js.map +1 -0
  91. package/dist/{chunk-Y2BQWZXT.js → chunk-HQUF6O4B.js} +27 -56
  92. package/dist/chunk-HQUF6O4B.js.map +1 -0
  93. package/dist/{chunk-T5EIWWEJ.js → chunk-IMO4EHND.js} +5 -5
  94. package/dist/{chunk-T5EIWWEJ.js.map → chunk-IMO4EHND.js.map} +1 -1
  95. package/dist/{chunk-TUOHA6BM.js → chunk-IOXFT5D7.js} +3 -3
  96. package/dist/{chunk-TUOHA6BM.js.map → chunk-IOXFT5D7.js.map} +1 -1
  97. package/dist/{chunk-5AQLCRR7.js → chunk-JDZUQFN7.js} +4 -4
  98. package/dist/{chunk-5AQLCRR7.js.map → chunk-JDZUQFN7.js.map} +1 -1
  99. package/dist/{chunk-SQMDFM4N.js → chunk-KE5HDORU.js} +2 -2
  100. package/dist/{chunk-SQMDFM4N.js.map → chunk-KE5HDORU.js.map} +1 -1
  101. package/dist/{chunk-PTJTOPE5.js → chunk-KOI7QFDH.js} +3 -3
  102. package/dist/{chunk-PTJTOPE5.js.map → chunk-KOI7QFDH.js.map} +1 -1
  103. package/dist/{chunk-NDBHEOIA.js → chunk-KRL53RZB.js} +8 -8
  104. package/dist/{chunk-NDBHEOIA.js.map → chunk-KRL53RZB.js.map} +1 -1
  105. package/dist/{chunk-7QYBKUAS.js → chunk-LKBRBVVS.js} +3 -3
  106. package/dist/{chunk-7QYBKUAS.js.map → chunk-LKBRBVVS.js.map} +1 -1
  107. package/dist/{chunk-USSP43U3.js → chunk-LQWOU7S2.js} +3 -3
  108. package/dist/{chunk-USSP43U3.js.map → chunk-LQWOU7S2.js.map} +1 -1
  109. package/dist/{chunk-4KPQ6ILH.js → chunk-MEU2HHGV.js} +18 -9
  110. package/dist/chunk-MEU2HHGV.js.map +1 -0
  111. package/dist/{chunk-QC5BYUED.js → chunk-MS2IXLTC.js} +4 -4
  112. package/dist/{chunk-QC5BYUED.js.map → chunk-MS2IXLTC.js.map} +1 -1
  113. package/dist/{chunk-X2B5GMJO.js → chunk-NCJSYU6A.js} +16 -14
  114. package/dist/chunk-NCJSYU6A.js.map +1 -0
  115. package/dist/{chunk-CFTTXUM2.js → chunk-NFFBYG2W.js} +3 -3
  116. package/dist/{chunk-CFTTXUM2.js.map → chunk-NFFBYG2W.js.map} +1 -1
  117. package/dist/{chunk-AVRTZAH2.js → chunk-NTFP2XF4.js} +10 -10
  118. package/dist/chunk-NTFP2XF4.js.map +1 -0
  119. package/dist/{chunk-V2CONXKD.js → chunk-PSPFWTJI.js} +4 -4
  120. package/dist/{chunk-V2CONXKD.js.map → chunk-PSPFWTJI.js.map} +1 -1
  121. package/dist/{chunk-C7L5MFUL.js → chunk-PTXQMTCG.js} +3 -3
  122. package/dist/{chunk-C7L5MFUL.js.map → chunk-PTXQMTCG.js.map} +1 -1
  123. package/dist/{chunk-Y242OE4B.js → chunk-QBJQ426X.js} +3 -3
  124. package/dist/{chunk-Y242OE4B.js.map → chunk-QBJQ426X.js.map} +1 -1
  125. package/dist/{chunk-QBUJTVMY.js → chunk-R3ZNAPBV.js} +3 -3
  126. package/dist/{chunk-QBUJTVMY.js.map → chunk-R3ZNAPBV.js.map} +1 -1
  127. package/dist/{chunk-4WB4KSSQ.js → chunk-RTFH2QR2.js} +3 -3
  128. package/dist/{chunk-4WB4KSSQ.js.map → chunk-RTFH2QR2.js.map} +1 -1
  129. package/dist/{chunk-5KWQMCH7.js → chunk-RZ5R6GDJ.js} +5 -5
  130. package/dist/{chunk-5KWQMCH7.js.map → chunk-RZ5R6GDJ.js.map} +1 -1
  131. package/dist/{chunk-MDCI4RSG.js → chunk-RZL4TOK3.js} +20 -6
  132. package/dist/chunk-RZL4TOK3.js.map +1 -0
  133. package/dist/{chunk-LMADWO4Q.js → chunk-SBAUZ7XH.js} +4 -4
  134. package/dist/{chunk-LMADWO4Q.js.map → chunk-SBAUZ7XH.js.map} +1 -1
  135. package/dist/{chunk-MPRWVZXF.js → chunk-SKG6G4HO.js} +108 -44
  136. package/dist/chunk-SKG6G4HO.js.map +1 -0
  137. package/dist/{chunk-HQAPUPBE.js → chunk-V2VDTQ7A.js} +3 -3
  138. package/dist/{chunk-HQAPUPBE.js.map → chunk-V2VDTQ7A.js.map} +1 -1
  139. package/dist/{chunk-GNUA7XT2.js → chunk-VS6XC5JE.js} +3 -3
  140. package/dist/{chunk-GNUA7XT2.js.map → chunk-VS6XC5JE.js.map} +1 -1
  141. package/dist/{chunk-5J6JWGY4.js → chunk-WDG5IVEA.js} +3 -3
  142. package/dist/{chunk-5J6JWGY4.js.map → chunk-WDG5IVEA.js.map} +1 -1
  143. package/dist/{chunk-M4G2SVXI.js → chunk-XWCV2A2F.js} +4 -4
  144. package/dist/{chunk-M4G2SVXI.js.map → chunk-XWCV2A2F.js.map} +1 -1
  145. package/dist/{chunk-UWD7YBDR.js → chunk-ZLDAPZIX.js} +4 -4
  146. package/dist/{chunk-UWD7YBDR.js.map → chunk-ZLDAPZIX.js.map} +1 -1
  147. package/dist/{claude-code-YRJIGXTL.js → claude-code-CMFGCDMX.js} +5 -5
  148. package/dist/{claude-code-YRJIGXTL.js.map → claude-code-CMFGCDMX.js.map} +1 -1
  149. package/dist/cli/index.js +322 -196
  150. package/dist/cli/index.js.map +1 -1
  151. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  152. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  153. package/dist/cli/src/commands/config.d.ts.map +1 -1
  154. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  155. package/dist/cli/src/commands/harness-preflight.d.ts +3 -1
  156. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -1
  157. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  158. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  159. package/dist/cli/src/commands/library-index.d.ts +3 -3
  160. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  161. package/dist/cli/src/commands/migrate-files.d.ts +8 -0
  162. package/dist/cli/src/commands/migrate-files.d.ts.map +1 -1
  163. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  164. package/dist/cli/src/commands/migrate-providers.d.ts.map +1 -1
  165. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  166. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  167. package/dist/cli/src/commands/project.d.ts.map +1 -1
  168. package/dist/cli/src/commands/run.d.ts.map +1 -1
  169. package/dist/cli/src/commands/serve-preflight.d.ts +7 -5
  170. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  171. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  172. package/dist/cli/src/commands/source.d.ts.map +1 -1
  173. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  174. package/dist/cli/src/config-checks.d.ts +50 -12
  175. package/dist/cli/src/config-checks.d.ts.map +1 -1
  176. package/dist/cli/src/ensure-sources.d.ts.map +1 -1
  177. package/dist/cli/src/harness-error.d.ts +7 -0
  178. package/dist/cli/src/harness-error.d.ts.map +1 -1
  179. package/dist/cli/src/helpers.d.ts.map +1 -1
  180. package/dist/connectors/config.js +5 -5
  181. package/dist/connectors/index.js +20 -19
  182. package/dist/connectors/src/index.d.ts +1 -1
  183. package/dist/connectors/src/index.d.ts.map +1 -1
  184. package/dist/connectors/src/managed-gitconfig.d.ts +12 -0
  185. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  186. package/dist/{connectors-JKT32HZT.js → connectors-P5M2D4MH.js} +23 -22
  187. package/dist/{connectors-JKT32HZT.js.map → connectors-P5M2D4MH.js.map} +1 -1
  188. package/dist/core/index.js +7 -7
  189. package/dist/core/logging.js +1 -1
  190. package/dist/core/manifest.js +2 -2
  191. package/dist/core/models.js +1 -1
  192. package/dist/core/publish-manifest.js +3 -3
  193. package/dist/core/ref.js +1 -1
  194. package/dist/core/runtime-assets.js +5 -5
  195. package/dist/core/src/index.d.ts +2 -2
  196. package/dist/core/src/index.d.ts.map +1 -1
  197. package/dist/core/src/lock.d.ts +7 -1
  198. package/dist/core/src/lock.d.ts.map +1 -1
  199. package/dist/core/src/models.d.ts.map +1 -1
  200. package/dist/core/src/repo-manager.d.ts +28 -0
  201. package/dist/core/src/repo-manager.d.ts.map +1 -1
  202. package/dist/core/src/run-state-ignore.d.ts +5 -3
  203. package/dist/core/src/run-state-ignore.d.ts.map +1 -1
  204. package/dist/core/src/workspace-config.d.ts.map +1 -1
  205. package/dist/core/workspace-config.js +4 -4
  206. package/dist/deploy/index.js +7 -7
  207. package/dist/discovery/index.js +4 -4
  208. package/dist/{ensure-sources-GUJODKY5.js → ensure-sources-MOGLBEUF.js} +31 -29
  209. package/dist/ensure-sources-MOGLBEUF.js.map +1 -0
  210. package/dist/factory-assets/connectors/box.js +20 -19
  211. package/dist/factory-assets/connectors/deploy.js +20 -19
  212. package/dist/factory-assets/connectors/devserver.js +20 -19
  213. package/dist/factory-assets/connectors/flow/adapter.js +20 -19
  214. package/dist/factory-assets/connectors/flow/engine.js +8 -8
  215. package/dist/factory-assets/connectors/flow/run-flow.js +22 -21
  216. package/dist/factory-assets/connectors/flow.js +20 -19
  217. package/dist/factory-assets/connectors/git/exec.d.ts +7 -0
  218. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  219. package/dist/factory-assets/connectors/git/repo.d.ts.map +1 -1
  220. package/dist/factory-assets/connectors/git.js +20 -19
  221. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -1
  222. package/dist/factory-assets/connectors/gmail.js +20 -19
  223. package/dist/factory-assets/connectors/googledrive.js +20 -19
  224. package/dist/factory-assets/connectors/local.js +20 -19
  225. package/dist/factory-assets/connectors/mattermost.js +20 -19
  226. package/dist/factory-assets/connectors/memory.js +20 -19
  227. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -1
  228. package/dist/factory-assets/connectors/minio.js +20 -19
  229. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -1
  230. package/dist/factory-assets/connectors/postgres.js +20 -19
  231. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
  232. package/dist/factory-assets/connectors/s3.js +20 -19
  233. package/dist/factory-assets/connectors/sharepoint.js +20 -19
  234. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
  235. package/dist/factory-assets/connectors/sqlite.js +20 -19
  236. package/dist/factory-assets/connectors/static-server.js +20 -19
  237. package/dist/factory-assets/connectors/tunnel.js +20 -19
  238. package/dist/factory-assets/connectors/webdav.js +20 -19
  239. package/dist/factory-assets/connectors/xstate-store.js +20 -19
  240. package/dist/factory-assets/connectors/xstate.js +20 -19
  241. package/dist/{flows-UCP6ZUYS.js → flows-J64L5MGJ.js} +12 -12
  242. package/dist/{flows-UCP6ZUYS.js.map → flows-J64L5MGJ.js.map} +1 -1
  243. package/dist/{helpers-SO53MRHF.js → helpers-JL5AEGDT.js} +28 -26
  244. package/dist/{helpers-SO53MRHF.js.map → helpers-JL5AEGDT.js.map} +1 -1
  245. package/dist/library/index.js +10 -10
  246. package/dist/library/install.js +4 -4
  247. package/dist/library/src/index.d.ts +2 -2
  248. package/dist/library/src/index.d.ts.map +1 -1
  249. package/dist/library/src/library.d.ts +6 -2
  250. package/dist/library/src/library.d.ts.map +1 -1
  251. package/dist/library/src/local/db.d.ts.map +1 -1
  252. package/dist/library/src/local/library.d.ts +10 -3
  253. package/dist/library/src/local/library.d.ts.map +1 -1
  254. package/dist/library/src/local/local-catalog-source.d.ts +0 -9
  255. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  256. package/dist/library/src/local/schema.d.ts +27 -20
  257. package/dist/library/src/local/schema.d.ts.map +1 -1
  258. package/dist/library/src/manifest-writer.d.ts +13 -0
  259. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  260. package/dist/library/src/remote/index.d.ts +1 -1
  261. package/dist/library/src/remote/index.d.ts.map +1 -1
  262. package/dist/library/src/remote/remote-catalog-source.d.ts +6 -0
  263. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  264. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  265. package/dist/{library-publish-Z5E3YZCZ.js → library-publish-DZNNZNMB.js} +49 -50
  266. package/dist/library-publish-DZNNZNMB.js.map +1 -0
  267. package/dist/model-endpoint/index.js +10 -10
  268. package/dist/open-library-OJREQ22B.js +61 -0
  269. package/dist/{open-library-A5OB72FD.js.map → open-library-OJREQ22B.js.map} +1 -1
  270. package/dist/{open-registry-BHBHQMBA.js → open-registry-OEU6QUK2.js} +14 -14
  271. package/dist/{open-registry-BHBHQMBA.js.map → open-registry-OEU6QUK2.js.map} +1 -1
  272. package/dist/paths-PXBWY532.js +22 -0
  273. package/dist/{paths-77PXOXZY.js.map → paths-PXBWY532.js.map} +1 -1
  274. package/dist/{plugin-store-XQP2CRYH.js → plugin-store-ZC3EGZ3D.js} +10 -10
  275. package/dist/{plugin-store-XQP2CRYH.js.map → plugin-store-ZC3EGZ3D.js.map} +1 -1
  276. package/dist/{project-KTEUN7KR.js → project-52UABBD5.js} +45 -46
  277. package/dist/{project-KTEUN7KR.js.map → project-52UABBD5.js.map} +1 -1
  278. package/dist/resolver/index.js +8 -8
  279. package/dist/runner/index.js +35 -35
  280. package/dist/runner/src/agent-loop.d.ts.map +1 -1
  281. package/dist/runner/src/serve.d.ts.map +1 -1
  282. package/dist/runner/src/turn-end-contract.d.ts.map +1 -1
  283. package/dist/runner/src/turn-scheduler.d.ts +8 -0
  284. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  285. package/dist/sdk/asset-manager.js +14 -14
  286. package/dist/sdk/bridge.js +17 -16
  287. package/dist/sdk/core.js +7 -7
  288. package/dist/sdk/flow.js +8 -8
  289. package/dist/sdk/index.js +35 -35
  290. package/dist/sdk/resolver.js +8 -8
  291. package/dist/sdk/runner.js +35 -35
  292. package/dist/sdk/transport/ws/server.js +8 -8
  293. package/dist/sdk/transport/ws.js +8 -8
  294. package/dist/sdk/transport.js +8 -8
  295. package/dist/{serve-preflight-ODQGVUFL.js → serve-preflight-HOQ7CGYR.js} +30 -30
  296. package/dist/{serve-preflight-ODQGVUFL.js.map → serve-preflight-HOQ7CGYR.js.map} +1 -1
  297. package/dist/{setup-QJDI5YAW.js → setup-JIDZ372C.js} +29 -27
  298. package/dist/setup-JIDZ372C.js.map +1 -0
  299. package/dist/{skills-DE2BDQ6G.js → skills-5D4KDVPJ.js} +13 -13
  300. package/dist/{skills-DE2BDQ6G.js.map → skills-5D4KDVPJ.js.map} +1 -1
  301. package/dist/{source-FKOUYMEM.js → source-P6ZFSSZZ.js} +47 -46
  302. package/dist/{source-FKOUYMEM.js.map → source-P6ZFSSZZ.js.map} +1 -1
  303. package/dist/{source-manifest-publish-JA4TY4Z6.js → source-manifest-publish-Y36FHVDS.js} +49 -48
  304. package/dist/source-manifest-publish-Y36FHVDS.js.map +1 -0
  305. package/dist/transport/index.js +8 -8
  306. package/dist/transport/src/ws/server.d.ts.map +1 -1
  307. package/dist/transport/ws/server.js +8 -8
  308. package/dist/transport/ws.js +8 -8
  309. package/dist/tui/index.js +35 -35
  310. package/dist/workspace-plugin/adapters/mcp.js +27 -26
  311. package/dist/workspace-plugin/adapters/omp.js +14 -14
  312. package/dist/workspace-plugin/index.js +2 -2
  313. package/package.json +1 -1
  314. package/dist/chunk-23Q5LT4U.js.map +0 -1
  315. package/dist/chunk-4KPQ6ILH.js.map +0 -1
  316. package/dist/chunk-5NTB64PW.js.map +0 -1
  317. package/dist/chunk-AVRTZAH2.js.map +0 -1
  318. package/dist/chunk-B2DGCYVC.js.map +0 -1
  319. package/dist/chunk-FZO64PLQ.js.map +0 -1
  320. package/dist/chunk-GYBDWW6K.js +0 -160
  321. package/dist/chunk-GYBDWW6K.js.map +0 -1
  322. package/dist/chunk-GYPPVANR.js +0 -357
  323. package/dist/chunk-GYPPVANR.js.map +0 -1
  324. package/dist/chunk-GZL6RN4Z.js.map +0 -1
  325. package/dist/chunk-JY2JXCL6.js +0 -334
  326. package/dist/chunk-JY2JXCL6.js.map +0 -1
  327. package/dist/chunk-KNY356I3.js.map +0 -1
  328. package/dist/chunk-LOO5CB5M.js +0 -12
  329. package/dist/chunk-LOO5CB5M.js.map +0 -1
  330. package/dist/chunk-MDCI4RSG.js.map +0 -1
  331. package/dist/chunk-MPRWVZXF.js.map +0 -1
  332. package/dist/chunk-O3FYOS64.js.map +0 -1
  333. package/dist/chunk-U3FI4DVT.js.map +0 -1
  334. package/dist/chunk-V3EJYOP2.js +0 -299
  335. package/dist/chunk-V3EJYOP2.js.map +0 -1
  336. package/dist/chunk-V5KG6CCV.js.map +0 -1
  337. package/dist/chunk-WPLZGT5Z.js.map +0 -1
  338. package/dist/chunk-X2B5GMJO.js.map +0 -1
  339. package/dist/chunk-Y2BQWZXT.js.map +0 -1
  340. package/dist/ensure-sources-GUJODKY5.js.map +0 -1
  341. package/dist/library-publish-Z5E3YZCZ.js.map +0 -1
  342. package/dist/open-library-A5OB72FD.js +0 -59
  343. package/dist/paths-77PXOXZY.js +0 -22
  344. package/dist/setup-QJDI5YAW.js.map +0 -1
  345. package/dist/source-manifest-publish-JA4TY4Z6.js.map +0 -1
@@ -1,160 +0,0 @@
1
- import { unresolvedProviderCredentials, providerCredentialEnvName } from './chunk-SQMDFM4N.js';
2
- import { getProviderPreset } from './chunk-6UP2EDFN.js';
3
- import { globalSkaileDir } from './chunk-L5VSIPQD.js';
4
- import { registryEntries, parseModelRef, isEntryEnabled, resolveEntryBaseUrl } from './chunk-RXGPFAMN.js';
5
- import { createHash } from 'crypto';
6
- import { mkdirSync, rmSync, writeFileSync, renameSync, readFileSync, existsSync } from 'fs';
7
- import { join, resolve } from 'path';
8
- import { stringify } from 'smol-toml';
9
- import { homedir } from 'os';
10
-
11
- var CODEX_WIRE_API = {
12
- "openai-codex-responses": "responses",
13
- "openai-responses": "responses",
14
- "azure-openai-responses": "responses"
15
- };
16
- var CODEX_RESERVED_PROVIDER_IDS = /* @__PURE__ */ new Set(["openai", "ollama", "lmstudio"]);
17
- function codexProviderTableId(id) {
18
- return CODEX_RESERVED_PROVIDER_IDS.has(id) ? `skaile-${id}` : id;
19
- }
20
- var ENV_DELIVERED_CREDENTIALS = {
21
- api_key_header: true,
22
- bearer: true,
23
- command: true
24
- };
25
- function selectionNamesEntry(input, selected, registry) {
26
- if (selected.role && selected.modelId !== void 0) return true;
27
- const selector = input.modelRef?.trim() || input.model?.trim() || "";
28
- if (selector.startsWith(`${selected.providerId}/`)) return true;
29
- const entry = registryEntries(registry).find(([id]) => id === selected.providerId)?.[1];
30
- const modelId = selected.modelId;
31
- return modelId !== void 0 && (entry?.model_map?.[modelId] !== void 0 || entry?.capabilities?.[modelId] !== void 0);
32
- }
33
- function renderCodexProviderTable(id, entry) {
34
- if (!isEntryEnabled(entry)) return { skipped: "entry is disabled" };
35
- if (entry.kind !== "llm" && entry.kind !== "embed")
36
- return { skipped: `kind '${entry.kind}' is not a model endpoint` };
37
- const llm = entry;
38
- const preset = entry.preset ? getProviderPreset(entry.preset) : void 0;
39
- const surface = llm.surface ?? preset?.surface;
40
- const wireApi = surface ? CODEX_WIRE_API[surface] : void 0;
41
- if (!wireApi)
42
- return {
43
- skipped: surface ? `codex has no wire_api for surface '${surface}'` : "entry declares no surface"
44
- };
45
- const credentialKind = entry.credential?.kind;
46
- const table = { name: entry.label ?? id };
47
- const baseUrl = resolveEntryBaseUrl(entry) ?? preset?.base_url;
48
- if (baseUrl) table.base_url = baseUrl;
49
- if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])
50
- table.env_key = providerCredentialEnvName(id);
51
- table.wire_api = wireApi;
52
- if (credentialKind === "oauth") table.requires_openai_auth = true;
53
- if (llm.query_params && Object.keys(llm.query_params).length > 0)
54
- table.query_params = { ...llm.query_params };
55
- if (entry.headers && Object.keys(entry.headers).length > 0)
56
- table.http_headers = { ...entry.headers };
57
- return { table };
58
- }
59
- function buildCodexConfigDocument(input) {
60
- const document = { model_providers: {} };
61
- const skipped = [];
62
- const entries = input.registry ? registryEntries(input.registry) : [];
63
- for (const [id, entry] of entries) {
64
- const rendered = renderCodexProviderTable(id, entry);
65
- if ("skipped" in rendered) skipped.push({ id, reason: rendered.skipped });
66
- else document.model_providers[codexProviderTableId(id)] = rendered.table;
67
- }
68
- if (!input.registry) return { document, skipped, warnings: [] };
69
- const selected = parseModelRef(
70
- input.modelRef?.trim() || input.model?.trim() || "",
71
- input.registry,
72
- input.roles
73
- );
74
- if (!selected) return { document, skipped, warnings: [] };
75
- const warnings = selected.warnings;
76
- const tableId = codexProviderTableId(selected.providerId);
77
- if (!document.model_providers[tableId]) {
78
- const reason = skipped.find((s) => s.id === selected.providerId)?.reason;
79
- if (reason && selectionNamesEntry(input, selected, input.registry)) {
80
- return {
81
- document,
82
- skipped,
83
- warnings,
84
- unaddressable: { id: selected.providerId, reason }
85
- };
86
- }
87
- return { document, skipped, warnings };
88
- }
89
- document.model_provider = tableId;
90
- if (selected.providerModelId) document.model = selected.providerModelId;
91
- return {
92
- document,
93
- providerId: selected.providerId,
94
- ...selected.providerModelId ? { model: selected.providerModelId } : {},
95
- skipped,
96
- warnings
97
- };
98
- }
99
- function renderCodexConfigToml(document) {
100
- const ordered = {};
101
- if (document.model_provider) ordered.model_provider = document.model_provider;
102
- if (document.model) ordered.model = document.model;
103
- ordered.model_providers = document.model_providers;
104
- return `${stringify(ordered)}
105
- `;
106
- }
107
- function codexSessionHome(config) {
108
- const key = config.sessionId && /^[A-Za-z0-9._-]{1,128}$/.test(config.sessionId) ? config.sessionId : createHash("sha256").update(config.sessionId ?? config.cwd).digest("hex").slice(0, 32);
109
- return join(globalSkaileDir(), "codex", key);
110
- }
111
- function writeCodexConfigToml(home, document) {
112
- const path = join(home, "config.toml");
113
- mkdirSync(home, { recursive: true, mode: 448 });
114
- if (Object.keys(document.model_providers).length === 0) {
115
- rmSync(path, { force: true });
116
- return void 0;
117
- }
118
- const temporary = join(home, "config.toml.new");
119
- rmSync(temporary, { force: true });
120
- writeFileSync(temporary, renderCodexConfigToml(document), { mode: 384, flag: "wx" });
121
- renameSync(temporary, path);
122
- return path;
123
- }
124
- function isChatgptLogin(file) {
125
- if (!file) return false;
126
- try {
127
- const doc = JSON.parse(readFileSync(file, "utf8"));
128
- return doc.auth_mode === "chatgpt";
129
- } catch {
130
- return false;
131
- }
132
- }
133
- function codexLoginFile(env) {
134
- const home = env.CODEX_HOME?.trim() || join(env.HOME || homedir(), ".codex");
135
- const file = join(home, "auth.json");
136
- return existsSync(file) ? resolve(file) : void 0;
137
- }
138
- function usesCodexOwnAuth(build, env, loginFile) {
139
- if (build.providerId !== "openai") return false;
140
- const table = build.document.model_providers[codexProviderTableId("openai")];
141
- if (!table?.env_key || table.requires_openai_auth || env[table.env_key]) return false;
142
- return Boolean(env.OPENAI_API_KEY || env.CODEX_API_KEY || loginFile);
143
- }
144
- function codexLoginFallbackNotice(session, env) {
145
- if (!session.registry) return void 0;
146
- const build = buildCodexConfigDocument({
147
- registry: session.registry,
148
- ...session.modelRef ? { modelRef: session.modelRef } : {}
149
- });
150
- if (!usesCodexOwnAuth(build, env, codexLoginFile(env))) return void 0;
151
- const unresolved = unresolvedProviderCredentials(session.registry, {
152
- env,
153
- providerId: "openai"
154
- })[0];
155
- return `provider 'openai' is not used: ${unresolved?.reason ?? "its credential is not set"}; codex uses its own login or OPENAI_API_KEY instead (check with \`skaile providers test openai\`)`;
156
- }
157
-
158
- export { buildCodexConfigDocument, codexLoginFallbackNotice, codexLoginFile, codexProviderTableId, codexSessionHome, isChatgptLogin, usesCodexOwnAuth, writeCodexConfigToml };
159
- //# sourceMappingURL=chunk-GYBDWW6K.js.map
160
- //# sourceMappingURL=chunk-GYBDWW6K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/codex/config-toml.ts","../bridge/src/codex/login-fallback.ts"],"names":["stringifyToml","join"],"mappings":"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","file":"chunk-GYBDWW6K.js","sourcesContent":["/**\n * Codex's `config.toml` adapter — the AI provider registry materialized into\n * the only provider surface the Codex CLI reads (plan §2.3, codex rows).\n *\n * Codex is a **file-shaped** harness: it takes its endpoints from\n * `$CODEX_HOME/config.toml`, never from per-request options. Both codex modes\n * therefore get a session-private `CODEX_HOME` holding a rendered document:\n *\n * - every addressable registry entry becomes `[model_providers.<id>]` with\n * `base_url`, `env_key`, `wire_api`, `query_params` and `http_headers`\n * mapping 1:1 onto the entry's `base_url`, `credential`, `surface`,\n * `query_params` and `headers`;\n * - `model_provider` and `model` at the top level name the selected entry.\n *\n * The rendered file never contains a credential **value** — `env_key` holds\n * the *name* of the per-entry variable (`SKAILE_AIP_<ID>_KEY`, minted by\n * {@link providerCredentialEnvName}), and the value rides in the child\n * environment. An `oauth` entry has no env carrier at all: it gets\n * `requires_openai_auth`, which routes codex to its own auth manager.\n *\n * **Surface coverage.** Codex names the wire protocol `wire_api` and, as of\n * codex-cli 0.154, accepts exactly one value: `responses`. `chat` was removed\n * (\"`wire_api = \\\"chat\\\"` is no longer supported\", openai/codex#7782), and an\n * unknown value fails the *whole* document at load time — one unaddressable\n * entry would take the rest of the registry down with it. Entries whose\n * surface codex cannot speak (`openai-completions`, `anthropic-messages`,\n * `bedrock-converse-stream`, `google-*`) are therefore left out and reported\n * in {@link CodexConfigBuild.skipped} for the harness to log.\n *\n * @docLink packages/bridge/harnesses#codex-harness\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mkdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { globalSkaileDir } from \"@skaile/workspaces/core\";\nimport {\n type AIProviderEntry,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n type AIProviderSurface,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n type ResolvedModelRef,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { stringify as stringifyToml } from \"smol-toml\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { providerCredentialEnvName } from \"../provider-materialize/credential-env.js\";\n\n/**\n * `surface` → codex `wire_api`. Only the responses-flavoured surfaces have a\n * codex spelling; see the module docstring for why `openai-completions` is\n * absent rather than mapped to the removed `chat` value.\n */\nconst CODEX_WIRE_API: Partial<Record<AIProviderSurface, string>> = {\n \"openai-codex-responses\": \"responses\",\n \"openai-responses\": \"responses\",\n \"azure-openai-responses\": \"responses\",\n};\n\n/**\n * Provider ids codex reserves for its own built-ins. A `[model_providers.<id>]`\n * table under one of them fails the whole document (\"model_providers contains\n * reserved built-in provider IDs\"), so such an entry is rendered under\n * {@link codexProviderTableId}.\n */\nconst CODEX_RESERVED_PROVIDER_IDS: ReadonlySet<string> = new Set([\"openai\", \"ollama\", \"lmstudio\"]);\n\n/**\n * The `[model_providers.<id>]` table name for a registry entry: the entry id,\n * or `skaile-<id>` when codex reserves that id (the `openai` preset).\n */\nexport function codexProviderTableId(id: string): string {\n return CODEX_RESERVED_PROVIDER_IDS.has(id) ? `skaile-${id}` : id;\n}\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** One `[model_providers.<id>]` table, in codex's own vocabulary. */\nexport interface CodexModelProviderTable {\n /** Display name. Codex rejects a provider table without one. */\n name: string;\n base_url?: string;\n /** Name of the variable carrying the credential — never the credential. */\n env_key?: string;\n wire_api?: string;\n /** Routes codex to its own auth manager (ChatGPT subscription / stored key). */\n requires_openai_auth?: boolean;\n query_params?: Record<string, string>;\n http_headers?: Record<string, string>;\n}\n\n/** The subset of codex's `config.toml` this adapter owns. */\nexport interface CodexConfigDocument {\n /** Table id the session addresses (see {@link codexProviderTableId}); absent when nothing rendered. */\n model_provider?: string;\n /** Provider-side model id. */\n model?: string;\n model_providers: Record<string, CodexModelProviderTable>;\n}\n\n/** An entry codex cannot address, and why. */\nexport interface CodexSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildCodexConfigDocument}. */\nexport interface CodexConfigBuild {\n document: CodexConfigDocument;\n /** Selected registry entry id (not the table id), when it rendered. */\n providerId?: string;\n /** Provider-side model id of the selection, when the selector named one. */\n model?: string;\n /**\n * Entries left out of the document. Non-fatal: codex keeps its built-in\n * providers, so a session whose selection was skipped behaves exactly as it\n * did before the registry existed.\n */\n skipped: CodexSkippedEntry[];\n /** Notes from `modelRef` resolution (dangling role, disabled provider, …). */\n warnings: string[];\n /**\n * Set when the selector named an entry codex cannot address: the session\n * must stop with `reason`, not fall back to codex's built-in providers.\n */\n unaddressable?: { id: string; reason: string };\n}\n\n/**\n * Whether the session's selector named the entry `selected` resolved to, rather\n * than reaching it by registry order alone.\n */\nfunction selectionNamesEntry(\n input: CodexConfigInput,\n selected: ResolvedModelRef,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): boolean {\n if (selected.role && selected.modelId !== undefined) return true;\n const selector = input.modelRef?.trim() || input.model?.trim() || \"\";\n if (selector.startsWith(`${selected.providerId}/`)) return true;\n const entry = registryEntries(registry).find(([id]) => id === selected.providerId)?.[1] as\n | AIProviderLlmEntry\n | undefined;\n const modelId = selected.modelId;\n return (\n modelId !== undefined &&\n (entry?.model_map?.[modelId] !== undefined || entry?.capabilities?.[modelId] !== undefined)\n );\n}\n\n/** Inputs {@link buildCodexConfigDocument} reads off an `AgentConfig`. */\nexport interface CodexConfigInput {\n registry?: AIProviderRegistry | MergedAIProviderRegistry;\n /** `\"<providerId>/<modelId>\"`, a bare model id, or `\"@role\"`. */\n modelRef?: string;\n /** Legacy model field, used as the selector when `modelRef` is absent. */\n model?: string;\n /** Roles table (`skaile.yaml`), consulted for an `@role` selector. */\n roles?: Record<string, string>;\n}\n\n/**\n * Render one entry as a codex provider table, or explain why codex cannot\n * address it.\n */\nexport function renderCodexProviderTable(\n id: string,\n entry: AIProviderEntry,\n): { table: CodexModelProviderTable } | { skipped: string } {\n if (!isEntryEnabled(entry)) return { skipped: \"entry is disabled\" };\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\")\n return { skipped: `kind '${entry.kind}' is not a model endpoint` };\n const llm = entry as AIProviderLlmEntry;\n // `surface` and `base_url` may live on the catalog preset the entry names —\n // the catalog layer fills them during a merge, but an entry handed straight\n // to a harness has not necessarily been through one.\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n const surface = llm.surface ?? preset?.surface;\n const wireApi = surface ? CODEX_WIRE_API[surface] : undefined;\n if (!wireApi)\n return {\n skipped: surface\n ? `codex has no wire_api for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const credentialKind = entry.credential?.kind;\n const table: CodexModelProviderTable = { name: entry.label ?? id };\n const baseUrl = resolveEntryBaseUrl(entry) ?? preset?.base_url;\n if (baseUrl) table.base_url = baseUrl;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n table.env_key = providerCredentialEnvName(id);\n table.wire_api = wireApi;\n if (credentialKind === \"oauth\") table.requires_openai_auth = true;\n if (llm.query_params && Object.keys(llm.query_params).length > 0)\n table.query_params = { ...llm.query_params };\n if (entry.headers && Object.keys(entry.headers).length > 0)\n table.http_headers = { ...entry.headers };\n return { table };\n}\n\n/**\n * Build the document for a session: every addressable entry, plus the\n * selection when it resolved to one of them.\n */\nexport function buildCodexConfigDocument(input: CodexConfigInput): CodexConfigBuild {\n const document: CodexConfigDocument = { model_providers: {} };\n const skipped: CodexSkippedEntry[] = [];\n const entries = input.registry ? registryEntries(input.registry) : [];\n for (const [id, entry] of entries) {\n const rendered = renderCodexProviderTable(id, entry);\n if (\"skipped\" in rendered) skipped.push({ id, reason: rendered.skipped });\n else document.model_providers[codexProviderTableId(id)] = rendered.table;\n }\n\n if (!input.registry) return { document, skipped, warnings: [] };\n // An empty selector resolves the same way a bare one does — first entry in\n // registry order. A session that configured an endpoint and named no model\n // still means that endpoint, not codex's built-in default.\n const selected = parseModelRef(\n input.modelRef?.trim() || input.model?.trim() || \"\",\n input.registry,\n input.roles,\n );\n if (!selected) return { document, skipped, warnings: [] };\n const warnings = selected.warnings;\n const tableId = codexProviderTableId(selected.providerId);\n if (!document.model_providers[tableId]) {\n // A selector that names the entry (`ollama/llama3`, a role or a model its\n // `model_map` lists) and cannot be rendered must not fall through to\n // codex's built-in OpenAI: the prompt would go to a provider the user did\n // not pick. A bare model id that matched no entry only landed on the first\n // entry by registry order, so codex's own providers stay the right answer.\n const reason = skipped.find((s) => s.id === selected.providerId)?.reason;\n if (reason && selectionNamesEntry(input, selected, input.registry)) {\n return {\n document,\n skipped,\n warnings,\n unaddressable: { id: selected.providerId, reason },\n };\n }\n return { document, skipped, warnings };\n }\n document.model_provider = tableId;\n if (selected.providerModelId) document.model = selected.providerModelId;\n return {\n document,\n providerId: selected.providerId,\n ...(selected.providerModelId ? { model: selected.providerModelId } : {}),\n skipped,\n warnings,\n };\n}\n\n/** Serialize a document to TOML. Deterministic: registry order throughout. */\nexport function renderCodexConfigToml(document: CodexConfigDocument): string {\n const ordered: Record<string, unknown> = {};\n if (document.model_provider) ordered.model_provider = document.model_provider;\n if (document.model) ordered.model = document.model;\n ordered.model_providers = document.model_providers;\n return `${stringifyToml(ordered)}\\n`;\n}\n\n/**\n * The session-private codex home.\n *\n * Deliberately outside `cwd`: codex's `workspace-write` sandbox makes the\n * working tree writable by the model, and a config home inside it would let a\n * turn rewrite its own `base_url`. `$SKAILE_HOME` (honoured by\n * {@link globalSkaileDir}) relocates the whole tree, which is also the test\n * seam.\n */\nexport function codexSessionHome(config: { cwd: string; sessionId?: string }): string {\n const key =\n config.sessionId && /^[A-Za-z0-9._-]{1,128}$/.test(config.sessionId)\n ? config.sessionId\n : createHash(\"sha256\")\n .update(config.sessionId ?? config.cwd)\n .digest(\"hex\")\n .slice(0, 32);\n return join(globalSkaileDir(), \"codex\", key);\n}\n\n/**\n * Write `<home>/config.toml`, creating the home always. Atomic: a\n * partially written document would fail codex's config load for the whole\n * session.\n *\n * A document with no provider tables says nothing codex does not already\n * know, so nothing is written and a file left by an earlier render is\n * removed — a session that no longer carries a registry must not keep\n * answering to the one it used to have.\n *\n * @returns the absolute path written, or `undefined` when there was nothing\n * to render.\n */\nexport function writeCodexConfigToml(\n home: string,\n document: CodexConfigDocument,\n): string | undefined {\n const path = join(home, \"config.toml\");\n // codex exits when CODEX_HOME names a directory that does not exist, so the\n // home exists before the early return too.\n mkdirSync(home, { recursive: true, mode: 0o700 });\n if (Object.keys(document.model_providers).length === 0) {\n rmSync(path, { force: true });\n return undefined;\n }\n const temporary = join(home, \"config.toml.new\");\n rmSync(temporary, { force: true });\n writeFileSync(temporary, renderCodexConfigToml(document), { mode: 0o600, flag: \"wx\" });\n renameSync(temporary, path);\n return path;\n}\n","/**\n * The codex CLI's own credentials, and when they stand in for the registry's `openai` entry.\n *\n * An `openai` registry entry whose key variable is not exported cannot be rendered as a working\n * `[model_providers.*]` table. The omp harness then answers with its own login; codex does the\n * same (p1871): it drops the entry and runs on codex's built-in `openai` provider, which uses\n * the ChatGPT login (`~/.codex/auth.json`) or an exported `OPENAI_API_KEY`. Every other entry\n * whose key is missing still refuses, naming the variable to export.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type {\n AIProviderRegistry,\n MergedAIProviderRegistry,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { unresolvedProviderCredentials } from \"../provider-materialize/credential-env.js\";\nimport {\n buildCodexConfigDocument,\n type CodexConfigBuild,\n codexProviderTableId,\n} from \"./config-toml.js\";\n\n/**\n * Whether the codex login file at `file` is a ChatGPT sign-in (`auth_mode: chatgpt`) and not a\n * stored API key. `false` for no file or one that does not parse.\n */\nexport function isChatgptLogin(file: string | undefined): boolean {\n if (!file) return false;\n try {\n const doc = JSON.parse(readFileSync(file, \"utf8\")) as { auth_mode?: unknown };\n return doc.auth_mode === \"chatgpt\";\n } catch {\n return false;\n }\n}\n\n/**\n * The codex CLI's ChatGPT login file (`$CODEX_HOME/auth.json`, default `~/.codex/auth.json`) of\n * the user's environment, or `undefined` when there is none. `env` is the parent environment,\n * not the session's: the session's `CODEX_HOME` is the private one, which has no login.\n */\nexport function codexLoginFile(env: Record<string, string | undefined>): string | undefined {\n const home = env.CODEX_HOME?.trim() || join(env.HOME || homedir(), \".codex\");\n const file = join(home, \"auth.json\");\n return existsSync(file) ? resolve(file) : undefined;\n}\n\n/**\n * Whether the session runs on codex's own auth instead of the selected `openai` registry entry:\n * the entry is selected, its key variable (`env_key` of the rendered table) is not set in `env`,\n * and codex has a login file or an exported key to use instead.\n *\n * @param build - The rendered codex config of the session.\n * @param env - The environment the child gets, credential variables included.\n * @param loginFile - The codex login file, when there is one.\n */\nexport function usesCodexOwnAuth(\n build: CodexConfigBuild,\n env: Record<string, string | undefined>,\n loginFile: string | undefined,\n): boolean {\n if (build.providerId !== \"openai\") return false;\n const table = build.document.model_providers[codexProviderTableId(\"openai\")];\n if (!table?.env_key || table.requires_openai_auth || env[table.env_key]) return false;\n return Boolean(env.OPENAI_API_KEY || env.CODEX_API_KEY || loginFile);\n}\n\n/**\n * The line `run` and `repl` print when a codex session falls back to codex's own auth because\n * the `openai` entry has no key (the `omp` line of the same kind, p1871), or `undefined`.\n *\n * @param session - The session's registry and model selector.\n * @param env - Process environment plus the session's credential variables.\n */\nexport function codexLoginFallbackNotice(\n session: { registry?: AIProviderRegistry | MergedAIProviderRegistry; modelRef?: string },\n env: Record<string, string | undefined>,\n): string | undefined {\n if (!session.registry) return undefined;\n const build = buildCodexConfigDocument({\n registry: session.registry,\n ...(session.modelRef ? { modelRef: session.modelRef } : {}),\n });\n if (!usesCodexOwnAuth(build, env, codexLoginFile(env))) return undefined;\n const unresolved = unresolvedProviderCredentials(session.registry, {\n env,\n providerId: \"openai\",\n })[0];\n return `provider 'openai' is not used: ${unresolved?.reason ?? \"its credential is not set\"}; codex uses its own login or OPENAI_API_KEY instead (check with \\`skaile providers test openai\\`)`;\n}\n"]}
@@ -1,357 +0,0 @@
1
- import { CODEX_NATIVE_STATE_FORMAT, CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
2
- import { registryEntries, isEntryEnabled, parseCredentialRef } from './chunk-RXGPFAMN.js';
3
- import { openSqlite } from './chunk-MDCI4RSG.js';
4
- import * as z from 'zod';
5
- import { createHash } from 'crypto';
6
- import { realpathSync, existsSync, lstatSync, chmodSync, rmSync, writeFileSync, renameSync, mkdirSync, readdirSync, readFileSync } from 'fs';
7
- import { isAbsolute, join, resolve, dirname, relative } from 'path';
8
-
9
- var identifier = z.string().min(1).max(4096);
10
- var timestamp = z.iso.datetime({ offset: true });
11
- var common = {
12
- configId: identifier,
13
- credentialVersion: z.number().int().nonnegative().safe(),
14
- mintedAt: timestamp
15
- };
16
- var subscription = z.strictObject({
17
- ...common,
18
- kind: z.literal("codex-subscription"),
19
- accessToken: z.string().min(1).max(65536),
20
- chatgptAccountId: identifier,
21
- chatgptPlanType: identifier.optional(),
22
- expiresAt: timestamp
23
- });
24
- var delivery = z.discriminatedUnion("kind", [
25
- subscription,
26
- z.strictObject({
27
- ...common,
28
- kind: z.literal("openai-api-key"),
29
- apiKey: z.string().min(1).max(65536)
30
- })
31
- ]);
32
- function parseCodexCredential(value, now = Date.now()) {
33
- const parsed = delivery.safeParse(value);
34
- if (!parsed.success) throw new Error("Invalid managed AI credential");
35
- const credential = parsed.data;
36
- const mintedAt = Date.parse(credential.mintedAt);
37
- if (mintedAt > now + 6e4 || credential.kind === "codex-subscription" && (Date.parse(credential.expiresAt) <= now || Date.parse(credential.expiresAt) <= mintedAt))
38
- throw new Error("Invalid managed AI credential timestamps");
39
- return credential;
40
- }
41
- function parseCodexRefreshInput(value, pinned) {
42
- const parsed = z.strictObject({
43
- kind: z.literal("codex-subscription"),
44
- configId: identifier,
45
- credentialVersion: common.credentialVersion,
46
- reason: z.enum(["initial", "refresh", "retry-401"])
47
- }).safeParse(value);
48
- if (!parsed.success || parsed.data.configId !== pinned.configId || parsed.data.credentialVersion !== pinned.credentialVersion)
49
- throw new Error("Invalid managed AI refresh binding");
50
- return parsed.data;
51
- }
52
- function parseCodexRefreshResult(value, pinned, now = Date.now()) {
53
- const parsed = z.discriminatedUnion("ok", [
54
- z.strictObject({ ok: z.literal(true), credential: subscription }),
55
- z.strictObject({
56
- ok: z.literal(false),
57
- code: z.enum(["not-configured", "revoked", "provider-error", "backend-error"]),
58
- message: z.string()
59
- })
60
- ]).safeParse(value);
61
- if (!parsed.success) throw new Error("Invalid managed AI refresh result");
62
- if (!parsed.data.ok) return { ...parsed.data, message: "Managed subscription refresh failed" };
63
- const credential = parseCodexCredential(parsed.data.credential, now);
64
- if (credential.kind !== "codex-subscription" || credential.configId !== pinned.configId || credential.chatgptAccountId !== pinned.chatgptAccountId || credential.credentialVersion < pinned.credentialVersion)
65
- throw new Error("Invalid managed AI refresh binding");
66
- return { ok: true, credential };
67
- }
68
- function managedCodexRegistryViolation(registry) {
69
- if (!registry) return void 0;
70
- const entries = registryEntries(registry);
71
- if (entries.length === 0) return void 0;
72
- if (entries.length > 1)
73
- return `registry carries ${entries.length} entries; managed codex admits exactly one`;
74
- const [id, entry] = entries[0];
75
- if (!isEntryEnabled(entry)) return `entry '${id}' is disabled`;
76
- if (entry.kind !== "llm") return `entry '${id}' is a '${entry.kind}' endpoint, not an llm one`;
77
- const surface = entry.surface;
78
- if (surface !== "openai-codex-responses")
79
- return `entry '${id}' declares surface '${surface ?? "none"}'; managed codex admits only openai-codex-responses`;
80
- const credential = entry.credential;
81
- if (credential?.kind !== "oauth")
82
- return `entry '${id}' carries a '${credential?.kind ?? "none"}' credential; managed codex admits only a platform-injected oauth credential`;
83
- const ref = credential.ref ? parseCredentialRef(credential.ref) : void 0;
84
- if (!ref || ref.form !== "platform")
85
- return `entry '${id}' resolves its credential outside the control plane; managed codex admits only a 'platform:' reference`;
86
- return void 0;
87
- }
88
- var invalid = () => new Error("AI_PROFILE_INVALID");
89
- var within = (path, root) => {
90
- const rel = relative(root, path);
91
- return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
92
- };
93
- function directory(path) {
94
- if (!existsSync(path)) mkdirSync(path, { mode: 448 });
95
- const stat = lstatSync(path);
96
- if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 63) throw invalid();
97
- }
98
- function readRegular(path, limit) {
99
- const stat = lstatSync(path);
100
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > limit) throw invalid();
101
- return readFileSync(path);
102
- }
103
- function prepareCodexInstance(config, options, credential) {
104
- if (!isAbsolute(options.privateDirectory) || !isAbsolute(config.cwd) || !config.sessionId)
105
- throw invalid();
106
- directory(options.privateDirectory);
107
- const root = realpathSync(options.privateDirectory);
108
- const cwd = realpathSync(config.cwd);
109
- if (within(root, cwd) || within(cwd, root)) throw invalid();
110
- const lock = join(root, ".active");
111
- const leasePath = join(root, "lease.db");
112
- if (existsSync(leasePath) && !lstatSync(leasePath).isFile()) throw invalid();
113
- const lease = openSqlite(leasePath);
114
- try {
115
- lease.exec("PRAGMA busy_timeout=0; BEGIN EXCLUSIVE");
116
- chmodSync(leasePath, 384);
117
- rmSync(lock, { force: true });
118
- writeFileSync(lock, "active", { flag: "wx", mode: 384 });
119
- } catch (error) {
120
- lease.close();
121
- throw error;
122
- }
123
- let released = false;
124
- const release = () => {
125
- if (released) return;
126
- released = true;
127
- try {
128
- rmSync(lock, { force: true });
129
- } finally {
130
- lease.close();
131
- }
132
- };
133
- try {
134
- const key = createHash("sha256").update(
135
- JSON.stringify({
136
- harness: "codex-app-server-v1",
137
- session: config.sessionId,
138
- config: credential.configId,
139
- kind: credential.kind,
140
- account: credential.kind === "codex-subscription" ? credential.chatgptAccountId : null
141
- })
142
- ).digest("hex");
143
- const slots = join(root, CODEX_NATIVE_STATE_FORMAT);
144
- directory(slots);
145
- const stateRoot = join(slots, key);
146
- directory(stateRoot);
147
- for (const name of ["instructions.new", "binding.new"])
148
- rmSync(join(stateRoot, name), { force: true });
149
- const bindingPath = join(stateRoot, "binding.json");
150
- if (config.resumeSessionId && !existsSync(bindingPath)) throw new CodexNativeStateUnavailable();
151
- if (existsSync(bindingPath)) {
152
- const bytes = readRegular(bindingPath, 4096);
153
- if (config.resumeSessionId) {
154
- let binding;
155
- try {
156
- binding = JSON.parse(bytes.toString("utf8"));
157
- } catch {
158
- throw new CodexNativeStateUnavailable();
159
- }
160
- if (!binding || typeof binding !== "object" || Array.isArray(binding) || Object.keys(binding).sort().join(",") !== "format,key,threadId" || binding.format !== CODEX_NATIVE_STATE_FORMAT || binding.key !== key || binding.threadId !== config.resumeSessionId)
161
- throw new CodexNativeStateUnavailable();
162
- }
163
- }
164
- const home = join(stateRoot, "home");
165
- if (config.resumeSessionId && !existsSync(home)) throw new CodexNativeStateUnavailable();
166
- directory(home);
167
- for (const subdir of ["config", "cache", "data", "tmp"]) directory(join(home, subdir));
168
- if (["auth.json", ".credentials.json"].some((name) => existsSync(join(home, name))))
169
- throw invalid();
170
- const instructionFile = join(stateRoot, "instructions.md");
171
- const instructions = [
172
- ...(options.instructionFiles ?? []).map(
173
- (path) => readRegular(path, 1024 * 1024).toString("utf8")
174
- ),
175
- ...config.systemPrompt ? [config.systemPrompt] : []
176
- ].join("\n\n---\n\n");
177
- const temporary = join(stateRoot, "instructions.new");
178
- writeFileSync(temporary, instructions, { mode: 384, flag: "wx" });
179
- renameSync(temporary, instructionFile);
180
- const target = join(home, "skills");
181
- if (!options.skillsDirectory && existsSync(target)) rmSync(target, { recursive: true });
182
- if (options.skillsDirectory) {
183
- const source = realpathSync(options.skillsDirectory);
184
- if (within(target, source) || within(source, target)) throw invalid();
185
- if (existsSync(target)) rmSync(target, { recursive: true });
186
- let files = 0;
187
- let entries = 0;
188
- let bytes = 0;
189
- const copy = (source2, destination) => {
190
- if (++entries > 1024) throw invalid();
191
- if (lstatSync(source2).isSymbolicLink()) throw invalid();
192
- mkdirSync(destination, { mode: 448 });
193
- for (const entry of readdirSync(source2, { withFileTypes: true })) {
194
- const src = join(source2, entry.name);
195
- const dst = join(destination, entry.name);
196
- if (entry.isSymbolicLink()) throw invalid();
197
- if (entry.isDirectory()) copy(src, dst);
198
- else {
199
- const content = readRegular(src, 1024 * 1024);
200
- bytes += content.byteLength;
201
- if (++files > 512 || bytes > 8 * 1024 * 1024) throw invalid();
202
- writeFileSync(dst, content, { mode: 384, flag: "wx" });
203
- }
204
- }
205
- };
206
- copy(options.skillsDirectory, target);
207
- }
208
- const bindThread = (threadId) => {
209
- if (!threadId || threadId.length > 4096) throw invalid();
210
- const next = join(stateRoot, "binding.new");
211
- writeFileSync(next, JSON.stringify({ format: CODEX_NATIVE_STATE_FORMAT, key, threadId }), {
212
- mode: 384,
213
- flag: "wx"
214
- });
215
- renameSync(next, bindingPath);
216
- };
217
- const setToolInstructions = (text) => {
218
- writeFileSync(temporary, `${instructions}
219
-
220
- ${text}`, { mode: 384, flag: "wx" });
221
- renameSync(temporary, instructionFile);
222
- };
223
- return {
224
- root,
225
- stateRoot,
226
- cwd,
227
- home,
228
- instructionFile,
229
- bindThread,
230
- release,
231
- setToolInstructions
232
- };
233
- } catch (error) {
234
- release();
235
- throw error;
236
- }
237
- }
238
- function codexInstanceEnvironment(input, home) {
239
- const allowed = /* @__PURE__ */ new Set([
240
- "PATH",
241
- "LANG",
242
- "LC_ALL",
243
- "TZ",
244
- "SSL_CERT_FILE",
245
- "SSL_CERT_DIR",
246
- "HTTPS_PROXY",
247
- "HTTP_PROXY",
248
- "NO_PROXY"
249
- ]);
250
- if (!input || Object.entries(input).some(([key, value]) => !allowed.has(key) || typeof value !== "string"))
251
- throw invalid();
252
- return {
253
- ...input,
254
- HOME: home,
255
- CODEX_HOME: home,
256
- XDG_CONFIG_HOME: join(home, "config"),
257
- XDG_CACHE_HOME: join(home, "cache"),
258
- XDG_DATA_HOME: join(home, "data"),
259
- TMPDIR: join(home, "tmp")
260
- };
261
- }
262
- var invalid2 = () => new Error("AI_PROFILE_INVALID");
263
- var record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
264
- var within2 = (child, parent) => {
265
- const rel = relative(parent, child);
266
- return rel === "" || !rel.startsWith("../") && rel !== ".." && !isAbsolute(rel);
267
- };
268
- var hasControl = (path) => [...path].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);
269
- var directory2 = (path) => {
270
- if (!isAbsolute(path) || hasControl(path)) throw invalid2();
271
- const stat = lstatSync(path);
272
- if (!stat.isDirectory() || stat.isSymbolicLink()) throw invalid2();
273
- return realpathSync(path);
274
- };
275
- function prepareNativePolicy(input) {
276
- const cwd = directory2(input.cwd);
277
- const privateRoot = directory2(input.privateRoot);
278
- const privateDirectory = directory2(input.privateDirectory);
279
- if (within2(cwd, privateRoot) || within2(privateRoot, cwd) || !within2(privateDirectory, privateRoot) || privateDirectory === privateRoot || input.sandboxMode !== "read-only" && input.sandboxMode !== "workspace-write")
280
- throw invalid2();
281
- const stat = lstatSync(privateRoot);
282
- if (stat.mode & 63 || process.getuid && stat.uid !== 0 && stat.uid !== process.getuid())
283
- throw invalid2();
284
- const filesystem = Object.freeze({
285
- [cwd]: input.sandboxMode === "workspace-write" ? "write" : "read",
286
- [privateRoot]: "deny"
287
- });
288
- const config = Object.freeze({
289
- default_permissions: "managed",
290
- features: Object.freeze({ use_legacy_landlock: false }),
291
- permissions: Object.freeze({
292
- managed: Object.freeze({
293
- extends: ":read-only",
294
- filesystem,
295
- network: Object.freeze({ enabled: false })
296
- })
297
- })
298
- });
299
- const profile = `{ managed = { extends = ":read-only", filesystem = { ${Object.entries(filesystem).map(([path, access]) => `${JSON.stringify(path)} = ${JSON.stringify(access)}`).join(", ")} }, network = { enabled = false } } }`;
300
- const policy = Object.freeze({
301
- config,
302
- cliArgs: Object.freeze([
303
- "-c",
304
- 'default_permissions="managed"',
305
- "-c",
306
- "features.use_legacy_landlock=false",
307
- "-c",
308
- `permissions=${profile}`
309
- ])
310
- });
311
- prepared.set(policy, { cwd, privateRoot, writable: input.sandboxMode === "workspace-write" });
312
- return policy;
313
- }
314
- var prepared = /* @__PURE__ */ new WeakMap();
315
- var active = /* @__PURE__ */ new WeakMap();
316
- function activateNativeApprovalPolicy(policy, response, signal) {
317
- const binding = prepared.get(policy);
318
- if (!binding || signal.aborted || !record(response) || !record(response.thread) || typeof response.thread.id !== "string" || !response.thread.id || response.cwd !== binding.cwd || !record(response.activePermissionProfile) || response.activePermissionProfile.id !== "managed" || response.activePermissionProfile.extends !== ":read-only")
319
- throw invalid2();
320
- const token = Object.freeze({});
321
- active.set(token, { ...binding, threadId: response.thread.id, signal });
322
- return token;
323
- }
324
- function isNativeApprovalPolicyActive(policy, threadId) {
325
- if (!record(policy)) return false;
326
- const binding = active.get(policy);
327
- return Boolean(binding && !binding.signal.aborted && binding.threadId === threadId);
328
- }
329
- function allowsNativeApprovalPath(policy, path, access) {
330
- if (!policy) return false;
331
- const binding = active.get(policy);
332
- if (!binding || binding.signal.aborted || !isAbsolute(path) || hasControl(path) || access !== "read" && access !== "write" || access === "write" && !binding.writable)
333
- return false;
334
- try {
335
- let existing = resolve(path);
336
- const suffix = [];
337
- while (true) {
338
- try {
339
- lstatSync(existing);
340
- break;
341
- } catch (error) {
342
- if (error.code !== "ENOENT" || dirname(existing) === existing)
343
- return false;
344
- suffix.unshift(existing.slice(dirname(existing).length + 1));
345
- existing = dirname(existing);
346
- }
347
- }
348
- const canonical = resolve(realpathSync(existing), ...suffix);
349
- return within2(canonical, binding.cwd) && !within2(canonical, binding.privateRoot);
350
- } catch {
351
- return false;
352
- }
353
- }
354
-
355
- export { activateNativeApprovalPolicy, allowsNativeApprovalPath, codexInstanceEnvironment, isNativeApprovalPolicyActive, managedCodexRegistryViolation, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult, prepareCodexInstance, prepareNativePolicy };
356
- //# sourceMappingURL=chunk-GYPPVANR.js.map
357
- //# sourceMappingURL=chunk-GYPPVANR.js.map