@skaile/workspaces 2.0.0 → 2.2.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 (164) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +26 -0
  3. package/dist/{asset-feeds-7VQVISDI.js → asset-feeds-D2LOXTOS.js} +9 -9
  4. package/dist/{asset-feeds-7VQVISDI.js.map → asset-feeds-D2LOXTOS.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +5 -5
  6. package/dist/asset-manager/index.js +9 -9
  7. package/dist/asset-manager/installer.js +6 -6
  8. package/dist/asset-manager/src/index.d.ts +19 -0
  9. package/dist/asset-manager/src/index.d.ts.map +1 -1
  10. package/dist/asset-manager/src/mcp-config.d.ts +58 -0
  11. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -0
  12. package/dist/bridge/drivers/claude-sdk.js +6 -6
  13. package/dist/bridge/drivers/codex.js +1 -1
  14. package/dist/bridge/drivers/continue.js +2 -2
  15. package/dist/bridge/drivers/echo.js +1 -1
  16. package/dist/bridge/drivers/gemini.js +3 -3
  17. package/dist/bridge/drivers/goose.js +2 -2
  18. package/dist/bridge/drivers/omp.js +1 -1
  19. package/dist/bridge/drivers/opencode.js +2 -2
  20. package/dist/bridge/drivers/qwen.js +3 -3
  21. package/dist/bridge/index.js +2 -2
  22. package/dist/{chunk-KYLWY3A7.js → chunk-5BH6ZEGC.js} +9 -9
  23. package/dist/{chunk-KYLWY3A7.js.map → chunk-5BH6ZEGC.js.map} +1 -1
  24. package/dist/{chunk-ST3DLLNZ.js → chunk-63ZPKREA.js} +3 -3
  25. package/dist/{chunk-ST3DLLNZ.js.map → chunk-63ZPKREA.js.map} +1 -1
  26. package/dist/{chunk-6FJH63NN.js → chunk-6HPTB6KT.js} +4 -4
  27. package/dist/{chunk-6FJH63NN.js.map → chunk-6HPTB6KT.js.map} +1 -1
  28. package/dist/{chunk-NYCJ7B27.js → chunk-6I5VRIX3.js} +8 -8
  29. package/dist/{chunk-NYCJ7B27.js.map → chunk-6I5VRIX3.js.map} +1 -1
  30. package/dist/{chunk-SVL4EZJT.js → chunk-6QSGCHE5.js} +5 -5
  31. package/dist/{chunk-SVL4EZJT.js.map → chunk-6QSGCHE5.js.map} +1 -1
  32. package/dist/{chunk-35ELAMQ5.js → chunk-A67FJ4YT.js} +4 -4
  33. package/dist/{chunk-35ELAMQ5.js.map → chunk-A67FJ4YT.js.map} +1 -1
  34. package/dist/{chunk-WCWXDW22.js → chunk-BFIK6NPZ.js} +3 -3
  35. package/dist/{chunk-WCWXDW22.js.map → chunk-BFIK6NPZ.js.map} +1 -1
  36. package/dist/{chunk-DRXDEL3A.js → chunk-BUPFJFGP.js} +3 -3
  37. package/dist/{chunk-DRXDEL3A.js.map → chunk-BUPFJFGP.js.map} +1 -1
  38. package/dist/{chunk-VCU4NPUS.js → chunk-CERGXDGG.js} +4 -4
  39. package/dist/{chunk-VCU4NPUS.js.map → chunk-CERGXDGG.js.map} +1 -1
  40. package/dist/{chunk-KUZEIKZH.js → chunk-DHGMYXOY.js} +4 -4
  41. package/dist/{chunk-KUZEIKZH.js.map → chunk-DHGMYXOY.js.map} +1 -1
  42. package/dist/{chunk-UVW3R6S7.js → chunk-GPMIXOJJ.js} +210 -11
  43. package/dist/chunk-GPMIXOJJ.js.map +1 -0
  44. package/dist/{chunk-LBZP2IYG.js → chunk-I5ESMJMW.js} +2 -2
  45. package/dist/{chunk-LBZP2IYG.js.map → chunk-I5ESMJMW.js.map} +1 -1
  46. package/dist/{chunk-DY2AK577.js → chunk-IR6VPAVH.js} +3 -3
  47. package/dist/{chunk-DY2AK577.js.map → chunk-IR6VPAVH.js.map} +1 -1
  48. package/dist/{chunk-ORZW7MMO.js → chunk-KGIVZOLU.js} +2 -2
  49. package/dist/{chunk-ORZW7MMO.js.map → chunk-KGIVZOLU.js.map} +1 -1
  50. package/dist/{chunk-QIQTYN7F.js → chunk-MAIKGYFR.js} +2 -2
  51. package/dist/{chunk-QIQTYN7F.js.map → chunk-MAIKGYFR.js.map} +1 -1
  52. package/dist/{chunk-72EOJJOM.js → chunk-Q26C5GLO.js} +11 -5
  53. package/dist/chunk-Q26C5GLO.js.map +1 -0
  54. package/dist/{chunk-OYX22NJL.js → chunk-RKMXBOIO.js} +3 -3
  55. package/dist/{chunk-OYX22NJL.js.map → chunk-RKMXBOIO.js.map} +1 -1
  56. package/dist/{chunk-UAQVFATZ.js → chunk-SZJCUC52.js} +5 -5
  57. package/dist/{chunk-UAQVFATZ.js.map → chunk-SZJCUC52.js.map} +1 -1
  58. package/dist/{chunk-WZPADAE7.js → chunk-TQIU4HQG.js} +43 -27
  59. package/dist/chunk-TQIU4HQG.js.map +1 -0
  60. package/dist/{chunk-MMD2KQ3A.js → chunk-UFY2HFLO.js} +3 -3
  61. package/dist/{chunk-MMD2KQ3A.js.map → chunk-UFY2HFLO.js.map} +1 -1
  62. package/dist/{chunk-A5OYCQGT.js → chunk-VSSAJYFK.js} +4 -4
  63. package/dist/{chunk-A5OYCQGT.js.map → chunk-VSSAJYFK.js.map} +1 -1
  64. package/dist/{chunk-Y3JVBJ3Y.js → chunk-WA7ADYSA.js} +4 -4
  65. package/dist/{chunk-Y3JVBJ3Y.js.map → chunk-WA7ADYSA.js.map} +1 -1
  66. package/dist/{chunk-CKVIN4H3.js → chunk-ZNIHTT22.js} +3 -3
  67. package/dist/{chunk-CKVIN4H3.js.map → chunk-ZNIHTT22.js.map} +1 -1
  68. package/dist/cli/index.js +49 -49
  69. package/dist/connectors/config.js +6 -6
  70. package/dist/connectors/index.js +8 -8
  71. package/dist/core/index.js +5 -5
  72. package/dist/core/runtime-assets.js +3 -3
  73. package/dist/core/src/workspace-config.d.ts +10 -0
  74. package/dist/core/src/workspace-config.d.ts.map +1 -1
  75. package/dist/core/workspace-config.js +2 -2
  76. package/dist/deploy/index.js +5 -5
  77. package/dist/{ensure-sources-JLVHHZI2.js → ensure-sources-6QMXRI6D.js} +12 -12
  78. package/dist/{ensure-sources-JLVHHZI2.js.map → ensure-sources-6QMXRI6D.js.map} +1 -1
  79. package/dist/factory-assets/connectors/box.js +8 -8
  80. package/dist/factory-assets/connectors/deploy.js +8 -8
  81. package/dist/factory-assets/connectors/devserver.js +8 -8
  82. package/dist/factory-assets/connectors/flow/adapter.js +8 -8
  83. package/dist/factory-assets/connectors/flow/contract/expression.d.ts +46 -0
  84. package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -0
  85. package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +948 -0
  86. package/dist/factory-assets/connectors/flow/contract/hash.d.ts +6 -0
  87. package/dist/factory-assets/connectors/flow/contract/hash.d.ts.map +1 -0
  88. package/dist/factory-assets/connectors/flow/contract/index.d.ts +6 -0
  89. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -0
  90. package/dist/factory-assets/connectors/flow/contract/json-schema.d.ts +6 -0
  91. package/dist/factory-assets/connectors/flow/contract/json-schema.d.ts.map +1 -0
  92. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts +35 -0
  93. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -0
  94. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +364 -0
  95. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -0
  96. package/dist/factory-assets/connectors/flow/contract.d.ts +2 -0
  97. package/dist/factory-assets/connectors/flow/contract.js +1027 -0
  98. package/dist/factory-assets/connectors/flow/contract.js.map +1 -0
  99. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  100. package/dist/factory-assets/connectors/flow/run-flow.js +9 -9
  101. package/dist/factory-assets/connectors/flow.js +8 -8
  102. package/dist/factory-assets/connectors/git.js +8 -8
  103. package/dist/factory-assets/connectors/gmail.js +8 -8
  104. package/dist/factory-assets/connectors/googledrive.js +8 -8
  105. package/dist/factory-assets/connectors/local.js +8 -8
  106. package/dist/factory-assets/connectors/mattermost.js +8 -8
  107. package/dist/factory-assets/connectors/memory.js +8 -8
  108. package/dist/factory-assets/connectors/minio.js +8 -8
  109. package/dist/factory-assets/connectors/postgres.js +8 -8
  110. package/dist/factory-assets/connectors/s3.js +8 -8
  111. package/dist/factory-assets/connectors/sharepoint.js +8 -8
  112. package/dist/factory-assets/connectors/sqlite.js +8 -8
  113. package/dist/factory-assets/connectors/static-server.js +8 -8
  114. package/dist/factory-assets/connectors/tunnel.js +8 -8
  115. package/dist/factory-assets/connectors/webdav.js +8 -8
  116. package/dist/factory-assets/connectors/xstate-store.js +8 -8
  117. package/dist/factory-assets/connectors/xstate.js +8 -8
  118. package/dist/{flows-LV5WYJ2I.js → flows-TDDBCLNF.js} +8 -8
  119. package/dist/{flows-LV5WYJ2I.js.map → flows-TDDBCLNF.js.map} +1 -1
  120. package/dist/{helpers-PJ3CPUUL.js → helpers-COQ7TDD4.js} +12 -12
  121. package/dist/{helpers-PJ3CPUUL.js.map → helpers-COQ7TDD4.js.map} +1 -1
  122. package/dist/library/index.js +7 -7
  123. package/dist/library/install.js +5 -5
  124. package/dist/{library-publish-HVZRCE3C.js → library-publish-SNPER6PO.js} +15 -15
  125. package/dist/{library-publish-HVZRCE3C.js.map → library-publish-SNPER6PO.js.map} +1 -1
  126. package/dist/{open-library-RMI2FTQ4.js → open-library-VH2VEYQ7.js} +13 -13
  127. package/dist/{open-library-RMI2FTQ4.js.map → open-library-VH2VEYQ7.js.map} +1 -1
  128. package/dist/{paths-JSVTQAVW.js → paths-XZA22IB4.js} +10 -10
  129. package/dist/{paths-JSVTQAVW.js.map → paths-XZA22IB4.js.map} +1 -1
  130. package/dist/{plugin-store-7TVJB2TS.js → plugin-store-CYSNVZIX.js} +7 -7
  131. package/dist/{plugin-store-7TVJB2TS.js.map → plugin-store-CYSNVZIX.js.map} +1 -1
  132. package/dist/{project-P636MSYT.js → project-FKL7PMJV.js} +13 -13
  133. package/dist/{project-P636MSYT.js.map → project-FKL7PMJV.js.map} +1 -1
  134. package/dist/resolver/index.js +5 -5
  135. package/dist/runner/index.js +13 -13
  136. package/dist/runner/src/serve.d.ts +26 -0
  137. package/dist/runner/src/serve.d.ts.map +1 -1
  138. package/dist/sdk/asset-manager.js +9 -9
  139. package/dist/sdk/bridge.js +2 -2
  140. package/dist/sdk/core.js +5 -5
  141. package/dist/sdk/flow.js +5 -5
  142. package/dist/sdk/index.js +13 -13
  143. package/dist/sdk/resolver.js +5 -5
  144. package/dist/sdk/runner.js +13 -13
  145. package/dist/sdk/transport/ws.js +1 -1
  146. package/dist/sdk/transport.js +1 -1
  147. package/dist/{setup-OYW3W3XK.js → setup-BM6HMYJJ.js} +9 -9
  148. package/dist/{setup-OYW3W3XK.js.map → setup-BM6HMYJJ.js.map} +1 -1
  149. package/dist/{skills-QY5PHBD3.js → skills-LHS4TOKK.js} +7 -7
  150. package/dist/{skills-QY5PHBD3.js.map → skills-LHS4TOKK.js.map} +1 -1
  151. package/dist/{source-63CHWDC2.js → source-JIUBJC4F.js} +14 -14
  152. package/dist/{source-63CHWDC2.js.map → source-JIUBJC4F.js.map} +1 -1
  153. package/dist/{source-manifest-publish-DLASGDK5.js → source-manifest-publish-TLH6UWWU.js} +16 -16
  154. package/dist/{source-manifest-publish-DLASGDK5.js.map → source-manifest-publish-TLH6UWWU.js.map} +1 -1
  155. package/dist/transport/index.js +1 -1
  156. package/dist/transport/ws.js +1 -1
  157. package/dist/tui/index.js +13 -13
  158. package/dist/workspace-plugin/adapters/mcp.js +6 -6
  159. package/dist/workspace-plugin/adapters/omp.js +7 -7
  160. package/dist/workspace-plugin/index.js +1 -1
  161. package/package.json +18 -1
  162. package/dist/chunk-72EOJJOM.js.map +0 -1
  163. package/dist/chunk-UVW3R6S7.js.map +0 -1
  164. package/dist/chunk-WZPADAE7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-KUZEIKZH.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 { 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 * 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\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 * Vertex models only — uses `GEMINI_API_KEY` from `apiKeys.google` /\n * `apiKeys.gemini` / env.\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 if (this.config.model) args.push(\"-m\", this.config.model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]);\n const key =\n this.config.apiKeys?.google ??\n this.config.apiKeys?.gemini ??\n this.config.env?.GEMINI_API_KEY ??\n process.env.GEMINI_API_KEY;\n if (key) env.GEMINI_API_KEY = key;\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 override async listModels(): Promise<ModelEntry[]> {\n const key =\n this.config.apiKeys?.google ?? this.config.apiKeys?.gemini ?? process.env.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\"google\", key);\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 (apiKeys) =>\n new GeminiDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-DHGMYXOY.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 { 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 * 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\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 * Vertex models only — uses `GEMINI_API_KEY` from `apiKeys.google` /\n * `apiKeys.gemini` / env.\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 if (this.config.model) args.push(\"-m\", this.config.model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]);\n const key =\n this.config.apiKeys?.google ??\n this.config.apiKeys?.gemini ??\n this.config.env?.GEMINI_API_KEY ??\n process.env.GEMINI_API_KEY;\n if (key) env.GEMINI_API_KEY = key;\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 override async listModels(): Promise<ModelEntry[]> {\n const key =\n this.config.apiKeys?.google ?? this.config.apiKeys?.gemini ?? process.env.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\"google\", key);\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 (apiKeys) =>\n new GeminiDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,19 +1,189 @@
1
- import { resolveLibraryDir, getStoreManifestsDir } from './chunk-35ELAMQ5.js';
2
- import { deployAll, removeAsset, createScaffold } from './chunk-VCU4NPUS.js';
3
- import { writeLock, buildLockFile, readLock, verifyLock, extractForPatch, generatePatch, savePatch, applyPatch } from './chunk-ST3DLLNZ.js';
4
- import { resolveRuntimeAssets, factoryAssetRoots } from './chunk-MMD2KQ3A.js';
5
- import { globalSkaileDir, resolveGlobalBackends, globalCacheRoot, migrateLegacyDir, resolveGlobalSkWorkspaceConfig, resolveSkWorkspaceConfig, getGlobalCacheDir, sourceCacheKey, getRepoCommit, coerceVersion, matchPin, resolveAll, buildProvenanceIndex, ensureRepo, sourceShortName, scanRepo, SKAILE_YAML_DEFAULT, checkRepoStatus, resolveAsset, readLinks, loadMcpServerDeclarations, storeManifestSlug } from './chunk-72EOJJOM.js';
1
+ import { resolveLibraryDir, getStoreManifestsDir } from './chunk-A67FJ4YT.js';
2
+ import { deployAll, removeAsset, createScaffold } from './chunk-CERGXDGG.js';
3
+ import { writeLock, buildLockFile, readLock, verifyLock, extractForPatch, generatePatch, savePatch, applyPatch } from './chunk-63ZPKREA.js';
4
+ import { deployedBase, isDeployed, deployedDir } from './chunk-F3HNW354.js';
5
+ import { resolveRuntimeAssets, factoryAssetRoots } from './chunk-UFY2HFLO.js';
6
+ import { loadMcpServerDeclarations, globalSkaileDir, resolveGlobalBackends, globalCacheRoot, migrateLegacyDir, resolveGlobalSkWorkspaceConfig, resolveSkWorkspaceConfig, getGlobalCacheDir, sourceCacheKey, getRepoCommit, coerceVersion, matchPin, resolveAll, buildProvenanceIndex, ensureRepo, sourceShortName, scanRepo, SKAILE_YAML_DEFAULT, checkRepoStatus, resolveAsset, readLinks, storeManifestSlug } from './chunk-Q26C5GLO.js';
6
7
  import { scanDirectory, parseRequires } from './chunk-DYMWJAL4.js';
7
8
  import { parseAssetRef, slugifyAssetName, assetRefToStr } from './chunk-GEEW6SY2.js';
8
- import { deployedBase, isDeployed, deployedDir } from './chunk-F3HNW354.js';
9
9
  import { appendHistory, getRecentHistory, clearHistory } from './chunk-KTBKW2FI.js';
10
10
  import { commitChanges } from './chunk-UQ6LFBPZ.js';
11
11
  import { spawnSync } from 'child_process';
12
12
  import { existsSync, readdirSync, rmSync, lstatSync, unlinkSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
13
- import { resolve, join, sep, dirname } from 'path';
13
+ import path, { resolve, join, sep, dirname } from 'path';
14
14
  import { gt } from 'semver';
15
15
  import { stringify, parse } from 'yaml';
16
+ import fs from 'fs/promises';
17
+
18
+ var TARGET_MCP_CONFIG = {
19
+ "claude-code": ".mcp.json"
20
+ };
21
+ var RESERVED_MCP_SERVER_IDS = /* @__PURE__ */ new Set([
22
+ "skaile-connectors",
23
+ "skaile-workspace",
24
+ "skaile-capabilities"
25
+ ]);
26
+ var UNSUPPORTED_SECRET_PREFIXES = [
27
+ "vault:",
28
+ "forge:",
29
+ "op:",
30
+ "kp:",
31
+ "oauth:",
32
+ "mount:",
33
+ "connector:",
34
+ "mcp:"
35
+ ];
36
+ var WORKSPACE_MARKER = /\$\{workspace\}/g;
37
+ function substituteWorkspace(value, projectDir) {
38
+ return value.replace(WORKSPACE_MARKER, projectDir);
39
+ }
40
+ function renderSecretRef(value) {
41
+ return value.startsWith("env:") ? `\${${value.slice(4)}}` : value;
42
+ }
43
+ function renderValueMap(map, projectDir) {
44
+ if (!map) return void 0;
45
+ const out = {};
46
+ for (const [k, v] of Object.entries(map)) {
47
+ out[k] = renderSecretRef(projectDir ? substituteWorkspace(v, projectDir) : v);
48
+ }
49
+ return Object.keys(out).length > 0 ? out : void 0;
50
+ }
51
+ function findUnsupportedSecretRef(decl) {
52
+ const values = [...Object.values(decl.env ?? {}), ...Object.values(decl.headers ?? {})];
53
+ return values.find((v) => UNSUPPORTED_SECRET_PREFIXES.some((p) => v.startsWith(p)));
54
+ }
55
+ function skipReason(decl) {
56
+ if (RESERVED_MCP_SERVER_IDS.has(decl.id)) return "reserved id";
57
+ if (decl.launcher === "recipe" || decl.launcher == null && decl.recipe != null) {
58
+ return "requires the skaile platform's Nix recipe runtime";
59
+ }
60
+ if (decl.auth === "backend") return "requires a platform-minted credential";
61
+ if (decl.instanceSecretsFolded) return "resolved credentials are folded in from .instance.json";
62
+ const transport = decl.transport ?? "stdio";
63
+ if (transport === "stdio" && !decl.command) return "no command";
64
+ if (transport !== "stdio" && !decl.url) return "no url";
65
+ const badRef = findUnsupportedSecretRef(decl);
66
+ if (badRef) return `unsupported secret reference '${badRef}'`;
67
+ return void 0;
68
+ }
69
+ function buildEntry(decl, projectDir) {
70
+ const transport = decl.transport ?? "stdio";
71
+ if (transport !== "stdio") {
72
+ const entry2 = { type: transport, url: decl.url };
73
+ const headers = renderValueMap(decl.headers);
74
+ if (headers) entry2.headers = headers;
75
+ return entry2;
76
+ }
77
+ const entry = {
78
+ command: substituteWorkspace(decl.command, projectDir)
79
+ };
80
+ const args = decl.args?.map((a) => substituteWorkspace(a, projectDir));
81
+ if (args && args.length > 0) entry.args = args;
82
+ const env = renderValueMap(decl.env, projectDir);
83
+ if (env) entry.env = env;
84
+ return entry;
85
+ }
86
+ function managedStatePath(projectDir) {
87
+ return path.join(projectDir, ".skaile", "mcp-managed.json");
88
+ }
89
+ async function readJsonStrict(p) {
90
+ let raw;
91
+ try {
92
+ raw = await fs.readFile(p, "utf-8");
93
+ } catch {
94
+ return null;
95
+ }
96
+ try {
97
+ return JSON.parse(raw);
98
+ } catch (e) {
99
+ throw new Error(
100
+ `cannot parse ${p}: ${e instanceof Error ? e.message : String(e)}; please fix or remove`
101
+ );
102
+ }
103
+ }
104
+ async function writeJson(p, value) {
105
+ await fs.mkdir(path.dirname(p), { recursive: true });
106
+ await fs.writeFile(p, `${JSON.stringify(value, null, 2)}
107
+ `);
108
+ }
109
+ async function readManagedIds(projectDir, target) {
110
+ const state = await readJsonStrict(managedStatePath(projectDir));
111
+ const ids = state?.targets?.[target];
112
+ return Array.isArray(ids) ? ids : [];
113
+ }
114
+ async function writeManagedIds(projectDir, target, ids) {
115
+ const p = managedStatePath(projectDir);
116
+ const state = await readJsonStrict(p) ?? { targets: {} };
117
+ const targets = { ...state.targets ?? {} };
118
+ if (ids.length > 0) targets[target] = ids;
119
+ else delete targets[target];
120
+ await writeJson(p, { version: 1, targets });
121
+ }
122
+ function mergeServers(existing, renderable, managedIds, warn, configLabel) {
123
+ const next = { ...existing };
124
+ const managed = new Set(managedIds);
125
+ const owned = [];
126
+ const removed = [];
127
+ for (const id of managed) {
128
+ if (!renderable.has(id) && Object.hasOwn(next, id)) {
129
+ delete next[id];
130
+ removed.push(id);
131
+ }
132
+ }
133
+ for (const [id, entry] of renderable) {
134
+ if (Object.hasOwn(next, id) && !managed.has(id)) {
135
+ warn(`"${id}" already declared in ${configLabel} by hand \u2014 leaving the existing entry`);
136
+ continue;
137
+ }
138
+ next[id] = entry;
139
+ owned.push(id);
140
+ }
141
+ return { next, owned, removed };
142
+ }
143
+ async function renderMcpServerConfig(projectDir, driverTarget, opts) {
144
+ const warn = opts?.warn ?? ((m) => console.warn(`skaile: ${m}`));
145
+ const relConfig = TARGET_MCP_CONFIG[driverTarget];
146
+ if (!relConfig) return { written: false, servers: [], removed: [], skipped: [] };
147
+ const configPath = path.join(projectDir, relConfig);
148
+ const declarations = await loadMcpServerDeclarations(projectDir);
149
+ const skipped = [];
150
+ const renderable = /* @__PURE__ */ new Map();
151
+ for (const decl of declarations) {
152
+ const reason = skipReason(decl);
153
+ if (reason) {
154
+ skipped.push({ id: decl.id, reason });
155
+ warn(`MCP server "${decl.id}" not written to ${relConfig}: ${reason}`);
156
+ continue;
157
+ }
158
+ renderable.set(decl.id, buildEntry(decl, projectDir));
159
+ }
160
+ const managedIds = await readManagedIds(projectDir, driverTarget);
161
+ const existingFile = await readJsonStrict(configPath);
162
+ if (renderable.size === 0 && managedIds.length === 0 && !existingFile) {
163
+ return { path: configPath, written: false, servers: [], removed: [], skipped };
164
+ }
165
+ const file = existingFile ?? {};
166
+ const existingServers = file.mcpServers ?? {};
167
+ const { next, owned, removed } = mergeServers(
168
+ existingServers,
169
+ renderable,
170
+ managedIds,
171
+ warn,
172
+ relConfig
173
+ );
174
+ const ledgerStale = JSON.stringify(owned) !== JSON.stringify(managedIds);
175
+ if (ledgerStale) await writeManagedIds(projectDir, driverTarget, owned);
176
+ if (Object.keys(next).length === 0 && !existingFile) {
177
+ return { path: configPath, written: false, servers: owned, removed, skipped };
178
+ }
179
+ if (!ledgerStale && JSON.stringify(next) === JSON.stringify(existingServers) && existingFile) {
180
+ return { path: configPath, written: false, servers: owned, removed, skipped };
181
+ }
182
+ await writeJson(configPath, { ...file, mcpServers: next });
183
+ return { path: configPath, written: true, servers: owned, removed, skipped };
184
+ }
16
185
 
186
+ // asset-manager/src/index.ts
17
187
  function normalizeRepoUrl(url) {
18
188
  return url.trim().replace(/^git@([^:]+):/, "https://$1/").replace(/^[a-z]+:\/\//i, "").replace(/\.git$/i, "").replace(/\/+$/, "").toLowerCase();
19
189
  }
@@ -280,6 +450,26 @@ var AssetManager = class {
280
450
  deployOptsFor(target, link) {
281
451
  return { driverTarget: target, global: this.global, cwd: this.projectDir, link: link === true };
282
452
  }
453
+ /**
454
+ * Render the project's declared MCP servers into the driver target's own
455
+ * native MCP config (`<project>/.mcp.json` for `claude-code`), so the coding
456
+ * agent sees the same servers skaile's agent loop wires up.
457
+ *
458
+ * Project scope only: a `--global` install has no project-scope config to
459
+ * write, and the coding agent's user scope is a large user-state file this
460
+ * must not touch. Never fails an install — a render error is warned and
461
+ * swallowed.
462
+ */
463
+ async renderDriverMcpConfig() {
464
+ if (this.global) return;
465
+ try {
466
+ await renderMcpServerConfig(this.projectDir, this.driverTarget);
467
+ } catch (err) {
468
+ console.warn(
469
+ `skaile: could not render MCP config for ${this.driverTarget}: ${err instanceof Error ? err.message : String(err)}`
470
+ );
471
+ }
472
+ }
283
473
  loadConfig() {
284
474
  const config = this.global ? resolveGlobalSkWorkspaceConfig() : resolveSkWorkspaceConfig(this.projectDir);
285
475
  const sources = config.sources ?? [];
@@ -653,6 +843,7 @@ var AssetManager = class {
653
843
  )
654
844
  )
655
845
  ];
846
+ await this.renderDriverMcpConfig();
656
847
  const lockWritten = resolved.length > 0 || existsSync(this.lockPath);
657
848
  if (lockWritten) {
658
849
  writeLock(this.lockPath, buildLockFile(resolved, overridesApplied));
@@ -806,7 +997,7 @@ var AssetManager = class {
806
997
  }
807
998
  return { npmInstalled, npmFailed };
808
999
  }
809
- installLocked(repositories, patches) {
1000
+ async installLocked(repositories, patches) {
810
1001
  const lock = this.tryReadLock();
811
1002
  if (!lock) {
812
1003
  throw new Error("No lock file found. Run `skaile install` first.");
@@ -862,6 +1053,7 @@ var AssetManager = class {
862
1053
  )
863
1054
  )
864
1055
  ];
1056
+ await this.renderDriverMcpConfig();
865
1057
  return { deployed, removed: [], missing: [], lockWritten: false };
866
1058
  }
867
1059
  /**
@@ -910,6 +1102,7 @@ var AssetManager = class {
910
1102
  )
911
1103
  ];
912
1104
  this.addDependencyToConfig(ref);
1105
+ await this.renderDriverMcpConfig();
913
1106
  if (resolved.length > 0) {
914
1107
  const fresh = buildLockFile(resolved, overridesApplied);
915
1108
  const prev = this.tryReadLock();
@@ -1132,6 +1325,12 @@ var AssetManager = class {
1132
1325
  /**
1133
1326
  * Remove a deployed asset and unregister it from `skaile.yaml`.
1134
1327
  *
1328
+ * Deliberately does NOT re-render the driver target's MCP config: the render
1329
+ * step is async (the declaration resolver is), and making this synchronous
1330
+ * method async would break every external caller. A removed MCP server's
1331
+ * generated entry is dropped by the next {@link AssetManager.install} — see
1332
+ * {@link renderMcpServerConfig}.
1333
+ *
1135
1334
  * @param ref - Asset ref in `kind:name` form (e.g. `skill:my-skill`).
1136
1335
  * @returns `true` if the asset was found and removed, `false` if it was not deployed.
1137
1336
  */
@@ -1885,6 +2084,6 @@ var AssetManager = class {
1885
2084
  }
1886
2085
  };
1887
2086
 
1888
- export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, NON_DEPLOYABLE_KINDS, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, softDepName };
1889
- //# sourceMappingURL=chunk-UVW3R6S7.js.map
1890
- //# sourceMappingURL=chunk-UVW3R6S7.js.map
2087
+ export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, NON_DEPLOYABLE_KINDS, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName };
2088
+ //# sourceMappingURL=chunk-GPMIXOJJ.js.map
2089
+ //# sourceMappingURL=chunk-GPMIXOJJ.js.map