reasonix 0.46.0 → 0.46.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 (147) hide show
  1. package/README.md +3 -0
  2. package/README.zh-CN.md +3 -0
  3. package/dashboard/dist/app.js +76 -6
  4. package/dashboard/dist/app.js.map +1 -1
  5. package/dist/cli/{acp-LGBLHBKY.js → acp-LKJU5DZX.js} +19 -19
  6. package/dist/cli/chat-W7LAWEN6.js +51 -0
  7. package/dist/cli/chunk-2425HK6U.js +0 -0
  8. package/dist/cli/chunk-25T6CVUP.js +0 -0
  9. package/dist/cli/{chunk-5I2C4JEO.js → chunk-2AASOSD5.js} +6 -6
  10. package/dist/cli/{chunk-5I2C4JEO.js.map → chunk-2AASOSD5.js.map} +1 -1
  11. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  12. package/dist/cli/{chunk-HVUZWNSP.js → chunk-3AAG2CUT.js} +2 -2
  13. package/dist/cli/chunk-5QCB62C4.js +0 -0
  14. package/dist/cli/chunk-6OWJV3YW.js +0 -0
  15. package/dist/cli/{chunk-IJ7JA32V.js → chunk-6VANO7KB.js} +44 -8
  16. package/dist/cli/chunk-6VANO7KB.js.map +1 -0
  17. package/dist/cli/{chunk-LIR2HBQH.js → chunk-7LOJS3LV.js} +2 -2
  18. package/dist/cli/{chunk-I4L2GTSE.js → chunk-7SGGXNB2.js} +2 -2
  19. package/dist/cli/{chunk-CBIQWMS6.js → chunk-7YW6TPXK.js} +7 -7
  20. package/dist/cli/{chunk-A3TSSDS2.js → chunk-C72TNHDE.js} +2 -2
  21. package/dist/cli/chunk-CXVWUPA3.js +0 -0
  22. package/dist/cli/{chunk-AVFXO2EZ.js → chunk-DGA5QYFM.js} +107 -4
  23. package/dist/cli/chunk-DGA5QYFM.js.map +1 -0
  24. package/dist/cli/{chunk-JNAQYELD.js → chunk-DHRVZJ2D.js} +2 -2
  25. package/dist/cli/{chunk-5ACMUK4Q.js → chunk-E7TAHQ4A.js} +2 -1
  26. package/dist/cli/{chunk-C53JQES5.js → chunk-EAOL43HB.js} +3 -3
  27. package/dist/cli/chunk-FEZK652I.js +0 -0
  28. package/dist/cli/chunk-HNXDZGC6.js +0 -0
  29. package/dist/cli/{chunk-QJDDIK3Z.js → chunk-IYQ325V7.js} +2 -2
  30. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  31. package/dist/cli/{chunk-4CTDEJUF.js → chunk-JLQDNLZF.js} +2 -2
  32. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  33. package/dist/cli/{chunk-RDRC3XDT.js → chunk-JVFEJAJX.js} +2 -2
  34. package/dist/cli/{chunk-GTZTQNX5.js → chunk-JVQT5IYP.js} +7 -7
  35. package/dist/cli/{chunk-YY227BIQ.js → chunk-K3AIFMI6.js} +2 -2
  36. package/dist/cli/{chunk-ZZYBBX5N.js → chunk-M4E5JK6S.js} +23 -9
  37. package/dist/cli/chunk-M4E5JK6S.js.map +1 -0
  38. package/dist/cli/{chunk-V26WPN3J.js → chunk-MIIZJD5O.js} +28 -1
  39. package/dist/cli/chunk-MIIZJD5O.js.map +1 -0
  40. package/dist/cli/{chunk-4HCP2UQW.js → chunk-NCBP5D6E.js} +2 -2
  41. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  42. package/dist/cli/{chunk-HKWSPKMU.js → chunk-R2ASNSEO.js} +8 -8
  43. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  44. package/dist/cli/{chunk-W7YGWUWU.js → chunk-SE7C5ZSI.js} +3 -3
  45. package/dist/cli/{chunk-KQU2TYIL.js → chunk-SPXN5JIT.js} +1128 -675
  46. package/dist/cli/chunk-SPXN5JIT.js.map +1 -0
  47. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  48. package/dist/cli/{chunk-WK3UFQY3.js → chunk-TDSBASOF.js} +2 -2
  49. package/dist/cli/chunk-TEUDEGX2.js +0 -0
  50. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  51. package/dist/cli/{chunk-XSU4QVFW.js → chunk-WQ6ZRDQM.js} +12 -3
  52. package/dist/cli/chunk-WQ6ZRDQM.js.map +1 -0
  53. package/dist/cli/{chunk-R3CTO2HM.js → chunk-WRONKNIH.js} +2 -2
  54. package/dist/cli/chunk-X53B3JIX.js +0 -0
  55. package/dist/cli/chunk-XJXDHAES.js +0 -0
  56. package/dist/cli/{chunk-MJ6W5UN3.js → chunk-XPAUNFOL.js} +2 -2
  57. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  58. package/dist/cli/{chunk-NVURFF27.js → chunk-YRLC2EDF.js} +2 -2
  59. package/dist/cli/{chunk-WL6SNQ5T.js → chunk-ZOQHVQON.js} +9 -93
  60. package/dist/cli/chunk-ZOQHVQON.js.map +1 -0
  61. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  62. package/dist/cli/{code-DFHSASJ4.js → code-2JIHL5M2.js} +29 -30
  63. package/dist/cli/code-2JIHL5M2.js.map +1 -0
  64. package/dist/cli/{commands-OCU42XG4.js → commands-OPT5AJNH.js} +4 -4
  65. package/dist/cli/{commit-XCQIQCYG.js → commit-KA37H6GM.js} +3 -3
  66. package/dist/cli/{desktop-ZCUG7LMF.js → desktop-5ONTRU3C.js} +20 -20
  67. package/dist/cli/devtools-HW3WDT3Q.js +0 -0
  68. package/dist/cli/{diff-66B2KWOJ.js → diff-SOIA7AKH.js} +8 -8
  69. package/dist/cli/{doctor-Y73CPPRZ.js → doctor-RCUP4XRV.js} +9 -9
  70. package/dist/cli/{events-NGZ2OJYH.js → events-6KHITNX4.js} +3 -3
  71. package/dist/cli/index.js +39 -88
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/{mcp-MPVGBBJF.js → mcp-JP5OWD6R.js} +2 -2
  74. package/dist/cli/{mcp-browse-4XOTC3FJ.js → mcp-browse-ONCJJPJN.js} +2 -2
  75. package/dist/cli/{mcp-inspect-CEMGKKAH.js → mcp-inspect-TPLHW5JA.js} +4 -4
  76. package/dist/cli/{prompt-2D7ID24X.js → prompt-RJDNCQAP.js} +3 -3
  77. package/dist/cli/{prune-sessions-OJEYYLHY.js → prune-sessions-MKEATRVL.js} +2 -2
  78. package/dist/cli/{replay-AKYQNAQJ.js → replay-4NILJG4U.js} +8 -8
  79. package/dist/cli/{run-5DPQFSP6.js → run-WFGXB4SB.js} +17 -18
  80. package/dist/cli/run-WFGXB4SB.js.map +1 -0
  81. package/dist/cli/{server-TQ2IHYQJ.js → server-5VFQP3PV.js} +13 -13
  82. package/dist/cli/{sessions-KY54NG45.js → sessions-5XDJDALO.js} +28 -14
  83. package/dist/cli/sessions-5XDJDALO.js.map +1 -0
  84. package/dist/cli/{setup-XPIOZWS7.js → setup-F6XSWLRA.js} +7 -7
  85. package/dist/cli/setup-F6XSWLRA.js.map +1 -0
  86. package/dist/cli/{stats-X2VTWKNS.js → stats-ALHBZICE.js} +6 -6
  87. package/dist/cli/update-6ITLPRDV.js +0 -0
  88. package/dist/cli/{version-7O6A5T7Q.js → version-JVRAHBMM.js} +14 -14
  89. package/dist/index.d.ts +23 -13
  90. package/dist/index.js +1112 -1090
  91. package/dist/index.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/cli/.-3G6VX5S7.js +0 -327
  94. package/dist/cli/.-6YRPB2C7.js +0 -329
  95. package/dist/cli/.-EYSVINK3.js +0 -317
  96. package/dist/cli/chat-ECK5ZGMV.js +0 -51
  97. package/dist/cli/chunk-AVFXO2EZ.js.map +0 -1
  98. package/dist/cli/chunk-IJ7JA32V.js.map +0 -1
  99. package/dist/cli/chunk-KQU2TYIL.js.map +0 -1
  100. package/dist/cli/chunk-V26WPN3J.js.map +0 -1
  101. package/dist/cli/chunk-WL6SNQ5T.js.map +0 -1
  102. package/dist/cli/chunk-XSU4QVFW.js.map +0 -1
  103. package/dist/cli/chunk-ZZYBBX5N.js.map +0 -1
  104. package/dist/cli/code-DFHSASJ4.js.map +0 -1
  105. package/dist/cli/doctor-Y73CPPRZ.js.map +0 -1
  106. package/dist/cli/prompt-2D7ID24X.js.map +0 -1
  107. package/dist/cli/run-5DPQFSP6.js.map +0 -1
  108. package/dist/cli/sessions-KY54NG45.js.map +0 -1
  109. package/dist/cli/setup-XPIOZWS7.js.map +0 -1
  110. package/dist/cli/stats-X2VTWKNS.js.map +0 -1
  111. /package/dist/cli/{acp-LGBLHBKY.js.map → acp-LKJU5DZX.js.map} +0 -0
  112. /package/dist/cli/{.-3G6VX5S7.js.map → chat-W7LAWEN6.js.map} +0 -0
  113. /package/dist/cli/{chunk-HVUZWNSP.js.map → chunk-3AAG2CUT.js.map} +0 -0
  114. /package/dist/cli/{chunk-LIR2HBQH.js.map → chunk-7LOJS3LV.js.map} +0 -0
  115. /package/dist/cli/{chunk-I4L2GTSE.js.map → chunk-7SGGXNB2.js.map} +0 -0
  116. /package/dist/cli/{chunk-CBIQWMS6.js.map → chunk-7YW6TPXK.js.map} +0 -0
  117. /package/dist/cli/{chunk-A3TSSDS2.js.map → chunk-C72TNHDE.js.map} +0 -0
  118. /package/dist/cli/{chunk-JNAQYELD.js.map → chunk-DHRVZJ2D.js.map} +0 -0
  119. /package/dist/cli/{chunk-5ACMUK4Q.js.map → chunk-E7TAHQ4A.js.map} +0 -0
  120. /package/dist/cli/{chunk-C53JQES5.js.map → chunk-EAOL43HB.js.map} +0 -0
  121. /package/dist/cli/{chunk-QJDDIK3Z.js.map → chunk-IYQ325V7.js.map} +0 -0
  122. /package/dist/cli/{chunk-4CTDEJUF.js.map → chunk-JLQDNLZF.js.map} +0 -0
  123. /package/dist/cli/{chunk-RDRC3XDT.js.map → chunk-JVFEJAJX.js.map} +0 -0
  124. /package/dist/cli/{chunk-GTZTQNX5.js.map → chunk-JVQT5IYP.js.map} +0 -0
  125. /package/dist/cli/{chunk-YY227BIQ.js.map → chunk-K3AIFMI6.js.map} +0 -0
  126. /package/dist/cli/{chunk-4HCP2UQW.js.map → chunk-NCBP5D6E.js.map} +0 -0
  127. /package/dist/cli/{chunk-HKWSPKMU.js.map → chunk-R2ASNSEO.js.map} +0 -0
  128. /package/dist/cli/{chunk-W7YGWUWU.js.map → chunk-SE7C5ZSI.js.map} +0 -0
  129. /package/dist/cli/{chunk-WK3UFQY3.js.map → chunk-TDSBASOF.js.map} +0 -0
  130. /package/dist/cli/{chunk-R3CTO2HM.js.map → chunk-WRONKNIH.js.map} +0 -0
  131. /package/dist/cli/{chunk-MJ6W5UN3.js.map → chunk-XPAUNFOL.js.map} +0 -0
  132. /package/dist/cli/{chunk-NVURFF27.js.map → chunk-YRLC2EDF.js.map} +0 -0
  133. /package/dist/cli/{commands-OCU42XG4.js.map → commands-OPT5AJNH.js.map} +0 -0
  134. /package/dist/cli/{commit-XCQIQCYG.js.map → commit-KA37H6GM.js.map} +0 -0
  135. /package/dist/cli/{desktop-ZCUG7LMF.js.map → desktop-5ONTRU3C.js.map} +0 -0
  136. /package/dist/cli/{diff-66B2KWOJ.js.map → diff-SOIA7AKH.js.map} +0 -0
  137. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-RCUP4XRV.js.map} +0 -0
  138. /package/dist/cli/{events-NGZ2OJYH.js.map → events-6KHITNX4.js.map} +0 -0
  139. /package/dist/cli/{mcp-MPVGBBJF.js.map → mcp-JP5OWD6R.js.map} +0 -0
  140. /package/dist/cli/{mcp-browse-4XOTC3FJ.js.map → mcp-browse-ONCJJPJN.js.map} +0 -0
  141. /package/dist/cli/{mcp-inspect-CEMGKKAH.js.map → mcp-inspect-TPLHW5JA.js.map} +0 -0
  142. /package/dist/cli/{.-EYSVINK3.js.map → prompt-RJDNCQAP.js.map} +0 -0
  143. /package/dist/cli/{prune-sessions-OJEYYLHY.js.map → prune-sessions-MKEATRVL.js.map} +0 -0
  144. /package/dist/cli/{replay-AKYQNAQJ.js.map → replay-4NILJG4U.js.map} +0 -0
  145. /package/dist/cli/{server-TQ2IHYQJ.js.map → server-5VFQP3PV.js.map} +0 -0
  146. /package/dist/cli/{chat-ECK5ZGMV.js.map → stats-ALHBZICE.js.map} +0 -0
  147. /package/dist/cli/{version-7O6A5T7Q.js.map → version-JVRAHBMM.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
4
  probeOllama
5
- } from "./chunk-4CTDEJUF.js";
5
+ } from "./chunk-JLQDNLZF.js";
6
6
 
7
7
  // src/index/semantic/ollama-launcher.ts
8
8
  import { spawn, spawnSync } from "child_process";
@@ -98,4 +98,4 @@ export {
98
98
  startOllamaDaemon,
99
99
  pullOllamaModel
100
100
  };
101
- //# sourceMappingURL=chunk-LIR2HBQH.js.map
101
+ //# sourceMappingURL=chunk-7LOJS3LV.js.map
@@ -13,7 +13,7 @@ import {
13
13
  TONE_ACTIVE,
14
14
  resolveThemeName,
15
15
  setActiveTheme
16
- } from "./chunk-AVFXO2EZ.js";
16
+ } from "./chunk-DGA5QYFM.js";
17
17
  import {
18
18
  __toESM
19
19
  } from "./chunk-TUK7OWJA.js";
@@ -157,4 +157,4 @@ export {
157
157
  COLOR,
158
158
  GLYPH
159
159
  };
160
- //# sourceMappingURL=chunk-I4L2GTSE.js.map
160
+ //# sourceMappingURL=chunk-7SGGXNB2.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-HNXDZGC6.js";
6
6
  import {
7
7
  preflightStdioSpec
8
- } from "./chunk-NVURFF27.js";
8
+ } from "./chunk-YRLC2EDF.js";
9
9
  import {
10
10
  ToolRegistry,
11
11
  formatSubagentResult,
@@ -16,17 +16,17 @@ import {
16
16
  registerTodoTool,
17
17
  registerWebTools,
18
18
  spawnSubagent
19
- } from "./chunk-WL6SNQ5T.js";
19
+ } from "./chunk-ZOQHVQON.js";
20
20
  import {
21
21
  DeepSeekClient
22
- } from "./chunk-V26WPN3J.js";
22
+ } from "./chunk-MIIZJD5O.js";
23
23
  import {
24
24
  bootstrapSemanticSearchInCodeMode
25
- } from "./chunk-MJ6W5UN3.js";
25
+ } from "./chunk-XPAUNFOL.js";
26
26
  import {
27
27
  JobRegistry,
28
28
  registerShellTools
29
- } from "./chunk-RDRC3XDT.js";
29
+ } from "./chunk-JVFEJAJX.js";
30
30
  import {
31
31
  SkillStore
32
32
  } from "./chunk-TEUDEGX2.js";
@@ -45,7 +45,7 @@ import {
45
45
  webSearchEndpoint,
46
46
  webSearchEngine,
47
47
  writeConfig
48
- } from "./chunk-AVFXO2EZ.js";
48
+ } from "./chunk-DGA5QYFM.js";
49
49
 
50
50
  // src/tools/scaffold.ts
51
51
  var VALID_SKILL_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
@@ -375,4 +375,4 @@ async function buildCodeToolset(opts) {
375
375
  export {
376
376
  buildCodeToolset
377
377
  };
378
- //# sourceMappingURL=chunk-CBIQWMS6.js.map
378
+ //# sourceMappingURL=chunk-7YW6TPXK.js.map
@@ -2,7 +2,7 @@
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
4
  t
5
- } from "./chunk-IJ7JA32V.js";
5
+ } from "./chunk-6VANO7KB.js";
6
6
 
7
7
  // src/hooks.ts
8
8
  import { spawn } from "child_process";
@@ -206,4 +206,4 @@ export {
206
206
  formatHookOutcomeMessage,
207
207
  runHooks
208
208
  };
209
- //# sourceMappingURL=chunk-A3TSSDS2.js.map
209
+ //# sourceMappingURL=chunk-C72TNHDE.js.map
File without changes
@@ -2290,6 +2290,69 @@ function compileFilters(cfg) {
2290
2290
  };
2291
2291
  }
2292
2292
 
2293
+ // src/qq/access.ts
2294
+ function normalizeQQOpenId(value) {
2295
+ const trimmed = value?.trim();
2296
+ return trimmed ? trimmed : void 0;
2297
+ }
2298
+ function normalizeQQAllowlist(values) {
2299
+ const list = typeof values === "string" ? values.split(/[,\s]+/) : Array.isArray(values) ? values : [];
2300
+ const seen = /* @__PURE__ */ new Set();
2301
+ const normalized = [];
2302
+ for (const raw of list) {
2303
+ const openid = normalizeQQOpenId(raw);
2304
+ if (!openid || seen.has(openid)) continue;
2305
+ seen.add(openid);
2306
+ normalized.push(openid);
2307
+ }
2308
+ return normalized.length > 0 ? normalized : void 0;
2309
+ }
2310
+ function redactQQOpenId(openid) {
2311
+ const normalized = normalizeQQOpenId(openid);
2312
+ if (!normalized) return "none";
2313
+ if (normalized.length <= 10) return normalized;
2314
+ return `${normalized.slice(0, 6)}...${normalized.slice(-4)}`;
2315
+ }
2316
+ function decideQQAccess(config, openid) {
2317
+ const candidate = normalizeQQOpenId(openid);
2318
+ if (!candidate) return { accept: false, reason: "unauthorized" };
2319
+ const ownerOpenId = normalizeQQOpenId(config.ownerOpenId);
2320
+ const allowlist = normalizeQQAllowlist(config.allowlist) ?? [];
2321
+ const runtimeBoundOpenId = normalizeQQOpenId(config.runtimeBoundOpenId);
2322
+ if (ownerOpenId && candidate === ownerOpenId) {
2323
+ return { accept: true, mode: "owner", bindRuntime: false };
2324
+ }
2325
+ if (allowlist.includes(candidate)) {
2326
+ return { accept: true, mode: "allowlist", bindRuntime: false };
2327
+ }
2328
+ if (ownerOpenId || allowlist.length > 0) {
2329
+ return { accept: false, reason: "unauthorized" };
2330
+ }
2331
+ if (runtimeBoundOpenId) {
2332
+ if (candidate === runtimeBoundOpenId) {
2333
+ return { accept: true, mode: "runtime", bindRuntime: false };
2334
+ }
2335
+ return { accept: false, reason: "unauthorized" };
2336
+ }
2337
+ return { accept: true, mode: "open", bindRuntime: true };
2338
+ }
2339
+ function describeQQAccess(config) {
2340
+ const ownerOpenId = normalizeQQOpenId(config.ownerOpenId);
2341
+ const allowlist = normalizeQQAllowlist(config.allowlist) ?? [];
2342
+ const runtimeBoundOpenId = normalizeQQOpenId(config.runtimeBoundOpenId);
2343
+ if (ownerOpenId) {
2344
+ const suffix = allowlist.length > 0 ? `, allowlist ${allowlist.length}` : "";
2345
+ return `owner ${redactQQOpenId(ownerOpenId)}${suffix}`;
2346
+ }
2347
+ if (allowlist.length > 0) {
2348
+ return `allowlist ${allowlist.length}`;
2349
+ }
2350
+ if (runtimeBoundOpenId) {
2351
+ return `first-sender (runtime only, ${redactQQOpenId(runtimeBoundOpenId)})`;
2352
+ }
2353
+ return "open (unbound)";
2354
+ }
2355
+
2293
2356
  // src/config.ts
2294
2357
  var BUILTIN_TYPE_DOCS = {
2295
2358
  user: "role / skills / preferences",
@@ -2471,6 +2534,28 @@ function loadBaseUrl(path = defaultConfigPath()) {
2471
2534
  if (process.env.DEEPSEEK_BASE_URL) return process.env.DEEPSEEK_BASE_URL;
2472
2535
  return readConfig(path).baseUrl;
2473
2536
  }
2537
+ function isNonNegativeNumber(value) {
2538
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
2539
+ }
2540
+ function loadPricingOverride(path = defaultConfigPath()) {
2541
+ const raw = readConfig(path).pricingOverride;
2542
+ if (!isPlainObject(raw)) return {};
2543
+ const result = {};
2544
+ for (const [model, value] of Object.entries(raw)) {
2545
+ if (!isPlainObject(value)) continue;
2546
+ const pricing = {};
2547
+ if (isNonNegativeNumber(value.inputCacheHit)) pricing.inputCacheHit = value.inputCacheHit;
2548
+ if (isNonNegativeNumber(value.inputCacheMiss)) pricing.inputCacheMiss = value.inputCacheMiss;
2549
+ if (isNonNegativeNumber(value.output)) pricing.output = value.output;
2550
+ if (Object.keys(pricing).length > 0) result[model] = pricing;
2551
+ }
2552
+ return result;
2553
+ }
2554
+ function loadRateLimit(path = defaultConfigPath()) {
2555
+ const rpm = readConfig(path).rateLimit?.rpm;
2556
+ if (typeof rpm !== "number" || !Number.isInteger(rpm) || rpm <= 0) return void 0;
2557
+ return { rpm };
2558
+ }
2474
2559
  function saveBaseUrl(url, path = defaultConfigPath()) {
2475
2560
  const cfg = readConfig(path);
2476
2561
  const trimmed = url.trim();
@@ -2883,26 +2968,39 @@ function isPlainObject(value) {
2883
2968
  }
2884
2969
  function loadQQConfig(path = defaultConfigPath()) {
2885
2970
  const envSandbox = process.env.QQ_SANDBOX;
2971
+ const envAllowlist = normalizeQQAllowlist(process.env.QQ_ALLOWLIST);
2886
2972
  const fromEnv = {
2887
2973
  appId: process.env.QQ_APPID,
2888
2974
  appSecret: process.env.QQ_SECRET,
2889
- sandbox: envSandbox === "1" ? true : envSandbox === "0" ? false : void 0
2975
+ sandbox: envSandbox === "1" ? true : envSandbox === "0" ? false : void 0,
2976
+ ownerOpenId: normalizeQQOpenId(process.env.QQ_OWNER_OPENID),
2977
+ allowlist: envAllowlist
2890
2978
  };
2891
2979
  const fromCfg = readConfig(path).qq ?? {};
2980
+ const ownerOpenId = fromEnv.ownerOpenId ?? normalizeQQOpenId(fromCfg.ownerOpenId);
2981
+ const allowlist = normalizeQQAllowlist(fromEnv.allowlist ?? fromCfg.allowlist)?.filter(
2982
+ (openid) => openid !== ownerOpenId
2983
+ );
2892
2984
  return {
2893
2985
  appId: fromEnv.appId ?? fromCfg.appId,
2894
2986
  appSecret: fromEnv.appSecret ?? fromCfg.appSecret,
2895
2987
  sandbox: fromEnv.sandbox ?? fromCfg.sandbox ?? false,
2896
- enabled: fromCfg.enabled === true
2988
+ enabled: fromCfg.enabled === true,
2989
+ ownerOpenId,
2990
+ allowlist
2897
2991
  };
2898
2992
  }
2899
2993
  function saveQQConfig(cfg, path = defaultConfigPath()) {
2900
2994
  const rootCfg = readConfig(path);
2995
+ const ownerOpenId = normalizeQQOpenId(cfg.ownerOpenId);
2996
+ const allowlist = normalizeQQAllowlist(cfg.allowlist)?.filter((openid) => openid !== ownerOpenId);
2901
2997
  rootCfg.qq = {
2902
2998
  appId: cfg.appId,
2903
2999
  appSecret: cfg.appSecret,
2904
3000
  sandbox: cfg.sandbox,
2905
- enabled: cfg.enabled
3001
+ enabled: cfg.enabled,
3002
+ ownerOpenId,
3003
+ allowlist
2906
3004
  };
2907
3005
  writeConfig(rootCfg, path);
2908
3006
  }
@@ -2932,6 +3030,9 @@ export {
2932
3030
  overlayMatchedSpec,
2933
3031
  specToRaw,
2934
3032
  parseMcpSpec,
3033
+ redactQQOpenId,
3034
+ decideQQAccess,
3035
+ describeQQAccess,
2935
3036
  loadMemoryTypeRegistry,
2936
3037
  memoryTypeDefaults,
2937
3038
  loadMetasoApiKey,
@@ -2943,6 +3044,8 @@ export {
2943
3044
  saveLanguage,
2944
3045
  loadApiKey,
2945
3046
  loadBaseUrl,
3047
+ loadPricingOverride,
3048
+ loadRateLimit,
2946
3049
  saveBaseUrl,
2947
3050
  normalizeSkillPathEntries,
2948
3051
  normalizeSkillPaths,
@@ -2993,4 +3096,4 @@ export {
2993
3096
  loadQQConfig,
2994
3097
  saveQQConfig
2995
3098
  };
2996
- //# sourceMappingURL=chunk-AVFXO2EZ.js.map
3099
+ //# sourceMappingURL=chunk-DGA5QYFM.js.map