@skaile/workspaces 4.5.2 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-G4WIFRFX.js → asset-feeds-CV7EE4GI.js} +7 -7
  4. package/dist/{asset-feeds-G4WIFRFX.js.map → asset-feeds-CV7EE4GI.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 +4 -4
  9. package/dist/bridge/drivers/claude-sdk.js +54 -11
  10. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  11. package/dist/bridge/drivers/codex.js +6 -6
  12. package/dist/bridge/drivers/continue.js +6 -6
  13. package/dist/bridge/drivers/echo.js +3 -3
  14. package/dist/bridge/drivers/gemini.js +4 -4
  15. package/dist/bridge/drivers/goose.js +6 -6
  16. package/dist/bridge/drivers/omp.js +1 -1
  17. package/dist/bridge/drivers/opencode.js +6 -6
  18. package/dist/bridge/drivers/qwen.js +4 -4
  19. package/dist/bridge/index.js +8 -8
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts +16 -0
  21. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  22. package/dist/{chunk-NOH5UDO7.js → chunk-3GKBSHUG.js} +3 -3
  23. package/dist/{chunk-NOH5UDO7.js.map → chunk-3GKBSHUG.js.map} +1 -1
  24. package/dist/{chunk-GNXKNQPU.js → chunk-4AAEBUX7.js} +7 -7
  25. package/dist/{chunk-GNXKNQPU.js.map → chunk-4AAEBUX7.js.map} +1 -1
  26. package/dist/{chunk-JXCUUZA3.js → chunk-4ZTPYIBE.js} +9 -6
  27. package/dist/chunk-4ZTPYIBE.js.map +1 -0
  28. package/dist/{chunk-C2CYBRYJ.js → chunk-5GYFYGVW.js} +2 -2
  29. package/dist/{chunk-C2CYBRYJ.js.map → chunk-5GYFYGVW.js.map} +1 -1
  30. package/dist/{chunk-CKLCKPC7.js → chunk-7UM46L33.js} +2 -2
  31. package/dist/{chunk-CKLCKPC7.js.map → chunk-7UM46L33.js.map} +1 -1
  32. package/dist/{chunk-3OLCTLTH.js → chunk-7WVPAQPE.js} +3 -2
  33. package/dist/chunk-7WVPAQPE.js.map +1 -0
  34. package/dist/{chunk-Q5C77OZW.js → chunk-A42QGGSB.js} +3 -3
  35. package/dist/{chunk-Q5C77OZW.js.map → chunk-A42QGGSB.js.map} +1 -1
  36. package/dist/{chunk-UJPVUN6H.js → chunk-BCXZ74DM.js} +4 -4
  37. package/dist/{chunk-UJPVUN6H.js.map → chunk-BCXZ74DM.js.map} +1 -1
  38. package/dist/{chunk-PTETBRRC.js → chunk-DS7B54NF.js} +3 -3
  39. package/dist/{chunk-PTETBRRC.js.map → chunk-DS7B54NF.js.map} +1 -1
  40. package/dist/{chunk-KW7YIRYL.js → chunk-DYT3AQBM.js} +44 -4
  41. package/dist/chunk-DYT3AQBM.js.map +1 -0
  42. package/dist/{chunk-YVQZQGVW.js → chunk-HBBVWZ4T.js} +5 -5
  43. package/dist/{chunk-YVQZQGVW.js.map → chunk-HBBVWZ4T.js.map} +1 -1
  44. package/dist/{chunk-K27T47OO.js → chunk-HKOC273F.js} +71 -5
  45. package/dist/chunk-HKOC273F.js.map +1 -0
  46. package/dist/{chunk-COK4WPU4.js → chunk-HR2AGPLJ.js} +4 -4
  47. package/dist/{chunk-COK4WPU4.js.map → chunk-HR2AGPLJ.js.map} +1 -1
  48. package/dist/{chunk-6GA27VV4.js → chunk-HVTU3CVF.js} +189 -50
  49. package/dist/chunk-HVTU3CVF.js.map +1 -0
  50. package/dist/{chunk-W3YYB7K7.js → chunk-IECSLI55.js} +3 -3
  51. package/dist/{chunk-W3YYB7K7.js.map → chunk-IECSLI55.js.map} +1 -1
  52. package/dist/{chunk-VP2CACF2.js → chunk-IUVPPJ4T.js} +3 -3
  53. package/dist/{chunk-VP2CACF2.js.map → chunk-IUVPPJ4T.js.map} +1 -1
  54. package/dist/{chunk-35XUCUKZ.js → chunk-J2NEKEZK.js} +3 -3
  55. package/dist/{chunk-35XUCUKZ.js.map → chunk-J2NEKEZK.js.map} +1 -1
  56. package/dist/{chunk-VJJUKODI.js → chunk-JH63TVZG.js} +5 -5
  57. package/dist/{chunk-VJJUKODI.js.map → chunk-JH63TVZG.js.map} +1 -1
  58. package/dist/{chunk-WVSF3IEQ.js → chunk-JWWER4L5.js} +2 -2
  59. package/dist/{chunk-WVSF3IEQ.js.map → chunk-JWWER4L5.js.map} +1 -1
  60. package/dist/{chunk-AMJEPVNB.js → chunk-MHROUPZN.js} +9 -9
  61. package/dist/{chunk-AMJEPVNB.js.map → chunk-MHROUPZN.js.map} +1 -1
  62. package/dist/{chunk-NWZQMJTI.js → chunk-NIHNZC6E.js} +3 -3
  63. package/dist/{chunk-NWZQMJTI.js.map → chunk-NIHNZC6E.js.map} +1 -1
  64. package/dist/{chunk-PJP2TOCB.js → chunk-NV6R6HJR.js} +5 -5
  65. package/dist/{chunk-PJP2TOCB.js.map → chunk-NV6R6HJR.js.map} +1 -1
  66. package/dist/{chunk-Y5E6LHSQ.js → chunk-NYRLSXTB.js} +125 -67
  67. package/dist/chunk-NYRLSXTB.js.map +1 -0
  68. package/dist/{chunk-DHYIUGZW.js → chunk-P2PXD3AF.js} +6 -6
  69. package/dist/{chunk-DHYIUGZW.js.map → chunk-P2PXD3AF.js.map} +1 -1
  70. package/dist/{chunk-JF77XKD7.js → chunk-Q5WGUPC5.js} +3 -3
  71. package/dist/{chunk-JF77XKD7.js.map → chunk-Q5WGUPC5.js.map} +1 -1
  72. package/dist/{chunk-U4AA7MOV.js → chunk-QAH24E5U.js} +6 -3
  73. package/dist/chunk-QAH24E5U.js.map +1 -0
  74. package/dist/{chunk-CNYIITSZ.js → chunk-R4OMDCGZ.js} +3 -3
  75. package/dist/{chunk-CNYIITSZ.js.map → chunk-R4OMDCGZ.js.map} +1 -1
  76. package/dist/{chunk-MKJ2QYID.js → chunk-RN3N7PHY.js} +5 -5
  77. package/dist/{chunk-MKJ2QYID.js.map → chunk-RN3N7PHY.js.map} +1 -1
  78. package/dist/{chunk-XXRQHASJ.js → chunk-S5TEP5WI.js} +7 -7
  79. package/dist/{chunk-XXRQHASJ.js.map → chunk-S5TEP5WI.js.map} +1 -1
  80. package/dist/chunk-SDNGG6FB.js +32 -0
  81. package/dist/chunk-SDNGG6FB.js.map +1 -0
  82. package/dist/{chunk-REILIKVM.js → chunk-SU5LVG6T.js} +3 -3
  83. package/dist/{chunk-REILIKVM.js.map → chunk-SU5LVG6T.js.map} +1 -1
  84. package/dist/{chunk-23BTREZQ.js → chunk-TKHJXUG3.js} +4 -4
  85. package/dist/{chunk-23BTREZQ.js.map → chunk-TKHJXUG3.js.map} +1 -1
  86. package/dist/{chunk-GVOPQBGM.js → chunk-U4LC6PLI.js} +4 -4
  87. package/dist/{chunk-GVOPQBGM.js.map → chunk-U4LC6PLI.js.map} +1 -1
  88. package/dist/{chunk-YSJKLJD4.js → chunk-VRBEMXEM.js} +3 -3
  89. package/dist/{chunk-YSJKLJD4.js.map → chunk-VRBEMXEM.js.map} +1 -1
  90. package/dist/{chunk-JHPBSZIP.js → chunk-XENB453B.js} +4 -4
  91. package/dist/{chunk-JHPBSZIP.js.map → chunk-XENB453B.js.map} +1 -1
  92. package/dist/cli/index.js +53 -52
  93. package/dist/cli/index.js.map +1 -1
  94. package/dist/connectors/config.js +4 -4
  95. package/dist/connectors/index.js +12 -11
  96. package/dist/connectors/src/classify-connect-error.d.ts +20 -0
  97. package/dist/connectors/src/classify-connect-error.d.ts.map +1 -0
  98. package/dist/connectors/src/config.d.ts.map +1 -1
  99. package/dist/connectors/src/connect-error-kind.d.ts +47 -0
  100. package/dist/connectors/src/connect-error-kind.d.ts.map +1 -0
  101. package/dist/connectors/src/connector-manager.d.ts +9 -0
  102. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  103. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  104. package/dist/connectors/src/connector-types.d.ts +25 -0
  105. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  106. package/dist/connectors/src/index.d.ts +5 -2
  107. package/dist/connectors/src/index.d.ts.map +1 -1
  108. package/dist/connectors-shared/index.js +2 -0
  109. package/dist/connectors-shared/index.js.map +1 -1
  110. package/dist/connectors-shared/src/index.d.ts +7 -2
  111. package/dist/connectors-shared/src/index.d.ts.map +1 -1
  112. package/dist/core/index.js +3 -3
  113. package/dist/core/runtime-assets.js +2 -2
  114. package/dist/core/src/index.d.ts +1 -1
  115. package/dist/core/src/index.d.ts.map +1 -1
  116. package/dist/core/src/workspace-config.d.ts +64 -0
  117. package/dist/core/src/workspace-config.d.ts.map +1 -1
  118. package/dist/core/workspace-config.js +1 -1
  119. package/dist/deploy/index.js +3 -3
  120. package/dist/{ensure-sources-J5J2TBRA.js → ensure-sources-E5C3NAZ5.js} +9 -9
  121. package/dist/{ensure-sources-J5J2TBRA.js.map → ensure-sources-E5C3NAZ5.js.map} +1 -1
  122. package/dist/factory-assets/connectors/box.js +12 -11
  123. package/dist/factory-assets/connectors/deploy.js +12 -11
  124. package/dist/factory-assets/connectors/devserver.js +12 -11
  125. package/dist/factory-assets/connectors/flow/adapter.js +12 -11
  126. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  127. package/dist/factory-assets/connectors/flow/run-flow.js +13 -12
  128. package/dist/factory-assets/connectors/flow.js +12 -11
  129. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  130. package/dist/factory-assets/connectors/git.js +12 -11
  131. package/dist/factory-assets/connectors/gmail.js +12 -11
  132. package/dist/factory-assets/connectors/googledrive.js +12 -11
  133. package/dist/factory-assets/connectors/local.js +12 -11
  134. package/dist/factory-assets/connectors/mattermost.js +12 -11
  135. package/dist/factory-assets/connectors/memory.js +12 -11
  136. package/dist/factory-assets/connectors/minio.js +12 -11
  137. package/dist/factory-assets/connectors/postgres.js +12 -11
  138. package/dist/factory-assets/connectors/s3.js +12 -11
  139. package/dist/factory-assets/connectors/sharepoint.js +12 -11
  140. package/dist/factory-assets/connectors/sqlite.js +12 -11
  141. package/dist/factory-assets/connectors/static-server.js +12 -11
  142. package/dist/factory-assets/connectors/tunnel.js +12 -11
  143. package/dist/factory-assets/connectors/webdav.js +12 -11
  144. package/dist/factory-assets/connectors/xstate-store.js +12 -11
  145. package/dist/factory-assets/connectors/xstate.js +12 -11
  146. package/dist/{flows-X4KJC4RH.js → flows-DAA2HPCK.js} +6 -6
  147. package/dist/{flows-X4KJC4RH.js.map → flows-DAA2HPCK.js.map} +1 -1
  148. package/dist/{helpers-OJJNDSPO.js → helpers-B37XGJHI.js} +9 -9
  149. package/dist/{helpers-OJJNDSPO.js.map → helpers-B37XGJHI.js.map} +1 -1
  150. package/dist/library/index.js +4 -4
  151. package/dist/library/install.js +3 -3
  152. package/dist/{library-publish-TDT5HCLA.js → library-publish-ANMJDDZH.js} +13 -13
  153. package/dist/{library-publish-TDT5HCLA.js.map → library-publish-ANMJDDZH.js.map} +1 -1
  154. package/dist/{open-library-OAVUUOAN.js → open-library-O5HS654Y.js} +11 -11
  155. package/dist/{open-library-OAVUUOAN.js.map → open-library-O5HS654Y.js.map} +1 -1
  156. package/dist/{paths-FRD62K2N.js → paths-LH7LD4CC.js} +6 -6
  157. package/dist/{paths-FRD62K2N.js.map → paths-LH7LD4CC.js.map} +1 -1
  158. package/dist/{plugin-store-54SEASTK.js → plugin-store-A6VLQHCT.js} +5 -5
  159. package/dist/{plugin-store-54SEASTK.js.map → plugin-store-A6VLQHCT.js.map} +1 -1
  160. package/dist/{project-PNSDEXUH.js → project-DLAPSJ36.js} +10 -10
  161. package/dist/{project-PNSDEXUH.js.map → project-DLAPSJ36.js.map} +1 -1
  162. package/dist/resolver/index.js +3 -3
  163. package/dist/runner/index.js +18 -17
  164. package/dist/runner/src/runner-capabilities.d.ts +33 -2
  165. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  166. package/dist/runner/src/serial-lock.d.ts +17 -0
  167. package/dist/runner/src/serial-lock.d.ts.map +1 -0
  168. package/dist/runner/src/serve.d.ts.map +1 -1
  169. package/dist/runner/src/session-capability-wiring.d.ts +5 -0
  170. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  171. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  172. package/dist/runner/src/skill-staging.d.ts +76 -0
  173. package/dist/runner/src/skill-staging.d.ts.map +1 -0
  174. package/dist/sdk/asset-manager.js +6 -6
  175. package/dist/sdk/bridge.js +8 -8
  176. package/dist/sdk/core.js +3 -3
  177. package/dist/sdk/flow.js +4 -4
  178. package/dist/sdk/index.js +18 -17
  179. package/dist/sdk/index.js.map +1 -1
  180. package/dist/sdk/resolver.js +3 -3
  181. package/dist/sdk/runner.js +18 -17
  182. package/dist/sdk/session.js +2 -2
  183. package/dist/sdk/store.js +1 -1
  184. package/dist/sdk/types.js +1 -1
  185. package/dist/session/index.js +2 -2
  186. package/dist/{setup-6FAITLPM.js → setup-TMPJSDCX.js} +15 -15
  187. package/dist/{setup-6FAITLPM.js.map → setup-TMPJSDCX.js.map} +1 -1
  188. package/dist/{skills-C6NOMIBV.js → skills-ZO66BL2Y.js} +5 -5
  189. package/dist/{skills-C6NOMIBV.js.map → skills-ZO66BL2Y.js.map} +1 -1
  190. package/dist/{source-RTVNF6GB.js → source-5WMBWNO7.js} +12 -12
  191. package/dist/{source-RTVNF6GB.js.map → source-5WMBWNO7.js.map} +1 -1
  192. package/dist/{source-manifest-publish-U2PVHXCF.js → source-manifest-publish-WBVQV3JC.js} +14 -14
  193. package/dist/{source-manifest-publish-U2PVHXCF.js.map → source-manifest-publish-WBVQV3JC.js.map} +1 -1
  194. package/dist/store/index.js +1 -1
  195. package/dist/store/src/resource-client.d.ts.map +1 -1
  196. package/dist/store/src/types.d.ts +3 -1
  197. package/dist/store/src/types.d.ts.map +1 -1
  198. package/dist/tui/index.js +18 -17
  199. package/dist/tui/index.js.map +1 -1
  200. package/dist/types/index.js +1 -1
  201. package/dist/types/src/events.d.ts +22 -0
  202. package/dist/types/src/events.d.ts.map +1 -1
  203. package/dist/types/src/index.d.ts +2 -1
  204. package/dist/types/src/index.d.ts.map +1 -1
  205. package/dist/validator-FA2PFW6N.js +5 -0
  206. package/dist/{validator-P5ESKTW5.js.map → validator-FA2PFW6N.js.map} +1 -1
  207. package/dist/workspace-plugin/adapters/mcp.js +7 -7
  208. package/dist/workspace-plugin/adapters/omp.js +10 -10
  209. package/dist/workspace-plugin/index.js +1 -1
  210. package/dist/workspace-plugin/src/tools/validator.d.ts +1 -0
  211. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  212. package/package.json +1 -1
  213. package/dist/chunk-3OLCTLTH.js.map +0 -1
  214. package/dist/chunk-6GA27VV4.js.map +0 -1
  215. package/dist/chunk-JXCUUZA3.js.map +0 -1
  216. package/dist/chunk-K27T47OO.js.map +0 -1
  217. package/dist/chunk-KW7YIRYL.js.map +0 -1
  218. package/dist/chunk-U4AA7MOV.js.map +0 -1
  219. package/dist/chunk-Y5E6LHSQ.js.map +0 -1
  220. package/dist/validator-P5ESKTW5.js +0 -5
@@ -1,6 +1,6 @@
1
- import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-JF77XKD7.js';
2
- import { getStaticModels, fetchProviderModels } from './chunk-VP2CACF2.js';
3
- import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-C2CYBRYJ.js';
1
+ import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-Q5WGUPC5.js';
2
+ import { getStaticModels, fetchProviderModels } from './chunk-IUVPPJ4T.js';
3
+ import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-5GYFYGVW.js';
4
4
  import * as z from 'zod';
5
5
 
6
6
  var GOOGLE_DEFAULT_BASE_URL = getProviderPreset("google")?.base_url;
@@ -183,5 +183,5 @@ var geminiDriverTarget = {
183
183
  };
184
184
 
185
185
  export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget };
186
- //# sourceMappingURL=chunk-PJP2TOCB.js.map
187
- //# sourceMappingURL=chunk-PJP2TOCB.js.map
186
+ //# sourceMappingURL=chunk-NV6R6HJR.js.map
187
+ //# sourceMappingURL=chunk-NV6R6HJR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-PJP2TOCB.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-NV6R6HJR.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
@@ -1,16 +1,17 @@
1
- import { resolveAuthRef } from './chunk-KW7YIRYL.js';
2
- import { EventNormalizer } from './chunk-GVOPQBGM.js';
3
- import { resolveModelTier } from './chunk-VP2CACF2.js';
4
- import { createDriver } from './chunk-C2CYBRYJ.js';
1
+ import { declaredConnectErrorKind, ClassifiedConnectError, withConnectErrorKind } from './chunk-SDNGG6FB.js';
2
+ import { OAuthRequiredError, ConnectorFieldMissingError, LegacyAuthGrammarError, resolveAuthRef, readUnavailableMarker, ConnectorStartupError } from './chunk-DYT3AQBM.js';
3
+ import { EventNormalizer } from './chunk-U4LC6PLI.js';
4
+ import { resolveModelTier } from './chunk-IUVPPJ4T.js';
5
+ import { createDriver } from './chunk-5GYFYGVW.js';
5
6
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
6
7
  import { computeStimulus } from './chunk-IFGTRL2I.js';
7
- import { interpolateNodeInstruction, resolveNodeBindings, getConsumedOutputSchema, validateConsumedNodeOutput, appendAttempt, resolveTerminalFailureStatus, remainingActiveExecutionMs, deriveCheckEvidence, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, countFailedAttempts, hasAutomaticRetryBudget, persistedRouterSelection } from './chunk-NWZQMJTI.js';
8
+ import { interpolateNodeInstruction, resolveNodeBindings, getConsumedOutputSchema, validateConsumedNodeOutput, appendAttempt, resolveTerminalFailureStatus, remainingActiveExecutionMs, deriveCheckEvidence, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, countFailedAttempts, hasAutomaticRetryBudget, persistedRouterSelection } from './chunk-NIHNZC6E.js';
8
9
  import { INPUT_SCHEMA_SHAPES_HINT, coerceInputSchema } from './chunk-TIOT3ZOQ.js';
9
10
  import { classifierDecision, withoutReservedClassifierFields, parseFlowDefinition } from './chunk-53ORCYPJ.js';
10
11
  import { describeStimulus, buildOrchestratorPrompt, renderSubpromptPrompt, renderStimulusPrompt } from './chunk-2D5BYAL6.js';
11
12
  import { deterministicNodeKindLabel, nodeInstruction, flowDefaults, isAgentNode, isGateNode, isCheckNode, nodeRequiresApproval, isSubFlowNode, isFunctionNode, isSubpromptNode, isRouterNode, isActiveRuntimeNode, nodeIsOptional, nodeLabel, nodeAssets } from './chunk-ELPR5XBG.js';
12
- import { withActivityLabelDefs } from './chunk-U4AA7MOV.js';
13
- import { processAlive } from './chunk-UJPVUN6H.js';
13
+ import { withActivityLabelDefs } from './chunk-QAH24E5U.js';
14
+ import { processAlive } from './chunk-BCXZ74DM.js';
14
15
  import { withFsDeadline, tryWithFsDeadline, FsDeadlineError, fsDeadlineMs } from './chunk-MKZOK4JU.js';
15
16
  import { portableSpawn } from './chunk-KSIRR5PL.js';
16
17
  import { createLogger } from './chunk-W4IPN3DD.js';
@@ -734,6 +735,16 @@ function runIsolatedPrompt(driver, prompt) {
734
735
  driver.prompt(prompt).catch(done);
735
736
  });
736
737
  }
738
+
739
+ // connectors/src/classify-connect-error.ts
740
+ function classifyConnectError(err) {
741
+ const declared = declaredConnectErrorKind(err);
742
+ if (declared) return declared;
743
+ if (err instanceof OAuthRequiredError) return "credential";
744
+ if (err instanceof ConnectorFieldMissingError) return "config";
745
+ if (err instanceof LegacyAuthGrammarError) return "config";
746
+ return void 0;
747
+ }
737
748
  var execFileAsync = promisify(execFile);
738
749
  var GIT_REV_PARSE_TIMEOUT_MS = 15e3;
739
750
  var DeployConnector = class extends AbstractConnector {
@@ -1663,6 +1674,15 @@ async function clearStaleIndexLock(targetDir, log) {
1663
1674
  log.warn("removed an abandoned .git/index.lock", { lockPath, ageMs });
1664
1675
  }
1665
1676
  }
1677
+ function isIndexLockFailure(err) {
1678
+ const stderr = err?.stderr;
1679
+ return typeof stderr === "string" && /index\.lock/.test(stderr);
1680
+ }
1681
+ function gitLocalCheckout(args, cwd) {
1682
+ return git(["checkout", ...args], cwd).catch((err) => {
1683
+ throw typeof err?.code === "number" ? withConnectErrorKind(err, "repo-state") : err;
1684
+ });
1685
+ }
1666
1686
  async function syncSubmodules(cwd, log) {
1667
1687
  if (!await pathExists(join(cwd, ".gitmodules"))) return;
1668
1688
  try {
@@ -1743,6 +1763,8 @@ async function commitAll(cwd, message) {
1743
1763
  return gitCommitting(["commit", "-m", message], cwd);
1744
1764
  }
1745
1765
  var TokenMediatorError = class extends Error {
1766
+ /** Every mediator refusal is fixed where the credential lives, whatever its code. */
1767
+ skaileConnectErrorKind = "credential";
1746
1768
  code;
1747
1769
  constructor(message, code, connectorId) {
1748
1770
  super(`Git connector '${connectorId}': backend mediator ${code} \u2014 ${message}`);
@@ -1804,10 +1826,10 @@ var GitConnector = class extends AbstractConnector {
1804
1826
  let credentialAlignmentAttempted = false;
1805
1827
  if (!url) {
1806
1828
  this.log.error("connect failed: missing mount.source URL", void 0);
1807
- throw new Error("Git connector requires a mount.source URL");
1829
+ throw new ClassifiedConnectError("Git connector requires a mount.source URL", "config");
1808
1830
  }
1809
1831
  if (!isValidGitRefOrSha(branch)) {
1810
- throw new Error(`Git connector: invalid branch name "${branch}"`);
1832
+ throw new ClassifiedConnectError(`Git connector: invalid branch name "${branch}"`, "config");
1811
1833
  }
1812
1834
  try {
1813
1835
  this.log.info("mount start", { url, branch, targetDir });
@@ -1888,6 +1910,7 @@ var GitConnector = class extends AbstractConnector {
1888
1910
  }
1889
1911
  }
1890
1912
  this.registerUnavailableCredentialHelper(declaration, credentialScopeUrl, err);
1913
+ if (isIndexLockFailure(err)) withConnectErrorKind(err, "repo-state");
1891
1914
  throw err;
1892
1915
  }
1893
1916
  }
@@ -1976,11 +1999,14 @@ var GitConnector = class extends AbstractConnector {
1976
1999
  async checkoutSessionBranch(state, session, targetDir) {
1977
2000
  const sessionBranch = `${session.branchPrefix}${session.slug}`;
1978
2001
  if (!isValidGitRefOrSha(sessionBranch)) {
1979
- throw new Error(`Git connector: invalid session branch name "${sessionBranch}"`);
2002
+ throw new ClassifiedConnectError(
2003
+ `Git connector: invalid session branch name "${sessionBranch}"`,
2004
+ "config"
2005
+ );
1980
2006
  }
1981
2007
  let created = false;
1982
2008
  if (await localBranchExists(sessionBranch, targetDir)) {
1983
- await git(["checkout", sessionBranch], targetDir);
2009
+ await gitLocalCheckout([sessionBranch], targetDir);
1984
2010
  this.log.info("reusing existing local session branch", { sessionBranch });
1985
2011
  } else {
1986
2012
  let originHasBranch = false;
@@ -1990,9 +2016,9 @@ var GitConnector = class extends AbstractConnector {
1990
2016
  } catch {
1991
2017
  }
1992
2018
  if (originHasBranch) {
1993
- await git(["checkout", "-B", sessionBranch, `origin/${sessionBranch}`], targetDir);
2019
+ await gitLocalCheckout(["-B", sessionBranch, `origin/${sessionBranch}`], targetDir);
1994
2020
  } else if (!await this.branchFromRef(session, sessionBranch, targetDir)) {
1995
- await git(["checkout", "-b", sessionBranch], targetDir);
2021
+ await gitLocalCheckout(["-b", sessionBranch], targetDir);
1996
2022
  created = true;
1997
2023
  } else {
1998
2024
  created = true;
@@ -2312,8 +2338,9 @@ var GitConnector = class extends AbstractConnector {
2312
2338
  }
2313
2339
  if (authRef.kind === "backend") {
2314
2340
  if (!tokenMediator) {
2315
- throw new Error(
2316
- `Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead).`
2341
+ throw new ClassifiedConnectError(
2342
+ `Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead).`,
2343
+ "config"
2317
2344
  );
2318
2345
  }
2319
2346
  const result = await tokenMediator({ connectorId: declaration.id, reason: "initial" });
@@ -2342,8 +2369,9 @@ var GitConnector = class extends AbstractConnector {
2342
2369
  token = inner;
2343
2370
  }
2344
2371
  if (!token) {
2345
- throw new Error(
2346
- `PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain.`
2372
+ throw new ClassifiedConnectError(
2373
+ `PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain.`,
2374
+ "credential"
2347
2375
  );
2348
2376
  }
2349
2377
  return { authRef, token, expiresAt: null };
@@ -6261,34 +6289,6 @@ function ensureBuiltinsRegistered() {
6261
6289
  }
6262
6290
  }
6263
6291
 
6264
- // connectors/src/connector-types.ts
6265
- var ConnectorFieldMissingError = class extends Error {
6266
- connectorId;
6267
- field;
6268
- triedRef;
6269
- availableProviders;
6270
- constructor(opts) {
6271
- super(
6272
- `Connector "${opts.connectorId}" is missing required field "${opts.field.key}" (tried: ${opts.triedRef || "(none)"}). Available providers: ${opts.availableProviders.join(", ") || "(none)"}`
6273
- );
6274
- this.name = "ConnectorFieldMissingError";
6275
- this.connectorId = opts.connectorId;
6276
- this.field = opts.field;
6277
- this.triedRef = opts.triedRef;
6278
- this.availableProviders = opts.availableProviders;
6279
- }
6280
- };
6281
- var ConnectorStartupError = class extends Error {
6282
- report;
6283
- failedReadWrite;
6284
- constructor(message, report, failedReadWrite) {
6285
- super(message);
6286
- this.name = "ConnectorStartupError";
6287
- this.report = report;
6288
- this.failedReadWrite = failedReadWrite;
6289
- }
6290
- };
6291
-
6292
6292
  // connectors/src/connector-manager.ts
6293
6293
  var KNOWN_PREFIXES = ["env:", "forge:", "op:", "kp:", "oauth:"];
6294
6294
  function hasKnownPrefix(ref) {
@@ -6491,16 +6491,18 @@ var ConnectorManager = class {
6491
6491
  if (registered) return registered;
6492
6492
  const entry = this.catalogEntries.find((e) => e.kind === "connector" && e.name === driver);
6493
6493
  if (!entry) {
6494
- throw new Error(
6495
- `Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors.`
6494
+ throw new ClassifiedConnectError(
6495
+ `Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors.`,
6496
+ "config"
6496
6497
  );
6497
6498
  }
6498
6499
  const entryPoint = entry.metadata?.entry ?? "./connector.ts";
6499
6500
  const connectorPath = resolve(dirname(entry.source), entryPoint);
6500
6501
  const mod = await import(connectorPath);
6501
6502
  if (typeof mod.createConnector !== "function") {
6502
- throw new Error(
6503
- `Connector "${driver}" at ${connectorPath} does not export createConnector()`
6503
+ throw new ClassifiedConnectError(
6504
+ `Connector "${driver}" at ${connectorPath} does not export createConnector()`,
6505
+ "config"
6504
6506
  );
6505
6507
  }
6506
6508
  const connector = mod.createConnector();
@@ -6535,8 +6537,9 @@ var ConnectorManager = class {
6535
6537
  const owner = this.mountTargets.get(absPath);
6536
6538
  if (owner === id) return;
6537
6539
  if (owner !== void 0) {
6538
- throw new Error(
6539
- `Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target.`
6540
+ throw new ClassifiedConnectError(
6541
+ `Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target.`,
6542
+ "config"
6540
6543
  );
6541
6544
  }
6542
6545
  for (const [otherPath, otherId] of this.mountTargets) {
@@ -6556,7 +6559,7 @@ var ConnectorManager = class {
6556
6559
  * Remember a connect failure so the agent can be told about it. Called from
6557
6560
  * both the bulk (`attemptConnect`) and hot-plug (`connect`) failure paths.
6558
6561
  */
6559
- recordFailure(decl, error) {
6562
+ recordFailure(decl, error, unavailable) {
6560
6563
  if (this.active.has(decl.id)) return;
6561
6564
  let mountPath;
6562
6565
  if (decl.mount != null) {
@@ -6572,9 +6575,29 @@ var ConnectorManager = class {
6572
6575
  ...decl.label !== void 0 ? { label: decl.label } : {},
6573
6576
  ...decl.mount?.source !== void 0 ? { source: decl.mount.source } : {},
6574
6577
  ...mountPath !== void 0 ? { mountPath } : {},
6575
- required: decl.access === "read-write" && decl.mount != null,
6576
- error
6578
+ // A host-declared unavailable connector is never fail-fast material.
6579
+ required: unavailable === void 0 && decl.access === "read-write" && decl.mount != null,
6580
+ error,
6581
+ ...unavailable !== void 0 ? { unavailable } : {}
6582
+ });
6583
+ }
6584
+ /**
6585
+ * Record a host-declared unavailable connector as failed without touching its
6586
+ * driver or mount target. Returns the failure message.
6587
+ *
6588
+ * No `connector_status` is emitted: the host that wrote the marker already
6589
+ * holds this failure with its own typed reason, and an echoed event would be
6590
+ * newer than that record and replace it in a host's newest-wins failure view.
6591
+ */
6592
+ recordUnavailable(decl, unavailable) {
6593
+ const msg = `Not attached by the host (${unavailable.reason})` + (unavailable.detail ? `: ${unavailable.detail}` : "");
6594
+ this.recordFailure(decl, msg, unavailable);
6595
+ this.mgrLog.warn("connector declared unavailable by the host", {
6596
+ id: decl.id,
6597
+ driver: decl.driver,
6598
+ reason: unavailable.reason
6577
6599
  });
6600
+ return msg;
6578
6601
  }
6579
6602
  /** Release every mount target owned by `id` (on disconnect). */
6580
6603
  releaseMountTarget(id) {
@@ -6656,7 +6679,7 @@ var ConnectorManager = class {
6656
6679
  const claimed = [];
6657
6680
  try {
6658
6681
  for (const decl of declarations) {
6659
- if (decl.mount == null) continue;
6682
+ if (decl.mount == null || readUnavailableMarker(decl.unavailable)) continue;
6660
6683
  const absPath = this.resolveMountTarget(decl);
6661
6684
  const isNew = !this.mountTargets.has(absPath);
6662
6685
  this.reserveMountTarget(decl.id, absPath);
@@ -6677,9 +6700,10 @@ var ConnectorManager = class {
6677
6700
  });
6678
6701
  if (options?.failOnReadWriteError) {
6679
6702
  const declById = new Map(declarations.map((d) => [d.id, d]));
6680
- const failedRw = results.filter(
6681
- (r) => !r.connected && r.access === "read-write" && declById.get(r.id)?.mount != null
6682
- ).map((r) => ({ id: r.id, error: r.error ?? "unknown error" }));
6703
+ const failedRw = results.filter((r) => {
6704
+ const decl = declById.get(r.id);
6705
+ return !r.connected && r.access === "read-write" && decl?.mount != null && !readUnavailableMarker(decl.unavailable);
6706
+ }).map((r) => ({ id: r.id, error: r.error ?? "unknown error" }));
6683
6707
  if (failedRw.length > 0) {
6684
6708
  const summary = failedRw.map((f) => `"${f.id}": ${f.error}`).join("; ");
6685
6709
  this.mgrLog.error("connectAll failed: required read-write connector(s) failed", void 0, {
@@ -6700,6 +6724,11 @@ var ConnectorManager = class {
6700
6724
  * can keep going.
6701
6725
  */
6702
6726
  async attemptConnect(decl, preResolved) {
6727
+ const unavailable = readUnavailableMarker(decl.unavailable);
6728
+ if (unavailable) {
6729
+ const msg = this.recordUnavailable(decl, unavailable);
6730
+ return { id: decl.id, connected: false, error: msg, access: decl.access };
6731
+ }
6703
6732
  this.opts.onStatusChange?.({
6704
6733
  type: "connector_status",
6705
6734
  connectorId: decl.id,
@@ -6744,12 +6773,18 @@ var ConnectorManager = class {
6744
6773
  if (!this.active.has(decl.id)) this.releaseMountTarget(decl.id);
6745
6774
  const msg = err instanceof Error ? err.message : String(err);
6746
6775
  this.recordFailure(decl, msg);
6747
- this.mgrLog.error("connect failed", err, { id: decl.id, driver: decl.driver });
6776
+ const errorKind = classifyConnectError(err);
6777
+ this.mgrLog.error("connect failed", err, {
6778
+ id: decl.id,
6779
+ driver: decl.driver,
6780
+ ...errorKind ? { errorKind } : {}
6781
+ });
6748
6782
  this.opts.onStatusChange?.({
6749
6783
  type: "connector_status",
6750
6784
  connectorId: decl.id,
6751
6785
  status: "error",
6752
- error: msg
6786
+ error: msg,
6787
+ ...errorKind ? { errorKind } : {}
6753
6788
  });
6754
6789
  return {
6755
6790
  id: decl.id,
@@ -6799,6 +6834,20 @@ var ConnectorManager = class {
6799
6834
  * @returns The `ConnectorHandle` for subsequent operations.
6800
6835
  */
6801
6836
  async connect(declaration) {
6837
+ const unavailable = readUnavailableMarker(declaration.unavailable);
6838
+ if (unavailable) {
6839
+ if (this.active.has(declaration.id)) {
6840
+ try {
6841
+ await this.disconnect(declaration.id);
6842
+ } catch (err) {
6843
+ this.mgrLog.warn("disconnect before marking unavailable failed", {
6844
+ id: declaration.id,
6845
+ error: err instanceof Error ? err.message : String(err)
6846
+ });
6847
+ }
6848
+ }
6849
+ throw new Error(this.recordUnavailable(declaration, unavailable));
6850
+ }
6802
6851
  this.opts.onStatusChange?.({
6803
6852
  type: "connector_status",
6804
6853
  connectorId: declaration.id,
@@ -6834,11 +6883,13 @@ var ConnectorManager = class {
6834
6883
  this.releaseMountTarget(declaration.id);
6835
6884
  const msg = err instanceof Error ? err.message : String(err);
6836
6885
  this.recordFailure(declaration, msg);
6886
+ const errorKind = classifyConnectError(err);
6837
6887
  this.opts.onStatusChange?.({
6838
6888
  type: "connector_status",
6839
6889
  connectorId: declaration.id,
6840
6890
  status: "error",
6841
- error: msg
6891
+ error: msg,
6892
+ ...errorKind ? { errorKind } : {}
6842
6893
  });
6843
6894
  throw err;
6844
6895
  }
@@ -7565,16 +7616,17 @@ function buildFailedConnectorSection(failed) {
7565
7616
  const lines = [
7566
7617
  "## Mount failures \u2014 read this first",
7567
7618
  "",
7568
- "The following connectors **failed to connect** in this session. Their directories are ordinary local folders: **not** connected, **not** synced, and **not** backend-managed git worktrees. Any other statement in this prompt \u2014 including the host platform's own description of the workspace \u2014 that describes these paths as a managed, synced, or version-controlled workspace **is superseded by this section**.",
7619
+ "The following connectors **failed to connect** in this session. Their directories, where they exist, are ordinary local folders: **not** connected, **not** synced, and **not** backend-managed git worktrees. Any other statement in this prompt \u2014 including the host platform's own description of the workspace \u2014 that describes these paths as a managed, synced, or version-controlled workspace **is superseded by this section**.",
7569
7620
  "",
7570
7621
  "| Mount | Driver | Path | Access | Required | Failure |",
7571
7622
  "|---|---|---|---|---|---|"
7572
7623
  ];
7573
7624
  for (const f of failed) {
7574
- const path = f.mountPath ?? f.source ?? "(no mount)";
7625
+ const where = f.mountPath ?? f.source;
7626
+ const path = where === void 0 ? "`(no mount)`" : f.unavailable !== void 0 ? `\`${where}\` (not created by this declaration \u2014 do not write here)` : `\`${where}\``;
7575
7627
  const required = f.required ? "yes" : "no";
7576
7628
  lines.push(
7577
- `| ${f.id} | ${f.driver} | \`${path}\` | ${f.access} | ${required} | ${oneLine(f.error)} |`
7629
+ `| ${f.id} | ${f.driver} | ${path} | ${f.access} | ${required} | ${oneLine(f.error)} |`
7578
7630
  );
7579
7631
  }
7580
7632
  lines.push("");
@@ -7585,6 +7637,12 @@ function buildFailedConnectorSection(failed) {
7585
7637
  lines.push(
7586
7638
  "**There is nothing to fix inside this workspace.** The credential for a mount is minted by the host platform, not by anything in here and not by any project setting \u2014 there is no credential field to fill in. Report the failure text above verbatim to the user and ask them to reconnect the connector's provider link on the platform, then restart the session. Do not retry the connection yourself; a connector that failed at startup stays failed until the session restarts."
7587
7639
  );
7640
+ if (failed.some((f) => f.unavailable !== void 0)) {
7641
+ lines.push("");
7642
+ lines.push(
7643
+ "**`Not attached by the host`** means the host platform declined the mount before this session started, so no connection was attempted here. The reason and detail are the platform's own: pass them on, since the fix may be the mount's declaration in the platform's settings rather than its credential. Such a mount's directory was **not created by this declaration**, so reading it normally fails with `ENOENT` (a directory left by an earlier, replaced connection may remain). Do not create it or write there: a path inside the primary workspace would put the files into that workspace, where they are synced and committed as if they belonged to it."
7644
+ );
7645
+ }
7588
7646
  if (failed.some((f) => f.driver === "git")) {
7589
7647
  lines.push("");
7590
7648
  lines.push(
@@ -11081,6 +11139,6 @@ function describeFlowOperations() {
11081
11139
  return new FlowAdapter().tools.describeOperations({ access: "read-write" });
11082
11140
  }
11083
11141
 
11084
- export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, MAX_REARM_MS, MIN_REFRESH_DELAY_MS, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NO_ACTIVE_FLOW_ERROR, PortPool, PostgresConnector, REFRESH_LEAD_MS, S3Connector, SQLiteConnector, SessionInlineSubFlowRunner, SessionNodeExecutor, SessionSubpromptRunner, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildConnectorToolDefs, buildFlowPromptEvent, buildFlowToolDefs, buildLazyFlowToolDefs, buildLazySdkFlowTools, buildSdkConnectorTools, buildSdkFlowTools, classifierQuestion, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, describeFlowOperations, driveOrchestratorTurn, ensureDirMode, ensureFleetMounted, ensureRefreshAttemptStamp, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, removeUnavailableMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock, writeUnavailableMountBlock };
11085
- //# sourceMappingURL=chunk-Y5E6LHSQ.js.map
11086
- //# sourceMappingURL=chunk-Y5E6LHSQ.js.map
11142
+ export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner, ConnectorManager, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, MAX_REARM_MS, MIN_REFRESH_DELAY_MS, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NO_ACTIVE_FLOW_ERROR, PortPool, PostgresConnector, REFRESH_LEAD_MS, S3Connector, SQLiteConnector, SessionInlineSubFlowRunner, SessionNodeExecutor, SessionSubpromptRunner, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildConnectorToolDefs, buildFlowPromptEvent, buildFlowToolDefs, buildLazyFlowToolDefs, buildLazySdkFlowTools, buildSdkConnectorTools, buildSdkFlowTools, classifierQuestion, classifyConnectError, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, describeFlowOperations, driveOrchestratorTurn, ensureDirMode, ensureFleetMounted, ensureRefreshAttemptStamp, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, removeUnavailableMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock, writeUnavailableMountBlock };
11143
+ //# sourceMappingURL=chunk-NYRLSXTB.js.map
11144
+ //# sourceMappingURL=chunk-NYRLSXTB.js.map