@jlongo78/agent-spaces 0.9.6 → 0.9.8

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 (917) hide show
  1. package/.next/standalone/.claude/settings.local.json +68 -0
  2. package/.next/standalone/.claude/spaces-env.json +1 -0
  3. package/.next/standalone/.next/BUILD_ID +1 -1
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  5. package/.next/standalone/.next/build-manifest.json +2 -2
  6. package/.next/standalone/.next/prerender-manifest.json +3 -3
  7. package/.next/standalone/.next/required-server-files.json +19 -19
  8. package/.next/standalone/.next/routes-manifest.json +6 -0
  9. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  26. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  27. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  28. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  34. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  35. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  36. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  38. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  42. package/.next/standalone/.next/server/app/admin/analytics.rsc +2 -2
  43. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  50. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  52. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  53. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  57. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  61. package/.next/standalone/.next/server/app/analytics.html +1 -1
  62. package/.next/standalone/.next/server/app/analytics.rsc +2 -2
  63. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
  67. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  70. package/.next/standalone/.next/server/app/api/analytics/overview/route.js +1 -1
  71. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/benchmark/run/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/benchmark/run/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/benchmark/status/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/benchmark/status/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/bulk/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  85. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/cortex/context/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/cortex/export/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js +1 -1
  105. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js +1 -1
  109. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/import/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/cortex/search/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/cortex/settings/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/cortex/status/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/cortex/usage/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/files/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/folders/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/network/handshake/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/network/panes/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/network/panes/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/network/projects/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/network/search/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/network/sessions/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/network/workspaces/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/panes/[id]/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/panes/route.js +1 -1
  185. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  187. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js +1 -1
  191. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/search/route.js +2 -2
  193. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js +1 -1
  197. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +1 -1
  199. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/sessions/route.js +2 -2
  201. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/sync/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/tags/route.js +1 -1
  205. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/tier/route.js +1 -1
  207. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/whisper/config/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/whisper/config/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/wizard/chart/route/app-paths-manifest.json +3 -0
  212. package/.next/standalone/.next/server/app/api/wizard/chart/route/build-manifest.json +11 -0
  213. package/.next/standalone/.next/server/app/api/wizard/chart/route/server-reference-manifest.json +4 -0
  214. package/.next/standalone/.next/server/app/api/wizard/chart/route.js +7 -0
  215. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.map +5 -0
  216. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.nft.json +1 -0
  217. package/.next/standalone/.next/server/app/api/wizard/chart/route_client-reference-manifest.js +2 -0
  218. package/.next/standalone/.next/server/app/api/wizard/chat/route.js +1 -1
  219. package/.next/standalone/.next/server/app/api/wizard/chat/route.js.nft.json +1 -1
  220. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js +1 -1
  221. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  222. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js +1 -1
  223. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  224. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js +1 -1
  227. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js +1 -1
  231. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/workspaces/route.js +2 -2
  233. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  234. package/.next/standalone/.next/server/app/cortex.html +1 -1
  235. package/.next/standalone/.next/server/app/cortex.rsc +3 -3
  236. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
  237. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  238. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  239. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +3 -3
  240. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  242. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  243. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/login.html +1 -1
  245. package/.next/standalone/.next/server/app/login.rsc +2 -2
  246. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  247. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  248. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  249. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  250. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  251. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  252. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  255. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  256. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  257. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  258. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  259. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  260. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  262. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  263. package/.next/standalone/.next/server/app/m/sessions/[id]/page.js.nft.json +1 -1
  264. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  267. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  268. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  270. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  271. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  272. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  273. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  274. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  275. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  277. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  278. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  279. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  280. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  281. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  282. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  283. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  284. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  285. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  287. package/.next/standalone/.next/server/app/m/terminal.rsc +3 -3
  288. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +3 -3
  289. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  290. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  291. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  292. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +2 -2
  293. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  294. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/m.html +1 -1
  296. package/.next/standalone/.next/server/app/m.rsc +2 -2
  297. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  298. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  299. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  300. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  301. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  302. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  303. package/.next/standalone/.next/server/app/network.html +1 -1
  304. package/.next/standalone/.next/server/app/network.rsc +2 -2
  305. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  306. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  307. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  308. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  309. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  311. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/projects.html +1 -1
  313. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  314. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  315. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  316. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  317. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  318. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  319. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  320. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  321. package/.next/standalone/.next/server/app/sessions.html +1 -1
  322. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  323. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  324. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  325. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  326. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  327. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  329. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  330. package/.next/standalone/.next/server/app/settings.html +1 -1
  331. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  332. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
  333. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  334. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  335. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  336. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  337. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  338. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  339. package/.next/standalone/.next/server/app/terminal.html +1 -1
  340. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  341. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  342. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  343. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  344. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  345. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  346. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  347. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  348. package/.next/standalone/.next/server/app/vr/page/react-loadable-manifest.json +1 -1
  349. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
  350. package/.next/standalone/.next/server/app/vr.html +1 -1
  351. package/.next/standalone/.next/server/app/vr.rsc +3 -3
  352. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +3 -3
  353. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
  354. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
  355. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
  356. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +2 -2
  357. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
  358. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  359. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  360. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  361. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  362. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  363. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  364. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  365. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  366. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  367. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  368. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +98 -0
  369. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +98 -0
  370. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +98 -0
  371. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bb331da9._.js → [root-of-the-server]__046c9b91._.js} +3 -3
  372. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +98 -0
  373. package/.next/standalone/.next/server/chunks/[root-of-the-server]__056fa416._.js +1 -1
  374. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ac4ea3f._.js +3 -0
  375. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8e64cb._.js +98 -0
  376. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__d95165f0._.js → [root-of-the-server]__0facd39e._.js} +3 -3
  377. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +3 -0
  378. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__9d68157b._.js → [root-of-the-server]__115f3934._.js} +3 -3
  379. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11f155f1._.js +3 -0
  380. package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +22 -33
  381. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__91e23c96._.js → [root-of-the-server]__17a3b966._.js} +3 -3
  382. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__277d9445._.js → [root-of-the-server]__17d3a2b2._.js} +3 -3
  383. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +98 -0
  384. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20b5e9c4._.js +3 -0
  385. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28d6fbd8._.js +98 -0
  386. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__04f04898._.js → [root-of-the-server]__2a3f866b._.js} +2 -2
  387. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a95bb38b._.js → [root-of-the-server]__316617e7._.js} +2 -2
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +98 -0
  389. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__6fe5e6c8._.js → [root-of-the-server]__35457394._.js} +2 -2
  390. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1f054c65._.js → [root-of-the-server]__35de78e6._.js} +3 -3
  391. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +98 -0
  392. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__614458b7._.js → [root-of-the-server]__38954988._.js} +3 -3
  393. package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +106 -0
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +98 -0
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +98 -0
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +98 -0
  397. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +98 -0
  398. package/.next/standalone/.next/server/chunks/[root-of-the-server]__65676930._.js +3 -0
  399. package/.next/standalone/.next/server/chunks/[root-of-the-server]__67cab326._.js +58 -0
  400. package/.next/standalone/.next/server/chunks/[root-of-the-server]__698c6f01._.js +98 -0
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c64af29._.js +131 -0
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +98 -0
  403. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac84b704._.js → [root-of-the-server]__79b6a9bb._.js} +3 -3
  404. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e56abacf._.js → [root-of-the-server]__7db704c6._.js} +4 -4
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +98 -0
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +98 -0
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +98 -0
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +98 -0
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +98 -0
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +98 -0
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +98 -0
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +98 -0
  413. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2d7a454e._.js → [root-of-the-server]__8f2ccc41._.js} +3 -3
  414. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2a2c5fc5._.js → [root-of-the-server]__95c9d682._.js} +4 -4
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +98 -0
  416. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cc6e2885._.js → [root-of-the-server]__9edcff87._.js} +2 -2
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +98 -0
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +98 -0
  419. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__929ea03a._.js → [root-of-the-server]__a83262a1._.js} +2 -2
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +98 -0
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d7f822._.js +98 -0
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +98 -0
  423. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +98 -0
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +98 -0
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +98 -0
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +98 -0
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +98 -0
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0ac2895._.js +3 -0
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c130a00c._.js +1 -1
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c37d6380._.js +3 -0
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +98 -0
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +3 -3
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +98 -0
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +98 -0
  435. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +98 -0
  436. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5d92527._.js +1 -1
  437. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +98 -0
  438. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2384f98e._.js → [root-of-the-server]__de14b9ae._.js} +3 -3
  439. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +98 -0
  440. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00fdfbda._.js → [root-of-the-server]__e2a996e5._.js} +2 -2
  441. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__4d903941._.js → [root-of-the-server]__e3477417._.js} +3 -3
  442. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__32dc5513._.js → [root-of-the-server]__e4db362e._.js} +2 -2
  443. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__49e42a3a._.js → [root-of-the-server]__e4e70b86._.js} +3 -3
  444. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac39ecc7._.js → [root-of-the-server]__e54925af._.js} +3 -3
  445. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8edc5b0._.js +98 -0
  446. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__eafd040b._.js → [root-of-the-server]__eab4d83b._.js} +2 -2
  447. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
  448. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__194955d4._.js → [root-of-the-server]__f056fd83._.js} +3 -3
  449. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +98 -0
  450. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +98 -0
  451. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +98 -0
  452. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +98 -0
  453. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wizard_chart_route_actions_888e2ec1.js +3 -0
  454. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2cffc362._.js +3 -0
  455. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f1050870._.js → [root-of-the-server]__47c97637._.js} +2 -2
  456. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  457. package/.next/standalone/.next/server/chunks/ssr/_17b946fd._.js +3 -0
  458. package/.next/standalone/.next/server/chunks/ssr/_2a1d79e7._.js +1 -1
  459. package/.next/standalone/.next/server/chunks/ssr/_5c3c4cfa._.js +7 -5
  460. package/.next/standalone/.next/server/chunks/ssr/_ba432382._.js +7 -5
  461. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +1 -1
  462. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +4 -4
  463. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
  464. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  465. package/.next/standalone/.next/server/pages/404.html +1 -1
  466. package/.next/standalone/.next/server/pages/500.html +2 -2
  467. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  468. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  469. package/.next/standalone/.next/static/chunks/0852575eb90c1e8d.js +85 -0
  470. package/.next/standalone/.next/static/chunks/{74d0ac0b1d0a1b79.js → 10b00b4f66102dcf.js} +1 -1
  471. package/.next/standalone/.next/static/chunks/{16eb77953dee9ea3.js → 19c71a8376c23c58.js} +1 -1
  472. package/.next/standalone/.next/static/chunks/2b769d1597e4fc1c.css +3 -0
  473. package/.next/standalone/.next/static/chunks/{3e91fc608659c524.js → 350271fe79509caf.js} +1 -1
  474. package/.next/standalone/.next/static/chunks/{70423c7afd8abf5f.js → 597847c22200c212.js} +1 -1
  475. package/.next/standalone/.next/static/chunks/{fb0abd1933b2b2e1.js → 7f6a14f1849fa94d.js} +1 -1
  476. package/.next/standalone/.next/static/chunks/{7ecd9bbb0ce4d68a.js → b7c8fe9b7275a84f.js} +1 -1
  477. package/.next/standalone/.next/static/chunks/{6245135a7afb8c7b.js → c9b10fc55516d142.js} +8 -6
  478. package/.next/standalone/.next/static/chunks/d0065f48eab94944.js +1 -0
  479. package/.next/standalone/.next/static/chunks/{180c1b9ff31b979f.js → f7b34c807badf95d.js} +8 -6
  480. package/.next/standalone/.spaces/cortex-context.md +50 -144
  481. package/.next/standalone/LICENSE +661 -661
  482. package/.next/standalone/NOTICE +5 -5
  483. package/.next/standalone/README.md +131 -131
  484. package/.next/standalone/bin/cortex-hook.js +79 -79
  485. package/.next/standalone/bin/cortex-hook.sh +62 -62
  486. package/.next/standalone/bin/cortex-learn-hook.js +138 -138
  487. package/.next/standalone/bin/cortex-mcp.js +60 -60
  488. package/.next/standalone/bin/cortex-pi-extension.ts +170 -170
  489. package/.next/standalone/bin/fix-standalone-externals.js +79 -79
  490. package/.next/standalone/bin/lib/auto-setup.js +110 -110
  491. package/.next/standalone/bin/mdns-service.js +171 -171
  492. package/.next/standalone/bin/postinstall.js +35 -35
  493. package/.next/standalone/bin/setup-admin.js +195 -195
  494. package/.next/standalone/bin/spaces-dev.js +247 -247
  495. package/.next/standalone/bin/spaces-install.js +660 -660
  496. package/.next/standalone/bin/spaces-postinstall.js +50 -50
  497. package/.next/standalone/bin/spaces-reset-totp.js +50 -50
  498. package/.next/standalone/bin/spaces-service.js +1046 -1046
  499. package/.next/standalone/bin/spaces-setup.js +253 -253
  500. package/.next/standalone/bin/spaces.js +808 -805
  501. package/.next/standalone/bin/ssh-auth-keys.sh +68 -68
  502. package/.next/standalone/bin/terminal-server.js +2819 -2781
  503. package/.next/standalone/cortex-hook-debug.log +57 -23
  504. package/.next/standalone/docker-compose.yml +28 -28
  505. package/.next/standalone/docs/architecture.md +387 -387
  506. package/.next/standalone/docs/cortex-integration-reference.md +268 -268
  507. package/.next/standalone/docs/cortex.md +293 -293
  508. package/.next/standalone/docs/getting-started.md +96 -96
  509. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-design.md +133 -133
  510. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-plan.md +959 -959
  511. package/.next/standalone/docs/plans/2026-03-02-security-audit.md +229 -229
  512. package/.next/standalone/docs/plans/2026-03-07-service-command-design.md +146 -146
  513. package/.next/standalone/docs/plans/2026-03-07-service-command-plan.md +254 -254
  514. package/.next/standalone/docs/server-install.md +564 -564
  515. package/.next/standalone/docs/social-card.html +150 -150
  516. package/.next/standalone/docs/superpowers/plans/2026-03-12-spaces-cortex.md +5270 -5270
  517. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
  518. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
  519. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
  520. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
  521. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
  522. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
  523. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
  524. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
  525. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
  526. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
  527. package/.next/standalone/docs/superpowers/plans/2026-03-19-vr-phase1-shell.md +1639 -1639
  528. package/.next/standalone/docs/superpowers/plans/2026-03-27-dockview-pane-layout.md +98 -98
  529. package/.next/standalone/docs/superpowers/specs/2026-03-11-universe-view-design.md +320 -320
  530. package/.next/standalone/docs/superpowers/specs/2026-03-12-spaces-brain-design.md +720 -720
  531. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
  532. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
  533. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
  534. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
  535. package/.next/standalone/docs/superpowers/specs/2026-03-16-pane-ux-design.md +77 -77
  536. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
  537. package/.next/standalone/docs/superpowers/specs/2026-03-19-vr-phase1-shell-design.md +288 -288
  538. package/.next/standalone/docs/superpowers/specs/2026-03-27-pane-diff-review-and-project-wizard-design.md +322 -322
  539. package/.next/standalone/docs/tiers.md +104 -104
  540. package/.next/standalone/eslint.config.mjs +18 -18
  541. package/.next/standalone/next.config.ts +20 -20
  542. package/.next/standalone/nginx.conf +53 -53
  543. package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
  544. package/.next/standalone/node_modules/@img/{sharp-linux-x64 → sharp-win32-x64}/package.json +39 -46
  545. package/.next/standalone/package-lock.json +14985 -14986
  546. package/.next/standalone/package.json +111 -111
  547. package/.next/standalone/postcss.config.mjs +7 -7
  548. package/.next/standalone/scripts/rebuild.cmd +65 -65
  549. package/.next/standalone/scripts/rebuild.sh +59 -59
  550. package/.next/standalone/server.js +1 -1
  551. package/.next/standalone/src/app/(desktop)/admin/analytics/page.tsx +266 -266
  552. package/.next/standalone/src/app/(desktop)/admin/users/page.tsx +399 -399
  553. package/.next/standalone/src/app/(desktop)/analytics/page.tsx +166 -166
  554. package/.next/standalone/src/app/(desktop)/cortex/page.tsx +81 -81
  555. package/.next/standalone/src/app/(desktop)/dashboard-client.tsx +56 -56
  556. package/.next/standalone/src/app/(desktop)/layout.tsx +18 -18
  557. package/.next/standalone/src/app/(desktop)/network/page.tsx +137 -137
  558. package/.next/standalone/src/app/(desktop)/page.tsx +17 -17
  559. package/.next/standalone/src/app/(desktop)/projects/page.tsx +68 -68
  560. package/.next/standalone/src/app/(desktop)/sessions/[id]/page.tsx +519 -519
  561. package/.next/standalone/src/app/(desktop)/sessions/page.tsx +145 -145
  562. package/.next/standalone/src/app/(desktop)/settings/page.tsx +446 -446
  563. package/.next/standalone/src/app/(desktop)/terminal/layout.tsx +7 -7
  564. package/.next/standalone/src/app/(desktop)/terminal/page.tsx +1330 -1291
  565. package/.next/standalone/src/app/(desktop)/terminal/pane/[id]/page.tsx +211 -211
  566. package/.next/standalone/src/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page.tsx +252 -252
  567. package/.next/standalone/src/app/(desktop)/workspaces/page.tsx +12 -12
  568. package/.next/standalone/src/app/api/admin/analytics/route.ts +10 -10
  569. package/.next/standalone/src/app/api/admin/users/[id]/route.ts +20 -20
  570. package/.next/standalone/src/app/api/admin/users/route.ts +15 -15
  571. package/.next/standalone/src/app/api/analytics/overview/route.ts +80 -80
  572. package/.next/standalone/src/app/api/auth/login/route.ts +10 -10
  573. package/.next/standalone/src/app/api/auth/logout/route.ts +9 -9
  574. package/.next/standalone/src/app/api/auth/me/route.ts +22 -22
  575. package/.next/standalone/src/app/api/auth/totp/setup/route.ts +10 -10
  576. package/.next/standalone/src/app/api/auth/totp/status/route.ts +10 -10
  577. package/.next/standalone/src/app/api/auth/totp/verify/route.ts +10 -10
  578. package/.next/standalone/src/app/api/benchmark/lobes/route.ts +16 -16
  579. package/.next/standalone/src/app/api/benchmark/run/route.ts +113 -92
  580. package/.next/standalone/src/app/api/benchmark/runs/[id]/route.ts +26 -26
  581. package/.next/standalone/src/app/api/benchmark/runs/route.ts +16 -16
  582. package/.next/standalone/src/app/api/benchmark/status/route.ts +35 -35
  583. package/.next/standalone/src/app/api/bulk/route.ts +34 -34
  584. package/.next/standalone/src/app/api/chat/route.ts +85 -85
  585. package/.next/standalone/src/app/api/config/route.ts +30 -30
  586. package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
  587. package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
  588. package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
  589. package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
  590. package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
  591. package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
  592. package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
  593. package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
  594. package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
  595. package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
  596. package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
  597. package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
  598. package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
  599. package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
  600. package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
  601. package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
  602. package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
  603. package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +39 -39
  604. package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
  605. package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
  606. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +97 -97
  607. package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
  608. package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
  609. package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
  610. package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
  611. package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
  612. package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
  613. package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +8 -8
  614. package/.next/standalone/src/app/api/cortex/search/route.ts +57 -45
  615. package/.next/standalone/src/app/api/cortex/settings/route.ts +35 -35
  616. package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
  617. package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
  618. package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
  619. package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
  620. package/.next/standalone/src/app/api/events/route.ts +40 -40
  621. package/.next/standalone/src/app/api/files/route.ts +187 -187
  622. package/.next/standalone/src/app/api/folders/route.ts +107 -97
  623. package/.next/standalone/src/app/api/network/connect-callback/route.ts +11 -11
  624. package/.next/standalone/src/app/api/network/connect-request/[id]/route.ts +11 -11
  625. package/.next/standalone/src/app/api/network/connect-request/route.ts +17 -17
  626. package/.next/standalone/src/app/api/network/discovered/route.ts +9 -9
  627. package/.next/standalone/src/app/api/network/handshake/route.ts +25 -25
  628. package/.next/standalone/src/app/api/network/health/route.ts +10 -10
  629. package/.next/standalone/src/app/api/network/identity/route.ts +15 -15
  630. package/.next/standalone/src/app/api/network/keys/[id]/route.ts +10 -10
  631. package/.next/standalone/src/app/api/network/keys/route.ts +15 -15
  632. package/.next/standalone/src/app/api/network/nodes/[id]/route.ts +15 -15
  633. package/.next/standalone/src/app/api/network/nodes/check/route.ts +9 -9
  634. package/.next/standalone/src/app/api/network/nodes/route.ts +15 -15
  635. package/.next/standalone/src/app/api/network/panes/[id]/route.ts +78 -62
  636. package/.next/standalone/src/app/api/network/panes/route.ts +61 -50
  637. package/.next/standalone/src/app/api/network/projects/route.ts +32 -25
  638. package/.next/standalone/src/app/api/network/proxy/[nodeId]/[...path]/route.ts +25 -25
  639. package/.next/standalone/src/app/api/network/search/route.ts +45 -38
  640. package/.next/standalone/src/app/api/network/sessions/[id]/messages/route.ts +43 -36
  641. package/.next/standalone/src/app/api/network/sessions/[id]/route.ts +41 -34
  642. package/.next/standalone/src/app/api/network/sessions/route.ts +50 -43
  643. package/.next/standalone/src/app/api/network/terminal/token/route.ts +10 -10
  644. package/.next/standalone/src/app/api/network/workspaces/[id]/route.ts +80 -71
  645. package/.next/standalone/src/app/api/network/workspaces/route.ts +87 -85
  646. package/.next/standalone/src/app/api/panes/[id]/diff/route.ts +121 -121
  647. package/.next/standalone/src/app/api/panes/[id]/route.ts +60 -60
  648. package/.next/standalone/src/app/api/panes/route.ts +39 -39
  649. package/.next/standalone/src/app/api/projects/route.ts +13 -13
  650. package/.next/standalone/src/app/api/proxy/models/[modelId]/[...path]/route.ts +80 -80
  651. package/.next/standalone/src/app/api/proxy/models/[modelId]/status/route.ts +33 -33
  652. package/.next/standalone/src/app/api/search/route.ts +47 -47
  653. package/.next/standalone/src/app/api/sessions/[id]/chat/route.ts +120 -120
  654. package/.next/standalone/src/app/api/sessions/[id]/messages/route.ts +34 -34
  655. package/.next/standalone/src/app/api/sessions/[id]/route.ts +73 -73
  656. package/.next/standalone/src/app/api/sessions/route.ts +64 -64
  657. package/.next/standalone/src/app/api/sync/route.ts +24 -24
  658. package/.next/standalone/src/app/api/tags/route.ts +35 -35
  659. package/.next/standalone/src/app/api/tier/route.ts +16 -16
  660. package/.next/standalone/src/app/api/updates/route.ts +65 -65
  661. package/.next/standalone/src/app/api/whisper/config/route.ts +50 -42
  662. package/.next/standalone/src/app/api/whisper/route.ts +91 -91
  663. package/.next/standalone/src/app/api/wizard/chart/route.ts +129 -0
  664. package/.next/standalone/src/app/api/wizard/chat/route.ts +113 -113
  665. package/.next/standalone/src/app/api/workspaces/[id]/context/[key]/route.ts +39 -39
  666. package/.next/standalone/src/app/api/workspaces/[id]/context/route.ts +28 -28
  667. package/.next/standalone/src/app/api/workspaces/[id]/messages/[msgId]/route.ts +17 -17
  668. package/.next/standalone/src/app/api/workspaces/[id]/messages/route.ts +39 -39
  669. package/.next/standalone/src/app/api/workspaces/[id]/route.ts +47 -47
  670. package/.next/standalone/src/app/api/workspaces/[id]/sessions/route.ts +62 -62
  671. package/.next/standalone/src/app/api/workspaces/route.ts +79 -79
  672. package/.next/standalone/src/app/globals.css +88 -88
  673. package/.next/standalone/src/app/layout.tsx +33 -33
  674. package/.next/standalone/src/app/login/layout.tsx +7 -7
  675. package/.next/standalone/src/app/login/page.tsx +315 -315
  676. package/.next/standalone/src/app/m/layout.tsx +16 -16
  677. package/.next/standalone/src/app/m/page.tsx +118 -118
  678. package/.next/standalone/src/app/m/projects/page.tsx +64 -64
  679. package/.next/standalone/src/app/m/sessions/[id]/page.tsx +168 -168
  680. package/.next/standalone/src/app/m/sessions/page.tsx +177 -177
  681. package/.next/standalone/src/app/m/settings/page.tsx +230 -230
  682. package/.next/standalone/src/app/m/terminal/page.tsx +413 -413
  683. package/.next/standalone/src/app/vr/page.tsx +21 -21
  684. package/.next/standalone/src/app/vr/vr-app.tsx +163 -163
  685. package/.next/standalone/src/app/vr/vr-controls.tsx +139 -139
  686. package/.next/standalone/src/app/vr/vr-door.tsx +82 -82
  687. package/.next/standalone/src/app/vr/vr-environment.tsx +71 -71
  688. package/.next/standalone/src/app/vr/vr-gaze.tsx +89 -89
  689. package/.next/standalone/src/app/vr/vr-layout.ts +49 -49
  690. package/.next/standalone/src/app/vr/vr-lobby.tsx +97 -97
  691. package/.next/standalone/src/app/vr/vr-pane.tsx +195 -195
  692. package/.next/standalone/src/app/vr/vr-room.tsx +79 -79
  693. package/.next/standalone/src/app/vr/vr-terminal.tsx +303 -303
  694. package/.next/standalone/src/components/auth/totp-gate.tsx +183 -183
  695. package/.next/standalone/src/components/bus/activity-panel.tsx +261 -261
  696. package/.next/standalone/src/components/common/color-picker.tsx +35 -35
  697. package/.next/standalone/src/components/common/dev-directory-picker.tsx +339 -339
  698. package/.next/standalone/src/components/common/folder-picker.tsx +200 -200
  699. package/.next/standalone/src/components/common/tag-picker.tsx +190 -190
  700. package/.next/standalone/src/components/common/workspace-picker.tsx +113 -113
  701. package/.next/standalone/src/components/cortex/benchmark-tab.tsx +894 -880
  702. package/.next/standalone/src/components/cortex/constants.ts +29 -29
  703. package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
  704. package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
  705. package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
  706. package/.next/standalone/src/components/cortex/cortex-settings.tsx +280 -280
  707. package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
  708. package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
  709. package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
  710. package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
  711. package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
  712. package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
  713. package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
  714. package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
  715. package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
  716. package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
  717. package/.next/standalone/src/components/dashboard/activity-chart.tsx +41 -41
  718. package/.next/standalone/src/components/dashboard/model-usage-chart.tsx +61 -61
  719. package/.next/standalone/src/components/dashboard/recent-sessions.tsx +68 -68
  720. package/.next/standalone/src/components/dashboard/stats-cards.tsx +36 -36
  721. package/.next/standalone/src/components/files/file-explorer.tsx +703 -703
  722. package/.next/standalone/src/components/layout/providers.tsx +38 -38
  723. package/.next/standalone/src/components/layout/sidebar.tsx +170 -170
  724. package/.next/standalone/src/components/layout/tier-provider.tsx +53 -53
  725. package/.next/standalone/src/components/layout/update-banner.tsx +92 -92
  726. package/.next/standalone/src/components/mobile/bottom-nav.tsx +46 -46
  727. package/.next/standalone/src/components/mobile/immersive-voice-button.tsx +123 -123
  728. package/.next/standalone/src/components/mobile/mobile-chat-input.tsx +244 -244
  729. package/.next/standalone/src/components/mobile/mobile-header.tsx +44 -44
  730. package/.next/standalone/src/components/mobile/mobile-session-card.tsx +56 -56
  731. package/.next/standalone/src/components/mobile/mobile-terminal-input.tsx +74 -74
  732. package/.next/standalone/src/components/mobile/mobile-terminal-pane.tsx +302 -302
  733. package/.next/standalone/src/components/mobile/mobile-terminal-toolbar.tsx +76 -76
  734. package/.next/standalone/src/components/mobile/pull-to-refresh.tsx +82 -82
  735. package/.next/standalone/src/components/mobile/voice-input.tsx +53 -53
  736. package/.next/standalone/src/components/network/api-key-list.tsx +190 -190
  737. package/.next/standalone/src/components/network/connection-requests.tsx +94 -94
  738. package/.next/standalone/src/components/network/node-add-dialog.tsx +131 -131
  739. package/.next/standalone/src/components/network/node-badge.tsx +26 -26
  740. package/.next/standalone/src/components/network/node-list.tsx +207 -207
  741. package/.next/standalone/src/components/network/node-selector.tsx +49 -49
  742. package/.next/standalone/src/components/sessions/session-filters.tsx +116 -116
  743. package/.next/standalone/src/components/sessions/session-list.tsx +485 -485
  744. package/.next/standalone/src/components/terminal/pane-diff-panel.tsx +179 -179
  745. package/.next/standalone/src/components/terminal/terminal-pane.tsx +1530 -1464
  746. package/.next/standalone/src/components/viewer/chat-input.tsx +275 -275
  747. package/.next/standalone/src/components/viewer/message-renderer.tsx +551 -551
  748. package/.next/standalone/src/components/wizard/chart-wizard.tsx +405 -0
  749. package/.next/standalone/src/components/wizard/project-wizard.tsx +153 -153
  750. package/.next/standalone/src/components/wizard/wizard-chat.tsx +99 -99
  751. package/.next/standalone/src/components/wizard/wizard-plan-summary.tsx +103 -103
  752. package/.next/standalone/src/components/wizard/wizard-review.tsx +225 -225
  753. package/.next/standalone/src/components/workspace/universe-cluster.tsx +131 -131
  754. package/.next/standalone/src/components/workspace/universe-orb.tsx +128 -128
  755. package/.next/standalone/src/components/workspace/universe-types.ts +22 -22
  756. package/.next/standalone/src/components/workspace/universe-utils.ts +11 -11
  757. package/.next/standalone/src/components/workspace/universe-view.tsx +397 -397
  758. package/.next/standalone/src/components/workspace/workspace-chooser.tsx +634 -634
  759. package/.next/standalone/src/hooks/use-benchmark.ts +72 -71
  760. package/.next/standalone/src/hooks/use-bus.ts +147 -147
  761. package/.next/standalone/src/hooks/use-idle-detection.ts +79 -79
  762. package/.next/standalone/src/hooks/use-network.ts +229 -229
  763. package/.next/standalone/src/hooks/use-sessions.ts +437 -437
  764. package/.next/standalone/src/hooks/use-speech-recognition.ts +114 -113
  765. package/.next/standalone/src/hooks/use-sse.ts +35 -35
  766. package/.next/standalone/src/hooks/use-tier.ts +39 -39
  767. package/.next/standalone/src/lib/agents.ts +97 -97
  768. package/.next/standalone/src/lib/aider/parser.ts +111 -111
  769. package/.next/standalone/src/lib/api.ts +19 -19
  770. package/.next/standalone/src/lib/auth.ts +47 -47
  771. package/.next/standalone/src/lib/claude/parser.ts +212 -212
  772. package/.next/standalone/src/lib/claude/stats.ts +204 -204
  773. package/.next/standalone/src/lib/codex/parser.test.ts +111 -111
  774. package/.next/standalone/src/lib/codex/parser.ts +287 -287
  775. package/.next/standalone/src/lib/config.ts +132 -132
  776. package/.next/standalone/src/lib/cortex/benchmark.ts +83 -67
  777. package/.next/standalone/src/lib/cortex/config.ts +42 -42
  778. package/.next/standalone/src/lib/cortex/debug.ts +10 -10
  779. package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
  780. package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
  781. package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
  782. package/.next/standalone/src/lib/cortex/index.ts +109 -56
  783. package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
  784. package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
  785. package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
  786. package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
  787. package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
  788. package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
  789. package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
  790. package/.next/standalone/src/lib/cortex/mcp/server.ts +12 -12
  791. package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
  792. package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
  793. package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
  794. package/.next/standalone/src/lib/cortex/types.ts +39 -39
  795. package/.next/standalone/src/lib/cost-calculator.ts +48 -48
  796. package/.next/standalone/src/lib/db/init.ts +71 -71
  797. package/.next/standalone/src/lib/db/queries.ts +740 -827
  798. package/.next/standalone/src/lib/db/schema.ts +206 -206
  799. package/.next/standalone/src/lib/events/sse.ts +36 -36
  800. package/.next/standalone/src/lib/forge/parser.ts +52 -52
  801. package/.next/standalone/src/lib/gemini/parser.ts +258 -258
  802. package/.next/standalone/src/lib/license.ts +56 -56
  803. package/.next/standalone/src/lib/pro.ts +31 -31
  804. package/.next/standalone/src/lib/shell-user.ts +101 -0
  805. package/.next/standalone/src/lib/sync/indexer.ts +504 -504
  806. package/.next/standalone/src/lib/sync/watcher.ts +64 -64
  807. package/.next/standalone/src/lib/teams.ts +31 -31
  808. package/.next/standalone/src/lib/telemetry.ts +75 -75
  809. package/.next/standalone/src/lib/terminal/server.ts +188 -188
  810. package/.next/standalone/src/lib/tier.ts +38 -38
  811. package/.next/standalone/src/lib/utils.ts +72 -72
  812. package/.next/standalone/src/lib/vms/manager.ts +121 -121
  813. package/.next/standalone/src/middleware.ts +133 -133
  814. package/.next/standalone/src/types/claude.ts +208 -208
  815. package/.next/standalone/src/types/network.ts +61 -61
  816. package/.next/standalone/tests/setup.ts +8 -8
  817. package/.next/standalone/tsconfig.json +34 -34
  818. package/.next/standalone/vitest.config.ts +24 -24
  819. package/LICENSE +661 -661
  820. package/README.md +131 -131
  821. package/bin/cortex-hook.js +79 -79
  822. package/bin/cortex-hook.sh +62 -62
  823. package/bin/cortex-learn-hook.js +138 -138
  824. package/bin/cortex-mcp.js +60 -60
  825. package/bin/cortex-pi-extension.ts +170 -170
  826. package/bin/fix-standalone-externals.js +79 -79
  827. package/bin/lib/auto-setup.js +110 -110
  828. package/bin/mdns-service.js +171 -171
  829. package/bin/postinstall.js +35 -35
  830. package/bin/setup-admin.js +195 -195
  831. package/bin/spaces-dev.js +247 -247
  832. package/bin/spaces-install.js +660 -660
  833. package/bin/spaces-postinstall.js +50 -50
  834. package/bin/spaces-reset-totp.js +50 -50
  835. package/bin/spaces-service.js +1046 -1046
  836. package/bin/spaces-setup.js +253 -253
  837. package/bin/spaces.js +808 -805
  838. package/bin/ssh-auth-keys.sh +68 -68
  839. package/bin/terminal-server.js +2819 -2781
  840. package/package.json +111 -111
  841. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0903a426._.js +0 -98
  842. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e8ccc9._.js +0 -98
  843. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11c684b1._.js +0 -98
  844. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1572d4ef._.js +0 -98
  845. package/.next/standalone/.next/server/chunks/[root-of-the-server]__186cd0bb._.js +0 -3
  846. package/.next/standalone/.next/server/chunks/[root-of-the-server]__212760e6._.js +0 -98
  847. package/.next/standalone/.next/server/chunks/[root-of-the-server]__228595ec._.js +0 -98
  848. package/.next/standalone/.next/server/chunks/[root-of-the-server]__283c890f._.js +0 -3
  849. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f300a68._.js +0 -98
  850. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f452778._.js +0 -98
  851. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35f8e77e._.js +0 -98
  852. package/.next/standalone/.next/server/chunks/[root-of-the-server]__379fc2e9._.js +0 -98
  853. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3b40d79f._.js +0 -98
  854. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3d3dca2b._.js +0 -98
  855. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d5b78d2._.js +0 -98
  856. package/.next/standalone/.next/server/chunks/[root-of-the-server]__54163e52._.js +0 -98
  857. package/.next/standalone/.next/server/chunks/[root-of-the-server]__563c0817._.js +0 -3
  858. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5812f90a._.js +0 -98
  859. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5e87f5._.js +0 -98
  860. package/.next/standalone/.next/server/chunks/[root-of-the-server]__60d15b16._.js +0 -98
  861. package/.next/standalone/.next/server/chunks/[root-of-the-server]__69d315e5._.js +0 -3
  862. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71f29038._.js +0 -98
  863. package/.next/standalone/.next/server/chunks/[root-of-the-server]__74084e07._.js +0 -3
  864. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7921aa80._.js +0 -98
  865. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e077dd8._.js +0 -98
  866. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7ebc4280._.js +0 -131
  867. package/.next/standalone/.next/server/chunks/[root-of-the-server]__857c60bb._.js +0 -98
  868. package/.next/standalone/.next/server/chunks/[root-of-the-server]__874fe565._.js +0 -98
  869. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8e2171f7._.js +0 -98
  870. package/.next/standalone/.next/server/chunks/[root-of-the-server]__95659b2d._.js +0 -98
  871. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9679b91e._.js +0 -98
  872. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a90729a1._.js +0 -98
  873. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad4346fa._.js +0 -98
  874. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b0862d69._.js +0 -98
  875. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b43306ee._.js +0 -98
  876. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b689ff5e._.js +0 -106
  877. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba87daaa._.js +0 -98
  878. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0461005._.js +0 -98
  879. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1deb5f3._.js +0 -98
  880. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8a62f42._.js +0 -98
  881. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cabaac2b._.js +0 -98
  882. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cb027619._.js +0 -98
  883. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf608218._.js +0 -98
  884. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfc1290d._.js +0 -98
  885. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0109b9b._.js +0 -98
  886. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0125483._.js +0 -3
  887. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d048ee6b._.js +0 -98
  888. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d12644e7._.js +0 -98
  889. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3cc946c._.js +0 -98
  890. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6fd27f8._.js +0 -98
  891. package/.next/standalone/.next/server/chunks/[root-of-the-server]__efb8251e._.js +0 -98
  892. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f44c6882._.js +0 -98
  893. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f85283de._.js +0 -98
  894. package/.next/standalone/.next/server/chunks/[root-of-the-server]__feceb3e4._.js +0 -98
  895. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__843070a6._.js +0 -3
  896. package/.next/standalone/.next/server/chunks/ssr/_e84a0c06._.js +0 -3
  897. package/.next/standalone/.next/static/chunks/470cade58d4eceeb.css +0 -3
  898. package/.next/standalone/.next/static/chunks/9d4164833c2c1fd6.js +0 -85
  899. package/.next/standalone/.next/static/chunks/f091f4bf8d80fd07.js +0 -1
  900. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
  901. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  902. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
  903. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  904. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
  905. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
  906. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  907. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
  908. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  909. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
  910. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
  911. package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  912. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  913. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
  914. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_buildManifest.js +0 -0
  915. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_clientMiddlewareManifest.json +0 -0
  916. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_ssgManifest.js +0 -0
  917. /package/.next/standalone/node_modules/@img/{sharp-libvips-linux-x64 → sharp-win32-x64}/versions.json +0 -0
package/bin/spaces.js CHANGED
@@ -1,805 +1,808 @@
1
- #!/usr/bin/env node
2
-
3
- // Re-exec with higher heap if needed (embedding models + LanceDB leak memory over time)
4
- if (!process.execArgv.some(a => a.includes('max-old-space-size')) && !process.env.__SPACES_HEAP) {
5
- process.env.__SPACES_HEAP = '1';
6
- require('child_process').spawn(
7
- process.execPath,
8
- ['--max-old-space-size=8192', ...process.argv.slice(1)],
9
- { stdio: 'inherit', env: process.env }
10
- ).on('exit', (code) => process.exit(code ?? 1));
11
- // Stop the outer process from continuing
12
- return;
13
- }
14
-
15
- const net = require('net');
16
- const http = require('http');
17
- const https = require('https');
18
- const { execFileSync, spawn } = require('child_process');
19
- const path = require('path');
20
- const os = require('os');
21
- const fs = require('fs');
22
-
23
- // Load .env.local into process.env so Next.js API routes see the keys
24
- const _envLocalPath = path.join(__dirname, '..', '.env.local');
25
- try {
26
- if (fs.existsSync(_envLocalPath)) {
27
- for (const line of fs.readFileSync(_envLocalPath, 'utf-8').split('\n')) {
28
- const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.+)$/);
29
- if (m && !process.env[m[1]]) process.env[m[1]] = m[2].trim();
30
- }
31
- }
32
- } catch {}
33
-
34
- // terminal-server is loaded lazily (after SPACES_TIER is set in process.env)
35
-
36
- // ─── Memory monitoring (only when SPACES_DEBUG or cortex.debug) ──
37
- let _lastHeapMB = 0;
38
- function logMemory(label) {
39
- if (!process.env.SPACES_DEBUG && !_spacesDebug) return;
40
- const mem = process.memoryUsage();
41
- const heapMB = Math.round(mem.heapUsed / 1048576);
42
- const rssMB = Math.round(mem.rss / 1048576);
43
- const extMB = Math.round((mem.external || 0) / 1048576);
44
- const abMB = Math.round((mem.arrayBuffers || 0) / 1048576);
45
- const delta = heapMB - _lastHeapMB;
46
- if (label || Math.abs(delta) > 20) {
47
- console.log(`[Memory] ${label || 'periodic'}: heap=${heapMB}MB rss=${rssMB}MB external=${extMB}MB arrayBuffers=${abMB}MB ${delta > 0 ? '+' : ''}${delta}MB`);
48
- }
49
- _lastHeapMB = heapMB;
50
- }
51
- let _spacesDebug = false;
52
- try {
53
- const cfgPath = path.join(os.homedir(), '.spaces', 'config.json');
54
- if (fs.existsSync(cfgPath)) _spacesDebug = !!JSON.parse(fs.readFileSync(cfgPath, 'utf-8')).cortex?.debug;
55
- } catch { /* ignore */ }
56
- setInterval(() => logMemory(), 60000);
57
-
58
- const SPACES_DIR = path.join(os.homedir(), '.spaces');
59
- const CONFIG_PATH = path.join(SPACES_DIR, 'server.json');
60
- const SESSION_SECRET_PATH = path.join(SPACES_DIR, 'session_secret');
61
- const NEXT_INTERNAL_PORT = 3400;
62
- const projectDir = path.join(__dirname, '..');
63
- const MANAGED_PACKAGES = path.join(SPACES_DIR, 'packages');
64
- const MANAGED_NODE_MODULES = path.join(MANAGED_PACKAGES, 'node_modules');
65
-
66
- // ─── CLI arg parsing ──────────────────────────────────────
67
- const args = process.argv.slice(2);
68
- const cliFlags = {};
69
- for (let i = 0; i < args.length; i++) {
70
- if (args[i] === '--setup') { cliFlags.setup = true; }
71
- else if (args[i] === '--port' && args[i + 1]) { cliFlags.port = parseInt(args[++i], 10); }
72
- else if (args[i] === '--tier' && args[i + 1]) { cliFlags.tier = args[++i]; }
73
- else if (args[i] === '--base-path' && args[i + 1]) { cliFlags.basePath = args[++i]; }
74
- else if (args[i] === '--help' || args[i] === '-h') { cliFlags.help = true; }
75
- }
76
-
77
- if (cliFlags.help) {
78
- console.log(`
79
- Spaces - Agent Workspace Manager
80
-
81
- Usage:
82
- spaces Start the server (auto-detects tier)
83
- spaces stop Stop running server
84
- spaces install <teams|pro> Install a tier package
85
- spaces uninstall [teams|pro] Uninstall packages (all if none specified)
86
- spaces verify Verify installed packages
87
- spaces upgrade [teams|pro] Upgrade installed packages
88
- spaces --setup Interactive first-time setup wizard
89
- spaces --port 3457 Override port
90
- spaces --tier team Override tier (community|team|federation)
91
- spaces --base-path /spaces Set base path for reverse proxy
92
- spaces service install Install as OS service (systemd/launchd/Task Scheduler)
93
- spaces service uninstall Remove OS service
94
- spaces service start Start the service
95
- spaces service stop Stop the service
96
- spaces service status Show service status
97
- spaces service logs Tail service logs
98
- spaces reset-totp <user> Reset TOTP/2FA for a user
99
- spaces --help Show this help
100
- `);
101
- process.exit(0);
102
- }
103
-
104
- // ─── Stop command ─────────────────────────────────────────
105
- const subcommand = args[0];
106
- if (subcommand === 'stop') {
107
- stopServer();
108
- process.exit(0);
109
- }
110
-
111
- // ─── Route install/verify/upgrade to spaces-install.js ────
112
- if (subcommand === 'install' || subcommand === 'uninstall' || subcommand === 'verify' || subcommand === 'upgrade') {
113
- // Re-exec with spaces-install.js, passing through all args
114
- const installScript = path.join(__dirname, 'spaces-install.js');
115
- const { status } = require('child_process').spawnSync(
116
- process.execPath, [installScript, ...args],
117
- { stdio: 'inherit', env: process.env }
118
- );
119
- process.exit(status || 0);
120
- }
121
-
122
- // ─── Route reset-totp to spaces-reset-totp.js ───────
123
- if (subcommand === 'reset-totp') {
124
- const resetScript = path.join(__dirname, 'spaces-reset-totp.js');
125
- const { status } = require('child_process').spawnSync(
126
- process.execPath, [resetScript, ...args.slice(1)],
127
- { stdio: 'inherit', env: process.env }
128
- );
129
- process.exit(status || 0);
130
- }
131
-
132
- // ─── Route service commands to spaces-service.js ─────
133
- if (subcommand === 'service') {
134
- const serviceScript = path.join(__dirname, 'spaces-service.js');
135
- const { status } = require('child_process').spawnSync(
136
- process.execPath, [serviceScript, ...args.slice(1)],
137
- { stdio: 'inherit', env: process.env }
138
- );
139
- process.exit(status || 0);
140
- }
141
-
142
- // ─── Setup wizard ─────────────────────────────────────────
143
- if (cliFlags.setup) {
144
- require('./spaces-setup');
145
- // spaces-setup handles its own process.exit
146
- } else if (subcommand && !subcommand.startsWith('-')) {
147
- console.error(` Unknown command: ${subcommand}`);
148
- console.error(` Run "spaces --help" for usage`);
149
- process.exit(1);
150
- } else {
151
- startServer();
152
- }
153
-
154
- // ─── TLS certificate ────────────────────────────────────────
155
- // Uses a real cert if configured in server.json (tlsCert, tlsKey, optional
156
- // tlsCa for the full chain), otherwise generates a self-signed cert so
157
- // mobile browsers that force HTTPS-first can still connect.
158
- function ensureTlsCert() {
159
- // Check for configured real cert in server.json
160
- try {
161
- const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
162
- if (config.tlsCert && config.tlsKey) {
163
- if (fs.existsSync(config.tlsCert) && fs.existsSync(config.tlsKey)) {
164
- // Read cert + key, and optionally the CA bundle for full chain
165
- const certPem = fs.readFileSync(config.tlsCert, 'utf-8').trim();
166
- const caPem = (config.tlsCa && fs.existsSync(config.tlsCa))
167
- ? fs.readFileSync(config.tlsCa, 'utf-8').trim()
168
- : null;
169
- const creds = {
170
- cert: caPem ? certPem + '\n' + caPem : certPem,
171
- key: fs.readFileSync(config.tlsKey, 'utf-8'),
172
- };
173
- console.log(' Using TLS certificate: ' + config.tlsCert);
174
- return creds;
175
- }
176
- console.log(' Warning: tlsCert/tlsKey configured but files not found, falling back to self-signed');
177
- }
178
- } catch {}
179
-
180
- // Fall back to self-signed
181
- const certPath = path.join(SPACES_DIR, 'tls-cert.pem');
182
- const keyPath = path.join(SPACES_DIR, 'tls-key.pem');
183
-
184
- if (fs.existsSync(certPath) && fs.existsSync(keyPath)) {
185
- try {
186
- return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };
187
- } catch {}
188
- }
189
-
190
- try {
191
- fs.mkdirSync(SPACES_DIR, { recursive: true });
192
- execFileSync('openssl', [
193
- 'req', '-x509', '-newkey', 'rsa:2048',
194
- '-keyout', keyPath, '-out', certPath,
195
- '-sha256', '-days', '365', '-nodes',
196
- '-subj', '/CN=spaces-local',
197
- '-addext', 'subjectAltName=DNS:localhost,DNS:*.local,DNS:*.robindale.com,IP:127.0.0.1',
198
- ], { stdio: 'pipe', timeout: 15000 });
199
- console.log(' Generated self-signed TLS certificate');
200
- return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };
201
- } catch (e) {
202
- console.log(` Warning: Could not generate TLS cert (${e.message})`);
203
- console.log(' HTTPS will not be available. Install OpenSSL to enable it.');
204
- return null;
205
- }
206
- }
207
-
208
- function startServer() {
209
- // ─── Load saved config ────────────────────────────────────
210
- let savedConfig = {};
211
- if (fs.existsSync(CONFIG_PATH)) {
212
- try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
213
- }
214
-
215
- // ─── Resolve settings (CLI > env > config > defaults) ─────
216
- const PORT = cliFlags.port
217
- || parseInt(process.env.SPACES_PORT || '', 10)
218
- || savedConfig.port
219
- || 3457;
220
-
221
- const basePath = cliFlags.basePath
222
- || process.env.SPACES_BASE_PATH
223
- || savedConfig.basePath
224
- || '';
225
-
226
- const allowedOrigins = process.env.SPACES_ALLOWED_ORIGINS
227
- || savedConfig.allowedOrigins
228
- || '';
229
-
230
- // ─── Kill any existing server on this port ───────────────────
231
- stopServer();
232
-
233
- // ─── Resolve optional packages once ─────────────────────────
234
- const proPath = resolveSpacesPro();
235
- const teamsPath = resolveSpacesTeams();
236
- const cortexPath = resolveSpacesCortex();
237
-
238
- // Tier resolution: CLI > env > config > auto-detect
239
- let tier = cliFlags.tier
240
- || process.env.SPACES_TIER
241
- || savedConfig.tier
242
- || '';
243
-
244
- // Auto-detect tier from package presence
245
- if (!tier) {
246
- if (proPath) tier = 'federation';
247
- else if (teamsPath) tier = 'team';
248
- else tier = 'community';
249
- }
250
-
251
- console.log('');
252
- console.log(' Spaces - Agent Workspace Manager');
253
- console.log(' =================================');
254
- console.log('');
255
- console.log(` Tier: ${tier}`);
256
-
257
- // ─── Server tier prerequisites ────────────────────────────
258
- const childEnv = { ...process.env };
259
-
260
- if (tier !== 'community') {
261
- // team/federation tiers require @spaces/teams (auth + collaboration)
262
- if ((tier === 'team' || tier === 'federation') && !teamsPath) {
263
- console.error(' Error: @spaces/teams is required for team/federation tiers.');
264
- console.error(' Install it: spaces install teams');
265
- process.exit(1);
266
- }
267
- // federation tier requires @spaces/pro (network)
268
- if (tier === 'federation' && !proPath) {
269
- console.error(' Error: @spaces/pro is required for the federation tier.');
270
- console.error(' Install it: spaces install pro');
271
- process.exit(1);
272
- }
273
-
274
- // Check for session secret
275
- let sessionSecret = process.env.SPACES_SESSION_SECRET || '';
276
- if (!sessionSecret && fs.existsSync(SESSION_SECRET_PATH)) {
277
- sessionSecret = fs.readFileSync(SESSION_SECRET_PATH, 'utf-8').trim();
278
- }
279
-
280
- // Check for admin DB — auto-setup if missing
281
- const adminDbPath = path.join(SPACES_DIR, 'admin.db');
282
- if (!fs.existsSync(adminDbPath) || !sessionSecret) {
283
- const { autoSetup } = require('./lib/auto-setup');
284
- const result = autoSetup({ SPACES_DIR, SESSION_SECRET_PATH, ADMIN_DB_PATH: adminDbPath, CONFIG_PATH, tier, port: PORT, basePath });
285
- sessionSecret = result.sessionSecret;
286
- }
287
-
288
- childEnv.SPACES_SESSION_SECRET = sessionSecret;
289
- process.env.SPACES_SESSION_SECRET = sessionSecret;
290
- console.log(` Admin DB: ${adminDbPath}`);
291
- }
292
-
293
- // Set tier in both child env and own process env (terminal-server reads it)
294
- childEnv.SPACES_TIER = tier;
295
- process.env.SPACES_TIER = tier;
296
- if (basePath) {
297
- childEnv.SPACES_BASE_PATH = basePath;
298
- console.log(` Base path: ${basePath}`);
299
- }
300
- if (allowedOrigins) {
301
- childEnv.SPACES_ALLOWED_ORIGINS = allowedOrigins;
302
- process.env.SPACES_ALLOWED_ORIGINS = allowedOrigins;
303
- console.log(` Allowed origins: ${allowedOrigins}`);
304
- }
305
-
306
- // ─── Resolve NODE_PATH for @spaces/pro and @spaces/teams ──
307
- // Update both childEnv (for the Next.js child process) and process.env
308
- // (for terminal-server.js which runs in this same parent process).
309
- // Include:
310
- // - Managed packages node_modules (~/.spaces/packages/node_modules)
311
- // - Each managed package's own node_modules (for its bundled deps)
312
- // - The host app's own node_modules (fallback for peer deps)
313
- const appNodeModules = path.join(projectDir, 'node_modules');
314
- const nodePaths = [MANAGED_NODE_MODULES, appNodeModules];
315
- // Add each resolved package's own node_modules so its bundled deps are found
316
- for (const pkgPath of [proPath, teamsPath, cortexPath]) {
317
- if (pkgPath) {
318
- // pkgPath is the package root (symlink target or direct path)
319
- const realPath = fs.realpathSync(pkgPath);
320
- const pkgNodeModules = path.join(realPath, 'node_modules');
321
- if (fs.existsSync(pkgNodeModules) && !nodePaths.includes(pkgNodeModules)) {
322
- nodePaths.push(pkgNodeModules);
323
- }
324
- // Also add the parent scope for @spaces/* resolution
325
- const parentModules = path.dirname(path.dirname(pkgPath));
326
- if (!nodePaths.includes(parentModules)) {
327
- nodePaths.push(parentModules);
328
- }
329
- }
330
- }
331
- for (const dir of nodePaths) {
332
- for (const target of [childEnv, process.env]) {
333
- const existing = target.NODE_PATH || '';
334
- if (!existing.includes(dir)) {
335
- target.NODE_PATH = existing
336
- ? `${dir}${path.delimiter}${existing}`
337
- : dir;
338
- }
339
- }
340
- }
341
- // Re-init module paths so require() in this process picks up the new NODE_PATH
342
- require('module').Module._initPaths();
343
-
344
- // Verify collaboration pipeline works end-to-end at startup
345
- if (tier === 'team' || tier === 'federation') {
346
- try {
347
- const teams = require('@spaces/teams');
348
- console.log(' Collaboration: @spaces/teams loaded OK');
349
- // Smoke-test that peer deps resolve from this process
350
- require('better-sqlite3');
351
- } catch (e) {
352
- console.error(` Warning: Collaboration may not work ${e.message}`);
353
- console.error(' Check that NODE_PATH includes the host app node_modules.');
354
- }
355
- }
356
-
357
- // ─── Detect @spaces/cortex ──────────────────────────────────
358
- if (cortexPath) {
359
- childEnv.SPACES_HAS_CORTEX = '1';
360
- process.env.SPACES_HAS_CORTEX = '1';
361
- console.log(' Cortex: @spaces/cortex detected');
362
- }
363
-
364
- console.log('');
365
-
366
- // ─── Background update check (non-blocking, repeats every 4h) ──
367
- // Checks npm registry, GitHub releases, and addon git repos.
368
- // Writes results to ~/.spaces/update-check.json for the UI banner.
369
- const updateCheckPath = path.join(SPACES_DIR, 'update-check.json');
370
- const checkForUpdates = async (logIfAvailable = true) => {
371
- try {
372
- const pkg = require(path.join(projectDir, 'package.json'));
373
- const currentVersion = pkg.version;
374
- const npmName = pkg.name || '@jlongo78/agent-spaces';
375
- const githubRepo = 'jlongo78/spaces';
376
-
377
- // Check npm registry
378
- let npmLatest = null;
379
- try {
380
- const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(npmName)}/latest`, {
381
- signal: AbortSignal.timeout(5000),
382
- });
383
- if (res.ok) {
384
- const data = await res.json();
385
- npmLatest = data.version;
386
- }
387
- } catch { /* */ }
388
-
389
- // Check GitHub for latest release or tag (may be ahead of npm)
390
- let githubLatest = null;
391
- let githubPrerelease = false;
392
- let githubUrl = null;
393
- try {
394
- // Check releases first (includes pre-releases)
395
- const res = await fetch(`https://api.github.com/repos/${githubRepo}/releases?per_page=5`, {
396
- signal: AbortSignal.timeout(5000),
397
- headers: { 'Accept': 'application/vnd.github.v3+json', 'User-Agent': 'agent-spaces' },
398
- });
399
- if (res.ok) {
400
- const releases = await res.json();
401
- if (releases.length > 0) {
402
- // Find latest stable and latest pre-release
403
- const stable = releases.find(r => !r.prerelease && !r.draft);
404
- const pre = releases.find(r => r.prerelease && !r.draft);
405
- if (stable) {
406
- githubLatest = stable.tag_name.replace(/^v/, '');
407
- githubUrl = stable.html_url;
408
- }
409
- if (pre) {
410
- const preVersion = pre.tag_name.replace(/^v/, '');
411
- // If pre-release is newer than stable, surface it
412
- if (!githubLatest || preVersion > githubLatest) {
413
- githubLatest = preVersion;
414
- githubPrerelease = true;
415
- githubUrl = pre.html_url;
416
- }
417
- }
418
- }
419
- }
420
- } catch { /* */ }
421
-
422
- // Check addon git repos
423
- const gitSafe = ['-c', 'safe.directory=*'];
424
- const addonPaths = { teams: teamsPath, pro: proPath, cortex: cortexPath };
425
- const addons = {};
426
- for (const [key, addonDir] of Object.entries(addonPaths)) {
427
- if (!addonDir || !fs.existsSync(path.join(addonDir, '.git'))) continue;
428
- const realDir = fs.realpathSync(addonDir);
429
- try {
430
- execFileSync('git', [...gitSafe, 'fetch', '--quiet'], { cwd: realDir, stdio: 'ignore', timeout: 5000 });
431
- const local = execFileSync('git', [...gitSafe, 'rev-parse', 'HEAD'], { cwd: realDir, encoding: 'utf-8' }).trim();
432
- const remote = execFileSync('git', [...gitSafe, 'rev-parse', '@{u}'], { cwd: realDir, encoding: 'utf-8' }).trim();
433
- let commitsBehind = 0;
434
- if (local !== remote) {
435
- try {
436
- const count = execFileSync('git', [...gitSafe, 'rev-list', '--count', `HEAD..@{u}`], { cwd: realDir, encoding: 'utf-8' }).trim();
437
- commitsBehind = parseInt(count, 10) || 0;
438
- } catch { /* */ }
439
- }
440
- const behind = commitsBehind > 0;
441
- addons[key] = { installed: true, behind, commitsBehind, localHead: local.slice(0, 7) };
442
- if (behind && logIfAvailable) {
443
- console.log(` Update available for @spaces/${key}: ${commitsBehind} commit(s) behind (run: spaces upgrade ${key})`);
444
- }
445
- } catch {
446
- addons[key] = { installed: true, behind: false, commitsBehind: 0 };
447
- }
448
- }
449
-
450
- const npmAvailable = npmLatest && npmLatest !== currentVersion && npmLatest > currentVersion;
451
- const githubAvailable = githubLatest && githubLatest !== currentVersion && githubLatest > currentVersion;
452
-
453
- const result = {
454
- current: currentVersion,
455
- npm: npmLatest ? { latest: npmLatest, available: !!npmAvailable } : null,
456
- github: githubLatest ? { latest: githubLatest, prerelease: githubPrerelease, url: githubUrl, available: !!githubAvailable } : null,
457
- // Backward compat: 'available' and 'latest' still work for the existing banner
458
- latest: npmLatest || githubLatest || currentVersion,
459
- available: !!(npmAvailable || githubAvailable),
460
- addons,
461
- checkedAt: Date.now(),
462
- name: npmName,
463
- };
464
-
465
- fs.writeFileSync(updateCheckPath, JSON.stringify(result, null, 2));
466
-
467
- if (npmAvailable && logIfAvailable) {
468
- console.log(` Update available: ${currentVersion} → ${npmLatest} (run: npm i -g ${npmName})`);
469
- }
470
- if (githubAvailable && (!npmAvailable || githubLatest > npmLatest) && logIfAvailable) {
471
- console.log(` GitHub ${githubPrerelease ? 'pre-release' : 'release'}: ${githubLatest} (${githubUrl || `https://github.com/${githubRepo}/releases`})`);
472
- }
473
- } catch { /* network error skip silently */ }
474
- };
475
- checkForUpdates(true);
476
- setInterval(() => checkForUpdates(false), 4 * 3600_000);
477
-
478
- // Check for ~/.claude/ directory
479
- const claudeDir = path.join(os.homedir(), '.claude');
480
- if (!fs.existsSync(claudeDir)) {
481
- console.log(' Warning: ~/.claude/ not found. Have you used Claude Code yet?');
482
- console.log('');
483
- }
484
-
485
- // ─── Detect build type ────────────────────────────────────
486
- const standaloneServer = path.join(projectDir, '.next', 'standalone', 'server.js');
487
- const fullBuildDir = path.join(projectDir, '.next', 'BUILD_ID');
488
- const isStandalone = fs.existsSync(standaloneServer);
489
- const isFullBuild = fs.existsSync(fullBuildDir);
490
-
491
- if (!isStandalone && !isFullBuild) {
492
- console.error(' Error: No build found.');
493
- console.error(' Run "npm run build" first, or install via "npm install -g @jlongo78/agent-spaces".');
494
- process.exit(1);
495
- }
496
-
497
- // ─── Spawn Next.js ────────────────────────────────────────
498
- let next;
499
- if (isStandalone) {
500
- const parentNodeModules = path.join(projectDir, 'node_modules');
501
- const existingNodePath = childEnv.NODE_PATH || '';
502
- childEnv.NODE_PATH = existingNodePath
503
- ? `${parentNodeModules}${path.delimiter}${existingNodePath}`
504
- : parentNodeModules;
505
-
506
- next = spawn(process.execPath, [standaloneServer], {
507
- cwd: path.dirname(standaloneServer),
508
- stdio: ['ignore', 'pipe', 'pipe'],
509
- env: {
510
- ...childEnv,
511
- PORT: String(NEXT_INTERNAL_PORT),
512
- HOSTNAME: '0.0.0.0',
513
- NODE_ENV: 'production',
514
- },
515
- });
516
- } else {
517
- next = spawn('npx', ['next', 'start', '--port', String(NEXT_INTERNAL_PORT)], {
518
- cwd: projectDir,
519
- stdio: ['ignore', 'pipe', 'pipe'],
520
- env: {
521
- ...childEnv,
522
- PORT: String(NEXT_INTERNAL_PORT),
523
- HOSTNAME: '0.0.0.0',
524
- NODE_ENV: 'production',
525
- },
526
- shell: true,
527
- });
528
- }
529
-
530
- let nextReady = false;
531
-
532
- next.stdout.on('data', (data) => {
533
- const msg = data.toString();
534
- process.stdout.write(msg);
535
- if (!nextReady && (msg.includes('Ready') || msg.includes('started server') || msg.includes('Listening') || msg.includes('localhost'))) {
536
- nextReady = true;
537
- console.log(`\n Ready at http://localhost:${PORT}`);
538
- if (tlsCreds) console.log(` Also at https://localhost:${PORT} (self-signed)`);
539
- console.log('');
540
-
541
- const url = `http://localhost:${PORT}`;
542
- const isService = process.env.SPACES_SERVICE === '1';
543
- if (!isService) {
544
- try {
545
- if (process.platform === 'win32') {
546
- execFileSync('cmd', ['/c', 'start', url], { stdio: 'ignore' });
547
- } else if (process.platform === 'darwin') {
548
- execFileSync('open', [url], { stdio: 'ignore' });
549
- } else {
550
- execFileSync('xdg-open', [url], { stdio: 'ignore' });
551
- }
552
- } catch {
553
- console.log(` Open ${url} in your browser`);
554
- }
555
- }
556
- }
557
- });
558
-
559
- next.stderr.on('data', (data) => {
560
- const msg = data.toString();
561
- if (!msg.includes('Warning')) {
562
- process.stderr.write(data);
563
- }
564
- });
565
-
566
- next.on('exit', (code) => {
567
- if (code !== 0 && code !== null) {
568
- console.error(` [spaces] Next.js exited with code ${code}`);
569
- }
570
- cleanup();
571
- });
572
-
573
- // ─── Proxy request handler (shared by HTTP and HTTPS) ────
574
- function proxyHandler(req, res) {
575
- // WebSocket paths are handled by the 'upgrade' event, but a plain
576
- // HTTP request to /ws (e.g. health check) should not be proxied to
577
- // Next.js which would 308-redirect it due to trailingSlash.
578
- const urlPath = (req.url || '').split('?')[0];
579
- if (urlPath === '/ws' || urlPath.endsWith('/ws') || urlPath.endsWith('/ws/')) {
580
- res.writeHead(200, { 'Content-Type': 'text/plain' });
581
- res.end('WebSocket endpoint');
582
- return;
583
- }
584
-
585
- const proxyReq = http.request(
586
- {
587
- hostname: '127.0.0.1',
588
- port: NEXT_INTERNAL_PORT,
589
- path: req.url,
590
- method: req.method,
591
- headers: req.headers,
592
- },
593
- (proxyRes) => {
594
- // Log cortex context API calls
595
- if (urlPath.startsWith('/api/cortex/context')) {
596
- const chunks = [];
597
- proxyRes.on('data', (chunk) => chunks.push(chunk));
598
- proxyRes.on('end', () => {
599
- const body = Buffer.concat(chunks);
600
- try {
601
- const d = JSON.parse(body.toString());
602
- const q = decodeURIComponent((req.url.match(/q=([^&]+)/) || [])[1] || '?').slice(0, 60);
603
- const hits = d.results?.length || 0;
604
- console.log(`[Cortex Context] q="${q}" → ${hits} results (${d.timing?.totalMs || '?'}ms)`);
605
- } catch {}
606
- res.writeHead(proxyRes.statusCode, proxyRes.headers);
607
- res.end(body);
608
- });
609
- } else {
610
- res.writeHead(proxyRes.statusCode, proxyRes.headers);
611
- proxyRes.pipe(res);
612
- }
613
- }
614
- );
615
- proxyReq.on('error', () => {
616
- if (!res.headersSent) {
617
- res.writeHead(502);
618
- res.end('Server not ready yet. Refresh in a moment.');
619
- }
620
- });
621
- req.pipe(proxyReq);
622
- }
623
-
624
- // ─── HTTP + HTTPS on a single port ─────────────────────────
625
- // Peek at the first byte of each connection: 0x16 = TLS ClientHello,
626
- // anything else = plain HTTP. This lets mobile browsers that force
627
- // HTTPS-first connect to the same port without a separate listener.
628
- const httpServer = http.createServer(proxyHandler);
629
- const tlsCreds = ensureTlsCert();
630
- const httpsServer = tlsCreds ? https.createServer(tlsCreds, proxyHandler) : null;
631
-
632
- const { createTerminalServer } = require('./terminal-server');
633
- createTerminalServer(httpServer);
634
- if (httpsServer) createTerminalServer(httpsServer);
635
-
636
- // Wire up 'address()' on the inner servers so terminal-server can
637
- // discover the port, then emit 'listening' so its event handler fires.
638
- const patchAddress = (srv) => { srv.address = () => ({ port: PORT }); };
639
- patchAddress(httpServer);
640
- if (httpsServer) patchAddress(httpsServer);
641
-
642
- const dualServer = net.createServer((socket) => {
643
- // If client connects but sends nothing for 5s, destroy.
644
- // Once routed, clear the timeout so long-lived connections (WebSocket) aren't killed.
645
- socket.setTimeout(5000, () => socket.destroy());
646
- socket.once('data', (buf) => {
647
- socket.setTimeout(0);
648
- socket.pause();
649
- const target = (buf[0] === 0x16 && httpsServer) ? httpsServer : httpServer;
650
- target.emit('connection', socket);
651
- socket.unshift(buf);
652
- socket.resume();
653
- });
654
- });
655
-
656
- dualServer.listen(PORT, () => {
657
- // Now that the port is bound, tell the inner servers they're "listening"
658
- // so terminal-server's mDNS and message watcher start up.
659
- httpServer.emit('listening');
660
- if (httpsServer) httpsServer.emit('listening');
661
-
662
- if (httpsServer) {
663
- console.log(` Starting server on port ${PORT} (HTTP + HTTPS)`);
664
- } else {
665
- console.log(` Starting server on http://localhost:${PORT}`);
666
- }
667
- console.log('');
668
- });
669
-
670
- function cleanup() {
671
- next.kill();
672
- dualServer.close();
673
- process.exit(0);
674
- }
675
-
676
- process.on('SIGINT', cleanup);
677
- process.on('SIGTERM', cleanup);
678
- }
679
-
680
- // ─── Stop running server ─────────────────────────────────────
681
- function findPidsOnPort(port) {
682
- const pids = new Set();
683
- if (process.platform === 'win32') {
684
- try {
685
- const output = execFileSync('netstat', ['-ano'], { encoding: 'utf-8' });
686
- for (const line of output.split(String.fromCharCode(10))) {
687
- if (line.includes(':' + port + ' ') && line.includes('LISTENING')) {
688
- const parts = line.trim().split(/\s+/);
689
- const pid = parseInt(parts[parts.length - 1], 10);
690
- if (pid > 0) pids.add(pid);
691
- }
692
- }
693
- } catch {}
694
- } else {
695
- try {
696
- const output = execFileSync('lsof', ['-ti', `tcp:${port}`], { encoding: 'utf-8' }).trim();
697
- for (const p of output.split('\n')) { if (p.trim()) pids.add(parseInt(p.trim(), 10)); }
698
- } catch {}
699
- try {
700
- const output = execFileSync('fuser', [`${port}/tcp`], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
701
- for (const p of output.split(/\s+/)) { if (p.trim()) pids.add(parseInt(p.trim(), 10)); }
702
- } catch {}
703
- }
704
- return [...pids].filter(p => !isNaN(p) && p > 0);
705
- }
706
-
707
- function stopServer() {
708
- let savedConfig = {};
709
- if (fs.existsSync(CONFIG_PATH)) {
710
- try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
711
- }
712
- const port = parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
713
- const ports = [port, NEXT_INTERNAL_PORT];
714
- let killed = 0;
715
-
716
- for (const p of ports) {
717
- for (const pid of findPidsOnPort(p)) {
718
- try {
719
- process.kill(pid, 'SIGTERM');
720
- killed++;
721
- } catch {}
722
- }
723
- }
724
-
725
- if (killed > 0) {
726
- console.log(` Stopped ${killed} process(es) on port ${port}`);
727
- // Wait for ports to be released, escalate to SIGKILL if needed
728
- const deadline = Date.now() + 2000;
729
- let escalated = false;
730
- while (Date.now() < deadline) {
731
- const remaining = ports.flatMap(p => findPidsOnPort(p));
732
- if (remaining.length === 0) break;
733
- if (!escalated && Date.now() > deadline - 1000) {
734
- for (const pid of remaining) {
735
- try { process.kill(pid, 'SIGKILL'); } catch {}
736
- }
737
- escalated = true;
738
- }
739
- if (process.platform === 'win32') { require('child_process').spawnSync('powershell', ['-Command', 'Start-Sleep -Milliseconds 200']); } else { require('child_process').spawnSync('sleep', ['0.2']); }
740
- }
741
- } else {
742
- console.log(` No running server found on port ${port}`);
743
- }
744
- }
745
-
746
- // ─── @spaces/pro resolution ──────────────────────────────────
747
- function resolveSpacesPro() {
748
- // 1. Managed install (~/.spaces/packages/)
749
- const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'pro');
750
- if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
751
-
752
- // 2. Local node_modules (npm link / optionalDep)
753
- try {
754
- return require.resolve('@spaces/pro');
755
- } catch {}
756
-
757
- // 3. Global npm prefix (legacy)
758
- try {
759
- const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
760
- const globalProPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'pro');
761
- if (fs.existsSync(globalProPath)) return globalProPath;
762
- const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'pro');
763
- if (fs.existsSync(altPath)) return altPath;
764
- } catch {}
765
-
766
- return null;
767
- }
768
-
769
- // ─── @spaces/teams resolution ────────────────────────────────
770
- function resolveSpacesTeams() {
771
- // 1. Managed install (~/.spaces/packages/)
772
- const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'teams');
773
- if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
774
-
775
- // 2. Local node_modules (npm link / optionalDep)
776
- try {
777
- return require.resolve('@spaces/teams');
778
- } catch {}
779
-
780
- // 3. Global npm prefix (legacy)
781
- try {
782
- const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
783
- const globalTeamsPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'teams');
784
- if (fs.existsSync(globalTeamsPath)) return globalTeamsPath;
785
- const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'teams');
786
- if (fs.existsSync(altPath)) return altPath;
787
- } catch {}
788
-
789
- return null;
790
- }
791
-
792
- // ─── @spaces/cortex resolution ───────────────────────────────
793
- function resolveSpacesCortex() {
794
- const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'cortex');
795
- if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
796
- try { return require.resolve('@spaces/cortex'); } catch {}
797
- try {
798
- const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
799
- const globalPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'cortex');
800
- if (fs.existsSync(globalPath)) return globalPath;
801
- const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'cortex');
802
- if (fs.existsSync(altPath)) return altPath;
803
- } catch {}
804
- return null;
805
- }
1
+ #!/usr/bin/env node
2
+
3
+ // Re-exec with higher heap if needed (embedding models + LanceDB leak memory over time)
4
+ if (!process.execArgv.some(a => a.includes('max-old-space-size')) && !process.env.__SPACES_HEAP) {
5
+ process.env.__SPACES_HEAP = '1';
6
+ require('child_process').spawn(
7
+ process.execPath,
8
+ ['--max-old-space-size=8192', ...process.argv.slice(1)],
9
+ { stdio: 'inherit', env: process.env }
10
+ ).on('exit', (code) => process.exit(code ?? 1));
11
+ // Stop the outer process from continuing
12
+ return;
13
+ }
14
+
15
+ const net = require('net');
16
+ const http = require('http');
17
+ const https = require('https');
18
+ const { execFileSync, spawn } = require('child_process');
19
+ const path = require('path');
20
+ const os = require('os');
21
+ const fs = require('fs');
22
+
23
+ // Load .env.local into process.env so Next.js API routes see the keys
24
+ const _envLocalPath = path.join(__dirname, '..', '.env.local');
25
+ try {
26
+ if (fs.existsSync(_envLocalPath)) {
27
+ for (const line of fs.readFileSync(_envLocalPath, 'utf-8').split('\n')) {
28
+ const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.+)$/);
29
+ if (m && !process.env[m[1]]) process.env[m[1]] = m[2].trim();
30
+ }
31
+ }
32
+ } catch {}
33
+
34
+ // terminal-server is loaded lazily (after SPACES_TIER is set in process.env)
35
+
36
+ // ─── Memory monitoring (only when SPACES_DEBUG or cortex.debug) ──
37
+ let _lastHeapMB = 0;
38
+ function logMemory(label) {
39
+ if (!process.env.SPACES_DEBUG && !_spacesDebug) return;
40
+ const mem = process.memoryUsage();
41
+ const heapMB = Math.round(mem.heapUsed / 1048576);
42
+ const rssMB = Math.round(mem.rss / 1048576);
43
+ const extMB = Math.round((mem.external || 0) / 1048576);
44
+ const abMB = Math.round((mem.arrayBuffers || 0) / 1048576);
45
+ const delta = heapMB - _lastHeapMB;
46
+ if (label || Math.abs(delta) > 20) {
47
+ console.log(`[Memory] ${label || 'periodic'}: heap=${heapMB}MB rss=${rssMB}MB external=${extMB}MB arrayBuffers=${abMB}MB ${delta > 0 ? '+' : ''}${delta}MB`);
48
+ }
49
+ _lastHeapMB = heapMB;
50
+ }
51
+ let _spacesDebug = false;
52
+ try {
53
+ const cfgPath = path.join(os.homedir(), '.spaces', 'config.json');
54
+ if (fs.existsSync(cfgPath)) _spacesDebug = !!JSON.parse(fs.readFileSync(cfgPath, 'utf-8')).cortex?.debug;
55
+ } catch { /* ignore */ }
56
+ setInterval(() => logMemory(), 60000);
57
+
58
+ const SPACES_DIR = path.join(os.homedir(), '.spaces');
59
+ const CONFIG_PATH = path.join(SPACES_DIR, 'server.json');
60
+ const SESSION_SECRET_PATH = path.join(SPACES_DIR, 'session_secret');
61
+ let NEXT_INTERNAL_PORT = 3400;
62
+ const projectDir = path.join(__dirname, '..');
63
+ const MANAGED_PACKAGES = path.join(SPACES_DIR, 'packages');
64
+ const MANAGED_NODE_MODULES = path.join(MANAGED_PACKAGES, 'node_modules');
65
+
66
+ // ─── CLI arg parsing ──────────────────────────────────────
67
+ const args = process.argv.slice(2);
68
+ const cliFlags = {};
69
+ for (let i = 0; i < args.length; i++) {
70
+ if (args[i] === '--setup') { cliFlags.setup = true; }
71
+ else if (args[i] === '--port' && args[i + 1]) { cliFlags.port = parseInt(args[++i], 10); }
72
+ else if (args[i] === '--tier' && args[i + 1]) { cliFlags.tier = args[++i]; }
73
+ else if (args[i] === '--base-path' && args[i + 1]) { cliFlags.basePath = args[++i]; }
74
+ else if (args[i] === '--help' || args[i] === '-h') { cliFlags.help = true; }
75
+ }
76
+
77
+ if (cliFlags.help) {
78
+ console.log(`
79
+ Spaces - Agent Workspace Manager
80
+
81
+ Usage:
82
+ spaces Start the server (auto-detects tier)
83
+ spaces stop Stop running server
84
+ spaces install <teams|pro> Install a tier package
85
+ spaces uninstall [teams|pro] Uninstall packages (all if none specified)
86
+ spaces verify Verify installed packages
87
+ spaces upgrade [teams|pro] Upgrade installed packages
88
+ spaces --setup Interactive first-time setup wizard
89
+ spaces --port 3457 Override port
90
+ spaces --tier team Override tier (community|team|federation)
91
+ spaces --base-path /spaces Set base path for reverse proxy
92
+ spaces service install Install as OS service (systemd/launchd/Task Scheduler)
93
+ spaces service uninstall Remove OS service
94
+ spaces service start Start the service
95
+ spaces service stop Stop the service
96
+ spaces service status Show service status
97
+ spaces service logs Tail service logs
98
+ spaces reset-totp <user> Reset TOTP/2FA for a user
99
+ spaces --help Show this help
100
+ `);
101
+ process.exit(0);
102
+ }
103
+
104
+ // ─── Stop command ─────────────────────────────────────────
105
+ const subcommand = args[0];
106
+ if (subcommand === 'stop') {
107
+ stopServer();
108
+ process.exit(0);
109
+ }
110
+
111
+ // ─── Route install/verify/upgrade to spaces-install.js ────
112
+ if (subcommand === 'install' || subcommand === 'uninstall' || subcommand === 'verify' || subcommand === 'upgrade') {
113
+ // Re-exec with spaces-install.js, passing through all args
114
+ const installScript = path.join(__dirname, 'spaces-install.js');
115
+ const { status } = require('child_process').spawnSync(
116
+ process.execPath, [installScript, ...args],
117
+ { stdio: 'inherit', env: process.env }
118
+ );
119
+ process.exit(status || 0);
120
+ }
121
+
122
+ // ─── Route reset-totp to spaces-reset-totp.js ───────
123
+ if (subcommand === 'reset-totp') {
124
+ const resetScript = path.join(__dirname, 'spaces-reset-totp.js');
125
+ const { status } = require('child_process').spawnSync(
126
+ process.execPath, [resetScript, ...args.slice(1)],
127
+ { stdio: 'inherit', env: process.env }
128
+ );
129
+ process.exit(status || 0);
130
+ }
131
+
132
+ // ─── Route service commands to spaces-service.js ─────
133
+ if (subcommand === 'service') {
134
+ const serviceScript = path.join(__dirname, 'spaces-service.js');
135
+ const { status } = require('child_process').spawnSync(
136
+ process.execPath, [serviceScript, ...args.slice(1)],
137
+ { stdio: 'inherit', env: process.env }
138
+ );
139
+ process.exit(status || 0);
140
+ }
141
+
142
+ // ─── Setup wizard ─────────────────────────────────────────
143
+ if (cliFlags.setup) {
144
+ require('./spaces-setup');
145
+ // spaces-setup handles its own process.exit
146
+ } else if (subcommand && !subcommand.startsWith('-')) {
147
+ console.error(` Unknown command: ${subcommand}`);
148
+ console.error(` Run "spaces --help" for usage`);
149
+ process.exit(1);
150
+ } else {
151
+ startServer();
152
+ }
153
+
154
+ // ─── TLS certificate ────────────────────────────────────────
155
+ // Uses a real cert if configured in server.json (tlsCert, tlsKey, optional
156
+ // tlsCa for the full chain), otherwise generates a self-signed cert so
157
+ // mobile browsers that force HTTPS-first can still connect.
158
+ function ensureTlsCert() {
159
+ // Check for configured real cert in server.json
160
+ try {
161
+ const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
162
+ if (config.tlsCert && config.tlsKey) {
163
+ if (fs.existsSync(config.tlsCert) && fs.existsSync(config.tlsKey)) {
164
+ // Read cert + key, and optionally the CA bundle for full chain
165
+ const certPem = fs.readFileSync(config.tlsCert, 'utf-8').trim();
166
+ const caPem = (config.tlsCa && fs.existsSync(config.tlsCa))
167
+ ? fs.readFileSync(config.tlsCa, 'utf-8').trim()
168
+ : null;
169
+ const creds = {
170
+ cert: caPem ? certPem + '\n' + caPem : certPem,
171
+ key: fs.readFileSync(config.tlsKey, 'utf-8'),
172
+ };
173
+ console.log(' Using TLS certificate: ' + config.tlsCert);
174
+ return creds;
175
+ }
176
+ console.log(' Warning: tlsCert/tlsKey configured but files not found, falling back to self-signed');
177
+ }
178
+ } catch {}
179
+
180
+ // Fall back to self-signed
181
+ const certPath = path.join(SPACES_DIR, 'tls-cert.pem');
182
+ const keyPath = path.join(SPACES_DIR, 'tls-key.pem');
183
+
184
+ if (fs.existsSync(certPath) && fs.existsSync(keyPath)) {
185
+ try {
186
+ return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };
187
+ } catch {}
188
+ }
189
+
190
+ try {
191
+ fs.mkdirSync(SPACES_DIR, { recursive: true });
192
+ execFileSync('openssl', [
193
+ 'req', '-x509', '-newkey', 'rsa:2048',
194
+ '-keyout', keyPath, '-out', certPath,
195
+ '-sha256', '-days', '365', '-nodes',
196
+ '-subj', '/CN=spaces-local',
197
+ '-addext', 'subjectAltName=DNS:localhost,DNS:*.local,DNS:*.robindale.com,IP:127.0.0.1',
198
+ ], { stdio: 'pipe', timeout: 15000 });
199
+ console.log(' Generated self-signed TLS certificate');
200
+ return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };
201
+ } catch (e) {
202
+ console.log(` Warning: Could not generate TLS cert (${e.message})`);
203
+ console.log(' HTTPS will not be available. Install OpenSSL to enable it.');
204
+ return null;
205
+ }
206
+ }
207
+
208
+ function startServer() {
209
+ // ─── Load saved config ────────────────────────────────────
210
+ let savedConfig = {};
211
+ if (fs.existsSync(CONFIG_PATH)) {
212
+ try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
213
+ }
214
+
215
+ // ─── Resolve settings (CLI > env > config > defaults) ─────
216
+ const PORT = cliFlags.port
217
+ || parseInt(process.env.SPACES_PORT || '', 10)
218
+ || savedConfig.port
219
+ || 3457;
220
+
221
+ const basePath = cliFlags.basePath
222
+ || process.env.SPACES_BASE_PATH
223
+ || savedConfig.basePath
224
+ || '';
225
+
226
+ const allowedOrigins = process.env.SPACES_ALLOWED_ORIGINS
227
+ || savedConfig.allowedOrigins
228
+ || '';
229
+
230
+ // Use a unique internal port so multiple instances don't collide
231
+ NEXT_INTERNAL_PORT = PORT - 57; // 3457→3400, 3458→3401, etc.
232
+
233
+ // ─── Kill any existing server on this port ───────────────────
234
+ stopServer(PORT);
235
+
236
+ // ─── Resolve optional packages once ─────────────────────────
237
+ const proPath = resolveSpacesPro();
238
+ const teamsPath = resolveSpacesTeams();
239
+ const cortexPath = resolveSpacesCortex();
240
+
241
+ // Tier resolution: CLI > env > config > auto-detect
242
+ let tier = cliFlags.tier
243
+ || process.env.SPACES_TIER
244
+ || savedConfig.tier
245
+ || '';
246
+
247
+ // Auto-detect tier from package presence
248
+ if (!tier) {
249
+ if (proPath) tier = 'federation';
250
+ else if (teamsPath) tier = 'team';
251
+ else tier = 'community';
252
+ }
253
+
254
+ console.log('');
255
+ console.log(' Spaces - Agent Workspace Manager');
256
+ console.log(' =================================');
257
+ console.log('');
258
+ console.log(` Tier: ${tier}`);
259
+
260
+ // ─── Server tier prerequisites ────────────────────────────
261
+ const childEnv = { ...process.env };
262
+
263
+ if (tier !== 'community') {
264
+ // team/federation tiers require @spaces/teams (auth + collaboration)
265
+ if ((tier === 'team' || tier === 'federation') && !teamsPath) {
266
+ console.error(' Error: @spaces/teams is required for team/federation tiers.');
267
+ console.error(' Install it: spaces install teams');
268
+ process.exit(1);
269
+ }
270
+ // federation tier requires @spaces/pro (network)
271
+ if (tier === 'federation' && !proPath) {
272
+ console.error(' Error: @spaces/pro is required for the federation tier.');
273
+ console.error(' Install it: spaces install pro');
274
+ process.exit(1);
275
+ }
276
+
277
+ // Check for session secret
278
+ let sessionSecret = process.env.SPACES_SESSION_SECRET || '';
279
+ if (!sessionSecret && fs.existsSync(SESSION_SECRET_PATH)) {
280
+ sessionSecret = fs.readFileSync(SESSION_SECRET_PATH, 'utf-8').trim();
281
+ }
282
+
283
+ // Check for admin DB auto-setup if missing
284
+ const adminDbPath = path.join(SPACES_DIR, 'admin.db');
285
+ if (!fs.existsSync(adminDbPath) || !sessionSecret) {
286
+ const { autoSetup } = require('./lib/auto-setup');
287
+ const result = autoSetup({ SPACES_DIR, SESSION_SECRET_PATH, ADMIN_DB_PATH: adminDbPath, CONFIG_PATH, tier, port: PORT, basePath });
288
+ sessionSecret = result.sessionSecret;
289
+ }
290
+
291
+ childEnv.SPACES_SESSION_SECRET = sessionSecret;
292
+ process.env.SPACES_SESSION_SECRET = sessionSecret;
293
+ console.log(` Admin DB: ${adminDbPath}`);
294
+ }
295
+
296
+ // Set tier in both child env and own process env (terminal-server reads it)
297
+ childEnv.SPACES_TIER = tier;
298
+ process.env.SPACES_TIER = tier;
299
+ if (basePath) {
300
+ childEnv.SPACES_BASE_PATH = basePath;
301
+ console.log(` Base path: ${basePath}`);
302
+ }
303
+ if (allowedOrigins) {
304
+ childEnv.SPACES_ALLOWED_ORIGINS = allowedOrigins;
305
+ process.env.SPACES_ALLOWED_ORIGINS = allowedOrigins;
306
+ console.log(` Allowed origins: ${allowedOrigins}`);
307
+ }
308
+
309
+ // ─── Resolve NODE_PATH for @spaces/pro and @spaces/teams ──
310
+ // Update both childEnv (for the Next.js child process) and process.env
311
+ // (for terminal-server.js which runs in this same parent process).
312
+ // Include:
313
+ // - Managed packages node_modules (~/.spaces/packages/node_modules)
314
+ // - Each managed package's own node_modules (for its bundled deps)
315
+ // - The host app's own node_modules (fallback for peer deps)
316
+ const appNodeModules = path.join(projectDir, 'node_modules');
317
+ const nodePaths = [MANAGED_NODE_MODULES, appNodeModules];
318
+ // Add each resolved package's own node_modules so its bundled deps are found
319
+ for (const pkgPath of [proPath, teamsPath, cortexPath]) {
320
+ if (pkgPath) {
321
+ // pkgPath is the package root (symlink target or direct path)
322
+ const realPath = fs.realpathSync(pkgPath);
323
+ const pkgNodeModules = path.join(realPath, 'node_modules');
324
+ if (fs.existsSync(pkgNodeModules) && !nodePaths.includes(pkgNodeModules)) {
325
+ nodePaths.push(pkgNodeModules);
326
+ }
327
+ // Also add the parent scope for @spaces/* resolution
328
+ const parentModules = path.dirname(path.dirname(pkgPath));
329
+ if (!nodePaths.includes(parentModules)) {
330
+ nodePaths.push(parentModules);
331
+ }
332
+ }
333
+ }
334
+ for (const dir of nodePaths) {
335
+ for (const target of [childEnv, process.env]) {
336
+ const existing = target.NODE_PATH || '';
337
+ if (!existing.includes(dir)) {
338
+ target.NODE_PATH = existing
339
+ ? `${dir}${path.delimiter}${existing}`
340
+ : dir;
341
+ }
342
+ }
343
+ }
344
+ // Re-init module paths so require() in this process picks up the new NODE_PATH
345
+ require('module').Module._initPaths();
346
+
347
+ // Verify collaboration pipeline works end-to-end at startup
348
+ if (tier === 'team' || tier === 'federation') {
349
+ try {
350
+ const teams = require('@spaces/teams');
351
+ console.log(' Collaboration: @spaces/teams loaded OK');
352
+ // Smoke-test that peer deps resolve from this process
353
+ require('better-sqlite3');
354
+ } catch (e) {
355
+ console.error(` Warning: Collaboration may not work — ${e.message}`);
356
+ console.error(' Check that NODE_PATH includes the host app node_modules.');
357
+ }
358
+ }
359
+
360
+ // ─── Detect @spaces/cortex ──────────────────────────────────
361
+ if (cortexPath) {
362
+ childEnv.SPACES_HAS_CORTEX = '1';
363
+ process.env.SPACES_HAS_CORTEX = '1';
364
+ console.log(' Cortex: @spaces/cortex detected');
365
+ }
366
+
367
+ console.log('');
368
+
369
+ // ─── Background update check (non-blocking, repeats every 4h) ──
370
+ // Checks npm registry, GitHub releases, and addon git repos.
371
+ // Writes results to ~/.spaces/update-check.json for the UI banner.
372
+ const updateCheckPath = path.join(SPACES_DIR, 'update-check.json');
373
+ const checkForUpdates = async (logIfAvailable = true) => {
374
+ try {
375
+ const pkg = require(path.join(projectDir, 'package.json'));
376
+ const currentVersion = pkg.version;
377
+ const npmName = pkg.name || '@jlongo78/agent-spaces';
378
+ const githubRepo = 'jlongo78/spaces';
379
+
380
+ // Check npm registry
381
+ let npmLatest = null;
382
+ try {
383
+ const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(npmName)}/latest`, {
384
+ signal: AbortSignal.timeout(5000),
385
+ });
386
+ if (res.ok) {
387
+ const data = await res.json();
388
+ npmLatest = data.version;
389
+ }
390
+ } catch { /* */ }
391
+
392
+ // Check GitHub for latest release or tag (may be ahead of npm)
393
+ let githubLatest = null;
394
+ let githubPrerelease = false;
395
+ let githubUrl = null;
396
+ try {
397
+ // Check releases first (includes pre-releases)
398
+ const res = await fetch(`https://api.github.com/repos/${githubRepo}/releases?per_page=5`, {
399
+ signal: AbortSignal.timeout(5000),
400
+ headers: { 'Accept': 'application/vnd.github.v3+json', 'User-Agent': 'agent-spaces' },
401
+ });
402
+ if (res.ok) {
403
+ const releases = await res.json();
404
+ if (releases.length > 0) {
405
+ // Find latest stable and latest pre-release
406
+ const stable = releases.find(r => !r.prerelease && !r.draft);
407
+ const pre = releases.find(r => r.prerelease && !r.draft);
408
+ if (stable) {
409
+ githubLatest = stable.tag_name.replace(/^v/, '');
410
+ githubUrl = stable.html_url;
411
+ }
412
+ if (pre) {
413
+ const preVersion = pre.tag_name.replace(/^v/, '');
414
+ // If pre-release is newer than stable, surface it
415
+ if (!githubLatest || preVersion > githubLatest) {
416
+ githubLatest = preVersion;
417
+ githubPrerelease = true;
418
+ githubUrl = pre.html_url;
419
+ }
420
+ }
421
+ }
422
+ }
423
+ } catch { /* */ }
424
+
425
+ // Check addon git repos
426
+ const gitSafe = ['-c', 'safe.directory=*'];
427
+ const addonPaths = { teams: teamsPath, pro: proPath, cortex: cortexPath };
428
+ const addons = {};
429
+ for (const [key, addonDir] of Object.entries(addonPaths)) {
430
+ if (!addonDir || !fs.existsSync(path.join(addonDir, '.git'))) continue;
431
+ const realDir = fs.realpathSync(addonDir);
432
+ try {
433
+ execFileSync('git', [...gitSafe, 'fetch', '--quiet'], { cwd: realDir, stdio: 'ignore', timeout: 5000 });
434
+ const local = execFileSync('git', [...gitSafe, 'rev-parse', 'HEAD'], { cwd: realDir, encoding: 'utf-8' }).trim();
435
+ const remote = execFileSync('git', [...gitSafe, 'rev-parse', '@{u}'], { cwd: realDir, encoding: 'utf-8' }).trim();
436
+ let commitsBehind = 0;
437
+ if (local !== remote) {
438
+ try {
439
+ const count = execFileSync('git', [...gitSafe, 'rev-list', '--count', `HEAD..@{u}`], { cwd: realDir, encoding: 'utf-8' }).trim();
440
+ commitsBehind = parseInt(count, 10) || 0;
441
+ } catch { /* */ }
442
+ }
443
+ const behind = commitsBehind > 0;
444
+ addons[key] = { installed: true, behind, commitsBehind, localHead: local.slice(0, 7) };
445
+ if (behind && logIfAvailable) {
446
+ console.log(` Update available for @spaces/${key}: ${commitsBehind} commit(s) behind (run: spaces upgrade ${key})`);
447
+ }
448
+ } catch {
449
+ addons[key] = { installed: true, behind: false, commitsBehind: 0 };
450
+ }
451
+ }
452
+
453
+ const npmAvailable = npmLatest && npmLatest !== currentVersion && npmLatest > currentVersion;
454
+ const githubAvailable = githubLatest && githubLatest !== currentVersion && githubLatest > currentVersion;
455
+
456
+ const result = {
457
+ current: currentVersion,
458
+ npm: npmLatest ? { latest: npmLatest, available: !!npmAvailable } : null,
459
+ github: githubLatest ? { latest: githubLatest, prerelease: githubPrerelease, url: githubUrl, available: !!githubAvailable } : null,
460
+ // Backward compat: 'available' and 'latest' still work for the existing banner
461
+ latest: npmLatest || githubLatest || currentVersion,
462
+ available: !!(npmAvailable || githubAvailable),
463
+ addons,
464
+ checkedAt: Date.now(),
465
+ name: npmName,
466
+ };
467
+
468
+ fs.writeFileSync(updateCheckPath, JSON.stringify(result, null, 2));
469
+
470
+ if (npmAvailable && logIfAvailable) {
471
+ console.log(` Update available: ${currentVersion} ${npmLatest} (run: npm i -g ${npmName})`);
472
+ }
473
+ if (githubAvailable && (!npmAvailable || githubLatest > npmLatest) && logIfAvailable) {
474
+ console.log(` GitHub ${githubPrerelease ? 'pre-release' : 'release'}: ${githubLatest} (${githubUrl || `https://github.com/${githubRepo}/releases`})`);
475
+ }
476
+ } catch { /* network error — skip silently */ }
477
+ };
478
+ checkForUpdates(true);
479
+ setInterval(() => checkForUpdates(false), 4 * 3600_000);
480
+
481
+ // Check for ~/.claude/ directory
482
+ const claudeDir = path.join(os.homedir(), '.claude');
483
+ if (!fs.existsSync(claudeDir)) {
484
+ console.log(' Warning: ~/.claude/ not found. Have you used Claude Code yet?');
485
+ console.log('');
486
+ }
487
+
488
+ // ─── Detect build type ────────────────────────────────────
489
+ const standaloneServer = path.join(projectDir, '.next', 'standalone', 'server.js');
490
+ const fullBuildDir = path.join(projectDir, '.next', 'BUILD_ID');
491
+ const isStandalone = fs.existsSync(standaloneServer);
492
+ const isFullBuild = fs.existsSync(fullBuildDir);
493
+
494
+ if (!isStandalone && !isFullBuild) {
495
+ console.error(' Error: No build found.');
496
+ console.error(' Run "npm run build" first, or install via "npm install -g @jlongo78/agent-spaces".');
497
+ process.exit(1);
498
+ }
499
+
500
+ // ─── Spawn Next.js ────────────────────────────────────────
501
+ let next;
502
+ if (isStandalone) {
503
+ const parentNodeModules = path.join(projectDir, 'node_modules');
504
+ const existingNodePath = childEnv.NODE_PATH || '';
505
+ childEnv.NODE_PATH = existingNodePath
506
+ ? `${parentNodeModules}${path.delimiter}${existingNodePath}`
507
+ : parentNodeModules;
508
+
509
+ next = spawn(process.execPath, [standaloneServer], {
510
+ cwd: path.dirname(standaloneServer),
511
+ stdio: ['ignore', 'pipe', 'pipe'],
512
+ env: {
513
+ ...childEnv,
514
+ PORT: String(NEXT_INTERNAL_PORT),
515
+ HOSTNAME: '0.0.0.0',
516
+ NODE_ENV: 'production',
517
+ },
518
+ });
519
+ } else {
520
+ next = spawn('npx', ['next', 'start', '--port', String(NEXT_INTERNAL_PORT)], {
521
+ cwd: projectDir,
522
+ stdio: ['ignore', 'pipe', 'pipe'],
523
+ env: {
524
+ ...childEnv,
525
+ PORT: String(NEXT_INTERNAL_PORT),
526
+ HOSTNAME: '0.0.0.0',
527
+ NODE_ENV: 'production',
528
+ },
529
+ shell: true,
530
+ });
531
+ }
532
+
533
+ let nextReady = false;
534
+
535
+ next.stdout.on('data', (data) => {
536
+ const msg = data.toString();
537
+ process.stdout.write(msg);
538
+ if (!nextReady && (msg.includes('Ready') || msg.includes('started server') || msg.includes('Listening') || msg.includes('localhost'))) {
539
+ nextReady = true;
540
+ console.log(`\n Ready at http://localhost:${PORT}`);
541
+ if (tlsCreds) console.log(` Also at https://localhost:${PORT} (self-signed)`);
542
+ console.log('');
543
+
544
+ const url = `http://localhost:${PORT}`;
545
+ const isService = process.env.SPACES_SERVICE === '1';
546
+ if (!isService) {
547
+ try {
548
+ if (process.platform === 'win32') {
549
+ execFileSync('cmd', ['/c', 'start', url], { stdio: 'ignore' });
550
+ } else if (process.platform === 'darwin') {
551
+ execFileSync('open', [url], { stdio: 'ignore' });
552
+ } else {
553
+ execFileSync('xdg-open', [url], { stdio: 'ignore' });
554
+ }
555
+ } catch {
556
+ console.log(` Open ${url} in your browser`);
557
+ }
558
+ }
559
+ }
560
+ });
561
+
562
+ next.stderr.on('data', (data) => {
563
+ const msg = data.toString();
564
+ if (!msg.includes('Warning')) {
565
+ process.stderr.write(data);
566
+ }
567
+ });
568
+
569
+ next.on('exit', (code) => {
570
+ if (code !== 0 && code !== null) {
571
+ console.error(` [spaces] Next.js exited with code ${code}`);
572
+ }
573
+ cleanup();
574
+ });
575
+
576
+ // ─── Proxy request handler (shared by HTTP and HTTPS) ────
577
+ function proxyHandler(req, res) {
578
+ // WebSocket paths are handled by the 'upgrade' event, but a plain
579
+ // HTTP request to /ws (e.g. health check) should not be proxied to
580
+ // Next.js which would 308-redirect it due to trailingSlash.
581
+ const urlPath = (req.url || '').split('?')[0];
582
+ if (urlPath === '/ws' || urlPath.endsWith('/ws') || urlPath.endsWith('/ws/')) {
583
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
584
+ res.end('WebSocket endpoint');
585
+ return;
586
+ }
587
+
588
+ const proxyReq = http.request(
589
+ {
590
+ hostname: '127.0.0.1',
591
+ port: NEXT_INTERNAL_PORT,
592
+ path: req.url,
593
+ method: req.method,
594
+ headers: req.headers,
595
+ },
596
+ (proxyRes) => {
597
+ // Log cortex context API calls
598
+ if (urlPath.startsWith('/api/cortex/context')) {
599
+ const chunks = [];
600
+ proxyRes.on('data', (chunk) => chunks.push(chunk));
601
+ proxyRes.on('end', () => {
602
+ const body = Buffer.concat(chunks);
603
+ try {
604
+ const d = JSON.parse(body.toString());
605
+ const q = decodeURIComponent((req.url.match(/q=([^&]+)/) || [])[1] || '?').slice(0, 60);
606
+ const hits = d.results?.length || 0;
607
+ console.log(`[Cortex Context] q="${q}" → ${hits} results (${d.timing?.totalMs || '?'}ms)`);
608
+ } catch {}
609
+ res.writeHead(proxyRes.statusCode, proxyRes.headers);
610
+ res.end(body);
611
+ });
612
+ } else {
613
+ res.writeHead(proxyRes.statusCode, proxyRes.headers);
614
+ proxyRes.pipe(res);
615
+ }
616
+ }
617
+ );
618
+ proxyReq.on('error', () => {
619
+ if (!res.headersSent) {
620
+ res.writeHead(502);
621
+ res.end('Server not ready yet. Refresh in a moment.');
622
+ }
623
+ });
624
+ req.pipe(proxyReq);
625
+ }
626
+
627
+ // ─── HTTP + HTTPS on a single port ─────────────────────────
628
+ // Peek at the first byte of each connection: 0x16 = TLS ClientHello,
629
+ // anything else = plain HTTP. This lets mobile browsers that force
630
+ // HTTPS-first connect to the same port without a separate listener.
631
+ const httpServer = http.createServer(proxyHandler);
632
+ const tlsCreds = ensureTlsCert();
633
+ const httpsServer = tlsCreds ? https.createServer(tlsCreds, proxyHandler) : null;
634
+
635
+ const { createTerminalServer } = require('./terminal-server');
636
+ createTerminalServer(httpServer);
637
+ if (httpsServer) createTerminalServer(httpsServer);
638
+
639
+ // Wire up 'address()' on the inner servers so terminal-server can
640
+ // discover the port, then emit 'listening' so its event handler fires.
641
+ const patchAddress = (srv) => { srv.address = () => ({ port: PORT }); };
642
+ patchAddress(httpServer);
643
+ if (httpsServer) patchAddress(httpsServer);
644
+
645
+ const dualServer = net.createServer((socket) => {
646
+ // If client connects but sends nothing for 5s, destroy.
647
+ // Once routed, clear the timeout so long-lived connections (WebSocket) aren't killed.
648
+ socket.setTimeout(5000, () => socket.destroy());
649
+ socket.once('data', (buf) => {
650
+ socket.setTimeout(0);
651
+ socket.pause();
652
+ const target = (buf[0] === 0x16 && httpsServer) ? httpsServer : httpServer;
653
+ target.emit('connection', socket);
654
+ socket.unshift(buf);
655
+ socket.resume();
656
+ });
657
+ });
658
+
659
+ dualServer.listen(PORT, () => {
660
+ // Now that the port is bound, tell the inner servers they're "listening"
661
+ // so terminal-server's mDNS and message watcher start up.
662
+ httpServer.emit('listening');
663
+ if (httpsServer) httpsServer.emit('listening');
664
+
665
+ if (httpsServer) {
666
+ console.log(` Starting server on port ${PORT} (HTTP + HTTPS)`);
667
+ } else {
668
+ console.log(` Starting server on http://localhost:${PORT}`);
669
+ }
670
+ console.log('');
671
+ });
672
+
673
+ function cleanup() {
674
+ next.kill();
675
+ dualServer.close();
676
+ process.exit(0);
677
+ }
678
+
679
+ process.on('SIGINT', cleanup);
680
+ process.on('SIGTERM', cleanup);
681
+ }
682
+
683
+ // ─── Stop running server ─────────────────────────────────────
684
+ function findPidsOnPort(port) {
685
+ const pids = new Set();
686
+ if (process.platform === 'win32') {
687
+ try {
688
+ const output = execFileSync('netstat', ['-ano'], { encoding: 'utf-8' });
689
+ for (const line of output.split(String.fromCharCode(10))) {
690
+ if (line.includes(':' + port + ' ') && line.includes('LISTENING')) {
691
+ const parts = line.trim().split(/\s+/);
692
+ const pid = parseInt(parts[parts.length - 1], 10);
693
+ if (pid > 0) pids.add(pid);
694
+ }
695
+ }
696
+ } catch {}
697
+ } else {
698
+ try {
699
+ const output = execFileSync('lsof', ['-ti', `tcp:${port}`], { encoding: 'utf-8' }).trim();
700
+ for (const p of output.split('\n')) { if (p.trim()) pids.add(parseInt(p.trim(), 10)); }
701
+ } catch {}
702
+ try {
703
+ const output = execFileSync('fuser', [`${port}/tcp`], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
704
+ for (const p of output.split(/\s+/)) { if (p.trim()) pids.add(parseInt(p.trim(), 10)); }
705
+ } catch {}
706
+ }
707
+ return [...pids].filter(p => !isNaN(p) && p > 0);
708
+ }
709
+
710
+ function stopServer(overridePort) {
711
+ let savedConfig = {};
712
+ if (fs.existsSync(CONFIG_PATH)) {
713
+ try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
714
+ }
715
+ const port = overridePort || parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
716
+ const ports = [port, NEXT_INTERNAL_PORT];
717
+ let killed = 0;
718
+
719
+ for (const p of ports) {
720
+ for (const pid of findPidsOnPort(p)) {
721
+ try {
722
+ process.kill(pid, 'SIGTERM');
723
+ killed++;
724
+ } catch {}
725
+ }
726
+ }
727
+
728
+ if (killed > 0) {
729
+ console.log(` Stopped ${killed} process(es) on port ${port}`);
730
+ // Wait for ports to be released, escalate to SIGKILL if needed
731
+ const deadline = Date.now() + 2000;
732
+ let escalated = false;
733
+ while (Date.now() < deadline) {
734
+ const remaining = ports.flatMap(p => findPidsOnPort(p));
735
+ if (remaining.length === 0) break;
736
+ if (!escalated && Date.now() > deadline - 1000) {
737
+ for (const pid of remaining) {
738
+ try { process.kill(pid, 'SIGKILL'); } catch {}
739
+ }
740
+ escalated = true;
741
+ }
742
+ if (process.platform === 'win32') { require('child_process').spawnSync('powershell', ['-Command', 'Start-Sleep -Milliseconds 200']); } else { require('child_process').spawnSync('sleep', ['0.2']); }
743
+ }
744
+ } else {
745
+ console.log(` No running server found on port ${port}`);
746
+ }
747
+ }
748
+
749
+ // ─── @spaces/pro resolution ──────────────────────────────────
750
+ function resolveSpacesPro() {
751
+ // 1. Managed install (~/.spaces/packages/)
752
+ const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'pro');
753
+ if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
754
+
755
+ // 2. Local node_modules (npm link / optionalDep)
756
+ try {
757
+ return require.resolve('@spaces/pro');
758
+ } catch {}
759
+
760
+ // 3. Global npm prefix (legacy)
761
+ try {
762
+ const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
763
+ const globalProPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'pro');
764
+ if (fs.existsSync(globalProPath)) return globalProPath;
765
+ const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'pro');
766
+ if (fs.existsSync(altPath)) return altPath;
767
+ } catch {}
768
+
769
+ return null;
770
+ }
771
+
772
+ // ─── @spaces/teams resolution ────────────────────────────────
773
+ function resolveSpacesTeams() {
774
+ // 1. Managed install (~/.spaces/packages/)
775
+ const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'teams');
776
+ if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
777
+
778
+ // 2. Local node_modules (npm link / optionalDep)
779
+ try {
780
+ return require.resolve('@spaces/teams');
781
+ } catch {}
782
+
783
+ // 3. Global npm prefix (legacy)
784
+ try {
785
+ const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
786
+ const globalTeamsPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'teams');
787
+ if (fs.existsSync(globalTeamsPath)) return globalTeamsPath;
788
+ const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'teams');
789
+ if (fs.existsSync(altPath)) return altPath;
790
+ } catch {}
791
+
792
+ return null;
793
+ }
794
+
795
+ // ─── @spaces/cortex resolution ───────────────────────────────
796
+ function resolveSpacesCortex() {
797
+ const managed = path.join(MANAGED_NODE_MODULES, '@spaces', 'cortex');
798
+ if (fs.existsSync(path.join(managed, 'dist', 'index.js'))) return managed;
799
+ try { return require.resolve('@spaces/cortex'); } catch {}
800
+ try {
801
+ const globalPrefix = execFileSync('npm', ['prefix', '-g'], { encoding: 'utf-8' }).trim();
802
+ const globalPath = path.join(globalPrefix, 'lib', 'node_modules', '@spaces', 'cortex');
803
+ if (fs.existsSync(globalPath)) return globalPath;
804
+ const altPath = path.join(globalPrefix, 'node_modules', '@spaces', 'cortex');
805
+ if (fs.existsSync(altPath)) return altPath;
806
+ } catch {}
807
+ return null;
808
+ }