@oxagen/cli 0.6.0 → 0.6.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 (339) hide show
  1. package/dist/agent/__tests__/judge.test.js +11 -6
  2. package/dist/agent/__tests__/judge.test.js.map +1 -1
  3. package/dist/agent/__tests__/loop-errors.test.js +32 -1
  4. package/dist/agent/__tests__/loop-errors.test.js.map +1 -1
  5. package/dist/agent/__tests__/loop-gating.test.d.ts +2 -0
  6. package/dist/agent/__tests__/loop-gating.test.d.ts.map +1 -0
  7. package/dist/agent/__tests__/loop-gating.test.js +94 -0
  8. package/dist/agent/__tests__/loop-gating.test.js.map +1 -0
  9. package/dist/agent/__tests__/model-router.test.js +16 -0
  10. package/dist/agent/__tests__/model-router.test.js.map +1 -1
  11. package/dist/agent/__tests__/permissions.test.d.ts +2 -0
  12. package/dist/agent/__tests__/permissions.test.d.ts.map +1 -0
  13. package/dist/agent/__tests__/permissions.test.js +206 -0
  14. package/dist/agent/__tests__/permissions.test.js.map +1 -0
  15. package/dist/agent/__tests__/pipeline-telemetry.test.d.ts +2 -0
  16. package/dist/agent/__tests__/pipeline-telemetry.test.d.ts.map +1 -0
  17. package/dist/agent/__tests__/pipeline-telemetry.test.js +158 -0
  18. package/dist/agent/__tests__/pipeline-telemetry.test.js.map +1 -0
  19. package/dist/agent/__tests__/pipeline.test.js +12 -3
  20. package/dist/agent/__tests__/pipeline.test.js.map +1 -1
  21. package/dist/agent/__tests__/rate-card.test.d.ts +2 -0
  22. package/dist/agent/__tests__/rate-card.test.d.ts.map +1 -0
  23. package/dist/agent/__tests__/rate-card.test.js +69 -0
  24. package/dist/agent/__tests__/rate-card.test.js.map +1 -0
  25. package/dist/agent/__tests__/system-prompt.test.d.ts +2 -0
  26. package/dist/agent/__tests__/system-prompt.test.d.ts.map +1 -0
  27. package/dist/agent/__tests__/system-prompt.test.js +29 -0
  28. package/dist/agent/__tests__/system-prompt.test.js.map +1 -0
  29. package/dist/agent/__tests__/trace-format-verbose.test.d.ts +2 -0
  30. package/dist/agent/__tests__/trace-format-verbose.test.d.ts.map +1 -0
  31. package/dist/agent/__tests__/trace-format-verbose.test.js +93 -0
  32. package/dist/agent/__tests__/trace-format-verbose.test.js.map +1 -0
  33. package/dist/agent/__tests__/verbose-log.test.d.ts +2 -0
  34. package/dist/agent/__tests__/verbose-log.test.d.ts.map +1 -0
  35. package/dist/agent/__tests__/verbose-log.test.js +69 -0
  36. package/dist/agent/__tests__/verbose-log.test.js.map +1 -0
  37. package/dist/agent/evaluator.d.ts.map +1 -1
  38. package/dist/agent/evaluator.js +8 -4
  39. package/dist/agent/evaluator.js.map +1 -1
  40. package/dist/agent/fleet/orchestrator.d.ts +5 -0
  41. package/dist/agent/fleet/orchestrator.d.ts.map +1 -1
  42. package/dist/agent/fleet/orchestrator.js +3 -0
  43. package/dist/agent/fleet/orchestrator.js.map +1 -1
  44. package/dist/agent/fleet/types.d.ts +2 -0
  45. package/dist/agent/fleet/types.d.ts.map +1 -1
  46. package/dist/agent/judge.d.ts +11 -3
  47. package/dist/agent/judge.d.ts.map +1 -1
  48. package/dist/agent/judge.js +15 -3
  49. package/dist/agent/judge.js.map +1 -1
  50. package/dist/agent/loop.d.ts +35 -0
  51. package/dist/agent/loop.d.ts.map +1 -1
  52. package/dist/agent/loop.js +147 -48
  53. package/dist/agent/loop.js.map +1 -1
  54. package/dist/agent/model-router.d.ts +5 -19
  55. package/dist/agent/model-router.d.ts.map +1 -1
  56. package/dist/agent/model-router.js +19 -42
  57. package/dist/agent/model-router.js.map +1 -1
  58. package/dist/agent/permissions.d.ts +103 -0
  59. package/dist/agent/permissions.d.ts.map +1 -0
  60. package/dist/agent/permissions.js +245 -0
  61. package/dist/agent/permissions.js.map +1 -0
  62. package/dist/agent/pipeline.d.ts +13 -3
  63. package/dist/agent/pipeline.d.ts.map +1 -1
  64. package/dist/agent/pipeline.js +66 -15
  65. package/dist/agent/pipeline.js.map +1 -1
  66. package/dist/agent/planner.d.ts +3 -0
  67. package/dist/agent/planner.d.ts.map +1 -1
  68. package/dist/agent/planner.js +14 -1
  69. package/dist/agent/planner.js.map +1 -1
  70. package/dist/agent/prompt-enhancer.d.ts +9 -0
  71. package/dist/agent/prompt-enhancer.d.ts.map +1 -1
  72. package/dist/agent/prompt-enhancer.js +23 -1
  73. package/dist/agent/prompt-enhancer.js.map +1 -1
  74. package/dist/agent/rate-card.d.ts +77 -0
  75. package/dist/agent/rate-card.d.ts.map +1 -0
  76. package/dist/agent/rate-card.js +99 -0
  77. package/dist/agent/rate-card.js.map +1 -0
  78. package/dist/agent/system-prompt.d.ts +5 -0
  79. package/dist/agent/system-prompt.d.ts.map +1 -1
  80. package/dist/agent/system-prompt.js +13 -4
  81. package/dist/agent/system-prompt.js.map +1 -1
  82. package/dist/agent/tools.d.ts +8 -4
  83. package/dist/agent/tools.d.ts.map +1 -1
  84. package/dist/agent/tools.js +35 -4
  85. package/dist/agent/tools.js.map +1 -1
  86. package/dist/agent/trace-format.d.ts +7 -0
  87. package/dist/agent/trace-format.d.ts.map +1 -1
  88. package/dist/agent/trace-format.js +114 -0
  89. package/dist/agent/trace-format.js.map +1 -1
  90. package/dist/agent/trace.d.ts +59 -0
  91. package/dist/agent/trace.d.ts.map +1 -1
  92. package/dist/agent/verbose-log.d.ts +8 -0
  93. package/dist/agent/verbose-log.d.ts.map +1 -0
  94. package/dist/agent/verbose-log.js +53 -0
  95. package/dist/agent/verbose-log.js.map +1 -0
  96. package/dist/agents/__tests__/loader.test.d.ts +2 -0
  97. package/dist/agents/__tests__/loader.test.d.ts.map +1 -0
  98. package/dist/agents/__tests__/loader.test.js +88 -0
  99. package/dist/agents/__tests__/loader.test.js.map +1 -0
  100. package/dist/agents/__tests__/tools.test.d.ts +2 -0
  101. package/dist/agents/__tests__/tools.test.d.ts.map +1 -0
  102. package/dist/agents/__tests__/tools.test.js +40 -0
  103. package/dist/agents/__tests__/tools.test.js.map +1 -0
  104. package/dist/agents/index.d.ts +12 -0
  105. package/dist/agents/index.d.ts.map +1 -0
  106. package/dist/agents/index.js +4 -0
  107. package/dist/agents/index.js.map +1 -0
  108. package/dist/agents/loader.d.ts +25 -0
  109. package/dist/agents/loader.d.ts.map +1 -0
  110. package/dist/agents/loader.js +133 -0
  111. package/dist/agents/loader.js.map +1 -0
  112. package/dist/agents/tools.d.ts +14 -0
  113. package/dist/agents/tools.d.ts.map +1 -0
  114. package/dist/agents/tools.js +21 -0
  115. package/dist/agents/tools.js.map +1 -0
  116. package/dist/agents/types.d.ts +27 -0
  117. package/dist/agents/types.d.ts.map +1 -0
  118. package/dist/agents/types.js +11 -0
  119. package/dist/agents/types.js.map +1 -0
  120. package/dist/agents/write.d.ts +10 -0
  121. package/dist/agents/write.d.ts.map +1 -0
  122. package/dist/agents/write.js +28 -0
  123. package/dist/agents/write.js.map +1 -0
  124. package/dist/commands/__tests__/agent.test.d.ts +2 -0
  125. package/dist/commands/__tests__/agent.test.d.ts.map +1 -0
  126. package/dist/commands/__tests__/agent.test.js +82 -0
  127. package/dist/commands/__tests__/agent.test.js.map +1 -0
  128. package/dist/commands/__tests__/command.test.d.ts +2 -0
  129. package/dist/commands/__tests__/command.test.d.ts.map +1 -0
  130. package/dist/commands/__tests__/command.test.js +73 -0
  131. package/dist/commands/__tests__/command.test.js.map +1 -0
  132. package/dist/commands/__tests__/cost.test.d.ts +2 -0
  133. package/dist/commands/__tests__/cost.test.d.ts.map +1 -0
  134. package/dist/commands/__tests__/cost.test.js +139 -0
  135. package/dist/commands/__tests__/cost.test.js.map +1 -0
  136. package/dist/commands/__tests__/graph.pull.test.d.ts +2 -0
  137. package/dist/commands/__tests__/graph.pull.test.d.ts.map +1 -0
  138. package/dist/commands/__tests__/graph.pull.test.js +259 -0
  139. package/dist/commands/__tests__/graph.pull.test.js.map +1 -0
  140. package/dist/commands/__tests__/mcp.test.d.ts +2 -0
  141. package/dist/commands/__tests__/mcp.test.d.ts.map +1 -0
  142. package/dist/commands/__tests__/mcp.test.js +88 -0
  143. package/dist/commands/__tests__/mcp.test.js.map +1 -0
  144. package/dist/commands/__tests__/rules.test.d.ts +2 -0
  145. package/dist/commands/__tests__/rules.test.d.ts.map +1 -0
  146. package/dist/commands/__tests__/rules.test.js +95 -0
  147. package/dist/commands/__tests__/rules.test.js.map +1 -0
  148. package/dist/commands/__tests__/settings.test.d.ts +2 -0
  149. package/dist/commands/__tests__/settings.test.d.ts.map +1 -0
  150. package/dist/commands/__tests__/settings.test.js +83 -0
  151. package/dist/commands/__tests__/settings.test.js.map +1 -0
  152. package/dist/commands/agent.d.ts +15 -0
  153. package/dist/commands/agent.d.ts.map +1 -0
  154. package/dist/commands/agent.js +58 -0
  155. package/dist/commands/agent.js.map +1 -0
  156. package/dist/commands/command.d.ts +17 -0
  157. package/dist/commands/command.d.ts.map +1 -0
  158. package/dist/commands/command.js +74 -0
  159. package/dist/commands/command.js.map +1 -0
  160. package/dist/commands/config.js.map +1 -1
  161. package/dist/commands/cost.d.ts +10 -0
  162. package/dist/commands/cost.d.ts.map +1 -0
  163. package/dist/commands/cost.js +140 -0
  164. package/dist/commands/cost.js.map +1 -0
  165. package/dist/commands/graph.pull.d.ts +15 -0
  166. package/dist/commands/graph.pull.d.ts.map +1 -0
  167. package/dist/commands/graph.pull.js +137 -0
  168. package/dist/commands/graph.pull.js.map +1 -0
  169. package/dist/commands/graph.status.d.ts +10 -0
  170. package/dist/commands/graph.status.d.ts.map +1 -0
  171. package/dist/commands/graph.status.js +75 -0
  172. package/dist/commands/graph.status.js.map +1 -0
  173. package/dist/commands/mcp.d.ts +18 -0
  174. package/dist/commands/mcp.d.ts.map +1 -0
  175. package/dist/commands/mcp.js +183 -0
  176. package/dist/commands/mcp.js.map +1 -0
  177. package/dist/commands/rules.d.ts +19 -0
  178. package/dist/commands/rules.d.ts.map +1 -0
  179. package/dist/commands/rules.js +96 -0
  180. package/dist/commands/rules.js.map +1 -0
  181. package/dist/commands/settings.d.ts +10 -0
  182. package/dist/commands/settings.d.ts.map +1 -0
  183. package/dist/commands/settings.js +117 -0
  184. package/dist/commands/settings.js.map +1 -0
  185. package/dist/index.js +297 -1
  186. package/dist/index.js.map +1 -1
  187. package/dist/lib/config.d.ts +2 -0
  188. package/dist/lib/config.d.ts.map +1 -1
  189. package/dist/lib/config.js.map +1 -1
  190. package/dist/mcp/__tests__/client.test.d.ts +2 -0
  191. package/dist/mcp/__tests__/client.test.d.ts.map +1 -0
  192. package/dist/mcp/__tests__/client.test.js +101 -0
  193. package/dist/mcp/__tests__/client.test.js.map +1 -0
  194. package/dist/mcp/client.d.ts +89 -0
  195. package/dist/mcp/client.d.ts.map +1 -0
  196. package/dist/mcp/client.js +201 -0
  197. package/dist/mcp/client.js.map +1 -0
  198. package/dist/repl/__tests__/components.test.js +50 -1
  199. package/dist/repl/__tests__/components.test.js.map +1 -1
  200. package/dist/repl/components.d.ts +18 -1
  201. package/dist/repl/components.d.ts.map +1 -1
  202. package/dist/repl/components.js +32 -2
  203. package/dist/repl/components.js.map +1 -1
  204. package/dist/repl/interactive.d.ts +5 -0
  205. package/dist/repl/interactive.d.ts.map +1 -1
  206. package/dist/repl/interactive.js +124 -11
  207. package/dist/repl/interactive.js.map +1 -1
  208. package/dist/repl/one-shot.d.ts +16 -0
  209. package/dist/repl/one-shot.d.ts.map +1 -1
  210. package/dist/repl/one-shot.js +71 -1
  211. package/dist/repl/one-shot.js.map +1 -1
  212. package/dist/rules/__tests__/enforce.test.d.ts +2 -0
  213. package/dist/rules/__tests__/enforce.test.d.ts.map +1 -0
  214. package/dist/rules/__tests__/enforce.test.js +58 -0
  215. package/dist/rules/__tests__/enforce.test.js.map +1 -0
  216. package/dist/rules/__tests__/loader.test.d.ts +2 -0
  217. package/dist/rules/__tests__/loader.test.d.ts.map +1 -0
  218. package/dist/rules/__tests__/loader.test.js +54 -0
  219. package/dist/rules/__tests__/loader.test.js.map +1 -0
  220. package/dist/rules/enforce.d.ts +23 -0
  221. package/dist/rules/enforce.d.ts.map +1 -0
  222. package/dist/rules/enforce.js +36 -0
  223. package/dist/rules/enforce.js.map +1 -0
  224. package/dist/rules/index.d.ts +10 -0
  225. package/dist/rules/index.d.ts.map +1 -0
  226. package/dist/rules/index.js +4 -0
  227. package/dist/rules/index.js.map +1 -0
  228. package/dist/rules/loader.d.ts +10 -0
  229. package/dist/rules/loader.d.ts.map +1 -0
  230. package/dist/rules/loader.js +77 -0
  231. package/dist/rules/loader.js.map +1 -0
  232. package/dist/rules/types.d.ts +39 -0
  233. package/dist/rules/types.d.ts.map +1 -0
  234. package/dist/rules/types.js +16 -0
  235. package/dist/rules/types.js.map +1 -0
  236. package/dist/rules/write.d.ts +10 -0
  237. package/dist/rules/write.d.ts.map +1 -0
  238. package/dist/rules/write.js +28 -0
  239. package/dist/rules/write.js.map +1 -0
  240. package/dist/settings/__tests__/gate.test.d.ts +2 -0
  241. package/dist/settings/__tests__/gate.test.d.ts.map +1 -0
  242. package/dist/settings/__tests__/gate.test.js +137 -0
  243. package/dist/settings/__tests__/gate.test.js.map +1 -0
  244. package/dist/settings/__tests__/hooks.test.d.ts +2 -0
  245. package/dist/settings/__tests__/hooks.test.d.ts.map +1 -0
  246. package/dist/settings/__tests__/hooks.test.js +103 -0
  247. package/dist/settings/__tests__/hooks.test.js.map +1 -0
  248. package/dist/settings/__tests__/mcp-write.test.d.ts +2 -0
  249. package/dist/settings/__tests__/mcp-write.test.d.ts.map +1 -0
  250. package/dist/settings/__tests__/mcp-write.test.js +77 -0
  251. package/dist/settings/__tests__/mcp-write.test.js.map +1 -0
  252. package/dist/settings/__tests__/permissions-gate.test.d.ts +2 -0
  253. package/dist/settings/__tests__/permissions-gate.test.d.ts.map +1 -0
  254. package/dist/settings/__tests__/permissions-gate.test.js +75 -0
  255. package/dist/settings/__tests__/permissions-gate.test.js.map +1 -0
  256. package/dist/settings/__tests__/resolve.test.d.ts +2 -0
  257. package/dist/settings/__tests__/resolve.test.d.ts.map +1 -0
  258. package/dist/settings/__tests__/resolve.test.js +109 -0
  259. package/dist/settings/__tests__/resolve.test.js.map +1 -0
  260. package/dist/settings/__tests__/runtime.test.d.ts +2 -0
  261. package/dist/settings/__tests__/runtime.test.d.ts.map +1 -0
  262. package/dist/settings/__tests__/runtime.test.js +72 -0
  263. package/dist/settings/__tests__/runtime.test.js.map +1 -0
  264. package/dist/settings/__tests__/schema.test.d.ts +2 -0
  265. package/dist/settings/__tests__/schema.test.d.ts.map +1 -0
  266. package/dist/settings/__tests__/schema.test.js +55 -0
  267. package/dist/settings/__tests__/schema.test.js.map +1 -0
  268. package/dist/settings/__tests__/write.test.d.ts +2 -0
  269. package/dist/settings/__tests__/write.test.d.ts.map +1 -0
  270. package/dist/settings/__tests__/write.test.js +61 -0
  271. package/dist/settings/__tests__/write.test.js.map +1 -0
  272. package/dist/settings/gate.d.ts +34 -0
  273. package/dist/settings/gate.d.ts.map +1 -0
  274. package/dist/settings/gate.js +50 -0
  275. package/dist/settings/gate.js.map +1 -0
  276. package/dist/settings/hooks.d.ts +26 -0
  277. package/dist/settings/hooks.d.ts.map +1 -0
  278. package/dist/settings/hooks.js +115 -0
  279. package/dist/settings/hooks.js.map +1 -0
  280. package/dist/settings/index.d.ts +23 -0
  281. package/dist/settings/index.d.ts.map +1 -0
  282. package/dist/settings/index.js +23 -0
  283. package/dist/settings/index.js.map +1 -0
  284. package/dist/settings/mcp-write.d.ts +41 -0
  285. package/dist/settings/mcp-write.d.ts.map +1 -0
  286. package/dist/settings/mcp-write.js +61 -0
  287. package/dist/settings/mcp-write.js.map +1 -0
  288. package/dist/settings/permissions-gate.d.ts +19 -0
  289. package/dist/settings/permissions-gate.d.ts.map +1 -0
  290. package/dist/settings/permissions-gate.js +103 -0
  291. package/dist/settings/permissions-gate.js.map +1 -0
  292. package/dist/settings/resolve.d.ts +37 -0
  293. package/dist/settings/resolve.d.ts.map +1 -0
  294. package/dist/settings/resolve.js +169 -0
  295. package/dist/settings/resolve.js.map +1 -0
  296. package/dist/settings/runtime.d.ts +28 -0
  297. package/dist/settings/runtime.d.ts.map +1 -0
  298. package/dist/settings/runtime.js +45 -0
  299. package/dist/settings/runtime.js.map +1 -0
  300. package/dist/settings/schema.d.ts +1387 -0
  301. package/dist/settings/schema.d.ts.map +1 -0
  302. package/dist/settings/schema.js +146 -0
  303. package/dist/settings/schema.js.map +1 -0
  304. package/dist/settings/write.d.ts +37 -0
  305. package/dist/settings/write.d.ts.map +1 -0
  306. package/dist/settings/write.js +85 -0
  307. package/dist/settings/write.js.map +1 -0
  308. package/dist/slash/__tests__/expand.test.d.ts +2 -0
  309. package/dist/slash/__tests__/expand.test.d.ts.map +1 -0
  310. package/dist/slash/__tests__/expand.test.js +44 -0
  311. package/dist/slash/__tests__/expand.test.js.map +1 -0
  312. package/dist/slash/__tests__/loader.test.d.ts +2 -0
  313. package/dist/slash/__tests__/loader.test.d.ts.map +1 -0
  314. package/dist/slash/__tests__/loader.test.js +48 -0
  315. package/dist/slash/__tests__/loader.test.js.map +1 -0
  316. package/dist/slash/expand.d.ts +32 -0
  317. package/dist/slash/expand.d.ts.map +1 -0
  318. package/dist/slash/expand.js +48 -0
  319. package/dist/slash/expand.js.map +1 -0
  320. package/dist/slash/index.d.ts +11 -0
  321. package/dist/slash/index.d.ts.map +1 -0
  322. package/dist/slash/index.js +4 -0
  323. package/dist/slash/index.js.map +1 -0
  324. package/dist/slash/loader.d.ts +10 -0
  325. package/dist/slash/loader.d.ts.map +1 -0
  326. package/dist/slash/loader.js +64 -0
  327. package/dist/slash/loader.js.map +1 -0
  328. package/dist/slash/types.d.ts +24 -0
  329. package/dist/slash/types.d.ts.map +1 -0
  330. package/dist/slash/types.js +11 -0
  331. package/dist/slash/types.js.map +1 -0
  332. package/dist/slash/write.d.ts +10 -0
  333. package/dist/slash/write.d.ts.map +1 -0
  334. package/dist/slash/write.js +26 -0
  335. package/dist/slash/write.js.map +1 -0
  336. package/dist/tui/fleet-view/index.d.ts.map +1 -1
  337. package/dist/tui/fleet-view/index.js +5 -1
  338. package/dist/tui/fleet-view/index.js.map +1 -1
  339. package/package.json +5 -1
@@ -0,0 +1,61 @@
1
+ import { getScopePaths } from "./resolve.js";
2
+ import { readScopeDoc, writeScopeDoc } from "./write.js";
3
+ const SCOPE_ORDER = ["local", "project", "user"];
4
+ function serversOf(doc) {
5
+ return doc["mcpServers"] ?? {};
6
+ }
7
+ /** Find the highest-precedence scope that defines a server, if any. */
8
+ export function findServerScope(name, ctx = {}) {
9
+ const paths = getScopePaths(ctx);
10
+ for (const scope of SCOPE_ORDER) {
11
+ const path = paths[scope];
12
+ if (name in serversOf(readScopeDoc(path)))
13
+ return { scope, path };
14
+ }
15
+ return null;
16
+ }
17
+ /** Add or replace an MCP server in a scope file (default: project). */
18
+ export function writeMcpServer(opts) {
19
+ const scope = opts.scope ?? "project";
20
+ const path = getScopePaths(opts)[scope];
21
+ const doc = readScopeDoc(path);
22
+ const servers = serversOf(doc);
23
+ servers[opts.name] = opts.config;
24
+ doc["mcpServers"] = servers;
25
+ writeScopeDoc(path, doc);
26
+ return path;
27
+ }
28
+ /** Remove a server. Returns the path touched and whether it existed. */
29
+ export function removeMcpServer(opts) {
30
+ const target = opts.scope
31
+ ? { scope: opts.scope, path: getScopePaths(opts)[opts.scope] }
32
+ : findServerScope(opts.name, opts);
33
+ if (!target)
34
+ return { path: getScopePaths(opts).project, found: false };
35
+ const doc = readScopeDoc(target.path);
36
+ const servers = serversOf(doc);
37
+ if (!(opts.name in servers))
38
+ return { path: target.path, found: false };
39
+ delete servers[opts.name];
40
+ doc["mcpServers"] = servers;
41
+ writeScopeDoc(target.path, doc);
42
+ return { path: target.path, found: true };
43
+ }
44
+ /** Toggle a server's `disabled` flag. Returns the path and whether it existed. */
45
+ export function setMcpServerDisabled(opts) {
46
+ const target = opts.scope
47
+ ? { scope: opts.scope, path: getScopePaths(opts)[opts.scope] }
48
+ : findServerScope(opts.name, opts);
49
+ if (!target)
50
+ return { path: getScopePaths(opts).project, found: false };
51
+ const doc = readScopeDoc(target.path);
52
+ const servers = serversOf(doc);
53
+ const existing = servers[opts.name];
54
+ if (!existing)
55
+ return { path: target.path, found: false };
56
+ servers[opts.name] = { ...existing, disabled: opts.disabled };
57
+ doc["mcpServers"] = servers;
58
+ writeScopeDoc(target.path, doc);
59
+ return { path: target.path, found: true };
60
+ }
61
+ //# sourceMappingURL=mcp-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-write.js","sourceRoot":"","sources":["../../src/settings/mcp-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Permissions } from "./schema.js";
2
+ export interface LocalPermissionResult {
3
+ decision: "allow" | "deny";
4
+ reason: string;
5
+ /** The rule string that produced an explicit allow/deny, if any. */
6
+ rule?: string;
7
+ }
8
+ /** The canonical permission name for a tool (e.g. read_file → Read; mcp tools unchanged). */
9
+ export declare function canonicalToolName(toolName: string): string;
10
+ interface ParsedRule {
11
+ tool: string;
12
+ pattern?: string;
13
+ }
14
+ /** Parse "Bash(git*)" → { tool: "Bash", pattern: "git*" }; "Edit" → { tool: "Edit" }. */
15
+ export declare function parseRule(rule: string): ParsedRule;
16
+ /** Evaluate whether a local tool call is permitted under the resolved permissions. */
17
+ export declare function evaluateLocalPermission(toolName: string, input: unknown, permissions: Permissions | undefined): LocalPermissionResult;
18
+ export {};
19
+ //# sourceMappingURL=permissions-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gate.d.ts","sourceRoot":"","sources":["../../src/settings/permissions-gate.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0BD,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AASD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAKlD;AAYD,sFAAsF;AACtF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,qBAAqB,CAyBvB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * permissions-gate.ts — Evaluates `settings.permissions` for the agent's local
3
+ * tools (read_file/write_file/edit_file/bash/…).
4
+ *
5
+ * Rules use Claude Code's syntax: a canonical tool name, optionally narrowed by
6
+ * a glob over the call's "subject" (the command for Bash, the path for a write,
7
+ * the pattern for a search):
8
+ *
9
+ * "Bash" any shell command
10
+ * "Bash(git push*)" shell commands starting with "git push"
11
+ * "Write(.env*)" writes whose path matches ".env*"
12
+ * "Edit" any surgical edit
13
+ *
14
+ * Decision order (deny always wins, matching the MCP gate and Claude Code):
15
+ * 1. a `deny` rule matches → deny
16
+ * 2. an `allow` rule matches → allow
17
+ * 3. defaultMode "bypassPermissions" → allow
18
+ * 4. defaultMode "deny" → deny (deny-by-default; only allow-listed pass)
19
+ * 5. otherwise (default/acceptEdits) → allow
20
+ *
21
+ * When no `permissions` block is configured, every call is allowed — this
22
+ * preserves the CLI's historical "runs against your own repo" behavior until a
23
+ * user opts into gating.
24
+ */
25
+ import { matchGlob } from "@oxagen/mcp-config/permissions";
26
+ /** Local tool id → canonical permission name used in rule strings. */
27
+ const CANONICAL = {
28
+ read_file: "Read",
29
+ list_dir: "Read",
30
+ glob: "Read",
31
+ grep: "Read",
32
+ code_graph: "Read",
33
+ write_file: "Write",
34
+ edit_file: "Edit",
35
+ bash: "Bash",
36
+ };
37
+ /** Local tool id → the input field used as the rule "subject". */
38
+ const SUBJECT_FIELD = {
39
+ read_file: "path",
40
+ list_dir: "path",
41
+ glob: "pattern",
42
+ grep: "pattern",
43
+ code_graph: "query",
44
+ write_file: "path",
45
+ edit_file: "path",
46
+ bash: "command",
47
+ };
48
+ /** The canonical permission name for a tool (e.g. read_file → Read; mcp tools unchanged). */
49
+ export function canonicalToolName(toolName) {
50
+ return CANONICAL[toolName] ?? toolName;
51
+ }
52
+ function subjectOf(toolName, input) {
53
+ const field = SUBJECT_FIELD[toolName];
54
+ if (!field || input === null || typeof input !== "object")
55
+ return "";
56
+ const value = input[field];
57
+ return typeof value === "string" ? value : "";
58
+ }
59
+ /** Parse "Bash(git*)" → { tool: "Bash", pattern: "git*" }; "Edit" → { tool: "Edit" }. */
60
+ export function parseRule(rule) {
61
+ const trimmed = rule.trim();
62
+ const open = trimmed.indexOf("(");
63
+ if (open === -1 || !trimmed.endsWith(")"))
64
+ return { tool: trimmed };
65
+ return { tool: trimmed.slice(0, open).trim(), pattern: trimmed.slice(open + 1, -1).trim() };
66
+ }
67
+ function ruleMatches(rule, canonical, subject) {
68
+ const parsed = parseRule(rule);
69
+ // The tool token is glob-matched against the canonical name. For local tools
70
+ // this is an exact compare ("Bash" === "Bash"); for MCP tools it lets a rule
71
+ // like `mcp__github__*` match `mcp__github__create_issue`.
72
+ if (!matchGlob(parsed.tool, canonical))
73
+ return false;
74
+ if (parsed.pattern === undefined || parsed.pattern === "")
75
+ return true;
76
+ return matchGlob(parsed.pattern, subject);
77
+ }
78
+ /** Evaluate whether a local tool call is permitted under the resolved permissions. */
79
+ export function evaluateLocalPermission(toolName, input, permissions) {
80
+ if (!permissions)
81
+ return { decision: "allow", reason: "no permissions configured" };
82
+ const canonical = CANONICAL[toolName] ?? toolName;
83
+ const subject = subjectOf(toolName, input);
84
+ for (const rule of permissions.deny ?? []) {
85
+ if (ruleMatches(rule, canonical, subject)) {
86
+ return { decision: "deny", reason: `denied by rule "${rule}"`, rule };
87
+ }
88
+ }
89
+ for (const rule of permissions.allow ?? []) {
90
+ if (ruleMatches(rule, canonical, subject)) {
91
+ return { decision: "allow", reason: `allowed by rule "${rule}"`, rule };
92
+ }
93
+ }
94
+ const mode = permissions.defaultMode ?? "default";
95
+ if (mode === "bypassPermissions") {
96
+ return { decision: "allow", reason: "defaultMode: bypassPermissions" };
97
+ }
98
+ if (mode === "deny") {
99
+ return { decision: "deny", reason: "defaultMode: deny (no allow rule matched)" };
100
+ }
101
+ return { decision: "allow", reason: `defaultMode: ${mode}` };
102
+ }
103
+ //# sourceMappingURL=permissions-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gate.js","sourceRoot":"","sources":["../../src/settings/permissions-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type OxagenSettings } from "./schema.js";
2
+ export type SettingsScope = "user" | "project" | "local";
3
+ export interface ResolveSettingsOptions {
4
+ /** Working directory / project root (where `.oxagen/` lives). Defaults to process.cwd(). */
5
+ cwd?: string;
6
+ /** Override the user settings file path (testing). */
7
+ userSettingsPath?: string;
8
+ /** Override the project directory name (testing). Default ".oxagen". */
9
+ projectDirName?: string;
10
+ /** Skip the per-process cache (testing / after a write). */
11
+ noCache?: boolean;
12
+ }
13
+ export interface ResolvedScopeFile {
14
+ scope: SettingsScope;
15
+ path: string;
16
+ /** Present only when the file exists and parsed successfully. */
17
+ settings?: OxagenSettings;
18
+ /** Present when the file exists but failed schema validation. */
19
+ error?: string;
20
+ }
21
+ export interface ResolvedSettings {
22
+ /** Merged, env-expanded settings across every scope that exists. */
23
+ settings: OxagenSettings;
24
+ /** Per-scope diagnostics (path, parsed body, or error) for `oxagen settings`. */
25
+ scopes: ResolvedScopeFile[];
26
+ }
27
+ /** The three scope file paths for a given project root, in precedence order. */
28
+ export declare function getScopePaths(opts?: ResolveSettingsOptions): Record<SettingsScope, string>;
29
+ /** Clear the per-process resolution cache (after a write, or in tests). */
30
+ export declare function clearSettingsCache(): void;
31
+ /**
32
+ * Resolve the effective settings by loading and merging every scope that exists.
33
+ * Results are cached per project root for the life of the process (settings do
34
+ * not change mid-run); pass `noCache` to bypass.
35
+ */
36
+ export declare function loadSettings(opts?: ResolveSettingsOptions): ResolvedSettings;
37
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/settings/resolve.ts"],"names":[],"mappings":"AAyBA,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,cAAc,CAAC;IACzB,iFAAiF;IACjF,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAQD,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,IAAI,GAAE,sBAA2B,GAAG,MAAM,CACtE,aAAa,EACb,MAAM,CACP,CAQA;AAgHD,2EAA2E;AAC3E,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,sBAA2B,GAAG,gBAAgB,CAoBhF"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * resolve.ts — Loads and merges the unified `settings.json` across three scopes.
3
+ *
4
+ * Precedence (lowest → highest), identical to the MCP config layering and to
5
+ * Claude Code:
6
+ * 1. User (global): ~/.config/oxagen/settings.json
7
+ * 2. Project (shared): <projectRoot>/.oxagen/settings.json
8
+ * 3. Local (personal): <projectRoot>/.oxagen/settings.local.json
9
+ *
10
+ * Merge rules:
11
+ * - scalars (model, apiUrl, $schema): higher scope wins
12
+ * - env: keyed merge; higher scope wins per key
13
+ * - permissions.defaultMode/defaultMcpPolicy: higher scope wins
14
+ * - permissions.allow/deny: concatenated (deduped), higher scope last
15
+ * - permissions.mcpServers, mcpServers, toolVisibility: keyed replace
16
+ * - hooks: per-event matcher lists concatenated
17
+ * - unknown (forward-compat) keys: higher scope wins (shallow)
18
+ *
19
+ * `${VAR}` references in any string value are expanded from the environment at
20
+ * resolution time (reusing @oxagen/mcp-config's expander).
21
+ */
22
+ import { readFileSync, existsSync } from "node:fs";
23
+ import { join } from "node:path";
24
+ import { homedir } from "node:os";
25
+ import { expandEnvVars } from "@oxagen/mcp-config/resolve";
26
+ import { oxagenSettingsSchema, } from "./schema.js";
27
+ const DEFAULT_PROJECT_DIR = ".oxagen";
28
+ function userSettingsFile() {
29
+ return join(homedir(), ".config", "oxagen", "settings.json");
30
+ }
31
+ /** The three scope file paths for a given project root, in precedence order. */
32
+ export function getScopePaths(opts = {}) {
33
+ const root = opts.cwd ?? process.cwd();
34
+ const dir = opts.projectDirName ?? DEFAULT_PROJECT_DIR;
35
+ return {
36
+ user: opts.userSettingsPath ?? userSettingsFile(),
37
+ project: join(root, dir, "settings.json"),
38
+ local: join(root, dir, "settings.local.json"),
39
+ };
40
+ }
41
+ function loadScope(scope, path) {
42
+ if (!existsSync(path))
43
+ return { scope, path };
44
+ let raw;
45
+ try {
46
+ raw = readFileSync(path, "utf8");
47
+ }
48
+ catch (err) {
49
+ return { scope, path, error: err instanceof Error ? err.message : String(err) };
50
+ }
51
+ let json;
52
+ try {
53
+ json = JSON.parse(raw);
54
+ }
55
+ catch (err) {
56
+ return {
57
+ scope,
58
+ path,
59
+ error: `invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
60
+ };
61
+ }
62
+ const parsed = oxagenSettingsSchema.safeParse(json);
63
+ if (!parsed.success) {
64
+ return { scope, path, error: parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ") };
65
+ }
66
+ return { scope, path, settings: parsed.data };
67
+ }
68
+ // ── Merge helpers ───────────────────────────────────────────────────────────
69
+ function dedupe(values) {
70
+ return [...new Set(values)];
71
+ }
72
+ function mergePermissions(base, overlay) {
73
+ if (!base)
74
+ return overlay;
75
+ if (!overlay)
76
+ return base;
77
+ return {
78
+ defaultMode: overlay.defaultMode ?? base.defaultMode,
79
+ allow: base.allow || overlay.allow
80
+ ? dedupe([...(base.allow ?? []), ...(overlay.allow ?? [])])
81
+ : undefined,
82
+ deny: base.deny || overlay.deny
83
+ ? dedupe([...(base.deny ?? []), ...(overlay.deny ?? [])])
84
+ : undefined,
85
+ defaultMcpPolicy: overlay.defaultMcpPolicy ?? base.defaultMcpPolicy,
86
+ mcpServers: base.mcpServers || overlay.mcpServers
87
+ ? { ...(base.mcpServers ?? {}), ...(overlay.mcpServers ?? {}) }
88
+ : undefined,
89
+ };
90
+ }
91
+ function mergeHooks(base, overlay) {
92
+ if (!base)
93
+ return overlay;
94
+ if (!overlay)
95
+ return base;
96
+ const concat = (a, b) => a || b ? [...(a ?? []), ...(b ?? [])] : undefined;
97
+ return {
98
+ SessionStart: concat(base.SessionStart, overlay.SessionStart),
99
+ PreToolUse: concat(base.PreToolUse, overlay.PreToolUse),
100
+ PostToolUse: concat(base.PostToolUse, overlay.PostToolUse),
101
+ };
102
+ }
103
+ /** Keys with bespoke merge logic; everything else is shallow "overlay wins". */
104
+ const STRUCTURED_KEYS = new Set([
105
+ "env",
106
+ "permissions",
107
+ "hooks",
108
+ "mcpServers",
109
+ "toolVisibility",
110
+ ]);
111
+ function mergeSettings(base, overlay) {
112
+ const merged = { ...base };
113
+ // Pass-through + scalar keys: overlay wins (skip the structured ones below).
114
+ for (const [key, value] of Object.entries(overlay)) {
115
+ if (value === undefined)
116
+ continue;
117
+ if (STRUCTURED_KEYS.has(key))
118
+ continue;
119
+ merged[key] = value;
120
+ }
121
+ if (base.env || overlay.env) {
122
+ merged.env = { ...(base.env ?? {}), ...(overlay.env ?? {}) };
123
+ }
124
+ merged.permissions = mergePermissions(base.permissions, overlay.permissions);
125
+ merged.hooks = mergeHooks(base.hooks, overlay.hooks);
126
+ if (base.mcpServers || overlay.mcpServers) {
127
+ merged.mcpServers = { ...(base.mcpServers ?? {}), ...(overlay.mcpServers ?? {}) };
128
+ }
129
+ if (base.toolVisibility || overlay.toolVisibility) {
130
+ merged.toolVisibility = {
131
+ ...(base.toolVisibility ?? {}),
132
+ ...(overlay.toolVisibility ?? {}),
133
+ };
134
+ }
135
+ return merged;
136
+ }
137
+ // ── Public API ──────────────────────────────────────────────────────────────
138
+ const cache = new Map();
139
+ /** Clear the per-process resolution cache (after a write, or in tests). */
140
+ export function clearSettingsCache() {
141
+ cache.clear();
142
+ }
143
+ /**
144
+ * Resolve the effective settings by loading and merging every scope that exists.
145
+ * Results are cached per project root for the life of the process (settings do
146
+ * not change mid-run); pass `noCache` to bypass.
147
+ */
148
+ export function loadSettings(opts = {}) {
149
+ const paths = getScopePaths(opts);
150
+ const cacheKey = `${paths.user}|${paths.project}|${paths.local}`;
151
+ if (!opts.noCache) {
152
+ const hit = cache.get(cacheKey);
153
+ if (hit)
154
+ return hit;
155
+ }
156
+ const order = ["user", "project", "local"];
157
+ const scopes = order.map((scope) => loadScope(scope, paths[scope]));
158
+ let merged = {};
159
+ for (const sc of scopes) {
160
+ if (sc.settings)
161
+ merged = mergeSettings(merged, sc.settings);
162
+ }
163
+ const expanded = expandEnvVars(merged);
164
+ const result = { settings: expanded, scopes };
165
+ if (!opts.noCache)
166
+ cache.set(cacheKey, result);
167
+ return result;
168
+ }
169
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/settings/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * runtime.ts — Glue that makes `settings.json` drive the running CLI.
3
+ *
4
+ * The model and apiUrl resolvers (model.ts, config.ts) and the gateway key
5
+ * resolver (agent/env.ts) already consult environment variables. Rather than
6
+ * thread settings through each of them, we project the relevant settings into
7
+ * `process.env` once at startup — and only for vars the shell has not already
8
+ * set, so an explicit `OXAGEN_MODEL=… oxagen` or a shell export always wins.
9
+ *
10
+ * This keeps the wiring additive and cycle-free: those resolvers are untouched,
11
+ * yet `settings.json` now feeds them.
12
+ */
13
+ import { type ResolveSettingsOptions } from "./resolve.js";
14
+ export interface AppliedSettingsEnv {
15
+ /** Names of env vars populated from settings.env. */
16
+ envKeys: string[];
17
+ /** Whether OXAGEN_API_URL was set from settings.apiUrl. */
18
+ apiUrl: boolean;
19
+ /** Whether OXAGEN_MODEL was set from settings.model. */
20
+ model: boolean;
21
+ }
22
+ /**
23
+ * Project `env`, `apiUrl`, and `model` from the resolved settings into
24
+ * `process.env` (filling only unset vars). Call once at CLI startup. Returns
25
+ * what was applied (useful for `--verbose` / diagnostics).
26
+ */
27
+ export declare function applySettingsToEnv(opts?: ResolveSettingsOptions): AppliedSettingsEnv;
28
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/settings/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAQzE,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,kBAAkB,CAwBxF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * runtime.ts — Glue that makes `settings.json` drive the running CLI.
3
+ *
4
+ * The model and apiUrl resolvers (model.ts, config.ts) and the gateway key
5
+ * resolver (agent/env.ts) already consult environment variables. Rather than
6
+ * thread settings through each of them, we project the relevant settings into
7
+ * `process.env` once at startup — and only for vars the shell has not already
8
+ * set, so an explicit `OXAGEN_MODEL=… oxagen` or a shell export always wins.
9
+ *
10
+ * This keeps the wiring additive and cycle-free: those resolvers are untouched,
11
+ * yet `settings.json` now feeds them.
12
+ */
13
+ import { loadSettings } from "./resolve.js";
14
+ /** True when an env var is effectively unset (so settings may fill it). */
15
+ function isUnset(name) {
16
+ const v = process.env[name];
17
+ return v === undefined || v === "";
18
+ }
19
+ /**
20
+ * Project `env`, `apiUrl`, and `model` from the resolved settings into
21
+ * `process.env` (filling only unset vars). Call once at CLI startup. Returns
22
+ * what was applied (useful for `--verbose` / diagnostics).
23
+ */
24
+ export function applySettingsToEnv(opts = {}) {
25
+ const { settings } = loadSettings(opts);
26
+ const envKeys = [];
27
+ for (const [key, value] of Object.entries(settings.env ?? {})) {
28
+ if (isUnset(key)) {
29
+ process.env[key] = value;
30
+ envKeys.push(key);
31
+ }
32
+ }
33
+ let apiUrl = false;
34
+ if (settings.apiUrl && isUnset("OXAGEN_API_URL")) {
35
+ process.env["OXAGEN_API_URL"] = settings.apiUrl;
36
+ apiUrl = true;
37
+ }
38
+ let model = false;
39
+ if (settings.model && isUnset("OXAGEN_MODEL")) {
40
+ process.env["OXAGEN_MODEL"] = settings.model;
41
+ model = true;
42
+ }
43
+ return { envKeys, apiUrl, model };
44
+ }
45
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/settings/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAA+B,MAAM,cAAc,CAAC;AAEzE,2EAA2E;AAC3E,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;AACrC,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA+B,EAAE;IAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAChD,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC"}