@skaile/workspaces 6.7.0 → 6.8.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 (195) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-4A7PJ4OB.js → asset-feeds-R75MH2WW.js} +6 -6
  4. package/dist/{asset-feeds-4A7PJ4OB.js.map → asset-feeds-R75MH2WW.js.map} +1 -1
  5. package/dist/asset-manager/index.js +1 -1
  6. package/dist/bridge/harnesses/claude-sdk.js +18 -10
  7. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  8. package/dist/bridge/harnesses/codex.js +3 -3
  9. package/dist/bridge/harnesses/continue.js +4 -4
  10. package/dist/bridge/harnesses/echo.js +4 -4
  11. package/dist/bridge/harnesses/gemini.js +5 -5
  12. package/dist/bridge/harnesses/goose.js +4 -4
  13. package/dist/bridge/harnesses/omp.js +6 -6
  14. package/dist/bridge/harnesses/opencode.js +4 -4
  15. package/dist/bridge/harnesses/qwen.js +5 -5
  16. package/dist/bridge/index.js +9 -9
  17. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  18. package/dist/bridge/src/harnesses/claude-self-turns.d.ts.map +1 -1
  19. package/dist/bridge/src/types.d.ts +11 -0
  20. package/dist/bridge/src/types.d.ts.map +1 -1
  21. package/dist/{chunk-ZDTDS62B.js → chunk-56PIAGD6.js} +2 -2
  22. package/dist/{chunk-ZDTDS62B.js.map → chunk-56PIAGD6.js.map} +1 -1
  23. package/dist/{chunk-TXX3OUYI.js → chunk-62NNP7LU.js} +3 -3
  24. package/dist/{chunk-TXX3OUYI.js.map → chunk-62NNP7LU.js.map} +1 -1
  25. package/dist/{chunk-KORDNXKA.js → chunk-6PVRP3LW.js} +36 -5
  26. package/dist/chunk-6PVRP3LW.js.map +1 -0
  27. package/dist/{chunk-HPXONAI2.js → chunk-6ZM5X2XW.js} +3 -3
  28. package/dist/{chunk-HPXONAI2.js.map → chunk-6ZM5X2XW.js.map} +1 -1
  29. package/dist/{chunk-ASBZOTEO.js → chunk-7NN3P6VF.js} +22 -5
  30. package/dist/chunk-7NN3P6VF.js.map +1 -0
  31. package/dist/{chunk-Q2NYTMT6.js → chunk-7O2CR5SZ.js} +5 -5
  32. package/dist/{chunk-Q2NYTMT6.js.map → chunk-7O2CR5SZ.js.map} +1 -1
  33. package/dist/{chunk-37X4A6VZ.js → chunk-7RBFYW24.js} +4 -4
  34. package/dist/{chunk-37X4A6VZ.js.map → chunk-7RBFYW24.js.map} +1 -1
  35. package/dist/{chunk-72TLO2AG.js → chunk-BGATDUYX.js} +3 -3
  36. package/dist/{chunk-72TLO2AG.js.map → chunk-BGATDUYX.js.map} +1 -1
  37. package/dist/{chunk-NURTGAWM.js → chunk-BRPEW3UL.js} +3 -3
  38. package/dist/{chunk-NURTGAWM.js.map → chunk-BRPEW3UL.js.map} +1 -1
  39. package/dist/{chunk-L3JQJ6D5.js → chunk-DXBHGNSI.js} +4 -4
  40. package/dist/{chunk-L3JQJ6D5.js.map → chunk-DXBHGNSI.js.map} +1 -1
  41. package/dist/{chunk-CTRTFMCX.js → chunk-E5AZA2FL.js} +3 -3
  42. package/dist/{chunk-CTRTFMCX.js.map → chunk-E5AZA2FL.js.map} +1 -1
  43. package/dist/{chunk-IRK3LNG3.js → chunk-EDKTS44C.js} +3 -3
  44. package/dist/{chunk-IRK3LNG3.js.map → chunk-EDKTS44C.js.map} +1 -1
  45. package/dist/{chunk-ZM4SDVUV.js → chunk-I4DI5DAX.js} +8 -8
  46. package/dist/{chunk-ZM4SDVUV.js.map → chunk-I4DI5DAX.js.map} +1 -1
  47. package/dist/{chunk-4C2E5QUP.js → chunk-I6XH46Q6.js} +3 -3
  48. package/dist/{chunk-4C2E5QUP.js.map → chunk-I6XH46Q6.js.map} +1 -1
  49. package/dist/{chunk-BKLDBUQA.js → chunk-JAGBPHXB.js} +3 -3
  50. package/dist/{chunk-BKLDBUQA.js.map → chunk-JAGBPHXB.js.map} +1 -1
  51. package/dist/{chunk-GAIMSCZ7.js → chunk-LL5GMUQG.js} +6 -6
  52. package/dist/{chunk-GAIMSCZ7.js.map → chunk-LL5GMUQG.js.map} +1 -1
  53. package/dist/{chunk-OGTQUEAO.js → chunk-LZ3E6TML.js} +5 -5
  54. package/dist/{chunk-OGTQUEAO.js.map → chunk-LZ3E6TML.js.map} +1 -1
  55. package/dist/{chunk-L7QOZG5V.js → chunk-N2W7OJC6.js} +6 -3
  56. package/dist/chunk-N2W7OJC6.js.map +1 -0
  57. package/dist/{chunk-WKENHNDM.js → chunk-N65H7YYI.js} +3 -3
  58. package/dist/{chunk-WKENHNDM.js.map → chunk-N65H7YYI.js.map} +1 -1
  59. package/dist/{chunk-LX4TTTRR.js → chunk-NAEXYRHR.js} +313 -48
  60. package/dist/chunk-NAEXYRHR.js.map +1 -0
  61. package/dist/{chunk-UCB7FK25.js → chunk-NW7Y5SNK.js} +4 -4
  62. package/dist/{chunk-UCB7FK25.js.map → chunk-NW7Y5SNK.js.map} +1 -1
  63. package/dist/{chunk-6RPS7JEH.js → chunk-OLZE4IHX.js} +284 -29
  64. package/dist/chunk-OLZE4IHX.js.map +1 -0
  65. package/dist/{chunk-PLLZSKOO.js → chunk-ORXV3UB6.js} +3 -3
  66. package/dist/{chunk-PLLZSKOO.js.map → chunk-ORXV3UB6.js.map} +1 -1
  67. package/dist/{chunk-RAHAZ7LP.js → chunk-PKC2AHOB.js} +2 -2
  68. package/dist/{chunk-RAHAZ7LP.js.map → chunk-PKC2AHOB.js.map} +1 -1
  69. package/dist/{chunk-AO57IFME.js → chunk-QGA2OBUJ.js} +3 -3
  70. package/dist/{chunk-AO57IFME.js.map → chunk-QGA2OBUJ.js.map} +1 -1
  71. package/dist/{chunk-U52FYGK5.js → chunk-REAF7ZFA.js} +4 -4
  72. package/dist/{chunk-U52FYGK5.js.map → chunk-REAF7ZFA.js.map} +1 -1
  73. package/dist/{chunk-ZBA4P5TD.js → chunk-SAL72A7T.js} +2 -2
  74. package/dist/{chunk-ZBA4P5TD.js.map → chunk-SAL72A7T.js.map} +1 -1
  75. package/dist/{chunk-XON6ODIC.js → chunk-SILFO5RY.js} +2 -2
  76. package/dist/{chunk-XON6ODIC.js.map → chunk-SILFO5RY.js.map} +1 -1
  77. package/dist/{chunk-WIYVR24B.js → chunk-SVMIUCTT.js} +3 -3
  78. package/dist/{chunk-WIYVR24B.js.map → chunk-SVMIUCTT.js.map} +1 -1
  79. package/dist/{chunk-3W6XZQ2Y.js → chunk-VQFA5DR7.js} +3 -3
  80. package/dist/{chunk-3W6XZQ2Y.js.map → chunk-VQFA5DR7.js.map} +1 -1
  81. package/dist/{chunk-HMVAGPYR.js → chunk-XIIIGLSL.js} +9 -9
  82. package/dist/{chunk-HMVAGPYR.js.map → chunk-XIIIGLSL.js.map} +1 -1
  83. package/dist/{chunk-N6ZGB5ES.js → chunk-Y6LC5PEZ.js} +3 -3
  84. package/dist/{chunk-N6ZGB5ES.js.map → chunk-Y6LC5PEZ.js.map} +1 -1
  85. package/dist/{chunk-LZPJOF7Y.js → chunk-YEOG7CWQ.js} +3 -3
  86. package/dist/{chunk-LZPJOF7Y.js.map → chunk-YEOG7CWQ.js.map} +1 -1
  87. package/dist/{chunk-37AYPPOO.js → chunk-YMO4ZDLC.js} +8 -8
  88. package/dist/{chunk-37AYPPOO.js.map → chunk-YMO4ZDLC.js.map} +1 -1
  89. package/dist/{chunk-J7VEQORJ.js → chunk-Z5EPCIB6.js} +5 -5
  90. package/dist/{chunk-J7VEQORJ.js.map → chunk-Z5EPCIB6.js.map} +1 -1
  91. package/dist/{claude-code-BLFRZU2X.js → claude-code-DS26HI3K.js} +4 -4
  92. package/dist/{claude-code-BLFRZU2X.js.map → claude-code-DS26HI3K.js.map} +1 -1
  93. package/dist/cli/index.js +56 -56
  94. package/dist/connectors/config.js +1 -1
  95. package/dist/connectors/index.js +12 -12
  96. package/dist/connectors/src/connector-manager.d.ts +66 -2
  97. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  98. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  99. package/dist/connectors/src/connector-types.d.ts +6 -0
  100. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  101. package/dist/connectors/src/fleet-utils.d.ts +33 -0
  102. package/dist/connectors/src/fleet-utils.d.ts.map +1 -1
  103. package/dist/connectors/src/index.d.ts +2 -2
  104. package/dist/connectors/src/index.d.ts.map +1 -1
  105. package/dist/{connectors-OJJU4LSN.js → connectors-3ST6PGWP.js} +15 -15
  106. package/dist/{connectors-OJJU4LSN.js.map → connectors-3ST6PGWP.js.map} +1 -1
  107. package/dist/connectors-shared/index.js +2 -2
  108. package/dist/{ensure-sources-F6VQDCWY.js → ensure-sources-VELKRM6X.js} +13 -13
  109. package/dist/{ensure-sources-F6VQDCWY.js.map → ensure-sources-VELKRM6X.js.map} +1 -1
  110. package/dist/factory-assets/connectors/box.js +12 -12
  111. package/dist/factory-assets/connectors/deploy.js +12 -12
  112. package/dist/factory-assets/connectors/devserver.js +12 -12
  113. package/dist/factory-assets/connectors/flow/adapter.js +12 -12
  114. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +3 -3
  115. package/dist/factory-assets/connectors/flow/run-flow.js +13 -13
  116. package/dist/factory-assets/connectors/flow.js +12 -12
  117. package/dist/factory-assets/connectors/git.js +12 -12
  118. package/dist/factory-assets/connectors/gmail.js +12 -12
  119. package/dist/factory-assets/connectors/googledrive.js +12 -12
  120. package/dist/factory-assets/connectors/local.js +12 -12
  121. package/dist/factory-assets/connectors/mattermost.js +12 -12
  122. package/dist/factory-assets/connectors/memory.js +12 -12
  123. package/dist/factory-assets/connectors/minio.js +12 -12
  124. package/dist/factory-assets/connectors/postgres.js +12 -12
  125. package/dist/factory-assets/connectors/s3.js +12 -12
  126. package/dist/factory-assets/connectors/sharepoint.js +12 -12
  127. package/dist/factory-assets/connectors/sqlite.js +12 -12
  128. package/dist/factory-assets/connectors/static-server.js +12 -12
  129. package/dist/factory-assets/connectors/tunnel.js +12 -12
  130. package/dist/factory-assets/connectors/webdav.js +12 -12
  131. package/dist/factory-assets/connectors/xstate-store.js +12 -12
  132. package/dist/factory-assets/connectors/xstate.js +12 -12
  133. package/dist/{helpers-PJNUTZXZ.js → helpers-LWNKX56Y.js} +13 -13
  134. package/dist/{helpers-PJNUTZXZ.js.map → helpers-LWNKX56Y.js.map} +1 -1
  135. package/dist/{library-publish-FNNDWVBO.js → library-publish-WJVCT2IK.js} +28 -28
  136. package/dist/{library-publish-FNNDWVBO.js.map → library-publish-WJVCT2IK.js.map} +1 -1
  137. package/dist/model-endpoint/index.js +3 -3
  138. package/dist/{open-library-R5EZROFN.js → open-library-Q7QZJY5D.js} +14 -14
  139. package/dist/{open-library-R5EZROFN.js.map → open-library-Q7QZJY5D.js.map} +1 -1
  140. package/dist/{project-S2FT3LLR.js → project-WVPRL7CP.js} +24 -24
  141. package/dist/{project-S2FT3LLR.js.map → project-WVPRL7CP.js.map} +1 -1
  142. package/dist/runner/index.js +18 -18
  143. package/dist/runner/src/capability-roundtrip.d.ts +2 -1
  144. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  145. package/dist/runner/src/resource-handler.d.ts +1 -1
  146. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  147. package/dist/runner/src/resources.d.ts +1 -0
  148. package/dist/runner/src/resources.d.ts.map +1 -1
  149. package/dist/runner/src/serve.d.ts.map +1 -1
  150. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  151. package/dist/runner/src/turn-scheduler.d.ts +8 -0
  152. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  153. package/dist/runner/src/turn-visibility.d.ts +97 -0
  154. package/dist/runner/src/turn-visibility.d.ts.map +1 -0
  155. package/dist/sdk/asset-manager.js +1 -1
  156. package/dist/sdk/bridge.js +9 -9
  157. package/dist/sdk/index.js +18 -18
  158. package/dist/sdk/runner.js +18 -18
  159. package/dist/sdk/session.js +2 -2
  160. package/dist/sdk/types.js +1 -1
  161. package/dist/{serve-preflight-AADSOUO2.js → serve-preflight-24YWWYUG.js} +15 -15
  162. package/dist/{serve-preflight-AADSOUO2.js.map → serve-preflight-24YWWYUG.js.map} +1 -1
  163. package/dist/session/index.js +2 -2
  164. package/dist/session/src/dispatcher.d.ts.map +1 -1
  165. package/dist/{setup-HOAJHUFQ.js → setup-F5JX64UP.js} +14 -14
  166. package/dist/{setup-HOAJHUFQ.js.map → setup-F5JX64UP.js.map} +1 -1
  167. package/dist/{source-FOELFCY6.js → source-DG5IAAGZ.js} +25 -25
  168. package/dist/{source-FOELFCY6.js.map → source-DG5IAAGZ.js.map} +1 -1
  169. package/dist/{source-manifest-publish-Q7P5AEVU.js → source-manifest-publish-76S2JD3O.js} +27 -27
  170. package/dist/{source-manifest-publish-Q7P5AEVU.js.map → source-manifest-publish-76S2JD3O.js.map} +1 -1
  171. package/dist/tui/index.js +18 -18
  172. package/dist/types/index.js +1 -1
  173. package/dist/types/src/capabilities.d.ts +3 -2
  174. package/dist/types/src/capabilities.d.ts.map +1 -1
  175. package/dist/types/src/events.d.ts +11 -10
  176. package/dist/types/src/events.d.ts.map +1 -1
  177. package/dist/types/src/index.d.ts +2 -0
  178. package/dist/types/src/index.d.ts.map +1 -1
  179. package/dist/types/src/manifests/preset.d.ts +5 -5
  180. package/dist/types/src/protocol.d.ts +3 -0
  181. package/dist/types/src/protocol.d.ts.map +1 -1
  182. package/dist/types/src/turn-visibility.d.ts +50 -0
  183. package/dist/types/src/turn-visibility.d.ts.map +1 -0
  184. package/dist/types/src/version.d.ts +14 -1
  185. package/dist/types/src/version.d.ts.map +1 -1
  186. package/dist/workspace-plugin/adapters/mcp.js +14 -14
  187. package/dist/workspace-plugin/adapters/omp.js +7 -7
  188. package/dist/workspace-plugin/index.js +1 -1
  189. package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
  190. package/package.json +1 -1
  191. package/dist/chunk-6RPS7JEH.js.map +0 -1
  192. package/dist/chunk-ASBZOTEO.js.map +0 -1
  193. package/dist/chunk-KORDNXKA.js.map +0 -1
  194. package/dist/chunk-L7QOZG5V.js.map +0 -1
  195. package/dist/chunk-LX4TTTRR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/commands/providers.ts"],"names":[],"mappings":"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","file":"chunk-WKENHNDM.js","sourcesContent":["/**\n * `skaile providers` — manage the AI provider registry.\n *\n * Endpoints are defined once, in `~/.skaile/providers.yml`, optionally\n * overridden per project in `<workspace>/.skaile/providers.yml` (gitignored by\n * `skaile init`). Every subcommand writes exactly one of those two files and\n * validates the result before it lands — a literal secret never reaches disk.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1, §2.5\n */\n\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n expandPreset,\n getProviderPreset,\n listProviderPresets,\n loadMergedProviderRegistry,\n presetBaseUrl,\n probeProviderEntry,\n} from \"@skaile/workspaces/bridge\";\nimport {\n AI_PROVIDER_LAYERS,\n AI_PROVIDER_SURFACES,\n type AIProviderDiagnostic,\n type AIProviderEntry,\n type AIProviderLayerId,\n type AIProviderLlmEntry,\n type AIProviderRegistryDocument,\n type AIProviderSurface,\n entryTransport,\n isEntryEnabled,\n isSafeProviderId,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n type ProviderRegistryFile,\n resolveCredential,\n resolveEntryBaseUrl,\n saveProviderRegistryFile,\n userProviderRegistryPath,\n validateRegistry,\n workspaceProviderRegistryPath,\n} from \"@skaile/workspaces/core\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\n\n/** Preset id that means \"no preset — I will supply the three literals\". */\nconst CUSTOM_PRESET = \"custom\";\n\n/** Which of the two registry files a command reads or writes. */\nexport interface ScopeOptions {\n projectDir?: string;\n workspace?: boolean;\n}\n\n/** The file a mutating subcommand writes: the workspace layer or the user one. */\nfunction targetFile(opts: ScopeOptions): { layer: \"user\" | \"workspace\"; path: string } {\n if (opts.workspace) {\n return { layer: \"workspace\", path: workspaceProviderRegistryPath(resolveProjectDir(opts)) };\n }\n return { layer: \"user\", path: userProviderRegistryPath() };\n}\n\n/** Project directory a subcommand operates on — `--project-dir` or the cwd. */\nfunction resolveProjectDir(opts: ScopeOptions): string {\n return opts.projectDir ? path.resolve(opts.projectDir) : process.cwd();\n}\n\n/** Both file layers plus the catalog, merged — what every reader sees. */\nexport interface RegistryView {\n merged: MergedAIProviderRegistry;\n files: ProviderRegistryFile[];\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load both file layers and merge them with the catalog layer the configured\n * `preset:` keys pull in, then gate the result. Read once, merged twice — the\n * catalog layer can only be built after the configured entries are known,\n * and it is built from the **pre-gate** merge: an entry that leaves `kind` or\n * its transport `params` to the preset fails the first gate by design.\n *\n * The gate is on the merged view, not per file: a workspace entry that sets\n * one field of an entry the user file defines is an override (§1.5), so it is\n * only here that an entry can be judged complete.\n */\nexport function loadRegistryView(opts: ScopeOptions): RegistryView {\n return loadMergedProviderRegistry({ projectDir: resolveProjectDir(opts) });\n}\n\n/** Print diagnostics; returns how many were errors. */\nfunction reportDiagnostics(diagnostics: AIProviderDiagnostic[]): number {\n let errors = 0;\n for (const diagnostic of diagnostics) {\n const where = diagnostic.path ? `${diagnostic.path}: ` : \"\";\n if (diagnostic.severity === \"error\") {\n errors++;\n logErr(`${where}${diagnostic.message}`);\n } else {\n logWarn(`${where}${diagnostic.message}`);\n }\n }\n return errors;\n}\n\n/** Highest layer that pins an entry with `locked: true`. */\nfunction lockOwner(id: string, files: ProviderRegistryFile[]): AIProviderLayerId | undefined {\n let owner: AIProviderLayerId | undefined;\n for (const file of files) {\n if (file.document.providers[id]?.locked) {\n const layer = file.layer as AIProviderLayerId;\n if (!owner || AI_PROVIDER_LAYERS.indexOf(layer) > AI_PROVIDER_LAYERS.indexOf(owner)) {\n owner = layer;\n }\n }\n }\n return owner;\n}\n\n/**\n * The message for an edit a lock forbids, or `undefined` when it is allowed.\n * The merge ignores a lower layer silently; the CLI must not, or the operator\n * would watch an accepted edit have no effect.\n *\n * `set <id> locked <value>` stays legal at the locking layer itself —\n * otherwise a lock could never be lifted without hand-editing the file.\n */\nfunction lockConflict(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): string | undefined {\n const owner = lockOwner(id, files);\n if (!owner) return undefined;\n const ownerRank = AI_PROVIDER_LAYERS.indexOf(owner);\n const targetRank = AI_PROVIDER_LAYERS.indexOf(target.layer);\n if (ownerRank === targetRank && key === \"locked\") return undefined;\n if (ownerRank < targetRank) return undefined;\n return (\n `'${id}' is locked by the ${owner} layer and cannot be changed from ${target.layer}.\\n` +\n (ownerRank === targetRank\n ? ` Unlock it first: skaile providers set ${id} locked false`\n : ` A higher layer owns this entry — change it there.`)\n );\n}\n\n/** Refuse loudly when a locked entry would be edited. */\nfunction exitIfLocked(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): void {\n const message = lockConflict(id, target, files, key);\n if (!message) return;\n logErr(message);\n process.exit(1);\n}\n\n/** Read the target file, or an empty document when it does not exist yet. */\nfunction readTargetDocument(\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n): AIProviderRegistryDocument {\n const file = files.find((f) => f.path === target.path);\n return file?.document ?? { version: 1, providers: {} };\n}\n\n/**\n * Validate the file that is about to be written; exits non-zero on errors.\n *\n * Validated as the layer it is, so `set` may leave a one-field override in the\n * workspace file (§1.5). Completeness is the merged registry's business, and\n * `loadRegistryView` reports it on the next read.\n */\nfunction validateOrExit(\n document: AIProviderRegistryDocument,\n target: { layer: \"user\" | \"workspace\"; path: string },\n): void {\n const { diagnostics } = validateRegistry(\n { version: 1, providers: document.providers },\n { source: target.path, layer: target.layer },\n );\n if (reportDiagnostics(diagnostics) > 0) process.exit(1);\n}\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n\nfunction credentialSummary(entry: AIProviderEntry): string {\n const credential = entry.credential;\n if (!credential || credential.kind === \"none\") return \"none\";\n return credential.ref ? `${credential.kind} ${credential.ref}` : credential.kind;\n}\n\nfunction printPresets(): void {\n const presets = listProviderPresets();\n console.log();\n console.log(` ${S.heading(\"Catalog presets\")}`);\n const idWidth = Math.max(...presets.map((x) => x.id.length)) + 2;\n const surfaceWidth = Math.max(...AI_PROVIDER_SURFACES.map((s) => s.length)) + 2;\n const header = `${pad(\"preset\", idWidth)}${pad(\"kind\", 7)}${pad(\"surface\", surfaceWidth)}${pad(\"transport\", 14)}default base URL`;\n console.log(` ${S.dim(header)}`);\n for (const preset of presets) {\n const row =\n pad(preset.id, idWidth) +\n pad(preset.kind, 7) +\n pad(preset.surface ?? \"—\", surfaceWidth) +\n pad(\n preset.kind === \"llm\" || preset.kind === \"embed\" ? (preset.transport ?? \"direct\") : \"—\",\n 14,\n ) +\n (presetBaseUrl(preset) ?? \"—\");\n console.log(` ${row}`);\n }\n}\n\nfunction printConfigured(view: RegistryView): void {\n const ids = view.merged.order;\n console.log();\n console.log(` ${S.heading(\"Configured providers\")}`);\n if (ids.length === 0) {\n console.log(\n ` ${S.dim(\"none — add one with\")} ${S.cmd(\"skaile providers add --preset <preset>\")}`,\n );\n console.log();\n return;\n }\n const idWidth = Math.max(...ids.map((id) => id.length)) + 2;\n const header = `${pad(\"id\", idWidth)}${pad(\"layer\", 11)}${pad(\"surface\", 26)}${pad(\"transport\", 14)}endpoint`;\n console.log(` ${S.dim(header)}`);\n for (const id of ids) {\n const entry = view.merged.providers[id];\n const surface = (entry as AIProviderLlmEntry).surface ?? \"—\";\n const transport = entryTransport(entry) ?? \"—\";\n const url = resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\");\n const flags = [\n isEntryEnabled(entry) ? \"\" : S.warn(\"disabled\"),\n entry.locked ? S.warn(\"locked\") : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n console.log(\n ` ${pad(id, idWidth)}${pad(view.merged.origin[id], 11)}${pad(surface, 26)}${pad(transport, 14)}${url} ${flags}`.trimEnd(),\n );\n console.log(` ${S.dim(`${pad(\"\", idWidth)}${credentialSummary(entry)}`)}`);\n }\n console.log();\n}\n\n// ── add ────────────────────────────────────────────────────────────────────\n\ninterface AddOptions extends ScopeOptions {\n preset?: string;\n credential?: string;\n baseUrl?: string;\n surface?: string;\n label?: string;\n kind?: string;\n param: string[];\n force?: boolean;\n}\n\nfunction parseParams(pairs: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) {\n logErr(`--param expects <key>=<value> (got '${pair}')`);\n process.exit(1);\n }\n out[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return out;\n}\n\n/** Ask for the three literals a custom endpoint needs. Nothing else. */\nasync function promptCustomEntry(\n id: string,\n opts: AddOptions,\n): Promise<{ surface: AIProviderSurface; baseUrl: string; credentialRef: string }> {\n const interactive = process.stdin.isTTY === true;\n let surface = opts.surface as AIProviderSurface | undefined;\n let baseUrl = opts.baseUrl;\n let credentialRef = opts.credential;\n\n if (!interactive && (!surface || !baseUrl || !credentialRef)) {\n logErr(\n \"--preset custom needs --surface, --base-url and --credential when there is no terminal to prompt on\",\n );\n process.exit(1);\n }\n\n if (!surface) {\n const answer = await p.select({\n message: \"Wire surface:\",\n options: AI_PROVIDER_SURFACES.map((value) => ({ value, label: value })),\n initialValue: \"openai-completions\" as AIProviderSurface,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n surface = answer as AIProviderSurface;\n }\n if (!baseUrl) {\n const answer = await p.text({\n message: \"Base URL:\",\n placeholder: \"https://api.example.com/v1\",\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n baseUrl = answer as string;\n }\n if (!credentialRef) {\n const answer = await p.text({\n message: \"Credential reference (env:NAME, cmd:<shell>, platform:<id>, keyring:<svc>/<acct>):\",\n initialValue: `env:${id.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_API_KEY`,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n credentialRef = answer as string;\n }\n return { surface, baseUrl, credentialRef };\n}\n\n/** A rejected registry write. The message is already CLI-ready. */\nexport class ProviderRegistryWriteError extends Error {}\n\n/** What {@link addProviderEntry} writes. */\nexport interface AddProviderEntryInput extends ScopeOptions {\n /** Registry entry id — `[a-z0-9][a-z0-9_-]*`. */\n id: string;\n /** Catalog preset to expand. Mutually exclusive with `entry`. */\n presetId?: string;\n /** A fully-built entry (the `--preset custom` path, which needs prompts). */\n entry?: AIProviderEntry;\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…` — never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n params?: Record<string, string>;\n /** Overwrite an entry that already exists in the target file. */\n force?: boolean;\n}\n\n/** Result of {@link addProviderEntry}. */\nexport interface AddedProviderEntry {\n id: string;\n layer: \"user\" | \"workspace\";\n path: string;\n entry: AIProviderEntry;\n /** True when an existing entry in the target file was overwritten. */\n replaced: boolean;\n}\n\n/**\n * Write one entry into a registry file — the single write path behind\n * `skaile providers add` and the `skaile setup` wizard.\n *\n * Throws {@link ProviderRegistryWriteError} instead of exiting, so a wizard\n * can report the failure in its own idiom. Every rejection a caller can\n * provoke (bad id, unknown preset, missing transport parameter, locked entry,\n * a literal secret) lands here, and the document is validated before it is\n * written — a secret cannot reach disk through this function.\n */\nexport function addProviderEntry(input: AddProviderEntryInput): AddedProviderEntry {\n const { id } = input;\n if (!isSafeProviderId(id)) {\n throw new ProviderRegistryWriteError(\n `'${id}' is not a valid entry id — use [a-z0-9][a-z0-9_-]*`,\n );\n }\n if (input.credentialRef && !parseCredentialRef(input.credentialRef)) {\n throw new ProviderRegistryWriteError(\n \"the credential must be a reference, not a secret: \" +\n \"env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>\",\n );\n }\n\n const view = loadRegistryView(input);\n const target = targetFile(input);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n const replaced = document.providers[id] !== undefined;\n if (replaced && !input.force) {\n throw new ProviderRegistryWriteError(\n `'${id}' already exists in ${target.path} — pass --force to overwrite it.`,\n );\n }\n\n let entry: AIProviderEntry;\n if (input.entry) {\n entry = input.entry;\n } else {\n const preset = input.presetId ? getProviderPreset(input.presetId) : undefined;\n if (!preset) {\n throw new ProviderRegistryWriteError(\n `Unknown preset '${input.presetId}'. Run \\`skaile providers list\\` to see the catalog, ` +\n \"or use `--preset custom`.\",\n );\n }\n entry = expandPreset(preset, {\n credentialRef: input.credentialRef,\n baseUrl: input.baseUrl,\n surface: input.surface,\n label: input.label,\n params: input.params,\n });\n const missing = (preset.required_params ?? []).filter(\n (key) => !(key in ((entry as AIProviderLlmEntry).params ?? {})),\n );\n if (missing.length > 0) {\n throw new ProviderRegistryWriteError(\n `Preset '${preset.id}' needs ${missing.map((m) => `--param ${m}=<value>`).join(\" \")}`,\n );\n }\n }\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: entry },\n };\n const { diagnostics } = validateRegistry(\n { version: 1, providers: next.providers },\n { source: target.path },\n );\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n if (errors.length > 0) {\n throw new ProviderRegistryWriteError(\n errors.map((d) => (d.path ? `${d.path}: ${d.message}` : d.message)).join(\"\\n\"),\n );\n }\n saveProviderRegistryFile(target.path, next);\n\n return { id, layer: target.layer, path: target.path, entry, replaced };\n}\n\n/** The env var an `env:` credential reference points at, if it is one. */\nexport function credentialEnvVarName(entry: AIProviderEntry): string | undefined {\n const ref = entry.credential?.ref;\n return ref?.startsWith(\"env:\") ? ref.slice(4) : undefined;\n}\n\n/** Build the `--preset custom` entry from the three literals the user gave. */\nfunction customEntry(\n answers: { surface: AIProviderSurface; baseUrl: string; credentialRef: string },\n opts: AddOptions,\n): AIProviderEntry {\n const kind = (opts.kind ?? \"llm\") as AIProviderEntry[\"kind\"];\n // Anthropic- and Google-shaped surfaces read a dedicated API-key header;\n // everything else is a bearer token. `set <id> credential.kind …` adjusts.\n const credentialKind =\n kind === \"stt\" ||\n kind === \"tts\" ||\n answers.surface === \"anthropic-messages\" ||\n answers.surface === \"google-generative-ai\" ||\n answers.surface === \"azure-openai-responses\"\n ? \"api_key_header\"\n : \"bearer\";\n if (kind === \"stt\" || kind === \"tts\") {\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n };\n }\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n surface: answers.surface,\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n } as AIProviderLlmEntry;\n}\n\nasync function runAdd(idArg: string | undefined, opts: AddOptions): Promise<void> {\n const presetId = opts.preset;\n if (!presetId) {\n logErr(\n `--preset is required. Run ${S.cmd(\"skaile providers list\")} for the catalog, ` +\n `or use ${S.cmd(\"--preset custom\")}.`,\n );\n process.exit(1);\n }\n const id = idArg ?? presetId;\n if (id === CUSTOM_PRESET && !idArg) {\n logErr(\"--preset custom needs an entry id: skaile providers add <id> --preset custom\");\n process.exit(1);\n }\n\n const entry =\n presetId === CUSTOM_PRESET ? customEntry(await promptCustomEntry(id, opts), opts) : undefined;\n\n let added: AddedProviderEntry;\n try {\n added = addProviderEntry({\n id,\n ...(entry ? { entry } : { presetId }),\n credentialRef: opts.credential,\n baseUrl: opts.baseUrl,\n surface: opts.surface as AIProviderSurface | undefined,\n label: opts.label,\n params: parseParams(opts.param),\n projectDir: opts.projectDir,\n workspace: opts.workspace,\n force: opts.force,\n });\n } catch (error) {\n logErr(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n logOk(`Added ${S.bold(id)} (${presetId}) to the ${added.layer} registry`);\n console.log(S.dim(` → ${added.path}`));\n const name = credentialEnvVarName(added.entry);\n if (name) {\n console.log(\n ` ${S.dim(\"The secret itself never goes in this file — export it:\")} ${S.cmd(`export ${name}=…`)}`,\n );\n }\n console.log(` ${S.dim(\"Verify with:\")} ${S.cmd(`skaile providers test ${id}`)}`);\n}\n\n// ── set / rm ───────────────────────────────────────────────────────────────\n\n/** Coerce a CLI string into the type the schema expects at `key`. */\nfunction coerceValue(key: string, value: string): unknown {\n const leaf = key.split(\".\").pop() ?? key;\n if (leaf === \"enabled\" || leaf === \"locked\" || leaf === \"tools\" || leaf === \"images\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n logErr(`'${key}' takes true or false (got '${value}')`);\n process.exit(1);\n }\n if (leaf === \"context_window\" || leaf === \"thinking_max\") {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n logErr(`'${key}' takes a number (got '${value}')`);\n process.exit(1);\n }\n return parsed;\n }\n return value;\n}\n\n/** Write `value` at a dotted path, creating intermediate maps. */\nfunction setDotted(entry: Record<string, unknown>, key: string, value: unknown): void {\n const segments = key.split(\".\");\n let cursor = entry;\n for (const segment of segments.slice(0, -1)) {\n const next = cursor[segment];\n if (typeof next !== \"object\" || next === null || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = value;\n}\n\nfunction runSet(id: string, key: string, value: string, opts: ScopeOptions): void {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n exitIfLocked(id, target, view.files, key);\n\n const document = readTargetDocument(target, view.files);\n const existing = document.providers[id];\n const inherited = view.merged.providers[id];\n if (!existing && !inherited) {\n logErr(\n `No provider '${id}'. Add it with ${S.cmd(`skaile providers add ${id} --preset <preset>`)}`,\n );\n process.exit(1);\n }\n\n // Writing a field into a layer that has no entry yet leaves a one-field\n // override: the layers below keep supplying the rest (§1.5), so copying\n // their `kind` down here would pin a value this layer does not own.\n const base = (existing ? structuredClone(existing) : {}) as unknown as Record<string, unknown>;\n setDotted(base, key, coerceValue(key, value));\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: base as unknown as AIProviderEntry },\n };\n validateOrExit(next, target);\n saveProviderRegistryFile(target.path, next);\n\n logOk(`Set ${S.bold(`${id}.${key}`)} = ${value} in the ${target.layer} registry`);\n console.log(S.dim(` → ${target.path}`));\n}\n\n/** Result of {@link removeProviderEntry}. */\nexport interface RemovedProviderEntry {\n layer: \"user\" | \"workspace\";\n path: string;\n /** True when another layer still defines the same id. */\n stillDefinedElsewhere: boolean;\n}\n\n/**\n * Delete one entry from a registry file: the write path behind `skaile providers rm` and\n * `skaile config unset apiKey.<provider>`. Returns `undefined` when the target file has no such\n * entry; throws {@link ProviderRegistryWriteError} for a locked one.\n */\nexport function removeProviderEntry(\n id: string,\n opts: ScopeOptions,\n): RemovedProviderEntry | undefined {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n if (!document.providers[id]) return undefined;\n const providers = { ...document.providers };\n delete providers[id];\n saveProviderRegistryFile(target.path, { version: 1, providers });\n return {\n layer: target.layer,\n path: target.path,\n stillDefinedElsewhere: Boolean(\n view.merged.providers[id] &&\n view.files.some((f) => f.path !== target.path && f.document.providers[id]),\n ),\n };\n}\n\nfunction runRemove(id: string, opts: ScopeOptions): void {\n let removed: RemovedProviderEntry | undefined;\n try {\n removed = removeProviderEntry(id, opts);\n } catch (error) {\n if (!(error instanceof ProviderRegistryWriteError)) throw error;\n logErr(error.message);\n process.exit(1);\n }\n if (!removed) {\n logErr(`No provider '${id}' in ${targetFile(opts).path}`);\n process.exit(1);\n }\n\n logOk(`Removed ${S.bold(id)} from the ${removed.layer} registry`);\n console.log(S.dim(` → ${removed.path}`));\n if (removed.stillDefinedElsewhere) {\n logInfo(`'${id}' is still defined in another layer — run 'skaile providers list' to see it.`);\n }\n}\n\n// ── test ───────────────────────────────────────────────────────────────────\n\nasync function runTest(id: string, opts: ScopeOptions): Promise<void> {\n const view = loadRegistryView(opts);\n const entry = view.merged.providers[id];\n if (!entry) {\n logErr(`No provider '${id}'. Run ${S.cmd(\"skaile providers list\")} to see what is configured.`);\n process.exit(1);\n }\n\n const credential = resolveCredential(entry);\n console.log();\n console.log(` ${S.heading(id)} ${S.dim(`(${view.merged.origin[id]} layer)`)}`);\n console.log(` ${S.label(\"endpoint \")} ${resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\")}`);\n console.log(\n ` ${S.label(\"credential\")} ${credentialSummary(entry)} ${\n credential.error\n ? S.err(`— ${credential.error}`)\n : S.dim(`— resolved from ${credential.source}`)\n }`,\n );\n\n if (credential.error) {\n console.log();\n logErr(`${id} is not usable yet: ${credential.error}`);\n process.exit(1);\n }\n\n const result = await probeProviderEntry(entry, { secret: credential.value });\n if (result.url) console.log(` ${S.label(\"probe \")} GET ${result.url}`);\n console.log();\n if (result.ok) {\n logOk(`${id}: ${result.detail}${result.status ? ` (HTTP ${result.status})` : \"\"}`);\n return;\n }\n if (!result.probed) {\n logWarn(`${id}: ${result.detail}`);\n return;\n }\n logErr(`${id}: ${result.detail}`);\n process.exit(1);\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\n/**\n * Create the `skaile providers` command group.\n *\n * `list` shows the catalog and what is configured; `add` writes an entry from\n * a preset (or from three literals with `--preset custom`); `set` and `rm`\n * edit one layer; `test` sends one read-only request and reports what came\n * back, never the credential.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n */\nexport function makeProvidersCommand(): Command {\n const cmd = new Command(\"providers\").description(\n \"Manage AI provider endpoints (~/.skaile/providers.yml)\",\n );\n\n cmd\n .command(\"list\")\n .description(\"List catalog presets and configured providers\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--json\", \"Machine-readable output\")\n .action((opts) => {\n const view = loadRegistryView(opts);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n presets: listProviderPresets().map((preset) => ({\n id: preset.id,\n kind: preset.kind,\n surface: preset.surface,\n transport: preset.transport ?? (preset.surface ? \"direct\" : undefined),\n base_url: presetBaseUrl(preset),\n credential: preset.credential,\n required_params: preset.required_params,\n })),\n providers: view.merged.order.map((id) => ({\n id,\n layer: view.merged.origin[id],\n entry: view.merged.providers[id],\n base_url: resolveEntryBaseUrl(view.merged.providers[id]),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n reportDiagnostics(view.diagnostics);\n printPresets();\n printConfigured(view);\n });\n\n cmd\n .command(\"add [id]\")\n .description(\"Add a provider from a catalog preset (id defaults to the preset name)\")\n .requiredOption(\"--preset <preset>\", `Catalog preset, or '${CUSTOM_PRESET}'`)\n .option(\"--credential <ref>\", \"Credential reference (env:NAME, cmd:…, platform:…, keyring:…)\")\n .option(\"--base-url <url>\", \"Override the preset endpoint\")\n .option(\"--surface <surface>\", `Wire surface (${AI_PROVIDER_SURFACES.join(\", \")})`)\n .option(\"--kind <kind>\", \"Entry kind for --preset custom (llm, embed, stt, tts)\", \"llm\")\n .option(\"--label <text>\", \"Display label\")\n .option(\n \"--param <key=value>\",\n \"Transport parameter (repeatable): region, project, location, resource, deployment, api_version\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--force\", \"Overwrite an existing entry in the target file\")\n .action((id: string | undefined, opts: AddOptions) => runAdd(id, opts));\n\n cmd\n .command(\"set <id> <key> <value>\")\n .description(\n \"Set one field (base_url, enabled, credential.ref, headers.<name>, model_map.<id>…)\",\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, key: string, value: string, opts: ScopeOptions) =>\n runSet(id, key, value, opts),\n );\n\n cmd\n .command(\"rm <id>\")\n .description(\"Remove a provider from one layer\")\n .option(\"--workspace\", \"Edit <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runRemove(id, opts));\n\n cmd\n .command(\"test <id>\")\n .description(\"Send one read-only request to a provider and report the result\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runTest(id, opts));\n\n return cmd;\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/commands/providers.ts"],"names":[],"mappings":"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","file":"chunk-N65H7YYI.js","sourcesContent":["/**\n * `skaile providers` — manage the AI provider registry.\n *\n * Endpoints are defined once, in `~/.skaile/providers.yml`, optionally\n * overridden per project in `<workspace>/.skaile/providers.yml` (gitignored by\n * `skaile init`). Every subcommand writes exactly one of those two files and\n * validates the result before it lands — a literal secret never reaches disk.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1, §2.5\n */\n\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n expandPreset,\n getProviderPreset,\n listProviderPresets,\n loadMergedProviderRegistry,\n presetBaseUrl,\n probeProviderEntry,\n} from \"@skaile/workspaces/bridge\";\nimport {\n AI_PROVIDER_LAYERS,\n AI_PROVIDER_SURFACES,\n type AIProviderDiagnostic,\n type AIProviderEntry,\n type AIProviderLayerId,\n type AIProviderLlmEntry,\n type AIProviderRegistryDocument,\n type AIProviderSurface,\n entryTransport,\n isEntryEnabled,\n isSafeProviderId,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n type ProviderRegistryFile,\n resolveCredential,\n resolveEntryBaseUrl,\n saveProviderRegistryFile,\n userProviderRegistryPath,\n validateRegistry,\n workspaceProviderRegistryPath,\n} from \"@skaile/workspaces/core\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\n\n/** Preset id that means \"no preset — I will supply the three literals\". */\nconst CUSTOM_PRESET = \"custom\";\n\n/** Which of the two registry files a command reads or writes. */\nexport interface ScopeOptions {\n projectDir?: string;\n workspace?: boolean;\n}\n\n/** The file a mutating subcommand writes: the workspace layer or the user one. */\nfunction targetFile(opts: ScopeOptions): { layer: \"user\" | \"workspace\"; path: string } {\n if (opts.workspace) {\n return { layer: \"workspace\", path: workspaceProviderRegistryPath(resolveProjectDir(opts)) };\n }\n return { layer: \"user\", path: userProviderRegistryPath() };\n}\n\n/** Project directory a subcommand operates on — `--project-dir` or the cwd. */\nfunction resolveProjectDir(opts: ScopeOptions): string {\n return opts.projectDir ? path.resolve(opts.projectDir) : process.cwd();\n}\n\n/** Both file layers plus the catalog, merged — what every reader sees. */\nexport interface RegistryView {\n merged: MergedAIProviderRegistry;\n files: ProviderRegistryFile[];\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load both file layers and merge them with the catalog layer the configured\n * `preset:` keys pull in, then gate the result. Read once, merged twice — the\n * catalog layer can only be built after the configured entries are known,\n * and it is built from the **pre-gate** merge: an entry that leaves `kind` or\n * its transport `params` to the preset fails the first gate by design.\n *\n * The gate is on the merged view, not per file: a workspace entry that sets\n * one field of an entry the user file defines is an override (§1.5), so it is\n * only here that an entry can be judged complete.\n */\nexport function loadRegistryView(opts: ScopeOptions): RegistryView {\n return loadMergedProviderRegistry({ projectDir: resolveProjectDir(opts) });\n}\n\n/** Print diagnostics; returns how many were errors. */\nfunction reportDiagnostics(diagnostics: AIProviderDiagnostic[]): number {\n let errors = 0;\n for (const diagnostic of diagnostics) {\n const where = diagnostic.path ? `${diagnostic.path}: ` : \"\";\n if (diagnostic.severity === \"error\") {\n errors++;\n logErr(`${where}${diagnostic.message}`);\n } else {\n logWarn(`${where}${diagnostic.message}`);\n }\n }\n return errors;\n}\n\n/** Highest layer that pins an entry with `locked: true`. */\nfunction lockOwner(id: string, files: ProviderRegistryFile[]): AIProviderLayerId | undefined {\n let owner: AIProviderLayerId | undefined;\n for (const file of files) {\n if (file.document.providers[id]?.locked) {\n const layer = file.layer as AIProviderLayerId;\n if (!owner || AI_PROVIDER_LAYERS.indexOf(layer) > AI_PROVIDER_LAYERS.indexOf(owner)) {\n owner = layer;\n }\n }\n }\n return owner;\n}\n\n/**\n * The message for an edit a lock forbids, or `undefined` when it is allowed.\n * The merge ignores a lower layer silently; the CLI must not, or the operator\n * would watch an accepted edit have no effect.\n *\n * `set <id> locked <value>` stays legal at the locking layer itself —\n * otherwise a lock could never be lifted without hand-editing the file.\n */\nfunction lockConflict(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): string | undefined {\n const owner = lockOwner(id, files);\n if (!owner) return undefined;\n const ownerRank = AI_PROVIDER_LAYERS.indexOf(owner);\n const targetRank = AI_PROVIDER_LAYERS.indexOf(target.layer);\n if (ownerRank === targetRank && key === \"locked\") return undefined;\n if (ownerRank < targetRank) return undefined;\n return (\n `'${id}' is locked by the ${owner} layer and cannot be changed from ${target.layer}.\\n` +\n (ownerRank === targetRank\n ? ` Unlock it first: skaile providers set ${id} locked false`\n : ` A higher layer owns this entry — change it there.`)\n );\n}\n\n/** Refuse loudly when a locked entry would be edited. */\nfunction exitIfLocked(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): void {\n const message = lockConflict(id, target, files, key);\n if (!message) return;\n logErr(message);\n process.exit(1);\n}\n\n/** Read the target file, or an empty document when it does not exist yet. */\nfunction readTargetDocument(\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n): AIProviderRegistryDocument {\n const file = files.find((f) => f.path === target.path);\n return file?.document ?? { version: 1, providers: {} };\n}\n\n/**\n * Validate the file that is about to be written; exits non-zero on errors.\n *\n * Validated as the layer it is, so `set` may leave a one-field override in the\n * workspace file (§1.5). Completeness is the merged registry's business, and\n * `loadRegistryView` reports it on the next read.\n */\nfunction validateOrExit(\n document: AIProviderRegistryDocument,\n target: { layer: \"user\" | \"workspace\"; path: string },\n): void {\n const { diagnostics } = validateRegistry(\n { version: 1, providers: document.providers },\n { source: target.path, layer: target.layer },\n );\n if (reportDiagnostics(diagnostics) > 0) process.exit(1);\n}\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n\nfunction credentialSummary(entry: AIProviderEntry): string {\n const credential = entry.credential;\n if (!credential || credential.kind === \"none\") return \"none\";\n return credential.ref ? `${credential.kind} ${credential.ref}` : credential.kind;\n}\n\nfunction printPresets(): void {\n const presets = listProviderPresets();\n console.log();\n console.log(` ${S.heading(\"Catalog presets\")}`);\n const idWidth = Math.max(...presets.map((x) => x.id.length)) + 2;\n const surfaceWidth = Math.max(...AI_PROVIDER_SURFACES.map((s) => s.length)) + 2;\n const header = `${pad(\"preset\", idWidth)}${pad(\"kind\", 7)}${pad(\"surface\", surfaceWidth)}${pad(\"transport\", 14)}default base URL`;\n console.log(` ${S.dim(header)}`);\n for (const preset of presets) {\n const row =\n pad(preset.id, idWidth) +\n pad(preset.kind, 7) +\n pad(preset.surface ?? \"—\", surfaceWidth) +\n pad(\n preset.kind === \"llm\" || preset.kind === \"embed\" ? (preset.transport ?? \"direct\") : \"—\",\n 14,\n ) +\n (presetBaseUrl(preset) ?? \"—\");\n console.log(` ${row}`);\n }\n}\n\nfunction printConfigured(view: RegistryView): void {\n const ids = view.merged.order;\n console.log();\n console.log(` ${S.heading(\"Configured providers\")}`);\n if (ids.length === 0) {\n console.log(\n ` ${S.dim(\"none — add one with\")} ${S.cmd(\"skaile providers add --preset <preset>\")}`,\n );\n console.log();\n return;\n }\n const idWidth = Math.max(...ids.map((id) => id.length)) + 2;\n const header = `${pad(\"id\", idWidth)}${pad(\"layer\", 11)}${pad(\"surface\", 26)}${pad(\"transport\", 14)}endpoint`;\n console.log(` ${S.dim(header)}`);\n for (const id of ids) {\n const entry = view.merged.providers[id];\n const surface = (entry as AIProviderLlmEntry).surface ?? \"—\";\n const transport = entryTransport(entry) ?? \"—\";\n const url = resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\");\n const flags = [\n isEntryEnabled(entry) ? \"\" : S.warn(\"disabled\"),\n entry.locked ? S.warn(\"locked\") : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n console.log(\n ` ${pad(id, idWidth)}${pad(view.merged.origin[id], 11)}${pad(surface, 26)}${pad(transport, 14)}${url} ${flags}`.trimEnd(),\n );\n console.log(` ${S.dim(`${pad(\"\", idWidth)}${credentialSummary(entry)}`)}`);\n }\n console.log();\n}\n\n// ── add ────────────────────────────────────────────────────────────────────\n\ninterface AddOptions extends ScopeOptions {\n preset?: string;\n credential?: string;\n baseUrl?: string;\n surface?: string;\n label?: string;\n kind?: string;\n param: string[];\n force?: boolean;\n}\n\nfunction parseParams(pairs: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) {\n logErr(`--param expects <key>=<value> (got '${pair}')`);\n process.exit(1);\n }\n out[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return out;\n}\n\n/** Ask for the three literals a custom endpoint needs. Nothing else. */\nasync function promptCustomEntry(\n id: string,\n opts: AddOptions,\n): Promise<{ surface: AIProviderSurface; baseUrl: string; credentialRef: string }> {\n const interactive = process.stdin.isTTY === true;\n let surface = opts.surface as AIProviderSurface | undefined;\n let baseUrl = opts.baseUrl;\n let credentialRef = opts.credential;\n\n if (!interactive && (!surface || !baseUrl || !credentialRef)) {\n logErr(\n \"--preset custom needs --surface, --base-url and --credential when there is no terminal to prompt on\",\n );\n process.exit(1);\n }\n\n if (!surface) {\n const answer = await p.select({\n message: \"Wire surface:\",\n options: AI_PROVIDER_SURFACES.map((value) => ({ value, label: value })),\n initialValue: \"openai-completions\" as AIProviderSurface,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n surface = answer as AIProviderSurface;\n }\n if (!baseUrl) {\n const answer = await p.text({\n message: \"Base URL:\",\n placeholder: \"https://api.example.com/v1\",\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n baseUrl = answer as string;\n }\n if (!credentialRef) {\n const answer = await p.text({\n message: \"Credential reference (env:NAME, cmd:<shell>, platform:<id>, keyring:<svc>/<acct>):\",\n initialValue: `env:${id.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_API_KEY`,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n credentialRef = answer as string;\n }\n return { surface, baseUrl, credentialRef };\n}\n\n/** A rejected registry write. The message is already CLI-ready. */\nexport class ProviderRegistryWriteError extends Error {}\n\n/** What {@link addProviderEntry} writes. */\nexport interface AddProviderEntryInput extends ScopeOptions {\n /** Registry entry id — `[a-z0-9][a-z0-9_-]*`. */\n id: string;\n /** Catalog preset to expand. Mutually exclusive with `entry`. */\n presetId?: string;\n /** A fully-built entry (the `--preset custom` path, which needs prompts). */\n entry?: AIProviderEntry;\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…` — never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n params?: Record<string, string>;\n /** Overwrite an entry that already exists in the target file. */\n force?: boolean;\n}\n\n/** Result of {@link addProviderEntry}. */\nexport interface AddedProviderEntry {\n id: string;\n layer: \"user\" | \"workspace\";\n path: string;\n entry: AIProviderEntry;\n /** True when an existing entry in the target file was overwritten. */\n replaced: boolean;\n}\n\n/**\n * Write one entry into a registry file — the single write path behind\n * `skaile providers add` and the `skaile setup` wizard.\n *\n * Throws {@link ProviderRegistryWriteError} instead of exiting, so a wizard\n * can report the failure in its own idiom. Every rejection a caller can\n * provoke (bad id, unknown preset, missing transport parameter, locked entry,\n * a literal secret) lands here, and the document is validated before it is\n * written — a secret cannot reach disk through this function.\n */\nexport function addProviderEntry(input: AddProviderEntryInput): AddedProviderEntry {\n const { id } = input;\n if (!isSafeProviderId(id)) {\n throw new ProviderRegistryWriteError(\n `'${id}' is not a valid entry id — use [a-z0-9][a-z0-9_-]*`,\n );\n }\n if (input.credentialRef && !parseCredentialRef(input.credentialRef)) {\n throw new ProviderRegistryWriteError(\n \"the credential must be a reference, not a secret: \" +\n \"env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>\",\n );\n }\n\n const view = loadRegistryView(input);\n const target = targetFile(input);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n const replaced = document.providers[id] !== undefined;\n if (replaced && !input.force) {\n throw new ProviderRegistryWriteError(\n `'${id}' already exists in ${target.path} — pass --force to overwrite it.`,\n );\n }\n\n let entry: AIProviderEntry;\n if (input.entry) {\n entry = input.entry;\n } else {\n const preset = input.presetId ? getProviderPreset(input.presetId) : undefined;\n if (!preset) {\n throw new ProviderRegistryWriteError(\n `Unknown preset '${input.presetId}'. Run \\`skaile providers list\\` to see the catalog, ` +\n \"or use `--preset custom`.\",\n );\n }\n entry = expandPreset(preset, {\n credentialRef: input.credentialRef,\n baseUrl: input.baseUrl,\n surface: input.surface,\n label: input.label,\n params: input.params,\n });\n const missing = (preset.required_params ?? []).filter(\n (key) => !(key in ((entry as AIProviderLlmEntry).params ?? {})),\n );\n if (missing.length > 0) {\n throw new ProviderRegistryWriteError(\n `Preset '${preset.id}' needs ${missing.map((m) => `--param ${m}=<value>`).join(\" \")}`,\n );\n }\n }\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: entry },\n };\n const { diagnostics } = validateRegistry(\n { version: 1, providers: next.providers },\n { source: target.path },\n );\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n if (errors.length > 0) {\n throw new ProviderRegistryWriteError(\n errors.map((d) => (d.path ? `${d.path}: ${d.message}` : d.message)).join(\"\\n\"),\n );\n }\n saveProviderRegistryFile(target.path, next);\n\n return { id, layer: target.layer, path: target.path, entry, replaced };\n}\n\n/** The env var an `env:` credential reference points at, if it is one. */\nexport function credentialEnvVarName(entry: AIProviderEntry): string | undefined {\n const ref = entry.credential?.ref;\n return ref?.startsWith(\"env:\") ? ref.slice(4) : undefined;\n}\n\n/** Build the `--preset custom` entry from the three literals the user gave. */\nfunction customEntry(\n answers: { surface: AIProviderSurface; baseUrl: string; credentialRef: string },\n opts: AddOptions,\n): AIProviderEntry {\n const kind = (opts.kind ?? \"llm\") as AIProviderEntry[\"kind\"];\n // Anthropic- and Google-shaped surfaces read a dedicated API-key header;\n // everything else is a bearer token. `set <id> credential.kind …` adjusts.\n const credentialKind =\n kind === \"stt\" ||\n kind === \"tts\" ||\n answers.surface === \"anthropic-messages\" ||\n answers.surface === \"google-generative-ai\" ||\n answers.surface === \"azure-openai-responses\"\n ? \"api_key_header\"\n : \"bearer\";\n if (kind === \"stt\" || kind === \"tts\") {\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n };\n }\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n surface: answers.surface,\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n } as AIProviderLlmEntry;\n}\n\nasync function runAdd(idArg: string | undefined, opts: AddOptions): Promise<void> {\n const presetId = opts.preset;\n if (!presetId) {\n logErr(\n `--preset is required. Run ${S.cmd(\"skaile providers list\")} for the catalog, ` +\n `or use ${S.cmd(\"--preset custom\")}.`,\n );\n process.exit(1);\n }\n const id = idArg ?? presetId;\n if (id === CUSTOM_PRESET && !idArg) {\n logErr(\"--preset custom needs an entry id: skaile providers add <id> --preset custom\");\n process.exit(1);\n }\n\n const entry =\n presetId === CUSTOM_PRESET ? customEntry(await promptCustomEntry(id, opts), opts) : undefined;\n\n let added: AddedProviderEntry;\n try {\n added = addProviderEntry({\n id,\n ...(entry ? { entry } : { presetId }),\n credentialRef: opts.credential,\n baseUrl: opts.baseUrl,\n surface: opts.surface as AIProviderSurface | undefined,\n label: opts.label,\n params: parseParams(opts.param),\n projectDir: opts.projectDir,\n workspace: opts.workspace,\n force: opts.force,\n });\n } catch (error) {\n logErr(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n logOk(`Added ${S.bold(id)} (${presetId}) to the ${added.layer} registry`);\n console.log(S.dim(` → ${added.path}`));\n const name = credentialEnvVarName(added.entry);\n if (name) {\n console.log(\n ` ${S.dim(\"The secret itself never goes in this file — export it:\")} ${S.cmd(`export ${name}=…`)}`,\n );\n }\n console.log(` ${S.dim(\"Verify with:\")} ${S.cmd(`skaile providers test ${id}`)}`);\n}\n\n// ── set / rm ───────────────────────────────────────────────────────────────\n\n/** Coerce a CLI string into the type the schema expects at `key`. */\nfunction coerceValue(key: string, value: string): unknown {\n const leaf = key.split(\".\").pop() ?? key;\n if (leaf === \"enabled\" || leaf === \"locked\" || leaf === \"tools\" || leaf === \"images\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n logErr(`'${key}' takes true or false (got '${value}')`);\n process.exit(1);\n }\n if (leaf === \"context_window\" || leaf === \"thinking_max\") {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n logErr(`'${key}' takes a number (got '${value}')`);\n process.exit(1);\n }\n return parsed;\n }\n return value;\n}\n\n/** Write `value` at a dotted path, creating intermediate maps. */\nfunction setDotted(entry: Record<string, unknown>, key: string, value: unknown): void {\n const segments = key.split(\".\");\n let cursor = entry;\n for (const segment of segments.slice(0, -1)) {\n const next = cursor[segment];\n if (typeof next !== \"object\" || next === null || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = value;\n}\n\nfunction runSet(id: string, key: string, value: string, opts: ScopeOptions): void {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n exitIfLocked(id, target, view.files, key);\n\n const document = readTargetDocument(target, view.files);\n const existing = document.providers[id];\n const inherited = view.merged.providers[id];\n if (!existing && !inherited) {\n logErr(\n `No provider '${id}'. Add it with ${S.cmd(`skaile providers add ${id} --preset <preset>`)}`,\n );\n process.exit(1);\n }\n\n // Writing a field into a layer that has no entry yet leaves a one-field\n // override: the layers below keep supplying the rest (§1.5), so copying\n // their `kind` down here would pin a value this layer does not own.\n const base = (existing ? structuredClone(existing) : {}) as unknown as Record<string, unknown>;\n setDotted(base, key, coerceValue(key, value));\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: base as unknown as AIProviderEntry },\n };\n validateOrExit(next, target);\n saveProviderRegistryFile(target.path, next);\n\n logOk(`Set ${S.bold(`${id}.${key}`)} = ${value} in the ${target.layer} registry`);\n console.log(S.dim(` → ${target.path}`));\n}\n\n/** Result of {@link removeProviderEntry}. */\nexport interface RemovedProviderEntry {\n layer: \"user\" | \"workspace\";\n path: string;\n /** True when another layer still defines the same id. */\n stillDefinedElsewhere: boolean;\n}\n\n/**\n * Delete one entry from a registry file: the write path behind `skaile providers rm` and\n * `skaile config unset apiKey.<provider>`. Returns `undefined` when the target file has no such\n * entry; throws {@link ProviderRegistryWriteError} for a locked one.\n */\nexport function removeProviderEntry(\n id: string,\n opts: ScopeOptions,\n): RemovedProviderEntry | undefined {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n if (!document.providers[id]) return undefined;\n const providers = { ...document.providers };\n delete providers[id];\n saveProviderRegistryFile(target.path, { version: 1, providers });\n return {\n layer: target.layer,\n path: target.path,\n stillDefinedElsewhere: Boolean(\n view.merged.providers[id] &&\n view.files.some((f) => f.path !== target.path && f.document.providers[id]),\n ),\n };\n}\n\nfunction runRemove(id: string, opts: ScopeOptions): void {\n let removed: RemovedProviderEntry | undefined;\n try {\n removed = removeProviderEntry(id, opts);\n } catch (error) {\n if (!(error instanceof ProviderRegistryWriteError)) throw error;\n logErr(error.message);\n process.exit(1);\n }\n if (!removed) {\n logErr(`No provider '${id}' in ${targetFile(opts).path}`);\n process.exit(1);\n }\n\n logOk(`Removed ${S.bold(id)} from the ${removed.layer} registry`);\n console.log(S.dim(` → ${removed.path}`));\n if (removed.stillDefinedElsewhere) {\n logInfo(`'${id}' is still defined in another layer — run 'skaile providers list' to see it.`);\n }\n}\n\n// ── test ───────────────────────────────────────────────────────────────────\n\nasync function runTest(id: string, opts: ScopeOptions): Promise<void> {\n const view = loadRegistryView(opts);\n const entry = view.merged.providers[id];\n if (!entry) {\n logErr(`No provider '${id}'. Run ${S.cmd(\"skaile providers list\")} to see what is configured.`);\n process.exit(1);\n }\n\n const credential = resolveCredential(entry);\n console.log();\n console.log(` ${S.heading(id)} ${S.dim(`(${view.merged.origin[id]} layer)`)}`);\n console.log(` ${S.label(\"endpoint \")} ${resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\")}`);\n console.log(\n ` ${S.label(\"credential\")} ${credentialSummary(entry)} ${\n credential.error\n ? S.err(`— ${credential.error}`)\n : S.dim(`— resolved from ${credential.source}`)\n }`,\n );\n\n if (credential.error) {\n console.log();\n logErr(`${id} is not usable yet: ${credential.error}`);\n process.exit(1);\n }\n\n const result = await probeProviderEntry(entry, { secret: credential.value });\n if (result.url) console.log(` ${S.label(\"probe \")} GET ${result.url}`);\n console.log();\n if (result.ok) {\n logOk(`${id}: ${result.detail}${result.status ? ` (HTTP ${result.status})` : \"\"}`);\n return;\n }\n if (!result.probed) {\n logWarn(`${id}: ${result.detail}`);\n return;\n }\n logErr(`${id}: ${result.detail}`);\n process.exit(1);\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\n/**\n * Create the `skaile providers` command group.\n *\n * `list` shows the catalog and what is configured; `add` writes an entry from\n * a preset (or from three literals with `--preset custom`); `set` and `rm`\n * edit one layer; `test` sends one read-only request and reports what came\n * back, never the credential.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n */\nexport function makeProvidersCommand(): Command {\n const cmd = new Command(\"providers\").description(\n \"Manage AI provider endpoints (~/.skaile/providers.yml)\",\n );\n\n cmd\n .command(\"list\")\n .description(\"List catalog presets and configured providers\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--json\", \"Machine-readable output\")\n .action((opts) => {\n const view = loadRegistryView(opts);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n presets: listProviderPresets().map((preset) => ({\n id: preset.id,\n kind: preset.kind,\n surface: preset.surface,\n transport: preset.transport ?? (preset.surface ? \"direct\" : undefined),\n base_url: presetBaseUrl(preset),\n credential: preset.credential,\n required_params: preset.required_params,\n })),\n providers: view.merged.order.map((id) => ({\n id,\n layer: view.merged.origin[id],\n entry: view.merged.providers[id],\n base_url: resolveEntryBaseUrl(view.merged.providers[id]),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n reportDiagnostics(view.diagnostics);\n printPresets();\n printConfigured(view);\n });\n\n cmd\n .command(\"add [id]\")\n .description(\"Add a provider from a catalog preset (id defaults to the preset name)\")\n .requiredOption(\"--preset <preset>\", `Catalog preset, or '${CUSTOM_PRESET}'`)\n .option(\"--credential <ref>\", \"Credential reference (env:NAME, cmd:…, platform:…, keyring:…)\")\n .option(\"--base-url <url>\", \"Override the preset endpoint\")\n .option(\"--surface <surface>\", `Wire surface (${AI_PROVIDER_SURFACES.join(\", \")})`)\n .option(\"--kind <kind>\", \"Entry kind for --preset custom (llm, embed, stt, tts)\", \"llm\")\n .option(\"--label <text>\", \"Display label\")\n .option(\n \"--param <key=value>\",\n \"Transport parameter (repeatable): region, project, location, resource, deployment, api_version\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--force\", \"Overwrite an existing entry in the target file\")\n .action((id: string | undefined, opts: AddOptions) => runAdd(id, opts));\n\n cmd\n .command(\"set <id> <key> <value>\")\n .description(\n \"Set one field (base_url, enabled, credential.ref, headers.<name>, model_map.<id>…)\",\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, key: string, value: string, opts: ScopeOptions) =>\n runSet(id, key, value, opts),\n );\n\n cmd\n .command(\"rm <id>\")\n .description(\"Remove a provider from one layer\")\n .option(\"--workspace\", \"Edit <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runRemove(id, opts));\n\n cmd\n .command(\"test <id>\")\n .description(\"Send one read-only request to a provider and report the result\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runTest(id, opts));\n\n return cmd;\n}\n"]}