fixo-cli 1.0.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 (303) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +530 -0
  3. package/dist/agent/agent-client.d.ts +108 -0
  4. package/dist/agent/agent-client.d.ts.map +1 -0
  5. package/dist/agent/agent-client.js +1247 -0
  6. package/dist/agent/agent-client.js.map +1 -0
  7. package/dist/agent/agent-pool.d.ts +20 -0
  8. package/dist/agent/agent-pool.d.ts.map +1 -0
  9. package/dist/agent/agent-pool.js +217 -0
  10. package/dist/agent/agent-pool.js.map +1 -0
  11. package/dist/agent/background-awareness.d.ts +55 -0
  12. package/dist/agent/background-awareness.d.ts.map +1 -0
  13. package/dist/agent/background-awareness.js +104 -0
  14. package/dist/agent/background-awareness.js.map +1 -0
  15. package/dist/agent/command-parser.d.ts +33 -0
  16. package/dist/agent/command-parser.d.ts.map +1 -0
  17. package/dist/agent/command-parser.js +120 -0
  18. package/dist/agent/command-parser.js.map +1 -0
  19. package/dist/agent/context-budget.d.ts +91 -0
  20. package/dist/agent/context-budget.d.ts.map +1 -0
  21. package/dist/agent/context-budget.js +219 -0
  22. package/dist/agent/context-budget.js.map +1 -0
  23. package/dist/agent/conversation.d.ts +190 -0
  24. package/dist/agent/conversation.d.ts.map +1 -0
  25. package/dist/agent/conversation.js +547 -0
  26. package/dist/agent/conversation.js.map +1 -0
  27. package/dist/agent/hooks.d.ts +72 -0
  28. package/dist/agent/hooks.d.ts.map +1 -0
  29. package/dist/agent/hooks.js +214 -0
  30. package/dist/agent/hooks.js.map +1 -0
  31. package/dist/agent/mcp-bridge.d.ts +13 -0
  32. package/dist/agent/mcp-bridge.d.ts.map +1 -0
  33. package/dist/agent/mcp-bridge.js +86 -0
  34. package/dist/agent/mcp-bridge.js.map +1 -0
  35. package/dist/agent/mcp-client.d.ts +24 -0
  36. package/dist/agent/mcp-client.d.ts.map +1 -0
  37. package/dist/agent/mcp-client.js +146 -0
  38. package/dist/agent/mcp-client.js.map +1 -0
  39. package/dist/agent/mcp-manager.d.ts +13 -0
  40. package/dist/agent/mcp-manager.d.ts.map +1 -0
  41. package/dist/agent/mcp-manager.js +84 -0
  42. package/dist/agent/mcp-manager.js.map +1 -0
  43. package/dist/agent/mcp-registry.d.ts +45 -0
  44. package/dist/agent/mcp-registry.d.ts.map +1 -0
  45. package/dist/agent/mcp-registry.js +98 -0
  46. package/dist/agent/mcp-registry.js.map +1 -0
  47. package/dist/agent/orchestrator.d.ts +14 -0
  48. package/dist/agent/orchestrator.d.ts.map +1 -0
  49. package/dist/agent/orchestrator.js +118 -0
  50. package/dist/agent/orchestrator.js.map +1 -0
  51. package/dist/agent/parser-adapter.d.ts +120 -0
  52. package/dist/agent/parser-adapter.d.ts.map +1 -0
  53. package/dist/agent/parser-adapter.js +265 -0
  54. package/dist/agent/parser-adapter.js.map +1 -0
  55. package/dist/agent/parsers/imports.d.ts +11 -0
  56. package/dist/agent/parsers/imports.d.ts.map +1 -0
  57. package/dist/agent/parsers/imports.js +94 -0
  58. package/dist/agent/parsers/imports.js.map +1 -0
  59. package/dist/agent/parsers/shell.d.ts +23 -0
  60. package/dist/agent/parsers/shell.d.ts.map +1 -0
  61. package/dist/agent/parsers/shell.js +200 -0
  62. package/dist/agent/parsers/shell.js.map +1 -0
  63. package/dist/agent/parsers/symbols.d.ts +17 -0
  64. package/dist/agent/parsers/symbols.d.ts.map +1 -0
  65. package/dist/agent/parsers/symbols.js +103 -0
  66. package/dist/agent/parsers/symbols.js.map +1 -0
  67. package/dist/agent/permissions.d.ts +65 -0
  68. package/dist/agent/permissions.d.ts.map +1 -0
  69. package/dist/agent/permissions.js +219 -0
  70. package/dist/agent/permissions.js.map +1 -0
  71. package/dist/agent/predictive-gate.d.ts +69 -0
  72. package/dist/agent/predictive-gate.d.ts.map +1 -0
  73. package/dist/agent/predictive-gate.js +128 -0
  74. package/dist/agent/predictive-gate.js.map +1 -0
  75. package/dist/agent/provider-cooldown.d.ts +144 -0
  76. package/dist/agent/provider-cooldown.d.ts.map +1 -0
  77. package/dist/agent/provider-cooldown.js +300 -0
  78. package/dist/agent/provider-cooldown.js.map +1 -0
  79. package/dist/agent/providers-manager.d.ts +109 -0
  80. package/dist/agent/providers-manager.d.ts.map +1 -0
  81. package/dist/agent/providers-manager.js +464 -0
  82. package/dist/agent/providers-manager.js.map +1 -0
  83. package/dist/agent/repo-map.d.ts +6 -0
  84. package/dist/agent/repo-map.d.ts.map +1 -0
  85. package/dist/agent/repo-map.js +221 -0
  86. package/dist/agent/repo-map.js.map +1 -0
  87. package/dist/agent/retry.d.ts +103 -0
  88. package/dist/agent/retry.d.ts.map +1 -0
  89. package/dist/agent/retry.js +276 -0
  90. package/dist/agent/retry.js.map +1 -0
  91. package/dist/agent/search/index.d.ts +61 -0
  92. package/dist/agent/search/index.d.ts.map +1 -0
  93. package/dist/agent/search/index.js +314 -0
  94. package/dist/agent/search/index.js.map +1 -0
  95. package/dist/agent/single-agent.d.ts +76 -0
  96. package/dist/agent/single-agent.d.ts.map +1 -0
  97. package/dist/agent/single-agent.js +697 -0
  98. package/dist/agent/single-agent.js.map +1 -0
  99. package/dist/agent/skills.d.ts +22 -0
  100. package/dist/agent/skills.d.ts.map +1 -0
  101. package/dist/agent/skills.js +139 -0
  102. package/dist/agent/skills.js.map +1 -0
  103. package/dist/agent/stream-glue.d.ts +85 -0
  104. package/dist/agent/stream-glue.d.ts.map +1 -0
  105. package/dist/agent/stream-glue.js +120 -0
  106. package/dist/agent/stream-glue.js.map +1 -0
  107. package/dist/agent/subagent.d.ts +72 -0
  108. package/dist/agent/subagent.d.ts.map +1 -0
  109. package/dist/agent/subagent.js +193 -0
  110. package/dist/agent/subagent.js.map +1 -0
  111. package/dist/agent/telemetry.d.ts +192 -0
  112. package/dist/agent/telemetry.d.ts.map +1 -0
  113. package/dist/agent/telemetry.js +400 -0
  114. package/dist/agent/telemetry.js.map +1 -0
  115. package/dist/agent/tokenizer.d.ts +42 -0
  116. package/dist/agent/tokenizer.d.ts.map +1 -0
  117. package/dist/agent/tokenizer.js +107 -0
  118. package/dist/agent/tokenizer.js.map +1 -0
  119. package/dist/agent/tool-executor.d.ts +289 -0
  120. package/dist/agent/tool-executor.d.ts.map +1 -0
  121. package/dist/agent/tool-executor.js +2519 -0
  122. package/dist/agent/tool-executor.js.map +1 -0
  123. package/dist/agent/web-impl.d.ts +2 -0
  124. package/dist/agent/web-impl.d.ts.map +1 -0
  125. package/dist/agent/web-impl.js +34 -0
  126. package/dist/agent/web-impl.js.map +1 -0
  127. package/dist/agent/web.d.ts +8 -0
  128. package/dist/agent/web.d.ts.map +1 -0
  129. package/dist/agent/web.js +8 -0
  130. package/dist/agent/web.js.map +1 -0
  131. package/dist/agent/worker-agent.d.ts +27 -0
  132. package/dist/agent/worker-agent.d.ts.map +1 -0
  133. package/dist/agent/worker-agent.js +503 -0
  134. package/dist/agent/worker-agent.js.map +1 -0
  135. package/dist/config.d.ts +162 -0
  136. package/dist/config.d.ts.map +1 -0
  137. package/dist/config.js +138 -0
  138. package/dist/config.js.map +1 -0
  139. package/dist/context/fixo-md-watcher.d.ts +42 -0
  140. package/dist/context/fixo-md-watcher.d.ts.map +1 -0
  141. package/dist/context/fixo-md-watcher.js +126 -0
  142. package/dist/context/fixo-md-watcher.js.map +1 -0
  143. package/dist/context/fixo-md.d.ts +50 -0
  144. package/dist/context/fixo-md.d.ts.map +1 -0
  145. package/dist/context/fixo-md.js +118 -0
  146. package/dist/context/fixo-md.js.map +1 -0
  147. package/dist/context/todo.d.ts +65 -0
  148. package/dist/context/todo.d.ts.map +1 -0
  149. package/dist/context/todo.js +194 -0
  150. package/dist/context/todo.js.map +1 -0
  151. package/dist/git/git-manager.d.ts +33 -0
  152. package/dist/git/git-manager.d.ts.map +1 -0
  153. package/dist/git/git-manager.js +293 -0
  154. package/dist/git/git-manager.js.map +1 -0
  155. package/dist/git/git-ops.d.ts +10 -0
  156. package/dist/git/git-ops.d.ts.map +1 -0
  157. package/dist/git/git-ops.js +131 -0
  158. package/dist/git/git-ops.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +352 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/indexer.d.ts +30 -0
  164. package/dist/indexer.d.ts.map +1 -0
  165. package/dist/indexer.js +273 -0
  166. package/dist/indexer.js.map +1 -0
  167. package/dist/lsp/lsp-client.d.ts +24 -0
  168. package/dist/lsp/lsp-client.d.ts.map +1 -0
  169. package/dist/lsp/lsp-client.js +205 -0
  170. package/dist/lsp/lsp-client.js.map +1 -0
  171. package/dist/lsp/lsp-manager.d.ts +17 -0
  172. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  173. package/dist/lsp/lsp-manager.js +154 -0
  174. package/dist/lsp/lsp-manager.js.map +1 -0
  175. package/dist/lsp/lsp-pre-save.d.ts +137 -0
  176. package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
  177. package/dist/lsp/lsp-pre-save.js +245 -0
  178. package/dist/lsp/lsp-pre-save.js.map +1 -0
  179. package/dist/lsp/syntax-fallback.d.ts +83 -0
  180. package/dist/lsp/syntax-fallback.d.ts.map +1 -0
  181. package/dist/lsp/syntax-fallback.js +275 -0
  182. package/dist/lsp/syntax-fallback.js.map +1 -0
  183. package/dist/model-outcomes.d.ts +12 -0
  184. package/dist/model-outcomes.d.ts.map +1 -0
  185. package/dist/model-outcomes.js +46 -0
  186. package/dist/model-outcomes.js.map +1 -0
  187. package/dist/planner.d.ts +32 -0
  188. package/dist/planner.d.ts.map +1 -0
  189. package/dist/planner.js +163 -0
  190. package/dist/planner.js.map +1 -0
  191. package/dist/project-memory.d.ts +29 -0
  192. package/dist/project-memory.d.ts.map +1 -0
  193. package/dist/project-memory.js +349 -0
  194. package/dist/project-memory.js.map +1 -0
  195. package/dist/review.d.ts +2 -0
  196. package/dist/review.d.ts.map +1 -0
  197. package/dist/review.js +61 -0
  198. package/dist/review.js.map +1 -0
  199. package/dist/runtime/background-jobs.d.ts +97 -0
  200. package/dist/runtime/background-jobs.d.ts.map +1 -0
  201. package/dist/runtime/background-jobs.js +331 -0
  202. package/dist/runtime/background-jobs.js.map +1 -0
  203. package/dist/runtime/credential-vault.d.ts +124 -0
  204. package/dist/runtime/credential-vault.d.ts.map +1 -0
  205. package/dist/runtime/credential-vault.js +184 -0
  206. package/dist/runtime/credential-vault.js.map +1 -0
  207. package/dist/runtime/loop-trap.d.ts +197 -0
  208. package/dist/runtime/loop-trap.d.ts.map +1 -0
  209. package/dist/runtime/loop-trap.js +420 -0
  210. package/dist/runtime/loop-trap.js.map +1 -0
  211. package/dist/runtime/policy.d.ts +15 -0
  212. package/dist/runtime/policy.d.ts.map +1 -0
  213. package/dist/runtime/policy.js +60 -0
  214. package/dist/runtime/policy.js.map +1 -0
  215. package/dist/runtime/redaction.d.ts +66 -0
  216. package/dist/runtime/redaction.d.ts.map +1 -0
  217. package/dist/runtime/redaction.js +155 -0
  218. package/dist/runtime/redaction.js.map +1 -0
  219. package/dist/runtime/session-snapshots.d.ts +76 -0
  220. package/dist/runtime/session-snapshots.d.ts.map +1 -0
  221. package/dist/runtime/session-snapshots.js +166 -0
  222. package/dist/runtime/session-snapshots.js.map +1 -0
  223. package/dist/runtime/staging.d.ts +205 -0
  224. package/dist/runtime/staging.d.ts.map +1 -0
  225. package/dist/runtime/staging.js +526 -0
  226. package/dist/runtime/staging.js.map +1 -0
  227. package/dist/runtime/task-session.d.ts +95 -0
  228. package/dist/runtime/task-session.d.ts.map +1 -0
  229. package/dist/runtime/task-session.js +263 -0
  230. package/dist/runtime/task-session.js.map +1 -0
  231. package/dist/runtime/worktree.d.ts +55 -0
  232. package/dist/runtime/worktree.d.ts.map +1 -0
  233. package/dist/runtime/worktree.js +175 -0
  234. package/dist/runtime/worktree.js.map +1 -0
  235. package/dist/setup-wizard.d.ts +8 -0
  236. package/dist/setup-wizard.d.ts.map +1 -0
  237. package/dist/setup-wizard.js +73 -0
  238. package/dist/setup-wizard.js.map +1 -0
  239. package/dist/shared/content.d.ts +43 -0
  240. package/dist/shared/content.d.ts.map +1 -0
  241. package/dist/shared/content.js +61 -0
  242. package/dist/shared/content.js.map +1 -0
  243. package/dist/shared/types.d.ts +217 -0
  244. package/dist/shared/types.d.ts.map +1 -0
  245. package/dist/shared/types.js +3 -0
  246. package/dist/shared/types.js.map +1 -0
  247. package/dist/test-runner.d.ts +5 -0
  248. package/dist/test-runner.d.ts.map +1 -0
  249. package/dist/test-runner.js +42 -0
  250. package/dist/test-runner.js.map +1 -0
  251. package/dist/types.d.ts +85 -0
  252. package/dist/types.d.ts.map +1 -0
  253. package/dist/types.js +2 -0
  254. package/dist/types.js.map +1 -0
  255. package/dist/ui/ascii.d.ts +23 -0
  256. package/dist/ui/ascii.d.ts.map +1 -0
  257. package/dist/ui/ascii.js +45 -0
  258. package/dist/ui/ascii.js.map +1 -0
  259. package/dist/ui/colors.d.ts +111 -0
  260. package/dist/ui/colors.d.ts.map +1 -0
  261. package/dist/ui/colors.js +166 -0
  262. package/dist/ui/colors.js.map +1 -0
  263. package/dist/ui/image-attach.d.ts +27 -0
  264. package/dist/ui/image-attach.d.ts.map +1 -0
  265. package/dist/ui/image-attach.js +100 -0
  266. package/dist/ui/image-attach.js.map +1 -0
  267. package/dist/ui/index.d.ts +18 -0
  268. package/dist/ui/index.d.ts.map +1 -0
  269. package/dist/ui/index.js +18 -0
  270. package/dist/ui/index.js.map +1 -0
  271. package/dist/ui/markdown-stream.d.ts +91 -0
  272. package/dist/ui/markdown-stream.d.ts.map +1 -0
  273. package/dist/ui/markdown-stream.js +524 -0
  274. package/dist/ui/markdown-stream.js.map +1 -0
  275. package/dist/ui/plan-renderer.d.ts +36 -0
  276. package/dist/ui/plan-renderer.d.ts.map +1 -0
  277. package/dist/ui/plan-renderer.js +79 -0
  278. package/dist/ui/plan-renderer.js.map +1 -0
  279. package/dist/ui/prompt.d.ts +11 -0
  280. package/dist/ui/prompt.d.ts.map +1 -0
  281. package/dist/ui/prompt.js +1960 -0
  282. package/dist/ui/prompt.js.map +1 -0
  283. package/dist/ui/render-primitives.d.ts +117 -0
  284. package/dist/ui/render-primitives.d.ts.map +1 -0
  285. package/dist/ui/render-primitives.js +322 -0
  286. package/dist/ui/render-primitives.js.map +1 -0
  287. package/dist/ui/render.d.ts +133 -0
  288. package/dist/ui/render.d.ts.map +1 -0
  289. package/dist/ui/render.js +547 -0
  290. package/dist/ui/render.js.map +1 -0
  291. package/dist/ui/session-header.d.ts +30 -0
  292. package/dist/ui/session-header.d.ts.map +1 -0
  293. package/dist/ui/session-header.js +74 -0
  294. package/dist/ui/session-header.js.map +1 -0
  295. package/dist/workspace-guard.d.ts +68 -0
  296. package/dist/workspace-guard.d.ts.map +1 -0
  297. package/dist/workspace-guard.js +168 -0
  298. package/dist/workspace-guard.js.map +1 -0
  299. package/dist/workspace-lock.d.ts +27 -0
  300. package/dist/workspace-lock.d.ts.map +1 -0
  301. package/dist/workspace-lock.js +95 -0
  302. package/dist/workspace-lock.js.map +1 -0
  303. package/package.json +63 -0
@@ -0,0 +1,464 @@
1
+ /**
2
+ * FixO CLI Provider Connector Manager.
3
+ * Manages user-supplied API keys for direct provider access,
4
+ * stored securely at ~/.fixocli/providers.json (mode 0600).
5
+ *
6
+ * When a direct key exists for a provider, FixO bypasses the
7
+ * FreeLLMAPI SaaS proxy and calls the provider's API natively.
8
+ *
9
+ * Pillar 4: the legacy `getDirectConfig(name)` method is now
10
+ * a thin wrapper around the {@link ProviderKeyVault} singleton.
11
+ * New code should use `withDirectCredential(name, fn)` instead,
12
+ * which exposes the credential exclusively inside a scoped
13
+ * callback so the raw key never escapes into a wider stack
14
+ * frame, an error message, or a log line.
15
+ */
16
+ import fs from 'node:fs';
17
+ import path from 'node:path';
18
+ import os from 'node:os';
19
+ import { getProviderKeyVault, resetProviderKeyVault, } from '../runtime/credential-vault.js';
20
+ export const PROVIDER_REGISTRY = [
21
+ {
22
+ name: 'openai',
23
+ displayName: 'OpenAI',
24
+ baseUrl: 'https://api.openai.com/v1',
25
+ openAICompat: true,
26
+ models: ['gpt-4o', 'gpt-4o-mini', 'o3', 'o4-mini', 'gpt-4.1'],
27
+ requiresKey: true,
28
+ docsUrl: 'https://platform.openai.com/api-keys',
29
+ },
30
+ {
31
+ name: 'anthropic',
32
+ displayName: 'Anthropic (Claude)',
33
+ baseUrl: 'https://api.anthropic.com/v1',
34
+ openAICompat: false,
35
+ models: ['claude-opus-4-5', 'claude-sonnet-4-5', 'claude-haiku-3-5'],
36
+ requiresKey: true,
37
+ docsUrl: 'https://console.anthropic.com/settings/keys',
38
+ },
39
+ {
40
+ name: 'google',
41
+ displayName: 'Google (Gemini)',
42
+ baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',
43
+ openAICompat: true,
44
+ models: ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.0-flash'],
45
+ requiresKey: true,
46
+ docsUrl: 'https://aistudio.google.com/app/apikey',
47
+ },
48
+ {
49
+ name: 'groq',
50
+ displayName: 'Groq',
51
+ baseUrl: 'https://api.groq.com/openai/v1',
52
+ openAICompat: true,
53
+ models: ['llama-3.3-70b-versatile', 'llama-3.1-8b-instant', 'mixtral-8x7b-32768', 'gemma2-9b-it'],
54
+ requiresKey: true,
55
+ docsUrl: 'https://console.groq.com/keys',
56
+ },
57
+ {
58
+ name: 'mistral',
59
+ displayName: 'Mistral AI',
60
+ baseUrl: 'https://api.mistral.ai/v1',
61
+ openAICompat: true,
62
+ models: ['mistral-large-latest', 'mistral-small-latest', 'codestral-latest'],
63
+ requiresKey: true,
64
+ docsUrl: 'https://console.mistral.ai/api-keys/',
65
+ },
66
+ {
67
+ name: 'cohere',
68
+ displayName: 'Cohere',
69
+ baseUrl: 'https://api.cohere.ai/compatibility/v1',
70
+ openAICompat: true,
71
+ models: ['command-r-plus', 'command-r', 'command-a-03-2025'],
72
+ requiresKey: true,
73
+ docsUrl: 'https://dashboard.cohere.com/api-keys',
74
+ },
75
+ {
76
+ name: 'openrouter',
77
+ displayName: 'OpenRouter',
78
+ baseUrl: 'https://openrouter.ai/api/v1',
79
+ openAICompat: true,
80
+ models: ['anthropic/claude-opus-4-5', 'openai/gpt-4o', 'google/gemini-2.5-pro', 'meta-llama/llama-4-maverick'],
81
+ requiresKey: true,
82
+ docsUrl: 'https://openrouter.ai/keys',
83
+ },
84
+ {
85
+ name: 'nvidia',
86
+ displayName: 'NVIDIA NIM',
87
+ baseUrl: 'https://integrate.api.nvidia.com/v1',
88
+ openAICompat: true,
89
+ models: ['nvidia/llama-3.1-nemotron-ultra-253b-v1', 'meta/llama-3.1-405b-instruct'],
90
+ requiresKey: true,
91
+ docsUrl: 'https://build.nvidia.com/explore/discover',
92
+ },
93
+ {
94
+ name: 'cerebras',
95
+ displayName: 'Cerebras',
96
+ baseUrl: 'https://api.cerebras.ai/v1',
97
+ openAICompat: true,
98
+ models: ['llama3.3-70b', 'llama-4-scout-17b-16e-instruct', 'qwen-3-32b'],
99
+ requiresKey: true,
100
+ docsUrl: 'https://cloud.cerebras.ai/',
101
+ },
102
+ {
103
+ name: 'sambanova',
104
+ displayName: 'SambaNova',
105
+ baseUrl: 'https://api.sambanova.ai/v1',
106
+ openAICompat: true,
107
+ models: ['Meta-Llama-3.3-70B-Instruct', 'DeepSeek-R1-671B', 'Llama-4-Maverick-17B-128E-Instruct'],
108
+ requiresKey: true,
109
+ docsUrl: 'https://cloud.sambanova.ai/',
110
+ },
111
+ {
112
+ name: 'github',
113
+ displayName: 'GitHub Models',
114
+ baseUrl: 'https://models.github.ai/inference',
115
+ openAICompat: true,
116
+ models: ['openai/gpt-4o', 'microsoft/phi-4', 'meta/llama-3.3-70b-instruct'],
117
+ requiresKey: true,
118
+ docsUrl: 'https://github.com/settings/tokens',
119
+ },
120
+ {
121
+ name: 'xai',
122
+ displayName: 'xAI (Grok)',
123
+ baseUrl: 'https://api.x.ai/v1',
124
+ openAICompat: true,
125
+ models: ['grok-3', 'grok-3-mini', 'grok-2-1212'],
126
+ requiresKey: true,
127
+ docsUrl: 'https://console.x.ai/',
128
+ },
129
+ {
130
+ name: 'zen',
131
+ displayName: 'Zen (OpenCode)',
132
+ baseUrl: 'https://opencode.ai/zen/v1',
133
+ openAICompat: true,
134
+ models: [
135
+ 'kimi-k2.6',
136
+ 'mimo-v2.5-free',
137
+ 'minimax-m2.7',
138
+ 'minimax-m3-free',
139
+ 'nemotron-3-super-free',
140
+ 'qwen3.5-plus',
141
+ 'qwen3.6-plus',
142
+ 'stepfun/step-3.5-flash-free',
143
+ 'z-ai/glm-4.7-flash-free',
144
+ 'deepseek/deepseek-chat',
145
+ ],
146
+ requiresKey: true,
147
+ docsUrl: 'https://opencode.ai/zen',
148
+ },
149
+ ];
150
+ /* ──────────────────────── ProvidersManager ──────────────────────── */
151
+ function getProvidersFilePath() {
152
+ return path.join(os.homedir(), '.fixocli', 'providers.json');
153
+ }
154
+ function loadStore() {
155
+ const filePath = getProvidersFilePath();
156
+ try {
157
+ if (!fs.existsSync(filePath))
158
+ return {};
159
+ const raw = fs.readFileSync(filePath, 'utf-8');
160
+ return JSON.parse(raw);
161
+ }
162
+ catch {
163
+ return {};
164
+ }
165
+ }
166
+ function saveStore(store) {
167
+ const dir = path.join(os.homedir(), '.fixocli');
168
+ if (!fs.existsSync(dir)) {
169
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
170
+ }
171
+ const filePath = getProvidersFilePath();
172
+ fs.writeFileSync(filePath, JSON.stringify(store, null, 2) + '\n', {
173
+ encoding: 'utf-8',
174
+ mode: 0o600,
175
+ });
176
+ try {
177
+ fs.chmodSync(filePath, 0o600);
178
+ }
179
+ catch { /* ignore */ }
180
+ }
181
+ function maskKey(key) {
182
+ if (key.length <= 8)
183
+ return '••••••••';
184
+ return key.slice(0, 6) + '••••••' + key.slice(-4);
185
+ }
186
+ const MODELS_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
187
+ function getModelsCachePath() {
188
+ return path.join(os.homedir(), '.fixocli', 'models-cache.json');
189
+ }
190
+ function loadModelsCache() {
191
+ const filePath = getModelsCachePath();
192
+ try {
193
+ if (!fs.existsSync(filePath))
194
+ return {};
195
+ const raw = fs.readFileSync(filePath, 'utf-8');
196
+ const parsed = JSON.parse(raw);
197
+ return parsed && typeof parsed === 'object' ? parsed : {};
198
+ }
199
+ catch {
200
+ return {};
201
+ }
202
+ }
203
+ function saveModelsCache(store) {
204
+ const dir = path.join(os.homedir(), '.fixocli');
205
+ if (!fs.existsSync(dir)) {
206
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
207
+ }
208
+ const filePath = getModelsCachePath();
209
+ fs.writeFileSync(filePath, JSON.stringify(store, null, 2) + '\n', {
210
+ encoding: 'utf-8',
211
+ mode: 0o600,
212
+ });
213
+ try {
214
+ fs.chmodSync(filePath, 0o600);
215
+ }
216
+ catch { /* ignore */ }
217
+ }
218
+ /**
219
+ * Build the same provider-specific headers that the existing
220
+ * `/providers test` flow uses. Kept here so the live-fetch path
221
+ * and the legacy test path can share one source of truth.
222
+ */
223
+ function buildModelsRequestHeaders(name, apiKey) {
224
+ const headers = {
225
+ 'Authorization': `Bearer ${apiKey}`,
226
+ };
227
+ if (name === 'zen' || name === 'openrouter') {
228
+ headers['HTTP-Referer'] = 'https://opencode.ai/';
229
+ headers['X-Title'] = 'opencode';
230
+ }
231
+ else if (name === 'nvidia') {
232
+ headers['HTTP-Referer'] = 'https://opencode.ai/';
233
+ headers['X-Title'] = 'opencode';
234
+ headers['X-BILLING-INVOKE-ORIGIN'] = 'OpenCode';
235
+ }
236
+ else if (name === 'cerebras') {
237
+ headers['X-Cerebras-3rd-Party-Integration'] = 'opencode';
238
+ }
239
+ return headers;
240
+ }
241
+ function parseModelsResponse(payload) {
242
+ if (!payload || typeof payload !== 'object')
243
+ return null;
244
+ const data = payload.data;
245
+ if (!Array.isArray(data))
246
+ return null;
247
+ const ids = data
248
+ .map(m => (m && typeof m === 'object' && typeof m.id === 'string') ? m.id : null)
249
+ .filter((s) => typeof s === 'string' && s.length > 0);
250
+ return ids.length > 0 ? ids : null;
251
+ }
252
+ export const ProvidersManager = {
253
+ /** List all connected providers with masked keys. */
254
+ list() {
255
+ const store = loadStore();
256
+ return Object.entries(store).map(([name, entry]) => {
257
+ const def = PROVIDER_REGISTRY.find(p => p.name === name);
258
+ return {
259
+ name,
260
+ displayName: def?.displayName ?? name,
261
+ maskedKey: maskKey(entry.apiKey),
262
+ addedAt: entry.addedAt,
263
+ };
264
+ });
265
+ },
266
+ /** Add or update a provider API key. */
267
+ add(name, apiKey, note) {
268
+ const store = loadStore();
269
+ store[name] = {
270
+ apiKey: apiKey.trim(),
271
+ addedAt: new Date().toISOString(),
272
+ ...(note ? { note } : {}),
273
+ };
274
+ saveStore(store);
275
+ // Keep the vault in sync so callers using withDirectCredential
276
+ // see the new key without having to wait for the next
277
+ // hydration.
278
+ const def = PROVIDER_REGISTRY.find((p) => p.name === name);
279
+ if (def) {
280
+ getProviderKeyVault().ingest(name, apiKey.trim(), def.baseUrl, def.displayName);
281
+ }
282
+ },
283
+ /** Remove a provider key. Returns true if removed, false if not found. */
284
+ remove(name) {
285
+ const store = loadStore();
286
+ if (!store[name])
287
+ return false;
288
+ delete store[name];
289
+ saveStore(store);
290
+ getProviderKeyVault().evict(name);
291
+ return true;
292
+ },
293
+ /** Get the raw API key for a provider, or null if not configured. */
294
+ getKey(name) {
295
+ const store = loadStore();
296
+ return store[name]?.apiKey ?? null;
297
+ },
298
+ /** Get the base URL and key for a provider — for direct bypass. */
299
+ getDirectConfig(name) {
300
+ // Lazily hydrate the vault on first access.
301
+ this.hydrateVault();
302
+ const store = loadStore();
303
+ const entry = store[name];
304
+ if (!entry)
305
+ return null;
306
+ const def = PROVIDER_REGISTRY.find(p => p.name === name);
307
+ if (!def)
308
+ return null;
309
+ // Re-ingest in case the on-disk key was added since the last
310
+ // hydration. Idempotent: ingest() overwrites by name.
311
+ getProviderKeyVault().ingest(name, entry.apiKey, def.baseUrl, def.displayName);
312
+ return {
313
+ apiKey: entry.apiKey,
314
+ baseUrl: def.baseUrl,
315
+ displayName: def.displayName,
316
+ };
317
+ },
318
+ /**
319
+ * Run `fn` with a direct provider's full credential
320
+ * ({@link ProviderCredential}) handed in via a scoped
321
+ * callback. The credential is sourced from the in-memory
322
+ * {@link ProviderKeyVault} and is only reachable inside `fn`.
323
+ *
324
+ * Use this in preference to `getDirectConfig(name)` whenever
325
+ * possible — it keeps the raw API key out of return values,
326
+ * error stacks, and exception payloads.
327
+ */
328
+ async withDirectCredential(name, fn) {
329
+ if (!this.has(name))
330
+ return null;
331
+ // Make sure the vault is hydrated.
332
+ this.hydrateVault();
333
+ const def = this.getDefinition(name);
334
+ const vault = getProviderKeyVault();
335
+ return await vault.withCredential(name, (cred) => fn({ ...cred, openAICompat: def ? def.openAICompat : true }));
336
+ },
337
+ /**
338
+ * Populate the {@link ProviderKeyVault} from the on-disk
339
+ * providers store. Idempotent: re-running it is safe and
340
+ * only refreshes entries for providers that have keys on
341
+ * disk. Called automatically on first direct-config access.
342
+ */
343
+ hydrateVault() {
344
+ const store = loadStore();
345
+ const vault = getProviderKeyVault();
346
+ for (const [name, entry] of Object.entries(store)) {
347
+ const def = PROVIDER_REGISTRY.find((p) => p.name === name);
348
+ vault.ingest(name, entry.apiKey, def ? def.baseUrl : '', def ? def.displayName : name);
349
+ }
350
+ },
351
+ /**
352
+ * Drop the cached vault singleton. Used by the
353
+ * `/fixo providers:reset` slash command and by tests.
354
+ */
355
+ resetVault() {
356
+ resetProviderKeyVault();
357
+ },
358
+ /** Check if a provider key is configured. */
359
+ has(name) {
360
+ const store = loadStore();
361
+ return !!store[name];
362
+ },
363
+ /** Get provider definition by name. */
364
+ getDefinition(name) {
365
+ return PROVIDER_REGISTRY.find(p => p.name === name);
366
+ },
367
+ /** Get all registered provider definitions. */
368
+ getAllDefinitions() {
369
+ return PROVIDER_REGISTRY;
370
+ },
371
+ /**
372
+ * Read the cached model list for `name`. Returns `null` when no
373
+ * entry exists or when the entry is stale (older than
374
+ * {@link MODELS_CACHE_TTL_MS}). Synchronous + read-only so the
375
+ * `/model` picker can call it inline without awaiting.
376
+ */
377
+ getCachedModels(name) {
378
+ const store = loadModelsCache();
379
+ const entry = store[name];
380
+ if (!entry)
381
+ return null;
382
+ const fetchedAtMs = Date.parse(entry.fetchedAt);
383
+ if (!Number.isFinite(fetchedAtMs))
384
+ return null;
385
+ if (Date.now() - fetchedAtMs > MODELS_CACHE_TTL_MS)
386
+ return null;
387
+ return entry;
388
+ },
389
+ /**
390
+ * Fetch the live model list from the provider's `/models`
391
+ * endpoint and persist it to the on-disk cache. Routes through
392
+ * the credential vault so the raw API key never escapes into a
393
+ * wider stack frame.
394
+ *
395
+ * Resolution order:
396
+ * 1. live fetch (success → cache + return `source: 'live'`).
397
+ * 2. fresh cache hit (within TTL) → `source: 'cache'`.
398
+ * 3. registry `models[]` fallback → `source: 'registry-fallback'`.
399
+ *
400
+ * Never throws — failure modes degrade through the layers above.
401
+ */
402
+ async fetchRemoteModels(name) {
403
+ const def = this.getDefinition(name);
404
+ if (!def) {
405
+ const fallback = this.getCachedModels(name);
406
+ if (fallback) {
407
+ return { models: fallback.models, source: 'cache', fetchedAt: fallback.fetchedAt };
408
+ }
409
+ return { models: [], source: 'registry-fallback', fetchedAt: new Date().toISOString() };
410
+ }
411
+ const registryFallback = () => {
412
+ const now = new Date().toISOString();
413
+ // Persist a synthetic entry tagged registry-fallback so the
414
+ // /model picker can render the `[unverified]` hint without
415
+ // having to know whether a live fetch was ever attempted.
416
+ const store = loadModelsCache();
417
+ store[name] = { models: def.models.slice(), fetchedAt: now, source: 'registry-fallback' };
418
+ try {
419
+ saveModelsCache(store);
420
+ }
421
+ catch { /* ignore */ }
422
+ return { models: def.models.slice(), source: 'registry-fallback', fetchedAt: now };
423
+ };
424
+ // No key on disk → cannot live-fetch; fall through to cache → registry.
425
+ if (!this.has(name)) {
426
+ const cached = this.getCachedModels(name);
427
+ if (cached) {
428
+ return { models: cached.models, source: 'cache', fetchedAt: cached.fetchedAt };
429
+ }
430
+ return registryFallback();
431
+ }
432
+ const liveResult = await this.withDirectCredential(name, async (cred) => {
433
+ try {
434
+ const headers = buildModelsRequestHeaders(name, cred.apiKey);
435
+ const resp = await fetch(`${cred.baseUrl}/models`, {
436
+ headers,
437
+ signal: AbortSignal.timeout(8000),
438
+ });
439
+ if (!resp.ok)
440
+ return null;
441
+ const payload = await resp.json().catch(() => null);
442
+ const ids = parseModelsResponse(payload);
443
+ if (!ids)
444
+ return null;
445
+ const now = new Date().toISOString();
446
+ const store = loadModelsCache();
447
+ store[name] = { models: ids, fetchedAt: now, source: 'live' };
448
+ saveModelsCache(store);
449
+ return { models: ids, source: 'live', fetchedAt: now };
450
+ }
451
+ catch {
452
+ return null;
453
+ }
454
+ });
455
+ if (liveResult)
456
+ return liveResult;
457
+ const cached = this.getCachedModels(name);
458
+ if (cached) {
459
+ return { models: cached.models, source: 'cache', fetchedAt: cached.fetchedAt };
460
+ }
461
+ return registryFallback();
462
+ },
463
+ };
464
+ //# sourceMappingURL=providers-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-manager.js","sourceRoot":"","sources":["../../src/agent/providers-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Build a compact repo map string suitable for LLM context injection.
3
+ * Returns ~200-500 tokens of structured information about the workspace.
4
+ */
5
+ export declare function buildRepoMap(cwd: string, additionalExcludes?: string[]): string;
6
+ //# sourceMappingURL=repo-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-map.d.ts","sourceRoot":"","sources":["../../src/agent/repo-map.ts"],"names":[],"mappings":"AA2CA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAqB/E"}