@skaile/workspaces 0.26.0 → 0.28.1

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 (177) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/{asset-feeds-WMVTI7KW.js → asset-feeds-2V7LZIG7.js} +17 -10
  3. package/dist/asset-feeds-2V7LZIG7.js.map +1 -0
  4. package/dist/asset-manager/index.js +7 -7
  5. package/dist/asset-manager/installer.js +6 -6
  6. package/dist/bridge/drivers/claude-sdk.js +2 -2
  7. package/dist/bridge/drivers/codex.js +1 -1
  8. package/dist/bridge/drivers/continue.d.ts +2 -0
  9. package/dist/bridge/drivers/continue.js +103 -0
  10. package/dist/bridge/drivers/continue.js.map +1 -0
  11. package/dist/bridge/drivers/echo.js +1 -1
  12. package/dist/bridge/drivers/gemini.d.ts +2 -0
  13. package/dist/bridge/drivers/gemini.js +10 -0
  14. package/dist/bridge/drivers/gemini.js.map +1 -0
  15. package/dist/bridge/drivers/goose.d.ts +2 -0
  16. package/dist/bridge/drivers/goose.js +88 -0
  17. package/dist/bridge/drivers/goose.js.map +1 -0
  18. package/dist/bridge/drivers/omp.js +1 -1
  19. package/dist/bridge/drivers/opencode.d.ts +2 -0
  20. package/dist/bridge/drivers/opencode.js +99 -0
  21. package/dist/bridge/drivers/opencode.js.map +1 -0
  22. package/dist/bridge/drivers/qwen.d.ts +2 -0
  23. package/dist/bridge/drivers/qwen.js +57 -0
  24. package/dist/bridge/drivers/qwen.js.map +1 -0
  25. package/dist/bridge/index.js +3 -3
  26. package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
  27. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
  28. package/dist/bridge/src/drivers/continue.d.ts +43 -0
  29. package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
  30. package/dist/bridge/src/drivers/gemini.d.ts +55 -0
  31. package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
  32. package/dist/bridge/src/drivers/goose.d.ts +42 -0
  33. package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
  34. package/dist/bridge/src/drivers/opencode.d.ts +43 -0
  35. package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
  36. package/dist/bridge/src/drivers/qwen.d.ts +39 -0
  37. package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
  38. package/dist/bridge/src/registry.d.ts.map +1 -1
  39. package/dist/{chunk-XGLGS5B4.js → chunk-2NOE4AGD.js} +3 -3
  40. package/dist/{chunk-XGLGS5B4.js.map → chunk-2NOE4AGD.js.map} +1 -1
  41. package/dist/{chunk-Z5DI7PDG.js → chunk-3QQSSRYN.js} +29 -5
  42. package/dist/chunk-3QQSSRYN.js.map +1 -0
  43. package/dist/chunk-5RBPPBEK.js +110 -0
  44. package/dist/chunk-5RBPPBEK.js.map +1 -0
  45. package/dist/chunk-5V5KZQIC.js +445 -0
  46. package/dist/chunk-5V5KZQIC.js.map +1 -0
  47. package/dist/{chunk-23M4XZQW.js → chunk-AKSR434V.js} +3 -3
  48. package/dist/{chunk-23M4XZQW.js.map → chunk-AKSR434V.js.map} +1 -1
  49. package/dist/{chunk-WD4LP66U.js → chunk-BSVLAHHH.js} +34 -17
  50. package/dist/chunk-BSVLAHHH.js.map +1 -0
  51. package/dist/{chunk-7OBGSR7O.js → chunk-BZ2JU7IP.js} +4 -4
  52. package/dist/{chunk-7OBGSR7O.js.map → chunk-BZ2JU7IP.js.map} +1 -1
  53. package/dist/{chunk-ZYDE52WE.js → chunk-DGM74UP4.js} +3 -3
  54. package/dist/{chunk-ZYDE52WE.js.map → chunk-DGM74UP4.js.map} +1 -1
  55. package/dist/{chunk-QHXS3YDV.js → chunk-FBVUGRTU.js} +5 -5
  56. package/dist/{chunk-QHXS3YDV.js.map → chunk-FBVUGRTU.js.map} +1 -1
  57. package/dist/{chunk-C32BRO2W.js → chunk-FWHOU3CX.js} +3 -3
  58. package/dist/{chunk-C32BRO2W.js.map → chunk-FWHOU3CX.js.map} +1 -1
  59. package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
  60. package/dist/chunk-GYPA2Q7F.js.map +1 -0
  61. package/dist/{chunk-KL2MQ6WI.js → chunk-M4KLIEIJ.js} +3 -3
  62. package/dist/{chunk-KL2MQ6WI.js.map → chunk-M4KLIEIJ.js.map} +1 -1
  63. package/dist/{chunk-RTAIGPTF.js → chunk-MIH45XPY.js} +100 -147
  64. package/dist/chunk-MIH45XPY.js.map +1 -0
  65. package/dist/{chunk-BKF3UFF4.js → chunk-SF4GWVR5.js} +4 -4
  66. package/dist/{chunk-BKF3UFF4.js.map → chunk-SF4GWVR5.js.map} +1 -1
  67. package/dist/{chunk-PY7AQRGH.js → chunk-U5L6F5NZ.js} +6 -6
  68. package/dist/{chunk-PY7AQRGH.js.map → chunk-U5L6F5NZ.js.map} +1 -1
  69. package/dist/{chunk-BQRRBGDE.js → chunk-UAW7VRAL.js} +2 -2
  70. package/dist/{chunk-BQRRBGDE.js.map → chunk-UAW7VRAL.js.map} +1 -1
  71. package/dist/{chunk-4SQ6Y6U7.js → chunk-UBCZVONU.js} +3 -3
  72. package/dist/{chunk-4SQ6Y6U7.js.map → chunk-UBCZVONU.js.map} +1 -1
  73. package/dist/{chunk-YRU4WB6Y.js → chunk-UIZKIUC6.js} +3 -3
  74. package/dist/{chunk-YRU4WB6Y.js.map → chunk-UIZKIUC6.js.map} +1 -1
  75. package/dist/{chunk-YDTW4GT6.js → chunk-XHBPQ7QP.js} +5 -5
  76. package/dist/{chunk-YDTW4GT6.js.map → chunk-XHBPQ7QP.js.map} +1 -1
  77. package/dist/chunk-Z3XXKR5E.js +88 -0
  78. package/dist/chunk-Z3XXKR5E.js.map +1 -0
  79. package/dist/{chunk-45H3UO2R.js → chunk-ZEKWHJBB.js} +52 -2
  80. package/dist/chunk-ZEKWHJBB.js.map +1 -0
  81. package/dist/cli/index.js +220 -117
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/cli/src/asset-feeds.d.ts +14 -1
  84. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  85. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  86. package/dist/cli/src/commands/manage.d.ts +46 -23
  87. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  88. package/dist/cli/src/helpers.d.ts +10 -1
  89. package/dist/cli/src/helpers.d.ts.map +1 -1
  90. package/dist/connectors/config.js +6 -6
  91. package/dist/connectors/index.js +8 -8
  92. package/dist/core/index.js +5 -5
  93. package/dist/core/runtime-assets.js +2 -2
  94. package/dist/core/src/workspace-config.d.ts +10 -1
  95. package/dist/core/src/workspace-config.d.ts.map +1 -1
  96. package/dist/core/workspace-config.js +1 -1
  97. package/dist/deploy/index.js +5 -5
  98. package/dist/{ensure-sources-CVULUVH4.js → ensure-sources-BNSRO5G7.js} +11 -10
  99. package/dist/ensure-sources-BNSRO5G7.js.map +1 -0
  100. package/dist/factory-assets/connectors/deploy.js +8 -8
  101. package/dist/factory-assets/connectors/devserver.js +8 -8
  102. package/dist/factory-assets/connectors/flow/adapter.js +8 -8
  103. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  104. package/dist/factory-assets/connectors/flow/run-flow.js +9 -9
  105. package/dist/factory-assets/connectors/flow.js +8 -8
  106. package/dist/factory-assets/connectors/git.js +8 -8
  107. package/dist/factory-assets/connectors/gmail.js +8 -8
  108. package/dist/factory-assets/connectors/googledrive.js +8 -8
  109. package/dist/factory-assets/connectors/local.js +8 -8
  110. package/dist/factory-assets/connectors/mattermost.js +8 -8
  111. package/dist/factory-assets/connectors/memory.js +8 -8
  112. package/dist/factory-assets/connectors/minio.js +8 -8
  113. package/dist/factory-assets/connectors/postgres.js +8 -8
  114. package/dist/factory-assets/connectors/s3.js +8 -8
  115. package/dist/factory-assets/connectors/sharepoint.js +8 -8
  116. package/dist/factory-assets/connectors/sqlite.js +8 -8
  117. package/dist/factory-assets/connectors/static-server.js +8 -8
  118. package/dist/factory-assets/connectors/tunnel.js +8 -8
  119. package/dist/factory-assets/connectors/webdav.js +8 -8
  120. package/dist/factory-assets/connectors/xstate-store.js +8 -8
  121. package/dist/factory-assets/connectors/xstate.js +8 -8
  122. package/dist/{flows-JZFJD5IN.js → flows-L3GHQD7F.js} +4 -4
  123. package/dist/{flows-JZFJD5IN.js.map → flows-L3GHQD7F.js.map} +1 -1
  124. package/dist/helpers-F4NZ66VD.js +4 -0
  125. package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
  126. package/dist/library/index.js +8 -7
  127. package/dist/library/install.d.ts +2 -0
  128. package/dist/library/install.js +16 -0
  129. package/dist/library/install.js.map +1 -0
  130. package/dist/library/src/index.d.ts +2 -2
  131. package/dist/library/src/index.d.ts.map +1 -1
  132. package/dist/library/src/install/index.d.ts +3 -0
  133. package/dist/library/src/install/index.d.ts.map +1 -0
  134. package/dist/library/src/library.d.ts +20 -20
  135. package/dist/library/src/library.d.ts.map +1 -1
  136. package/dist/library/src/local/db.d.ts.map +1 -1
  137. package/dist/library/src/local/library.d.ts +6 -6
  138. package/dist/library/src/local/library.d.ts.map +1 -1
  139. package/dist/library/src/local/local-catalog-source.d.ts +1 -1
  140. package/dist/library/src/local/schema.d.ts +9 -9
  141. package/dist/library/src/local/schema.d.ts.map +1 -1
  142. package/dist/library/src/preset/apply.d.ts +9 -9
  143. package/dist/library/src/preset/apply.d.ts.map +1 -1
  144. package/dist/library/src/preset/resolve-item.d.ts +1 -1
  145. package/dist/library/src/workspace-config.d.ts +11 -8
  146. package/dist/library/src/workspace-config.d.ts.map +1 -1
  147. package/dist/{open-library-WYASW4BH.js → open-library-3VJY74LQ.js} +12 -11
  148. package/dist/{open-library-WYASW4BH.js.map → open-library-3VJY74LQ.js.map} +1 -1
  149. package/dist/{paths-BMW6JYW6.js → paths-CE66L3AL.js} +8 -8
  150. package/dist/{paths-BMW6JYW6.js.map → paths-CE66L3AL.js.map} +1 -1
  151. package/dist/{plugin-store-O5VR45CA.js → plugin-store-GL5VKYUA.js} +7 -7
  152. package/dist/{plugin-store-O5VR45CA.js.map → plugin-store-GL5VKYUA.js.map} +1 -1
  153. package/dist/runner/index.js +14 -14
  154. package/dist/runner/src/serve.d.ts.map +1 -1
  155. package/dist/sdk/asset-manager.js +7 -7
  156. package/dist/sdk/bridge.js +3 -3
  157. package/dist/sdk/core.js +5 -5
  158. package/dist/sdk/flow.js +5 -5
  159. package/dist/sdk/index.js +14 -14
  160. package/dist/sdk/runner.js +14 -14
  161. package/dist/{setup-YNLFR5GB.js → setup-4YMN2BDU.js} +10 -10
  162. package/dist/{setup-YNLFR5GB.js.map → setup-4YMN2BDU.js.map} +1 -1
  163. package/dist/{store-client-CENBEASX.js → store-client-BCP5LCAZ.js} +8 -8
  164. package/dist/{store-client-CENBEASX.js.map → store-client-BCP5LCAZ.js.map} +1 -1
  165. package/dist/tui/index.js +14 -14
  166. package/dist/workspace-plugin/adapters/mcp.js +3 -3
  167. package/dist/workspace-plugin/adapters/omp.js +3 -3
  168. package/dist/workspace-plugin/index.js +1 -1
  169. package/package.json +37 -1
  170. package/dist/asset-feeds-WMVTI7KW.js.map +0 -1
  171. package/dist/chunk-45H3UO2R.js.map +0 -1
  172. package/dist/chunk-RTAIGPTF.js.map +0 -1
  173. package/dist/chunk-WD4LP66U.js.map +0 -1
  174. package/dist/chunk-WSZAFRQL.js.map +0 -1
  175. package/dist/chunk-Z5DI7PDG.js.map +0 -1
  176. package/dist/ensure-sources-CVULUVH4.js.map +0 -1
  177. package/dist/helpers-LTN3HMD3.js +0 -4
@@ -0,0 +1,57 @@
1
+ import { GeminiFamilyDriver } from '../../chunk-5RBPPBEK.js';
2
+ import '../../chunk-5V5KZQIC.js';
3
+ import { fetchProviderModels } from '../../chunk-BMQKMOQY.js';
4
+ import '../../chunk-PAYAFNXG.js';
5
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
6
+ import '../../chunk-6E6PKKAD.js';
7
+ import '../../chunk-24UIWON4.js';
8
+ import '../../chunk-NSBPE2FW.js';
9
+ import * as z from 'zod';
10
+
11
+ var QwenDriver = class extends GeminiFamilyDriver {
12
+ driverInfo = {
13
+ id: "qwen",
14
+ name: "Qwen Code",
15
+ modelAgnostic: true,
16
+ supportsInBandAbort: false
17
+ };
18
+ log = getBridgeLogger("qwen");
19
+ defaultBin = "qwen";
20
+ productName = "Qwen Code";
21
+ envPrefix = "QWEN";
22
+ buildArgs(message, resumeId) {
23
+ const args = ["-p", message, "-o", "stream-json", "--include-partial-messages"];
24
+ if (this.config.model) args.push("-m", this.config.model);
25
+ if (resumeId) args.push("--resume", resumeId);
26
+ return args;
27
+ }
28
+ buildEnv() {
29
+ const env = this.baseEnv(["OPENAI_API_KEY", "OPENAI_BASE_URL", "OPENAI_MODEL"]);
30
+ const key = this.config.apiKeys?.openai ?? this.config.apiKeys?.qwen ?? this.config.env?.OPENAI_API_KEY ?? process.env.OPENAI_API_KEY;
31
+ if (key) env.OPENAI_API_KEY = key;
32
+ if (this.config.model) env.OPENAI_MODEL = this.config.model;
33
+ env.QWEN_CODE_UNATTENDED_RETRY = "1";
34
+ return env;
35
+ }
36
+ installHint() {
37
+ return "Qwen Code is not installed or not on your PATH. Install it with `npm i -g @qwen-code/qwen-code`.";
38
+ }
39
+ async listModels() {
40
+ const key = this.config.apiKeys?.openai ?? process.env.OPENAI_API_KEY;
41
+ if (!key) return [];
42
+ const result = await fetchProviderModels("openai", key);
43
+ return result.ok ? result.models : [];
44
+ }
45
+ };
46
+ var qwenDriverTarget = {
47
+ id: "qwen",
48
+ displayName: BUILTIN_DRIVER_CATALOG.qwen?.name ?? "Qwen Code",
49
+ apiVersion: 1,
50
+ configSchema: z.custom(() => true),
51
+ create: async (config, _ctx) => new QwenDriver(config),
52
+ listModels: async (apiKeys) => new QwenDriver({ cwd: process.cwd(), sessionId: "model-list", apiKeys }).listModels()
53
+ };
54
+
55
+ export { QwenDriver, qwenDriverTarget };
56
+ //# sourceMappingURL=qwen.js.map
57
+ //# sourceMappingURL=qwen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../bridge/src/drivers/qwen.ts"],"names":[],"mappings":";;;;;;;;;;AA0BO,IAAM,UAAA,GAAN,cAAyB,kBAAA,CAAmB;AAAA,EACxC,UAAA,GAAyB;AAAA,IAChC,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,IAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AAAA,EAEmB,GAAA,GAAc,gBAAgB,MAAM,CAAA;AAAA,EACpC,UAAA,GAAa,MAAA;AAAA,EACb,WAAA,GAAc,WAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EAErB,SAAA,CAAU,SAAiB,QAAA,EAAwC;AAC3E,IAAA,MAAM,OAAO,CAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,eAAe,4BAA4B,CAAA;AAC9E,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,KAAK,IAAA,EAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,QAAA,GAAmC;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,gBAAA,EAAkB,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAC9E,IAAA,MAAM,GAAA,GACJ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,UACrB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,IACrB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,cAAA,IACjB,QAAQ,GAAA,CAAI,cAAA;AACd,IAAA,IAAI,GAAA,MAAS,cAAA,GAAiB,GAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,YAAA,GAAe,KAAK,MAAA,CAAO,KAAA;AACtD,IAAA,GAAA,CAAI,0BAAA,GAA6B,GAAA;AACjC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,WAAA,GAAsB;AAC9B,IAAA,OAAO,kGAAA;AAAA,EACT;AAAA,EAEA,MAAe,UAAA,GAAoC;AACjD,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,QAAA,EAAU,GAAG,CAAA;AACtD,IAAA,OAAO,MAAA,CAAO,EAAA,GAAK,MAAA,CAAO,MAAA,GAAS,EAAC;AAAA,EACtC;AACF;AAMO,IAAM,gBAAA,GAA8C;AAAA,EACzD,EAAA,EAAI,MAAA;AAAA,EACJ,WAAA,EAAa,sBAAA,CAAuB,IAAA,EAAM,IAAA,IAAQ,WAAA;AAAA,EAClD,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAgB,CAAA,CAAA,MAAA,CAAoB,MAAM,IAAI,CAAA;AAAA,EAC9C,QAAQ,OAAO,MAAA,EAAQ,IAAA,KAAS,IAAI,WAAW,MAAM,CAAA;AAAA,EACrD,UAAA,EAAY,OAAO,OAAA,KACjB,IAAI,WAAW,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,IAAO,SAAA,EAAW,YAAA,EAAc,OAAA,EAAS,EAAE,UAAA;AAC7E","file":"qwen.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, type ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { GeminiFamilyDriver } from \"./gemini.js\";\n\n/**\n * Agent driver for **Qwen Code** (`qwen`) — a fork of Gemini CLI.\n *\n * Reuses {@link GeminiFamilyDriver}'s stream-json event mapping. Unlike Gemini,\n * Qwen is **model-agnostic / OpenAI-compatible**: it reads `OPENAI_API_KEY`,\n * `OPENAI_BASE_URL`, and `OPENAI_MODEL`, so it works against any\n * OpenAI-completions endpoint (Alibaba DashScope by default).\n *\n * @remarks\n * - Spawns `qwen -p \"<prompt>\" -o stream-json --include-partial-messages`.\n * - Sets `QWEN_CODE_UNATTENDED_RETRY=1` so the CLI backs off on 429/529 in\n * unattended driver contexts.\n * - Supports headless session resume via `--resume <id>`.\n *\n * @see https://github.com/QwenLM/qwen-code\n * @docLink packages/bridge/drivers#qwen-driver\n */\nexport class QwenDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"qwen\");\n protected readonly defaultBin = \"qwen\";\n protected readonly productName = \"Qwen Code\";\n protected readonly envPrefix = \"QWEN\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"-o\", \"stream-json\", \"--include-partial-messages\"];\n if (this.config.model) args.push(\"-m\", this.config.model);\n if (resumeId) args.push(\"--resume\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"OPENAI_API_KEY\", \"OPENAI_BASE_URL\", \"OPENAI_MODEL\"]);\n const key =\n this.config.apiKeys?.openai ??\n this.config.apiKeys?.qwen ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY;\n if (key) env.OPENAI_API_KEY = key;\n if (this.config.model) env.OPENAI_MODEL = this.config.model;\n env.QWEN_CODE_UNATTENDED_RETRY = \"1\";\n return env;\n }\n\n protected installHint(): string {\n return \"Qwen Code is not installed or not on your PATH. Install it with `npm i -g @qwen-code/qwen-code`.\";\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const key = this.config.apiKeys?.openai ?? process.env.OPENAI_API_KEY;\n if (!key) return [];\n const result = await fetchProviderModels(\"openai\", key);\n return result.ok ? result.models : [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the qwen driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const qwenDriverTarget: DriverTarget<AgentConfig> = {\n id: \"qwen\",\n displayName: BUILTIN_DRIVER_CATALOG.qwen?.name ?? \"Qwen Code\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new QwenDriver(config),\n listModels: async (apiKeys) =>\n new QwenDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,8 +1,8 @@
1
- export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-23M4XZQW.js';
1
+ export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-AKSR434V.js';
2
+ export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-RRVQAE5D.js';
2
3
  export { STATIC_MODELS, fetchProviderModels, getModels, getStaticModels } from '../chunk-BMQKMOQY.js';
3
4
  export { AuthError, classifyClaudeSdkError } from '../chunk-PAYAFNXG.js';
4
- export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-RRVQAE5D.js';
5
- export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-45H3UO2R.js';
5
+ export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-ZEKWHJBB.js';
6
6
  import '../chunk-6E6PKKAD.js';
7
7
  import '../chunk-24UIWON4.js';
8
8
  import '../chunk-NSBPE2FW.js';
@@ -0,0 +1,136 @@
1
+ import type { Logger, TokenUsage } from "@skaile/workspaces/types";
2
+ import { type AgentConfig, AgentDriver, type AgentError } from "../types.js";
3
+ /**
4
+ * Shared base for one-shot **subprocess CLI** agent backends (Gemini, Qwen,
5
+ * OpenCode, Goose, Continue).
6
+ *
7
+ * These backends are neither persistent JSON-RPC subprocesses (`omp`) nor
8
+ * in-process SDKs (`claude-sdk`, `codex`). In headless mode each is invoked
9
+ * **once per turn** — `prompt()` spawns the CLI fresh, a `readline` loop maps
10
+ * newline-delimited JSON on stdout to the unified {@link AgentEvent} stream, and
11
+ * **process exit marks the end of the turn**. Multi-turn continuity comes from
12
+ * capturing a backend session id (emitted as `session_info`) and replaying it
13
+ * via a resume flag on the next spawn.
14
+ *
15
+ * Subclasses implement {@link buildArgs}, {@link buildEnv}, and either
16
+ * {@link handleJson} (streaming JSONL, the default) or {@link handleBuffered}
17
+ * (`mode = "buffered"`, for CLIs that print a single JSON blob at the end).
18
+ *
19
+ * **Terminal-sequence invariant.** Subclasses MUST NOT emit `agent_end`. The
20
+ * base emits exactly one `result` (synthesizing a success result when the
21
+ * stream produced none) followed by a single `agent_end` on clean exit, or an
22
+ * `error` + `agent_end` on crash. This keeps the turn-completion contract
23
+ * (`prompt()` resolves after `agent_end`) identical across every CLI driver.
24
+ *
25
+ * @docLink packages/bridge/drivers#subprocess-cli
26
+ */
27
+ export declare abstract class SubprocessCliDriver extends AgentDriver {
28
+ /** Per-driver logger, constructed once by the subclass. */
29
+ protected abstract readonly log: Logger;
30
+ /** Default binary name spawned in production (e.g. `"gemini"`). */
31
+ protected abstract readonly defaultBin: string;
32
+ /** Human product name used in error messages / hints (e.g. `"Gemini CLI"`). */
33
+ protected abstract readonly productName: string;
34
+ /**
35
+ * Test-seam env prefix. `<PREFIX>_BRIDGE_BIN` overrides the spawn binary and
36
+ * `<PREFIX>_BRIDGE_PREARGS` (space-delimited) supplies leading argv — used by
37
+ * the fake-CLI harness to redirect spawn without monkey-patching
38
+ * `child_process`. Both are ignored in production.
39
+ */
40
+ protected abstract readonly envPrefix: string;
41
+ /** `"jsonl"` streams events line-by-line; `"buffered"` parses all stdout once on exit. */
42
+ protected readonly mode: "jsonl" | "buffered";
43
+ protected config: AgentConfig;
44
+ private proc;
45
+ private rl;
46
+ private stderrBuffer;
47
+ private stdoutBuffer;
48
+ private started;
49
+ private prevText;
50
+ private activeAssistant;
51
+ private pendingToolResults;
52
+ private sawResult;
53
+ private aborting;
54
+ private turnResolve;
55
+ private turnReject;
56
+ protected _sessionId?: string;
57
+ protected _lastTokens: TokenUsage | null;
58
+ constructor(config: AgentConfig);
59
+ get runtimeSessionId(): string | undefined;
60
+ getModel(): string | undefined;
61
+ getTokenUsage(): TokenUsage | null;
62
+ reconfigure(patch: Partial<Pick<AgentConfig, "model" | "thinking" | "effort">>): void;
63
+ /**
64
+ * No-op for one-shot CLIs — there is no long-lived process to spawn until the
65
+ * first prompt. Kept so the runner's `start()` → `prompt()` ordering works
66
+ * uniformly; binary-presence failures surface as a `config` error on the
67
+ * first spawn (see {@link classifyProcessError}).
68
+ */
69
+ start(): Promise<void>;
70
+ get isRunning(): boolean;
71
+ /**
72
+ * Sends a user message to the CLI and resolves after the turn completes
73
+ * (`agent_end`). Spawns a fresh child per call; rejects if the child exits
74
+ * non-zero before emitting a result, so the caller never hangs.
75
+ */
76
+ prompt(message: string): Promise<void>;
77
+ /** Out-of-band abort: terminates the current child. Driver stays usable for the next prompt. */
78
+ abort(): Promise<void>;
79
+ kill(): void;
80
+ resetSession(): Promise<void>;
81
+ /** Build the CLI argv (binary excluded) for one turn. `resumeId` is the captured session id, if any. */
82
+ protected abstract buildArgs(message: string, resumeId: string | undefined): string[];
83
+ /** Build the child-process env (explicit allowlist — see {@link baseEnv}). */
84
+ protected abstract buildEnv(): Record<string, string>;
85
+ /** Map one parsed stdout JSON object to events via the `push*` helpers. Streaming (`jsonl`) mode only. */
86
+ protected handleJson(_json: unknown): void;
87
+ /** Parse the full stdout blob once on clean exit. `buffered` mode only. */
88
+ protected handleBuffered(_raw: string): void;
89
+ /** Install-failure hint surfaced when the binary is missing. */
90
+ protected abstract installHint(): string;
91
+ /**
92
+ * Classify a non-zero exit into an {@link AgentError}, or `null` to treat the
93
+ * exit as success (e.g. a turn-limit code where a result was already
94
+ * emitted). Default: code `0` / clean signal → success; otherwise `process`.
95
+ */
96
+ protected classifyExit(code: number | null, signal: NodeJS.Signals | null): AgentError | null;
97
+ /** Prepend `systemPrompt` to the user message — uniform across CLIs lacking a reliable system flag. */
98
+ protected composePrompt(message: string): string;
99
+ protected pushAssistantDelta(fullText: string): void;
100
+ protected pushAssistantEnd(fullText?: string): void;
101
+ protected pushToolCall(name: string, input: unknown): void;
102
+ protected pushToolResult(name: string, data: unknown, isError?: boolean): void;
103
+ private flushToolResults;
104
+ protected pushResult(opts: {
105
+ tokens?: TokenUsage | null;
106
+ costUsd?: number;
107
+ summary?: string;
108
+ subtype?: string;
109
+ }): void;
110
+ protected pushError(detail: AgentError, fatal?: boolean): void;
111
+ protected captureSession(id?: string, file?: string): void;
112
+ /** Shared keyword classification + per-driver hint copy (mirrors omp/codex). */
113
+ protected classifyMessage(message: string): AgentError;
114
+ /**
115
+ * Explicit env whitelist forwarded to the child. Omits anything provisioned
116
+ * by `provision_secrets` so user credentials stay out of the subprocess
117
+ * environment. `config.env`, when supplied, fully overrides the whitelist.
118
+ * Always passes through the driver's test-seam vars and `FAKE_CLI_*`.
119
+ */
120
+ protected baseEnv(extraKeys?: string[]): Record<string, string>;
121
+ private onStdoutLine;
122
+ private onExit;
123
+ private settleResolve;
124
+ private settleReject;
125
+ private cleanup;
126
+ private classifyProcessError;
127
+ }
128
+ /** Pull assistant text out of a CLI event, trying the common field names. */
129
+ export declare function extractText(json: any): string;
130
+ /** Map a CLI usage/stats object onto {@link TokenUsage}, trying common field names. */
131
+ export declare function extractTokens(json: any): TokenUsage | null;
132
+ /** Pull a per-turn USD cost from a CLI result object, or `undefined`. */
133
+ export declare function extractCost(json: any): number | undefined;
134
+ /** Map known `apiKeys` provider names onto the env var names provider CLIs expect. */
135
+ export declare function mapApiKeysToEnv(apiKeys: Record<string, string> | undefined): Record<string, string>;
136
+ //# sourceMappingURL=_subprocess-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_subprocess-cli.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/_subprocess-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
+ import type { Logger } from "@skaile/workspaces/types";
3
+ import type { ModelEntry } from "../models.js";
4
+ import type { AgentConfig, DriverInfo } from "../types.js";
5
+ import { SubprocessCliDriver } from "./_subprocess-cli.js";
6
+ /**
7
+ * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed
8
+ * by Continue Hub / `config.yaml` assistants.
9
+ *
10
+ * Unlike the other CLI drivers, `cn -p "<prompt>" --format json` emits a single
11
+ * **final-result JSON wrapper**, not a streaming event log. This driver runs in
12
+ * `mode: "buffered"`: the base accumulates all stdout and {@link handleBuffered}
13
+ * parses it once on exit — so there are no incremental deltas or per-tool
14
+ * events, only a final assistant message plus a result.
15
+ *
16
+ * @remarks
17
+ * - Auth via `CONTINUE_API_KEY` / `cn login`; provider keys flow through the
18
+ * environment and the selected `config.yaml`.
19
+ * - `--config <slug>` selects the assistant; session resume via `--resume`
20
+ * (last session only — Continue has no resume-by-id in headless mode).
21
+ *
22
+ * @see https://docs.continue.dev/guides/cli
23
+ * @docLink packages/bridge/drivers#continue-driver
24
+ */
25
+ export declare class ContinueDriver extends SubprocessCliDriver {
26
+ readonly driverInfo: DriverInfo;
27
+ protected readonly log: Logger;
28
+ protected readonly defaultBin = "cn";
29
+ protected readonly productName = "Continue CLI";
30
+ protected readonly envPrefix = "CONTINUE";
31
+ protected readonly mode: "buffered";
32
+ protected buildArgs(message: string, resumeId: string | undefined): string[];
33
+ protected buildEnv(): Record<string, string>;
34
+ protected installHint(): string;
35
+ protected handleBuffered(raw: string): void;
36
+ listModels(): Promise<ModelEntry[]>;
37
+ }
38
+ /**
39
+ * `DriverTarget` wrapper for the continue driver. Registered into the plugin
40
+ * registry by `registerBuiltinDrivers()`.
41
+ */
42
+ export declare const continueDriverTarget: DriverTarget<AgentConfig>;
43
+ //# sourceMappingURL=continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/continue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAKL,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;IACrD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAA+B;IAC7D,SAAS,CAAC,QAAQ,CAAC,UAAU,QAAQ;IACrC,SAAS,CAAC,QAAQ,CAAC,WAAW,kBAAkB;IAChD,SAAS,CAAC,QAAQ,CAAC,SAAS,cAAc;IAC1C,mBAA4B,IAAI,EAAG,UAAU,CAAU;IAEvD,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;IAQ5E,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAU5C,SAAS,CAAC,WAAW,IAAI,MAAM;IAI/B,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAyB5B,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAGnD;AAqCD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAAY,CAAC,WAAW,CAM1D,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
+ import type { Logger } from "@skaile/workspaces/types";
3
+ import { type ModelEntry } from "../models.js";
4
+ import type { AgentConfig, DriverInfo } from "../types.js";
5
+ import { SubprocessCliDriver } from "./_subprocess-cli.js";
6
+ /**
7
+ * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork
8
+ * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the
9
+ * same {@link handleJson}: `init`/`system` → session capture, `message`/
10
+ * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool
11
+ * events, `result` → tokens + cost.
12
+ *
13
+ * @docLink packages/bridge/drivers#gemini-driver
14
+ */
15
+ export declare abstract class GeminiFamilyDriver extends SubprocessCliDriver {
16
+ protected handleJson(json: any): void;
17
+ }
18
+ /**
19
+ * Agent driver for the Google **Gemini CLI** (`gemini`).
20
+ *
21
+ * Spawns `gemini -p "<prompt>" --output-format stream-json` per turn and maps
22
+ * the stream-json events to the unified {@link AgentEvent} stream. Google /
23
+ * Vertex models only — uses `GEMINI_API_KEY` from `apiKeys.google` /
24
+ * `apiKeys.gemini` / env.
25
+ *
26
+ * @remarks
27
+ * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject
28
+ * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.
29
+ * - **Session resume is not available in headless (`-p`) mode** — the CLI errors
30
+ * if asked to resume non-interactively, so this driver runs single-turn per
31
+ * process and logs a warning when a resume id is present.
32
+ * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a
33
+ * completed turn).
34
+ *
35
+ * @see https://github.com/google-gemini/gemini-cli
36
+ * @docLink packages/bridge/drivers#gemini-driver
37
+ */
38
+ export declare class GeminiDriver extends GeminiFamilyDriver {
39
+ readonly driverInfo: DriverInfo;
40
+ protected readonly log: Logger;
41
+ protected readonly defaultBin = "gemini";
42
+ protected readonly productName = "Gemini CLI";
43
+ protected readonly envPrefix = "GEMINI";
44
+ protected buildArgs(message: string, resumeId: string | undefined): string[];
45
+ protected buildEnv(): Record<string, string>;
46
+ protected installHint(): string;
47
+ protected classifyExit(code: number | null, signal: NodeJS.Signals | null): import("../types.js").AgentError | null;
48
+ listModels(): Promise<ModelEntry[]>;
49
+ }
50
+ /**
51
+ * `DriverTarget` wrapper for the gemini driver. Registered into the plugin
52
+ * registry by `registerBuiltinDrivers()`.
53
+ */
54
+ export declare const geminiDriverTarget: DriverTarget<AgentConfig>;
55
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAA2C,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEpG;;;;;;;;GAQG;AACH,8BAAsB,kBAAmB,SAAQ,mBAAmB;IAClE,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;CA+CtC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAa,SAAQ,kBAAkB;IAClD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAA6B;IAC3D,SAAS,CAAC,QAAQ,CAAC,UAAU,YAAY;IACzC,SAAS,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAC9C,SAAS,CAAC,QAAQ,CAAC,SAAS,YAAY;IAExC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;IAW5E,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAW5C,SAAS,CAAC,WAAW,IAAI,MAAM;cAIZ,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;IAanE,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAOnD;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,WAAW,CAQxD,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
+ import type { Logger } from "@skaile/workspaces/types";
3
+ import type { ModelEntry } from "../models.js";
4
+ import type { AgentConfig, DriverInfo } from "../types.js";
5
+ import { SubprocessCliDriver } from "./_subprocess-cli.js";
6
+ /**
7
+ * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source
8
+ * agent.
9
+ *
10
+ * Spawns `goose run -t "<prompt>" --output-format stream-json --quiet` per turn
11
+ * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.
12
+ * Model-agnostic across 15+ providers; provider/model are forwarded via
13
+ * `GOOSE_PROVIDER` / `GOOSE_MODEL` and provider keys through the environment.
14
+ *
15
+ * @remarks
16
+ * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or
17
+ * Homebrew.
18
+ * - `--output-format` support is version-dependent; a too-old CLI surfaces as a
19
+ * `process`-category exit error.
20
+ * - Session resume via `--resume --id <id>`.
21
+ *
22
+ * @see https://github.com/block/goose
23
+ * @docLink packages/bridge/drivers#goose-driver
24
+ */
25
+ export declare class GooseDriver extends SubprocessCliDriver {
26
+ readonly driverInfo: DriverInfo;
27
+ protected readonly log: Logger;
28
+ protected readonly defaultBin = "goose";
29
+ protected readonly productName = "Goose";
30
+ protected readonly envPrefix = "GOOSE";
31
+ protected buildArgs(message: string, resumeId: string | undefined): string[];
32
+ protected buildEnv(): Record<string, string>;
33
+ protected installHint(): string;
34
+ protected handleJson(json: any): void;
35
+ listModels(): Promise<ModelEntry[]>;
36
+ }
37
+ /**
38
+ * `DriverTarget` wrapper for the goose driver. Registered into the plugin
39
+ * registry by `registerBuiltinDrivers()`.
40
+ */
41
+ export declare const gooseDriverTarget: DriverTarget<AgentConfig>;
42
+ //# sourceMappingURL=goose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goose.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAKL,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAY,SAAQ,mBAAmB;IAClD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAA4B;IAC1D,SAAS,CAAC,QAAQ,CAAC,UAAU,WAAW;IACxC,SAAS,CAAC,QAAQ,CAAC,WAAW,WAAW;IACzC,SAAS,CAAC,QAAQ,CAAC,SAAS,WAAW;IAEvC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;IAM5E,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAO5C,SAAS,CAAC,WAAW,IAAI,MAAM;IAI/B,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IA8CtB,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAGnD;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,WAAW,CAMvD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
+ import type { Logger } from "@skaile/workspaces/types";
3
+ import type { ModelEntry } from "../models.js";
4
+ import type { AgentConfig, DriverInfo } from "../types.js";
5
+ import { SubprocessCliDriver } from "./_subprocess-cli.js";
6
+ /**
7
+ * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source
8
+ * coding agent.
9
+ *
10
+ * Spawns `opencode run "<prompt>" --format json` per turn and maps OpenCode's
11
+ * JSON event stream to the unified {@link AgentEvent} stream. Model-agnostic:
12
+ * the model is passed as `provider/model` via `-m`, and provider API keys are
13
+ * forwarded through the environment.
14
+ *
15
+ * @remarks
16
+ * - The prompt is a **positional argument** — OpenCode's `-p` flag is a
17
+ * basic-auth password, not the prompt.
18
+ * - Session resume via `-s <id>`; the session id is captured from the run's
19
+ * session event and emitted as `session_info`.
20
+ * - OpenCode's `run --format json` event field names are not fully pinned
21
+ * upstream; {@link handleJson} reads them defensively.
22
+ *
23
+ * @see https://github.com/sst/opencode
24
+ * @docLink packages/bridge/drivers#opencode-driver
25
+ */
26
+ export declare class OpenCodeDriver extends SubprocessCliDriver {
27
+ readonly driverInfo: DriverInfo;
28
+ protected readonly log: Logger;
29
+ protected readonly defaultBin = "opencode";
30
+ protected readonly productName = "OpenCode";
31
+ protected readonly envPrefix = "OPENCODE";
32
+ protected buildArgs(message: string, resumeId: string | undefined): string[];
33
+ protected buildEnv(): Record<string, string>;
34
+ protected installHint(): string;
35
+ protected handleJson(json: any): void;
36
+ listModels(): Promise<ModelEntry[]>;
37
+ }
38
+ /**
39
+ * `DriverTarget` wrapper for the opencode driver. Registered into the plugin
40
+ * registry by `registerBuiltinDrivers()`.
41
+ */
42
+ export declare const opencodeDriverTarget: DriverTarget<AgentConfig>;
43
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAKL,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;IACrD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAA+B;IAC7D,SAAS,CAAC,QAAQ,CAAC,UAAU,cAAc;IAC3C,SAAS,CAAC,QAAQ,CAAC,WAAW,cAAc;IAC5C,SAAS,CAAC,QAAQ,CAAC,SAAS,cAAc;IAE1C,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;IAW5E,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAW5C,SAAS,CAAC,WAAW,IAAI,MAAM;IAI/B,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAmDtB,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAGnD;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAAY,CAAC,WAAW,CAM1D,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
+ import type { Logger } from "@skaile/workspaces/types";
3
+ import { type ModelEntry } from "../models.js";
4
+ import type { AgentConfig, DriverInfo } from "../types.js";
5
+ import { GeminiFamilyDriver } from "./gemini.js";
6
+ /**
7
+ * Agent driver for **Qwen Code** (`qwen`) — a fork of Gemini CLI.
8
+ *
9
+ * Reuses {@link GeminiFamilyDriver}'s stream-json event mapping. Unlike Gemini,
10
+ * Qwen is **model-agnostic / OpenAI-compatible**: it reads `OPENAI_API_KEY`,
11
+ * `OPENAI_BASE_URL`, and `OPENAI_MODEL`, so it works against any
12
+ * OpenAI-completions endpoint (Alibaba DashScope by default).
13
+ *
14
+ * @remarks
15
+ * - Spawns `qwen -p "<prompt>" -o stream-json --include-partial-messages`.
16
+ * - Sets `QWEN_CODE_UNATTENDED_RETRY=1` so the CLI backs off on 429/529 in
17
+ * unattended driver contexts.
18
+ * - Supports headless session resume via `--resume <id>`.
19
+ *
20
+ * @see https://github.com/QwenLM/qwen-code
21
+ * @docLink packages/bridge/drivers#qwen-driver
22
+ */
23
+ export declare class QwenDriver extends GeminiFamilyDriver {
24
+ readonly driverInfo: DriverInfo;
25
+ protected readonly log: Logger;
26
+ protected readonly defaultBin = "qwen";
27
+ protected readonly productName = "Qwen Code";
28
+ protected readonly envPrefix = "QWEN";
29
+ protected buildArgs(message: string, resumeId: string | undefined): string[];
30
+ protected buildEnv(): Record<string, string>;
31
+ protected installHint(): string;
32
+ listModels(): Promise<ModelEntry[]>;
33
+ }
34
+ /**
35
+ * `DriverTarget` wrapper for the qwen driver. Registered into the plugin
36
+ * registry by `registerBuiltinDrivers()`.
37
+ */
38
+ export declare const qwenDriverTarget: DriverTarget<AgentConfig>;
39
+ //# sourceMappingURL=qwen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/qwen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,UAAW,SAAQ,kBAAkB;IAChD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAA2B;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,UAAU;IACvC,SAAS,CAAC,QAAQ,CAAC,WAAW,eAAe;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,UAAU;IAEtC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE;IAO5E,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAa5C,SAAS,CAAC,WAAW,IAAI,MAAM;IAIhB,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAMnD;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAAY,CAAC,WAAW,CAQtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../bridge/src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAavE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAyB7D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,4BAAyB,CAAC;AAIrD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,GAAE,cAA+B,GACxC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,EACnB,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAGtB;AA2BD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,IAAI,UAAU,EAAE,CAoB1C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../bridge/src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAavE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAuD7D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,4BAAyB,CAAC;AAIrD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,GAAE,cAA+B,GACxC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,EACnB,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAGtB;AA2BD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,IAAI,UAAU,EAAE,CAoB1C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB"}
@@ -1,4 +1,4 @@
1
- import { globalSettingsPath, mapLegacyFields } from './chunk-KL2MQ6WI.js';
1
+ import { globalSettingsPath, mapLegacyFields } from './chunk-M4KLIEIJ.js';
2
2
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
3
3
  import { homedir } from 'os';
4
4
  import { join } from 'path';
@@ -89,5 +89,5 @@ function isStoreAuthenticated(config) {
89
89
  }
90
90
 
91
91
  export { clearStoreTokens, getStoreConfig, isStoreAuthenticated, saveStoreTokens, storeFetch };
92
- //# sourceMappingURL=chunk-XGLGS5B4.js.map
93
- //# sourceMappingURL=chunk-XGLGS5B4.js.map
92
+ //# sourceMappingURL=chunk-2NOE4AGD.js.map
93
+ //# sourceMappingURL=chunk-2NOE4AGD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/store-client.ts"],"names":[],"mappings":"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","file":"chunk-XGLGS5B4.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { globalSettingsPath, mapLegacyFields } from \"@skaile/workspaces/core\";\n\n/**\n * Connection configuration for the AI Asset Store API.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport interface StoreConfig {\n url: string;\n jwt: string | null;\n refreshToken: string | null;\n}\n\n/**\n * Read store connection config from global user settings, falling back to\n * `SKAILE_STORE_URL` env var and the default store URL.\n *\n * @returns Populated {@link StoreConfig} with `url`, `jwt`, and `refreshToken`.\n * @docLink cli/dev-guide#store-client\n */\nexport function getStoreConfig(): StoreConfig {\n const settingsPath = globalSettingsPath();\n let settings: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n settings = mapLegacyFields(JSON.parse(readFileSync(settingsPath, \"utf-8\")));\n } catch {\n settings = {};\n }\n }\n return {\n url: settings.storeUrl ?? process.env.SKAILE_STORE_URL ?? \"https://store.skaile.ai\",\n jwt: settings.storeJwt ?? null,\n refreshToken: settings.storeRefreshToken ?? null,\n };\n}\n\n/** Path to user-level settings */\nfunction userSettingsPath(): string {\n return join(homedir(), \".skaile\", \"settings.json\");\n}\n\n/**\n * Persist store authentication tokens to `~/.skaile/settings.json`.\n *\n * @param jwt - The JWT access token returned by the store login endpoint.\n * @param refreshToken - The refresh token for obtaining new JWTs.\n * @docLink cli/dev-guide#store-client\n */\nexport function saveStoreTokens(jwt: string, refreshToken: string): void {\n const settingsPath = userSettingsPath();\n const dir = join(settingsPath, \"..\");\n mkdirSync(dir, { recursive: true });\n\n let current: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n } catch {\n current = {};\n }\n }\n\n current.storeJwt = jwt;\n current.storeRefreshToken = refreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n}\n\n/**\n * Remove store authentication tokens from `~/.skaile/settings.json`.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport function clearStoreTokens(): void {\n const settingsPath = userSettingsPath();\n if (!existsSync(settingsPath)) return;\n\n try {\n const current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n delete current.storeJwt;\n delete current.storeRefreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n } catch {\n // ignore\n }\n}\n\n/**\n * Make an authenticated HTTP request to the store REST API with a 1.5s timeout.\n *\n * @param config - Store connection config (URL + auth token).\n * @param path - API path (e.g. `/api/assets`).\n * @param opts - Optional method, body, query params, and extra headers.\n * @returns Parsed JSON response body.\n * @docLink cli/dev-guide#store-client\n */\nexport async function storeFetch<T = any>(\n config: StoreConfig,\n path: string,\n opts?: {\n method?: string;\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n): Promise<T> {\n let url = `${config.url}${path}`;\n if (opts?.params) {\n const sp = new URLSearchParams(opts.params);\n url += `?${sp}`;\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(opts?.headers ?? {}),\n };\n if (config.jwt) {\n headers.Authorization = `Bearer ${config.jwt}`;\n }\n\n const fetchOpts: RequestInit = {\n method: opts?.method ?? \"GET\",\n headers,\n };\n if (opts?.body) {\n fetchOpts.body = JSON.stringify(opts.body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1_500);\n try {\n const res = await fetch(url, { ...fetchOpts, signal: controller.signal });\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error((body as any).error ?? `Store API error: ${res.status}`);\n }\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Return `true` if a JWT token is present in the provided (or default) store config.\n *\n * @param config - Optional pre-loaded config; if omitted, calls {@link getStoreConfig}.\n * @docLink cli/dev-guide#store-client\n */\nexport function isStoreAuthenticated(config?: StoreConfig): boolean {\n const c = config ?? getStoreConfig();\n return !!c.jwt;\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/store-client.ts"],"names":[],"mappings":"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","file":"chunk-2NOE4AGD.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { globalSettingsPath, mapLegacyFields } from \"@skaile/workspaces/core\";\n\n/**\n * Connection configuration for the AI Asset Store API.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport interface StoreConfig {\n url: string;\n jwt: string | null;\n refreshToken: string | null;\n}\n\n/**\n * Read store connection config from global user settings, falling back to\n * `SKAILE_STORE_URL` env var and the default store URL.\n *\n * @returns Populated {@link StoreConfig} with `url`, `jwt`, and `refreshToken`.\n * @docLink cli/dev-guide#store-client\n */\nexport function getStoreConfig(): StoreConfig {\n const settingsPath = globalSettingsPath();\n let settings: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n settings = mapLegacyFields(JSON.parse(readFileSync(settingsPath, \"utf-8\")));\n } catch {\n settings = {};\n }\n }\n return {\n url: settings.storeUrl ?? process.env.SKAILE_STORE_URL ?? \"https://store.skaile.ai\",\n jwt: settings.storeJwt ?? null,\n refreshToken: settings.storeRefreshToken ?? null,\n };\n}\n\n/** Path to user-level settings */\nfunction userSettingsPath(): string {\n return join(homedir(), \".skaile\", \"settings.json\");\n}\n\n/**\n * Persist store authentication tokens to `~/.skaile/settings.json`.\n *\n * @param jwt - The JWT access token returned by the store login endpoint.\n * @param refreshToken - The refresh token for obtaining new JWTs.\n * @docLink cli/dev-guide#store-client\n */\nexport function saveStoreTokens(jwt: string, refreshToken: string): void {\n const settingsPath = userSettingsPath();\n const dir = join(settingsPath, \"..\");\n mkdirSync(dir, { recursive: true });\n\n let current: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n } catch {\n current = {};\n }\n }\n\n current.storeJwt = jwt;\n current.storeRefreshToken = refreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n}\n\n/**\n * Remove store authentication tokens from `~/.skaile/settings.json`.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport function clearStoreTokens(): void {\n const settingsPath = userSettingsPath();\n if (!existsSync(settingsPath)) return;\n\n try {\n const current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n delete current.storeJwt;\n delete current.storeRefreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n } catch {\n // ignore\n }\n}\n\n/**\n * Make an authenticated HTTP request to the store REST API with a 1.5s timeout.\n *\n * @param config - Store connection config (URL + auth token).\n * @param path - API path (e.g. `/api/assets`).\n * @param opts - Optional method, body, query params, and extra headers.\n * @returns Parsed JSON response body.\n * @docLink cli/dev-guide#store-client\n */\nexport async function storeFetch<T = any>(\n config: StoreConfig,\n path: string,\n opts?: {\n method?: string;\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n): Promise<T> {\n let url = `${config.url}${path}`;\n if (opts?.params) {\n const sp = new URLSearchParams(opts.params);\n url += `?${sp}`;\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(opts?.headers ?? {}),\n };\n if (config.jwt) {\n headers.Authorization = `Bearer ${config.jwt}`;\n }\n\n const fetchOpts: RequestInit = {\n method: opts?.method ?? \"GET\",\n headers,\n };\n if (opts?.body) {\n fetchOpts.body = JSON.stringify(opts.body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1_500);\n try {\n const res = await fetch(url, { ...fetchOpts, signal: controller.signal });\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error((body as any).error ?? `Store API error: ${res.status}`);\n }\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Return `true` if a JWT token is present in the provided (or default) store config.\n *\n * @param config - Optional pre-loaded config; if omitted, calls {@link getStoreConfig}.\n * @docLink cli/dev-guide#store-client\n */\nexport function isStoreAuthenticated(config?: StoreConfig): boolean {\n const c = config ?? getStoreConfig();\n return !!c.jwt;\n}\n"]}
@@ -1331,6 +1331,7 @@ function mergeMcpDeclarations(base, overlay) {
1331
1331
  recipe: overlay.recipe ?? base.recipe
1332
1332
  };
1333
1333
  }
1334
+ var unscopedTail = (x) => x.includes("/") ? x.split("/").pop() : x;
1334
1335
  function loadMaterializedMcpDeclarations(projectDir) {
1335
1336
  const dir = join(projectDir, ".skaile/assets/mcp-server");
1336
1337
  if (!existsSync(dir)) return [];
@@ -1381,7 +1382,7 @@ function loadMaterializedMcpDeclarations(projectDir) {
1381
1382
  }
1382
1383
  return result;
1383
1384
  }
1384
- function stageMaterializedSkills(projectDir, skillsDir) {
1385
+ function stageMaterializedSkills(projectDir, skillsDir, opts) {
1385
1386
  const dir = join(projectDir, ".skaile/assets/skill");
1386
1387
  if (!existsSync(dir)) return [];
1387
1388
  const staged = [];
@@ -1391,9 +1392,14 @@ function stageMaterializedSkills(projectDir, skillsDir) {
1391
1392
  } catch {
1392
1393
  return [];
1393
1394
  }
1395
+ let declaredSet;
1396
+ if (opts?.strict) {
1397
+ declaredSet = new Set((opts.declared ?? []).flatMap((d) => [d, unscopedTail(d)]));
1398
+ }
1394
1399
  for (const name of subdirs) {
1395
1400
  const src = join(dir, name);
1396
1401
  if (!existsSync(join(src, "SKILL.md"))) continue;
1402
+ if (declaredSet && !declaredSet.has(name) && !declaredSet.has(unscopedTail(name))) continue;
1397
1403
  const dest = join(projectDir, skillsDir, name);
1398
1404
  try {
1399
1405
  cpSync(src, dest, {
@@ -1497,8 +1503,26 @@ function loadMcpServerDeclarations(projectDir) {
1497
1503
  if (!catalogDecl) continue;
1498
1504
  upsert(catalogDecl);
1499
1505
  }
1500
- for (const decl of materialized) {
1501
- upsert(decl);
1506
+ const strictYaml = process.env.SKAILE_STRICT_YAML === "true";
1507
+ if (strictYaml) {
1508
+ const declaredNames = /* @__PURE__ */ new Set([
1509
+ ...explicit.flatMap((e) => [e.id, unscopedTail(e.id)]),
1510
+ ...mcpRefStrings.flatMap((refStr) => {
1511
+ try {
1512
+ const r = parseAssetRef(refStr);
1513
+ return [r.name, unscopedTail(r.name)];
1514
+ } catch {
1515
+ return [];
1516
+ }
1517
+ })
1518
+ ]);
1519
+ for (const decl of materialized) {
1520
+ if (declaredNames.has(decl.id) || declaredNames.has(unscopedTail(decl.id))) upsert(decl);
1521
+ }
1522
+ } else {
1523
+ for (const decl of materialized) {
1524
+ upsert(decl);
1525
+ }
1502
1526
  }
1503
1527
  for (const decl of explicit) {
1504
1528
  upsert(decl);
@@ -1533,5 +1557,5 @@ function resolveAgentDir(projectDir) {
1533
1557
  }
1534
1558
 
1535
1559
  export { COMPACTION_DEFAULTS, CanonicalRefConflictError, DEFAULT_RECIPE_ATTR, SKAILE_YAML_DEFAULT, SKAILE_YAML_SUFFIX, SK_WORKSPACE_DEFAULT_NAME, SK_WORKSPACE_SUFFIX, buildProvenanceIndex, checkRepoStatus, checkoutPin, cloneRepo, decodeSkaileYaml, encodeSkaileYaml, ensureRepo, findWorkspaceRoot, getGlobalCacheDir, getRepoCommit, isWorkspaceConfigFilename, linkRepo, listSkWorkspaceConfigs, loadMcpServerDeclarations, loadSkWorkspaceConfig, mergeSkWorkspaceConfigs, normalizeConfig, pullRepo, readLinks, resolveAgentDir, resolveAll, resolveAsset, resolveSkWorkspaceConfig, saveSkWorkspaceConfig, scanRepo, stageMaterializedSkills, unlinkRepo, validateAssetRecipeAttr, validateAssetRecipeFlake, workspaceConfigFilename, workspaceNameFromFilename, writeLinks };
1536
- //# sourceMappingURL=chunk-Z5DI7PDG.js.map
1537
- //# sourceMappingURL=chunk-Z5DI7PDG.js.map
1560
+ //# sourceMappingURL=chunk-3QQSSRYN.js.map
1561
+ //# sourceMappingURL=chunk-3QQSSRYN.js.map