@jlongo78/agent-spaces 0.7.5 → 0.7.6

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 (630) hide show
  1. package/.next/standalone/.claude/settings.local.json +55 -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 +2 -1
  5. package/.next/standalone/.next/build-manifest.json +5 -5
  6. package/.next/standalone/.next/prerender-manifest.json +27 -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/build-manifest.json +3 -3
  10. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/admin/users/page/build-manifest.json +3 -3
  12. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/analytics/page/build-manifest.json +3 -3
  14. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/cortex/page/build-manifest.json +3 -3
  16. package/.next/standalone/.next/server/app/(desktop)/cortex/page/react-loadable-manifest.json +3 -3
  17. package/.next/standalone/.next/server/app/(desktop)/cortex/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/network/page/build-manifest.json +3 -3
  20. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/page/build-manifest.json +3 -3
  22. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(desktop)/projects/page/build-manifest.json +3 -3
  24. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page/build-manifest.json +3 -3
  26. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(desktop)/sessions/page/build-manifest.json +3 -3
  28. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(desktop)/settings/page/build-manifest.json +3 -3
  30. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(desktop)/terminal/page/build-manifest.json +3 -3
  32. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page/build-manifest.json +3 -3
  35. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page/build-manifest.json +3 -3
  38. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(desktop)/workspaces/page/build-manifest.json +3 -3
  41. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +3 -3
  43. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  44. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  45. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  50. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +3 -3
  51. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  53. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  54. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  55. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  57. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  58. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  61. package/.next/standalone/.next/server/app/admin/analytics.rsc +7 -6
  62. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +2 -2
  63. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +7 -6
  67. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  70. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  71. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  72. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  73. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  74. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  75. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  77. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  78. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  79. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  80. package/.next/standalone/.next/server/app/analytics.html +1 -1
  81. package/.next/standalone/.next/server/app/analytics.rsc +3 -3
  82. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +2 -2
  83. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  84. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  85. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +3 -3
  86. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  87. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  88. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  89. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +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.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  113. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  139. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  143. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  145. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  147. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  149. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  151. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/cortex.html +1 -1
  155. package/.next/standalone/.next/server/app/cortex.rsc +3 -3
  156. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
  157. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  159. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +3 -3
  160. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  161. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  162. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  163. package/.next/standalone/.next/server/app/login/page/build-manifest.json +3 -3
  164. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/login.html +1 -1
  166. package/.next/standalone/.next/server/app/login.rsc +2 -2
  167. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  168. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  169. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  170. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  171. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  172. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  173. package/.next/standalone/.next/server/app/m/page/build-manifest.json +3 -3
  174. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/m/projects/page/build-manifest.json +3 -3
  176. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  178. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  179. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  180. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  181. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  182. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  183. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  184. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  185. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  186. package/.next/standalone/.next/server/app/m/sessions/[id]/page/build-manifest.json +3 -3
  187. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/m/sessions/page/build-manifest.json +3 -3
  189. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  191. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  192. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  193. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  194. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  195. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  196. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  197. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  198. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  199. package/.next/standalone/.next/server/app/m/settings/page/build-manifest.json +3 -3
  200. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  202. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  203. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  204. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  205. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  206. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  207. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  208. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  209. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  210. package/.next/standalone/.next/server/app/m/terminal/page/build-manifest.json +3 -3
  211. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  213. package/.next/standalone/.next/server/app/m/terminal.rsc +2 -2
  214. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +2 -2
  215. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  216. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  217. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  218. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +1 -1
  219. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  220. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  221. package/.next/standalone/.next/server/app/m.html +1 -1
  222. package/.next/standalone/.next/server/app/m.rsc +2 -2
  223. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  225. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  226. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  227. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  228. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  229. package/.next/standalone/.next/server/app/network.html +1 -1
  230. package/.next/standalone/.next/server/app/network.rsc +2 -2
  231. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  232. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  233. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  234. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  235. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  236. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  237. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  238. package/.next/standalone/.next/server/app/projects.html +1 -1
  239. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  240. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  242. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  243. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  244. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  245. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  246. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  247. package/.next/standalone/.next/server/app/sessions.html +1 -1
  248. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  249. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  250. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  251. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  252. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  253. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  254. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  255. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  256. package/.next/standalone/.next/server/app/settings.html +1 -1
  257. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  258. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
  259. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  260. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  262. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  263. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  264. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  265. package/.next/standalone/.next/server/app/terminal.html +1 -1
  266. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  267. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  268. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  269. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  270. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  271. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  272. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  273. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  274. package/.next/standalone/.next/server/app/vr/page/app-paths-manifest.json +3 -0
  275. package/.next/standalone/.next/server/app/vr/page/build-manifest.json +18 -0
  276. package/.next/standalone/.next/server/app/vr/page/next-font-manifest.json +11 -0
  277. package/.next/standalone/.next/server/app/vr/page/react-loadable-manifest.json +11 -0
  278. package/.next/standalone/.next/server/app/vr/page/server-reference-manifest.json +4 -0
  279. package/.next/standalone/.next/server/app/vr/page.js +17 -0
  280. package/.next/standalone/.next/server/app/vr/page.js.map +5 -0
  281. package/.next/standalone/.next/server/app/vr/page.js.nft.json +1 -0
  282. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +2 -0
  283. package/.next/standalone/.next/server/app/vr.html +1 -0
  284. package/.next/standalone/.next/server/app/vr.meta +15 -0
  285. package/.next/standalone/.next/server/app/vr.rsc +21 -0
  286. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +21 -0
  287. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +6 -0
  288. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +6 -0
  289. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +4 -0
  290. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +9 -0
  291. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +4 -0
  292. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  293. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  294. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  296. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  297. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  298. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  299. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  300. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  301. package/.next/standalone/.next/server/app-paths-manifest.json +2 -1
  302. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0041efe4._.js +2 -2
  303. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00bf0ace._.js +2 -2
  304. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08a68343._.js +1 -1
  305. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0add852f._.js +1 -1
  306. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c113ed0._.js +1 -1
  307. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e1a27e0._.js +1 -1
  308. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e71d908._.js +3 -3
  309. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e9142f3._.js +2 -2
  310. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10e47926._.js +2 -2
  311. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1194f2c1._.js +1 -1
  312. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1665dc78._.js +2 -2
  313. package/.next/standalone/.next/server/chunks/[root-of-the-server]__175cbabf._.js +2 -2
  314. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19c2d094._.js +1 -1
  315. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1adae357._.js +2 -2
  316. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d359752._.js +2 -2
  317. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e8fabeb._.js +3 -3
  318. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f8deca0._.js +8 -8
  319. package/.next/standalone/.next/server/chunks/[root-of-the-server]__253fdda1._.js +2 -2
  320. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28e6434f._.js +2 -2
  321. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a386564._.js +3 -3
  322. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2acbd703._.js +1 -1
  323. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2acefabb._.js +1 -1
  324. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2c20fb38._.js +2 -2
  325. package/.next/standalone/.next/server/chunks/[root-of-the-server]__309132cd._.js +1 -1
  326. package/.next/standalone/.next/server/chunks/[root-of-the-server]__33fec964._.js +3 -3
  327. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3786d8ae._.js +2 -2
  328. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3ae92407._.js +2 -2
  329. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3beda9fe._.js +2 -2
  330. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3e3f25a1._.js +1 -1
  331. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4619e9bd._.js +1 -1
  332. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4a051043._.js +2 -2
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__50208a5f._.js +1 -1
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__508002e4._.js +2 -2
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5086c373._.js +2 -2
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5913e097._.js +2 -2
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5b5f68d2._.js +2 -2
  338. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c1f2459._.js +2 -2
  339. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ec8c977._.js +2 -2
  340. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5f8c694a._.js +1 -1
  341. package/.next/standalone/.next/server/chunks/[root-of-the-server]__63cebc6c._.js +2 -2
  342. package/.next/standalone/.next/server/chunks/[root-of-the-server]__64d30d4d._.js +2 -2
  343. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c54fc2e._.js +2 -2
  344. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6dc1fb7e._.js +2 -2
  345. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e568102._.js +2 -2
  346. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6faa04c0._.js +2 -2
  347. package/.next/standalone/.next/server/chunks/[root-of-the-server]__727d05f1._.js +1 -1
  348. package/.next/standalone/.next/server/chunks/[root-of-the-server]__74a34dc3._.js +2 -2
  349. package/.next/standalone/.next/server/chunks/[root-of-the-server]__75d12b32._.js +1 -1
  350. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e7250a4._.js +2 -2
  351. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8309e0a4._.js +2 -2
  352. package/.next/standalone/.next/server/chunks/[root-of-the-server]__86cc0e2b._.js +6 -6
  353. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8915603e._.js +1 -1
  354. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89c2565a._.js +2 -2
  355. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d178ad9._.js +2 -2
  356. package/.next/standalone/.next/server/chunks/[root-of-the-server]__93ee06f3._.js +3 -3
  357. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e4c154a._.js +2 -2
  358. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a1fbc199._.js +1 -1
  359. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d2e1d3._.js +2 -2
  360. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ae53d343._.js +2 -2
  361. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b3a04cef._.js +2 -2
  362. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b4270b77._.js +1 -1
  363. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b6b6ce60._.js +1 -1
  364. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b9545dd9._.js +1 -1
  365. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c200e21a._.js +1 -1
  366. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c3c74ca4._.js +1 -1
  367. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c88b63f7._.js +2 -2
  368. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cba5f007._.js +1 -1
  369. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cbf4ceb0._.js +2 -2
  370. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cefdba2f._.js +2 -2
  371. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf9e82bb._.js +2 -2
  372. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d15515e3._.js +1 -1
  373. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d2897392._.js +2 -2
  374. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d3b2d856._.js +2 -2
  375. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d73273ca._.js +2 -2
  376. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8417eb6._.js +2 -2
  377. package/.next/standalone/.next/server/chunks/[root-of-the-server]__db4726bc._.js +1 -1
  378. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dc2a55de._.js +2 -2
  379. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dc6e2e5f._.js +1 -1
  380. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e0d4690b._.js +3 -3
  381. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3ecfd17._.js +3 -3
  382. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e678dd53._.js +1 -1
  383. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e9223f55._.js +2 -2
  384. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ea630076._.js +3 -3
  385. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb8acb65._.js +1 -1
  386. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f26ca49d._.js +1 -1
  387. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f33e1101._.js +2 -2
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f3a4c668._.js +1 -1
  389. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f515f865._.js +2 -2
  390. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fceb5d60._.js +2 -2
  391. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fed41403._.js +2 -2
  392. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff2e98c2._.js +2 -2
  393. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_339169c8.js +1 -1
  394. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_97dac613.js +1 -1
  395. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0d8d81ca._.js +1 -1
  396. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1425c64f._.js +1 -1
  397. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d2ce8f1._.js +1 -1
  398. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__31137509._.js +1 -1
  399. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3633a587._.js +1 -1
  400. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3c79441b._.js +1 -1
  401. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4ca0f26b._.js +1 -1
  402. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__5b90d3ad._.js +3 -0
  403. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__62a0b363._.js +1 -1
  404. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  405. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__68205a46._.js +1 -1
  406. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__69fd2efa._.js +1 -1
  407. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__85dcf0f7._.js +1 -1
  408. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__8c53a5da._.js +1 -1
  409. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__aecb1873._.js +1 -1
  410. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b02cd143._.js +1 -1
  411. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b9bcde11._.js +3 -0
  412. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__cac90169._.js +1 -1
  413. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__d25de2f0._.js +1 -1
  414. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e2f86be8._.js +1 -1
  415. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ee626b5b._.js +1 -1
  416. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f39a9e98._.js +1 -1
  417. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f3c566cd._.js +1 -1
  418. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f76aa221._.js +1 -1
  419. package/.next/standalone/.next/server/chunks/ssr/_149d7fd4._.js +1 -1
  420. package/.next/standalone/.next/server/chunks/ssr/_2e0dd6a7._.js +1 -1
  421. package/.next/standalone/.next/server/chunks/ssr/_3cd2355c._.js +1 -1
  422. package/.next/standalone/.next/server/chunks/ssr/_3d206597._.js +4 -0
  423. package/.next/standalone/.next/server/chunks/ssr/_47cc9af0._.js +1 -1
  424. package/.next/standalone/.next/server/chunks/ssr/_5cf334fd._.js +3 -0
  425. package/.next/standalone/.next/server/chunks/ssr/_7082788b._.js +1 -1
  426. package/.next/standalone/.next/server/chunks/ssr/_7154d8ae._.js +1 -1
  427. package/.next/standalone/.next/server/chunks/ssr/_75bb1b9a._.js +1 -1
  428. package/.next/standalone/.next/server/chunks/ssr/{_aeeff784._.js → _81abf587._.js} +2 -2
  429. package/.next/standalone/.next/server/chunks/ssr/_8acf81e2._.js +1 -1
  430. package/.next/standalone/.next/server/chunks/ssr/_8c36feb8._.js +1 -1
  431. package/.next/standalone/.next/server/chunks/ssr/_91e9bb86._.js +1 -1
  432. package/.next/standalone/.next/server/chunks/ssr/_ac4c1838._.js +1 -1
  433. package/.next/standalone/.next/server/chunks/ssr/_ad8515fc._.js +1 -1
  434. package/.next/standalone/.next/server/chunks/ssr/_b1f49e81._.js +1 -1
  435. package/.next/standalone/.next/server/chunks/ssr/_c0fe7614._.js +1 -1
  436. package/.next/standalone/.next/server/chunks/ssr/_d4825f5a._.js +1 -1
  437. package/.next/standalone/.next/server/chunks/ssr/_da10a9f4._.js +1 -1
  438. package/.next/standalone/.next/server/chunks/ssr/_db0abd0a._.js +3 -0
  439. package/.next/standalone/.next/server/chunks/ssr/_dee5d4a1._.js +1 -1
  440. package/.next/standalone/.next/server/chunks/ssr/_ef482c0c._.js +1 -1
  441. package/.next/standalone/.next/server/chunks/ssr/_efe43d2f._.js +1 -1
  442. package/.next/standalone/.next/server/chunks/ssr/_f4a4e116._.js +1 -1
  443. package/.next/standalone/.next/server/chunks/ssr/_f4d525d2._.js +1 -1
  444. package/.next/standalone/.next/server/chunks/ssr/_f4e57187._.js +3 -0
  445. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_vr_page_actions_3fb70d92.js +3 -0
  446. package/.next/standalone/.next/server/chunks/ssr/node_modules_32f9d62f._.js +1 -1
  447. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02f39477.js +1 -1
  448. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_eedfc1fd._.js +1 -1
  449. package/.next/standalone/.next/server/chunks/ssr/src_40fa36ce._.js +7 -0
  450. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +3 -0
  451. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__32a0045c._.js +1 -1
  452. package/.next/standalone/.next/server/edge/chunks/_d73df637._.js +1 -1
  453. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  454. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  455. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  456. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  457. package/.next/standalone/.next/server/pages/404.html +1 -1
  458. package/.next/standalone/.next/server/pages/500.html +2 -2
  459. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  460. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  461. package/.next/standalone/.next/static/chunks/045c83caa4d15373.js +1 -0
  462. package/.next/standalone/.next/static/chunks/07ea09e6024a523b.js +1 -0
  463. package/.next/standalone/.next/static/chunks/232d8aae4fefab70.js +1 -0
  464. package/.next/standalone/.next/static/chunks/2ad22562bb37ecad.js +1011 -0
  465. package/.next/standalone/.next/static/chunks/396eac60f496f178.js +1 -0
  466. package/.next/standalone/.next/static/chunks/{a4e5c700421eaa46.js → 412140a02893327a.js} +1 -1
  467. package/.next/standalone/.next/static/chunks/481cc11ae80b08b1.js +1 -0
  468. package/.next/standalone/.next/static/chunks/5325351ef49cb65f.js +1 -0
  469. package/.next/standalone/.next/static/chunks/559735e598ca3cbb.js +1 -0
  470. package/.next/standalone/.next/static/chunks/59c63d5af5cf3daf.js +1 -0
  471. package/.next/standalone/.next/static/chunks/5d5d7b0095dd52ae.js +1 -0
  472. package/.next/standalone/.next/static/chunks/6ae575967d091df4.js +1 -0
  473. package/.next/standalone/.next/static/chunks/7a7c0d9d875332a3.js +1 -0
  474. package/.next/standalone/.next/static/chunks/7f8455bb855a6c84.js +1 -0
  475. package/.next/standalone/.next/static/chunks/898f380eba90427a.js +1 -0
  476. package/.next/standalone/.next/static/chunks/95339e55722bb4ca.js +5 -0
  477. package/.next/standalone/.next/static/chunks/9cd594813c539df9.js +1 -0
  478. package/.next/standalone/.next/static/chunks/ad1423eed05d129b.js +1 -0
  479. package/.next/standalone/.next/static/chunks/ae7b146884c67d2a.js +1 -0
  480. package/.next/standalone/.next/static/chunks/b84072d72aa86417.js +1 -0
  481. package/.next/standalone/.next/static/chunks/c1a95aebf6725f64.css +3 -0
  482. package/.next/standalone/.next/static/chunks/c515eb77d9410aa0.js +5 -0
  483. package/.next/standalone/.next/static/chunks/{9899cf4c2bdbe61d.js → d9ae203a7f123546.js} +2 -2
  484. package/.next/standalone/.next/static/chunks/e23f20b51a75a5bb.js +757 -0
  485. package/.next/standalone/.next/static/chunks/fdc09bd135846960.js +1 -0
  486. package/.next/standalone/.next/static/chunks/ff0196911449e745.js +1 -0
  487. package/.next/standalone/.next/static/chunks/{turbopack-4c21186b79fb4c10.js → turbopack-e1a0994ed4af988c.js} +1 -1
  488. package/.next/standalone/.spaces/cortex-context.md +70 -0
  489. package/.next/standalone/bin/cortex-hook.sh +62 -62
  490. package/.next/standalone/bin/cortex-mcp.js +60 -60
  491. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
  492. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
  493. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
  494. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
  495. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
  496. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
  497. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
  498. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
  499. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
  500. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
  501. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
  502. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
  503. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
  504. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
  505. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
  506. package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
  507. package/.next/standalone/node_modules/@img/{sharp-linux-x64 → sharp-win32-x64}/package.json +39 -46
  508. package/.next/standalone/package.json +103 -102
  509. package/.next/standalone/server.js +1 -1
  510. package/.next/standalone/src/app/(desktop)/cortex/page.tsx +78 -78
  511. package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
  512. package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
  513. package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
  514. package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
  515. package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
  516. package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
  517. package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
  518. package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
  519. package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
  520. package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
  521. package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
  522. package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
  523. package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
  524. package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
  525. package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
  526. package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
  527. package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
  528. package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +29 -29
  529. package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
  530. package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
  531. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +93 -93
  532. package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
  533. package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
  534. package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
  535. package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
  536. package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
  537. package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
  538. package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +6 -6
  539. package/.next/standalone/src/app/api/cortex/search/route.ts +43 -43
  540. package/.next/standalone/src/app/api/cortex/settings/route.ts +33 -33
  541. package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
  542. package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
  543. package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
  544. package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
  545. package/.next/standalone/src/components/cortex/constants.ts +29 -29
  546. package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
  547. package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
  548. package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
  549. package/.next/standalone/src/components/cortex/cortex-settings.tsx +221 -221
  550. package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
  551. package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
  552. package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
  553. package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
  554. package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
  555. package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
  556. package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
  557. package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
  558. package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
  559. package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
  560. package/.next/standalone/src/lib/cortex/config.ts +40 -40
  561. package/.next/standalone/src/lib/cortex/debug.ts +10 -10
  562. package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
  563. package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
  564. package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
  565. package/.next/standalone/src/lib/cortex/index.ts +56 -56
  566. package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
  567. package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
  568. package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
  569. package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
  570. package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
  571. package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
  572. package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
  573. package/.next/standalone/src/lib/cortex/mcp/server.ts +8 -8
  574. package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
  575. package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
  576. package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
  577. package/.next/standalone/src/lib/cortex/types.ts +39 -39
  578. package/.next/standalone/tsconfig.json +34 -34
  579. package/LICENSE +661 -661
  580. package/README.md +131 -131
  581. package/bin/cortex-hook.sh +62 -62
  582. package/bin/cortex-mcp.js +60 -60
  583. package/bin/fix-standalone-externals.js +79 -79
  584. package/bin/lib/auto-setup.js +110 -110
  585. package/bin/mdns-service.js +171 -171
  586. package/bin/postinstall.js +35 -35
  587. package/bin/setup-admin.js +195 -195
  588. package/bin/spaces-dev.js +208 -208
  589. package/bin/spaces-install.js +599 -599
  590. package/bin/spaces-reset-totp.js +50 -50
  591. package/bin/spaces-service.js +1020 -1020
  592. package/bin/spaces-setup.js +253 -253
  593. package/bin/spaces.js +776 -776
  594. package/bin/ssh-auth-keys.sh +68 -68
  595. package/bin/terminal-server.js +1683 -1649
  596. package/package.json +103 -102
  597. package/.next/standalone/.next/server/chunks/ssr/_078dd64d._.js +0 -3
  598. package/.next/standalone/.next/server/chunks/ssr/_701606d5._.js +0 -3
  599. package/.next/standalone/.next/server/chunks/ssr/_72b1de37._.js +0 -3
  600. package/.next/standalone/.next/server/chunks/ssr/_950142a4._.js +0 -3
  601. package/.next/standalone/.next/server/chunks/ssr/src_components_terminal_terminal-pane_tsx_803c5e2c._.js +0 -7
  602. package/.next/standalone/.next/static/chunks/18f168665aef1aab.js +0 -1
  603. package/.next/standalone/.next/static/chunks/25b7a243a404a1a7.js +0 -1
  604. package/.next/standalone/.next/static/chunks/4a50d2a3e9bc9b41.js +0 -1
  605. package/.next/standalone/.next/static/chunks/6c78a1dfa7ec2959.css +0 -3
  606. package/.next/standalone/.next/static/chunks/7e0091ab6c5ee8bd.js +0 -1
  607. package/.next/standalone/.next/static/chunks/869f562dc32e55f4.js +0 -1
  608. package/.next/standalone/.next/static/chunks/8b3f4572fec83caa.js +0 -5
  609. package/.next/standalone/.next/static/chunks/8d5419afc4b9116b.js +0 -1
  610. package/.next/standalone/.next/static/chunks/9b2c5451f0b67975.js +0 -1
  611. package/.next/standalone/.next/static/chunks/ac339e970df82fa5.js +0 -5
  612. package/.next/standalone/.next/static/chunks/e7772d64463868eb.js +0 -1
  613. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
  614. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  615. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
  616. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  617. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
  618. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
  619. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  620. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
  621. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  622. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
  623. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
  624. package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  625. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  626. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
  627. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → ncDe4k4gvD0788HAnq_3G}/_buildManifest.js +0 -0
  628. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → ncDe4k4gvD0788HAnq_3G}/_clientMiddlewareManifest.json +0 -0
  629. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → ncDe4k4gvD0788HAnq_3G}/_ssgManifest.js +0 -0
  630. /package/.next/standalone/node_modules/@img/{sharp-libvips-linux-x64 → sharp-win32-x64}/versions.json +0 -0
@@ -1,599 +1,599 @@
1
- #!/usr/bin/env node
2
-
3
- 'use strict';
4
-
5
- const { execFileSync } = require('child_process');
6
- const path = require('path');
7
- const os = require('os');
8
- const fs = require('fs');
9
-
10
- // Resolve the target user's home directory.
11
- // On Windows, if running from a separate admin account, find the user
12
- // who actually has Claude Code data (.claude/ directory).
13
- function resolveTargetHome() {
14
- const currentHome = os.homedir();
15
- if (process.platform !== 'win32') return currentHome;
16
- // Check if the current user has .claude — if so, they're the target
17
- if (fs.existsSync(path.join(currentHome, '.claude'))) return currentHome;
18
- // Scan for users with .claude
19
- const usersDir = path.dirname(currentHome);
20
- const skip = new Set(['Public', 'Default', 'Default User', 'All Users']);
21
- try {
22
- const claudeUsers = fs.readdirSync(usersDir)
23
- .filter(name => !skip.has(name) && !name.startsWith('.'))
24
- .filter(name => fs.existsSync(path.join(usersDir, name, '.claude')));
25
- if (claudeUsers.length === 1) return path.join(usersDir, claudeUsers[0]);
26
- } catch {}
27
- return currentHome;
28
- }
29
-
30
- const TARGET_HOME = resolveTargetHome();
31
- const SPACES_DIR = path.join(TARGET_HOME, '.spaces');
32
- const PACKAGES_DIR = path.join(SPACES_DIR, 'packages');
33
- const NODE_MODULES_DIR = path.join(PACKAGES_DIR, 'node_modules', '@spaces');
34
-
35
- // ─── Package definitions ─────────────────────────────────────
36
- const PACKAGES = {
37
- teams: {
38
- name: '@spaces/teams',
39
- dir: path.join(PACKAGES_DIR, 'teams'),
40
- repo: 'jlongo78/spaces-teams',
41
- private: false,
42
- verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
43
- verifyLabel: 'dist/index.js',
44
- },
45
- pro: {
46
- name: '@spaces/pro',
47
- dir: path.join(PACKAGES_DIR, 'pro'),
48
- repo: 'jlongo78/spaces-pro',
49
- private: true,
50
- verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
51
- verifyLabel: 'dist/index.js',
52
- },
53
- cortex: {
54
- name: '@spaces/cortex',
55
- dir: path.join(PACKAGES_DIR, 'cortex'),
56
- repo: 'jlongo78/spaces-cortex',
57
- private: true,
58
- verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
59
- verifyLabel: 'dist/index.js',
60
- },
61
- };
62
-
63
- // ─── Helpers ──────────────────────────────────────────────────
64
- function log(msg) { console.log(` ${msg}`); }
65
- function logOk(msg) { console.log(` ✓ ${msg}`); }
66
- function logErr(msg) { console.error(` ✗ ${msg}`); }
67
- function logWarn(msg) { console.log(` ! ${msg}`); }
68
-
69
- // On Windows, ensure Git is in PATH (admin accounts may not inherit user PATH)
70
- function ensureGitInPath() {
71
- if (process.platform !== 'win32') return;
72
- try {
73
- execFileSync('git', ['--version'], { stdio: 'pipe', shell: true });
74
- return; // git already available
75
- } catch {}
76
- // Try common Git install locations (system-wide and per-user)
77
- const candidates = [
78
- path.join(process.env.ProgramFiles || 'C:\\Program Files', 'Git', 'cmd'),
79
- path.join(process.env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)', 'Git', 'cmd'),
80
- // Per-user installs (check target user and all profiles)
81
- path.join(TARGET_HOME, 'AppData', 'Local', 'Programs', 'Git', 'cmd'),
82
- path.join(TARGET_HOME, 'AppData', 'Local', 'Programs', 'Git', 'mingw64', 'bin'),
83
- ];
84
- // Also check all user profiles in case Git is installed by a different user
85
- try {
86
- const usersDir = path.dirname(os.homedir());
87
- for (const name of fs.readdirSync(usersDir)) {
88
- candidates.push(path.join(usersDir, name, 'AppData', 'Local', 'Programs', 'Git', 'cmd'));
89
- candidates.push(path.join(usersDir, name, 'AppData', 'Local', 'Programs', 'Git', 'mingw64', 'bin'));
90
- }
91
- } catch {}
92
- for (const dir of candidates) {
93
- if (fs.existsSync(path.join(dir, 'git.exe'))) {
94
- process.env.PATH = process.env.PATH + ';' + dir;
95
- return;
96
- }
97
- }
98
- }
99
- ensureGitInPath();
100
-
101
- function run(cmd, args, opts = {}) {
102
- const isWin = process.platform === 'win32';
103
- const safeArgs = isWin
104
- ? args.map(a => (a.includes(' ') ? '"' + a + '"' : a))
105
- : args;
106
- return execFileSync(cmd, safeArgs, {
107
- encoding: 'utf-8',
108
- stdio: opts.quiet ? ['pipe', 'pipe', 'pipe'] : 'inherit',
109
- shell: isWin,
110
- ...opts,
111
- });
112
- }
113
-
114
- // Git args prefix: allow operating on repos owned by a different user
115
- // (e.g. admin account managing packages in the target user's home)
116
- const GIT_SAFE = ['-c', 'safe.directory=*'];
117
-
118
- /**
119
- * Clone a repo, trying SSH first then HTTPS (with optional PAT).
120
- */
121
- function gitClone(repo, dest, isPrivate) {
122
- const sshUrl = `git@github.com:${repo}.git`;
123
- const httpsUrl = `https://github.com/${repo}.git`;
124
-
125
- // Try SSH first
126
- try {
127
- log(`Cloning ${repo} (SSH)...`);
128
- run('git', [...GIT_SAFE, 'clone', '--depth', '1', sshUrl, dest]);
129
- return;
130
- } catch {
131
- // SSH failed, try HTTPS
132
- }
133
-
134
- // HTTPS — check for PAT if private
135
- if (isPrivate) {
136
- const pat = process.env.GH_PAT || process.env.GITHUB_TOKEN || '';
137
- if (pat) {
138
- log(`Cloning ${repo} (HTTPS + token)...`);
139
- const authedUrl = `https://${pat}@github.com/${repo}.git`;
140
- run('git', [...GIT_SAFE, 'clone', '--depth', '1', authedUrl, dest]);
141
- return;
142
- }
143
- }
144
-
145
- log(`Cloning ${repo} (HTTPS)...`);
146
- run('git', [...GIT_SAFE, 'clone', '--depth', '1', httpsUrl, dest]);
147
- }
148
-
149
- /**
150
- * Pull latest changes in a repo directory.
151
- * Stashes any local modifications first so pull doesn't fail.
152
- */
153
- function gitPull(dir) {
154
- log('Pulling latest...');
155
- // Stash local changes if any (e.g. hook-generated files)
156
- let stashed = false;
157
- try {
158
- const status = execFileSync('git', [...GIT_SAFE, 'status', '--porcelain'], { cwd: dir, encoding: 'utf-8' }).trim();
159
- if (status) {
160
- log('Stashing local changes...');
161
- run('git', [...GIT_SAFE, 'stash', '--include-untracked'], { cwd: dir });
162
- stashed = true;
163
- }
164
- } catch {}
165
- run('git', [...GIT_SAFE, 'pull', '--ff-only'], { cwd: dir });
166
- if (stashed) {
167
- try {
168
- run('git', [...GIT_SAFE, 'stash', 'pop'], { cwd: dir });
169
- log('Restored local changes.');
170
- } catch {
171
- log('Warning: Could not restore stashed changes. Run "git stash pop" manually in ' + dir);
172
- }
173
- }
174
- }
175
-
176
- /**
177
- * Create the symlink from node_modules/@spaces/<name> -> ../../<name>
178
- */
179
- function createSymlink(pkgKey) {
180
- const linkPath = path.join(NODE_MODULES_DIR, pkgKey);
181
- const targetPath = path.join('..', '..', pkgKey); // relative symlink
182
-
183
- fs.mkdirSync(NODE_MODULES_DIR, { recursive: true });
184
-
185
- // Remove existing link/dir
186
- try {
187
- const stat = fs.lstatSync(linkPath);
188
- if (stat.isSymbolicLink() || stat.isFile()) {
189
- fs.unlinkSync(linkPath);
190
- } else if (stat.isDirectory()) {
191
- fs.rmSync(linkPath, { recursive: true });
192
- }
193
- } catch {}
194
-
195
- fs.symlinkSync(targetPath, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
196
- logOk(`Symlink: @spaces/${pkgKey} -> packages/${pkgKey}`);
197
- }
198
-
199
- /**
200
- * Check if a native module loads correctly from a package directory.
201
- */
202
- function checkNativeModule(moduleName, searchDir) {
203
- try {
204
- const nodePath = path.join(searchDir, 'node_modules');
205
- // Use execFileSync directly (no shell) so quotes aren't mangled on Windows
206
- const result = execFileSync(process.execPath, [
207
- '-e',
208
- `try { require('${moduleName}'); console.log('ok'); } catch(e) { console.log(e.message); }`,
209
- ], {
210
- encoding: 'utf-8',
211
- stdio: ['pipe', 'pipe', 'pipe'],
212
- cwd: searchDir,
213
- env: { ...process.env, NODE_PATH: nodePath },
214
- });
215
- return result.trim() === 'ok';
216
- } catch {
217
- return false;
218
- }
219
- }
220
-
221
- // ─── Install command ──────────────────────────────────────────
222
- function installPackage(pkgKey) {
223
- const pkg = PACKAGES[pkgKey];
224
- if (!pkg) {
225
- logErr(`Unknown package: ${pkgKey}`);
226
- log(`Available: ${Object.keys(PACKAGES).join(', ')}`);
227
- process.exit(1);
228
- }
229
-
230
- console.log(`\n Installing ${pkg.name}...\n`);
231
-
232
- // Pro requires teams as a prerequisite
233
- if (pkgKey === "pro") {
234
- const teamsDir = PACKAGES.teams.dir;
235
- if (!fs.existsSync(path.join(teamsDir, "dist", "index.js"))) {
236
- log("@spaces/pro requires @spaces/teams -- installing teams first...");
237
- console.log("");
238
- installPackage("teams");
239
- console.log("");
240
- }
241
- }
242
-
243
- // 1. Clone or pull
244
- if (fs.existsSync(path.join(pkg.dir, '.git'))) {
245
- gitPull(pkg.dir);
246
- } else {
247
- fs.mkdirSync(PACKAGES_DIR, { recursive: true });
248
- gitClone(pkg.repo, pkg.dir, pkg.private);
249
- }
250
-
251
- // 2. Install dependencies
252
- // Both teams and pro need TypeScript build
253
- log('Installing dependencies...');
254
- run('npm', ['install'], { cwd: pkg.dir });
255
-
256
- // Rebuild native modules for the current platform/ABI
257
- log('Rebuilding native modules...');
258
- run('npm', ['rebuild'], { cwd: pkg.dir });
259
-
260
- log('Building TypeScript...');
261
- run('npm', ['run', 'build'], { cwd: pkg.dir });
262
-
263
- log('Pruning dev dependencies...');
264
- run('npm', ['prune', '--omit=dev'], { cwd: pkg.dir });
265
-
266
- // 5. Create symlink
267
- createSymlink(pkgKey);
268
-
269
- // 6. Verify
270
- if (pkg.verify(pkg.dir)) {
271
- logOk(`${pkg.name} installed successfully`);
272
- } else {
273
- logErr(`${pkg.name} installed but ${pkg.verifyLabel} not found`);
274
- process.exit(1);
275
- }
276
-
277
- // 7. Verify native modules
278
- if (!checkNativeModule('better-sqlite3', pkg.dir)) {
279
- logWarn('better-sqlite3 native module not loading — attempting rebuild...');
280
- run('npm', ['rebuild', 'better-sqlite3'], { cwd: pkg.dir });
281
- if (checkNativeModule('better-sqlite3', pkg.dir)) {
282
- logOk('better-sqlite3 rebuilt successfully');
283
- } else {
284
- logErr('better-sqlite3 still failing — you may need to install build tools');
285
- }
286
- } else {
287
- logOk('Native modules OK');
288
- }
289
-
290
- // 8. Update tier in server.json
291
- const configPath = path.join(SPACES_DIR, 'server.json');
292
- try {
293
- const config = fs.existsSync(configPath)
294
- ? JSON.parse(fs.readFileSync(configPath, 'utf-8'))
295
- : { port: 3457, basePath: '' };
296
- // teams → team tier, pro → federation tier
297
- // Add-on packages set their tier; base package resets to community
298
- // only if no add-on package is currently installed
299
- const tierMap = { teams: 'team', pro: 'federation' };
300
- if (tierMap[pkgKey]) {
301
- // Installing an add-on — set its tier
302
- config.tier = tierMap[pkgKey];
303
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
304
- logOk(`Tier set to ${tierMap[pkgKey]}`);
305
- } else if (!config.tier || config.tier === 'community') {
306
- // Base package install, no add-on tier — ensure community
307
- config.tier = 'community';
308
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
309
- logOk(`Tier set to community`);
310
- } else {
311
- // Base package install but an add-on tier exists — preserve it
312
- logOk(`Tier unchanged (${config.tier})`);
313
- }
314
- } catch {}
315
-
316
- // 9. Verify require() works
317
- try {
318
- const result = execFileSync(process.execPath, [
319
- '-e',
320
- `const p = require.resolve('${pkg.name}'); console.log('resolved: ' + p);`,
321
- ], {
322
- encoding: 'utf-8',
323
- stdio: ['pipe', 'pipe', 'pipe'],
324
- env: { ...process.env, NODE_PATH: path.join(PACKAGES_DIR, 'node_modules') },
325
- });
326
- logOk(`require('${pkg.name}') -> ${result.trim().replace('resolved: ', '')}`);
327
- } catch {
328
- logWarn(`require('${pkg.name}') failed — this may be OK if peer deps aren't available yet`);
329
- }
330
-
331
- console.log('');
332
- }
333
-
334
- // ─── Verify command ───────────────────────────────────────────
335
- function verifyAll() {
336
- console.log('\n Spaces Package Verification\n');
337
-
338
- let allOk = true;
339
-
340
- for (const [key, pkg] of Object.entries(PACKAGES)) {
341
- log(`─── ${pkg.name} ───`);
342
-
343
- // Check if installed
344
- if (!fs.existsSync(pkg.dir)) {
345
- logWarn('Not installed');
346
- log('');
347
- continue;
348
- }
349
-
350
- // Check git status
351
- try {
352
- const branch = run('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: pkg.dir, quiet: true }).trim();
353
- const hash = run('git', ['rev-parse', '--short', 'HEAD'], { cwd: pkg.dir, quiet: true }).trim();
354
- logOk(`Git: ${branch} @ ${hash}`);
355
- } catch {
356
- logErr('Git status check failed');
357
- allOk = false;
358
- }
359
-
360
- // Check entry point
361
- if (pkg.verify(pkg.dir)) {
362
- logOk(`Entry: ${pkg.verifyLabel} exists`);
363
- } else {
364
- logErr(`Entry: ${pkg.verifyLabel} missing`);
365
- allOk = false;
366
- }
367
-
368
- // Check node_modules
369
- if (fs.existsSync(path.join(pkg.dir, 'node_modules'))) {
370
- logOk('Dependencies: node_modules present');
371
- } else {
372
- logErr('Dependencies: node_modules missing');
373
- allOk = false;
374
- }
375
-
376
- // Check symlink
377
- const linkPath = path.join(NODE_MODULES_DIR, key);
378
- try {
379
- const stat = fs.lstatSync(linkPath);
380
- if (stat.isSymbolicLink()) {
381
- const target = fs.readlinkSync(linkPath);
382
- logOk(`Symlink: @spaces/${key} -> ${target}`);
383
- } else {
384
- logWarn(`@spaces/${key} exists but is not a symlink`);
385
- }
386
- } catch {
387
- logErr(`Symlink: @spaces/${key} missing`);
388
- allOk = false;
389
- }
390
-
391
- // Check native modules
392
- const nativeOk = checkNativeModule('better-sqlite3', pkg.dir);
393
- if (nativeOk) {
394
- logOk('Native: better-sqlite3 loads OK');
395
- } else {
396
- logErr('Native: better-sqlite3 failed (ABI mismatch? Run: spaces upgrade)');
397
- allOk = false;
398
- }
399
-
400
- // Check require() resolution
401
- try {
402
- execFileSync(process.execPath, [
403
- '-e',
404
- `require.resolve('${pkg.name}')`,
405
- ], {
406
- encoding: 'utf-8',
407
- stdio: ['pipe', 'pipe', 'pipe'],
408
- env: { ...process.env, NODE_PATH: path.join(PACKAGES_DIR, 'node_modules') },
409
- });
410
- logOk(`require('${pkg.name}') resolves OK`);
411
- } catch {
412
- logErr(`require('${pkg.name}') fails`);
413
- allOk = false;
414
- }
415
-
416
- log('');
417
- }
418
-
419
- if (allOk) {
420
- logOk('All checks passed');
421
- } else {
422
- logErr('Some checks failed — run "spaces upgrade" to fix');
423
- }
424
- console.log('');
425
- }
426
-
427
- // ─── Upgrade command ──────────────────────────────────────────
428
- function upgradePackage(pkgKey) {
429
- if (pkgKey) {
430
- // Upgrade specific package
431
- const pkg = PACKAGES[pkgKey];
432
- if (!pkg) {
433
- logErr(`Unknown package: ${pkgKey}`);
434
- process.exit(1);
435
- }
436
- if (!fs.existsSync(pkg.dir)) {
437
- log(`${pkg.name} not installed — running install instead`);
438
- installPackage(pkgKey);
439
- return;
440
- }
441
- console.log(`\n Upgrading ${pkg.name}...\n`);
442
- doUpgrade(pkgKey, pkg);
443
- } else {
444
- // Upgrade all installed packages
445
- console.log('\n Upgrading all installed packages...\n');
446
- for (const [key, pkg] of Object.entries(PACKAGES)) {
447
- if (fs.existsSync(pkg.dir)) {
448
- log(`─── ${pkg.name} ───`);
449
- doUpgrade(key, pkg);
450
- log('');
451
- }
452
- }
453
- }
454
- console.log('');
455
- }
456
-
457
- function doUpgrade(pkgKey, pkg) {
458
- // Pull latest
459
- gitPull(pkg.dir);
460
-
461
- run('npm', ['install'], { cwd: pkg.dir });
462
- run('npm', ['rebuild'], { cwd: pkg.dir });
463
- log('Building TypeScript...');
464
- run('npm', ['run', 'build'], { cwd: pkg.dir });
465
- run('npm', ['prune', '--omit=dev'], { cwd: pkg.dir });
466
-
467
- // Re-create symlink
468
- createSymlink(pkgKey);
469
-
470
- if (pkg.verify(pkg.dir)) {
471
- logOk(`${pkg.name} upgraded successfully`);
472
- } else {
473
- logErr(`${pkg.name} upgrade failed — ${pkg.verifyLabel} not found`);
474
- }
475
- }
476
-
477
- // ─── Uninstall command ────────────────────────────────────────
478
- function uninstallOne(pkgKey) {
479
- const pkg = PACKAGES[pkgKey];
480
-
481
- // Remove symlink
482
- const linkPath = path.join(NODE_MODULES_DIR, pkgKey);
483
- try {
484
- const stat = fs.lstatSync(linkPath);
485
- if (stat.isSymbolicLink() || stat.isFile()) {
486
- fs.unlinkSync(linkPath);
487
- } else if (stat.isDirectory()) {
488
- fs.rmSync(linkPath, { recursive: true });
489
- }
490
- logOk(`Removed symlink @spaces/${pkgKey}`);
491
- } catch {
492
- logWarn(`Symlink @spaces/${pkgKey} not found`);
493
- }
494
-
495
- // Remove package directory
496
- if (fs.existsSync(pkg.dir)) {
497
- fs.rmSync(pkg.dir, { recursive: true });
498
- logOk(`Removed ${pkg.dir}`);
499
- } else {
500
- logWarn(`${pkg.dir} not found`);
501
- }
502
- }
503
-
504
- function uninstallPackage(pkgKey) {
505
- if (pkgKey) {
506
- const pkg = PACKAGES[pkgKey];
507
- if (!pkg) {
508
- logErr(`Unknown package: ${pkgKey}`);
509
- log(`Available: ${Object.keys(PACKAGES).join(', ')}`);
510
- process.exit(1);
511
- }
512
- console.log(`\n Uninstalling ${pkg.name}...\n`);
513
- uninstallOne(pkgKey);
514
- // Reset tier to community if removing a tier package
515
- const configPath = path.join(SPACES_DIR, 'server.json');
516
- try {
517
- if (fs.existsSync(configPath)) {
518
- const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
519
- if (config.tier && config.tier !== 'community') {
520
- config.tier = 'community';
521
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
522
- logOk('Reset tier to community');
523
- }
524
- }
525
- } catch {}
526
- logOk(`${pkg.name} uninstalled`);
527
- } else {
528
- console.log('\n Uninstalling everything...\n');
529
-
530
- // Remove tier packages
531
- for (const [key, pkg] of Object.entries(PACKAGES)) {
532
- if (fs.existsSync(pkg.dir) || fs.existsSync(path.join(NODE_MODULES_DIR, key))) {
533
- log(`─── ${pkg.name} ───`);
534
- uninstallOne(key);
535
- }
536
- }
537
- // Clean up packages dir
538
- try { fs.rmdirSync(NODE_MODULES_DIR); } catch {}
539
- try { fs.rmdirSync(path.join(PACKAGES_DIR, 'node_modules')); } catch {}
540
- try { fs.rmdirSync(PACKAGES_DIR); } catch {}
541
-
542
- // Remove the global spaces CLI
543
- log('─── @jlongo78/agent-spaces ───');
544
- try {
545
- run('npm', ['uninstall', '-g', '@jlongo78/agent-spaces'], { quiet: true });
546
- logOk('Removed global spaces CLI');
547
- } catch {
548
- logWarn('Global spaces CLI not found or already removed');
549
- }
550
-
551
- // Reset tier to community in server.json
552
- const configPath = path.join(SPACES_DIR, 'server.json');
553
- try {
554
- if (fs.existsSync(configPath)) {
555
- const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
556
- if (config.tier && config.tier !== 'community') {
557
- config.tier = 'community';
558
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
559
- logOk('Reset tier to community');
560
- }
561
- }
562
- } catch {}
563
-
564
- logOk('Spaces fully uninstalled');
565
- log('User data remains at ~/.spaces/ — remove manually if desired');
566
- }
567
- console.log('');
568
- }
569
-
570
- // ─── CLI ──────────────────────────────────────────────────────
571
- const command = process.argv[2];
572
- const target = process.argv[3];
573
-
574
- switch (command) {
575
- case 'install':
576
- if (!target) {
577
- logErr('Usage: spaces install <teams|pro>');
578
- process.exit(1);
579
- }
580
- installPackage(target);
581
- break;
582
-
583
- case 'uninstall':
584
- uninstallPackage(target || null);
585
- break;
586
-
587
- case 'verify':
588
- verifyAll();
589
- break;
590
-
591
- case 'upgrade':
592
- upgradePackage(target || null);
593
- break;
594
-
595
- default:
596
- logErr(`Unknown command: ${command}`);
597
- log('Usage: spaces <install|uninstall|verify|upgrade> [package]');
598
- process.exit(1);
599
- }
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ const { execFileSync } = require('child_process');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const fs = require('fs');
9
+
10
+ // Resolve the target user's home directory.
11
+ // On Windows, if running from a separate admin account, find the user
12
+ // who actually has Claude Code data (.claude/ directory).
13
+ function resolveTargetHome() {
14
+ const currentHome = os.homedir();
15
+ if (process.platform !== 'win32') return currentHome;
16
+ // Check if the current user has .claude — if so, they're the target
17
+ if (fs.existsSync(path.join(currentHome, '.claude'))) return currentHome;
18
+ // Scan for users with .claude
19
+ const usersDir = path.dirname(currentHome);
20
+ const skip = new Set(['Public', 'Default', 'Default User', 'All Users']);
21
+ try {
22
+ const claudeUsers = fs.readdirSync(usersDir)
23
+ .filter(name => !skip.has(name) && !name.startsWith('.'))
24
+ .filter(name => fs.existsSync(path.join(usersDir, name, '.claude')));
25
+ if (claudeUsers.length === 1) return path.join(usersDir, claudeUsers[0]);
26
+ } catch {}
27
+ return currentHome;
28
+ }
29
+
30
+ const TARGET_HOME = resolveTargetHome();
31
+ const SPACES_DIR = path.join(TARGET_HOME, '.spaces');
32
+ const PACKAGES_DIR = path.join(SPACES_DIR, 'packages');
33
+ const NODE_MODULES_DIR = path.join(PACKAGES_DIR, 'node_modules', '@spaces');
34
+
35
+ // ─── Package definitions ─────────────────────────────────────
36
+ const PACKAGES = {
37
+ teams: {
38
+ name: '@spaces/teams',
39
+ dir: path.join(PACKAGES_DIR, 'teams'),
40
+ repo: 'jlongo78/spaces-teams',
41
+ private: false,
42
+ verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
43
+ verifyLabel: 'dist/index.js',
44
+ },
45
+ pro: {
46
+ name: '@spaces/pro',
47
+ dir: path.join(PACKAGES_DIR, 'pro'),
48
+ repo: 'jlongo78/spaces-pro',
49
+ private: true,
50
+ verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
51
+ verifyLabel: 'dist/index.js',
52
+ },
53
+ cortex: {
54
+ name: '@spaces/cortex',
55
+ dir: path.join(PACKAGES_DIR, 'cortex'),
56
+ repo: 'jlongo78/spaces-cortex',
57
+ private: true,
58
+ verify: (dir) => fs.existsSync(path.join(dir, 'dist', 'index.js')),
59
+ verifyLabel: 'dist/index.js',
60
+ },
61
+ };
62
+
63
+ // ─── Helpers ──────────────────────────────────────────────────
64
+ function log(msg) { console.log(` ${msg}`); }
65
+ function logOk(msg) { console.log(` ✓ ${msg}`); }
66
+ function logErr(msg) { console.error(` ✗ ${msg}`); }
67
+ function logWarn(msg) { console.log(` ! ${msg}`); }
68
+
69
+ // On Windows, ensure Git is in PATH (admin accounts may not inherit user PATH)
70
+ function ensureGitInPath() {
71
+ if (process.platform !== 'win32') return;
72
+ try {
73
+ execFileSync('git', ['--version'], { stdio: 'pipe', shell: true });
74
+ return; // git already available
75
+ } catch {}
76
+ // Try common Git install locations (system-wide and per-user)
77
+ const candidates = [
78
+ path.join(process.env.ProgramFiles || 'C:\\Program Files', 'Git', 'cmd'),
79
+ path.join(process.env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)', 'Git', 'cmd'),
80
+ // Per-user installs (check target user and all profiles)
81
+ path.join(TARGET_HOME, 'AppData', 'Local', 'Programs', 'Git', 'cmd'),
82
+ path.join(TARGET_HOME, 'AppData', 'Local', 'Programs', 'Git', 'mingw64', 'bin'),
83
+ ];
84
+ // Also check all user profiles in case Git is installed by a different user
85
+ try {
86
+ const usersDir = path.dirname(os.homedir());
87
+ for (const name of fs.readdirSync(usersDir)) {
88
+ candidates.push(path.join(usersDir, name, 'AppData', 'Local', 'Programs', 'Git', 'cmd'));
89
+ candidates.push(path.join(usersDir, name, 'AppData', 'Local', 'Programs', 'Git', 'mingw64', 'bin'));
90
+ }
91
+ } catch {}
92
+ for (const dir of candidates) {
93
+ if (fs.existsSync(path.join(dir, 'git.exe'))) {
94
+ process.env.PATH = process.env.PATH + ';' + dir;
95
+ return;
96
+ }
97
+ }
98
+ }
99
+ ensureGitInPath();
100
+
101
+ function run(cmd, args, opts = {}) {
102
+ const isWin = process.platform === 'win32';
103
+ const safeArgs = isWin
104
+ ? args.map(a => (a.includes(' ') ? '"' + a + '"' : a))
105
+ : args;
106
+ return execFileSync(cmd, safeArgs, {
107
+ encoding: 'utf-8',
108
+ stdio: opts.quiet ? ['pipe', 'pipe', 'pipe'] : 'inherit',
109
+ shell: isWin,
110
+ ...opts,
111
+ });
112
+ }
113
+
114
+ // Git args prefix: allow operating on repos owned by a different user
115
+ // (e.g. admin account managing packages in the target user's home)
116
+ const GIT_SAFE = ['-c', 'safe.directory=*'];
117
+
118
+ /**
119
+ * Clone a repo, trying SSH first then HTTPS (with optional PAT).
120
+ */
121
+ function gitClone(repo, dest, isPrivate) {
122
+ const sshUrl = `git@github.com:${repo}.git`;
123
+ const httpsUrl = `https://github.com/${repo}.git`;
124
+
125
+ // Try SSH first
126
+ try {
127
+ log(`Cloning ${repo} (SSH)...`);
128
+ run('git', [...GIT_SAFE, 'clone', '--depth', '1', sshUrl, dest]);
129
+ return;
130
+ } catch {
131
+ // SSH failed, try HTTPS
132
+ }
133
+
134
+ // HTTPS — check for PAT if private
135
+ if (isPrivate) {
136
+ const pat = process.env.GH_PAT || process.env.GITHUB_TOKEN || '';
137
+ if (pat) {
138
+ log(`Cloning ${repo} (HTTPS + token)...`);
139
+ const authedUrl = `https://${pat}@github.com/${repo}.git`;
140
+ run('git', [...GIT_SAFE, 'clone', '--depth', '1', authedUrl, dest]);
141
+ return;
142
+ }
143
+ }
144
+
145
+ log(`Cloning ${repo} (HTTPS)...`);
146
+ run('git', [...GIT_SAFE, 'clone', '--depth', '1', httpsUrl, dest]);
147
+ }
148
+
149
+ /**
150
+ * Pull latest changes in a repo directory.
151
+ * Stashes any local modifications first so pull doesn't fail.
152
+ */
153
+ function gitPull(dir) {
154
+ log('Pulling latest...');
155
+ // Stash local changes if any (e.g. hook-generated files)
156
+ let stashed = false;
157
+ try {
158
+ const status = execFileSync('git', [...GIT_SAFE, 'status', '--porcelain'], { cwd: dir, encoding: 'utf-8' }).trim();
159
+ if (status) {
160
+ log('Stashing local changes...');
161
+ run('git', [...GIT_SAFE, 'stash', '--include-untracked'], { cwd: dir });
162
+ stashed = true;
163
+ }
164
+ } catch {}
165
+ run('git', [...GIT_SAFE, 'pull', '--ff-only'], { cwd: dir });
166
+ if (stashed) {
167
+ try {
168
+ run('git', [...GIT_SAFE, 'stash', 'pop'], { cwd: dir });
169
+ log('Restored local changes.');
170
+ } catch {
171
+ log('Warning: Could not restore stashed changes. Run "git stash pop" manually in ' + dir);
172
+ }
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Create the symlink from node_modules/@spaces/<name> -> ../../<name>
178
+ */
179
+ function createSymlink(pkgKey) {
180
+ const linkPath = path.join(NODE_MODULES_DIR, pkgKey);
181
+ const targetPath = path.join('..', '..', pkgKey); // relative symlink
182
+
183
+ fs.mkdirSync(NODE_MODULES_DIR, { recursive: true });
184
+
185
+ // Remove existing link/dir
186
+ try {
187
+ const stat = fs.lstatSync(linkPath);
188
+ if (stat.isSymbolicLink() || stat.isFile()) {
189
+ fs.unlinkSync(linkPath);
190
+ } else if (stat.isDirectory()) {
191
+ fs.rmSync(linkPath, { recursive: true });
192
+ }
193
+ } catch {}
194
+
195
+ fs.symlinkSync(targetPath, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
196
+ logOk(`Symlink: @spaces/${pkgKey} -> packages/${pkgKey}`);
197
+ }
198
+
199
+ /**
200
+ * Check if a native module loads correctly from a package directory.
201
+ */
202
+ function checkNativeModule(moduleName, searchDir) {
203
+ try {
204
+ const nodePath = path.join(searchDir, 'node_modules');
205
+ // Use execFileSync directly (no shell) so quotes aren't mangled on Windows
206
+ const result = execFileSync(process.execPath, [
207
+ '-e',
208
+ `try { require('${moduleName}'); console.log('ok'); } catch(e) { console.log(e.message); }`,
209
+ ], {
210
+ encoding: 'utf-8',
211
+ stdio: ['pipe', 'pipe', 'pipe'],
212
+ cwd: searchDir,
213
+ env: { ...process.env, NODE_PATH: nodePath },
214
+ });
215
+ return result.trim() === 'ok';
216
+ } catch {
217
+ return false;
218
+ }
219
+ }
220
+
221
+ // ─── Install command ──────────────────────────────────────────
222
+ function installPackage(pkgKey) {
223
+ const pkg = PACKAGES[pkgKey];
224
+ if (!pkg) {
225
+ logErr(`Unknown package: ${pkgKey}`);
226
+ log(`Available: ${Object.keys(PACKAGES).join(', ')}`);
227
+ process.exit(1);
228
+ }
229
+
230
+ console.log(`\n Installing ${pkg.name}...\n`);
231
+
232
+ // Pro requires teams as a prerequisite
233
+ if (pkgKey === "pro") {
234
+ const teamsDir = PACKAGES.teams.dir;
235
+ if (!fs.existsSync(path.join(teamsDir, "dist", "index.js"))) {
236
+ log("@spaces/pro requires @spaces/teams -- installing teams first...");
237
+ console.log("");
238
+ installPackage("teams");
239
+ console.log("");
240
+ }
241
+ }
242
+
243
+ // 1. Clone or pull
244
+ if (fs.existsSync(path.join(pkg.dir, '.git'))) {
245
+ gitPull(pkg.dir);
246
+ } else {
247
+ fs.mkdirSync(PACKAGES_DIR, { recursive: true });
248
+ gitClone(pkg.repo, pkg.dir, pkg.private);
249
+ }
250
+
251
+ // 2. Install dependencies
252
+ // Both teams and pro need TypeScript build
253
+ log('Installing dependencies...');
254
+ run('npm', ['install'], { cwd: pkg.dir });
255
+
256
+ // Rebuild native modules for the current platform/ABI
257
+ log('Rebuilding native modules...');
258
+ run('npm', ['rebuild'], { cwd: pkg.dir });
259
+
260
+ log('Building TypeScript...');
261
+ run('npm', ['run', 'build'], { cwd: pkg.dir });
262
+
263
+ log('Pruning dev dependencies...');
264
+ run('npm', ['prune', '--omit=dev'], { cwd: pkg.dir });
265
+
266
+ // 5. Create symlink
267
+ createSymlink(pkgKey);
268
+
269
+ // 6. Verify
270
+ if (pkg.verify(pkg.dir)) {
271
+ logOk(`${pkg.name} installed successfully`);
272
+ } else {
273
+ logErr(`${pkg.name} installed but ${pkg.verifyLabel} not found`);
274
+ process.exit(1);
275
+ }
276
+
277
+ // 7. Verify native modules
278
+ if (!checkNativeModule('better-sqlite3', pkg.dir)) {
279
+ logWarn('better-sqlite3 native module not loading — attempting rebuild...');
280
+ run('npm', ['rebuild', 'better-sqlite3'], { cwd: pkg.dir });
281
+ if (checkNativeModule('better-sqlite3', pkg.dir)) {
282
+ logOk('better-sqlite3 rebuilt successfully');
283
+ } else {
284
+ logErr('better-sqlite3 still failing — you may need to install build tools');
285
+ }
286
+ } else {
287
+ logOk('Native modules OK');
288
+ }
289
+
290
+ // 8. Update tier in server.json
291
+ const configPath = path.join(SPACES_DIR, 'server.json');
292
+ try {
293
+ const config = fs.existsSync(configPath)
294
+ ? JSON.parse(fs.readFileSync(configPath, 'utf-8'))
295
+ : { port: 3457, basePath: '' };
296
+ // teams → team tier, pro → federation tier
297
+ // Add-on packages set their tier; base package resets to community
298
+ // only if no add-on package is currently installed
299
+ const tierMap = { teams: 'team', pro: 'federation' };
300
+ if (tierMap[pkgKey]) {
301
+ // Installing an add-on — set its tier
302
+ config.tier = tierMap[pkgKey];
303
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
304
+ logOk(`Tier set to ${tierMap[pkgKey]}`);
305
+ } else if (!config.tier || config.tier === 'community') {
306
+ // Base package install, no add-on tier — ensure community
307
+ config.tier = 'community';
308
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
309
+ logOk(`Tier set to community`);
310
+ } else {
311
+ // Base package install but an add-on tier exists — preserve it
312
+ logOk(`Tier unchanged (${config.tier})`);
313
+ }
314
+ } catch {}
315
+
316
+ // 9. Verify require() works
317
+ try {
318
+ const result = execFileSync(process.execPath, [
319
+ '-e',
320
+ `const p = require.resolve('${pkg.name}'); console.log('resolved: ' + p);`,
321
+ ], {
322
+ encoding: 'utf-8',
323
+ stdio: ['pipe', 'pipe', 'pipe'],
324
+ env: { ...process.env, NODE_PATH: path.join(PACKAGES_DIR, 'node_modules') },
325
+ });
326
+ logOk(`require('${pkg.name}') -> ${result.trim().replace('resolved: ', '')}`);
327
+ } catch {
328
+ logWarn(`require('${pkg.name}') failed — this may be OK if peer deps aren't available yet`);
329
+ }
330
+
331
+ console.log('');
332
+ }
333
+
334
+ // ─── Verify command ───────────────────────────────────────────
335
+ function verifyAll() {
336
+ console.log('\n Spaces Package Verification\n');
337
+
338
+ let allOk = true;
339
+
340
+ for (const [key, pkg] of Object.entries(PACKAGES)) {
341
+ log(`─── ${pkg.name} ───`);
342
+
343
+ // Check if installed
344
+ if (!fs.existsSync(pkg.dir)) {
345
+ logWarn('Not installed');
346
+ log('');
347
+ continue;
348
+ }
349
+
350
+ // Check git status
351
+ try {
352
+ const branch = run('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: pkg.dir, quiet: true }).trim();
353
+ const hash = run('git', ['rev-parse', '--short', 'HEAD'], { cwd: pkg.dir, quiet: true }).trim();
354
+ logOk(`Git: ${branch} @ ${hash}`);
355
+ } catch {
356
+ logErr('Git status check failed');
357
+ allOk = false;
358
+ }
359
+
360
+ // Check entry point
361
+ if (pkg.verify(pkg.dir)) {
362
+ logOk(`Entry: ${pkg.verifyLabel} exists`);
363
+ } else {
364
+ logErr(`Entry: ${pkg.verifyLabel} missing`);
365
+ allOk = false;
366
+ }
367
+
368
+ // Check node_modules
369
+ if (fs.existsSync(path.join(pkg.dir, 'node_modules'))) {
370
+ logOk('Dependencies: node_modules present');
371
+ } else {
372
+ logErr('Dependencies: node_modules missing');
373
+ allOk = false;
374
+ }
375
+
376
+ // Check symlink
377
+ const linkPath = path.join(NODE_MODULES_DIR, key);
378
+ try {
379
+ const stat = fs.lstatSync(linkPath);
380
+ if (stat.isSymbolicLink()) {
381
+ const target = fs.readlinkSync(linkPath);
382
+ logOk(`Symlink: @spaces/${key} -> ${target}`);
383
+ } else {
384
+ logWarn(`@spaces/${key} exists but is not a symlink`);
385
+ }
386
+ } catch {
387
+ logErr(`Symlink: @spaces/${key} missing`);
388
+ allOk = false;
389
+ }
390
+
391
+ // Check native modules
392
+ const nativeOk = checkNativeModule('better-sqlite3', pkg.dir);
393
+ if (nativeOk) {
394
+ logOk('Native: better-sqlite3 loads OK');
395
+ } else {
396
+ logErr('Native: better-sqlite3 failed (ABI mismatch? Run: spaces upgrade)');
397
+ allOk = false;
398
+ }
399
+
400
+ // Check require() resolution
401
+ try {
402
+ execFileSync(process.execPath, [
403
+ '-e',
404
+ `require.resolve('${pkg.name}')`,
405
+ ], {
406
+ encoding: 'utf-8',
407
+ stdio: ['pipe', 'pipe', 'pipe'],
408
+ env: { ...process.env, NODE_PATH: path.join(PACKAGES_DIR, 'node_modules') },
409
+ });
410
+ logOk(`require('${pkg.name}') resolves OK`);
411
+ } catch {
412
+ logErr(`require('${pkg.name}') fails`);
413
+ allOk = false;
414
+ }
415
+
416
+ log('');
417
+ }
418
+
419
+ if (allOk) {
420
+ logOk('All checks passed');
421
+ } else {
422
+ logErr('Some checks failed — run "spaces upgrade" to fix');
423
+ }
424
+ console.log('');
425
+ }
426
+
427
+ // ─── Upgrade command ──────────────────────────────────────────
428
+ function upgradePackage(pkgKey) {
429
+ if (pkgKey) {
430
+ // Upgrade specific package
431
+ const pkg = PACKAGES[pkgKey];
432
+ if (!pkg) {
433
+ logErr(`Unknown package: ${pkgKey}`);
434
+ process.exit(1);
435
+ }
436
+ if (!fs.existsSync(pkg.dir)) {
437
+ log(`${pkg.name} not installed — running install instead`);
438
+ installPackage(pkgKey);
439
+ return;
440
+ }
441
+ console.log(`\n Upgrading ${pkg.name}...\n`);
442
+ doUpgrade(pkgKey, pkg);
443
+ } else {
444
+ // Upgrade all installed packages
445
+ console.log('\n Upgrading all installed packages...\n');
446
+ for (const [key, pkg] of Object.entries(PACKAGES)) {
447
+ if (fs.existsSync(pkg.dir)) {
448
+ log(`─── ${pkg.name} ───`);
449
+ doUpgrade(key, pkg);
450
+ log('');
451
+ }
452
+ }
453
+ }
454
+ console.log('');
455
+ }
456
+
457
+ function doUpgrade(pkgKey, pkg) {
458
+ // Pull latest
459
+ gitPull(pkg.dir);
460
+
461
+ run('npm', ['install'], { cwd: pkg.dir });
462
+ run('npm', ['rebuild'], { cwd: pkg.dir });
463
+ log('Building TypeScript...');
464
+ run('npm', ['run', 'build'], { cwd: pkg.dir });
465
+ run('npm', ['prune', '--omit=dev'], { cwd: pkg.dir });
466
+
467
+ // Re-create symlink
468
+ createSymlink(pkgKey);
469
+
470
+ if (pkg.verify(pkg.dir)) {
471
+ logOk(`${pkg.name} upgraded successfully`);
472
+ } else {
473
+ logErr(`${pkg.name} upgrade failed — ${pkg.verifyLabel} not found`);
474
+ }
475
+ }
476
+
477
+ // ─── Uninstall command ────────────────────────────────────────
478
+ function uninstallOne(pkgKey) {
479
+ const pkg = PACKAGES[pkgKey];
480
+
481
+ // Remove symlink
482
+ const linkPath = path.join(NODE_MODULES_DIR, pkgKey);
483
+ try {
484
+ const stat = fs.lstatSync(linkPath);
485
+ if (stat.isSymbolicLink() || stat.isFile()) {
486
+ fs.unlinkSync(linkPath);
487
+ } else if (stat.isDirectory()) {
488
+ fs.rmSync(linkPath, { recursive: true });
489
+ }
490
+ logOk(`Removed symlink @spaces/${pkgKey}`);
491
+ } catch {
492
+ logWarn(`Symlink @spaces/${pkgKey} not found`);
493
+ }
494
+
495
+ // Remove package directory
496
+ if (fs.existsSync(pkg.dir)) {
497
+ fs.rmSync(pkg.dir, { recursive: true });
498
+ logOk(`Removed ${pkg.dir}`);
499
+ } else {
500
+ logWarn(`${pkg.dir} not found`);
501
+ }
502
+ }
503
+
504
+ function uninstallPackage(pkgKey) {
505
+ if (pkgKey) {
506
+ const pkg = PACKAGES[pkgKey];
507
+ if (!pkg) {
508
+ logErr(`Unknown package: ${pkgKey}`);
509
+ log(`Available: ${Object.keys(PACKAGES).join(', ')}`);
510
+ process.exit(1);
511
+ }
512
+ console.log(`\n Uninstalling ${pkg.name}...\n`);
513
+ uninstallOne(pkgKey);
514
+ // Reset tier to community if removing a tier package
515
+ const configPath = path.join(SPACES_DIR, 'server.json');
516
+ try {
517
+ if (fs.existsSync(configPath)) {
518
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
519
+ if (config.tier && config.tier !== 'community') {
520
+ config.tier = 'community';
521
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
522
+ logOk('Reset tier to community');
523
+ }
524
+ }
525
+ } catch {}
526
+ logOk(`${pkg.name} uninstalled`);
527
+ } else {
528
+ console.log('\n Uninstalling everything...\n');
529
+
530
+ // Remove tier packages
531
+ for (const [key, pkg] of Object.entries(PACKAGES)) {
532
+ if (fs.existsSync(pkg.dir) || fs.existsSync(path.join(NODE_MODULES_DIR, key))) {
533
+ log(`─── ${pkg.name} ───`);
534
+ uninstallOne(key);
535
+ }
536
+ }
537
+ // Clean up packages dir
538
+ try { fs.rmdirSync(NODE_MODULES_DIR); } catch {}
539
+ try { fs.rmdirSync(path.join(PACKAGES_DIR, 'node_modules')); } catch {}
540
+ try { fs.rmdirSync(PACKAGES_DIR); } catch {}
541
+
542
+ // Remove the global spaces CLI
543
+ log('─── @jlongo78/agent-spaces ───');
544
+ try {
545
+ run('npm', ['uninstall', '-g', '@jlongo78/agent-spaces'], { quiet: true });
546
+ logOk('Removed global spaces CLI');
547
+ } catch {
548
+ logWarn('Global spaces CLI not found or already removed');
549
+ }
550
+
551
+ // Reset tier to community in server.json
552
+ const configPath = path.join(SPACES_DIR, 'server.json');
553
+ try {
554
+ if (fs.existsSync(configPath)) {
555
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
556
+ if (config.tier && config.tier !== 'community') {
557
+ config.tier = 'community';
558
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
559
+ logOk('Reset tier to community');
560
+ }
561
+ }
562
+ } catch {}
563
+
564
+ logOk('Spaces fully uninstalled');
565
+ log('User data remains at ~/.spaces/ — remove manually if desired');
566
+ }
567
+ console.log('');
568
+ }
569
+
570
+ // ─── CLI ──────────────────────────────────────────────────────
571
+ const command = process.argv[2];
572
+ const target = process.argv[3];
573
+
574
+ switch (command) {
575
+ case 'install':
576
+ if (!target) {
577
+ logErr('Usage: spaces install <teams|pro>');
578
+ process.exit(1);
579
+ }
580
+ installPackage(target);
581
+ break;
582
+
583
+ case 'uninstall':
584
+ uninstallPackage(target || null);
585
+ break;
586
+
587
+ case 'verify':
588
+ verifyAll();
589
+ break;
590
+
591
+ case 'upgrade':
592
+ upgradePackage(target || null);
593
+ break;
594
+
595
+ default:
596
+ logErr(`Unknown command: ${command}`);
597
+ log('Usage: spaces <install|uninstall|verify|upgrade> [package]');
598
+ process.exit(1);
599
+ }