@seqyuan/annodex 0.1.67 → 0.1.69

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 (239) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -5
  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 +6 -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/gateway-token/route.js +2 -0
  50. package/.next/server/app/api/im/gateway-token/route.js.nft.json +1 -0
  51. package/.next/server/app/api/im/gateway-token/route_client-reference-manifest.js +1 -0
  52. package/.next/server/app/api/im/project/route.js +2 -2
  53. package/.next/server/app/api/im/projects/route.js +2 -2
  54. package/.next/server/app/api/im/turn/route.js +4 -2
  55. package/.next/server/app/api/images/upload/route.js +1 -1
  56. package/.next/server/app/api/internal/runtime/route.js +1 -1
  57. package/.next/server/app/api/memory/promote/route.js +2 -2
  58. package/.next/server/app/api/memory/recall/route.js +4 -4
  59. package/.next/server/app/api/memory/reflect/route.js +2 -2
  60. package/.next/server/app/api/memory/retain/route.js +1 -1
  61. package/.next/server/app/api/memory/status/route.js +1 -1
  62. package/.next/server/app/api/models/route.js +1 -1
  63. package/.next/server/app/api/models-config/discover/route.js +1 -1
  64. package/.next/server/app/api/models-config/route.js +1 -1
  65. package/.next/server/app/api/models-config/test/route.js +1 -1
  66. package/.next/server/app/api/projects/browse/route.js +1 -1
  67. package/.next/server/app/api/projects/route.js +1 -1
  68. package/.next/server/app/api/search/route.js +1 -1
  69. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  70. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  71. package/.next/server/app/api/sessions/new/route.js +1 -1
  72. package/.next/server/app/api/sessions/route.js +1 -1
  73. package/.next/server/app/api/settings/route.js +1 -1
  74. package/.next/server/app/api/skills/install/route.js +2 -2
  75. package/.next/server/app/api/skills/route.js +2 -2
  76. package/.next/server/app/api/skills/search/route.js +1 -1
  77. package/.next/server/app/api/soul/route.js +1 -1
  78. package/.next/server/app/api/version/route.js +1 -1
  79. package/.next/server/app/docs/changelog/page.js +2 -2
  80. package/.next/server/app/docs/changelog/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/docs/changelog.html +2 -2
  82. package/.next/server/app/docs/changelog.rsc +2 -2
  83. package/.next/server/app/docs/changelog.segments/_full.segment.rsc +2 -2
  84. package/.next/server/app/docs/changelog.segments/_head.segment.rsc +1 -1
  85. package/.next/server/app/docs/changelog.segments/_index.segment.rsc +2 -2
  86. package/.next/server/app/docs/changelog.segments/_tree.segment.rsc +2 -2
  87. package/.next/server/app/docs/changelog.segments/docs/changelog/__PAGE__.segment.rsc +1 -1
  88. package/.next/server/app/docs/changelog.segments/docs/changelog.segment.rsc +1 -1
  89. package/.next/server/app/docs/changelog.segments/docs.segment.rsc +1 -1
  90. package/.next/server/app/index.html +1 -1
  91. package/.next/server/app/index.rsc +2 -2
  92. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  94. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  95. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  96. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  97. package/.next/server/app/login/page.js +2 -2
  98. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/login.html +1 -1
  100. package/.next/server/app/login.rsc +2 -2
  101. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  102. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  103. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  104. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  105. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  106. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  107. package/.next/server/app/page.js +2 -2
  108. package/.next/server/app/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/workspace/page.js +4 -4
  110. package/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/workspace.html +1 -1
  112. package/.next/server/app/workspace.rsc +3 -3
  113. package/.next/server/app/workspace.segments/_full.segment.rsc +3 -3
  114. package/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
  115. package/.next/server/app/workspace.segments/_index.segment.rsc +2 -2
  116. package/.next/server/app/workspace.segments/_tree.segment.rsc +2 -2
  117. package/.next/server/app/workspace.segments/workspace/__PAGE__.segment.rsc +2 -2
  118. package/.next/server/app/workspace.segments/workspace.segment.rsc +1 -1
  119. package/.next/server/app-paths-manifest.json +6 -5
  120. package/.next/server/chunks/6983.js +1 -1
  121. package/.next/server/middleware-build-manifest.js +1 -1
  122. package/.next/server/middleware.js +1 -1
  123. package/.next/server/pages/404.html +1 -1
  124. package/.next/server/pages/500.html +1 -1
  125. package/.next/server/server-reference-manifest.json +1 -1
  126. package/.next/static/chunks/app/{api/agent/[id]/route-44cbd53a31a3f701.js → _global-error/page-e4c3159b5453fb6b.js} +1 -1
  127. package/.next/static/chunks/app/api/agent/{new/route-44cbd53a31a3f701.js → [id]/events/route-e4c3159b5453fb6b.js} +1 -1
  128. package/.next/static/chunks/app/{_global-error/page-44cbd53a31a3f701.js → api/agent/[id]/route-e4c3159b5453fb6b.js} +1 -1
  129. package/.next/static/chunks/app/api/agent/{[id]/events/route-44cbd53a31a3f701.js → new/route-e4c3159b5453fb6b.js} +1 -1
  130. package/.next/static/chunks/app/api/agent/runtime/route-e4c3159b5453fb6b.js +1 -0
  131. package/.next/static/chunks/app/api/auth/all-providers/route-e4c3159b5453fb6b.js +1 -0
  132. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-e4c3159b5453fb6b.js +1 -0
  133. package/.next/static/chunks/app/api/auth/login/[provider]/route-e4c3159b5453fb6b.js +1 -0
  134. package/.next/static/chunks/app/api/auth/login/route-e4c3159b5453fb6b.js +1 -0
  135. package/.next/static/chunks/app/api/auth/logout/[provider]/route-e4c3159b5453fb6b.js +1 -0
  136. package/.next/static/chunks/app/api/auth/providers/route-e4c3159b5453fb6b.js +1 -0
  137. package/.next/static/chunks/app/api/auth/status/route-e4c3159b5453fb6b.js +1 -0
  138. package/.next/static/chunks/app/api/default-cwd/route-e4c3159b5453fb6b.js +1 -0
  139. package/.next/static/chunks/app/api/extensions/discover/route-e4c3159b5453fb6b.js +1 -0
  140. package/.next/static/chunks/app/api/extensions/mcp/route-e4c3159b5453fb6b.js +1 -0
  141. package/.next/static/chunks/app/api/extensions/plugin/route-e4c3159b5453fb6b.js +1 -0
  142. package/.next/static/chunks/app/api/extensions/plugin-marketplace/route-e4c3159b5453fb6b.js +1 -0
  143. package/.next/static/chunks/app/api/extensions/route-e4c3159b5453fb6b.js +1 -0
  144. package/.next/static/chunks/app/api/extensions/session/route-e4c3159b5453fb6b.js +1 -0
  145. package/.next/static/chunks/app/api/files/[...path]/route-e4c3159b5453fb6b.js +1 -0
  146. package/.next/static/chunks/app/api/harness/route-e4c3159b5453fb6b.js +1 -0
  147. package/.next/static/chunks/app/api/home/route-e4c3159b5453fb6b.js +1 -0
  148. package/.next/static/chunks/app/api/im/gateway-token/route-e4c3159b5453fb6b.js +1 -0
  149. package/.next/static/chunks/app/api/im/project/route-e4c3159b5453fb6b.js +1 -0
  150. package/.next/static/chunks/app/api/im/projects/route-e4c3159b5453fb6b.js +1 -0
  151. package/.next/static/chunks/app/api/im/turn/route-e4c3159b5453fb6b.js +1 -0
  152. package/.next/static/chunks/app/api/images/upload/route-e4c3159b5453fb6b.js +1 -0
  153. package/.next/static/chunks/app/api/internal/runtime/route-e4c3159b5453fb6b.js +1 -0
  154. package/.next/static/chunks/app/api/memory/promote/route-e4c3159b5453fb6b.js +1 -0
  155. package/.next/static/chunks/app/api/memory/recall/route-e4c3159b5453fb6b.js +1 -0
  156. package/.next/static/chunks/app/api/memory/reflect/route-e4c3159b5453fb6b.js +1 -0
  157. package/.next/static/chunks/app/api/memory/retain/route-e4c3159b5453fb6b.js +1 -0
  158. package/.next/static/chunks/app/api/memory/status/route-e4c3159b5453fb6b.js +1 -0
  159. package/.next/static/chunks/app/api/models/route-e4c3159b5453fb6b.js +1 -0
  160. package/.next/static/chunks/app/api/models-config/discover/route-e4c3159b5453fb6b.js +1 -0
  161. package/.next/static/chunks/app/api/models-config/route-e4c3159b5453fb6b.js +1 -0
  162. package/.next/static/chunks/app/api/models-config/test/route-e4c3159b5453fb6b.js +1 -0
  163. package/.next/static/chunks/app/api/projects/browse/route-e4c3159b5453fb6b.js +1 -0
  164. package/.next/static/chunks/app/api/projects/route-e4c3159b5453fb6b.js +1 -0
  165. package/.next/static/chunks/app/api/search/route-e4c3159b5453fb6b.js +1 -0
  166. package/.next/static/chunks/app/api/sessions/[id]/context/route-e4c3159b5453fb6b.js +1 -0
  167. package/.next/static/chunks/app/api/sessions/[id]/route-e4c3159b5453fb6b.js +1 -0
  168. package/.next/static/chunks/app/api/sessions/new/route-e4c3159b5453fb6b.js +1 -0
  169. package/.next/static/chunks/app/api/sessions/route-e4c3159b5453fb6b.js +1 -0
  170. package/.next/static/chunks/app/api/settings/route-e4c3159b5453fb6b.js +1 -0
  171. package/.next/static/chunks/app/api/skills/install/route-e4c3159b5453fb6b.js +1 -0
  172. package/.next/static/chunks/app/api/skills/route-e4c3159b5453fb6b.js +1 -0
  173. package/.next/static/chunks/app/api/skills/search/route-e4c3159b5453fb6b.js +1 -0
  174. package/.next/static/chunks/app/api/soul/route-e4c3159b5453fb6b.js +1 -0
  175. package/.next/static/chunks/app/api/version/route-e4c3159b5453fb6b.js +1 -0
  176. package/.next/static/chunks/app/page-e4c3159b5453fb6b.js +1 -0
  177. package/.next/static/chunks/app/workspace/{page-ff1403a471d556ca.js → page-1eeb93cd845060b2.js} +8 -8
  178. package/.next/static/chunks/next/dist/client/components/builtin/app-error-e4c3159b5453fb6b.js +1 -0
  179. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-e4c3159b5453fb6b.js +1 -0
  180. package/.next/static/chunks/next/dist/client/components/builtin/not-found-e4c3159b5453fb6b.js +1 -0
  181. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e4c3159b5453fb6b.js +1 -0
  182. package/.next/static/css/467c4b6fee759c2e.css +1 -0
  183. package/.next/static/vqqXuNPGDA1NWhJN5rLvR/_buildManifest.js +1 -0
  184. package/bin/annodex-im-gateway.js +273 -58
  185. package/bin/annodex.js +14 -0
  186. package/package.json +1 -1
  187. package/.next/static/35GeCDRUeg9OBUsdN7kvk/_buildManifest.js +0 -1
  188. package/.next/static/chunks/app/api/agent/runtime/route-44cbd53a31a3f701.js +0 -1
  189. package/.next/static/chunks/app/api/auth/all-providers/route-44cbd53a31a3f701.js +0 -1
  190. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-44cbd53a31a3f701.js +0 -1
  191. package/.next/static/chunks/app/api/auth/login/[provider]/route-44cbd53a31a3f701.js +0 -1
  192. package/.next/static/chunks/app/api/auth/login/route-44cbd53a31a3f701.js +0 -1
  193. package/.next/static/chunks/app/api/auth/logout/[provider]/route-44cbd53a31a3f701.js +0 -1
  194. package/.next/static/chunks/app/api/auth/providers/route-44cbd53a31a3f701.js +0 -1
  195. package/.next/static/chunks/app/api/auth/status/route-44cbd53a31a3f701.js +0 -1
  196. package/.next/static/chunks/app/api/default-cwd/route-44cbd53a31a3f701.js +0 -1
  197. package/.next/static/chunks/app/api/extensions/discover/route-44cbd53a31a3f701.js +0 -1
  198. package/.next/static/chunks/app/api/extensions/mcp/route-44cbd53a31a3f701.js +0 -1
  199. package/.next/static/chunks/app/api/extensions/plugin/route-44cbd53a31a3f701.js +0 -1
  200. package/.next/static/chunks/app/api/extensions/plugin-marketplace/route-44cbd53a31a3f701.js +0 -1
  201. package/.next/static/chunks/app/api/extensions/route-44cbd53a31a3f701.js +0 -1
  202. package/.next/static/chunks/app/api/extensions/session/route-44cbd53a31a3f701.js +0 -1
  203. package/.next/static/chunks/app/api/files/[...path]/route-44cbd53a31a3f701.js +0 -1
  204. package/.next/static/chunks/app/api/harness/route-44cbd53a31a3f701.js +0 -1
  205. package/.next/static/chunks/app/api/home/route-44cbd53a31a3f701.js +0 -1
  206. package/.next/static/chunks/app/api/im/project/route-44cbd53a31a3f701.js +0 -1
  207. package/.next/static/chunks/app/api/im/projects/route-44cbd53a31a3f701.js +0 -1
  208. package/.next/static/chunks/app/api/im/turn/route-44cbd53a31a3f701.js +0 -1
  209. package/.next/static/chunks/app/api/images/upload/route-44cbd53a31a3f701.js +0 -1
  210. package/.next/static/chunks/app/api/internal/runtime/route-44cbd53a31a3f701.js +0 -1
  211. package/.next/static/chunks/app/api/memory/promote/route-44cbd53a31a3f701.js +0 -1
  212. package/.next/static/chunks/app/api/memory/recall/route-44cbd53a31a3f701.js +0 -1
  213. package/.next/static/chunks/app/api/memory/reflect/route-44cbd53a31a3f701.js +0 -1
  214. package/.next/static/chunks/app/api/memory/retain/route-44cbd53a31a3f701.js +0 -1
  215. package/.next/static/chunks/app/api/memory/status/route-44cbd53a31a3f701.js +0 -1
  216. package/.next/static/chunks/app/api/models/route-44cbd53a31a3f701.js +0 -1
  217. package/.next/static/chunks/app/api/models-config/discover/route-44cbd53a31a3f701.js +0 -1
  218. package/.next/static/chunks/app/api/models-config/route-44cbd53a31a3f701.js +0 -1
  219. package/.next/static/chunks/app/api/models-config/test/route-44cbd53a31a3f701.js +0 -1
  220. package/.next/static/chunks/app/api/projects/browse/route-44cbd53a31a3f701.js +0 -1
  221. package/.next/static/chunks/app/api/projects/route-44cbd53a31a3f701.js +0 -1
  222. package/.next/static/chunks/app/api/search/route-44cbd53a31a3f701.js +0 -1
  223. package/.next/static/chunks/app/api/sessions/[id]/context/route-44cbd53a31a3f701.js +0 -1
  224. package/.next/static/chunks/app/api/sessions/[id]/route-44cbd53a31a3f701.js +0 -1
  225. package/.next/static/chunks/app/api/sessions/new/route-44cbd53a31a3f701.js +0 -1
  226. package/.next/static/chunks/app/api/sessions/route-44cbd53a31a3f701.js +0 -1
  227. package/.next/static/chunks/app/api/settings/route-44cbd53a31a3f701.js +0 -1
  228. package/.next/static/chunks/app/api/skills/install/route-44cbd53a31a3f701.js +0 -1
  229. package/.next/static/chunks/app/api/skills/route-44cbd53a31a3f701.js +0 -1
  230. package/.next/static/chunks/app/api/skills/search/route-44cbd53a31a3f701.js +0 -1
  231. package/.next/static/chunks/app/api/soul/route-44cbd53a31a3f701.js +0 -1
  232. package/.next/static/chunks/app/api/version/route-44cbd53a31a3f701.js +0 -1
  233. package/.next/static/chunks/app/page-44cbd53a31a3f701.js +0 -1
  234. package/.next/static/chunks/next/dist/client/components/builtin/app-error-44cbd53a31a3f701.js +0 -1
  235. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-44cbd53a31a3f701.js +0 -1
  236. package/.next/static/chunks/next/dist/client/components/builtin/not-found-44cbd53a31a3f701.js +0 -1
  237. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-44cbd53a31a3f701.js +0 -1
  238. package/.next/static/css/344e9ed83d2f01be.css +0 -1
  239. /package/.next/static/{35GeCDRUeg9OBUsdN7kvk → vqqXuNPGDA1NWhJN5rLvR}/_ssgManifest.js +0 -0
@@ -23,6 +23,33 @@ function getAgentDir() {
23
23
  return envFirst("ANNODEX_CONFIG_DIR", "ANNOVIBE_CONFIG_DIR") ?? path.join(os.homedir(), ".config", "annodex");
24
24
  }
25
25
 
26
+ function ensureAgentDir() {
27
+ const dir = getAgentDir();
28
+ try {
29
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
30
+ fs.accessSync(dir, fs.constants.W_OK);
31
+ } catch (error) {
32
+ const code = error && typeof error === "object" && "code" in error ? error.code : "";
33
+ const user = os.userInfo().username;
34
+ if (code === "EACCES") {
35
+ throw new Error(
36
+ `Cannot write annodex config dir for user ${user}: ${dir}. Check HOME permissions (same model as annodex CLI).`,
37
+ );
38
+ }
39
+ throw error;
40
+ }
41
+ return dir;
42
+ }
43
+
44
+ function readAnnodexState() {
45
+ const statePath = path.join(getAgentDir(), "annodex.json");
46
+ try {
47
+ return JSON.parse(fs.readFileSync(statePath, "utf8"));
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+
26
53
  function readGatewayToken() {
27
54
  const statePath = path.join(getAgentDir(), "im-gateway.json");
28
55
  try {
@@ -33,36 +60,23 @@ function readGatewayToken() {
33
60
  }
34
61
  }
35
62
 
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
63
+ function formatImApiError(statusCode, parsed) {
64
+ const message = parsed.error || parsed.reply || `HTTP ${statusCode}`;
65
+ if (statusCode === 401) {
66
+ return `${message}. Ensure annodex is running in this Linux account and gateway token is synced (restart annodex-im-gateway after saving IM settings).`;
56
67
  }
57
- return undefined;
68
+ if (statusCode === 403) {
69
+ return `${message}. annodex-im-gateway must reach annodex on localhost, or configure a gateway token in Settings → Project → WeCom IM.`;
70
+ }
71
+ return message;
58
72
  }
59
73
 
60
- function requestJson(method, pathname, body) {
74
+ function requestJsonRaw(method, pathname, body, options = {}) {
61
75
  const baseUrl = resolveBaseUrl();
62
76
  const url = new URL(pathname, baseUrl);
63
77
  const payload = body === undefined ? undefined : JSON.stringify(body);
64
78
  const lib = url.protocol === "https:" ? https : http;
65
- const token = readGatewayToken();
79
+ const token = options.skipAuth ? "" : readGatewayToken();
66
80
 
67
81
  return new Promise((resolve, reject) => {
68
82
  const req = lib.request(
@@ -92,7 +106,7 @@ function requestJson(method, pathname, body) {
92
106
  return;
93
107
  }
94
108
  if (res.statusCode && res.statusCode >= 400) {
95
- reject(new Error(parsed.error || parsed.reply || `HTTP ${res.statusCode}`));
109
+ reject(new Error(formatImApiError(res.statusCode, parsed)));
96
110
  return;
97
111
  }
98
112
  resolve(parsed);
@@ -105,12 +119,150 @@ function requestJson(method, pathname, body) {
105
119
  });
106
120
  }
107
121
 
108
- function readSecret(secretPath) {
122
+ function requestJson(method, pathname, body) {
123
+ return requestJsonRaw(method, pathname, body);
124
+ }
125
+
126
+ function parseSseEvents(buffer) {
127
+ const events = [];
128
+ const parts = buffer.split("\n\n");
129
+ const remainder = parts.pop() ?? "";
130
+ for (const part of parts) {
131
+ for (const line of part.split("\n")) {
132
+ if (!line.startsWith("data: ")) continue;
133
+ try {
134
+ events.push(JSON.parse(line.slice(6)));
135
+ } catch {
136
+ // ignore malformed frames
137
+ }
138
+ }
139
+ }
140
+ return { events, remainder };
141
+ }
142
+
143
+ function requestImTurnStream(body, handlers = {}) {
144
+ const baseUrl = resolveBaseUrl();
145
+ const url = new URL("/api/im/turn", baseUrl);
146
+ const payload = JSON.stringify(body);
147
+ const lib = url.protocol === "https:" ? https : http;
148
+ const token = readGatewayToken();
149
+
150
+ return new Promise((resolve, reject) => {
151
+ const req = lib.request(
152
+ url,
153
+ {
154
+ method: "POST",
155
+ headers: {
156
+ "Content-Type": "application/json",
157
+ "Content-Length": Buffer.byteLength(payload),
158
+ Accept: "text/event-stream",
159
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
160
+ },
161
+ },
162
+ (res) => {
163
+ if (res.statusCode && res.statusCode >= 400) {
164
+ let data = "";
165
+ res.setEncoding("utf8");
166
+ res.on("data", (chunk) => { data += chunk; });
167
+ res.on("end", () => {
168
+ let parsed;
169
+ try {
170
+ parsed = data ? JSON.parse(data) : {};
171
+ } catch {
172
+ parsed = { error: data || `HTTP ${res.statusCode}` };
173
+ }
174
+ reject(new Error(formatImApiError(res.statusCode, parsed)));
175
+ });
176
+ return;
177
+ }
178
+
179
+ let buffer = "";
180
+ let doneEvent = null;
181
+
182
+ const handleEvents = (events) => {
183
+ for (const event of events) {
184
+ if (!event || typeof event !== "object") continue;
185
+ if (event.type === "status" && typeof handlers.onStatus === "function") {
186
+ handlers.onStatus(event.phase);
187
+ }
188
+ if (event.type === "delta" && typeof event.text === "string" && typeof handlers.onDelta === "function") {
189
+ handlers.onDelta(event.text);
190
+ }
191
+ if (event.type === "done") {
192
+ doneEvent = event;
193
+ }
194
+ }
195
+ };
196
+
197
+ res.setEncoding("utf8");
198
+ res.on("data", (chunk) => {
199
+ buffer += chunk;
200
+ const parsed = parseSseEvents(buffer);
201
+ buffer = parsed.remainder;
202
+ handleEvents(parsed.events);
203
+ });
204
+ res.on("end", () => {
205
+ if (buffer.trim()) {
206
+ const parsed = parseSseEvents(`${buffer}\n\n`);
207
+ handleEvents(parsed.events);
208
+ }
209
+ if (doneEvent) {
210
+ resolve(doneEvent);
211
+ return;
212
+ }
213
+ reject(new Error("IM turn stream ended without a done event"));
214
+ });
215
+ },
216
+ );
217
+ req.on("error", reject);
218
+ req.write(payload);
219
+ req.end();
220
+ });
221
+ }
222
+
223
+ function resolveBaseUrl() {
224
+ const explicit = envFirst("ANNODEX_URL", "ANNOVIBE_URL");
225
+ if (explicit) return explicit.replace(/\/$/, "");
226
+
227
+ const state = readAnnodexState();
228
+ if (state?.url) {
229
+ return String(state.url).replace(/\/$/, "");
230
+ }
231
+
232
+ const listenPort = envFirst("ANNODEX_PORT", "PORT") ?? state?.port;
233
+ const listenHost = envFirst("ANNODEX_HOST", "HOSTNAME") ?? state?.hostname ?? "127.0.0.1";
234
+ if (listenPort) {
235
+ return `http://${listenHost}:${listenPort}`;
236
+ }
237
+
238
+ const user = os.userInfo().username;
239
+ throw new Error(
240
+ `No annodex server for user ${user}. Run annodex in this account first, or set ANNODEX_URL (config: ${getAgentDir()}).`,
241
+ );
242
+ }
243
+
244
+ async function syncGatewayTokenFromServer() {
109
245
  try {
110
- const raw = JSON.parse(fs.readFileSync(secretPath, "utf8"));
111
- return typeof raw.botSecret === "string" ? raw.botSecret.trim() : "";
112
- } catch {
113
- return "";
246
+ const payload = await requestJsonRaw("GET", "/api/im/gateway-token", undefined, { skipAuth: true });
247
+ const serverToken = typeof payload.token === "string" ? payload.token.trim() : "";
248
+ const serverConfigDir = typeof payload.configDir === "string" ? payload.configDir.trim() : "";
249
+ const localConfigDir = getAgentDir();
250
+
251
+ if (serverConfigDir && serverConfigDir !== localConfigDir) {
252
+ console.error(
253
+ `[im] note: annodex server config is ${serverConfigDir}; this gateway uses ${localConfigDir}. IM projects and secrets come from the server account.`,
254
+ );
255
+ }
256
+
257
+ if (!serverToken) return;
258
+
259
+ const localToken = readGatewayToken();
260
+ if (localToken === serverToken) return;
261
+
262
+ writeGatewayState({ token: serverToken });
263
+ console.error("[im] synced gateway token from annodex server");
264
+ } catch (error) {
265
+ console.error(`[im] could not sync gateway token: ${String(error)}`);
114
266
  }
115
267
  }
116
268
 
@@ -341,6 +493,12 @@ class WeComLiveReply {
341
493
  this.transport = transport;
342
494
  this.reqId = reqId;
343
495
  this.revision = 0;
496
+ this.streamId = `${reqId}-stream`;
497
+ this.pushIntervalMs = 300;
498
+ this.lastPushAt = 0;
499
+ this.pendingText = null;
500
+ this.pushTimer = null;
501
+ this.pushChain = Promise.resolve();
344
502
  }
345
503
 
346
504
  nextRevision() {
@@ -349,35 +507,66 @@ class WeComLiveReply {
349
507
  }
350
508
 
351
509
  async beginProcessing() {
352
- await this.transport.replyStream(
353
- this.reqId,
354
- `${Date.now()}-start`,
355
- applyWeComRevisionSuffix(formatProcessingPlaceholder(1), this.nextRevision()),
356
- true,
357
- );
510
+ await this.pushImmediate(formatProcessingPlaceholder(1), false);
358
511
  }
359
512
 
360
513
  async refreshProcessing(elapsedSeconds) {
361
- await this.transport.replyStream(
362
- this.reqId,
363
- `${Date.now()}-progress`,
364
- applyWeComRevisionSuffix(formatProcessingPlaceholder(elapsedSeconds), this.nextRevision()),
365
- true,
366
- );
514
+ await this.pushImmediate(formatProcessingPlaceholder(elapsedSeconds), false);
515
+ }
516
+
517
+ schedulePush(text) {
518
+ this.pendingText = text;
519
+ const now = Date.now();
520
+ if (now - this.lastPushAt >= this.pushIntervalMs) {
521
+ void this.flushPush();
522
+ return;
523
+ }
524
+ if (this.pushTimer) return;
525
+ this.pushTimer = setTimeout(() => {
526
+ void this.flushPush();
527
+ }, this.pushIntervalMs - (now - this.lastPushAt));
528
+ }
529
+
530
+ async push(text) {
531
+ await this.pushImmediate(text, false);
367
532
  }
368
533
 
369
534
  async finish(text) {
370
- await this.transport.replyStream(
371
- this.reqId,
372
- `${Date.now()}-final`,
373
- applyWeComRevisionSuffix(text, this.nextRevision()),
374
- true,
375
- );
535
+ if (this.pushTimer) {
536
+ clearTimeout(this.pushTimer);
537
+ this.pushTimer = null;
538
+ }
539
+ this.pendingText = null;
540
+ await this.pushImmediate(text, true);
376
541
  }
377
542
 
378
543
  async fail(text) {
379
544
  await this.finish(text);
380
545
  }
546
+
547
+ async flushPush() {
548
+ if (this.pushTimer) {
549
+ clearTimeout(this.pushTimer);
550
+ this.pushTimer = null;
551
+ }
552
+ const text = this.pendingText;
553
+ if (text === null) return;
554
+ this.pendingText = null;
555
+ await this.pushImmediate(text, false);
556
+ }
557
+
558
+ async pushImmediate(text, finish) {
559
+ this.pushChain = this.pushChain.then(async () => {
560
+ await this.transport.replyStream(
561
+ this.reqId,
562
+ this.streamId,
563
+ applyWeComRevisionSuffix(text, this.nextRevision()),
564
+ finish,
565
+ );
566
+ this.lastPushAt = Date.now();
567
+ });
568
+ await this.pushChain;
569
+ }
381
570
  }
382
571
 
383
572
  class ProjectWeComBridge {
@@ -390,9 +579,9 @@ class ProjectWeComBridge {
390
579
 
391
580
  async start() {
392
581
  if (this.stopped) return;
393
- const secret = readSecret(this.project.secretPath);
582
+ const secret = typeof this.project.botSecret === "string" ? this.project.botSecret.trim() : "";
394
583
  if (!secret) {
395
- console.error(`[im] missing bot secret for ${this.project.cwd}`);
584
+ console.error(`[im] missing bot secret for ${this.project.cwd} (annodex server did not return botSecret)`);
396
585
  this.scheduleReconnect(30_000);
397
586
  return;
398
587
  }
@@ -439,28 +628,39 @@ class ProjectWeComBridge {
439
628
  const reply = new WeComLiveReply(this.client, inbound.reqId);
440
629
  const startedAt = Date.now();
441
630
  let refreshTimer = null;
631
+ let toolsRunning = false;
442
632
 
443
633
  try {
444
634
  await reply.beginProcessing();
445
635
  refreshTimer = setInterval(() => {
446
- const elapsed = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));
447
- void reply.refreshProcessing(elapsed).catch(() => undefined);
636
+ if (toolsRunning) {
637
+ const elapsed = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));
638
+ void reply.refreshProcessing(elapsed).catch(() => undefined);
639
+ }
448
640
  }, 5_000);
449
641
 
450
- const result = await requestJson("POST", "/api/im/turn", {
642
+ const result = await requestImTurnStream({
451
643
  cwd: this.project.cwd,
452
644
  userId: inbound.userId,
453
645
  message: inbound.content,
454
646
  chatId: inbound.chatId,
647
+ }, {
648
+ onStatus: (phase) => {
649
+ toolsRunning = phase === "running_tools" || phase === "waiting_model";
650
+ },
651
+ onDelta: (text) => {
652
+ toolsRunning = false;
653
+ reply.schedulePush(text);
654
+ },
455
655
  });
456
656
 
457
657
  if (result.ok === false) {
458
- console.error(`[im] turn failed for ${this.project.cwd} user ${inbound.userId}: ${result.error || result.reply || "unknown error"}`);
658
+ console.error(`[im] turn failed for ${this.project.cwd} user ${inbound.userId}: ${result.reply || "unknown error"}`);
459
659
  }
460
660
 
461
661
  const text = typeof result.reply === "string" && result.reply.trim()
462
662
  ? result.reply.trim()
463
- : (result.error ? String(result.error) : "No reply from annodex.");
663
+ : "No reply from annodex.";
464
664
  await reply.finish(text);
465
665
  } catch (error) {
466
666
  console.error(`[im] turn request failed for ${this.project.cwd} user ${inbound.userId}: ${String(error)}`);
@@ -492,7 +692,7 @@ class ImGateway {
492
692
  const activeKeys = new Set();
493
693
 
494
694
  for (const project of projects) {
495
- if (!project?.cwd || !project?.botId || !project?.secretPath) continue;
695
+ if (!project?.cwd || !project?.botId || !project?.botSecret) continue;
496
696
  activeKeys.add(project.cwd);
497
697
  if (this.bridges.has(project.cwd)) {
498
698
  this.bridges.get(project.cwd).project = project;
@@ -536,8 +736,19 @@ function writeGatewayState(patch) {
536
736
  } catch {
537
737
  // ignore
538
738
  }
539
- fs.mkdirSync(path.dirname(statePath), { recursive: true });
540
- fs.writeFileSync(statePath, JSON.stringify({ ...state, ...patch }, null, 2), "utf8");
739
+ try {
740
+ fs.mkdirSync(path.dirname(statePath), { recursive: true });
741
+ fs.writeFileSync(statePath, JSON.stringify({ ...state, ...patch }, null, 2), "utf8");
742
+ } catch (error) {
743
+ if (error && typeof error === "object" && "code" in error && error.code === "EACCES") {
744
+ const user = os.userInfo().username;
745
+ console.error(
746
+ `[im] warning: cannot write ${statePath} for user ${user}. Each account uses its own ~/.config/annodex — do not point ANNODEX_CONFIG_DIR at another user's home.`,
747
+ );
748
+ return;
749
+ }
750
+ throw error;
751
+ }
541
752
  }
542
753
 
543
754
  async function main() {
@@ -550,7 +761,11 @@ async function main() {
550
761
  process.on("SIGINT", () => { void shutdown(); });
551
762
  process.on("SIGTERM", () => { void shutdown(); });
552
763
 
553
- console.error(`[im] annodex-im-gateway starting (${resolveBaseUrl()})`);
764
+ const configDir = ensureAgentDir();
765
+ const user = os.userInfo().username;
766
+ const baseUrl = resolveBaseUrl();
767
+ console.error(`[im] annodex-im-gateway user=${user} config=${configDir} annodex=${baseUrl}`);
768
+ await syncGatewayTokenFromServer();
554
769
  await gateway.start();
555
770
  }
556
771
 
package/bin/annodex.js CHANGED
@@ -1132,6 +1132,7 @@ Usage:
1132
1132
  annodex stop Stop background annodex (and orphaned codex app-server processes)
1133
1133
  annodex status [--json] Show background server status
1134
1134
  annodex logs [-f] Show background server logs
1135
+ annodex im-gateway Run WeCom IM sidecar (uses this user's ~/.config/annodex)
1135
1136
  annodex doctor [--json] [--repair] Diagnose local codex/runtime setup
1136
1137
  annodex passwd Set or change password (empty = disable auth)
1137
1138
  annodex update Update to the latest version
@@ -1166,6 +1167,19 @@ if (firstPos === "logs") {
1166
1167
  return;
1167
1168
  }
1168
1169
 
1170
+ if (firstPos === "im-gateway") {
1171
+ const gatewayScript = path.join(__dirname, "annodex-im-gateway.js");
1172
+ const child = spawn(process.execPath, [gatewayScript, ...positionals.slice(1)], {
1173
+ stdio: "inherit",
1174
+ env: process.env,
1175
+ });
1176
+ child.on("exit", (code, signal) => {
1177
+ if (signal) process.exit(1);
1178
+ process.exit(code ?? 0);
1179
+ });
1180
+ return;
1181
+ }
1182
+
1169
1183
  if (firstPos === "stop") {
1170
1184
  stopManagedServer()
1171
1185
  .then((code) => process.exit(code))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seqyuan/annodex",
3
- "version": "0.1.67",
3
+ "version": "0.1.69",
4
4
  "description": "AI-native bioinformatics workspace by Annoroad",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:46,errorRate:1e-4,numBits:882,numHashes:14,bitArray:[1,1,1,0,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,0,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,0,0,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,0,0,0,1,0,1,1,0,1,1,0,0,1,0,1,1,0,0,1,1,0,0,1,1,1,0,1,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,1,0,0,1,0,0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,0,1,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,0,0,1,1,0,0,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,1,1,0,0,0,1,0,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,1,0,1,0,1,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,1,1,0,1,1,0,1,1,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,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,186,222,552,976,1004,1097,1109,1327,1541,1852,1921,2234,2752,2922,2976,3412,3785,3851,3955,4037,4352,4368,4610,4896,5177,5221,5281,5738,5781,5907,6202,6450,6709,6819,6849,6919,6988,7070,7473,7483,7758,7778,7812,7851,8167,8658,8733,8743,8933,8974,9787,9949,9968],{84441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=84441)),_N_E=_.O()}]);