@skaile/workspaces 3.17.0 → 3.19.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 (273) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-FQT6GH24.js → asset-feeds-OO3NIRVI.js} +7 -7
  4. package/dist/{asset-feeds-FQT6GH24.js.map → asset-feeds-OO3NIRVI.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +3 -3
  6. package/dist/asset-manager/index.js +6 -6
  7. package/dist/asset-manager/installer.js +4 -4
  8. package/dist/bridge/codex-app-server.js +2 -203
  9. package/dist/bridge/codex-app-server.js.map +1 -1
  10. package/dist/bridge/drivers/claude-sdk.js +5 -5
  11. package/dist/bridge/drivers/codex.js +1238 -6
  12. package/dist/bridge/drivers/codex.js.map +1 -1
  13. package/dist/bridge/drivers/continue.js +2 -2
  14. package/dist/bridge/drivers/echo.js +2 -2
  15. package/dist/bridge/drivers/gemini.js +3 -3
  16. package/dist/bridge/drivers/goose.js +2 -2
  17. package/dist/bridge/drivers/omp.js +1 -1
  18. package/dist/bridge/drivers/opencode.js +2 -2
  19. package/dist/bridge/drivers/qwen.js +3 -3
  20. package/dist/bridge/index.js +7 -6
  21. package/dist/bridge/src/capability-dispatch.d.ts +1 -1
  22. package/dist/bridge/src/capability-dispatch.d.ts.map +1 -1
  23. package/dist/bridge/src/codex/credentials.d.ts +12 -0
  24. package/dist/bridge/src/codex/credentials.d.ts.map +1 -0
  25. package/dist/bridge/src/codex/inputs.d.ts +8 -0
  26. package/dist/bridge/src/codex/inputs.d.ts.map +1 -0
  27. package/dist/bridge/src/codex/instance-state.d.ts +16 -0
  28. package/dist/bridge/src/codex/instance-state.d.ts.map +1 -0
  29. package/dist/bridge/src/codex/managed-driver.d.ts +73 -0
  30. package/dist/bridge/src/codex/managed-driver.d.ts.map +1 -0
  31. package/dist/bridge/src/codex/native-approvals.d.ts +22 -0
  32. package/dist/bridge/src/codex/native-approvals.d.ts.map +1 -0
  33. package/dist/bridge/src/codex/native-mcp-approval.d.ts +13 -0
  34. package/dist/bridge/src/codex/native-mcp-approval.d.ts.map +1 -0
  35. package/dist/bridge/src/codex/native-policy.d.ts +38 -0
  36. package/dist/bridge/src/codex/native-policy.d.ts.map +1 -0
  37. package/dist/bridge/src/codex/native-protocol.generated.d.ts +291 -201
  38. package/dist/bridge/src/codex/native-protocol.generated.d.ts.map +1 -1
  39. package/dist/bridge/src/codex/native-state.d.ts +7 -0
  40. package/dist/bridge/src/codex/native-state.d.ts.map +1 -0
  41. package/dist/bridge/src/codex/questions.d.ts +19 -0
  42. package/dist/bridge/src/codex/questions.d.ts.map +1 -0
  43. package/dist/bridge/src/codex-app-server.d.ts +8 -1
  44. package/dist/bridge/src/codex-app-server.d.ts.map +1 -1
  45. package/dist/bridge/src/drivers/codex.d.ts +9 -1
  46. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  47. package/dist/bridge/src/index.d.ts +1 -0
  48. package/dist/bridge/src/index.d.ts.map +1 -1
  49. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  50. package/dist/bridge/src/runtime.d.ts +3 -2
  51. package/dist/bridge/src/runtime.d.ts.map +1 -1
  52. package/dist/bridge/src/types.d.ts +83 -4
  53. package/dist/bridge/src/types.d.ts.map +1 -1
  54. package/dist/{chunk-BCOGOM6F.js → chunk-23L3P7IB.js} +4 -4
  55. package/dist/{chunk-BCOGOM6F.js.map → chunk-23L3P7IB.js.map} +1 -1
  56. package/dist/{chunk-NC5YXVZF.js → chunk-2FDKUKDE.js} +3 -3
  57. package/dist/{chunk-NC5YXVZF.js.map → chunk-2FDKUKDE.js.map} +1 -1
  58. package/dist/{chunk-CMGYUF5P.js → chunk-34RUVLL6.js} +7 -7
  59. package/dist/{chunk-CMGYUF5P.js.map → chunk-34RUVLL6.js.map} +1 -1
  60. package/dist/{chunk-EXT2LNST.js → chunk-3BOWST5G.js} +125 -37
  61. package/dist/chunk-3BOWST5G.js.map +1 -0
  62. package/dist/{chunk-BUKPS4YL.js → chunk-4JDCKPTM.js} +2 -2
  63. package/dist/{chunk-BUKPS4YL.js.map → chunk-4JDCKPTM.js.map} +1 -1
  64. package/dist/{chunk-5KSIVLOX.js → chunk-5T7Y3AZU.js} +3 -3
  65. package/dist/{chunk-5KSIVLOX.js.map → chunk-5T7Y3AZU.js.map} +1 -1
  66. package/dist/{chunk-HEKLK4NG.js → chunk-5Y4RBNT2.js} +6 -6
  67. package/dist/{chunk-HEKLK4NG.js.map → chunk-5Y4RBNT2.js.map} +1 -1
  68. package/dist/{chunk-PYX4WZLJ.js → chunk-7ECAUWFU.js} +9 -9
  69. package/dist/{chunk-PYX4WZLJ.js.map → chunk-7ECAUWFU.js.map} +1 -1
  70. package/dist/{chunk-QFYEDM63.js → chunk-7J4W54DV.js} +5 -5
  71. package/dist/{chunk-QFYEDM63.js.map → chunk-7J4W54DV.js.map} +1 -1
  72. package/dist/{chunk-RRVQAE5D.js → chunk-7ZO3MUP3.js} +6 -5
  73. package/dist/chunk-7ZO3MUP3.js.map +1 -0
  74. package/dist/{chunk-HY6CIKFH.js → chunk-CP62G5PK.js} +8 -7
  75. package/dist/chunk-CP62G5PK.js.map +1 -0
  76. package/dist/{chunk-OIDFK7SG.js → chunk-DCG4UWJM.js} +3 -3
  77. package/dist/{chunk-OIDFK7SG.js.map → chunk-DCG4UWJM.js.map} +1 -1
  78. package/dist/{chunk-RTM4SFLA.js → chunk-GMKNGIIB.js} +7 -4
  79. package/dist/chunk-GMKNGIIB.js.map +1 -0
  80. package/dist/{chunk-CIPK5JMJ.js → chunk-H662SXKS.js} +4 -4
  81. package/dist/{chunk-CIPK5JMJ.js.map → chunk-H662SXKS.js.map} +1 -1
  82. package/dist/{chunk-VT4MPCRK.js → chunk-HFL3PYJ7.js} +3 -3
  83. package/dist/{chunk-VT4MPCRK.js.map → chunk-HFL3PYJ7.js.map} +1 -1
  84. package/dist/{chunk-NMAICJUA.js → chunk-IST2V7RU.js} +3 -3
  85. package/dist/{chunk-NMAICJUA.js.map → chunk-IST2V7RU.js.map} +1 -1
  86. package/dist/{chunk-ZNCZ7RUO.js → chunk-JVFZ5R7L.js} +3 -3
  87. package/dist/{chunk-ZNCZ7RUO.js.map → chunk-JVFZ5R7L.js.map} +1 -1
  88. package/dist/{chunk-FRER2PEN.js → chunk-KB2GC6YY.js} +16 -3
  89. package/dist/chunk-KB2GC6YY.js.map +1 -0
  90. package/dist/chunk-LOO5CB5M.js +12 -0
  91. package/dist/chunk-LOO5CB5M.js.map +1 -0
  92. package/dist/{chunk-AL6BU3SP.js → chunk-OJ4N4T4H.js} +12 -4
  93. package/dist/chunk-OJ4N4T4H.js.map +1 -0
  94. package/dist/{chunk-X7FJ3ES3.js → chunk-OLRKNOO2.js} +4 -4
  95. package/dist/{chunk-X7FJ3ES3.js.map → chunk-OLRKNOO2.js.map} +1 -1
  96. package/dist/chunk-PHBYB4XT.js +247 -0
  97. package/dist/chunk-PHBYB4XT.js.map +1 -0
  98. package/dist/{chunk-EO7IJY3Q.js → chunk-PWBURVRH.js} +3 -3
  99. package/dist/{chunk-EO7IJY3Q.js.map → chunk-PWBURVRH.js.map} +1 -1
  100. package/dist/chunk-QEZPFJX3.js +254 -0
  101. package/dist/chunk-QEZPFJX3.js.map +1 -0
  102. package/dist/{chunk-C4AP3XZB.js → chunk-QG2ZXU5W.js} +4 -4
  103. package/dist/{chunk-C4AP3XZB.js.map → chunk-QG2ZXU5W.js.map} +1 -1
  104. package/dist/{chunk-OZ7UNMTK.js → chunk-RPVTPVGX.js} +7 -5
  105. package/dist/chunk-RPVTPVGX.js.map +1 -0
  106. package/dist/{chunk-S4UA244H.js → chunk-S635WMXH.js} +4 -4
  107. package/dist/{chunk-S4UA244H.js.map → chunk-S635WMXH.js.map} +1 -1
  108. package/dist/{chunk-2XGFQKNJ.js → chunk-SBDTLR3Q.js} +2 -2
  109. package/dist/{chunk-2XGFQKNJ.js.map → chunk-SBDTLR3Q.js.map} +1 -1
  110. package/dist/{chunk-BQMRUH7J.js → chunk-SFCVAEJ5.js} +4 -4
  111. package/dist/{chunk-BQMRUH7J.js.map → chunk-SFCVAEJ5.js.map} +1 -1
  112. package/dist/{chunk-KCI7DAKE.js → chunk-SZ3HIMSX.js} +988 -238
  113. package/dist/chunk-SZ3HIMSX.js.map +1 -0
  114. package/dist/chunk-T3YLZQS4.js +336 -0
  115. package/dist/chunk-T3YLZQS4.js.map +1 -0
  116. package/dist/{chunk-PBRMY64S.js → chunk-WB4EWSDR.js} +31 -9
  117. package/dist/chunk-WB4EWSDR.js.map +1 -0
  118. package/dist/{chunk-SUPIVTLX.js → chunk-XL45U3C5.js} +3 -3
  119. package/dist/{chunk-SUPIVTLX.js.map → chunk-XL45U3C5.js.map} +1 -1
  120. package/dist/{chunk-AXEOG4B5.js → chunk-YCMHWNZA.js} +3 -3
  121. package/dist/{chunk-AXEOG4B5.js.map → chunk-YCMHWNZA.js.map} +1 -1
  122. package/dist/{chunk-SWUVULBU.js → chunk-YLSMYOHN.js} +7 -7
  123. package/dist/{chunk-SWUVULBU.js.map → chunk-YLSMYOHN.js.map} +1 -1
  124. package/dist/{chunk-NIQPSQFN.js → chunk-YWGL52GT.js} +4 -4
  125. package/dist/{chunk-NIQPSQFN.js.map → chunk-YWGL52GT.js.map} +1 -1
  126. package/dist/cli/index.js +75 -53
  127. package/dist/cli/index.js.map +1 -1
  128. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  129. package/dist/client/index.js +1 -1
  130. package/dist/client/src/client.d.ts +3 -2
  131. package/dist/client/src/client.d.ts.map +1 -1
  132. package/dist/connectors/config.js +4 -4
  133. package/dist/connectors/index.js +12 -11
  134. package/dist/connectors/src/connector-prompt.d.ts +11 -0
  135. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  136. package/dist/core/index.js +3 -3
  137. package/dist/core/runtime-assets.js +2 -2
  138. package/dist/core/src/workspace-config.d.ts.map +1 -1
  139. package/dist/core/workspace-config.js +1 -1
  140. package/dist/deploy/index.js +3 -3
  141. package/dist/{ensure-sources-4GBXK6UR.js → ensure-sources-PR7YN3HV.js} +9 -9
  142. package/dist/{ensure-sources-4GBXK6UR.js.map → ensure-sources-PR7YN3HV.js.map} +1 -1
  143. package/dist/factory-assets/connectors/box.js +12 -11
  144. package/dist/factory-assets/connectors/deploy.js +12 -11
  145. package/dist/factory-assets/connectors/devserver.js +12 -11
  146. package/dist/factory-assets/connectors/flow/CONNECTOR.md +4 -5
  147. package/dist/factory-assets/connectors/flow/adapter.d.ts +8 -0
  148. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  149. package/dist/factory-assets/connectors/flow/adapter.js +12 -11
  150. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
  151. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  152. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +50 -17
  153. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  154. package/dist/factory-assets/connectors/flow/contract.js +3 -3
  155. package/dist/factory-assets/connectors/flow/engine/index.d.ts +1 -0
  156. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  157. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  158. package/dist/factory-assets/connectors/flow/run-flow.js +13 -12
  159. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +10 -1
  160. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
  161. package/dist/factory-assets/connectors/flow.js +12 -11
  162. package/dist/factory-assets/connectors/git.js +12 -11
  163. package/dist/factory-assets/connectors/gmail.js +12 -11
  164. package/dist/factory-assets/connectors/googledrive.js +12 -11
  165. package/dist/factory-assets/connectors/local.js +12 -11
  166. package/dist/factory-assets/connectors/mattermost.js +12 -11
  167. package/dist/factory-assets/connectors/memory.js +12 -11
  168. package/dist/factory-assets/connectors/minio.js +12 -11
  169. package/dist/factory-assets/connectors/postgres.js +12 -11
  170. package/dist/factory-assets/connectors/s3.js +12 -11
  171. package/dist/factory-assets/connectors/sharepoint.js +12 -11
  172. package/dist/factory-assets/connectors/sqlite.js +12 -11
  173. package/dist/factory-assets/connectors/static-server.js +12 -11
  174. package/dist/factory-assets/connectors/tunnel.js +12 -11
  175. package/dist/factory-assets/connectors/webdav.js +12 -11
  176. package/dist/factory-assets/connectors/xstate-store.js +12 -11
  177. package/dist/factory-assets/connectors/xstate.js +12 -11
  178. package/dist/{flows-2SUFOVVO.js → flows-COBS26MK.js} +6 -6
  179. package/dist/{flows-2SUFOVVO.js.map → flows-COBS26MK.js.map} +1 -1
  180. package/dist/{helpers-26LW4IXY.js → helpers-TFSZSWT5.js} +9 -9
  181. package/dist/{helpers-26LW4IXY.js.map → helpers-TFSZSWT5.js.map} +1 -1
  182. package/dist/library/index.js +4 -4
  183. package/dist/library/install.js +3 -3
  184. package/dist/{library-publish-IYGHOPEK.js → library-publish-WVIUUYG3.js} +14 -14
  185. package/dist/{library-publish-IYGHOPEK.js.map → library-publish-WVIUUYG3.js.map} +1 -1
  186. package/dist/{open-library-HH5LST7Z.js → open-library-2AWZGIWE.js} +12 -12
  187. package/dist/{open-library-HH5LST7Z.js.map → open-library-2AWZGIWE.js.map} +1 -1
  188. package/dist/{paths-4APA2PKT.js → paths-CZPCCBYX.js} +6 -6
  189. package/dist/{paths-4APA2PKT.js.map → paths-CZPCCBYX.js.map} +1 -1
  190. package/dist/{plugin-store-JQAIKR3R.js → plugin-store-ZEIBSNTO.js} +5 -5
  191. package/dist/{plugin-store-JQAIKR3R.js.map → plugin-store-ZEIBSNTO.js.map} +1 -1
  192. package/dist/{project-U5QRUCBN.js → project-XZDKNIRG.js} +10 -10
  193. package/dist/{project-U5QRUCBN.js.map → project-XZDKNIRG.js.map} +1 -1
  194. package/dist/resolver/index.js +3 -3
  195. package/dist/runner/index.js +25 -16
  196. package/dist/runner/src/capability-registry.d.ts +4 -0
  197. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  198. package/dist/runner/src/codex-init.d.ts +2 -11
  199. package/dist/runner/src/codex-init.d.ts.map +1 -1
  200. package/dist/runner/src/codex-resource-tools.d.ts +16 -0
  201. package/dist/runner/src/codex-resource-tools.d.ts.map +1 -0
  202. package/dist/runner/src/codex-tools.d.ts +12 -0
  203. package/dist/runner/src/codex-tools.d.ts.map +1 -0
  204. package/dist/runner/src/define-capability.d.ts +2 -0
  205. package/dist/runner/src/define-capability.d.ts.map +1 -1
  206. package/dist/runner/src/external-mcp.d.ts +8 -3
  207. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  208. package/dist/runner/src/index.d.ts +2 -0
  209. package/dist/runner/src/index.d.ts.map +1 -1
  210. package/dist/runner/src/managed-codex-bootstrap.d.ts +54 -0
  211. package/dist/runner/src/managed-codex-bootstrap.d.ts.map +1 -0
  212. package/dist/runner/src/resources.d.ts +1 -0
  213. package/dist/runner/src/resources.d.ts.map +1 -1
  214. package/dist/runner/src/serve.d.ts +5 -0
  215. package/dist/runner/src/serve.d.ts.map +1 -1
  216. package/dist/runner/src/session-builder.d.ts +18 -1
  217. package/dist/runner/src/session-builder.d.ts.map +1 -1
  218. package/dist/sdk/asset-manager.js +6 -6
  219. package/dist/sdk/bridge.js +7 -6
  220. package/dist/sdk/client.js +1 -1
  221. package/dist/sdk/core.js +3 -3
  222. package/dist/sdk/flow.js +5 -5
  223. package/dist/sdk/index.js +26 -17
  224. package/dist/sdk/index.js.map +1 -1
  225. package/dist/sdk/resolver.js +3 -3
  226. package/dist/sdk/runner.js +25 -16
  227. package/dist/sdk/session.js +2 -2
  228. package/dist/sdk/store.js +1 -1
  229. package/dist/sdk/types.js +1 -1
  230. package/dist/session/index.js +2 -2
  231. package/dist/{setup-XKTBHRWM.js → setup-J34TR5IR.js} +9 -8
  232. package/dist/setup-J34TR5IR.js.map +1 -0
  233. package/dist/{skills-Q7PJVB3W.js → skills-LG6IQSSN.js} +5 -5
  234. package/dist/{skills-Q7PJVB3W.js.map → skills-LG6IQSSN.js.map} +1 -1
  235. package/dist/{source-ODR4IU6R.js → source-QYINHHUP.js} +13 -13
  236. package/dist/{source-ODR4IU6R.js.map → source-QYINHHUP.js.map} +1 -1
  237. package/dist/{source-manifest-publish-WCJY3GAM.js → source-manifest-publish-3RBW5E2O.js} +15 -15
  238. package/dist/{source-manifest-publish-WCJY3GAM.js.map → source-manifest-publish-3RBW5E2O.js.map} +1 -1
  239. package/dist/store/index.js +1 -1
  240. package/dist/store/react.js +1 -1
  241. package/dist/store/react.js.map +1 -1
  242. package/dist/store/src/react.d.ts +1 -1
  243. package/dist/store/src/react.d.ts.map +1 -1
  244. package/dist/store/src/store.d.ts +2 -1
  245. package/dist/store/src/store.d.ts.map +1 -1
  246. package/dist/tui/index.js +25 -16
  247. package/dist/tui/index.js.map +1 -1
  248. package/dist/types/index.js +1 -1
  249. package/dist/types/src/events.d.ts +14 -1
  250. package/dist/types/src/events.d.ts.map +1 -1
  251. package/dist/types/src/index.d.ts +2 -2
  252. package/dist/types/src/index.d.ts.map +1 -1
  253. package/dist/types/src/protocol.d.ts +18 -0
  254. package/dist/types/src/protocol.d.ts.map +1 -1
  255. package/dist/types/src/runtime.d.ts +3 -1
  256. package/dist/types/src/runtime.d.ts.map +1 -1
  257. package/dist/types/src/version.d.ts +7 -1
  258. package/dist/types/src/version.d.ts.map +1 -1
  259. package/dist/workspace-plugin/adapters/mcp.js +9 -255
  260. package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
  261. package/dist/workspace-plugin/adapters/omp.js +7 -7
  262. package/dist/workspace-plugin/index.js +1 -1
  263. package/package.json +4 -1
  264. package/dist/chunk-AL6BU3SP.js.map +0 -1
  265. package/dist/chunk-EXT2LNST.js.map +0 -1
  266. package/dist/chunk-FRER2PEN.js.map +0 -1
  267. package/dist/chunk-HY6CIKFH.js.map +0 -1
  268. package/dist/chunk-KCI7DAKE.js.map +0 -1
  269. package/dist/chunk-OZ7UNMTK.js.map +0 -1
  270. package/dist/chunk-PBRMY64S.js.map +0 -1
  271. package/dist/chunk-RRVQAE5D.js.map +0 -1
  272. package/dist/chunk-RTM4SFLA.js.map +0 -1
  273. package/dist/setup-XKTBHRWM.js.map +0 -1
@@ -0,0 +1,336 @@
1
+ import { CODEX_NATIVE_STATE_FORMAT, CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
2
+ import { openSqlite } from './chunk-FTG7CRFD.js';
3
+ import { lstatSync, realpathSync, existsSync, chmodSync, rmSync, writeFileSync, renameSync, mkdirSync, readdirSync, readFileSync } from 'fs';
4
+ import { isAbsolute, resolve, dirname, join, relative } from 'path';
5
+ import * as z from 'zod';
6
+ import { createHash } from 'crypto';
7
+
8
+ var invalid = () => new Error("AI_PROFILE_INVALID");
9
+ var record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
10
+ var within = (child, parent) => {
11
+ const rel = relative(parent, child);
12
+ return rel === "" || !rel.startsWith("../") && rel !== ".." && !isAbsolute(rel);
13
+ };
14
+ var hasControl = (path) => [...path].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);
15
+ var directory = (path) => {
16
+ if (!isAbsolute(path) || hasControl(path)) throw invalid();
17
+ const stat = lstatSync(path);
18
+ if (!stat.isDirectory() || stat.isSymbolicLink()) throw invalid();
19
+ return realpathSync(path);
20
+ };
21
+ function prepareNativePolicy(input) {
22
+ const cwd = directory(input.cwd);
23
+ const privateRoot = directory(input.privateRoot);
24
+ const privateDirectory = directory(input.privateDirectory);
25
+ if (within(cwd, privateRoot) || within(privateRoot, cwd) || !within(privateDirectory, privateRoot) || privateDirectory === privateRoot || input.sandboxMode !== "read-only" && input.sandboxMode !== "workspace-write")
26
+ throw invalid();
27
+ const stat = lstatSync(privateRoot);
28
+ if (stat.mode & 63 || process.getuid && stat.uid !== 0 && stat.uid !== process.getuid())
29
+ throw invalid();
30
+ const filesystem = Object.freeze({
31
+ [cwd]: input.sandboxMode === "workspace-write" ? "write" : "read",
32
+ [privateRoot]: "deny"
33
+ });
34
+ const config = Object.freeze({
35
+ default_permissions: "managed",
36
+ features: Object.freeze({ use_legacy_landlock: false }),
37
+ permissions: Object.freeze({
38
+ managed: Object.freeze({
39
+ extends: ":read-only",
40
+ filesystem,
41
+ network: Object.freeze({ enabled: false })
42
+ })
43
+ })
44
+ });
45
+ const profile = `{ managed = { extends = ":read-only", filesystem = { ${Object.entries(filesystem).map(([path, access]) => `${JSON.stringify(path)} = ${JSON.stringify(access)}`).join(", ")} }, network = { enabled = false } } }`;
46
+ const policy = Object.freeze({
47
+ config,
48
+ cliArgs: Object.freeze([
49
+ "-c",
50
+ 'default_permissions="managed"',
51
+ "-c",
52
+ "features.use_legacy_landlock=false",
53
+ "-c",
54
+ `permissions=${profile}`
55
+ ])
56
+ });
57
+ prepared.set(policy, { cwd, privateRoot, writable: input.sandboxMode === "workspace-write" });
58
+ return policy;
59
+ }
60
+ var prepared = /* @__PURE__ */ new WeakMap();
61
+ var active = /* @__PURE__ */ new WeakMap();
62
+ function activateNativeApprovalPolicy(policy, response, signal) {
63
+ const binding = prepared.get(policy);
64
+ 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")
65
+ throw invalid();
66
+ const token = Object.freeze({});
67
+ active.set(token, { ...binding, threadId: response.thread.id, signal });
68
+ return token;
69
+ }
70
+ function isNativeApprovalPolicyActive(policy, threadId) {
71
+ if (!record(policy)) return false;
72
+ const binding = active.get(policy);
73
+ return Boolean(binding && !binding.signal.aborted && binding.threadId === threadId);
74
+ }
75
+ function allowsNativeApprovalPath(policy, path, access) {
76
+ if (!policy) return false;
77
+ const binding = active.get(policy);
78
+ if (!binding || binding.signal.aborted || !isAbsolute(path) || hasControl(path) || access !== "read" && access !== "write" || access === "write" && !binding.writable)
79
+ return false;
80
+ try {
81
+ let existing = resolve(path);
82
+ const suffix = [];
83
+ while (true) {
84
+ try {
85
+ lstatSync(existing);
86
+ break;
87
+ } catch (error) {
88
+ if (error.code !== "ENOENT" || dirname(existing) === existing)
89
+ return false;
90
+ suffix.unshift(existing.slice(dirname(existing).length + 1));
91
+ existing = dirname(existing);
92
+ }
93
+ }
94
+ const canonical = resolve(realpathSync(existing), ...suffix);
95
+ return within(canonical, binding.cwd) && !within(canonical, binding.privateRoot);
96
+ } catch {
97
+ return false;
98
+ }
99
+ }
100
+ var identifier = z.string().min(1).max(4096);
101
+ var timestamp = z.iso.datetime({ offset: true });
102
+ var common = {
103
+ configId: identifier,
104
+ credentialVersion: z.number().int().nonnegative().safe(),
105
+ mintedAt: timestamp
106
+ };
107
+ var subscription = z.strictObject({
108
+ ...common,
109
+ kind: z.literal("codex-subscription"),
110
+ accessToken: z.string().min(1).max(65536),
111
+ chatgptAccountId: identifier,
112
+ chatgptPlanType: identifier.optional(),
113
+ expiresAt: timestamp
114
+ });
115
+ var delivery = z.discriminatedUnion("kind", [
116
+ subscription,
117
+ z.strictObject({
118
+ ...common,
119
+ kind: z.literal("openai-api-key"),
120
+ apiKey: z.string().min(1).max(65536)
121
+ })
122
+ ]);
123
+ function parseCodexCredential(value, now = Date.now()) {
124
+ const parsed = delivery.safeParse(value);
125
+ if (!parsed.success) throw new Error("Invalid managed AI credential");
126
+ const credential = parsed.data;
127
+ const mintedAt = Date.parse(credential.mintedAt);
128
+ if (mintedAt > now + 6e4 || credential.kind === "codex-subscription" && (Date.parse(credential.expiresAt) <= now || Date.parse(credential.expiresAt) <= mintedAt))
129
+ throw new Error("Invalid managed AI credential timestamps");
130
+ return credential;
131
+ }
132
+ function parseCodexRefreshInput(value, pinned) {
133
+ const parsed = z.strictObject({
134
+ kind: z.literal("codex-subscription"),
135
+ configId: identifier,
136
+ credentialVersion: common.credentialVersion,
137
+ reason: z.enum(["initial", "refresh", "retry-401"])
138
+ }).safeParse(value);
139
+ if (!parsed.success || parsed.data.configId !== pinned.configId || parsed.data.credentialVersion !== pinned.credentialVersion)
140
+ throw new Error("Invalid managed AI refresh binding");
141
+ return parsed.data;
142
+ }
143
+ function parseCodexRefreshResult(value, pinned, now = Date.now()) {
144
+ const parsed = z.discriminatedUnion("ok", [
145
+ z.strictObject({ ok: z.literal(true), credential: subscription }),
146
+ z.strictObject({
147
+ ok: z.literal(false),
148
+ code: z.enum(["not-configured", "revoked", "provider-error", "backend-error"]),
149
+ message: z.string()
150
+ })
151
+ ]).safeParse(value);
152
+ if (!parsed.success) throw new Error("Invalid managed AI refresh result");
153
+ if (!parsed.data.ok) return { ...parsed.data, message: "Managed subscription refresh failed" };
154
+ const credential = parseCodexCredential(parsed.data.credential, now);
155
+ if (credential.kind !== "codex-subscription" || credential.configId !== pinned.configId || credential.chatgptAccountId !== pinned.chatgptAccountId || credential.credentialVersion < pinned.credentialVersion)
156
+ throw new Error("Invalid managed AI refresh binding");
157
+ return { ok: true, credential };
158
+ }
159
+ var invalid2 = () => new Error("AI_PROFILE_INVALID");
160
+ var within2 = (path, root) => {
161
+ const rel = relative(root, path);
162
+ return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
163
+ };
164
+ function directory2(path) {
165
+ if (!existsSync(path)) mkdirSync(path, { mode: 448 });
166
+ const stat = lstatSync(path);
167
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 63) throw invalid2();
168
+ }
169
+ function readRegular(path, limit) {
170
+ const stat = lstatSync(path);
171
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > limit) throw invalid2();
172
+ return readFileSync(path);
173
+ }
174
+ function prepareCodexInstance(config, options, credential) {
175
+ if (!isAbsolute(options.privateDirectory) || !isAbsolute(config.cwd) || !config.sessionId)
176
+ throw invalid2();
177
+ directory2(options.privateDirectory);
178
+ const root = realpathSync(options.privateDirectory);
179
+ const cwd = realpathSync(config.cwd);
180
+ if (within2(root, cwd) || within2(cwd, root)) throw invalid2();
181
+ const lock = join(root, ".active");
182
+ const leasePath = join(root, "lease.db");
183
+ if (existsSync(leasePath) && !lstatSync(leasePath).isFile()) throw invalid2();
184
+ const lease = openSqlite(leasePath);
185
+ try {
186
+ lease.exec("PRAGMA busy_timeout=0; BEGIN EXCLUSIVE");
187
+ chmodSync(leasePath, 384);
188
+ rmSync(lock, { force: true });
189
+ writeFileSync(lock, "active", { flag: "wx", mode: 384 });
190
+ } catch (error) {
191
+ lease.close();
192
+ throw error;
193
+ }
194
+ let released = false;
195
+ const release = () => {
196
+ if (released) return;
197
+ released = true;
198
+ try {
199
+ rmSync(lock, { force: true });
200
+ } finally {
201
+ lease.close();
202
+ }
203
+ };
204
+ try {
205
+ const key = createHash("sha256").update(
206
+ JSON.stringify({
207
+ driver: "codex-app-server-v1",
208
+ session: config.sessionId,
209
+ config: credential.configId,
210
+ kind: credential.kind,
211
+ account: credential.kind === "codex-subscription" ? credential.chatgptAccountId : null
212
+ })
213
+ ).digest("hex");
214
+ const slots = join(root, CODEX_NATIVE_STATE_FORMAT);
215
+ directory2(slots);
216
+ const stateRoot = join(slots, key);
217
+ directory2(stateRoot);
218
+ for (const name of ["instructions.new", "binding.new"])
219
+ rmSync(join(stateRoot, name), { force: true });
220
+ const bindingPath = join(stateRoot, "binding.json");
221
+ if (config.resumeSessionId && !existsSync(bindingPath)) throw new CodexNativeStateUnavailable();
222
+ if (existsSync(bindingPath)) {
223
+ const bytes = readRegular(bindingPath, 4096);
224
+ if (config.resumeSessionId) {
225
+ let binding;
226
+ try {
227
+ binding = JSON.parse(bytes.toString("utf8"));
228
+ } catch {
229
+ throw new CodexNativeStateUnavailable();
230
+ }
231
+ 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)
232
+ throw new CodexNativeStateUnavailable();
233
+ }
234
+ }
235
+ const home = join(stateRoot, "home");
236
+ if (config.resumeSessionId && !existsSync(home)) throw new CodexNativeStateUnavailable();
237
+ directory2(home);
238
+ for (const subdir of ["config", "cache", "data", "tmp"]) directory2(join(home, subdir));
239
+ if (["auth.json", ".credentials.json"].some((name) => existsSync(join(home, name))))
240
+ throw invalid2();
241
+ const instructionFile = join(stateRoot, "instructions.md");
242
+ const instructions = [
243
+ ...(options.instructionFiles ?? []).map(
244
+ (path) => readRegular(path, 1024 * 1024).toString("utf8")
245
+ ),
246
+ ...config.systemPrompt ? [config.systemPrompt] : []
247
+ ].join("\n\n---\n\n");
248
+ const temporary = join(stateRoot, "instructions.new");
249
+ writeFileSync(temporary, instructions, { mode: 384, flag: "wx" });
250
+ renameSync(temporary, instructionFile);
251
+ const target = join(home, "skills");
252
+ if (!options.skillsDirectory && existsSync(target)) rmSync(target, { recursive: true });
253
+ if (options.skillsDirectory) {
254
+ const source = realpathSync(options.skillsDirectory);
255
+ if (within2(target, source) || within2(source, target)) throw invalid2();
256
+ if (existsSync(target)) rmSync(target, { recursive: true });
257
+ let files = 0;
258
+ let entries = 0;
259
+ let bytes = 0;
260
+ const copy = (source2, destination) => {
261
+ if (++entries > 1024) throw invalid2();
262
+ if (lstatSync(source2).isSymbolicLink()) throw invalid2();
263
+ mkdirSync(destination, { mode: 448 });
264
+ for (const entry of readdirSync(source2, { withFileTypes: true })) {
265
+ const src = join(source2, entry.name);
266
+ const dst = join(destination, entry.name);
267
+ if (entry.isSymbolicLink()) throw invalid2();
268
+ if (entry.isDirectory()) copy(src, dst);
269
+ else {
270
+ const content = readRegular(src, 1024 * 1024);
271
+ bytes += content.byteLength;
272
+ if (++files > 512 || bytes > 8 * 1024 * 1024) throw invalid2();
273
+ writeFileSync(dst, content, { mode: 384, flag: "wx" });
274
+ }
275
+ }
276
+ };
277
+ copy(options.skillsDirectory, target);
278
+ }
279
+ const bindThread = (threadId) => {
280
+ if (!threadId || threadId.length > 4096) throw invalid2();
281
+ const next = join(stateRoot, "binding.new");
282
+ writeFileSync(next, JSON.stringify({ format: CODEX_NATIVE_STATE_FORMAT, key, threadId }), {
283
+ mode: 384,
284
+ flag: "wx"
285
+ });
286
+ renameSync(next, bindingPath);
287
+ };
288
+ const setToolInstructions = (text) => {
289
+ writeFileSync(temporary, `${instructions}
290
+
291
+ ${text}`, { mode: 384, flag: "wx" });
292
+ renameSync(temporary, instructionFile);
293
+ };
294
+ return {
295
+ root,
296
+ stateRoot,
297
+ cwd,
298
+ home,
299
+ instructionFile,
300
+ bindThread,
301
+ release,
302
+ setToolInstructions
303
+ };
304
+ } catch (error) {
305
+ release();
306
+ throw error;
307
+ }
308
+ }
309
+ function codexInstanceEnvironment(input, home) {
310
+ const allowed = /* @__PURE__ */ new Set([
311
+ "PATH",
312
+ "LANG",
313
+ "LC_ALL",
314
+ "TZ",
315
+ "SSL_CERT_FILE",
316
+ "SSL_CERT_DIR",
317
+ "HTTPS_PROXY",
318
+ "HTTP_PROXY",
319
+ "NO_PROXY"
320
+ ]);
321
+ if (!input || Object.entries(input).some(([key, value]) => !allowed.has(key) || typeof value !== "string"))
322
+ throw invalid2();
323
+ return {
324
+ ...input,
325
+ HOME: home,
326
+ CODEX_HOME: home,
327
+ XDG_CONFIG_HOME: join(home, "config"),
328
+ XDG_CACHE_HOME: join(home, "cache"),
329
+ XDG_DATA_HOME: join(home, "data"),
330
+ TMPDIR: join(home, "tmp")
331
+ };
332
+ }
333
+
334
+ export { activateNativeApprovalPolicy, allowsNativeApprovalPath, codexInstanceEnvironment, isNativeApprovalPolicyActive, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult, prepareCodexInstance, prepareNativePolicy };
335
+ //# sourceMappingURL=chunk-T3YLZQS4.js.map
336
+ //# sourceMappingURL=chunk-T3YLZQS4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/codex/native-policy.ts","../bridge/src/codex/credentials.ts","../bridge/src/codex/instance-state.ts"],"names":["invalid","within","relative","isAbsolute","directory","lstatSync","realpathSync","source"],"mappings":"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","file":"chunk-T3YLZQS4.js","sourcesContent":["import { lstatSync, realpathSync } from \"node:fs\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\n\nconst invalid = () => new Error(\"AI_PROFILE_INVALID\");\nconst record = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\nconst within = (child: string, parent: string) => {\n const rel = relative(parent, child);\n return rel === \"\" || (!rel.startsWith(\"../\") && rel !== \"..\" && !isAbsolute(rel));\n};\nconst hasControl = (path: string) =>\n [...path].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);\nconst directory = (path: string) => {\n if (!isAbsolute(path) || hasControl(path)) throw invalid();\n const stat = lstatSync(path);\n if (!stat.isDirectory() || stat.isSymbolicLink()) throw invalid();\n return realpathSync(path);\n};\n\n/** Fixed pinned-native policy. No caller-supplied profile or sandbox override is admitted. */\nexport function prepareNativePolicy(input: {\n cwd: string;\n privateRoot: string;\n privateDirectory: string;\n sandboxMode: \"read-only\" | \"workspace-write\";\n}) {\n const cwd = directory(input.cwd);\n const privateRoot = directory(input.privateRoot);\n const privateDirectory = directory(input.privateDirectory);\n if (\n within(cwd, privateRoot) ||\n within(privateRoot, cwd) ||\n !within(privateDirectory, privateRoot) ||\n privateDirectory === privateRoot ||\n (input.sandboxMode !== \"read-only\" && input.sandboxMode !== \"workspace-write\")\n )\n throw invalid();\n const stat = lstatSync(privateRoot);\n if (stat.mode & 0o077 || (process.getuid && stat.uid !== 0 && stat.uid !== process.getuid()))\n throw invalid();\n const filesystem = Object.freeze({\n [cwd]: input.sandboxMode === \"workspace-write\" ? \"write\" : \"read\",\n [privateRoot]: \"deny\",\n });\n const config = Object.freeze({\n default_permissions: \"managed\",\n features: Object.freeze({ use_legacy_landlock: false }),\n permissions: Object.freeze({\n managed: Object.freeze({\n extends: \":read-only\",\n filesystem,\n network: Object.freeze({ enabled: false }),\n }),\n }),\n });\n // Native -c parses TOML, not JSON objects. Quote paths as TOML basic strings.\n const profile = `{ managed = { extends = \":read-only\", filesystem = { ${Object.entries(filesystem)\n .map(([path, access]) => `${JSON.stringify(path)} = ${JSON.stringify(access)}`)\n .join(\", \")} }, network = { enabled = false } } }`;\n const policy = Object.freeze({\n config,\n cliArgs: Object.freeze([\n \"-c\",\n 'default_permissions=\"managed\"',\n \"-c\",\n \"features.use_legacy_landlock=false\",\n \"-c\",\n `permissions=${profile}`,\n ]),\n });\n prepared.set(policy, { cwd, privateRoot, writable: input.sandboxMode === \"workspace-write\" });\n return policy;\n}\n\ntype PreparedNativePolicy = ReturnType<typeof prepareNativePolicy>;\ntype Binding = { cwd: string; privateRoot: string; writable: boolean };\nconst prepared = new WeakMap<object, Binding>();\ndeclare const admissionBrand: unique symbol;\nexport type NativeApprovalPolicy = { readonly [admissionBrand]: true };\nconst active = new WeakMap<object, Binding & { threadId: string; signal: AbortSignal }>();\n\n/** Confirms composition and native selection, not live OS isolation (G1/G2 remain required). */\nexport function activateNativeApprovalPolicy(\n policy: PreparedNativePolicy,\n response: unknown,\n signal: AbortSignal,\n): NativeApprovalPolicy {\n const binding = prepared.get(policy);\n if (\n !binding ||\n signal.aborted ||\n !record(response) ||\n !record(response.thread) ||\n typeof response.thread.id !== \"string\" ||\n !response.thread.id ||\n response.cwd !== binding.cwd ||\n !record(response.activePermissionProfile) ||\n response.activePermissionProfile.id !== \"managed\" ||\n response.activePermissionProfile.extends !== \":read-only\"\n )\n throw invalid();\n const token = Object.freeze({}) as NativeApprovalPolicy;\n active.set(token, { ...binding, threadId: response.thread.id, signal });\n return token;\n}\n\nexport function isNativeApprovalPolicyActive(\n policy: unknown,\n threadId: string,\n): policy is NativeApprovalPolicy {\n if (!record(policy)) return false;\n const binding = active.get(policy);\n return Boolean(binding && !binding.signal.aborted && binding.threadId === threadId);\n}\n\n/** Resolve existing ancestors too, so new files cannot escape via a project symlink. */\nexport function allowsNativeApprovalPath(\n policy: NativeApprovalPolicy | undefined,\n path: string,\n access: \"read\" | \"write\",\n): boolean {\n if (!policy) return false;\n const binding = active.get(policy);\n if (\n !binding ||\n binding.signal.aborted ||\n !isAbsolute(path) ||\n hasControl(path) ||\n (access !== \"read\" && access !== \"write\") ||\n (access === \"write\" && !binding.writable)\n )\n return false;\n try {\n let existing = resolve(path);\n const suffix: string[] = [];\n while (true) {\n try {\n lstatSync(existing);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\" || dirname(existing) === existing)\n return false;\n suffix.unshift(existing.slice(dirname(existing).length + 1));\n existing = dirname(existing);\n }\n }\n const canonical = resolve(realpathSync(existing), ...suffix);\n return within(canonical, binding.cwd) && !within(canonical, binding.privateRoot);\n } catch {\n return false;\n }\n}\n","import type {\n CodexCredentialDelivery,\n CodexSubscriptionRefreshInput,\n CodexSubscriptionRefreshResult,\n} from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nconst identifier = z.string().min(1).max(4096);\nconst timestamp = z.iso.datetime({ offset: true });\nconst common = {\n configId: identifier,\n credentialVersion: z.number().int().nonnegative().safe(),\n mintedAt: timestamp,\n};\nconst subscription = z.strictObject({\n ...common,\n kind: z.literal(\"codex-subscription\"),\n accessToken: z.string().min(1).max(65536),\n chatgptAccountId: identifier,\n chatgptPlanType: identifier.optional(),\n expiresAt: timestamp,\n});\nconst delivery = z.discriminatedUnion(\"kind\", [\n subscription,\n z.strictObject({\n ...common,\n kind: z.literal(\"openai-api-key\"),\n apiKey: z.string().min(1).max(65536),\n }),\n]);\n\n/** Validate credential shape and provenance without including input values in errors. */\nexport function parseCodexCredential(value: unknown, now = Date.now()): CodexCredentialDelivery {\n const parsed = delivery.safeParse(value);\n if (!parsed.success) throw new Error(\"Invalid managed AI credential\");\n const credential = parsed.data;\n const mintedAt = Date.parse(credential.mintedAt);\n // Issuer and runtime clocks may differ slightly; expiry remains strictly unexpired.\n if (\n mintedAt > now + 60_000 ||\n (credential.kind === \"codex-subscription\" &&\n (Date.parse(credential.expiresAt) <= now || Date.parse(credential.expiresAt) <= mintedAt))\n )\n throw new Error(\"Invalid managed AI credential timestamps\");\n return credential;\n}\n\n/** Validate runtime-only refresh input against the authenticated session's pinned delivery. */\nexport function parseCodexRefreshInput(\n value: unknown,\n pinned: Extract<CodexCredentialDelivery, { kind: \"codex-subscription\" }>,\n): CodexSubscriptionRefreshInput {\n const parsed = z\n .strictObject({\n kind: z.literal(\"codex-subscription\"),\n configId: identifier,\n credentialVersion: common.credentialVersion,\n reason: z.enum([\"initial\", \"refresh\", \"retry-401\"]),\n })\n .safeParse(value);\n if (\n !parsed.success ||\n parsed.data.configId !== pinned.configId ||\n parsed.data.credentialVersion !== pinned.credentialVersion\n )\n throw new Error(\"Invalid managed AI refresh binding\");\n return parsed.data;\n}\n\n/** Accept refreshed subscription credentials only within the existing config/account binding. */\nexport function parseCodexRefreshResult(\n value: unknown,\n pinned: Extract<CodexCredentialDelivery, { kind: \"codex-subscription\" }>,\n now = Date.now(),\n): CodexSubscriptionRefreshResult {\n const parsed = z\n .discriminatedUnion(\"ok\", [\n z.strictObject({ ok: z.literal(true), credential: subscription }),\n z.strictObject({\n ok: z.literal(false),\n code: z.enum([\"not-configured\", \"revoked\", \"provider-error\", \"backend-error\"]),\n message: z.string(),\n }),\n ])\n .safeParse(value);\n if (!parsed.success) throw new Error(\"Invalid managed AI refresh result\");\n if (!parsed.data.ok) return { ...parsed.data, message: \"Managed subscription refresh failed\" };\n const credential = parseCodexCredential(parsed.data.credential, now);\n if (\n credential.kind !== \"codex-subscription\" ||\n credential.configId !== pinned.configId ||\n credential.chatgptAccountId !== pinned.chatgptAccountId ||\n credential.credentialVersion < pinned.credentialVersion\n )\n throw new Error(\"Invalid managed AI refresh binding\");\n return { ok: true, credential };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n chmodSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { isAbsolute, join, relative } from \"node:path\";\nimport { openSqlite } from \"../../../core/src/logging/sinks/sqlite-runtime.js\";\nimport type { CodexCredentialDelivery } from \"@skaile/workspaces/types\";\nimport type { AgentConfig, CodexManagedRuntimeOptions } from \"../types.js\";\n\nimport { CODEX_NATIVE_STATE_FORMAT, CodexNativeStateUnavailable } from \"./native-state.js\";\n\nconst invalid = () => new Error(\"AI_PROFILE_INVALID\");\nconst within = (path: string, root: string) => {\n const rel = relative(root, path);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n};\nfunction directory(path: string): void {\n if (!existsSync(path)) mkdirSync(path, { mode: 0o700 });\n const stat = lstatSync(path);\n if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 0o077) throw invalid();\n}\nfunction readRegular(path: string, limit: number): Buffer {\n const stat = lstatSync(path);\n if (!stat.isFile() || stat.isSymbolicLink() || stat.size > limit) throw invalid();\n return readFileSync(path);\n}\n\n/** Session-owned state lock and account-bound native resume metadata; never stores credentials. */\nexport function prepareCodexInstance(\n config: AgentConfig,\n options: CodexManagedRuntimeOptions,\n credential: CodexCredentialDelivery,\n) {\n if (!isAbsolute(options.privateDirectory) || !isAbsolute(config.cwd) || !config.sessionId)\n throw invalid();\n directory(options.privateDirectory);\n const root = realpathSync(options.privateDirectory);\n const cwd = realpathSync(config.cwd);\n if (within(root, cwd) || within(cwd, root)) throw invalid();\n const lock = join(root, \".active\");\n const leasePath = join(root, \"lease.db\");\n if (existsSync(leasePath) && !lstatSync(leasePath).isFile()) throw invalid();\n const lease = openSqlite(leasePath);\n try {\n lease.exec(\"PRAGMA busy_timeout=0; BEGIN EXCLUSIVE\");\n chmodSync(leasePath, 0o600);\n // The OS releases the database lease on crashes; this marker never owns the lock.\n rmSync(lock, { force: true });\n writeFileSync(lock, \"active\", { flag: \"wx\", mode: 0o600 });\n } catch (error) {\n lease.close();\n throw error;\n }\n let released = false;\n const release = () => {\n if (released) return;\n released = true;\n try {\n rmSync(lock, { force: true });\n } finally {\n lease.close();\n }\n };\n try {\n const key = createHash(\"sha256\")\n .update(\n JSON.stringify({\n driver: \"codex-app-server-v1\",\n session: config.sessionId,\n config: credential.configId,\n kind: credential.kind,\n account: credential.kind === \"codex-subscription\" ? credential.chatgptAccountId : null,\n }),\n )\n .digest(\"hex\");\n const slots = join(root, CODEX_NATIVE_STATE_FORMAT);\n directory(slots);\n const stateRoot = join(slots, key);\n directory(stateRoot);\n for (const name of [\"instructions.new\", \"binding.new\"])\n rmSync(join(stateRoot, name), { force: true });\n const bindingPath = join(stateRoot, \"binding.json\");\n if (config.resumeSessionId && !existsSync(bindingPath)) throw new CodexNativeStateUnavailable();\n if (existsSync(bindingPath)) {\n // Filesystem authority failures (including symlinks) are fatal, not missing state.\n const bytes = readRegular(bindingPath, 4096);\n if (config.resumeSessionId) {\n let binding: unknown;\n try {\n binding = JSON.parse(bytes.toString(\"utf8\"));\n } catch {\n throw new CodexNativeStateUnavailable();\n }\n if (\n !binding ||\n typeof binding !== \"object\" ||\n Array.isArray(binding) ||\n Object.keys(binding).sort().join(\",\") !== \"format,key,threadId\" ||\n (binding as Record<string, unknown>).format !== CODEX_NATIVE_STATE_FORMAT ||\n (binding as Record<string, unknown>).key !== key ||\n (binding as Record<string, unknown>).threadId !== config.resumeSessionId\n )\n throw new CodexNativeStateUnavailable();\n }\n }\n const home = join(stateRoot, \"home\");\n if (config.resumeSessionId && !existsSync(home)) throw new CodexNativeStateUnavailable();\n directory(home);\n for (const subdir of [\"config\", \"cache\", \"data\", \"tmp\"]) directory(join(home, subdir));\n // Auth persistence is forbidden even if a previous external process left a carrier here.\n if ([\"auth.json\", \".credentials.json\"].some((name) => existsSync(join(home, name))))\n throw invalid();\n const instructionFile = join(stateRoot, \"instructions.md\");\n const instructions = [\n ...(options.instructionFiles ?? []).map((path) =>\n readRegular(path, 1024 * 1024).toString(\"utf8\"),\n ),\n ...(config.systemPrompt ? [config.systemPrompt] : []),\n ].join(\"\\n\\n---\\n\\n\");\n const temporary = join(stateRoot, \"instructions.new\");\n writeFileSync(temporary, instructions, { mode: 0o600, flag: \"wx\" });\n renameSync(temporary, instructionFile);\n const target = join(home, \"skills\");\n if (!options.skillsDirectory && existsSync(target)) rmSync(target, { recursive: true });\n if (options.skillsDirectory) {\n const source = realpathSync(options.skillsDirectory);\n if (within(target, source) || within(source, target)) throw invalid();\n if (existsSync(target)) rmSync(target, { recursive: true });\n let files = 0;\n let entries = 0;\n let bytes = 0;\n const copy = (source: string, destination: string) => {\n if (++entries > 1024) throw invalid();\n if (lstatSync(source).isSymbolicLink()) throw invalid();\n mkdirSync(destination, { mode: 0o700 });\n for (const entry of readdirSync(source, { withFileTypes: true })) {\n const src = join(source, entry.name);\n const dst = join(destination, entry.name);\n if (entry.isSymbolicLink()) throw invalid();\n if (entry.isDirectory()) copy(src, dst);\n else {\n const content = readRegular(src, 1024 * 1024);\n bytes += content.byteLength;\n if (++files > 512 || bytes > 8 * 1024 * 1024) throw invalid();\n writeFileSync(dst, content, { mode: 0o600, flag: \"wx\" });\n }\n }\n };\n copy(options.skillsDirectory, target);\n }\n const bindThread = (threadId: string) => {\n if (!threadId || threadId.length > 4096) throw invalid();\n const next = join(stateRoot, \"binding.new\");\n writeFileSync(next, JSON.stringify({ format: CODEX_NATIVE_STATE_FORMAT, key, threadId }), {\n mode: 0o600,\n flag: \"wx\",\n });\n renameSync(next, bindingPath);\n };\n const setToolInstructions = (text: string) => {\n writeFileSync(temporary, `${instructions}\\n\\n${text}`, { mode: 0o600, flag: \"wx\" });\n renameSync(temporary, instructionFile);\n };\n return {\n root,\n stateRoot,\n cwd,\n home,\n instructionFile,\n bindThread,\n release,\n setToolInstructions,\n };\n } catch (error) {\n release();\n throw error;\n }\n}\n\n/** A replacement environment; managed auth never reads or mutates ambient process.env. */\nexport function codexInstanceEnvironment(\n input: Record<string, string>,\n home: string,\n): Record<string, string> {\n const allowed = new Set([\n \"PATH\",\n \"LANG\",\n \"LC_ALL\",\n \"TZ\",\n \"SSL_CERT_FILE\",\n \"SSL_CERT_DIR\",\n \"HTTPS_PROXY\",\n \"HTTP_PROXY\",\n \"NO_PROXY\",\n ]);\n if (\n !input ||\n Object.entries(input).some(([key, value]) => !allowed.has(key) || typeof value !== \"string\")\n )\n throw invalid();\n return {\n ...input,\n HOME: home,\n CODEX_HOME: home,\n XDG_CONFIG_HOME: join(home, \"config\"),\n XDG_CACHE_HOME: join(home, \"cache\"),\n XDG_DATA_HOME: join(home, \"data\"),\n TMPDIR: join(home, \"tmp\"),\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { PROVIDER_ENDPOINTS, resolveProviderModelsUrl } from './chunk-GURXUF2J.js';
2
2
  import { classifyClaudeSdkError } from './chunk-GAH4YRCI.js';
3
- import { createDriver } from './chunk-FRER2PEN.js';
3
+ import { createDriver } from './chunk-KB2GC6YY.js';
4
4
 
5
5
  // bridge/src/normalizer.ts
6
6
  function resultUsageFields(event) {
@@ -42,7 +42,8 @@ var EventNormalizer = class {
42
42
  message: event.error,
43
43
  fatal: event.fatal ?? true,
44
44
  category: event.detail?.category,
45
- ...event.detail?.hint ? { hint: event.detail.hint } : {}
45
+ ...event.detail?.hint ? { hint: event.detail.hint } : {},
46
+ ...resultUsageFields(event)
46
47
  }
47
48
  ];
48
49
  case "tool_call": {
@@ -105,6 +106,9 @@ var EventNormalizer = class {
105
106
  }
106
107
  handleAskUserQuestion(input) {
107
108
  const events = [];
109
+ const candidate = input.approval;
110
+ const approval = candidate && ["command", "file", "permissions", "mcp"].includes(candidate.kind ?? "") && Array.isArray(candidate.details) && candidate.details.length > 0 && candidate.details.length <= 64 && candidate.details.every((detail) => typeof detail === "string" && detail.length <= 8192) && candidate.details.reduce((total, detail) => total + detail.length, 0) <= 65536 ? candidate : void 0;
111
+ if (Object.hasOwn(input, "approval") && !approval) return [];
108
112
  const questions = input.questions;
109
113
  if (Array.isArray(questions)) {
110
114
  for (const q of questions) {
@@ -112,13 +116,25 @@ var EventNormalizer = class {
112
116
  const question = String(qObj.question ?? "");
113
117
  const rawOpts = qObj.options;
114
118
  const options = Array.isArray(rawOpts) ? rawOpts.map((o) => typeof o === "string" ? o : String(o.label ?? o)) : void 0;
115
- events.push({ type: "question", question, options });
119
+ events.push({
120
+ type: "question",
121
+ question,
122
+ options,
123
+ ...typeof input.requestId === "string" ? { requestId: input.requestId } : {},
124
+ ...approval ? { approval } : {}
125
+ });
116
126
  }
117
127
  } else {
118
128
  const question = String(input.question ?? input.text ?? "");
119
129
  const rawOptions = input.options;
120
130
  const options = Array.isArray(rawOptions) ? rawOptions.map(String) : void 0;
121
- events.push({ type: "question", question, options });
131
+ events.push({
132
+ type: "question",
133
+ question,
134
+ options,
135
+ ...typeof input.requestId === "string" ? { requestId: input.requestId } : {},
136
+ ...approval ? { approval } : {}
137
+ });
122
138
  }
123
139
  return events;
124
140
  }
@@ -412,9 +428,15 @@ var BridgeRuntime = class {
412
428
  if (!this.driver) throw new Error("Runtime not started \u2014 call start() first");
413
429
  await this.driver.prompt(message);
414
430
  }
415
- async reply(answer) {
416
- if (this.driver?.hasPendingQuestion() && this.driver.answerQuestion(answer)) return;
417
- await this.prompt(answer);
431
+ async promptInput(input) {
432
+ if (!this.driver) throw new Error("Runtime not started \u2014 call start() first");
433
+ await this.driver.promptInput(input);
434
+ }
435
+ async reply(answer, question, requestId) {
436
+ if (!this.driver) throw new Error("Runtime not started \u2014 call start() first");
437
+ if (this.driver?.hasPendingQuestion() && this.driver.answerQuestion(answer, question, requestId))
438
+ return;
439
+ if (this.driver?.acceptsReplyAsPrompt) await this.prompt(answer);
418
440
  }
419
441
  async abort() {
420
442
  if (this.driver) {
@@ -477,5 +499,5 @@ async function validateApiKey(provider, key, options = {}) {
477
499
  }
478
500
 
479
501
  export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey };
480
- //# sourceMappingURL=chunk-PBRMY64S.js.map
481
- //# sourceMappingURL=chunk-PBRMY64S.js.map
502
+ //# sourceMappingURL=chunk-WB4EWSDR.js.map
503
+ //# sourceMappingURL=chunk-WB4EWSDR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":[],"mappings":"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","file":"chunk-WB4EWSDR.js","sourcesContent":["/**\n * EventNormalizer — converts bridge-level AgentEvent (raw driver events) to\n * skaile-agent-types AgentEvent (normalized, human-readable events).\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call reset() between sessions.\n */\n\nimport type {\n AgentEvent as NormalizedEvent,\n NativeApprovalDescription,\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 driver uses to park a turn on a human answer. Both branches that\n * recognise it must use this constant: `message_start` turns it into a\n * `question`, and `tool_call` must then stay silent about it.\n */\nconst QUESTION_TOOL = \"AskUserQuestion\";\n\n/**\n * Converts raw bridge-level {@link BridgeEvent} payloads into normalized\n * `@skaile/workspaces/types` `AgentEvent` payloads consumed by the runner and transport.\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call {@link EventNormalizer.reset} between sessions to clear accumulated state.\n *\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport class EventNormalizer {\n private activeSubagents = new Map<string, string>();\n private devServerStartingEmitted = false;\n private devServerReadyEmitted = false;\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n\n /**\n * Convert a single bridge event into zero or more normalized events.\n * One bridge event can produce multiple normalized events (e.g., a message_start\n * with text + tool_use blocks produces both text and tool_call events).\n */\n normalize(event: BridgeEvent): NormalizedEvent[] {\n switch (event.type) {\n case \"message_start\":\n return this.handleMessageStart(event.message);\n\n case \"message_update\":\n return this.handleMessageUpdate(event);\n\n case \"message_end\":\n return [];\n\n case \"turn_end\":\n return this.handleTurnEnd(event.toolResults);\n\n case \"result\":\n return this.handleResult(event);\n\n case \"error\":\n return [\n {\n type: \"error\",\n message: event.error,\n fatal: event.fatal ?? true,\n category: event.detail?.category,\n ...(event.detail?.hint ? { hint: event.detail.hint } : {}),\n ...resultUsageFields(event),\n },\n ];\n\n case \"tool_call\": {\n // Already handled in message_start — emit status only. The question tool\n // is the exception: the turn parks on the user's answer, so reporting\n // work here would undo the idle its `question` event just set, and\n // nothing follows to correct it while the user reads the prompt.\n const toolName = event.name ?? event.tool?.name;\n if (toolName === QUESTION_TOOL) return [];\n return [{ type: \"status\", phase: \"working\" }];\n }\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n return [{ type: \"status\", phase: \"idle\" }];\n\n case \"commands_available\":\n // Pass through to transport — the gateway caches this event\n return [event as unknown as NormalizedEvent];\n\n case \"session_info\":\n // Pass through to transport — the forge layer stores the OMP session ID\n return [event as unknown as NormalizedEvent];\n\n case \"ui_render\":\n case \"ui_render_update\":\n case \"ui_clear\":\n // Pass through verbatim — drivers that implement the Agent UI Protocol emit these directly\n return [event as unknown as NormalizedEvent];\n\n default:\n return [];\n }\n }\n\n /** Clear all stateful tracking between sessions. */\n reset(): void {\n this.activeSubagents.clear();\n this.devServerStartingEmitted = false;\n this.devServerReadyEmitted = false;\n this.hasStreamedText = false;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Drivers (e.g. omp) may echo the user's\n // message as a message_start with role:\"user\" before streaming the response.\n // Emitting a text event for that echo would prepend the user's input to the\n // assistant bubble on the frontend.\n if (message.role !== \"assistant\") return [];\n\n const events: NormalizedEvent[] = [];\n const blocks = this.getContentBlocks(message);\n\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n // Skip full text if we already streamed it via message_update deltas\n if (!this.hasStreamedText) {\n events.push({ type: \"text\", content: block.text });\n }\n } else if (block.type === \"tool_use\" && block.name) {\n events.push(...this.handleToolUse(block));\n }\n }\n\n this.hasStreamedText = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock): NormalizedEvent[] {\n const name = block.name!;\n const input = (block.input ?? {}) as Record<string, unknown>;\n\n if (name === QUESTION_TOOL) {\n return this.handleAskUserQuestion(input);\n }\n if (name === \"Agent\") {\n return this.handleAgentToolUse(block, input);\n }\n return this.handleGenericToolUse(name, input);\n }\n\n private handleAskUserQuestion(input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n 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(name: string, input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n summary: summarizeToolCall(name, input),\n });\n events.push({ type: \"status\", phase: \"working\" });\n\n if (name === \"Bash\" && typeof input.command === \"string\") {\n const devEvent = this.detectDevServerStarting(input.command);\n if (devEvent) events.push(devEvent);\n }\n\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // message_update → streaming text\n // ---------------------------------------------------------------------------\n\n private handleMessageUpdate(event: BridgeEvent): NormalizedEvent[] {\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n return [{ type: \"text\", content: delta }];\n }\n return [];\n }\n\n // ---------------------------------------------------------------------------\n // turn_end → tool_result, subagent finished, file_changed, dev_server\n // ---------------------------------------------------------------------------\n\n private handleTurnEnd(toolResults?: AgentMessage[]): NormalizedEvent[] {\n if (!toolResults?.length) return [];\n\n const events: NormalizedEvent[] = [];\n\n for (const result of toolResults) {\n const toolName = result.toolName ?? \"unknown\";\n const outputData = result.data ?? result.content;\n const output = typeof outputData === \"string\" ? outputData : JSON.stringify(outputData);\n\n // Check if this is a subagent result\n if (toolName === \"Agent\" || this.isSubagentResult(result)) {\n events.push(...this.handleSubagentResult(result, output));\n } else {\n events.push(...this.handleToolResult(toolName, outputData, output));\n }\n }\n\n return events;\n }\n\n private handleSubagentResult(result: AgentMessage, output: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const agentName = this.resolveSubagentName(result);\n const description = output.slice(0, 200);\n events.push({ type: \"subagent\", name: agentName, status: \"finished\", description });\n\n if (agentName === \"dev-server\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n return events;\n }\n\n private handleToolResult(\n toolName: string,\n outputData: unknown,\n output: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n events.push({\n type: \"tool_result\",\n tool: toolName,\n output: outputData,\n summary: summarizeToolResult(toolName, outputData),\n });\n\n // Detect file changes from Write/Edit results\n const fileEvents = detectFileChanges(toolName, outputData);\n if (fileEvents.length > 0) events.push(...fileEvents);\n\n // Detect dev server from Bash output\n if (toolName === \"Bash\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n return events;\n }\n\n private isSubagentResult(result: AgentMessage): boolean {\n // Check if the tool result's id maps to a tracked subagent\n if (result.toolName && this.activeSubagents.has(result.toolName)) return true;\n return false;\n }\n\n private resolveSubagentName(result: AgentMessage): string {\n // toolName on bridge AgentMessage is resolved from toolIdToName in the driver\n const name = result.toolName ? this.activeSubagents.get(result.toolName) : undefined;\n if (name) {\n this.activeSubagents.delete(result.toolName!);\n return name;\n }\n return result.toolName ?? \"unknown\";\n }\n\n // ---------------------------------------------------------------------------\n // result → finished or error\n // ---------------------------------------------------------------------------\n\n private handleResult(event: BridgeEvent & { type: \"result\" }): NormalizedEvent[] {\n const usage = resultUsageFields(event);\n if (event.subtype === \"success\") {\n return [\n {\n type: \"finished\",\n summary: event.summary ?? \"Task completed\",\n costUsd: event.costUsd ?? 0,\n ...usage,\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk driver uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (drivers other than claude-sdk emit `result` without a paired\n // `error`, so this is the only place they get classified).\n const detail = classifyClaudeSdkError({ errors, subtype: event.subtype });\n // The turn billed even though it failed: carry its usage so a ledger\n // that only writes on `finished` can write here too. Unlike the finished\n // branch, no `costUsd: 0` fallback — an absent figure stays absent.\n return [\n {\n type: \"error\",\n message: `Agent stopped: ${event.subtype}${errors.length ? ` — ${errors.join(\"; \")}` : \"\"}`,\n fatal: event.subtype === \"error_during_execution\",\n category: detail.category,\n ...(detail.hint ? { hint: detail.hint } : {}),\n ...(typeof event.costUsd === \"number\" ? { costUsd: event.costUsd } : {}),\n ...usage,\n },\n ];\n }\n\n // ---------------------------------------------------------------------------\n // Dev server detection\n // ---------------------------------------------------------------------------\n\n private detectDevServerStarting(command: string): NormalizedEvent | null {\n if (this.devServerStartingEmitted) return null;\n const cmd = command.toLowerCase();\n const isFrontendStart =\n (cmd.includes(\"pnpm run dev\") || cmd.includes(\"pnpm dev\") || cmd.includes(\"vite\")) &&\n (cmd.includes(\"frontend\") || cmd.includes(\"dev:preview\"));\n if (isFrontendStart) {\n this.devServerStartingEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"starting\" };\n }\n return null;\n }\n\n private detectDevServerReady(text: string): NormalizedEvent | null {\n if (this.devServerReadyEmitted) return null;\n\n const explicitMatch = text.match(/DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/);\n if (explicitMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: explicitMatch[1]!, status: \"ready\" };\n }\n\n const viteMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+)/);\n if (viteMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: viteMatch[1]!, status: \"ready\" };\n }\n\n if (text.includes(\"FRONTEND_READY\")) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"ready\" };\n }\n\n return null;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private getContentBlocks(message: AgentMessage): ContentBlock[] {\n if (Array.isArray(message.content)) return message.content;\n if (typeof message.content === \"string\" && message.content) {\n return [{ type: \"text\", text: message.content }];\n }\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable one-line summary of a tool call for the activity log.\n *\n * Returns a string like `$ git status` for Bash, `Read src/index.ts` for Read, etc.\n * Falls back to `ToolName({...input...})` for unrecognised tools.\n *\n * @param tool - Tool name (e.g. `\"Bash\"`, `\"Write\"`, `\"Grep\"`).\n * @param input - Tool input record passed to the call.\n * @returns A short display string suitable for the activity feed.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolCall(tool: string, input: Record<string, unknown>): string {\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${String(input.file_path)}`;\n case \"Edit\":\n return `Edit ${String(input.file_path)}`;\n case \"Read\":\n return `Read ${String(input.file_path)}`;\n case \"Glob\":\n return `Find ${String(input.pattern)}`;\n case \"Grep\":\n return `Search for ${String(input.pattern)}`;\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/** Extract plain text from an Anthropic content-block array (e.g. tool results returned by Claude SDK). */\nfunction extractContentBlockText(blocks: unknown[]): string | null {\n const textBlocks = blocks.filter(\n (b): b is { type: \"text\"; text: string } =>\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\" &&\n typeof (b as Record<string, unknown>).text === \"string\",\n );\n if (textBlocks.length === 0) return null;\n return textBlocks.map((b) => b.text).join(\"\\n\");\n}\n\n/**\n * Produce a human-readable one-line summary of a tool result for the activity log.\n *\n * Handles Bash stdout/stderr, Write/Edit file paths, ApplyPatch change counts, and\n * Anthropic content-block arrays. Falls back to `JSON.stringify` for unknown shapes.\n *\n * @param tool - Tool name.\n * @param result - Raw tool result payload.\n * @returns A short display string, truncated to 200 characters.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolResult(tool: string, result: unknown): string {\n // Handle Anthropic content-block arrays: [{ type: \"text\", text: \"...\" }, ...]\n if (Array.isArray(result)) {\n const text = extractContentBlockText(result);\n return (text ?? JSON.stringify(result)).slice(0, 200);\n }\n if (typeof result !== \"object\" || !result) {\n return String(result).slice(0, 200);\n }\n const r = result as Record<string, unknown>;\n switch (tool) {\n case \"Bash\": {\n const stderr = String(r.stderr ?? \"\").trim();\n if (stderr) return `stderr: ${stderr.slice(0, 200)}`;\n return (\n String(r.stdout ?? \"\")\n .trim()\n .slice(0, 200) || \"(no output)\"\n );\n }\n case \"Write\":\n return `${String(r.type)}: ${String(r.filePath)}`;\n case \"Edit\":\n return `Edited ${String(r.filePath)}`;\n case \"ApplyPatch\":\n return `${Array.isArray(r.changes) ? r.changes.length : 0} file changes`;\n default:\n return JSON.stringify(result).slice(0, 200);\n }\n}\n\n/**\n * Detect file-change events from a tool result, returning zero or more `file_changed` events.\n *\n * Handles `Write` (single create/edit), `Edit` (single edit), and `ApplyPatch` (multi-file\n * patch with per-change `kind` classification). Returns an empty array for all other tools.\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns Array of `file_changed` normalized events.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChanges(toolName: string, result: unknown): NormalizedEvent[] {\n if (typeof result !== \"object\" || !result) return [];\n const r = result as Record<string, unknown>;\n\n if (toolName === \"Write\" && r.filePath) {\n return [\n {\n type: \"file_changed\",\n path: String(r.filePath),\n action: r.type === \"create\" ? \"create\" : \"edit\",\n },\n ];\n }\n if (toolName === \"Edit\" && r.filePath) {\n return [{ type: \"file_changed\", path: String(r.filePath), action: \"edit\" }];\n }\n if (toolName === \"ApplyPatch\" && Array.isArray(r.changes)) {\n return r.changes\n .filter(\n (change): change is { path: string; kind: \"add\" | \"delete\" | \"update\" } =>\n typeof change === \"object\" &&\n change !== null &&\n typeof (change as Record<string, unknown>).path === \"string\" &&\n typeof (change as Record<string, unknown>).kind === \"string\",\n )\n .map((change) => ({\n type: \"file_changed\" as const,\n path: change.path,\n action: change.kind === \"add\" ? \"create\" : change.kind === \"delete\" ? \"delete\" : \"edit\",\n }));\n }\n\n return [];\n}\n\n/**\n * Backward-compatible single-event helper; returns the first `file_changed` event or `null`.\n *\n * Prefer {@link detectFileChanges} for multi-file patches (e.g. `ApplyPatch`).\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns First detected `file_changed` event, or `null`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChange(toolName: string, result: unknown): NormalizedEvent | null {\n return detectFileChanges(toolName, result)[0] ?? null;\n}\n","/**\n * BridgeRuntime — implements IAgentRuntime from @skaile/workspaces/types by wrapping\n * an AgentDriver + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any driver.\n */\n\nimport type {\n AgentEvent,\n AgentPromptInput,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { createDriver } from \"./registry.js\";\nimport type { AgentConfig, AgentDriver } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentDriver}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any driver without managing the driver lifecycle directly. Create via\n * {@link createRuntime} to avoid coupling to `BridgeRuntime` directly.\n *\n * @docLink packages/bridge/api-reference#runtime\n */\nexport class BridgeRuntime implements IAgentRuntime {\n private driver: AgentDriver | null = null;\n private normalizer = new EventNormalizer();\n private handlers = new Set<(event: AgentEvent) => void>();\n private boundEventHandler: ((event: any) => void) | null = null;\n private driverId: string;\n\n constructor(driverId: string = \"claude-sdk\") {\n this.driverId = driverId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous driver if any\n if (this.driver) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n provider: config.provider,\n model: config.model,\n systemPrompt: config.systemPrompt,\n apiKeys: config.apiKeys,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n };\n\n this.driver = await createDriver(this.driverId, bridgeConfig);\n\n // Wire bridge events through normalizer to handlers\n this.boundEventHandler = (bridgeEvent: any) => {\n const normalized = this.normalizer.normalize(bridgeEvent);\n for (const event of normalized) {\n for (const handler of this.handlers) {\n handler(event);\n }\n }\n };\n this.driver.on(\"agent-event\", this.boundEventHandler);\n\n await this.driver.start();\n }\n\n async configure(_config: AgentReconfigureOptions): Promise<void> {\n // Runtime reconfiguration for BridgeRuntime is a no-op for now.\n // Future: reconnect connectors, reload ai-assets, update subagents.\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.driver) throw new Error(\"Runtime not started — call start() first\");\n await this.driver.prompt(message);\n }\n\n async promptInput(input: AgentPromptInput): Promise<void> {\n if (!this.driver) throw new Error(\"Runtime not started — call start() first\");\n await this.driver.promptInput(input);\n }\n\n async reply(answer: string, question?: string, requestId?: string): Promise<void> {\n if (!this.driver) 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.driver?.hasPendingQuestion() &&\n this.driver.answerQuestion(answer, question, requestId)\n )\n return;\n if (this.driver?.acceptsReplyAsPrompt) await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.driver) {\n await this.driver.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.driver) {\n if (this.boundEventHandler) {\n this.driver.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.driver.kill();\n this.driver = null;\n }\n this.normalizer.reset();\n }\n\n onEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.add(handler);\n }\n\n offEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.delete(handler);\n }\n\n get isRunning(): boolean {\n return this.driver?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified driver.\n *\n * @param driverId - Registered driver id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected driver with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(driverId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(driverId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\nimport { PROVIDER_ENDPOINTS, resolveProviderModelsUrl } from \"./provider-endpoints.js\";\n\n/**\n * Result of an API key validation check performed by {@link validateApiKey}.\n *\n * @docLink packages/bridge/api-reference#validation\n */\nexport interface ValidationResult {\n /** `true` when the API key was accepted by the provider's models endpoint. */\n ok: boolean;\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n}\n\n/**\n * Validate an API key by sending a lightweight GET request to the provider's models endpoint.\n *\n * Returns `{ ok: true }` when the provider accepts the key (HTTP 2xx). Returns\n * `{ ok: false, error }` on 401/403 (invalid key), other HTTP errors, network failures,\n * or unsupported providers. Requests time out after 8 seconds.\n *\n * @param provider - Provider name matching a key in the shared `PROVIDER_ENDPOINTS` map\n * (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param key - API key to validate.\n * @param options - Optional base-URL / environment overrides; defaults to the\n * provider's own API, or its `baseUrlEnv` value when one is set.\n * @returns Validation result with optional error description.\n * @docLink packages/bridge/api-reference#validation\n */\nexport async function validateApiKey(\n provider: string,\n key: string,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): Promise<ValidationResult> {\n const endpoint = PROVIDER_ENDPOINTS[provider];\n if (!endpoint) return { ok: false, error: `Unknown provider: ${provider}` };\n\n // Validate against the same endpoint discovery/dispatch use: behind a gateway\n // the key is the gateway's, and the provider's public API would reject it.\n let url =\n resolveProviderModelsUrl(provider, {\n baseUrl: options.baseUrl,\n env: options.env ?? process.env,\n }) ?? endpoint.url;\n if (endpoint.queryParam) url += `?${endpoint.queryParam}=${encodeURIComponent(key)}`;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: endpoint.headers(key),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) return { ok: true };\n\n const status = response.status;\n if (status === 401 || status === 403) {\n return { ok: false, error: \"Invalid API key (authentication failed)\" };\n }\n return { ok: false, error: `API returned HTTP ${status}` };\n } catch (err: any) {\n if (err.name === \"AbortError\") return { ok: false, error: \"Request timed out (8s)\" };\n return { ok: false, error: err.message ?? \"Network error\" };\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { globalSettingsPath, mapLegacyFields } from './chunk-CIPK5JMJ.js';
1
+ import { globalSettingsPath, mapLegacyFields } from './chunk-H662SXKS.js';
2
2
  import { rmSync, existsSync, readFileSync, mkdirSync, writeFileSync, chmodSync } from 'fs';
3
3
  import { randomBytes, createHash } from 'crypto';
4
4
  import { homedir } from 'os';
@@ -228,5 +228,5 @@ function isStoreAuthenticated() {
228
228
  }
229
229
 
230
230
  export { deviceLogin, getStoreConfig, getStoreIdentity, getStoreToken, hasStoredAuth, isStoreAuthenticated, loadStoreAuthConfig, logout, storeFetch };
231
- //# sourceMappingURL=chunk-SUPIVTLX.js.map
232
- //# sourceMappingURL=chunk-SUPIVTLX.js.map
231
+ //# sourceMappingURL=chunk-XL45U3C5.js.map
232
+ //# sourceMappingURL=chunk-XL45U3C5.js.map