@dsh-cc/tui 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +144 -0
  3. package/lib/bash-history.d.ts +31 -0
  4. package/lib/bash-history.d.ts.map +1 -0
  5. package/lib/bash-history.js +94 -0
  6. package/lib/bash-history.js.map +1 -0
  7. package/lib/compact-fold.d.ts +35 -0
  8. package/lib/compact-fold.d.ts.map +1 -0
  9. package/lib/compact-fold.js +60 -0
  10. package/lib/compact-fold.js.map +1 -0
  11. package/lib/components/arg-completers.d.ts +22 -0
  12. package/lib/components/arg-completers.d.ts.map +1 -0
  13. package/lib/components/arg-completers.js +75 -0
  14. package/lib/components/arg-completers.js.map +1 -0
  15. package/lib/components/code-theme.d.ts +25 -0
  16. package/lib/components/code-theme.d.ts.map +1 -0
  17. package/lib/components/code-theme.js +137 -0
  18. package/lib/components/code-theme.js.map +1 -0
  19. package/lib/components/completion.d.ts +50 -0
  20. package/lib/components/completion.d.ts.map +1 -0
  21. package/lib/components/completion.js +279 -0
  22. package/lib/components/completion.js.map +1 -0
  23. package/lib/components/diff-card.d.ts +29 -0
  24. package/lib/components/diff-card.d.ts.map +1 -0
  25. package/lib/components/diff-card.js +175 -0
  26. package/lib/components/diff-card.js.map +1 -0
  27. package/lib/components/diff-hunks.d.ts +44 -0
  28. package/lib/components/diff-hunks.d.ts.map +1 -0
  29. package/lib/components/diff-hunks.js +188 -0
  30. package/lib/components/diff-hunks.js.map +1 -0
  31. package/lib/components/editor-history.d.ts +23 -0
  32. package/lib/components/editor-history.d.ts.map +1 -0
  33. package/lib/components/editor-history.js +29 -0
  34. package/lib/components/editor-history.js.map +1 -0
  35. package/lib/components/markdown-theme.d.ts +11 -0
  36. package/lib/components/markdown-theme.d.ts.map +1 -0
  37. package/lib/components/markdown-theme.js +29 -0
  38. package/lib/components/markdown-theme.js.map +1 -0
  39. package/lib/components/masked-input.d.ts +24 -0
  40. package/lib/components/masked-input.d.ts.map +1 -0
  41. package/lib/components/masked-input.js +168 -0
  42. package/lib/components/masked-input.js.map +1 -0
  43. package/lib/components/overlay-host.d.ts +31 -0
  44. package/lib/components/overlay-host.d.ts.map +1 -0
  45. package/lib/components/overlay-host.js +128 -0
  46. package/lib/components/overlay-host.js.map +1 -0
  47. package/lib/components/overlays.d.ts +94 -0
  48. package/lib/components/overlays.d.ts.map +1 -0
  49. package/lib/components/overlays.js +450 -0
  50. package/lib/components/overlays.js.map +1 -0
  51. package/lib/components/provider-box.d.ts +23 -0
  52. package/lib/components/provider-box.d.ts.map +1 -0
  53. package/lib/components/provider-box.js +164 -0
  54. package/lib/components/provider-box.js.map +1 -0
  55. package/lib/components/read-group.d.ts +51 -0
  56. package/lib/components/read-group.d.ts.map +1 -0
  57. package/lib/components/read-group.js +105 -0
  58. package/lib/components/read-group.js.map +1 -0
  59. package/lib/components/root-bash.d.ts +36 -0
  60. package/lib/components/root-bash.d.ts.map +1 -0
  61. package/lib/components/root-bash.js +112 -0
  62. package/lib/components/root-bash.js.map +1 -0
  63. package/lib/components/root-types.d.ts +42 -0
  64. package/lib/components/root-types.d.ts.map +1 -0
  65. package/lib/components/root-types.js +8 -0
  66. package/lib/components/root-types.js.map +1 -0
  67. package/lib/components/root-utils.d.ts +22 -0
  68. package/lib/components/root-utils.d.ts.map +1 -0
  69. package/lib/components/root-utils.js +45 -0
  70. package/lib/components/root-utils.js.map +1 -0
  71. package/lib/components/root.d.ts +25 -0
  72. package/lib/components/root.d.ts.map +1 -0
  73. package/lib/components/root.js +357 -0
  74. package/lib/components/root.js.map +1 -0
  75. package/lib/components/theme.d.ts +61 -0
  76. package/lib/components/theme.d.ts.map +1 -0
  77. package/lib/components/theme.js +99 -0
  78. package/lib/components/theme.js.map +1 -0
  79. package/lib/components/transcript.d.ts +43 -0
  80. package/lib/components/transcript.d.ts.map +1 -0
  81. package/lib/components/transcript.js +203 -0
  82. package/lib/components/transcript.js.map +1 -0
  83. package/lib/components/working-line.d.ts +35 -0
  84. package/lib/components/working-line.d.ts.map +1 -0
  85. package/lib/components/working-line.js +66 -0
  86. package/lib/components/working-line.js.map +1 -0
  87. package/lib/effort-catalog.d.ts +27 -0
  88. package/lib/effort-catalog.d.ts.map +1 -0
  89. package/lib/effort-catalog.js +36 -0
  90. package/lib/effort-catalog.js.map +1 -0
  91. package/lib/export-markdown.d.ts +18 -0
  92. package/lib/export-markdown.d.ts.map +1 -0
  93. package/lib/export-markdown.js +124 -0
  94. package/lib/export-markdown.js.map +1 -0
  95. package/lib/harness/approval-preview.d.ts +33 -0
  96. package/lib/harness/approval-preview.d.ts.map +1 -0
  97. package/lib/harness/approval-preview.js +179 -0
  98. package/lib/harness/approval-preview.js.map +1 -0
  99. package/lib/harness/boot-banner.d.ts +14 -0
  100. package/lib/harness/boot-banner.d.ts.map +1 -0
  101. package/lib/harness/boot-banner.js +89 -0
  102. package/lib/harness/boot-banner.js.map +1 -0
  103. package/lib/harness/driver-agent.d.ts +78 -0
  104. package/lib/harness/driver-agent.d.ts.map +1 -0
  105. package/lib/harness/driver-agent.js +314 -0
  106. package/lib/harness/driver-agent.js.map +1 -0
  107. package/lib/harness/driver-agents.d.ts +20 -0
  108. package/lib/harness/driver-agents.d.ts.map +1 -0
  109. package/lib/harness/driver-agents.js +123 -0
  110. package/lib/harness/driver-agents.js.map +1 -0
  111. package/lib/harness/driver-approvals.d.ts +38 -0
  112. package/lib/harness/driver-approvals.d.ts.map +1 -0
  113. package/lib/harness/driver-approvals.js +277 -0
  114. package/lib/harness/driver-approvals.js.map +1 -0
  115. package/lib/harness/driver-bash.d.ts +15 -0
  116. package/lib/harness/driver-bash.d.ts.map +1 -0
  117. package/lib/harness/driver-bash.js +73 -0
  118. package/lib/harness/driver-bash.js.map +1 -0
  119. package/lib/harness/driver-catalog.d.ts +84 -0
  120. package/lib/harness/driver-catalog.d.ts.map +1 -0
  121. package/lib/harness/driver-catalog.js +256 -0
  122. package/lib/harness/driver-catalog.js.map +1 -0
  123. package/lib/harness/driver-ctx.d.ts +462 -0
  124. package/lib/harness/driver-ctx.d.ts.map +1 -0
  125. package/lib/harness/driver-ctx.js +11 -0
  126. package/lib/harness/driver-ctx.js.map +1 -0
  127. package/lib/harness/driver-hud.d.ts +31 -0
  128. package/lib/harness/driver-hud.d.ts.map +1 -0
  129. package/lib/harness/driver-hud.js +204 -0
  130. package/lib/harness/driver-hud.js.map +1 -0
  131. package/lib/harness/driver-live.d.ts +36 -0
  132. package/lib/harness/driver-live.d.ts.map +1 -0
  133. package/lib/harness/driver-live.js +44 -0
  134. package/lib/harness/driver-live.js.map +1 -0
  135. package/lib/harness/driver-modal.d.ts +52 -0
  136. package/lib/harness/driver-modal.d.ts.map +1 -0
  137. package/lib/harness/driver-modal.js +78 -0
  138. package/lib/harness/driver-modal.js.map +1 -0
  139. package/lib/harness/driver-mode.d.ts +35 -0
  140. package/lib/harness/driver-mode.d.ts.map +1 -0
  141. package/lib/harness/driver-mode.js +84 -0
  142. package/lib/harness/driver-mode.js.map +1 -0
  143. package/lib/harness/driver-pickers.d.ts +48 -0
  144. package/lib/harness/driver-pickers.d.ts.map +1 -0
  145. package/lib/harness/driver-pickers.js +249 -0
  146. package/lib/harness/driver-pickers.js.map +1 -0
  147. package/lib/harness/driver-promote.d.ts +29 -0
  148. package/lib/harness/driver-promote.d.ts.map +1 -0
  149. package/lib/harness/driver-promote.js +36 -0
  150. package/lib/harness/driver-promote.js.map +1 -0
  151. package/lib/harness/driver-queue.d.ts +19 -0
  152. package/lib/harness/driver-queue.d.ts.map +1 -0
  153. package/lib/harness/driver-queue.js +281 -0
  154. package/lib/harness/driver-queue.js.map +1 -0
  155. package/lib/harness/driver-run-local.d.ts +32 -0
  156. package/lib/harness/driver-run-local.d.ts.map +1 -0
  157. package/lib/harness/driver-run-local.js +366 -0
  158. package/lib/harness/driver-run-local.js.map +1 -0
  159. package/lib/harness/driver-sessions.d.ts +28 -0
  160. package/lib/harness/driver-sessions.d.ts.map +1 -0
  161. package/lib/harness/driver-sessions.js +386 -0
  162. package/lib/harness/driver-sessions.js.map +1 -0
  163. package/lib/harness/driver.d.ts +22 -0
  164. package/lib/harness/driver.d.ts.map +1 -0
  165. package/lib/harness/driver.js +459 -0
  166. package/lib/harness/driver.js.map +1 -0
  167. package/lib/harness/preset.d.ts +32 -0
  168. package/lib/harness/preset.d.ts.map +1 -0
  169. package/lib/harness/preset.js +34 -0
  170. package/lib/harness/preset.js.map +1 -0
  171. package/lib/harness/session-list.d.ts +65 -0
  172. package/lib/harness/session-list.d.ts.map +1 -0
  173. package/lib/harness/session-list.js +91 -0
  174. package/lib/harness/session-list.js.map +1 -0
  175. package/lib/harness/shell-output.d.ts +44 -0
  176. package/lib/harness/shell-output.d.ts.map +1 -0
  177. package/lib/harness/shell-output.js +90 -0
  178. package/lib/harness/shell-output.js.map +1 -0
  179. package/lib/harness/statusline-cc-transcript.d.ts +51 -0
  180. package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
  181. package/lib/harness/statusline-cc-transcript.js +191 -0
  182. package/lib/harness/statusline-cc-transcript.js.map +1 -0
  183. package/lib/harness/statusline-command.d.ts +54 -0
  184. package/lib/harness/statusline-command.d.ts.map +1 -0
  185. package/lib/harness/statusline-command.js +161 -0
  186. package/lib/harness/statusline-command.js.map +1 -0
  187. package/lib/harness/statusline-payload.d.ts +79 -0
  188. package/lib/harness/statusline-payload.d.ts.map +1 -0
  189. package/lib/harness/statusline-payload.js +93 -0
  190. package/lib/harness/statusline-payload.js.map +1 -0
  191. package/lib/harness/statusline-settings.d.ts +47 -0
  192. package/lib/harness/statusline-settings.d.ts.map +1 -0
  193. package/lib/harness/statusline-settings.js +57 -0
  194. package/lib/harness/statusline-settings.js.map +1 -0
  195. package/lib/harness/statusline-wiring.d.ts +45 -0
  196. package/lib/harness/statusline-wiring.d.ts.map +1 -0
  197. package/lib/harness/statusline-wiring.js +247 -0
  198. package/lib/harness/statusline-wiring.js.map +1 -0
  199. package/lib/harness/usage-view.d.ts +84 -0
  200. package/lib/harness/usage-view.d.ts.map +1 -0
  201. package/lib/harness/usage-view.js +199 -0
  202. package/lib/harness/usage-view.js.map +1 -0
  203. package/lib/harness/worktree-exit.d.ts +105 -0
  204. package/lib/harness/worktree-exit.d.ts.map +1 -0
  205. package/lib/harness/worktree-exit.js +168 -0
  206. package/lib/harness/worktree-exit.js.map +1 -0
  207. package/lib/history.d.ts +50 -0
  208. package/lib/history.d.ts.map +1 -0
  209. package/lib/history.js +139 -0
  210. package/lib/history.js.map +1 -0
  211. package/lib/index.d.ts +63 -0
  212. package/lib/index.d.ts.map +1 -0
  213. package/lib/index.js +54 -0
  214. package/lib/index.js.map +1 -0
  215. package/lib/input.d.ts +158 -0
  216. package/lib/input.d.ts.map +1 -0
  217. package/lib/input.js +400 -0
  218. package/lib/input.js.map +1 -0
  219. package/lib/invariant.d.ts +14 -0
  220. package/lib/invariant.d.ts.map +1 -0
  221. package/lib/invariant.js +20 -0
  222. package/lib/invariant.js.map +1 -0
  223. package/lib/mode-cycle.d.ts +22 -0
  224. package/lib/mode-cycle.d.ts.map +1 -0
  225. package/lib/mode-cycle.js +32 -0
  226. package/lib/mode-cycle.js.map +1 -0
  227. package/lib/model-catalog.d.ts +22 -0
  228. package/lib/model-catalog.d.ts.map +1 -0
  229. package/lib/model-catalog.js +45 -0
  230. package/lib/model-catalog.js.map +1 -0
  231. package/lib/packaged-preset.d.ts +32 -0
  232. package/lib/packaged-preset.d.ts.map +1 -0
  233. package/lib/packaged-preset.js +94 -0
  234. package/lib/packaged-preset.js.map +1 -0
  235. package/lib/plugin.d.ts +11 -0
  236. package/lib/plugin.d.ts.map +1 -0
  237. package/lib/plugin.js +88 -0
  238. package/lib/plugin.js.map +1 -0
  239. package/lib/profile.d.ts +4 -0
  240. package/lib/profile.d.ts.map +1 -0
  241. package/lib/profile.js +7 -0
  242. package/lib/profile.js.map +1 -0
  243. package/lib/project-sessions.d.ts +29 -0
  244. package/lib/project-sessions.d.ts.map +1 -0
  245. package/lib/project-sessions.js +60 -0
  246. package/lib/project-sessions.js.map +1 -0
  247. package/lib/project.d.ts +75 -0
  248. package/lib/project.d.ts.map +1 -0
  249. package/lib/project.js +196 -0
  250. package/lib/project.js.map +1 -0
  251. package/lib/provider-actions.d.ts +37 -0
  252. package/lib/provider-actions.d.ts.map +1 -0
  253. package/lib/provider-actions.js +417 -0
  254. package/lib/provider-actions.js.map +1 -0
  255. package/lib/provider-command.d.ts +109 -0
  256. package/lib/provider-command.d.ts.map +1 -0
  257. package/lib/provider-command.js +220 -0
  258. package/lib/provider-command.js.map +1 -0
  259. package/lib/provider-detail.d.ts +15 -0
  260. package/lib/provider-detail.d.ts.map +1 -0
  261. package/lib/provider-detail.js +201 -0
  262. package/lib/provider-detail.js.map +1 -0
  263. package/lib/provider-flow.d.ts +191 -0
  264. package/lib/provider-flow.d.ts.map +1 -0
  265. package/lib/provider-flow.js +192 -0
  266. package/lib/provider-flow.js.map +1 -0
  267. package/lib/provider-presets.d.ts +32 -0
  268. package/lib/provider-presets.d.ts.map +1 -0
  269. package/lib/provider-presets.js +105 -0
  270. package/lib/provider-presets.js.map +1 -0
  271. package/lib/provider-read.d.ts +63 -0
  272. package/lib/provider-read.d.ts.map +1 -0
  273. package/lib/provider-read.js +115 -0
  274. package/lib/provider-read.js.map +1 -0
  275. package/lib/provider-settings.d.ts +30 -0
  276. package/lib/provider-settings.d.ts.map +1 -0
  277. package/lib/provider-settings.js +65 -0
  278. package/lib/provider-settings.js.map +1 -0
  279. package/lib/resume-target.d.ts +59 -0
  280. package/lib/resume-target.d.ts.map +1 -0
  281. package/lib/resume-target.js +143 -0
  282. package/lib/resume-target.js.map +1 -0
  283. package/lib/slash.d.ts +44 -0
  284. package/lib/slash.d.ts.map +1 -0
  285. package/lib/slash.js +81 -0
  286. package/lib/slash.js.map +1 -0
  287. package/lib/state/driver-types.d.ts +505 -0
  288. package/lib/state/driver-types.d.ts.map +1 -0
  289. package/lib/state/driver-types.js +8 -0
  290. package/lib/state/driver-types.js.map +1 -0
  291. package/lib/state/driver-usage-types.d.ts +59 -0
  292. package/lib/state/driver-usage-types.d.ts.map +1 -0
  293. package/lib/state/driver-usage-types.js +8 -0
  294. package/lib/state/driver-usage-types.js.map +1 -0
  295. package/lib/statusline.d.ts +63 -0
  296. package/lib/statusline.d.ts.map +1 -0
  297. package/lib/statusline.js +97 -0
  298. package/lib/statusline.js.map +1 -0
  299. package/lib/store/pickers.d.ts +34 -0
  300. package/lib/store/pickers.d.ts.map +1 -0
  301. package/lib/store/pickers.js +111 -0
  302. package/lib/store/pickers.js.map +1 -0
  303. package/lib/store/provider-panel.d.ts +107 -0
  304. package/lib/store/provider-panel.d.ts.map +1 -0
  305. package/lib/store/provider-panel.js +151 -0
  306. package/lib/store/provider-panel.js.map +1 -0
  307. package/lib/store/question.d.ts +21 -0
  308. package/lib/store/question.d.ts.map +1 -0
  309. package/lib/store/question.js +59 -0
  310. package/lib/store/question.js.map +1 -0
  311. package/lib/store/queue.d.ts +27 -0
  312. package/lib/store/queue.d.ts.map +1 -0
  313. package/lib/store/queue.js +34 -0
  314. package/lib/store/queue.js.map +1 -0
  315. package/lib/store/session.d.ts +73 -0
  316. package/lib/store/session.d.ts.map +1 -0
  317. package/lib/store/session.js +172 -0
  318. package/lib/store/session.js.map +1 -0
  319. package/lib/store/subagents.d.ts +16 -0
  320. package/lib/store/subagents.d.ts.map +1 -0
  321. package/lib/store/subagents.js +44 -0
  322. package/lib/store/subagents.js.map +1 -0
  323. package/lib/store/todos.d.ts +35 -0
  324. package/lib/store/todos.d.ts.map +1 -0
  325. package/lib/store/todos.js +68 -0
  326. package/lib/store/todos.js.map +1 -0
  327. package/lib/store/usage.d.ts +15 -0
  328. package/lib/store/usage.d.ts.map +1 -0
  329. package/lib/store/usage.js +27 -0
  330. package/lib/store/usage.js.map +1 -0
  331. package/lib/store/views.d.ts +419 -0
  332. package/lib/store/views.d.ts.map +1 -0
  333. package/lib/store/views.js +3 -0
  334. package/lib/store/views.js.map +1 -0
  335. package/lib/store.d.ts +19 -0
  336. package/lib/store.d.ts.map +1 -0
  337. package/lib/store.js +10 -0
  338. package/lib/store.js.map +1 -0
  339. package/lib/terminal/lease.d.ts +33 -0
  340. package/lib/terminal/lease.d.ts.map +1 -0
  341. package/lib/terminal/lease.js +99 -0
  342. package/lib/terminal/lease.js.map +1 -0
  343. package/lib/tool-card.d.ts +75 -0
  344. package/lib/tool-card.d.ts.map +1 -0
  345. package/lib/tool-card.js +109 -0
  346. package/lib/tool-card.js.map +1 -0
  347. package/lib/tool-verbs.d.ts +12 -0
  348. package/lib/tool-verbs.d.ts.map +1 -0
  349. package/lib/tool-verbs.js +29 -0
  350. package/lib/tool-verbs.js.map +1 -0
  351. package/lib/transcript.d.ts +40 -0
  352. package/lib/transcript.d.ts.map +1 -0
  353. package/lib/transcript.js +413 -0
  354. package/lib/transcript.js.map +1 -0
  355. package/lib/working-line.d.ts +44 -0
  356. package/lib/working-line.d.ts.map +1 -0
  357. package/lib/working-line.js +56 -0
  358. package/lib/working-line.js.map +1 -0
  359. package/package.json +72 -0
  360. package/presets/cc/.dsh-cc-managed.json +5 -0
  361. package/presets/cc/agent.cordis.yml +524 -0
  362. package/presets/cc/preset.yml +3 -0
  363. package/scripts/stage-preset.mjs +26 -0
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Side-effect-free core for the `/provider` command (design doc
3
+ * docs/plans/2026-09-05-provider-management.md §4.2–§4.6): list merge rule,
4
+ * route normalization/collision, profile materialization, model-list parsing,
5
+ * and the verify-probe request builder. All functions are pure — seams and
6
+ * data arrive as plain values (D6 `*Like` pattern).
7
+ * @module @dsh-cc/tui/provider-flow
8
+ */
9
+ import type { LlmLike } from './state/driver-types.ts';
10
+ import { type ProviderPreset } from './provider-presets.ts';
11
+ /**
12
+ * Duck-typed seam for the llm service's management surface (§5). Extends the
13
+ * existing {@link LlmLike} with directory discovery (C8) and draft-form model
14
+ * listing (C5). Declared here rather than in state/driver-types.ts, which sits
15
+ * at its 500-line cap.
16
+ */
17
+ export type LlmManageLike = LlmLike & {
18
+ listConfigurableProviders(): {
19
+ provider: string;
20
+ displayName?: string;
21
+ settingsNs?: string;
22
+ settingsPath?: readonly string[];
23
+ }[];
24
+ discoverModels(ns: string, request: {
25
+ provider?: string;
26
+ baseURL?: string;
27
+ api?: string;
28
+ apiKey?: string;
29
+ signal?: AbortSignal;
30
+ }): Promise<ReadonlyArray<{
31
+ id: string;
32
+ name?: string;
33
+ contextWindow?: number;
34
+ maxTokens?: number;
35
+ }>>;
36
+ };
37
+ /** Credential-state snapshot as returned by `credentials.describe(ref)` (§4.2 badges). Nullish-tolerant at the call site. */
38
+ export type CredentialState = {
39
+ configured: boolean;
40
+ source?: 'env' | 'managed' | (string & {});
41
+ writable?: boolean;
42
+ };
43
+ /** Duck-typed credentials-store seam (C4): describe/set/unset one ref. */
44
+ export type CredentialsLike = {
45
+ describe(ref: string): Promise<{
46
+ configured: boolean;
47
+ source?: 'env' | 'managed' | (string & {});
48
+ writable?: boolean;
49
+ } | undefined>;
50
+ set(ref: string, value: string): Promise<void>;
51
+ unset(ref: string): Promise<void>;
52
+ };
53
+ /** One entry of the configurable-provider directory (C8 `listConfigurableProviders()`). */
54
+ export type DirectoryEntry = {
55
+ provider: string;
56
+ displayName?: string;
57
+ settingsNs?: string;
58
+ settingsPath?: readonly string[];
59
+ };
60
+ export type CredentialBadge = 'managed' | 'env' | 'missing';
61
+ /** One presentation-ready row of the `/provider` list overlay (§4.2). */
62
+ export type ProviderRow = {
63
+ route: string;
64
+ displayName: string;
65
+ section: 'configured' | 'available';
66
+ isCurrent: boolean;
67
+ modelCount: number;
68
+ credential?: {
69
+ badge: CredentialBadge;
70
+ warning: boolean;
71
+ writable?: boolean;
72
+ };
73
+ };
74
+ /** Directory tail collapsed under "More providers…" (§4.2 merge rule). */
75
+ export type MoreProviderRow = {
76
+ provider: string;
77
+ displayName: string;
78
+ entry: DirectoryEntry;
79
+ };
80
+ /** The two-section list state for the overlay home screen. */
81
+ export type ProviderList = {
82
+ configured: ProviderRow[];
83
+ available: ProviderRow[];
84
+ more: MoreProviderRow[];
85
+ };
86
+ export type BuildProviderRowsInput = {
87
+ /** Live `llm-pi-ai.providers` dict, verbatim (document order preserved). */
88
+ configured: Record<string, unknown>;
89
+ directory: readonly DirectoryEntry[];
90
+ presets?: readonly ProviderPreset[];
91
+ /** Credential-state snapshots keyed by credential ref. */
92
+ credentialStates: Record<string, CredentialState>;
93
+ currentProvider?: string;
94
+ };
95
+ /**
96
+ * §4.2 merge rule (review M2), stated exactly: Configured = the live providers
97
+ * dict, verbatim, in document order. Available = presets whose route is not
98
+ * configured ∪ directory entries that are neither configured nor preset-covered,
99
+ * the latter collapsed into the `more` tail. A route never appears in both
100
+ * sections; a configured route never appears in Available.
101
+ */
102
+ export declare function buildProviderRows(input: BuildProviderRowsInput): ProviderList;
103
+ /**
104
+ * Normalize a user-typed route id to `^[a-z0-9][a-z0-9-]*$` (§4.6): lowercase,
105
+ * invalid runs collapse to `-`, leading/trailing `-` stripped. Returns null
106
+ * when nothing usable remains.
107
+ */
108
+ export declare function normalizeRouteId(input: string): string | null;
109
+ /** Which existing source already claims `routeId`, if any (§4.6 collision check). */
110
+ export declare function routeCollision(routeId: string, { configured, presets, directory }: {
111
+ configured: Record<string, unknown>;
112
+ presets: readonly ProviderPreset[];
113
+ directory: readonly DirectoryEntry[];
114
+ }): 'configured' | 'preset' | 'directory' | null;
115
+ /** JSON payload for `llm-pi-ai.providers.<route>` from a preset — the preset's deltas, deep-copied. */
116
+ export declare function materializeProfile(preset: ProviderPreset): {
117
+ api?: string;
118
+ baseURL?: string;
119
+ models?: {
120
+ id: string;
121
+ name: string;
122
+ }[];
123
+ };
124
+ export type CustomProfileInput = {
125
+ routeId: string;
126
+ displayName: string;
127
+ baseURL: string;
128
+ api: string;
129
+ models?: {
130
+ id: string;
131
+ name?: string;
132
+ contextWindow?: number;
133
+ maxTokens?: number;
134
+ }[];
135
+ };
136
+ /** JSON payload for a fully custom route (§4.6); throws on a non-absolute http(s) baseURL. */
137
+ export declare function materializeCustomProfile(input: CustomProfileInput): {
138
+ api: string;
139
+ baseURL: string;
140
+ models?: CustomProfileInput['models'];
141
+ };
142
+ export type ParsedModel = {
143
+ id: string;
144
+ name?: string;
145
+ contextWindow?: number;
146
+ maxTokens?: number;
147
+ };
148
+ /**
149
+ * Compact wizard model entry (§4.6): entries separated by newlines or commas;
150
+ * each entry `id` | `id|Display Name` | `id|Display Name|contextWindow|maxTokens`.
151
+ * Returns per-entry errors so the wizard shows problems without inventing data.
152
+ */
153
+ export declare function parseModelList(text: string): {
154
+ models: ParsedModel[];
155
+ errors: string[];
156
+ };
157
+ export type VerifyProbeAnswers = {
158
+ baseURL?: string | undefined;
159
+ api?: string | undefined;
160
+ apiKey?: string | undefined;
161
+ provider?: string | undefined;
162
+ };
163
+ /** Result of the detail-view refresh resolution: a draft probe, or why not. */
164
+ export type RefreshProbe = {
165
+ ok: true;
166
+ baseURL: string;
167
+ api: string;
168
+ } | {
169
+ ok: false;
170
+ reason: string;
171
+ };
172
+ /**
173
+ * §8-S2 "refresh list" resolution: the detail action probes the route's
174
+ * effective endpoint — profile.baseURL/api, else the preset's probe endpoint
175
+ * when the route is a preset with a non-null probe. Unresolved endpoints and
176
+ * non-listable protocols (everything outside LISTABLE_APIS, doc §2/C5) return
177
+ * an explanatory reason instead of a probe.
178
+ */
179
+ export declare function refreshProbeFor(profile: Record<string, unknown>, preset: ProviderPreset | undefined): RefreshProbe;
180
+ /**
181
+ * Build the §4.3 step-2 draft-form discovery probe request, or null when the
182
+ * protocol is not listable or the baseURL is unknown. NEVER includes
183
+ * `provider` — that form answers from the catalog without touching the network
184
+ * (doc §2/C5, review Blocker B1).
185
+ */
186
+ export declare function verifyProbeFor(presetOrAnswers: ProviderPreset | VerifyProbeAnswers): {
187
+ baseURL: string;
188
+ api: string;
189
+ apiKey?: string;
190
+ } | null;
191
+ //# sourceMappingURL=provider-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-flow.d.ts","sourceRoot":"","sources":["../src/provider-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ import { PRESETS, presetByRoute, deriveCredentialRef } from "./provider-presets.js";
2
+ function credentialRefFor(route) {
3
+ return presetByRoute(route)?.credentialRef ?? deriveCredentialRef(route);
4
+ }
5
+ function badgeFor(route, input) {
6
+ const ref = credentialRefFor(route);
7
+ const state = input.credentialStates[ref];
8
+ if (state === undefined || !state.configured) {
9
+ return { badge: 'missing', warning: false };
10
+ }
11
+ const badge = state.source === 'env' ? 'env' : 'managed';
12
+ const credential = { badge, warning: false };
13
+ if (state.writable !== undefined)
14
+ credential.writable = state.writable;
15
+ return credential;
16
+ }
17
+ /**
18
+ * §4.2 merge rule (review M2), stated exactly: Configured = the live providers
19
+ * dict, verbatim, in document order. Available = presets whose route is not
20
+ * configured ∪ directory entries that are neither configured nor preset-covered,
21
+ * the latter collapsed into the `more` tail. A route never appears in both
22
+ * sections; a configured route never appears in Available.
23
+ */
24
+ export function buildProviderRows(input) {
25
+ const presets = input.presets ?? PRESETS;
26
+ const configuredRoutes = Object.keys(input.configured);
27
+ const presetRoutes = new Set(presets.map((p) => p.route));
28
+ const configured = configuredRoutes.map((route) => {
29
+ const section = input.configured[route];
30
+ const modelCount = Array.isArray(section?.models) ? section.models.length : 0;
31
+ const credential = badgeFor(route, input);
32
+ const warning = modelCount > 0 && credential.badge === 'missing';
33
+ return {
34
+ route,
35
+ displayName: presetByRoute(route)?.displayName ?? route,
36
+ section: 'configured',
37
+ isCurrent: input.currentProvider === route,
38
+ modelCount,
39
+ credential: { ...credential, warning },
40
+ };
41
+ });
42
+ const configuredSet = new Set(configuredRoutes);
43
+ const available = presets
44
+ .filter((p) => !configuredSet.has(p.route))
45
+ .map((p) => ({
46
+ route: p.route,
47
+ displayName: p.displayName,
48
+ section: 'available',
49
+ isCurrent: false,
50
+ modelCount: 0,
51
+ }));
52
+ const more = input.directory
53
+ .filter((entry) => !configuredSet.has(entry.provider) && !presetRoutes.has(entry.provider))
54
+ .map((entry) => ({ provider: entry.provider, displayName: entry.displayName ?? entry.provider, entry }));
55
+ return { configured, available, more };
56
+ }
57
+ /**
58
+ * Normalize a user-typed route id to `^[a-z0-9][a-z0-9-]*$` (§4.6): lowercase,
59
+ * invalid runs collapse to `-`, leading/trailing `-` stripped. Returns null
60
+ * when nothing usable remains.
61
+ */
62
+ export function normalizeRouteId(input) {
63
+ const id = input
64
+ .toLowerCase()
65
+ .replace(/[^a-z0-9-]+/g, '-')
66
+ .replace(/-{2,}/g, '-')
67
+ .replace(/^-+|-+$/g, '');
68
+ return id.length > 0 ? id : null;
69
+ }
70
+ /** Which existing source already claims `routeId`, if any (§4.6 collision check). */
71
+ export function routeCollision(routeId, { configured, presets, directory }) {
72
+ if (Object.hasOwn(configured, routeId))
73
+ return 'configured';
74
+ if (presets.some((p) => p.route === routeId))
75
+ return 'preset';
76
+ if (directory.some((d) => d.provider === routeId))
77
+ return 'directory';
78
+ return null;
79
+ }
80
+ /** JSON payload for `llm-pi-ai.providers.<route>` from a preset — the preset's deltas, deep-copied. */
81
+ export function materializeProfile(preset) {
82
+ const models = preset.profile.models?.map((m) => ({ ...m }));
83
+ return {
84
+ ...(preset.profile.api !== undefined ? { api: preset.profile.api } : {}),
85
+ ...(preset.profile.baseURL !== undefined ? { baseURL: preset.profile.baseURL } : {}),
86
+ ...(models !== undefined ? { models } : {}),
87
+ };
88
+ }
89
+ /** JSON payload for a fully custom route (§4.6); throws on a non-absolute http(s) baseURL. */
90
+ export function materializeCustomProfile(input) {
91
+ let parsed;
92
+ try {
93
+ parsed = new URL(input.baseURL);
94
+ }
95
+ catch {
96
+ throw new Error(`route ${input.routeId}: baseURL must be an absolute http(s) URL`);
97
+ }
98
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
99
+ throw new Error(`route ${input.routeId}: baseURL must be an absolute http(s) URL`);
100
+ }
101
+ return {
102
+ api: input.api,
103
+ baseURL: input.baseURL,
104
+ ...(input.models !== undefined && input.models.length > 0 ? { models: input.models.map((m) => ({ ...m })) } : {}),
105
+ };
106
+ }
107
+ /**
108
+ * Compact wizard model entry (§4.6): entries separated by newlines or commas;
109
+ * each entry `id` | `id|Display Name` | `id|Display Name|contextWindow|maxTokens`.
110
+ * Returns per-entry errors so the wizard shows problems without inventing data.
111
+ */
112
+ export function parseModelList(text) {
113
+ const models = [];
114
+ const errors = [];
115
+ for (const raw of text.split(/\r?\n|,/)) {
116
+ const entry = raw.trim();
117
+ if (entry === '')
118
+ continue;
119
+ const fields = entry.split('|').map((f) => f.trim());
120
+ const id = fields[0] ?? '';
121
+ const name = fields[1];
122
+ const contextWindow = fields[2];
123
+ const maxTokens = fields[3];
124
+ const extra = fields.slice(4);
125
+ if (id === '' || /\s/.test(id)) {
126
+ errors.push(`"${entry}": model id is empty or contains whitespace`);
127
+ continue;
128
+ }
129
+ if (extra.length > 0) {
130
+ errors.push(`"${entry}": too many fields (expected id|name|contextWindow|maxTokens)`);
131
+ continue;
132
+ }
133
+ const model = { id };
134
+ if (name !== undefined && name !== '')
135
+ model.name = name;
136
+ if (contextWindow !== undefined && contextWindow !== '') {
137
+ const n = Number(contextWindow);
138
+ if (!Number.isInteger(n) || n <= 0) {
139
+ errors.push(`"${entry}": contextWindow must be a positive integer`);
140
+ continue;
141
+ }
142
+ model.contextWindow = n;
143
+ }
144
+ if (maxTokens !== undefined && maxTokens !== '') {
145
+ const n = Number(maxTokens);
146
+ if (!Number.isInteger(n) || n <= 0) {
147
+ errors.push(`"${entry}": maxTokens must be a positive integer`);
148
+ continue;
149
+ }
150
+ model.maxTokens = n;
151
+ }
152
+ models.push(model);
153
+ }
154
+ return { models, errors };
155
+ }
156
+ /** Protocols whose `/models` listing is supported by discovery (C5); everything else is DISCOVERY_UNSUPPORTED. */
157
+ const LISTABLE_APIS = new Set(['openai-completions', 'openai-responses']);
158
+ /**
159
+ * §8-S2 "refresh list" resolution: the detail action probes the route's
160
+ * effective endpoint — profile.baseURL/api, else the preset's probe endpoint
161
+ * when the route is a preset with a non-null probe. Unresolved endpoints and
162
+ * non-listable protocols (everything outside LISTABLE_APIS, doc §2/C5) return
163
+ * an explanatory reason instead of a probe.
164
+ */
165
+ export function refreshProbeFor(profile, preset) {
166
+ const profileBase = typeof profile.baseURL === 'string' && profile.baseURL !== '' ? profile.baseURL : undefined;
167
+ const profileApi = typeof profile.api === 'string' && profile.api !== '' ? profile.api : undefined;
168
+ const baseURL = profileBase ?? preset?.probe?.baseURL;
169
+ const api = profileApi ?? preset?.probe?.api;
170
+ if (baseURL === undefined || api === undefined) {
171
+ return { ok: false, reason: 'No probeable endpoint is known for this route — set baseURL and api in the profile to enable a refresh.' };
172
+ }
173
+ if (!LISTABLE_APIS.has(api)) {
174
+ return { ok: false, reason: `The ${api} protocol can't be listed programmatically — the first message is the test.` };
175
+ }
176
+ return { ok: true, baseURL, api };
177
+ }
178
+ /**
179
+ * Build the §4.3 step-2 draft-form discovery probe request, or null when the
180
+ * protocol is not listable or the baseURL is unknown. NEVER includes
181
+ * `provider` — that form answers from the catalog without touching the network
182
+ * (doc §2/C5, review Blocker B1).
183
+ */
184
+ export function verifyProbeFor(presetOrAnswers) {
185
+ const preset = presetOrAnswers;
186
+ const source = 'probe' in presetOrAnswers && preset.probe !== undefined ? preset.probe : presetOrAnswers;
187
+ if (source === null || source.baseURL === undefined || source.api === undefined || !LISTABLE_APIS.has(source.api))
188
+ return null;
189
+ const apiKey = presetOrAnswers instanceof Object && 'apiKey' in presetOrAnswers ? presetOrAnswers.apiKey : undefined;
190
+ return { baseURL: source.baseURL, api: source.api, ...(apiKey !== undefined && apiKey !== '' ? { apiKey } : {}) };
191
+ }
192
+ //# sourceMappingURL=provider-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-flow.js","sourceRoot":"","sources":["../src/provider-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** Built-in `/provider` presets — pure data (design doc §4.5, docs/plans/2026-09-05-provider-management.md). */
2
+ export type PresetGroup = 'kimi' | 'zhipu-zai' | 'deepseek';
3
+ export interface CuratedModel {
4
+ id: string;
5
+ name: string;
6
+ }
7
+ export interface ProviderPreset {
8
+ /** Settings dict key under `llm-pi-ai.providers.<route>`. */
9
+ route: string;
10
+ displayName: string;
11
+ group: PresetGroup;
12
+ /** Credential store ref for the preset's API key. */
13
+ credentialRef: string;
14
+ /** Public vendor docs URL. */
15
+ docsUrl: string;
16
+ /** Minimal profile payload written into `llm-pi-ai.providers.<route>` (empty = catalog-complete, C7). */
17
+ profile: {
18
+ api?: string;
19
+ baseURL?: string;
20
+ models?: CuratedModel[];
21
+ };
22
+ /** Draft-form discovery probe endpoint (C5); null when the protocol is not listable. */
23
+ probe: {
24
+ baseURL: string;
25
+ api: string;
26
+ } | null;
27
+ }
28
+ export declare const PRESETS: ProviderPreset[];
29
+ export declare function presetByRoute(route: string): ProviderPreset | undefined;
30
+ /** Custom-provider default credential ref: `DSH_PROVIDER_` + uppercased route with non-alphanumerics mapped to `_`. */
31
+ export declare function deriveCredentialRef(routeId: string): string;
32
+ //# sourceMappingURL=provider-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-presets.d.ts","sourceRoot":"","sources":["../src/provider-presets.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAEhH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;AAE3D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,WAAW,CAAA;IAClB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,yGAAyG;IACzG,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;KACxB,CAAA;IACD,wFAAwF;IACxF,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/C;AAaD,eAAO,MAAM,OAAO,EAAE,cAAc,EAiFnC,CAAA;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE;AAED,uHAAuH;AACvH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3D"}
@@ -0,0 +1,105 @@
1
+ /** Built-in `/provider` presets — pure data (design doc §4.5, docs/plans/2026-09-05-provider-management.md). */
2
+ /** Curated GLM list (§4.5), seeded from ids proven against these very endpoints. */
3
+ const GLM_MODELS = [
4
+ { id: 'glm-5.3', name: 'GLM-5.3' },
5
+ { id: 'glm-5v-turbo', name: 'GLM-5V-TURBO' },
6
+ { id: 'glm-5.2', name: 'GLM-5.2' },
7
+ { id: 'glm-5.1', name: 'GLM-5.1' },
8
+ { id: 'glm-5-turbo', name: 'GLM-5-TURBO' },
9
+ { id: 'glm-4.7', name: 'GLM-4.7' },
10
+ { id: 'glm-4.5-air', name: 'GLM-4.5-AIR' },
11
+ ];
12
+ export const PRESETS = [
13
+ {
14
+ route: 'kimi-coding',
15
+ displayName: 'Kimi Coding Plan',
16
+ group: 'kimi',
17
+ credentialRef: 'KIMI_API_KEY',
18
+ docsUrl: 'https://platform.moonshot.ai/docs/guide/kimi-coding',
19
+ profile: {},
20
+ probe: null, // anthropic-messages is not listable (§2/C5)
21
+ },
22
+ {
23
+ route: 'moonshotai',
24
+ displayName: 'Kimi API (global)',
25
+ group: 'kimi',
26
+ credentialRef: 'MOONSHOT_API_KEY',
27
+ docsUrl: 'https://platform.moonshot.ai/docs',
28
+ profile: {},
29
+ probe: { baseURL: 'https://api.moonshot.ai/v1', api: 'openai-completions' },
30
+ },
31
+ {
32
+ route: 'moonshotai-cn',
33
+ displayName: 'Kimi API (CN)',
34
+ group: 'kimi',
35
+ credentialRef: 'MOONSHOT_API_KEY',
36
+ docsUrl: 'https://platform.moonshot.cn/docs',
37
+ profile: {},
38
+ probe: { baseURL: 'https://api.moonshot.cn/v1', api: 'openai-completions' },
39
+ },
40
+ {
41
+ route: 'zai',
42
+ displayName: 'Z.AI Coding Plan (global)',
43
+ group: 'zhipu-zai',
44
+ credentialRef: 'ZAI_API_KEY',
45
+ docsUrl: 'https://docs.z.ai/',
46
+ profile: {},
47
+ probe: { baseURL: 'https://api.z.ai/api/coding/paas/v4', api: 'openai-completions' },
48
+ },
49
+ {
50
+ route: 'zai-coding-cn',
51
+ displayName: 'Zhipu Coding Plan (CN)',
52
+ group: 'zhipu-zai',
53
+ credentialRef: 'ZAI_CODING_CN_API_KEY',
54
+ docsUrl: 'https://docs.bigmodel.cn/cn/coding-plan',
55
+ profile: {},
56
+ probe: { baseURL: 'https://open.bigmodel.cn/api/coding/paas/v4', api: 'openai-completions' },
57
+ },
58
+ {
59
+ route: 'deepseek',
60
+ displayName: 'DeepSeek API',
61
+ group: 'deepseek',
62
+ credentialRef: 'DEEPSEEK_API_KEY',
63
+ docsUrl: 'https://api-docs.deepseek.com/',
64
+ profile: {},
65
+ probe: { baseURL: 'https://api.deepseek.com', api: 'openai-completions' },
66
+ },
67
+ {
68
+ route: 'zai-api',
69
+ displayName: 'Z.AI API (global, pay-as-you-go)',
70
+ group: 'zhipu-zai',
71
+ credentialRef: 'ZAI_API_KEY',
72
+ docsUrl: 'https://docs.z.ai/guides/overview/pricing',
73
+ profile: {
74
+ api: 'openai-completions',
75
+ baseURL: 'https://api.z.ai/api/paas/v4',
76
+ models: GLM_MODELS,
77
+ },
78
+ probe: { baseURL: 'https://api.z.ai/api/paas/v4', api: 'openai-completions' },
79
+ },
80
+ {
81
+ route: 'zhipu-api',
82
+ displayName: 'Zhipu API (CN, pay-as-you-go)',
83
+ group: 'zhipu-zai',
84
+ credentialRef: 'ZHIPU_API_KEY',
85
+ docsUrl: 'https://docs.bigmodel.cn/cn/guide/start/pricing',
86
+ profile: {
87
+ api: 'openai-completions',
88
+ baseURL: 'https://open.bigmodel.cn/api/paas/v4',
89
+ models: GLM_MODELS,
90
+ },
91
+ probe: { baseURL: 'https://open.bigmodel.cn/api/paas/v4', api: 'openai-completions' },
92
+ },
93
+ ];
94
+ export function presetByRoute(route) {
95
+ return PRESETS.find((p) => p.route === route);
96
+ }
97
+ /** Custom-provider default credential ref: `DSH_PROVIDER_` + uppercased route with non-alphanumerics mapped to `_`. */
98
+ export function deriveCredentialRef(routeId) {
99
+ const suffix = routeId
100
+ .toUpperCase()
101
+ .replace(/[^A-Z0-9]/g, '_')
102
+ .replace(/_{2,}/g, '_');
103
+ return `DSH_PROVIDER_${suffix}_API_KEY`;
104
+ }
105
+ //# sourceMappingURL=provider-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-presets.js","sourceRoot":"","sources":["../src/provider-presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * `/provider` read paths (design doc docs/plans/2026-09-05-provider-
3
+ * management.md §4.1–§4.2): settings reads, credential-state snapshots, the
4
+ * configurable-provider directory, argument parsing, and the chat-output list
5
+ * renderer. Split out of provider-command.ts purely for line budget.
6
+ * @module @dsh-cc/tui/provider-command-read
7
+ */
8
+ import { type CredentialState, type CredentialsLike, type DirectoryEntry, type LlmManageLike, type ProviderList } from './provider-flow.ts';
9
+ /** Settings namespace carrying the provider profiles (doc D1/D2). */
10
+ export declare const PROVIDER_SETTINGS_NAMESPACE = "llm-pi-ai";
11
+ /** Usage line for unknown/unsupported subcommands (§4.1 — never silent). */
12
+ export declare const PROVIDER_USAGE = "Usage: /provider [list | add <preset-id> | remove <route>]";
13
+ /**
14
+ * Duck-typed seam for the settings provider. Only `describe` is needed on the
15
+ * read path: descriptors carry `{ns, user, revision}` (the pattern
16
+ * driver-approvals.writeAllowRule consumes).
17
+ */
18
+ export type SettingsDescribeLike = {
19
+ describe?: () => ReadonlyArray<{
20
+ ns?: unknown;
21
+ user?: unknown;
22
+ revision?: unknown;
23
+ }>;
24
+ };
25
+ /**
26
+ * Read the `llm-pi-ai` section's user-layer `providers` dict (§4.2). The
27
+ * service may be absent, the namespace unregistered, or the stored shape
28
+ * junk — every degradation returns `{}` so the overlay renders honestly.
29
+ */
30
+ export declare function readConfiguredProviders(settings: SettingsDescribeLike | undefined): Record<string, unknown>;
31
+ /**
32
+ * Credential-state snapshots for each ref (§4.2 badges). Tolerant of an
33
+ * absent service and a throwing `describe` — a failed describe is an unknown
34
+ * state, rendered as unconfigured, never an overlay crash.
35
+ */
36
+ export declare function credentialStates(credentials: CredentialsLike | undefined, refs: readonly string[]): Promise<Record<string, CredentialState>>;
37
+ /**
38
+ * Configurable-provider directory (C8). Absent service or junk entries
39
+ * degrade to `[]`; throwing discovery degrades to `[]` too.
40
+ */
41
+ export declare function loadDirectory(llm: LlmManageLike | undefined): DirectoryEntry[];
42
+ /** Parsed `/provider …` invocation (§4.1). */
43
+ export type ParsedProviderArgs = {
44
+ kind: 'open';
45
+ } | {
46
+ kind: 'list';
47
+ } | {
48
+ kind: 'add';
49
+ route: string;
50
+ } | {
51
+ kind: 'remove';
52
+ route: string;
53
+ } | {
54
+ kind: 'invalid';
55
+ };
56
+ /** Subcommand table per §4.1: bare, list, add/remove with a required id. */
57
+ export declare function parseProviderArgs(rest: string): ParsedProviderArgs;
58
+ /**
59
+ * §4.1 `/provider list` — plain-text rendering of the same two-section data
60
+ * the overlay shows (script-friendly chat output).
61
+ */
62
+ export declare function renderProviderList(list: ProviderList): string;
63
+ //# sourceMappingURL=provider-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-read.d.ts","sourceRoot":"","sources":["../src/provider-read.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAE3B,qEAAqE;AACrE,eAAO,MAAM,2BAA2B,cAAc,CAAA;AAEtD,4EAA4E;AAC5E,eAAO,MAAM,cAAc,+DAA+D,CAAA;AAE1F;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,MAAM,aAAa,CAAC;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACrF,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB3G;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,eAAe,GAAG,SAAS,EACxC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAa1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,GAAG,cAAc,EAAE,CAU9E;AAED,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEvB,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAYlE;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAe7D"}