@jsonstudio/rcc 0.89.683 → 0.89.912

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 (215) hide show
  1. package/README.md +44 -0
  2. package/dist/build-info.js +2 -2
  3. package/dist/cli.js +164 -116
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/anthropic/anthropic-protocol-client.js +42 -1
  6. package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
  7. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +4 -1
  8. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  9. package/dist/commands/camoufox-backfill.d.ts +2 -0
  10. package/dist/commands/camoufox-backfill.js +33 -0
  11. package/dist/commands/camoufox-backfill.js.map +1 -0
  12. package/dist/commands/camoufox-fp.d.ts +2 -0
  13. package/dist/commands/camoufox-fp.js +86 -0
  14. package/dist/commands/camoufox-fp.js.map +1 -0
  15. package/dist/commands/oauth.d.ts +2 -0
  16. package/dist/commands/oauth.js +170 -0
  17. package/dist/commands/oauth.js.map +1 -0
  18. package/dist/commands/provider-update.js +439 -2
  19. package/dist/commands/provider-update.js.map +1 -1
  20. package/dist/commands/quota-status.d.ts +2 -0
  21. package/dist/commands/quota-status.js +80 -0
  22. package/dist/commands/quota-status.js.map +1 -0
  23. package/dist/commands/token-daemon.js +12 -1
  24. package/dist/commands/token-daemon.js.map +1 -1
  25. package/dist/config/provider-v2-loader.d.ts +16 -0
  26. package/dist/config/provider-v2-loader.js +84 -0
  27. package/dist/config/provider-v2-loader.js.map +1 -0
  28. package/dist/config/routecodex-config-loader.js +27 -4
  29. package/dist/config/routecodex-config-loader.js.map +1 -1
  30. package/dist/config/system-prompts/codex-cli.txt +1 -0
  31. package/dist/config/virtual-router-builder.d.ts +9 -0
  32. package/dist/config/virtual-router-builder.js +34 -0
  33. package/dist/config/virtual-router-builder.js.map +1 -0
  34. package/dist/config/virtual-router-types.d.ts +25 -0
  35. package/dist/config/virtual-router-types.js +30 -0
  36. package/dist/config/virtual-router-types.js.map +1 -0
  37. package/dist/manager/index.d.ts +10 -0
  38. package/dist/manager/index.js +27 -0
  39. package/dist/manager/index.js.map +1 -0
  40. package/dist/manager/modules/health/index.d.ts +22 -0
  41. package/dist/manager/modules/health/index.js +82 -0
  42. package/dist/manager/modules/health/index.js.map +1 -0
  43. package/dist/manager/modules/quota/index.d.ts +57 -0
  44. package/dist/manager/modules/quota/index.js +426 -0
  45. package/dist/manager/modules/quota/index.js.map +1 -0
  46. package/dist/manager/modules/routing/index.d.ts +17 -0
  47. package/dist/manager/modules/routing/index.js +61 -0
  48. package/dist/manager/modules/routing/index.js.map +1 -0
  49. package/dist/manager/modules/token/index.d.ts +10 -0
  50. package/dist/manager/modules/token/index.js +58 -0
  51. package/dist/manager/modules/token/index.js.map +1 -0
  52. package/dist/manager/storage/base-store.d.ts +6 -0
  53. package/dist/manager/storage/base-store.js +2 -0
  54. package/dist/manager/storage/base-store.js.map +1 -0
  55. package/dist/manager/storage/file-store.d.ts +25 -0
  56. package/dist/manager/storage/file-store.js +117 -0
  57. package/dist/manager/storage/file-store.js.map +1 -0
  58. package/dist/manager/types.d.ts +9 -0
  59. package/dist/manager/types.js +2 -0
  60. package/dist/manager/types.js.map +1 -0
  61. package/dist/message-center/index.d.ts +5 -0
  62. package/dist/message-center/index.js +6 -0
  63. package/dist/message-center/index.js.map +1 -0
  64. package/dist/message-center/message-center.d.ts +93 -0
  65. package/dist/message-center/message-center.js +189 -0
  66. package/dist/message-center/message-center.js.map +1 -0
  67. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -0
  68. package/dist/providers/auth/antigravity-userinfo-helper.js +102 -0
  69. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
  70. package/dist/providers/auth/iflow-cookie-auth.d.ts +27 -0
  71. package/dist/providers/auth/iflow-cookie-auth.js +209 -0
  72. package/dist/providers/auth/iflow-cookie-auth.js.map +1 -0
  73. package/dist/providers/auth/oauth-lifecycle.js +29 -22
  74. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  75. package/dist/providers/auth/token-scanner/index.js +16 -1
  76. package/dist/providers/auth/token-scanner/index.js.map +1 -1
  77. package/dist/providers/core/config/camoufox-launcher.d.ts +16 -0
  78. package/dist/providers/core/config/camoufox-launcher.js +314 -0
  79. package/dist/providers/core/config/camoufox-launcher.js.map +1 -0
  80. package/dist/providers/core/config/oauth-flows.d.ts +9 -0
  81. package/dist/providers/core/config/oauth-flows.js +50 -19
  82. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  83. package/dist/providers/core/config/provider-oauth-configs.d.ts +6 -0
  84. package/dist/providers/core/config/provider-oauth-configs.js +12 -0
  85. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  86. package/dist/providers/core/config/service-profiles.js +26 -3
  87. package/dist/providers/core/config/service-profiles.js.map +1 -1
  88. package/dist/providers/core/runtime/antigravity-quota-client.d.ts +10 -0
  89. package/dist/providers/core/runtime/antigravity-quota-client.js +88 -0
  90. package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -0
  91. package/dist/providers/core/runtime/base-provider.d.ts +2 -1
  92. package/dist/providers/core/runtime/base-provider.js +93 -34
  93. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  94. package/dist/providers/core/runtime/gemini-cli-http-provider.js +42 -10
  95. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  96. package/dist/providers/core/runtime/http-request-executor.js +24 -0
  97. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  98. package/dist/providers/core/runtime/http-transport-provider.d.ts +0 -3
  99. package/dist/providers/core/runtime/http-transport-provider.js +32 -136
  100. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  101. package/dist/providers/core/runtime/provider-error-classifier.js +18 -10
  102. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  103. package/dist/providers/core/runtime/rate-limit-manager.d.ts +6 -0
  104. package/dist/providers/core/runtime/rate-limit-manager.js +23 -0
  105. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
  106. package/dist/providers/core/runtime/responses-provider.js +17 -19
  107. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  108. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -0
  109. package/dist/providers/core/strategies/oauth-auth-code-flow.js +3 -2
  110. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  111. package/dist/providers/core/strategies/oauth-device-flow.d.ts +1 -0
  112. package/dist/providers/core/strategies/oauth-device-flow.js +3 -2
  113. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  114. package/dist/providers/core/strategies/oauth-hybrid-flow.d.ts +1 -0
  115. package/dist/providers/core/strategies/oauth-hybrid-flow.js +3 -2
  116. package/dist/providers/core/strategies/oauth-hybrid-flow.js.map +1 -1
  117. package/dist/providers/core/utils/http-client.js +43 -1
  118. package/dist/providers/core/utils/http-client.js.map +1 -1
  119. package/dist/providers/mock/mock-provider-runtime.js +4 -4
  120. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  121. package/dist/providers/profile/provider-profile-loader.js +13 -1
  122. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  123. package/dist/providers/profile/provider-profile.d.ts +5 -0
  124. package/dist/scripts/camoufox/gen-fingerprint-env.py +171 -0
  125. package/dist/scripts/camoufox/launch-auth.mjs +617 -0
  126. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.d.ts +3 -0
  127. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +138 -0
  128. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -0
  129. package/dist/server/runtime/http-server/daemon-admin/providers-handler.d.ts +3 -0
  130. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +166 -0
  131. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -0
  132. package/dist/server/runtime/http-server/daemon-admin/quota-handler.d.ts +3 -0
  133. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +109 -0
  134. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -0
  135. package/dist/server/runtime/http-server/daemon-admin/status-handler.d.ts +3 -0
  136. package/dist/server/runtime/http-server/daemon-admin/status-handler.js +43 -0
  137. package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -0
  138. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +19 -0
  139. package/dist/server/runtime/http-server/daemon-admin-routes.js +27 -0
  140. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -0
  141. package/dist/server/runtime/http-server/executor-provider.d.ts +1 -0
  142. package/dist/server/runtime/http-server/executor-provider.js +26 -0
  143. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  144. package/dist/server/runtime/http-server/executor-response.d.ts +16 -0
  145. package/dist/server/runtime/http-server/executor-response.js +164 -0
  146. package/dist/server/runtime/http-server/executor-response.js.map +1 -0
  147. package/dist/server/runtime/http-server/index.d.ts +6 -0
  148. package/dist/server/runtime/http-server/index.js +121 -53
  149. package/dist/server/runtime/http-server/index.js.map +1 -1
  150. package/dist/server/runtime/http-server/request-executor.d.ts +3 -0
  151. package/dist/server/runtime/http-server/request-executor.js +73 -21
  152. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  153. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  154. package/dist/server/runtime/http-server/routes.js +45 -1
  155. package/dist/server/runtime/http-server/routes.js.map +1 -1
  156. package/dist/server/runtime/http-server/types.d.ts +1 -0
  157. package/dist/server/utils/client-connection-state.d.ts +8 -0
  158. package/dist/server/utils/client-connection-state.js +52 -0
  159. package/dist/server/utils/client-connection-state.js.map +1 -0
  160. package/dist/server/utils/request-id-manager.js +21 -3
  161. package/dist/server/utils/request-id-manager.js.map +1 -1
  162. package/dist/token-daemon/history-store.d.ts +2 -0
  163. package/dist/token-daemon/history-store.js +6 -2
  164. package/dist/token-daemon/history-store.js.map +1 -1
  165. package/dist/token-daemon/index.js +36 -5
  166. package/dist/token-daemon/index.js.map +1 -1
  167. package/dist/token-daemon/leader-lock.d.ts +11 -0
  168. package/dist/token-daemon/leader-lock.js +79 -0
  169. package/dist/token-daemon/leader-lock.js.map +1 -0
  170. package/dist/token-daemon/message-bus-integrator.d.ts +98 -0
  171. package/dist/token-daemon/message-bus-integrator.js +144 -0
  172. package/dist/token-daemon/message-bus-integrator.js.map +1 -0
  173. package/dist/token-daemon/provider-registry.d.ts +22 -0
  174. package/dist/token-daemon/provider-registry.js +201 -0
  175. package/dist/token-daemon/provider-registry.js.map +1 -0
  176. package/dist/token-daemon/token-daemon.d.ts +8 -0
  177. package/dist/token-daemon/token-daemon.js +196 -11
  178. package/dist/token-daemon/token-daemon.js.map +1 -1
  179. package/dist/token-portal/local-token-portal.d.ts +1 -0
  180. package/dist/token-portal/local-token-portal.js +18 -0
  181. package/dist/token-portal/local-token-portal.js.map +1 -1
  182. package/dist/token-portal/render.js +1 -0
  183. package/dist/token-portal/render.js.map +1 -1
  184. package/dist/tools/error-log.d.ts +31 -0
  185. package/dist/tools/error-log.js +117 -0
  186. package/dist/tools/error-log.js.map +1 -0
  187. package/dist/tools/stats-request-events.d.ts +2 -0
  188. package/dist/tools/stats-request-events.js +16 -0
  189. package/dist/tools/stats-request-events.js.map +1 -0
  190. package/dist/tools/stats-usage.d.ts +31 -0
  191. package/dist/tools/stats-usage.js +206 -0
  192. package/dist/tools/stats-usage.js.map +1 -0
  193. package/package.json +9 -4
  194. package/scripts/analyze-codex-error-failures.mjs +111 -0
  195. package/scripts/analyze-usage-estimate.mjs +240 -0
  196. package/scripts/camoufox/gen-fingerprint-env.py +171 -0
  197. package/scripts/camoufox/launch-auth.mjs +617 -0
  198. package/scripts/classify-codex-samples.mjs +251 -0
  199. package/scripts/cleanup-codex-error-samples.mjs +88 -0
  200. package/scripts/compare-codex-rccx.mjs +268 -0
  201. package/scripts/copy-compat-assets.mjs +18 -0
  202. package/scripts/install-release.sh +1 -1
  203. package/scripts/local-replay-openai-response.mjs +1 -2
  204. package/scripts/pack-mode.mjs +16 -6
  205. package/scripts/replay-codex-sample.mjs +24 -2
  206. package/scripts/responses-compare-server.mjs +119 -0
  207. package/scripts/tests/apply-patch-loop.mjs +266 -7
  208. package/scripts/tests/exec-command-loop.mjs +165 -0
  209. package/scripts/tool-classification-report.ts +281 -0
  210. package/scripts/verification/samples/openai-chat-list-local-files.json +1 -1
  211. package/scripts/verify-apply-patch.mjs +28 -17
  212. package/scripts/verify-codex-error-samples.mjs +102 -0
  213. package/scripts/verify-e2e-toolcall.mjs +71 -4
  214. package/scripts/virtual-router-shadow-v2-real.mjs +143 -0
  215. package/scripts/virtual-router-shadow-v2.mjs +122 -0
@@ -0,0 +1,10 @@
1
+ import type { ManagerContext, ManagerModule } from '../../types.js';
2
+ export declare class TokenManagerModule implements ManagerModule {
3
+ readonly id = "token";
4
+ private daemon;
5
+ private ownerId;
6
+ private isLeader;
7
+ init(context: ManagerContext): Promise<void>;
8
+ start(): Promise<void>;
9
+ stop(): Promise<void>;
10
+ }
@@ -0,0 +1,58 @@
1
+ import { TokenDaemon } from '../../../token-daemon/token-daemon.js';
2
+ import { releaseTokenManagerLeader, tryAcquireTokenManagerLeader } from '../../../token-daemon/leader-lock.js';
3
+ export class TokenManagerModule {
4
+ id = 'token';
5
+ daemon = null;
6
+ ownerId = null;
7
+ isLeader = false;
8
+ async init(context) {
9
+ // 使用 serverId 构造稳定 ownerId,便于区分不同服务器实例。
10
+ this.ownerId = `server:${context.serverId}`;
11
+ }
12
+ async start() {
13
+ if (this.daemon || !this.ownerId) {
14
+ return;
15
+ }
16
+ const { isLeader, leader } = await tryAcquireTokenManagerLeader(this.ownerId);
17
+ if (!isLeader) {
18
+ const owner = leader?.ownerId ?? 'unknown';
19
+ const pid = leader?.pid ?? 'unknown';
20
+ // 仅日志提示,避免重复刷新同一批 token。
21
+ // eslint-disable-next-line no-console
22
+ console.log(`[TokenManagerModule] Token manager leader already active (owner=${owner}, pid=${pid}); skipping TokenDaemon in this process.`);
23
+ this.isLeader = false;
24
+ return;
25
+ }
26
+ const intervalSec = readPositiveNumberFromEnv('ROUTECODEX_TOKEN_INTERVAL_SEC', 60);
27
+ // 默认不提前刷新;仅在 token 已过期时刷新。
28
+ const aheadMinutes = readPositiveNumberFromEnv('ROUTECODEX_TOKEN_REFRESH_AHEAD_MIN', 0);
29
+ this.daemon = new TokenDaemon({
30
+ intervalMs: intervalSec * 1000,
31
+ refreshAheadMinutes: aheadMinutes
32
+ });
33
+ this.isLeader = true;
34
+ await this.daemon.start();
35
+ }
36
+ async stop() {
37
+ if (this.daemon) {
38
+ this.daemon.stop();
39
+ this.daemon = null;
40
+ }
41
+ if (this.isLeader && this.ownerId) {
42
+ await releaseTokenManagerLeader(this.ownerId);
43
+ this.isLeader = false;
44
+ }
45
+ }
46
+ }
47
+ function readPositiveNumberFromEnv(name, fallback) {
48
+ const raw = process.env[name];
49
+ if (!raw) {
50
+ return fallback;
51
+ }
52
+ const parsed = Number(raw);
53
+ if (!Number.isFinite(parsed) || parsed <= 0) {
54
+ return fallback;
55
+ }
56
+ return parsed;
57
+ }
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/manager/modules/token/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,sCAAsC,CAAC;AAE9C,MAAM,OAAO,kBAAkB;IACpB,EAAE,GAAG,OAAO,CAAC;IACd,MAAM,GAAuB,IAAI,CAAC;IAClC,OAAO,GAAkB,IAAI,CAAC;IAC9B,QAAQ,GAAY,KAAK,CAAC;IAElC,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,wCAAwC;QACxC,IAAI,CAAC,OAAO,GAAG,UAAU,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;YACrC,yBAAyB;YACzB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CACT,mEAAmE,KAAK,SAAS,GAAG,0CAA0C,CAC/H,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,yBAAyB,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QACnF,2BAA2B;QAC3B,MAAM,YAAY,GAAG,yBAAyB,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC;YAC5B,UAAU,EAAE,WAAW,GAAG,IAAI;YAC9B,mBAAmB,EAAE,YAAY;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,SAAS,yBAAyB,CAAC,IAAY,EAAE,QAAgB;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface StateStore<TSnapshot, TEvent = unknown> {
2
+ load(): Promise<TSnapshot | null>;
3
+ save(snapshot: TSnapshot): Promise<void>;
4
+ append?(event: TEvent): Promise<void>;
5
+ compact?(): Promise<void>;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-store.js","sourceRoot":"","sources":["../../../src/manager/storage/base-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { StateStore } from './base-store.js';
2
+ export interface FileStoreOptions {
3
+ filePath: string;
4
+ /**
5
+ * 最大事件保留时长(毫秒)。超出该时间窗口的旧事件会在 compact 时被丢弃。
6
+ * 若未设置或 <=0,则不按时间裁剪。
7
+ */
8
+ maxAgeMs?: number;
9
+ /**
10
+ * 单个文件中最多保留的事件条数(不含最新快照)。
11
+ * 若未设置或 <=0,则不按数量裁剪。
12
+ */
13
+ maxEvents?: number;
14
+ }
15
+ export declare class JsonlFileStore<TSnapshot, TEvent = unknown> implements StateStore<TSnapshot, TEvent> {
16
+ private readonly filePath;
17
+ private readonly maxAgeMs;
18
+ private readonly maxEvents;
19
+ constructor(options: FileStoreOptions);
20
+ load(): Promise<TSnapshot | null>;
21
+ save(snapshot: TSnapshot): Promise<void>;
22
+ append(event: TEvent): Promise<void>;
23
+ compact(): Promise<void>;
24
+ private appendLine;
25
+ }
@@ -0,0 +1,117 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export class JsonlFileStore {
4
+ filePath;
5
+ maxAgeMs;
6
+ maxEvents;
7
+ constructor(options) {
8
+ this.filePath = options.filePath;
9
+ this.maxAgeMs = typeof options.maxAgeMs === 'number' && options.maxAgeMs > 0 ? options.maxAgeMs : undefined;
10
+ this.maxEvents = typeof options.maxEvents === 'number' && options.maxEvents > 0 ? options.maxEvents : undefined;
11
+ }
12
+ async load() {
13
+ try {
14
+ const raw = await fs.readFile(this.filePath, 'utf8');
15
+ if (!raw.trim()) {
16
+ return null;
17
+ }
18
+ const lines = raw.split(/\r?\n/).filter((line) => line.trim().length > 0);
19
+ for (let idx = lines.length - 1; idx >= 0; idx -= 1) {
20
+ const line = lines[idx];
21
+ try {
22
+ const parsed = JSON.parse(line);
23
+ if (parsed && parsed.kind === 'snapshot' && parsed.snapshot !== undefined) {
24
+ return parsed.snapshot;
25
+ }
26
+ }
27
+ catch {
28
+ // ignore parse errors for individual lines
29
+ }
30
+ }
31
+ return null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ async save(snapshot) {
38
+ const envelope = {
39
+ kind: 'snapshot',
40
+ timestamp: Date.now(),
41
+ snapshot
42
+ };
43
+ await this.appendLine(envelope);
44
+ }
45
+ async append(event) {
46
+ const envelope = {
47
+ kind: 'event',
48
+ timestamp: Date.now(),
49
+ event
50
+ };
51
+ await this.appendLine(envelope);
52
+ }
53
+ async compact() {
54
+ try {
55
+ const raw = await fs.readFile(this.filePath, 'utf8');
56
+ const lines = raw
57
+ .split(/\r?\n/)
58
+ .map((line) => line.trim())
59
+ .filter((line) => line.length > 0);
60
+ if (!lines.length) {
61
+ return;
62
+ }
63
+ const envelopes = [];
64
+ for (const line of lines) {
65
+ try {
66
+ const parsed = JSON.parse(line);
67
+ if (parsed && typeof parsed.timestamp === 'number') {
68
+ envelopes.push(parsed);
69
+ }
70
+ }
71
+ catch {
72
+ // 忽略单行解析错误
73
+ }
74
+ }
75
+ if (!envelopes.length) {
76
+ return;
77
+ }
78
+ // 保留最后一个快照
79
+ const snapshots = envelopes.filter((entry) => entry.kind === 'snapshot');
80
+ const lastSnapshot = snapshots.length ? snapshots[snapshots.length - 1] : undefined;
81
+ // 事件按时间与数量窗口裁剪
82
+ const now = Date.now();
83
+ let events = envelopes.filter((entry) => entry.kind === 'event');
84
+ if (this.maxAgeMs) {
85
+ const cutoff = now - this.maxAgeMs;
86
+ events = events.filter((entry) => entry.timestamp >= cutoff);
87
+ }
88
+ if (this.maxEvents && events.length > this.maxEvents) {
89
+ events = events.slice(-this.maxEvents);
90
+ }
91
+ const next = [];
92
+ if (lastSnapshot) {
93
+ next.push(lastSnapshot);
94
+ }
95
+ next.push(...events);
96
+ const dir = path.dirname(this.filePath);
97
+ await fs.mkdir(dir, { recursive: true });
98
+ const payload = next.map((entry) => JSON.stringify(entry)).join('\n') + '\n';
99
+ await fs.writeFile(this.filePath, payload, 'utf8');
100
+ }
101
+ catch {
102
+ // 压缩失败不影响主流程
103
+ }
104
+ }
105
+ async appendLine(payload) {
106
+ try {
107
+ const dir = path.dirname(this.filePath);
108
+ await fs.mkdir(dir, { recursive: true });
109
+ const line = `${JSON.stringify(payload)}\n`;
110
+ await fs.appendFile(this.filePath, line, 'utf8');
111
+ }
112
+ catch {
113
+ // 持久化失败不应影响主流程;吞掉错误。
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../../src/manager/storage/file-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAqB7B,MAAM,OAAO,cAAc;IAGR,QAAQ,CAAS;IACjB,QAAQ,CAAqB;IAC7B,SAAS,CAAqB;IAE/C,YAAY,OAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5G,IAAI,CAAC,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAClH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1E,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqC,CAAC;oBACpE,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC1E,OAAO,MAAM,CAAC,QAAQ,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2CAA2C;gBAC7C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAmB;QAC5B,MAAM,QAAQ,GAAqC;YACjD,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ;SACT,CAAC;QACF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,QAAQ,GAAqC;YACjD,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK;SACN,CAAC;QACF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,GAAG;iBACd,KAAK,CAAC,OAAO,CAAC;iBACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAuC,EAAE,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqC,CAAC;oBACpE,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACnD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,WAAW;gBACb,CAAC;YACH,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,WAAW;YACX,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpF,eAAe;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAE9D,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACnC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACrD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,IAAI,GAAuC,EAAE,CAAC;YACpD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAErB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAyC;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5C,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export interface ManagerContext {
2
+ serverId: string;
3
+ }
4
+ export interface ManagerModule {
5
+ id: string;
6
+ init(context: ManagerContext): Promise<void> | void;
7
+ start(): Promise<void> | void;
8
+ stop(): Promise<void> | void;
9
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * MessageCenter Index
3
+ * 导出 MessageCenter 相关类型和工具
4
+ */
5
+ export { MessageCenter, type MessageHandler, type Topic, type TopicPattern, type Subscription, type PublishOptions, type MessageCenterOptions } from './message-center.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MessageCenter Index
3
+ * 导出 MessageCenter 相关类型和工具
4
+ */
5
+ export { MessageCenter } from './message-center.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/message-center/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAyH,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MessageCenter - 主题订阅与消息路由系统
3
+ *
4
+ * 提供发布/订阅模式的消息总线,支持主题通配符、
5
+ * 消息过滤、订阅者隔离等功能
6
+ */
7
+ export type Topic = string;
8
+ export type TopicPattern = string;
9
+ export type MessageHandler<T = unknown> = (message: T, topic: string) => void | Promise<void>;
10
+ export interface Subscription<T = unknown> {
11
+ id: string;
12
+ pattern: TopicPattern;
13
+ handler: MessageHandler<T>;
14
+ once?: boolean;
15
+ }
16
+ export interface PublishOptions {
17
+ /**
18
+ * 是否异步执行订阅者回调
19
+ */
20
+ async?: boolean;
21
+ /**
22
+ * 订阅者执行超时时间(毫秒)
23
+ */
24
+ timeout?: number;
25
+ }
26
+ export interface MessageCenterOptions {
27
+ /**
28
+ * 是否启用调试日志
29
+ */
30
+ debug?: boolean;
31
+ /**
32
+ * 订阅者默认超时时间(毫秒)
33
+ */
34
+ defaultHandlerTimeout?: number;
35
+ }
36
+ export declare class MessageCenter {
37
+ private subscriptions;
38
+ private subscriptionIdCounter;
39
+ private readonly options;
40
+ private readonly debug;
41
+ constructor(options?: Partial<MessageCenterOptions>);
42
+ /**
43
+ * 发布消息到指定主题
44
+ */
45
+ publish<T = unknown>(topic: Topic, message: T, options?: PublishOptions): Promise<void>;
46
+ /**
47
+ * 订阅主题(支持通配符)
48
+ *
49
+ * 通配符规则:
50
+ * - `*` 匹配所有主题
51
+ * - `foo:*` 匹配 `foo:` 开头的所有主题
52
+ * - `foo.bar` 精确匹配 `foo.bar`
53
+ */
54
+ subscribe<T = unknown>(pattern: TopicPattern, handler: MessageHandler<T>, options?: {
55
+ once?: boolean;
56
+ }): string;
57
+ /**
58
+ * 取消订阅
59
+ */
60
+ unsubscribe(subscriptionId: string): boolean;
61
+ /**
62
+ * 取消指定模式的所有订阅
63
+ */
64
+ unsubscribeByPattern(pattern: TopicPattern): number;
65
+ /**
66
+ * 获取所有订阅信息(用于调试)
67
+ */
68
+ getSubscriptions(): Array<{
69
+ topic: Topic;
70
+ count: number;
71
+ patterns: TopicPattern[];
72
+ }>;
73
+ /**
74
+ * 清除所有订阅
75
+ */
76
+ clear(): void;
77
+ /**
78
+ * 查找匹配指定主题的订阅
79
+ */
80
+ private findSubscriptions;
81
+ /**
82
+ * 判断订阅模式是否匹配目标主题
83
+ */
84
+ private matchPattern;
85
+ /**
86
+ * 解析主题模式
87
+ */
88
+ private parsePattern;
89
+ /**
90
+ * 生成订阅 ID
91
+ */
92
+ private generateSubscriptionId;
93
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * MessageCenter - 主题订阅与消息路由系统
3
+ *
4
+ * 提供发布/订阅模式的消息总线,支持主题通配符、
5
+ * 消息过滤、订阅者隔离等功能
6
+ */
7
+ export class MessageCenter {
8
+ subscriptions = new Map();
9
+ subscriptionIdCounter = 0;
10
+ options;
11
+ debug;
12
+ constructor(options) {
13
+ this.options = {
14
+ debug: false,
15
+ defaultHandlerTimeout: 5000,
16
+ ...options
17
+ };
18
+ this.debug = (msg) => {
19
+ if (this.options.debug) {
20
+ console.log(`[MessageCenter] ${msg}`);
21
+ }
22
+ };
23
+ }
24
+ /**
25
+ * 发布消息到指定主题
26
+ */
27
+ async publish(topic, message, options) {
28
+ this.debug(`Publishing to topic: ${topic}`);
29
+ const subscriptions = this.findSubscriptions(topic);
30
+ if (subscriptions.size === 0) {
31
+ this.debug(`No subscribers for topic: ${topic}`);
32
+ return;
33
+ }
34
+ const { async: isAsync, timeout = this.options.defaultHandlerTimeout } = options || {};
35
+ const results = [];
36
+ for (const subscription of subscriptions) {
37
+ try {
38
+ const handlerPromise = subscription.handler(message, subscription.pattern);
39
+ const wrappedPromise = isAsync
40
+ ? handlerPromise
41
+ : Promise.resolve(handlerPromise);
42
+ const timeoutPromise = new Promise((_, reject) => {
43
+ setTimeout(() => reject(new Error(`Handler timeout after ${timeout}ms`)), timeout);
44
+ });
45
+ const result = Promise.race([wrappedPromise, timeoutPromise]);
46
+ results.push(result);
47
+ if (subscription.once) {
48
+ this.unsubscribe(subscription.id);
49
+ }
50
+ }
51
+ catch (error) {
52
+ this.debug(`Handler error for topic ${subscription.pattern}: ${error instanceof Error ? error.message : String(error)}`);
53
+ }
54
+ }
55
+ Promise.all(results);
56
+ this.debug(`Published to ${subscriptions.size} subscribers for topic: ${topic}`);
57
+ }
58
+ /**
59
+ * 订阅主题(支持通配符)
60
+ *
61
+ * 通配符规则:
62
+ * - `*` 匹配所有主题
63
+ * - `foo:*` 匹配 `foo:` 开头的所有主题
64
+ * - `foo.bar` 精确匹配 `foo.bar`
65
+ */
66
+ subscribe(pattern, handler, options) {
67
+ const subscription = {
68
+ id: this.generateSubscriptionId(),
69
+ pattern,
70
+ handler,
71
+ once: options?.once
72
+ };
73
+ const { topic, isWildcard } = this.parsePattern(pattern);
74
+ if (!this.subscriptions.has(topic)) {
75
+ this.subscriptions.set(topic, new Set());
76
+ }
77
+ this.subscriptions.get(topic).add(subscription);
78
+ this.debug(`Subscribed to pattern: ${pattern} (topic: ${topic}, wildcard: ${isWildcard})`);
79
+ return subscription.id;
80
+ }
81
+ /**
82
+ * 取消订阅
83
+ */
84
+ unsubscribe(subscriptionId) {
85
+ for (const [topic, subscriptions] of this.subscriptions.entries()) {
86
+ for (const subscription of subscriptions) {
87
+ if (subscription.id === subscriptionId) {
88
+ subscriptions.delete(subscription);
89
+ if (subscriptions.size === 0) {
90
+ this.subscriptions.delete(topic);
91
+ }
92
+ this.debug(`Unsubscribed ${subscriptionId} from ${subscription.pattern}`);
93
+ return true;
94
+ }
95
+ }
96
+ }
97
+ return false;
98
+ }
99
+ /**
100
+ * 取消指定模式的所有订阅
101
+ */
102
+ unsubscribeByPattern(pattern) {
103
+ let count = 0;
104
+ for (const [topic, subscriptions] of this.subscriptions.entries()) {
105
+ const toRemove = [];
106
+ for (const subscription of subscriptions) {
107
+ if (subscription.pattern === pattern) {
108
+ toRemove.push(subscription);
109
+ }
110
+ }
111
+ for (const subscription of toRemove) {
112
+ subscriptions.delete(subscription);
113
+ count++;
114
+ }
115
+ if (subscriptions.size === 0) {
116
+ this.subscriptions.delete(topic);
117
+ }
118
+ }
119
+ this.debug(`Unsubscribed ${count} subscriptions for pattern: ${pattern}`);
120
+ return count;
121
+ }
122
+ /**
123
+ * 获取所有订阅信息(用于调试)
124
+ */
125
+ getSubscriptions() {
126
+ const result = [];
127
+ for (const [topic, subscriptions] of this.subscriptions.entries()) {
128
+ const patterns = [];
129
+ for (const subscription of subscriptions) {
130
+ patterns.push(subscription.pattern);
131
+ }
132
+ result.push({ topic, count: subscriptions.size, patterns });
133
+ }
134
+ return result;
135
+ }
136
+ /**
137
+ * 清除所有订阅
138
+ */
139
+ clear() {
140
+ this.subscriptions.clear();
141
+ this.debug('All subscriptions cleared');
142
+ }
143
+ /**
144
+ * 查找匹配指定主题的订阅
145
+ */
146
+ findSubscriptions(topic) {
147
+ const result = new Set();
148
+ for (const [subTopic, subscriptions] of this.subscriptions.entries()) {
149
+ if (this.matchPattern(subTopic, topic)) {
150
+ for (const subscription of subscriptions) {
151
+ result.add(subscription);
152
+ }
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ /**
158
+ * 判断订阅模式是否匹配目标主题
159
+ */
160
+ matchPattern(pattern, target) {
161
+ if (pattern === '*') {
162
+ return true;
163
+ }
164
+ if (pattern.includes('*')) {
165
+ const prefix = pattern.replace(/\*$/, '');
166
+ return target.startsWith(prefix);
167
+ }
168
+ return pattern === target;
169
+ }
170
+ /**
171
+ * 解析主题模式
172
+ */
173
+ parsePattern(pattern) {
174
+ if (pattern === '*') {
175
+ return { topic: '*', isWildcard: true };
176
+ }
177
+ if (pattern.endsWith('*')) {
178
+ return { topic: pattern.replace(/\*$/, ''), isWildcard: true };
179
+ }
180
+ return { topic: pattern, isWildcard: false };
181
+ }
182
+ /**
183
+ * 生成订阅 ID
184
+ */
185
+ generateSubscriptionId() {
186
+ return `sub_${++this.subscriptionIdCounter}_${Date.now()}`;
187
+ }
188
+ }
189
+ //# sourceMappingURL=message-center.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-center.js","sourceRoot":"","sources":["../../src/message-center/message-center.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,10 @@
3
3
  * Mirrors the logic implemented in gcli2api for resolving project metadata.
4
4
  */
5
5
  export declare function fetchAntigravityProjectId(accessToken: string, apiBase?: string): Promise<string | undefined>;
6
+ export declare function buildAntigravityHeaders(accessToken: string): Record<string, string>;
6
7
  export declare function resolveAntigravityApiBase(explicit?: string): string;
7
8
  export declare const ANTIGRAVITY_HELPER_DEFAULTS: {
8
9
  apiBase: string;
9
10
  userAgent: string;
10
11
  };
12
+ export declare function ensureAntigravityTokenProjectMetadata(tokenFilePath: string, apiBaseHint?: string): Promise<boolean>;