synapse-orch-ai 1.5.1 → 1.5.3

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 (196) hide show
  1. package/backend/core/builder_tools.py +24 -1
  2. package/backend/core/mcp_client.py +2 -0
  3. package/backend/core/models.py +1 -0
  4. package/backend/core/native_builder/__init__.py +1 -1
  5. package/backend/core/native_builder/agents/agent_creator.json +1 -1
  6. package/backend/core/native_builder/orchestration.json +1 -1
  7. package/backend/core/routes/agents.py +19 -0
  8. package/backend/core/routes/repos.py +29 -3
  9. package/backend/core/server.py +1 -1
  10. package/backend/services/code_indexer.py +37 -13
  11. package/frontend-build/.next/BUILD_ID +1 -1
  12. package/frontend-build/.next/build-manifest.json +6 -6
  13. package/frontend-build/.next/prerender-manifest.json +3 -3
  14. package/frontend-build/.next/server/app/_global-error/page/build-manifest.json +3 -3
  15. package/frontend-build/.next/server/app/_global-error/page.js +3 -3
  16. package/frontend-build/.next/server/app/_global-error/page.js.nft.json +1 -1
  17. package/frontend-build/.next/server/app/_global-error.html +1 -1
  18. package/frontend-build/.next/server/app/_global-error.rsc +1 -1
  19. package/frontend-build/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  20. package/frontend-build/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  21. package/frontend-build/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/frontend-build/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/frontend-build/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/frontend-build/.next/server/app/_not-found/page/build-manifest.json +3 -3
  25. package/frontend-build/.next/server/app/_not-found/page/next-font-manifest.json +2 -2
  26. package/frontend-build/.next/server/app/_not-found/page.js +3 -3
  27. package/frontend-build/.next/server/app/_not-found/page.js.nft.json +1 -1
  28. package/frontend-build/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  29. package/frontend-build/.next/server/app/_not-found.html +1 -1
  30. package/frontend-build/.next/server/app/_not-found.rsc +2 -2
  31. package/frontend-build/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  32. package/frontend-build/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  33. package/frontend-build/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  34. package/frontend-build/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  35. package/frontend-build/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  36. package/frontend-build/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  37. package/frontend-build/.next/server/app/index.html +1 -1
  38. package/frontend-build/.next/server/app/index.rsc +4 -4
  39. package/frontend-build/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  40. package/frontend-build/.next/server/app/index.segments/_full.segment.rsc +4 -4
  41. package/frontend-build/.next/server/app/index.segments/_head.segment.rsc +1 -1
  42. package/frontend-build/.next/server/app/index.segments/_index.segment.rsc +2 -2
  43. package/frontend-build/.next/server/app/index.segments/_tree.segment.rsc +4 -4
  44. package/frontend-build/.next/server/app/login/page/build-manifest.json +3 -3
  45. package/frontend-build/.next/server/app/login/page/next-font-manifest.json +2 -2
  46. package/frontend-build/.next/server/app/login/page.js +3 -3
  47. package/frontend-build/.next/server/app/login/page.js.nft.json +1 -1
  48. package/frontend-build/.next/server/app/login/page_client-reference-manifest.js +1 -1
  49. package/frontend-build/.next/server/app/login.html +1 -1
  50. package/frontend-build/.next/server/app/login.rsc +4 -4
  51. package/frontend-build/.next/server/app/login.segments/_full.segment.rsc +4 -4
  52. package/frontend-build/.next/server/app/login.segments/_head.segment.rsc +1 -1
  53. package/frontend-build/.next/server/app/login.segments/_index.segment.rsc +2 -2
  54. package/frontend-build/.next/server/app/login.segments/_tree.segment.rsc +4 -4
  55. package/frontend-build/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  56. package/frontend-build/.next/server/app/login.segments/login.segment.rsc +1 -1
  57. package/frontend-build/.next/server/app/page/build-manifest.json +3 -3
  58. package/frontend-build/.next/server/app/page/next-font-manifest.json +2 -2
  59. package/frontend-build/.next/server/app/page.js +3 -3
  60. package/frontend-build/.next/server/app/page.js.nft.json +1 -1
  61. package/frontend-build/.next/server/app/page_client-reference-manifest.js +1 -1
  62. package/frontend-build/.next/server/app/settings/[tab]/page/build-manifest.json +3 -3
  63. package/frontend-build/.next/server/app/settings/[tab]/page/next-font-manifest.json +2 -2
  64. package/frontend-build/.next/server/app/settings/[tab]/page.js +3 -3
  65. package/frontend-build/.next/server/app/settings/[tab]/page.js.nft.json +1 -1
  66. package/frontend-build/.next/server/app/settings/[tab]/page_client-reference-manifest.js +1 -1
  67. package/frontend-build/.next/server/chunks/[root-of-the-server]__00ci3m0._.js +1 -1
  68. package/frontend-build/.next/server/chunks/[root-of-the-server]__01~.b7w._.js +1 -1
  69. package/frontend-build/.next/server/chunks/[root-of-the-server]__066njqe._.js +1 -1
  70. package/frontend-build/.next/server/chunks/[root-of-the-server]__08cioyi._.js +1 -1
  71. package/frontend-build/.next/server/chunks/[root-of-the-server]__0df0b6v._.js +1 -1
  72. package/frontend-build/.next/server/chunks/[root-of-the-server]__0efx8a5._.js +1 -1
  73. package/frontend-build/.next/server/chunks/[root-of-the-server]__0j8-xkl._.js +1 -1
  74. package/frontend-build/.next/server/chunks/[root-of-the-server]__0kk2o8d._.js +1 -1
  75. package/frontend-build/.next/server/chunks/[root-of-the-server]__0kyyn1g._.js +1 -1
  76. package/frontend-build/.next/server/chunks/[root-of-the-server]__0o2ckji._.js +1 -1
  77. package/frontend-build/.next/server/chunks/[root-of-the-server]__0r1_rdp._.js +1 -1
  78. package/frontend-build/.next/server/chunks/[root-of-the-server]__0s65g6m._.js +1 -1
  79. package/frontend-build/.next/server/chunks/[root-of-the-server]__0u8_aw2._.js +1 -1
  80. package/frontend-build/.next/server/chunks/[root-of-the-server]__0z5q5.1._.js +1 -1
  81. package/frontend-build/.next/server/chunks/[root-of-the-server]__0~o635_._.js +1 -1
  82. package/frontend-build/.next/server/chunks/[root-of-the-server]__10p49e~._.js +1 -1
  83. package/frontend-build/.next/server/chunks/[root-of-the-server]__115~uq6._.js +1 -1
  84. package/frontend-build/.next/server/chunks/[root-of-the-server]__12ug7cf._.js +1 -1
  85. package/frontend-build/.next/server/chunks/[root-of-the-server]__12vs3wg._.js +1 -1
  86. package/frontend-build/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0dh.2jf.js +1 -1
  87. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__098zro9._.js +19 -0
  88. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0fo_bex._.js +3 -0
  89. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0lb9jwe._.js +3 -0
  90. package/frontend-build/.next/server/chunks/ssr/{[root-of-the-server]__09c9368._.js → [root-of-the-server]__0p75w55._.js} +2 -2
  91. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0rt28lm._.js +3 -0
  92. package/frontend-build/.next/server/chunks/ssr/{[root-of-the-server]__10xgshr._.js → [root-of-the-server]__0tcyn68._.js} +2 -2
  93. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0zi~h76._.js +3 -0
  94. package/frontend-build/.next/server/chunks/ssr/_0b~n.nn._.js +4 -4
  95. package/frontend-build/.next/server/chunks/ssr/node_modules_0_ce7g1._.js +1 -1
  96. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +1 -1
  97. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_00t_ate.js +2 -2
  98. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_031v14j.js +2 -2
  99. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0328vov.js +2 -2
  100. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0p6f2go.js +2 -2
  101. package/frontend-build/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +2 -2
  102. package/frontend-build/.next/server/edge/chunks/[root-of-the-server]__08ca2jv._.js +2 -2
  103. package/frontend-build/.next/server/middleware-build-manifest.js +6 -6
  104. package/frontend-build/.next/server/middleware-manifest.json +6 -6
  105. package/frontend-build/.next/server/next-font-manifest.js +1 -1
  106. package/frontend-build/.next/server/next-font-manifest.json +8 -8
  107. package/frontend-build/.next/server/pages/404.html +1 -1
  108. package/frontend-build/.next/server/pages/500.html +1 -1
  109. package/frontend-build/.next/server/server-reference-manifest.js +1 -1
  110. package/frontend-build/.next/server/server-reference-manifest.json +1 -1
  111. package/frontend-build/.next/static/{yEEl_TTPPEzHJlgKg21Go → DtyFJXD-pPSV9CdbxSLpv}/_clientMiddlewareManifest.js +1 -1
  112. package/frontend-build/.next/static/chunks/{0j29xn-eqm8iz.css → 0.kqnisf2zxq0.css} +2 -2
  113. package/frontend-build/.next/static/chunks/{0h4a4y-~puu.x.js → 00xhsd~k-wxkl.js} +1 -1
  114. package/frontend-build/.next/static/chunks/0c7h~x4_chf35.js +2 -0
  115. package/frontend-build/.next/static/chunks/{0mw2uexyx0fyf.js → 0w-t2.wfp9bn7.js} +3 -3
  116. package/frontend-build/.next/static/chunks/{turbopack-0~_lks..-4osp.js → turbopack-09lztqg9--eu..js} +1 -1
  117. package/frontend-build/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
  118. package/frontend-build/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
  119. package/frontend-build/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
  120. package/frontend-build/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
  121. package/frontend-build/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
  122. package/frontend-build/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
  123. package/frontend-build/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
  124. package/frontend-build/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
  125. package/frontend-build/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
  126. package/frontend-build/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
  127. package/frontend-build/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
  128. package/frontend-build/node_modules/@next/env/package.json +1 -1
  129. package/frontend-build/node_modules/next/dist/build/static-paths/app.js +2 -1
  130. package/frontend-build/node_modules/next/dist/build/swc/index.js +1 -1
  131. package/frontend-build/node_modules/next/dist/build/utils.js +2 -1
  132. package/frontend-build/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +2 -2
  133. package/frontend-build/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +8 -2
  134. package/frontend-build/node_modules/next/dist/client/route-params.js +23 -6
  135. package/frontend-build/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +13 -13
  136. package/frontend-build/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +11 -11
  137. package/frontend-build/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
  138. package/frontend-build/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +10 -10
  139. package/frontend-build/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  140. package/frontend-build/node_modules/next/dist/server/app-render/action-handler.js +3 -6
  141. package/frontend-build/node_modules/next/dist/server/app-render/app-render.js +62 -9
  142. package/frontend-build/node_modules/next/dist/server/app-render/collect-segment-data.js +16 -0
  143. package/frontend-build/node_modules/next/dist/server/app-render/create-component-tree.js +49 -19
  144. package/frontend-build/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +8 -20
  145. package/frontend-build/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +8 -7
  146. package/frontend-build/node_modules/next/dist/server/app-render/use-flight-response.js +2 -2
  147. package/frontend-build/node_modules/next/dist/server/async-storage/work-store.js +2 -1
  148. package/frontend-build/node_modules/next/dist/server/base-server.js +13 -5
  149. package/frontend-build/node_modules/next/dist/server/config-schema.js +10 -2
  150. package/frontend-build/node_modules/next/dist/server/config.js +1 -1
  151. package/frontend-build/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  152. package/frontend-build/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  153. package/frontend-build/node_modules/next/dist/server/dev/static-paths-worker.js +2 -1
  154. package/frontend-build/node_modules/next/dist/server/image-optimizer.js +22 -2
  155. package/frontend-build/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  156. package/frontend-build/node_modules/next/dist/server/lib/is-rsc-request.js +18 -0
  157. package/frontend-build/node_modules/next/dist/server/lib/mock-request.js +30 -5
  158. package/frontend-build/node_modules/next/dist/server/lib/patch-set-header.js +7 -0
  159. package/frontend-build/node_modules/next/dist/server/lib/router-server.js +6 -3
  160. package/frontend-build/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +18 -4
  161. package/frontend-build/node_modules/next/dist/server/lib/server-ipc/utils.js +3 -1
  162. package/frontend-build/node_modules/next/dist/server/lib/start-server.js +1 -1
  163. package/frontend-build/node_modules/next/dist/server/next-server.js +1 -1
  164. package/frontend-build/node_modules/next/dist/server/render.js +27 -20
  165. package/frontend-build/node_modules/next/dist/server/request/fallback-params.js +27 -1
  166. package/frontend-build/node_modules/next/dist/server/route-modules/app-route/module.js +1 -0
  167. package/frontend-build/node_modules/next/dist/server/route-modules/route-module.js +11 -1
  168. package/frontend-build/node_modules/next/dist/server/server-utils.js +19 -2
  169. package/frontend-build/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +5 -5
  170. package/frontend-build/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
  171. package/frontend-build/node_modules/next/dist/server/web/adapter.js +4 -1
  172. package/frontend-build/node_modules/next/dist/server/web/edge-route-module-wrapper.js +2 -1
  173. package/frontend-build/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  174. package/frontend-build/node_modules/next/dist/{server → shared/lib}/htmlescape.js +15 -0
  175. package/frontend-build/node_modules/next/dist/shared/lib/router/routes/app.js +13 -1
  176. package/frontend-build/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +56 -10
  177. package/frontend-build/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  178. package/frontend-build/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  179. package/frontend-build/node_modules/next/dist/telemetry/events/version.js +2 -2
  180. package/frontend-build/node_modules/next/package.json +15 -15
  181. package/frontend-build/package.json +1 -1
  182. package/package.json +1 -1
  183. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__08l1kmh._.js +0 -3
  184. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +0 -19
  185. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0ffv7p5._.js +0 -3
  186. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__0m2-0f1._.js +0 -3
  187. package/frontend-build/.next/server/chunks/ssr/[root-of-the-server]__120kr3r._.js +0 -3
  188. package/frontend-build/.next/static/chunks/0e-wrhqh4h3r5.js +0 -2
  189. package/frontend-build/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
  190. package/frontend-build/.next/static/media/7178b3e590c64307-s.11.cyxs5p-0z~.woff2 +0 -0
  191. package/frontend-build/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
  192. package/frontend-build/.next/static/media/8a480f0b521d4e75-s.06d3mdzz5bre_.woff2 +0 -0
  193. package/frontend-build/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
  194. package/frontend-build/.next/static/media/caa3a2e1cccd8315-s.p.16t1db8_9y2o~.woff2 +0 -0
  195. /package/frontend-build/.next/static/{yEEl_TTPPEzHJlgKg21Go → DtyFJXD-pPSV9CdbxSLpv}/_buildManifest.js +0 -0
  196. /package/frontend-build/.next/static/{yEEl_TTPPEzHJlgKg21Go → DtyFJXD-pPSV9CdbxSLpv}/_ssgManifest.js +0 -0
@@ -98,7 +98,8 @@ BUILDER_TOOL_SCHEMAS = [
98
98
  "description": (
99
99
  "Create a new agent and save it. Returns the created agent with its new ID. "
100
100
  "Use type='conversational' for general-purpose agents, 'code' for agents that work with repos/files, "
101
- "'orchestrator' for agents that run orchestrations. "
101
+ "'orchestrator' for agents that run orchestrations, "
102
+ "'delegate' for agents that dynamically route queries to sub-agents (set delegate_agent_ids to restrict which agents it can delegate to; empty = all agents). "
102
103
  "Set tools=['all'] to give access to all tools, or list specific tool names."
103
104
  ),
104
105
  "parameters": {
@@ -134,6 +135,11 @@ BUILDER_TOOL_SCHEMAS = [
134
135
  "items": {"type": "string"},
135
136
  "description": "List of DB config IDs (for agents needing database access).",
136
137
  },
138
+ "delegate_agent_ids": {
139
+ "type": "array",
140
+ "items": {"type": "string"},
141
+ "description": "For delegate agents: list of agent IDs to restrict delegation to. Leave empty to allow delegation to any agent.",
142
+ },
137
143
  },
138
144
  "required": ["name", "description", "type", "tools", "system_prompt"],
139
145
  },
@@ -184,6 +190,11 @@ BUILDER_TOOL_SCHEMAS = [
184
190
  "type": "array",
185
191
  "items": {"type": "string"},
186
192
  },
193
+ "delegate_agent_ids": {
194
+ "type": "array",
195
+ "items": {"type": "string"},
196
+ "description": "For delegate agents: agent IDs to restrict delegation to. Empty = allow any agent.",
197
+ },
187
198
  },
188
199
  "required": ["name", "description", "type", "tools", "system_prompt"],
189
200
  },
@@ -623,6 +634,14 @@ BUILDER_TOOL_SCHEMAS = [
623
634
  "max_turns": {"type": "integer", "description": "Max agent turns (default 15)"},
624
635
  "timeout_seconds": {"type": "integer", "description": "Step timeout (default 300)"},
625
636
  "model": {"type": "string", "description": "LLM model override for this step"},
637
+ "include_full_history": {
638
+ "type": "boolean",
639
+ "description": (
640
+ "For agent/llm/tool steps: on re-invocation (evaluator loop-back or retry), "
641
+ "include every prior turn's inputs, tools, and output instead of only the last attempt. "
642
+ "Useful for feedback loops; increases prompt length."
643
+ ),
644
+ },
626
645
  },
627
646
  "required": ["orch_id", "step_id", "name", "type"],
628
647
  },
@@ -679,6 +698,7 @@ BUILDER_TOOL_SCHEMAS = [
679
698
  "max_turns": {"type": "integer"},
680
699
  "timeout_seconds": {"type": "integer"},
681
700
  "model": {"type": "string"},
701
+ "include_full_history": {"type": "boolean", "description": "Include full revision history on re-invocation (agent/llm/tool steps)"},
682
702
  },
683
703
  "required": ["step_id", "name", "type"],
684
704
  },
@@ -752,6 +772,7 @@ async def _dispatch(tool_name: str, args: dict, server_module: Any) -> Any:
752
772
  "model": args.get("model") or None,
753
773
  "provider": None,
754
774
  "max_turns": None,
775
+ "delegate_agent_ids": args.get("delegate_agent_ids", []) or [],
755
776
  }
756
777
  agents.append(agent)
757
778
  save_user_agents(agents)
@@ -793,6 +814,7 @@ async def _dispatch(tool_name: str, args: dict, server_module: Any) -> Any:
793
814
  "model": spec.get("model") or None,
794
815
  "provider": None,
795
816
  "max_turns": None,
817
+ "delegate_agent_ids": spec.get("delegate_agent_ids", []) or [],
796
818
  }
797
819
  agents.append(agent)
798
820
  created.append({
@@ -1559,6 +1581,7 @@ def _fill_step_defaults(steps: list) -> list:
1559
1581
  s.setdefault("switch_expression", None)
1560
1582
  s.setdefault("switch_cases", {})
1561
1583
  s.setdefault("switch_default_step_id", None)
1584
+ s.setdefault("include_full_history", None)
1562
1585
  result.append(s)
1563
1586
  return result
1564
1587
 
@@ -486,6 +486,7 @@ class MCPClientManager:
486
486
  if session:
487
487
  self._set_status(name, "connected")
488
488
  new_config["status"] = "connected"
489
+ await self._auto_register(name)
489
490
  return {"config": new_config, "connected": bool(session), "status": new_config["status"]}
490
491
 
491
492
  # Remote
@@ -494,6 +495,7 @@ class MCPClientManager:
494
495
  if session:
495
496
  self._set_status(name, "connected")
496
497
  new_config["status"] = "connected"
498
+ await self._auto_register(name)
497
499
  return {"config": new_config, "connected": bool(session), "status": new_config["status"]}
498
500
 
499
501
  # Remote + OAuth
@@ -152,6 +152,7 @@ class GeneratePromptRequest(BaseModel):
152
152
  agent_type: str = "conversational"
153
153
  tools: list[str] = []
154
154
  existing_prompt: str = ""
155
+ agents: list[dict] = [] # list of {id, name, description, type} — for delegate agents
155
156
 
156
157
 
157
158
  class GoogleCredsRequest(BaseModel):
@@ -24,7 +24,7 @@ __all__ = [
24
24
  # their zero-defaults (`route_map: {}`, `parallel_branches: []`, etc.) so the
25
25
  # engine deserialises cleanly.
26
26
  STEP_TYPE_CHEATSHEET = """\
27
- - **agent**: runs a configured sub-agent with a prompt + its tool set. Required: `agent_id`, `prompt_template`. Use for any step that needs multi-turn reasoning or tool use.
27
+ - **agent**: runs a configured sub-agent with a prompt + its tool set. Required: `agent_id`, `prompt_template`. Optional: `include_full_history` (bool) — on re-invocation show every prior turn's inputs/tools/output instead of only the last attempt; useful for feedback/retry loops. Use for any step that needs multi-turn reasoning or tool use.
28
28
  - **llm**: single one-shot LLM call, no tools. Required: `prompt_template` (optional `model`). Use for lightweight summarisation, rewriting, or deterministic prose generation.
29
29
  - **tool**: forces a single tool call with no LLM reasoning. Required: `forced_tool` (+ `agent_id` for tool-resolution). Use when the arguments are already in state and just need forwarding.
30
30
  - **evaluator**: pure routing node. Required: `route_map_json` (JSON-encoded `{label: target_step_id}`), `route_descriptions_json` (JSON), `evaluator_prompt`. Output_key stores the bare route label. Use to fork on a classifier decision.
@@ -16,5 +16,5 @@
16
16
  ],
17
17
  "repos": [],
18
18
  "db_configs": [],
19
- "system_prompt": "# Role\nYou are the Agent Creator for the Synapse AI Builder. You run AFTER a plan draft has been approved, and only when the plan needs new sub-agents that do not already exist.\n\n# Inputs you receive (via state)\n- `plan_draft` — the approved human-readable plan draft. It lists each role. For each new agent it includes bullets for **purpose**, **tools**, **repos**, and **type**.\n- `selected_agent_ids` — agent IDs the user pre-selected. Treat these as already-existing; do NOT recreate them.\n- `can_create_agents` — must be true to reach this step. If it is somehow false, emit an empty Markdown summary with a note and stop.\n\n# What to do — strict order\n\n1. **Parse the draft.** Read the **New agents to create** section. For each entry collect: role label, name, description, type (`conversational` / `code` / `orchestrator`), tools list, repos list, db_configs list (if any), and a focused single-paragraph system prompt specific to the role.\n\n2. **Resolve repo IDs (only if any new agent has a non-empty repos list).** Call `list_repos` ONCE. Match repo names from the draft to real repo IDs. If a referenced repo does not exist, omit it from that agent's `repos` and note the miss in your final output (do not invent IDs).\n\n3. **Create the agents in ONE batch.** Call `create_agents` exactly once with the full array. This is mandatory whenever more than one new agent is needed — it avoids context bloat and timeouts. Only fall back to `create_agent` (single) if `create_agents` returned an error AND you are creating exactly one agent.\n\n4. **Emit the Markdown summary.** Your final message MUST be only the Markdown agent list below — no preamble, no JSON. One `##` section per agent (new AND pre-existing). For pre-existing agents set **Existing:** yes.\n\n## <Agent Name>\n**Role:** <role label from plan>\n**ID:** <agent_id>\n**Type:** <conversational|code|orchestrator>\n**Description:** <one-line description>\n**Tools:** [tool1, tool2, ...]\n**Repos:** [repo_id, ...] *(omit line if repos is empty)*\n**Existing:** yes|no\n\nInclude BOTH newly-created agents AND pre-existing agents that the draft referenced (from `selected_agent_ids` or explicit `agent_xxxxxxx` IDs in the draft).\n\n# MCP tool names in agent `tools` lists\nWhen the plan specifies MCP server tools for a new agent:\n1. Call `list_tool_servers` ONCE to see available servers (name + type).\n2. Call `list_server_tools(server_name)` to get the raw tool names for any server the plan references.\n3. Compose the correct tool name:\n - **External MCP** (type = `stdio`, `sse`, or `external_mcp`): `\"{server_name}__{raw_tool_name}\"` (double underscore). Example: server `github`, tool `search_repositories` → `\"github__search_repositories\"`.\n - **Native MCP** (type = `native_mcp`): just `\"{raw_tool_name}\"` — no prefix.\n4. Use these composed names in the `tools` array when calling `create_agents`.\n\nNever guess MCP tool names — always discover them via the tools above.\n\n# Hard rules\n- **Never invent agent IDs.** Every `**ID:**` in the summary must come from either a `create_agents`/`create_agent` response OR the draft's existing references. If you did not call the tool, you do not have an ID. Period.\n- **Never modify existing agents** in this step.\n- **Keep each new agent's system prompt tight and role-specific.** Do not copy the full plan into it.\n- **Narrow `tools` list.** Include only what the role actually needs. Never `[\"all\"]` unless the role genuinely needs everything.\n- **Repos belong on `code`-type agents** (or any agent that must read/write code). Conversational agents usually have `repos: []`.\n- **Output only the Markdown summary** — no preamble, no explanations, no JSON. The saver reads this directly.\n- If `create_agents` returns `errors` for some specs, still emit the Markdown summary for whatever was successfully created and append a line `**Errors:** <error details>` at the bottom.\n\n# Tool-call budget\n- `list_repos`: at most 1 call\n- `list_agents` / `get_agent`: at most 1 call total, only if you need to verify a pre-existing ID\n- `get_tools_detail`: only if you need to confirm a tool name before attaching it to an agent\n- `create_agents`: exactly 1 call when creating >1 agent\n- `create_agent`: only as a fallback for single-agent creation\n\nStay under 8 turns. Do NOT retry a failed `create_agents` call more than once."
19
+ "system_prompt": "# Role\nYou are the Agent Creator for the Synapse AI Builder. You run AFTER a plan draft has been approved, and only when the plan needs new sub-agents that do not already exist.\n\n# Inputs you receive (via state)\n- `plan_draft` — the approved human-readable plan draft. It lists each role. For each new agent it includes bullets for **purpose**, **tools**, **repos**, and **type**.\n- `selected_agent_ids` — agent IDs the user pre-selected. Treat these as already-existing; do NOT recreate them.\n- `can_create_agents` — must be true to reach this step. If it is somehow false, emit an empty Markdown summary with a note and stop.\n\n# What to do — strict order\n\n1. **Parse the draft.** Read the **New agents to create** section. For each entry collect: role label, name, description, type (`conversational` / `code` / `orchestrator` / `delegate`), tools list, repos list, db_configs list (if any), delegate_agent_ids list (for delegate type only — empty list means any agent), and a focused single-paragraph system prompt specific to the role.\n\n2. **Resolve repo IDs (only if any new agent has a non-empty repos list).** Call `list_repos` ONCE. Match repo names from the draft to real repo IDs. If a referenced repo does not exist, omit it from that agent's `repos` and note the miss in your final output (do not invent IDs).\n\n3. **Create the agents in ONE batch.** Call `create_agents` exactly once with the full array. This is mandatory whenever more than one new agent is needed — it avoids context bloat and timeouts. Only fall back to `create_agent` (single) if `create_agents` returned an error AND you are creating exactly one agent.\n\n4. **Emit the Markdown summary.** Your final message MUST be only the Markdown agent list below — no preamble, no JSON. One `##` section per agent (new AND pre-existing). For pre-existing agents set **Existing:** yes.\n\n## <Agent Name>\n**Role:** <role label from plan>\n**ID:** <agent_id>\n**Type:** <conversational|code|orchestrator|delegate>\n**Description:** <one-line description>\n**Tools:** [tool1, tool2, ...]\n**Repos:** [repo_id, ...] *(omit line if repos is empty)*\n**Existing:** yes|no\n\nInclude BOTH newly-created agents AND pre-existing agents that the draft referenced (from `selected_agent_ids` or explicit `agent_xxxxxxx` IDs in the draft).\n\n# MCP tool names in agent `tools` lists\nWhen the plan specifies MCP server tools for a new agent:\n1. Call `list_tool_servers` ONCE to see available servers (name + type).\n2. Call `list_server_tools(server_name)` to get the raw tool names for any server the plan references.\n3. Compose the correct tool name:\n - **External MCP** (type = `stdio`, `sse`, or `external_mcp`): `\"{server_name}__{raw_tool_name}\"` (double underscore). Example: server `github`, tool `search_repositories` → `\"github__search_repositories\"`.\n - **Native MCP** (type = `native_mcp`): just `\"{raw_tool_name}\"` — no prefix.\n4. Use these composed names in the `tools` array when calling `create_agents`.\n\nNever guess MCP tool names — always discover them via the tools above.\n\n# Hard rules\n- **Never invent agent IDs.** Every `**ID:**` in the summary must come from either a `create_agents`/`create_agent` response OR the draft's existing references. If you did not call the tool, you do not have an ID. Period.\n- **Never modify existing agents** in this step.\n- **Keep each new agent's system prompt tight and role-specific.** Do not copy the full plan into it.\n- **Narrow `tools` list.** Include only what the role actually needs. Never `[\"all\"]` unless the role genuinely needs everything.\n- **Repos belong on `code`-type agents** (or any agent that must read/write code). Conversational agents usually have `repos: []`.\n- **`delegate_agent_ids` belongs on `delegate`-type agents only.** Pass the list of agent IDs the agent may route to, or an empty list to allow routing to any agent. Omit this field for all other types.\n- **Output only the Markdown summary** — no preamble, no explanations, no JSON. The saver reads this directly.\n- If `create_agents` returns `errors` for some specs, still emit the Markdown summary for whatever was successfully created and append a line `**Errors:** <error details>` at the bottom.\n\n# Tool-call budget\n- `list_repos`: at most 1 call\n- `list_agents` / `get_agent`: at most 1 call total, only if you need to verify a pre-existing ID\n- `get_tools_detail`: only if you need to confirm a tool name before attaching it to an agent\n- `create_agents`: exactly 1 call when creating >1 agent\n- `create_agent`: only as a fallback for single-agent creation\n\nStay under 8 turns. Do NOT retry a failed `create_agents` call more than once."
20
20
  }
@@ -196,7 +196,7 @@
196
196
  "name": "Draft Plan",
197
197
  "type": "llm",
198
198
  "agent_id": null,
199
- "prompt_template": "You are the Plan Drafter for the Synapse AI Builder. Produce a HUMAN-READABLE markdown draft of the orchestration plan. The user will read this next and either approve it or send revision feedback. After approval, a saver agent reads this draft to materialise the real orchestration JSON, so the draft must be precise enough to act on.\n\n# Inputs\nIntent: {state.intent}\n\nRequirements spec:\n{state.requirements}\n\nExisting orchestration (only on update; empty otherwise):\n{state.existing_orch}\n\nPre-selected agent IDs: {state.selected_agent_ids}\nCan create new agents: {state.can_create_agents}\n\nPrevious draft (empty on first pass):\n{state.plan_draft}\n\nUser's revision feedback on the previous draft (empty on first pass):\n{state.review_feedback}\n\n# Step-type palette (use these — never invent a type)\n{{STEP_TYPE_CHEATSHEET}}\n\n# What to write\nMarkdown with these sections, in this order:\n\n## Overview\nOne paragraph: what the orchestration does end-to-end. On update, call out what is changing vs the existing definition.\n\n## State schema\nBullet list of state keys with type and one-line purpose.\n\n## Steps\nNumbered list. For each step:\n- **Name** (step type: one of agent / llm / evaluator / human / parallel / merge / loop / transform / tool / end)\n- What it does, its input keys, its output key, and its next step (or route map for evaluators).\n- For agent steps: role name AND whether it maps to an existing agent (`agent_xxxxxxx`) or a NEW agent to create (describe its job + tools).\n- For tool steps: the forced tool name. If you are uncertain a tool exists, flag it under Open questions rather than guessing.\n- For human steps: the prompt the user will see and the fields collected.\n\n## Agents summary\nTwo short lists:\n- **Existing agents reused**: one line each — `role → agent_id (name)`.\n- **New agents to create**: one block per new agent. Each block uses this exact shape so the downstream Agent Creator can parse it deterministically:\n - `role: <role_label>` — short identifier used elsewhere in the plan (e.g. `question_generator`).\n - `name: <Display Name>` — what the agent will be called.\n - `type: conversational | code | orchestrator` — pick `code` ONLY if the agent reads/writes a repo; pick `orchestrator` only if it runs a sub-orchestration; everything else is `conversational`.\n - `purpose: <one sentence>` — what this agent does end-to-end.\n - `tools: [tool_name, tool_name]` — narrow list, only what the role needs. Use real tool names (confirmed by the analyst via `get_tools_detail`). Never `[\"all\"]`.\n - `repos: [repo_id, repo_id]` — real repo IDs from `list_repos`. Use `[]` for conversational agents that do not touch code.\n - `db_configs: [db_id]` — real DB IDs from `list_db_configs`. Use `[]` if none.\n\n (If `can_create_agents` is false, still list the blocks and add a `status: CANNOT CREATE — creation disabled` line so the user can enable it or pre-select an existing agent.)\n\n## Flow\nClose with a fenced code block tagged `flow` showing the wiring as ASCII. Use the role/step name (not a fabricated step_id) and label the type. Example shape:\n\n```flow\nintake (agent: analyst)\n ↓\nroute (evaluator)\n ├─ a → process (llm)\n └─ b → fallback (human)\n ↓\n end (end)\n```\n\nKeep it scannable — one node per line, one arrow per edge, evaluator branches with `├─`/`└─`, convergence shown by sharing the next line. The user uses this diagram to sanity-check wiring before approval.\n\n## Open questions\nOnly include this section if something is genuinely ambiguous. One bullet per question.\n\n# Rules\n- Write plain markdown, no code fences around the whole thing (the `flow` block is the only fenced block).\n- If `review_feedback` is non-empty, treat the previous draft as a starting point and revise per the feedback — do not start from scratch unless the user asked you to.\n- Do NOT produce raw orchestration JSON here. This is the human-facing draft. The JSON is produced by the saver agent later.\n- Keep it concise — the user will read this.",
199
+ "prompt_template": "You are the Plan Drafter for the Synapse AI Builder. Produce a HUMAN-READABLE markdown draft of the orchestration plan. The user will read this next and either approve it or send revision feedback. After approval, a saver agent reads this draft to materialise the real orchestration JSON, so the draft must be precise enough to act on.\n\n# Inputs\nIntent: {state.intent}\n\nRequirements spec:\n{state.requirements}\n\nExisting orchestration (only on update; empty otherwise):\n{state.existing_orch}\n\nPre-selected agent IDs: {state.selected_agent_ids}\nCan create new agents: {state.can_create_agents}\n\nPrevious draft (empty on first pass):\n{state.plan_draft}\n\nUser's revision feedback on the previous draft (empty on first pass):\n{state.review_feedback}\n\n# Step-type palette (use these — never invent a type)\n{{STEP_TYPE_CHEATSHEET}}\n\n# What to write\nMarkdown with these sections, in this order:\n\n## Overview\nOne paragraph: what the orchestration does end-to-end. On update, call out what is changing vs the existing definition.\n\n## State schema\nBullet list of state keys with type and one-line purpose.\n\n## Steps\nNumbered list. For each step:\n- **Name** (step type: one of agent / llm / evaluator / human / parallel / merge / loop / transform / tool / end)\n- What it does, its input keys, its output key, and its next step (or route map for evaluators).\n- For agent steps: role name AND whether it maps to an existing agent (`agent_xxxxxxx`) or a NEW agent to create (describe its job + tools).\n- For tool steps: the forced tool name. If you are uncertain a tool exists, flag it under Open questions rather than guessing.\n- For human steps: the prompt the user will see and the fields collected.\n\n## Agents summary\nTwo short lists:\n- **Existing agents reused**: one line each — `role → agent_id (name)`.\n- **New agents to create**: one block per new agent. Each block uses this exact shape so the downstream Agent Creator can parse it deterministically:\n - `role: <role_label>` — short identifier used elsewhere in the plan (e.g. `question_generator`).\n - `name: <Display Name>` — what the agent will be called.\n - `type: conversational | code | orchestrator | delegate` — pick `code` ONLY if the agent reads/writes a repo; pick `orchestrator` only if it runs a sub-orchestration; pick `delegate` if the agent dynamically routes to sub-agents; everything else is `conversational`.\n - `delegate_agent_ids: [agent_id, ...]` — ONLY for delegate type: restrict which agents it can route to. Use `[]` to allow all agents.\n - `purpose: <one sentence>` — what this agent does end-to-end.\n - `tools: [tool_name, tool_name]` — narrow list, only what the role needs. Use real tool names (confirmed by the analyst via `get_tools_detail`). Never `[\"all\"]`.\n - `repos: [repo_id, repo_id]` — real repo IDs from `list_repos`. Use `[]` for conversational agents that do not touch code.\n - `db_configs: [db_id]` — real DB IDs from `list_db_configs`. Use `[]` if none.\n\n (If `can_create_agents` is false, still list the blocks and add a `status: CANNOT CREATE — creation disabled` line so the user can enable it or pre-select an existing agent.)\n\n## Flow\nClose with a fenced code block tagged `flow` showing the wiring as ASCII. Use the role/step name (not a fabricated step_id) and label the type. Example shape:\n\n```flow\nintake (agent: analyst)\n ↓\nroute (evaluator)\n ├─ a → process (llm)\n └─ b → fallback (human)\n ↓\n end (end)\n```\n\nKeep it scannable — one node per line, one arrow per edge, evaluator branches with `├─`/`└─`, convergence shown by sharing the next line. The user uses this diagram to sanity-check wiring before approval.\n\n## Open questions\nOnly include this section if something is genuinely ambiguous. One bullet per question.\n\n# Rules\n- Write plain markdown, no code fences around the whole thing (the `flow` block is the only fenced block).\n- If `review_feedback` is non-empty, treat the previous draft as a starting point and revise per the feedback — do not start from scratch unless the user asked you to.\n- Do NOT produce raw orchestration JSON here. This is the human-facing draft. The JSON is produced by the saver agent later.\n- Keep it concise — the user will read this.",
200
200
  "route_map": {},
201
201
  "route_descriptions": {},
202
202
  "evaluator_prompt": null,
@@ -104,6 +104,7 @@ Before writing, reason through:
104
104
  - `conversational` — multi-turn; handle context shifts and follow-ups
105
105
  - `code` — precision required; read before write, cite paths/lines
106
106
  - `orchestrator` — decompose tasks, manage sub-agent handoffs, synthesize results
107
+ - `delegate` — dynamic router; receives queries and routes to sub-agents via delegate_to_agent tool; focus on routing logic, clear task framing, and synthesizing results
107
108
  - **Failure Modes:** Where will this agent most likely hallucinate, go off-scope, or stall?
108
109
 
109
110
  ━━━ PHASE 2: GENERATE THE SYSTEM PROMPT ━━━
@@ -284,6 +285,23 @@ async def generate_agent_prompt(req: GeneratePromptRequest):
284
285
  f"---\n{req.existing_prompt.strip()}\n---"
285
286
  )
286
287
 
288
+ # Build delegate sub-agents section (only for delegate-type agents)
289
+ delegates_section = ""
290
+ if req.agent_type == "delegate" and req.agents:
291
+ agent_lines = "\n".join(
292
+ f" - [{a.get('id', '')}] {a.get('name', '')} ({a.get('type', 'conversational')})"
293
+ + (f": {a['description']}" if a.get('description') else "")
294
+ for a in req.agents
295
+ )
296
+ delegates_section = (
297
+ f"\n\n━━━ AVAILABLE SUB-AGENTS (delegation targets) ━━━\n"
298
+ f"This delegate agent can route tasks to the following sub-agents:\n"
299
+ f"{agent_lines}\n"
300
+ f"\nThe generated prompt should reference these agents by name where relevant, "
301
+ f"describe how to decide which agent to delegate to, and explain how to synthesize "
302
+ f"results when multiple agents are involved."
303
+ )
304
+
287
305
  user_message = (
288
306
  f"Current Date & Time: {current_datetime}\n\n"
289
307
  f"━━━ AGENT TYPE ━━━\n"
@@ -295,6 +313,7 @@ async def generate_agent_prompt(req: GeneratePromptRequest):
295
313
  f"What problem are they trying to solve? What would make this agent "
296
314
  f"genuinely useful vs. just technically correct?"
297
315
  f"{tools_section}"
316
+ f"{delegates_section}"
298
317
  f"{existing_section}"
299
318
  )
300
319
 
@@ -57,8 +57,16 @@ async def get_repos():
57
57
  r["file_count"] = stats["count"]
58
58
  updated = True
59
59
  elif stats["status"] == "error":
60
- if r.get("status") != "error":
60
+ msg = stats.get("message", "")
61
+ # Preserve "indexed" status only through transient connection
62
+ # exhaustion ("too many clients"). Genuine errors (missing table,
63
+ # schema mismatch) still flip the status so they stay visible.
64
+ is_connection_exhaustion = "too many clients" in msg or "remaining connection slots" in msg
65
+ if r.get("status") not in ("error",) and not (
66
+ r.get("status") == "indexed" and is_connection_exhaustion
67
+ ):
61
68
  r["status"] = "error"
69
+ r["error_message"] = msg
62
70
  updated = True
63
71
  if updated:
64
72
  save_repos(repos)
@@ -171,6 +179,7 @@ async def reindex_repo(repo_id: str, background_tasks: BackgroundTasks,
171
179
 
172
180
  # Set status
173
181
  repo["status"] = "indexing"
182
+ repo["error_message"] = None # Clear any previous error
174
183
  for i, r in enumerate(repos):
175
184
  if r["id"] == repo_id:
176
185
  repos[i] = repo
@@ -179,15 +188,32 @@ async def reindex_repo(repo_id: str, background_tasks: BackgroundTasks,
179
188
 
180
189
  # Run in background
181
190
  try:
182
- from services.code_indexer import run_index
191
+ from services.code_indexer import run_index, COCOINDEX_AVAILABLE, _coco_import_error
192
+ if not COCOINDEX_AVAILABLE:
193
+ detail = _coco_import_error or "unknown import error"
194
+ repo["status"] = "error"
195
+ repo["error_message"] = (
196
+ f"CocoIndex dependency error: {detail}. "
197
+ f"Install the correct version into the backend venv: "
198
+ f"pip install 'cocoindex>=0.3.30,<1.0' psycopg, then restart Synapse."
199
+ )
200
+ save_repos(repos)
201
+ raise HTTPException(
202
+ status_code=500,
203
+ detail=f"CocoIndex not available: {detail}. "
204
+ f"Install 'cocoindex>=0.3.30,<1.0' and psycopg into the backend venv, then restart."
205
+ )
183
206
  background_tasks.add_task(run_index, repo_id, real_path,
184
207
  repo["included_patterns"], repo["excluded_patterns"],
185
208
  opts.full_reindex)
209
+ except HTTPException:
210
+ raise
186
211
  except ImportError as e:
187
212
  print("Indexer unavailable:", e)
188
213
  repo["status"] = "error"
214
+ repo["error_message"] = f"Indexer import failed: {e}"
189
215
  save_repos(repos)
190
- raise HTTPException(status_code=500, detail="Indexer service not available")
216
+ raise HTTPException(status_code=500, detail=f"Indexer service not available: {e}")
191
217
 
192
218
  return {"status": "indexing_started", "full_reindex": opts.full_reindex}
193
219
 
@@ -189,7 +189,7 @@ def _build_native_mcp_servers() -> list[dict]:
189
189
  servers.append({
190
190
  "name": "Browser Automation",
191
191
  "command": _NPX_CMD,
192
- "args": ["-y", "@playwright/mcp@latest", "--browser", "chromium", "--output-dir", "data/vault/playwright"],
192
+ "args": ["-y", "@playwright/mcp@latest", "--browser", "chrome", "--output-dir", "data/vault/playwright"],
193
193
  "env": env_dict,
194
194
  })
195
195
 
@@ -12,22 +12,26 @@ from datetime import datetime
12
12
  from typing import Annotated, Any
13
13
  from core.config import load_settings, sanitize_db_url
14
14
 
15
+ COCOINDEX_AVAILABLE = False
16
+ _coco_import_error: str | None = None
17
+
15
18
  try:
16
19
  import cocoindex
17
20
  import psycopg
18
- COCOINDEX_AVAILABLE = True
19
21
  import numpy as np
20
22
  from numpy.typing import NDArray
21
23
  from cocoindex.typing import VectorInfo
24
+ COCOINDEX_AVAILABLE = True
22
25
  except ImportError as _coco_import_err:
23
- COCOINDEX_AVAILABLE = False
24
26
  NDArray = None
25
27
  VectorInfo = None
28
+ _coco_import_error = str(_coco_import_err)
26
29
  print(
27
- f"[code-indexer] WARNING: cocoindex/psycopg not found in this Python environment ({_coco_import_err}).\n"
30
+ f"[code-indexer] WARNING: cocoindex/psycopg not available ({_coco_import_err}).\n"
28
31
  " Code indexing is disabled. To enable it, install into the backend venv:\n"
29
- " <synapse-install-dir>/backend/venv/bin/pip install cocoindex psycopg\n"
30
- " Then restart Synapse."
32
+ " <synapse-install-dir>/backend/venv/bin/pip install 'cocoindex>=0.3.30,<1.0' psycopg\n"
33
+ " Then restart Synapse.\n"
34
+ " NOTE: cocoindex 1.x has a different API. This project requires 0.3.x."
31
35
  )
32
36
 
33
37
  # Lock for repos.json read/write
@@ -47,9 +51,16 @@ _active_threads: dict[str, threading.Thread] = {}
47
51
  def _get_db_url() -> str:
48
52
  """Always read the database URL from settings.json (never from the environment).
49
53
  Sanitizes the URL so that an empty password (e.g. user:@host) is rewritten
50
- to the form psycopg can parse (user@host)."""
54
+ to the form psycopg can parse (user@host).
55
+ Also appends sslmode=disable for localhost connections to avoid SSL cert
56
+ verification errors against local PostgreSQL."""
51
57
  raw = load_settings().get("sql_connection_string", "")
52
- return sanitize_db_url(raw)
58
+ url = sanitize_db_url(raw)
59
+ if url and ("localhost" in url or "127.0.0.1" in url):
60
+ sep = "&" if "?" in url else "?"
61
+ if "sslmode" not in url:
62
+ url += f"{sep}sslmode=disable"
63
+ return url
53
64
 
54
65
  # Known output dimensions for popular embedding models.
55
66
  # Only base model IDs are listed here — provisioned-throughput suffixes
@@ -426,16 +437,19 @@ def _update_repo_status(repo_id: str, **fields):
426
437
 
427
438
  def run_index_task(repo_id: str, repo_path: str, included_patterns: list[str], excluded_patterns: list[str], full_reindex: bool = True):
428
439
  if not COCOINDEX_AVAILABLE:
440
+ detail = _coco_import_error or "unknown import error"
429
441
  msg = (
430
- "CocoIndex not installed in the backend venv — indexing skipped.\n"
431
- "Fix: run <synapse-install-dir>/backend/venv/bin/pip install cocoindex psycopg\n"
432
- "then restart Synapse. (Running bare 'pip install cocoindex' installs into\n"
433
- "your system Python, not the venv the backend uses.)"
442
+ f"CocoIndex not available in the backend venv — indexing skipped.\n"
443
+ f"Import error: {detail}\n"
444
+ f"Fix: run <synapse-install-dir>/backend/venv/bin/pip install 'cocoindex>=0.3.30,<1.0' psycopg\n"
445
+ f"then restart Synapse. (Running bare 'pip install cocoindex' installs v1.x\n"
446
+ f"which has an incompatible API. This project requires cocoindex 0.3.x.)"
434
447
  )
435
448
  print(msg)
436
449
  _update_repo_status(repo_id, status="error", error_message=
437
- "cocoindex not installed in backend venv. "
438
- "Run: <install-dir>/backend/venv/bin/pip install cocoindex psycopg, then restart.")
450
+ f"CocoIndex dependency error: {detail}. "
451
+ f"Install the correct version: pip install 'cocoindex>=0.3.30,<1.0' psycopg "
452
+ f"(into the backend venv), then restart Synapse.")
439
453
  return
440
454
 
441
455
  stop = _stop_events.setdefault(repo_id, threading.Event())
@@ -528,6 +542,16 @@ def run_index_task(repo_id: str, repo_path: str, included_patterns: list[str], e
528
542
  _update_repo_status(repo_id, status="error", error_message=str(e)[:500])
529
543
  finally:
530
544
  _active_threads.pop(repo_id, None)
545
+ # Close the CocoIndex flow to release its internal DB connections.
546
+ # Without this, each indexed repo holds persistent connections and
547
+ # eventually exhausts PostgreSQL's max_connections limit.
548
+ flow_name = f"ci_{repo_id}"
549
+ if flow_name in _active_flows:
550
+ try:
551
+ _active_flows[flow_name].close()
552
+ except Exception:
553
+ pass
554
+ del _active_flows[flow_name]
531
555
 
532
556
 
533
557
  def stop_index(repo_id: str) -> bool:
@@ -1 +1 @@
1
- yEEl_TTPPEzHJlgKg21Go
1
+ DtyFJXD-pPSV9CdbxSLpv
@@ -7,15 +7,15 @@
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/yEEl_TTPPEzHJlgKg21Go/_buildManifest.js",
11
- "static/yEEl_TTPPEzHJlgKg21Go/_ssgManifest.js",
12
- "static/yEEl_TTPPEzHJlgKg21Go/_clientMiddlewareManifest.js"
10
+ "static/DtyFJXD-pPSV9CdbxSLpv/_buildManifest.js",
11
+ "static/DtyFJXD-pPSV9CdbxSLpv/_ssgManifest.js",
12
+ "static/DtyFJXD-pPSV9CdbxSLpv/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/0qmh881w772ef.js",
16
16
  "static/chunks/02i7dfk78~t~2.js",
17
- "static/chunks/0e-wrhqh4h3r5.js",
18
- "static/chunks/0h4a4y-~puu.x.js",
19
- "static/chunks/turbopack-0~_lks..-4osp.js"
17
+ "static/chunks/0c7h~x4_chf35.js",
18
+ "static/chunks/00xhsd~k-wxkl.js",
19
+ "static/chunks/turbopack-09lztqg9--eu..js"
20
20
  ]
21
21
  }
@@ -131,8 +131,8 @@
131
131
  "dynamicRoutes": {},
132
132
  "notFoundRoutes": [],
133
133
  "preview": {
134
- "previewModeId": "bc368afe07caae8bf169c8234849e882",
135
- "previewModeSigningKey": "190f16e9b88e7771194d70cdf5e69441824646affcdc450555fd563eed084faa",
136
- "previewModeEncryptionKey": "a2688049a98d936f285726f270987cb712966062a8078f5f90eb21aa28b36b66"
134
+ "previewModeId": "06b8674defa39be4e6cf44b307c44453",
135
+ "previewModeSigningKey": "d64a8ea5f19bef42d0d30574bada9abd874a58a8d6b9720a2542e031d8ae526a",
136
+ "previewModeEncryptionKey": "5fad70dfd979f4cb0050903acf57b0be8cc40ca7947d511b7ddb36fd197bbeb6"
137
137
  }
138
138
  }
@@ -8,9 +8,9 @@
8
8
  "rootMainFiles": [
9
9
  "static/chunks/0qmh881w772ef.js",
10
10
  "static/chunks/02i7dfk78~t~2.js",
11
- "static/chunks/0e-wrhqh4h3r5.js",
12
- "static/chunks/0h4a4y-~puu.x.js",
13
- "static/chunks/turbopack-0~_lks..-4osp.js"
11
+ "static/chunks/0c7h~x4_chf35.js",
12
+ "static/chunks/00xhsd~k-wxkl.js",
13
+ "static/chunks/turbopack-09lztqg9--eu..js"
14
14
  ],
15
15
  "pages": {},
16
16
  "ampFirstPages": []
@@ -1,8 +1,8 @@
1
1
  var R=require("../../chunks/ssr/[turbopack]_runtime.js")("server/app/_global-error/page.js")
2
- R.c("server/chunks/ssr/[root-of-the-server]__10xgshr._.js")
2
+ R.c("server/chunks/ssr/[root-of-the-server]__0tcyn68._.js")
3
3
  R.c("server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js")
4
- R.c("server/chunks/ssr/[root-of-the-server]__09c9368._.js")
5
- R.c("server/chunks/ssr/[root-of-the-server]__09z7o2x._.js")
4
+ R.c("server/chunks/ssr/[root-of-the-server]__0p75w55._.js")
5
+ R.c("server/chunks/ssr/[root-of-the-server]__098zro9._.js")
6
6
  R.c("server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js")
7
7
  R.c("server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js")
8
8
  R.m(42378)
@@ -1 +1 @@
1
- {"version":1,"files":["../../../../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../../../../node_modules/@swc/helpers/package.json","../../../../node_modules/next/dist/build/adapter/setup-node-env.external.js","../../../../node_modules/next/dist/client/components/app-router-headers.js","../../../../node_modules/next/dist/client/components/hooks-server-context.js","../../../../node_modules/next/dist/client/components/static-generation-bailout.js","../../../../node_modules/next/dist/client/lib/console.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js","../../../../node_modules/next/dist/compiled/source-map/package.json","../../../../node_modules/next/dist/compiled/source-map/source-map.js","../../../../node_modules/next/dist/compiled/stacktrace-parser/package.json","../../../../node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js","../../../../node_modules/next/dist/compiled/ws/index.js","../../../../node_modules/next/dist/compiled/ws/package.json","../../../../node_modules/next/dist/lib/client-and-server-references.js","../../../../node_modules/next/dist/lib/constants.js","../../../../node_modules/next/dist/lib/framework/boundary-constants.js","../../../../node_modules/next/dist/lib/interop-default.js","../../../../node_modules/next/dist/lib/is-error.js","../../../../node_modules/next/dist/lib/picocolors.js","../../../../node_modules/next/dist/lib/scheduler.js","../../../../node_modules/next/dist/lib/semver-noop.js","../../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../../node_modules/next/dist/server/app-render/console-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/console-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/dynamic-rendering.js","../../../../node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../../node_modules/next/dist/server/app-render/staged-rendering.js","../../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../../node_modules/next/dist/server/dev/browser-logs/file-logger.js","../../../../node_modules/next/dist/server/dynamic-rendering-utils.js","../../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../../node_modules/next/dist/server/lib/lru-cache.js","../../../../node_modules/next/dist/server/lib/parse-stack.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../../node_modules/next/dist/server/lib/source-maps.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/dist/server/load-manifest.external.js","../../../../node_modules/next/dist/server/node-environment-baseline.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-dim.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-exit.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-file.js","../../../../node_modules/next/dist/server/node-environment-extensions/date.js","../../../../node_modules/next/dist/server/node-environment-extensions/error-inspect.js","../../../../node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/io-utils.js","../../../../node_modules/next/dist/server/node-environment-extensions/node-crypto.js","../../../../node_modules/next/dist/server/node-environment-extensions/random.js","../../../../node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/web-crypto.js","../../../../node_modules/next/dist/server/node-environment.js","../../../../node_modules/next/dist/server/node-polyfill-crypto.js","../../../../node_modules/next/dist/server/patch-error-inspect.js","../../../../node_modules/next/dist/server/require-hook.js","../../../../node_modules/next/dist/server/response-cache/types.js","../../../../node_modules/next/dist/server/runtime-reacts.external.js","../../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../../node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js","../../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../../node_modules/next/dist/shared/lib/promise-with-resolvers.js","../../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../../node_modules/next/package.json","../../../../node_modules/react/cjs/react.development.js","../../../../node_modules/react/cjs/react.production.js","../../../../node_modules/react/index.js","../../../../node_modules/react/package.json","../../chunks/ssr/[root-of-the-server]__09c9368._.js","../../chunks/ssr/[root-of-the-server]__09z7o2x._.js","../../chunks/ssr/[root-of-the-server]__0vax-37._.js","../../chunks/ssr/[root-of-the-server]__10xgshr._.js","../../chunks/ssr/[turbopack]_runtime.js","../../chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js","../../chunks/ssr/node_modules_next_dist_0h9llsw._.js","../../chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js","../../chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js","./page/react-loadable-manifest.json","./page_client-reference-manifest.js"]}
1
+ {"version":1,"files":["../../../../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../../../../node_modules/@swc/helpers/package.json","../../../../node_modules/next/dist/build/adapter/setup-node-env.external.js","../../../../node_modules/next/dist/client/components/app-router-headers.js","../../../../node_modules/next/dist/client/components/hooks-server-context.js","../../../../node_modules/next/dist/client/components/static-generation-bailout.js","../../../../node_modules/next/dist/client/lib/console.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js","../../../../node_modules/next/dist/compiled/source-map/package.json","../../../../node_modules/next/dist/compiled/source-map/source-map.js","../../../../node_modules/next/dist/compiled/stacktrace-parser/package.json","../../../../node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js","../../../../node_modules/next/dist/compiled/ws/index.js","../../../../node_modules/next/dist/compiled/ws/package.json","../../../../node_modules/next/dist/lib/client-and-server-references.js","../../../../node_modules/next/dist/lib/constants.js","../../../../node_modules/next/dist/lib/framework/boundary-constants.js","../../../../node_modules/next/dist/lib/interop-default.js","../../../../node_modules/next/dist/lib/is-error.js","../../../../node_modules/next/dist/lib/picocolors.js","../../../../node_modules/next/dist/lib/scheduler.js","../../../../node_modules/next/dist/lib/semver-noop.js","../../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../../node_modules/next/dist/server/app-render/console-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/console-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/dynamic-rendering.js","../../../../node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../../node_modules/next/dist/server/app-render/staged-rendering.js","../../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../../node_modules/next/dist/server/dev/browser-logs/file-logger.js","../../../../node_modules/next/dist/server/dynamic-rendering-utils.js","../../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../../node_modules/next/dist/server/lib/lru-cache.js","../../../../node_modules/next/dist/server/lib/parse-stack.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../../node_modules/next/dist/server/lib/source-maps.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/dist/server/load-manifest.external.js","../../../../node_modules/next/dist/server/node-environment-baseline.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-dim.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-exit.js","../../../../node_modules/next/dist/server/node-environment-extensions/console-file.js","../../../../node_modules/next/dist/server/node-environment-extensions/date.js","../../../../node_modules/next/dist/server/node-environment-extensions/error-inspect.js","../../../../node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/io-utils.js","../../../../node_modules/next/dist/server/node-environment-extensions/node-crypto.js","../../../../node_modules/next/dist/server/node-environment-extensions/random.js","../../../../node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js","../../../../node_modules/next/dist/server/node-environment-extensions/web-crypto.js","../../../../node_modules/next/dist/server/node-environment.js","../../../../node_modules/next/dist/server/node-polyfill-crypto.js","../../../../node_modules/next/dist/server/patch-error-inspect.js","../../../../node_modules/next/dist/server/require-hook.js","../../../../node_modules/next/dist/server/response-cache/types.js","../../../../node_modules/next/dist/server/runtime-reacts.external.js","../../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../../node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js","../../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../../node_modules/next/dist/shared/lib/promise-with-resolvers.js","../../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../../node_modules/next/package.json","../../../../node_modules/react/cjs/react.development.js","../../../../node_modules/react/cjs/react.production.js","../../../../node_modules/react/index.js","../../../../node_modules/react/package.json","../../chunks/ssr/[root-of-the-server]__098zro9._.js","../../chunks/ssr/[root-of-the-server]__0p75w55._.js","../../chunks/ssr/[root-of-the-server]__0tcyn68._.js","../../chunks/ssr/[root-of-the-server]__0vax-37._.js","../../chunks/ssr/[turbopack]_runtime.js","../../chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js","../../chunks/ssr/node_modules_next_dist_0h9llsw._.js","../../chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js","../../chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js","./page/react-loadable-manifest.json","./page_client-reference-manifest.js"]}
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0qmh881w772ef.js"/><script src="/_next/static/chunks/02i7dfk78~t~2.js" async=""></script><script src="/_next/static/chunks/0e-wrhqh4h3r5.js" async=""></script><script src="/_next/static/chunks/0h4a4y-~puu.x.js" async=""></script><script src="/_next/static/chunks/turbopack-0~_lks..-4osp.js" async=""></script><script src="/_next/static/chunks/01xlw8hd842-c.js" async=""></script><script src="/_next/static/chunks/0m92kh92cfh_..js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0qmh881w772ef.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"yEEl_TTPPEzHJlgKg21Go\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0qmh881w772ef.js"/><script src="/_next/static/chunks/02i7dfk78~t~2.js" async=""></script><script src="/_next/static/chunks/0c7h~x4_chf35.js" async=""></script><script src="/_next/static/chunks/00xhsd~k-wxkl.js" async=""></script><script src="/_next/static/chunks/turbopack-09lztqg9--eu..js" async=""></script><script src="/_next/static/chunks/01xlw8hd842-c.js" async=""></script><script src="/_next/static/chunks/0m92kh92cfh_..js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0qmh881w772ef.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/01xlw8hd842-c.js\",\"/_next/static/chunks/0m92kh92cfh_..js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"DtyFJXD-pPSV9CdbxSLpv\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  8:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0m92kh92cfh_..js"],"ViewportBoundary"]
7
7
  a:I[97367,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0m92kh92cfh_..js"],"MetadataBoundary"]
8
8
  c:I[68027,["/_next/static/chunks/01xlw8hd842-c.js","/_next/static/chunks/0m92kh92cfh_..js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"yEEl_TTPPEzHJlgKg21Go"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"DtyFJXD-pPSV9CdbxSLpv"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]