@seqyuan/annodex 0.1.62 → 0.1.63

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 (241) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +7 -4
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +1 -1
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +18 -0
  8. package/.next/server/app/_global-error/page.js +3 -3
  9. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_global-error.html +1 -1
  11. package/.next/server/app/_global-error.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/_not-found/page.js +2 -2
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +1 -1
  21. package/.next/server/app/_not-found.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  29. package/.next/server/app/api/agent/[id]/route.js +1 -1
  30. package/.next/server/app/api/agent/new/route.js +1 -1
  31. package/.next/server/app/api/agent/runtime/route.js +2 -2
  32. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  33. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  34. package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
  35. package/.next/server/app/api/auth/login/route.js +1 -1
  36. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  37. package/.next/server/app/api/auth/providers/route.js +1 -1
  38. package/.next/server/app/api/auth/status/route.js +1 -1
  39. package/.next/server/app/api/default-cwd/route.js +1 -1
  40. package/.next/server/app/api/extensions/discover/route.js +1 -1
  41. package/.next/server/app/api/extensions/mcp/route.js +1 -1
  42. package/.next/server/app/api/extensions/plugin/route.js +1 -1
  43. package/.next/server/app/api/extensions/plugin-marketplace/route.js +1 -1
  44. package/.next/server/app/api/extensions/route.js +1 -1
  45. package/.next/server/app/api/extensions/session/route.js +1 -1
  46. package/.next/server/app/api/files/[...path]/route.js +1 -1
  47. package/.next/server/app/api/harness/route.js +1 -1
  48. package/.next/server/app/api/home/route.js +1 -1
  49. package/.next/server/app/api/im/project/route.js +2 -0
  50. package/.next/server/app/api/im/project/route.js.nft.json +1 -0
  51. package/.next/server/app/api/im/project/route_client-reference-manifest.js +1 -0
  52. package/.next/server/app/api/im/projects/route.js +2 -0
  53. package/.next/server/app/api/im/projects/route.js.nft.json +1 -0
  54. package/.next/server/app/api/im/projects/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/im/turn/route.js +2 -0
  56. package/.next/server/app/api/im/turn/route.js.nft.json +1 -0
  57. package/.next/server/app/api/im/turn/route_client-reference-manifest.js +1 -0
  58. package/.next/server/app/api/images/upload/route.js +1 -1
  59. package/.next/server/app/api/internal/runtime/route.js +1 -1
  60. package/.next/server/app/api/memory/promote/route.js +1 -1
  61. package/.next/server/app/api/memory/recall/route.js +3 -3
  62. package/.next/server/app/api/memory/reflect/route.js +2 -2
  63. package/.next/server/app/api/memory/retain/route.js +2 -2
  64. package/.next/server/app/api/memory/status/route.js +1 -1
  65. package/.next/server/app/api/models/route.js +1 -1
  66. package/.next/server/app/api/models-config/discover/route.js +1 -1
  67. package/.next/server/app/api/models-config/route.js +1 -1
  68. package/.next/server/app/api/models-config/test/route.js +1 -1
  69. package/.next/server/app/api/projects/browse/route.js +1 -1
  70. package/.next/server/app/api/projects/route.js +1 -1
  71. package/.next/server/app/api/search/route.js +1 -1
  72. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  73. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  74. package/.next/server/app/api/sessions/new/route.js +1 -1
  75. package/.next/server/app/api/sessions/route.js +1 -1
  76. package/.next/server/app/api/settings/route.js +1 -1
  77. package/.next/server/app/api/skills/install/route.js +2 -2
  78. package/.next/server/app/api/skills/route.js +2 -2
  79. package/.next/server/app/api/skills/search/route.js +1 -1
  80. package/.next/server/app/api/soul/route.js +1 -1
  81. package/.next/server/app/api/version/route.js +1 -1
  82. package/.next/server/app/docs/changelog/page.js +2 -2
  83. package/.next/server/app/docs/changelog/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/docs/changelog.html +2 -2
  85. package/.next/server/app/docs/changelog.rsc +2 -2
  86. package/.next/server/app/docs/changelog.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/docs/changelog.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/docs/changelog.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/docs/changelog.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/docs/changelog.segments/docs/changelog/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/docs/changelog.segments/docs/changelog.segment.rsc +1 -1
  92. package/.next/server/app/docs/changelog.segments/docs.segment.rsc +1 -1
  93. package/.next/server/app/index.html +1 -1
  94. package/.next/server/app/index.rsc +2 -2
  95. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  96. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  97. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  98. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  99. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  100. package/.next/server/app/login/page.js +2 -2
  101. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app/login.html +1 -1
  103. package/.next/server/app/login.rsc +2 -2
  104. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  105. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  106. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  107. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  108. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  109. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  110. package/.next/server/app/page.js +2 -2
  111. package/.next/server/app/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/workspace/page.js +4 -4
  113. package/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  114. package/.next/server/app/workspace.html +1 -1
  115. package/.next/server/app/workspace.rsc +3 -3
  116. package/.next/server/app/workspace.segments/_full.segment.rsc +3 -3
  117. package/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
  118. package/.next/server/app/workspace.segments/_index.segment.rsc +2 -2
  119. package/.next/server/app/workspace.segments/_tree.segment.rsc +2 -2
  120. package/.next/server/app/workspace.segments/workspace/__PAGE__.segment.rsc +2 -2
  121. package/.next/server/app/workspace.segments/workspace.segment.rsc +1 -1
  122. package/.next/server/app-paths-manifest.json +7 -4
  123. package/.next/server/chunks/6983.js +1 -1
  124. package/.next/server/chunks/7890.js +1 -1
  125. package/.next/server/middleware-build-manifest.js +1 -1
  126. package/.next/server/pages/404.html +1 -1
  127. package/.next/server/pages/500.html +1 -1
  128. package/.next/server/server-reference-manifest.json +1 -1
  129. package/.next/static/chunks/app/_global-error/page-44cbd53a31a3f701.js +1 -0
  130. package/.next/static/chunks/app/api/agent/[id]/events/route-44cbd53a31a3f701.js +1 -0
  131. package/.next/static/chunks/app/api/agent/[id]/route-44cbd53a31a3f701.js +1 -0
  132. package/.next/static/chunks/app/api/agent/new/route-44cbd53a31a3f701.js +1 -0
  133. package/.next/static/chunks/app/api/agent/runtime/route-44cbd53a31a3f701.js +1 -0
  134. package/.next/static/chunks/app/api/auth/all-providers/route-44cbd53a31a3f701.js +1 -0
  135. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-44cbd53a31a3f701.js +1 -0
  136. package/.next/static/chunks/app/api/auth/login/[provider]/route-44cbd53a31a3f701.js +1 -0
  137. package/.next/static/chunks/app/api/auth/login/route-44cbd53a31a3f701.js +1 -0
  138. package/.next/static/chunks/app/api/auth/logout/[provider]/route-44cbd53a31a3f701.js +1 -0
  139. package/.next/static/chunks/app/api/auth/providers/route-44cbd53a31a3f701.js +1 -0
  140. package/.next/static/chunks/app/api/auth/status/route-44cbd53a31a3f701.js +1 -0
  141. package/.next/static/chunks/app/api/default-cwd/route-44cbd53a31a3f701.js +1 -0
  142. package/.next/static/chunks/app/api/extensions/discover/route-44cbd53a31a3f701.js +1 -0
  143. package/.next/static/chunks/app/api/extensions/mcp/route-44cbd53a31a3f701.js +1 -0
  144. package/.next/static/chunks/app/api/extensions/plugin/route-44cbd53a31a3f701.js +1 -0
  145. package/.next/static/chunks/app/api/extensions/plugin-marketplace/route-44cbd53a31a3f701.js +1 -0
  146. package/.next/static/chunks/app/api/extensions/route-44cbd53a31a3f701.js +1 -0
  147. package/.next/static/chunks/app/api/extensions/session/route-44cbd53a31a3f701.js +1 -0
  148. package/.next/static/chunks/app/api/files/[...path]/route-44cbd53a31a3f701.js +1 -0
  149. package/.next/static/chunks/app/api/harness/route-44cbd53a31a3f701.js +1 -0
  150. package/.next/static/chunks/app/api/home/route-44cbd53a31a3f701.js +1 -0
  151. package/.next/static/chunks/app/api/im/project/route-44cbd53a31a3f701.js +1 -0
  152. package/.next/static/chunks/app/api/im/projects/route-44cbd53a31a3f701.js +1 -0
  153. package/.next/static/chunks/app/api/im/turn/route-44cbd53a31a3f701.js +1 -0
  154. package/.next/static/chunks/app/api/images/upload/route-44cbd53a31a3f701.js +1 -0
  155. package/.next/static/chunks/app/api/internal/runtime/route-44cbd53a31a3f701.js +1 -0
  156. package/.next/static/chunks/app/api/memory/promote/route-44cbd53a31a3f701.js +1 -0
  157. package/.next/static/chunks/app/api/memory/recall/route-44cbd53a31a3f701.js +1 -0
  158. package/.next/static/chunks/app/api/memory/reflect/route-44cbd53a31a3f701.js +1 -0
  159. package/.next/static/chunks/app/api/memory/retain/route-44cbd53a31a3f701.js +1 -0
  160. package/.next/static/chunks/app/api/memory/status/route-44cbd53a31a3f701.js +1 -0
  161. package/.next/static/chunks/app/api/models/route-44cbd53a31a3f701.js +1 -0
  162. package/.next/static/chunks/app/api/models-config/discover/route-44cbd53a31a3f701.js +1 -0
  163. package/.next/static/chunks/app/api/models-config/route-44cbd53a31a3f701.js +1 -0
  164. package/.next/static/chunks/app/api/models-config/test/route-44cbd53a31a3f701.js +1 -0
  165. package/.next/static/chunks/app/api/projects/browse/route-44cbd53a31a3f701.js +1 -0
  166. package/.next/static/chunks/app/api/projects/route-44cbd53a31a3f701.js +1 -0
  167. package/.next/static/chunks/app/api/search/route-44cbd53a31a3f701.js +1 -0
  168. package/.next/static/chunks/app/api/sessions/[id]/context/route-44cbd53a31a3f701.js +1 -0
  169. package/.next/static/chunks/app/api/sessions/[id]/route-44cbd53a31a3f701.js +1 -0
  170. package/.next/static/chunks/app/api/sessions/new/route-44cbd53a31a3f701.js +1 -0
  171. package/.next/static/chunks/app/api/sessions/route-44cbd53a31a3f701.js +1 -0
  172. package/.next/static/chunks/app/api/settings/route-44cbd53a31a3f701.js +1 -0
  173. package/.next/static/chunks/app/api/skills/install/route-44cbd53a31a3f701.js +1 -0
  174. package/.next/static/chunks/app/api/skills/route-44cbd53a31a3f701.js +1 -0
  175. package/.next/static/chunks/app/api/skills/search/route-44cbd53a31a3f701.js +1 -0
  176. package/.next/static/chunks/app/api/soul/route-44cbd53a31a3f701.js +1 -0
  177. package/.next/static/chunks/app/api/version/route-44cbd53a31a3f701.js +1 -0
  178. package/.next/static/chunks/app/page-44cbd53a31a3f701.js +1 -0
  179. package/.next/static/chunks/app/workspace/{page-93a24ed2a3c9ccdc.js → page-ec626aa0d187e7a8.js} +8 -8
  180. package/.next/static/chunks/next/dist/client/components/builtin/app-error-44cbd53a31a3f701.js +1 -0
  181. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-44cbd53a31a3f701.js +1 -0
  182. package/.next/static/chunks/next/dist/client/components/builtin/not-found-44cbd53a31a3f701.js +1 -0
  183. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-44cbd53a31a3f701.js +1 -0
  184. package/.next/static/css/ff52c68aa30cd040.css +1 -0
  185. package/.next/static/niuAtSJwNh4Mqku9060kD/_buildManifest.js +1 -0
  186. package/bin/annodex-im-gateway.js +555 -0
  187. package/package.json +4 -2
  188. package/.next/static/Si53llO9EcOFOOu0WE0gB/_buildManifest.js +0 -1
  189. package/.next/static/chunks/app/_global-error/page-c811cda2b08c77dc.js +0 -1
  190. package/.next/static/chunks/app/api/agent/[id]/events/route-c811cda2b08c77dc.js +0 -1
  191. package/.next/static/chunks/app/api/agent/[id]/route-c811cda2b08c77dc.js +0 -1
  192. package/.next/static/chunks/app/api/agent/new/route-c811cda2b08c77dc.js +0 -1
  193. package/.next/static/chunks/app/api/agent/runtime/route-c811cda2b08c77dc.js +0 -1
  194. package/.next/static/chunks/app/api/auth/all-providers/route-c811cda2b08c77dc.js +0 -1
  195. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-c811cda2b08c77dc.js +0 -1
  196. package/.next/static/chunks/app/api/auth/login/[provider]/route-c811cda2b08c77dc.js +0 -1
  197. package/.next/static/chunks/app/api/auth/login/route-c811cda2b08c77dc.js +0 -1
  198. package/.next/static/chunks/app/api/auth/logout/[provider]/route-c811cda2b08c77dc.js +0 -1
  199. package/.next/static/chunks/app/api/auth/providers/route-c811cda2b08c77dc.js +0 -1
  200. package/.next/static/chunks/app/api/auth/status/route-c811cda2b08c77dc.js +0 -1
  201. package/.next/static/chunks/app/api/default-cwd/route-c811cda2b08c77dc.js +0 -1
  202. package/.next/static/chunks/app/api/extensions/discover/route-c811cda2b08c77dc.js +0 -1
  203. package/.next/static/chunks/app/api/extensions/mcp/route-c811cda2b08c77dc.js +0 -1
  204. package/.next/static/chunks/app/api/extensions/plugin/route-c811cda2b08c77dc.js +0 -1
  205. package/.next/static/chunks/app/api/extensions/plugin-marketplace/route-c811cda2b08c77dc.js +0 -1
  206. package/.next/static/chunks/app/api/extensions/route-c811cda2b08c77dc.js +0 -1
  207. package/.next/static/chunks/app/api/extensions/session/route-c811cda2b08c77dc.js +0 -1
  208. package/.next/static/chunks/app/api/files/[...path]/route-c811cda2b08c77dc.js +0 -1
  209. package/.next/static/chunks/app/api/harness/route-c811cda2b08c77dc.js +0 -1
  210. package/.next/static/chunks/app/api/home/route-c811cda2b08c77dc.js +0 -1
  211. package/.next/static/chunks/app/api/images/upload/route-c811cda2b08c77dc.js +0 -1
  212. package/.next/static/chunks/app/api/internal/runtime/route-c811cda2b08c77dc.js +0 -1
  213. package/.next/static/chunks/app/api/memory/promote/route-c811cda2b08c77dc.js +0 -1
  214. package/.next/static/chunks/app/api/memory/recall/route-c811cda2b08c77dc.js +0 -1
  215. package/.next/static/chunks/app/api/memory/reflect/route-c811cda2b08c77dc.js +0 -1
  216. package/.next/static/chunks/app/api/memory/retain/route-c811cda2b08c77dc.js +0 -1
  217. package/.next/static/chunks/app/api/memory/status/route-c811cda2b08c77dc.js +0 -1
  218. package/.next/static/chunks/app/api/models/route-c811cda2b08c77dc.js +0 -1
  219. package/.next/static/chunks/app/api/models-config/discover/route-c811cda2b08c77dc.js +0 -1
  220. package/.next/static/chunks/app/api/models-config/route-c811cda2b08c77dc.js +0 -1
  221. package/.next/static/chunks/app/api/models-config/test/route-c811cda2b08c77dc.js +0 -1
  222. package/.next/static/chunks/app/api/projects/browse/route-c811cda2b08c77dc.js +0 -1
  223. package/.next/static/chunks/app/api/projects/route-c811cda2b08c77dc.js +0 -1
  224. package/.next/static/chunks/app/api/search/route-c811cda2b08c77dc.js +0 -1
  225. package/.next/static/chunks/app/api/sessions/[id]/context/route-c811cda2b08c77dc.js +0 -1
  226. package/.next/static/chunks/app/api/sessions/[id]/route-c811cda2b08c77dc.js +0 -1
  227. package/.next/static/chunks/app/api/sessions/new/route-c811cda2b08c77dc.js +0 -1
  228. package/.next/static/chunks/app/api/sessions/route-c811cda2b08c77dc.js +0 -1
  229. package/.next/static/chunks/app/api/settings/route-c811cda2b08c77dc.js +0 -1
  230. package/.next/static/chunks/app/api/skills/install/route-c811cda2b08c77dc.js +0 -1
  231. package/.next/static/chunks/app/api/skills/route-c811cda2b08c77dc.js +0 -1
  232. package/.next/static/chunks/app/api/skills/search/route-c811cda2b08c77dc.js +0 -1
  233. package/.next/static/chunks/app/api/soul/route-c811cda2b08c77dc.js +0 -1
  234. package/.next/static/chunks/app/api/version/route-c811cda2b08c77dc.js +0 -1
  235. package/.next/static/chunks/app/page-c811cda2b08c77dc.js +0 -1
  236. package/.next/static/chunks/next/dist/client/components/builtin/app-error-c811cda2b08c77dc.js +0 -1
  237. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-c811cda2b08c77dc.js +0 -1
  238. package/.next/static/chunks/next/dist/client/components/builtin/not-found-c811cda2b08c77dc.js +0 -1
  239. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c811cda2b08c77dc.js +0 -1
  240. package/.next/static/css/36a3b55135b36d87.css +0 -1
  241. /package/.next/static/{Si53llO9EcOFOOu0WE0gB → niuAtSJwNh4Mqku9060kD}/_ssgManifest.js +0 -0
@@ -0,0 +1,555 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const fs = require("fs");
5
+ const http = require("http");
6
+ const https = require("https");
7
+ const os = require("os");
8
+ const path = require("path");
9
+ const WebSocket = require("ws");
10
+
11
+ const REVISION_DIGITS = ["\u200b", "\u200c", "\u200d", "\u2060", "\ufeff"];
12
+ const REVISION_SUFFIX_PATTERN = /[\u200b\u200c\u200d\u2060\ufeff]+$/u;
13
+
14
+ function envFirst(...names) {
15
+ for (const name of names) {
16
+ const value = process.env[name];
17
+ if (value !== undefined && value !== "") return value;
18
+ }
19
+ return undefined;
20
+ }
21
+
22
+ function getAgentDir() {
23
+ return envFirst("ANNODEX_CONFIG_DIR", "ANNOVIBE_CONFIG_DIR") ?? path.join(os.homedir(), ".config", "annodex");
24
+ }
25
+
26
+ function readGatewayToken() {
27
+ const statePath = path.join(getAgentDir(), "im-gateway.json");
28
+ try {
29
+ const state = JSON.parse(fs.readFileSync(statePath, "utf8"));
30
+ return typeof state.token === "string" ? state.token.trim() : "";
31
+ } catch {
32
+ return "";
33
+ }
34
+ }
35
+
36
+ function resolveBaseUrl() {
37
+ const explicit = envFirst("ANNODEX_URL", "ANNOVIBE_URL");
38
+ if (explicit) return explicit.replace(/\/$/, "");
39
+
40
+ const port = envFirst("ANNODEX_PORT", "PORT") ?? readStatePort() ?? "30121";
41
+ const hostname = envFirst("ANNODEX_HOST", "HOSTNAME") ?? "127.0.0.1";
42
+ return `http://${hostname}:${port}`;
43
+ }
44
+
45
+ function readStatePort() {
46
+ const statePath = path.join(getAgentDir(), "annodex.json");
47
+ try {
48
+ const state = JSON.parse(fs.readFileSync(statePath, "utf8"));
49
+ if (state?.port) return String(state.port);
50
+ if (state?.url) {
51
+ const url = new URL(String(state.url));
52
+ return url.port || (url.protocol === "https:" ? "443" : "80");
53
+ }
54
+ } catch {
55
+ // ignore
56
+ }
57
+ return undefined;
58
+ }
59
+
60
+ function requestJson(method, pathname, body) {
61
+ const baseUrl = resolveBaseUrl();
62
+ const url = new URL(pathname, baseUrl);
63
+ const payload = body === undefined ? undefined : JSON.stringify(body);
64
+ const lib = url.protocol === "https:" ? https : http;
65
+ const token = readGatewayToken();
66
+
67
+ return new Promise((resolve, reject) => {
68
+ const req = lib.request(
69
+ url,
70
+ {
71
+ method,
72
+ headers: {
73
+ ...(payload
74
+ ? {
75
+ "Content-Type": "application/json",
76
+ "Content-Length": Buffer.byteLength(payload),
77
+ }
78
+ : {}),
79
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
80
+ },
81
+ },
82
+ (res) => {
83
+ let data = "";
84
+ res.setEncoding("utf8");
85
+ res.on("data", (chunk) => { data += chunk; });
86
+ res.on("end", () => {
87
+ let parsed;
88
+ try {
89
+ parsed = data ? JSON.parse(data) : {};
90
+ } catch (error) {
91
+ reject(new Error(`Invalid JSON from ${url}: ${String(error)}`));
92
+ return;
93
+ }
94
+ if (res.statusCode && res.statusCode >= 400) {
95
+ reject(new Error(parsed.error || parsed.reply || `HTTP ${res.statusCode}`));
96
+ return;
97
+ }
98
+ resolve(parsed);
99
+ });
100
+ },
101
+ );
102
+ req.on("error", reject);
103
+ if (payload) req.write(payload);
104
+ req.end();
105
+ });
106
+ }
107
+
108
+ function readSecret(secretPath) {
109
+ try {
110
+ const raw = JSON.parse(fs.readFileSync(secretPath, "utf8"));
111
+ return typeof raw.botSecret === "string" ? raw.botSecret.trim() : "";
112
+ } catch {
113
+ return "";
114
+ }
115
+ }
116
+
117
+ function formatProcessingPlaceholder(elapsedSeconds) {
118
+ return `(working ${elapsedSeconds}s)`;
119
+ }
120
+
121
+ function encodeRevision(revision) {
122
+ const base = REVISION_DIGITS.length;
123
+ let remaining = Math.max(1, revision);
124
+ let encoded = "";
125
+ while (remaining > 0) {
126
+ encoded += REVISION_DIGITS[remaining % base];
127
+ remaining = Math.floor(remaining / base);
128
+ }
129
+ return encoded;
130
+ }
131
+
132
+ function applyWeComRevisionSuffix(text, revision) {
133
+ return `${text}${encodeRevision(revision)}`;
134
+ }
135
+
136
+ function asRecord(value) {
137
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
138
+ }
139
+
140
+ function resolveOptionalString(value) {
141
+ return typeof value === "string" && value.trim() ? value.trim() : null;
142
+ }
143
+
144
+ function extractWeComInboundMessage(frame) {
145
+ const reqId = frame.headers?.req_id?.trim();
146
+ const body = frame.body;
147
+ if (!reqId || !body || body.msgtype !== "text") return null;
148
+
149
+ const from = asRecord(body.from);
150
+ const rawUserId = typeof from?.userid === "string" ? from.userid.trim() : "";
151
+ const textBody = asRecord(body.text);
152
+ let content = typeof textBody?.content === "string" ? textBody.content.trim() : "";
153
+ if (!rawUserId || !content) return null;
154
+
155
+ const chatId = resolveOptionalString(body.chat_id) || resolveOptionalString(body.room_id) || null;
156
+ let mentionedBot = false;
157
+ if (chatId) {
158
+ const mentions = content.match(/<@[^>]+>\s*/g);
159
+ if (mentions && mentions.length > 0) {
160
+ mentionedBot = true;
161
+ content = content.replace(/<@[^>]+>\s*/g, "").trim();
162
+ }
163
+ if (!content) return null;
164
+ }
165
+
166
+ return { reqId, userId: rawUserId, chatId, content, mentionedBot };
167
+ }
168
+
169
+ function shouldAcceptGroupMessage(message, requireMentionInGroup) {
170
+ if (!message.chatId) return true;
171
+ if (!requireMentionInGroup) return true;
172
+ return message.mentionedBot;
173
+ }
174
+
175
+ function createDeferred() {
176
+ let resolve;
177
+ let reject;
178
+ const promise = new Promise((res, rej) => {
179
+ resolve = res;
180
+ reject = rej;
181
+ });
182
+ return { promise, resolve, reject };
183
+ }
184
+
185
+ class WeComWsClient {
186
+ constructor(options) {
187
+ this.options = options;
188
+ this.ws = null;
189
+ this.heartbeatTimer = null;
190
+ this.pendingAcks = new Map();
191
+ this.authenticated = createDeferred();
192
+ }
193
+
194
+ get isConnected() {
195
+ return this.ws?.readyState === WebSocket.OPEN;
196
+ }
197
+
198
+ async connect() {
199
+ if (this.isConnected) return;
200
+
201
+ await new Promise((resolve, reject) => {
202
+ const ws = new WebSocket(this.options.wsUrl?.trim() || "wss://openws.work.weixin.qq.com");
203
+ this.ws = ws;
204
+ ws.once("open", () => resolve());
205
+ ws.once("error", (error) => reject(error));
206
+ ws.on("error", () => undefined);
207
+ ws.on("message", (raw) => {
208
+ void this.handleFrame(String(raw));
209
+ });
210
+ ws.on("close", () => {
211
+ this.stopHeartbeat();
212
+ this.rejectPendingAcks(new Error("wecom websocket closed"));
213
+ });
214
+ });
215
+
216
+ await this.sendFrame({
217
+ cmd: "aibot_subscribe",
218
+ headers: { req_id: `aibot_subscribe_${Date.now()}` },
219
+ body: {
220
+ bot_id: this.options.botId,
221
+ secret: this.options.botSecret,
222
+ },
223
+ });
224
+ }
225
+
226
+ async waitAuthenticated(timeoutMs = 10_000) {
227
+ const timer = setTimeout(() => {
228
+ this.authenticated.reject(new Error("wecom authentication timeout"));
229
+ }, timeoutMs);
230
+ try {
231
+ await this.authenticated.promise;
232
+ return true;
233
+ } catch {
234
+ return false;
235
+ } finally {
236
+ clearTimeout(timer);
237
+ }
238
+ }
239
+
240
+ async replyStream(reqId, streamId, content, finish) {
241
+ await this.sendFrame({
242
+ cmd: "aibot_respond_msg",
243
+ headers: { req_id: reqId },
244
+ body: {
245
+ msgtype: "stream",
246
+ stream: { id: streamId, content, finish },
247
+ },
248
+ });
249
+ if (!finish) return;
250
+ await new Promise((resolve, reject) => {
251
+ const timeout = setTimeout(() => {
252
+ this.pendingAcks.delete(reqId);
253
+ reject(new Error(`wecom reply ack timeout for ${reqId}`));
254
+ }, 5_000);
255
+ this.pendingAcks.set(reqId, { resolve, reject, timeout });
256
+ }).catch(() => undefined);
257
+ }
258
+
259
+ async disconnect() {
260
+ this.stopHeartbeat();
261
+ this.rejectPendingAcks(new Error("wecom websocket disconnected"));
262
+ if (!this.ws) return;
263
+ const ws = this.ws;
264
+ this.ws = null;
265
+ await new Promise((resolve) => {
266
+ ws.once("close", () => resolve());
267
+ ws.close();
268
+ });
269
+ }
270
+
271
+ async handleFrame(frameText) {
272
+ const frame = JSON.parse(frameText);
273
+ const reqId = frame.headers?.req_id?.trim();
274
+
275
+ if (reqId && this.pendingAcks.has(reqId)) {
276
+ const pending = this.pendingAcks.get(reqId);
277
+ if (pending) {
278
+ this.pendingAcks.delete(reqId);
279
+ clearTimeout(pending.timeout);
280
+ if ((frame.errcode ?? 0) !== 0) {
281
+ pending.reject(new Error(frame.errmsg || "wecom reply ack failed"));
282
+ } else {
283
+ pending.resolve();
284
+ }
285
+ }
286
+ return;
287
+ }
288
+
289
+ if (reqId?.startsWith("aibot_subscribe_")) {
290
+ if ((frame.errcode ?? 0) !== 0) {
291
+ this.authenticated.reject(new Error(frame.errmsg || "wecom authentication failed"));
292
+ return;
293
+ }
294
+ this.authenticated.resolve();
295
+ this.startHeartbeat();
296
+ return;
297
+ }
298
+
299
+ if (reqId?.startsWith("ping_")) return;
300
+
301
+ if (frame.cmd === "aibot_msg_callback" || frame.cmd === "aibot_event_callback") {
302
+ await this.options.onMessage(frame);
303
+ }
304
+ }
305
+
306
+ startHeartbeat() {
307
+ this.stopHeartbeat();
308
+ const intervalMs = Math.max(1_000, this.options.heartbeatIntervalMs ?? 30_000);
309
+ this.heartbeatTimer = setInterval(() => {
310
+ void this.sendFrame({
311
+ cmd: "ping",
312
+ headers: { req_id: `ping_${Date.now()}` },
313
+ }).catch(() => undefined);
314
+ }, intervalMs);
315
+ }
316
+
317
+ stopHeartbeat() {
318
+ if (!this.heartbeatTimer) return;
319
+ clearInterval(this.heartbeatTimer);
320
+ this.heartbeatTimer = null;
321
+ }
322
+
323
+ async sendFrame(frame) {
324
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
325
+ throw new Error("wecom websocket not connected");
326
+ }
327
+ this.ws.send(JSON.stringify(frame));
328
+ }
329
+
330
+ rejectPendingAcks(error) {
331
+ for (const [reqId, pending] of this.pendingAcks) {
332
+ this.pendingAcks.delete(reqId);
333
+ clearTimeout(pending.timeout);
334
+ pending.reject(error);
335
+ }
336
+ }
337
+ }
338
+
339
+ class WeComLiveReply {
340
+ constructor(transport, reqId) {
341
+ this.transport = transport;
342
+ this.reqId = reqId;
343
+ this.revision = 0;
344
+ }
345
+
346
+ nextRevision() {
347
+ this.revision += 1;
348
+ return this.revision;
349
+ }
350
+
351
+ async beginProcessing() {
352
+ await this.transport.replyStream(
353
+ this.reqId,
354
+ `${Date.now()}-start`,
355
+ applyWeComRevisionSuffix(formatProcessingPlaceholder(1), this.nextRevision()),
356
+ true,
357
+ );
358
+ }
359
+
360
+ async refreshProcessing(elapsedSeconds) {
361
+ await this.transport.replyStream(
362
+ this.reqId,
363
+ `${Date.now()}-progress`,
364
+ applyWeComRevisionSuffix(formatProcessingPlaceholder(elapsedSeconds), this.nextRevision()),
365
+ true,
366
+ );
367
+ }
368
+
369
+ async finish(text) {
370
+ await this.transport.replyStream(
371
+ this.reqId,
372
+ `${Date.now()}-final`,
373
+ applyWeComRevisionSuffix(text, this.nextRevision()),
374
+ true,
375
+ );
376
+ }
377
+
378
+ async fail(text) {
379
+ await this.finish(text);
380
+ }
381
+ }
382
+
383
+ class ProjectWeComBridge {
384
+ constructor(project) {
385
+ this.project = project;
386
+ this.client = null;
387
+ this.stopped = false;
388
+ this.reconnectTimer = null;
389
+ }
390
+
391
+ async start() {
392
+ if (this.stopped) return;
393
+ const secret = readSecret(this.project.secretPath);
394
+ if (!secret) {
395
+ console.error(`[im] missing bot secret for ${this.project.cwd}`);
396
+ this.scheduleReconnect(30_000);
397
+ return;
398
+ }
399
+
400
+ this.client = new WeComWsClient({
401
+ botId: this.project.botId,
402
+ botSecret: secret,
403
+ onMessage: (frame) => this.handleFrame(frame),
404
+ });
405
+
406
+ try {
407
+ await this.client.connect();
408
+ const ok = await this.client.waitAuthenticated();
409
+ if (!ok) throw new Error("wecom authentication failed");
410
+ console.error(`[im] connected project ${this.project.cwd} bot ${this.project.botId}`);
411
+ } catch (error) {
412
+ console.error(`[im] connect failed for ${this.project.cwd}: ${String(error)}`);
413
+ await this.client?.disconnect().catch(() => undefined);
414
+ this.client = null;
415
+ this.scheduleReconnect(10_000);
416
+ }
417
+ }
418
+
419
+ scheduleReconnect(delayMs) {
420
+ if (this.stopped || this.reconnectTimer) return;
421
+ this.reconnectTimer = setTimeout(() => {
422
+ this.reconnectTimer = null;
423
+ void this.start();
424
+ }, delayMs);
425
+ }
426
+
427
+ async stop() {
428
+ this.stopped = true;
429
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
430
+ await this.client?.disconnect().catch(() => undefined);
431
+ this.client = null;
432
+ }
433
+
434
+ async handleFrame(frame) {
435
+ const inbound = extractWeComInboundMessage(frame);
436
+ if (!inbound) return;
437
+ if (!shouldAcceptGroupMessage(inbound, this.project.requireMentionInGroup)) return;
438
+
439
+ const reply = new WeComLiveReply(this.client, inbound.reqId);
440
+ const startedAt = Date.now();
441
+ let refreshTimer = null;
442
+
443
+ try {
444
+ await reply.beginProcessing();
445
+ refreshTimer = setInterval(() => {
446
+ const elapsed = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));
447
+ void reply.refreshProcessing(elapsed).catch(() => undefined);
448
+ }, 5_000);
449
+
450
+ const result = await requestJson("POST", "/api/im/turn", {
451
+ cwd: this.project.cwd,
452
+ userId: inbound.userId,
453
+ message: inbound.content,
454
+ chatId: inbound.chatId,
455
+ });
456
+
457
+ const text = typeof result.reply === "string" && result.reply.trim()
458
+ ? result.reply.trim()
459
+ : (result.error ? String(result.error) : "No reply from annodex.");
460
+ await reply.finish(text);
461
+ } catch (error) {
462
+ await reply.fail(`annodex IM error: ${String(error)}`);
463
+ } finally {
464
+ if (refreshTimer) clearInterval(refreshTimer);
465
+ }
466
+ }
467
+ }
468
+
469
+ class ImGateway {
470
+ constructor() {
471
+ this.bridges = new Map();
472
+ this.pollTimer = null;
473
+ this.stopped = false;
474
+ }
475
+
476
+ async refreshProjects() {
477
+ if (this.stopped) return;
478
+ let payload;
479
+ try {
480
+ payload = await requestJson("GET", "/api/im/projects");
481
+ } catch (error) {
482
+ console.error(`[im] failed to list projects: ${String(error)}`);
483
+ return;
484
+ }
485
+
486
+ const projects = Array.isArray(payload.projects) ? payload.projects : [];
487
+ const activeKeys = new Set();
488
+
489
+ for (const project of projects) {
490
+ if (!project?.cwd || !project?.botId || !project?.secretPath) continue;
491
+ activeKeys.add(project.cwd);
492
+ if (this.bridges.has(project.cwd)) {
493
+ this.bridges.get(project.cwd).project = project;
494
+ continue;
495
+ }
496
+ const bridge = new ProjectWeComBridge(project);
497
+ this.bridges.set(project.cwd, bridge);
498
+ void bridge.start();
499
+ }
500
+
501
+ for (const [cwd, bridge] of this.bridges) {
502
+ if (activeKeys.has(cwd)) continue;
503
+ await bridge.stop();
504
+ this.bridges.delete(cwd);
505
+ }
506
+ }
507
+
508
+ async start() {
509
+ writeGatewayState({ startedAt: new Date().toISOString(), pid: process.pid });
510
+ await this.refreshProjects();
511
+ this.pollTimer = setInterval(() => {
512
+ void this.refreshProjects();
513
+ }, 30_000);
514
+ }
515
+
516
+ async stop() {
517
+ this.stopped = true;
518
+ if (this.pollTimer) clearInterval(this.pollTimer);
519
+ for (const bridge of this.bridges.values()) {
520
+ await bridge.stop();
521
+ }
522
+ this.bridges.clear();
523
+ }
524
+ }
525
+
526
+ function writeGatewayState(patch) {
527
+ const statePath = path.join(getAgentDir(), "im-gateway.json");
528
+ let state = {};
529
+ try {
530
+ state = JSON.parse(fs.readFileSync(statePath, "utf8"));
531
+ } catch {
532
+ // ignore
533
+ }
534
+ fs.mkdirSync(path.dirname(statePath), { recursive: true });
535
+ fs.writeFileSync(statePath, JSON.stringify({ ...state, ...patch }, null, 2), "utf8");
536
+ }
537
+
538
+ async function main() {
539
+ const gateway = new ImGateway();
540
+ const shutdown = async () => {
541
+ console.error("[im] shutting down");
542
+ await gateway.stop();
543
+ process.exit(0);
544
+ };
545
+ process.on("SIGINT", () => { void shutdown(); });
546
+ process.on("SIGTERM", () => { void shutdown(); });
547
+
548
+ console.error(`[im] annodex-im-gateway starting (${resolveBaseUrl()})`);
549
+ await gateway.start();
550
+ }
551
+
552
+ main().catch((error) => {
553
+ console.error(`[im] fatal: ${String(error)}`);
554
+ process.exit(1);
555
+ });
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "@seqyuan/annodex",
3
- "version": "0.1.62",
3
+ "version": "0.1.63",
4
4
  "description": "AI-native bioinformatics workspace by Annoroad",
5
5
  "license": "MIT",
6
6
  "bin": {
7
7
  "annodex": "bin/annodex.js",
8
- "annodex-memory-mcp": "bin/annodex-memory-mcp.js"
8
+ "annodex-memory-mcp": "bin/annodex-memory-mcp.js",
9
+ "annodex-im-gateway": "bin/annodex-im-gateway.js"
9
10
  },
10
11
  "files": [
11
12
  "bin",
12
13
  "bin/annodex-memory-mcp.js",
14
+ "bin/annodex-im-gateway.js",
13
15
  ".next",
14
16
  "!.next/cache",
15
17
  "!.next/dev",
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:43,errorRate:1e-4,numBits:825,numHashes:14,bitArray:[0,1,0,1,0,0,1,0,1,0,1,1,0,1,1,0,1,1,1,0,0,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,1,0,1,0,0,0,1,1,1,0,0,0,0,1,0,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,1,1,0,0,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,0,1,0,0,0,1,1,0,1,1,1,0,0,1,0,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,0,1,1,0,0,1,1,0,1,1,0,1,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,0,0,0,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,0,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,1,1,1,0,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,1,1,1,0,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,1,0,0,1,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,0,0,0,1,0,1,1,1,1,0,1,0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,1,0,0,0,1,0,0]},__routerFilterDynamic:{numItems:6,errorRate:1e-4,numBits:116,numHashes:14,bitArray:[1,1,0,0,0,1,0,1,1,1,1,0,1,0,1,0,0,1,1,1,0,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1,0,0,1,0,1,0,0,1,1,0,0,0]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);