@jlongo78/agent-spaces 0.7.4 → 0.7.5

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 (515) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +2 -2
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +19 -19
  5. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page.js.nft.json +1 -1
  6. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(desktop)/admin/users/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(desktop)/analytics/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/cortex/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/network/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(desktop)/projects/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/sessions/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(desktop)/settings/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(desktop)/workspaces/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  34. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  35. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  42. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  43. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  44. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  46. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  49. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  50. package/.next/standalone/.next/server/app/admin/analytics.rsc +5 -5
  51. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  55. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +5 -5
  56. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  57. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  59. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  60. package/.next/standalone/.next/server/app/admin/users.rsc +5 -5
  61. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +2 -2
  62. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  65. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +5 -5
  66. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  68. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/analytics.html +1 -1
  70. package/.next/standalone/.next/server/app/analytics.rsc +5 -5
  71. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +2 -2
  72. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  73. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  74. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +5 -5
  75. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  77. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  78. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/chat/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  113. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/network/workspaces/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  139. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  143. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  145. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/cortex.html +1 -1
  147. package/.next/standalone/.next/server/app/cortex.rsc +5 -5
  148. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
  149. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  150. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  151. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +5 -5
  152. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  153. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  154. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  155. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/login.html +1 -1
  157. package/.next/standalone/.next/server/app/login.rsc +2 -2
  158. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  159. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  160. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  161. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  162. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  163. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  164. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  167. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  168. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  169. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  170. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  171. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  172. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  173. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  174. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  175. package/.next/standalone/.next/server/app/m/sessions/[id]/page.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  179. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  180. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  181. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  182. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  183. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  184. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  185. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  186. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  187. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  189. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  190. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  191. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  192. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  193. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  194. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  195. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  196. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  197. package/.next/standalone/.next/server/app/m/terminal/page.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  200. package/.next/standalone/.next/server/app/m/terminal.rsc +2 -2
  201. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +2 -2
  202. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  203. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  204. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  205. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +1 -1
  206. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  207. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  208. package/.next/standalone/.next/server/app/m.html +1 -1
  209. package/.next/standalone/.next/server/app/m.rsc +2 -2
  210. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  211. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  212. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  213. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  214. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  215. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  216. package/.next/standalone/.next/server/app/network.html +1 -1
  217. package/.next/standalone/.next/server/app/network.rsc +5 -5
  218. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +2 -2
  219. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  220. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  221. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +5 -5
  222. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  223. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  225. package/.next/standalone/.next/server/app/projects.html +1 -1
  226. package/.next/standalone/.next/server/app/projects.rsc +5 -5
  227. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +2 -2
  228. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  229. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  230. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +5 -5
  231. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  232. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  233. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  234. package/.next/standalone/.next/server/app/sessions.html +1 -1
  235. package/.next/standalone/.next/server/app/sessions.rsc +5 -5
  236. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +2 -2
  237. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  238. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  239. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +5 -5
  240. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  242. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  243. package/.next/standalone/.next/server/app/settings.html +1 -1
  244. package/.next/standalone/.next/server/app/settings.rsc +5 -5
  245. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +2 -2
  246. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  247. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  248. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +5 -5
  249. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  250. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  251. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  252. package/.next/standalone/.next/server/app/terminal.html +1 -1
  253. package/.next/standalone/.next/server/app/terminal.rsc +5 -5
  254. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  255. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  256. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  257. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +5 -5
  258. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  259. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  260. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  261. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  262. package/.next/standalone/.next/server/app/workspaces.rsc +5 -5
  263. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +2 -2
  264. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  265. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +3 -3
  266. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +5 -5
  267. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  268. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  270. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0041efe4._.js +2 -2
  271. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00bf0ace._.js +2 -2
  272. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e71d908._.js +2 -2
  273. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e9142f3._.js +2 -2
  274. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10e47926._.js +1 -1
  275. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1665dc78._.js +2 -2
  276. package/.next/standalone/.next/server/chunks/[root-of-the-server]__175cbabf._.js +2 -2
  277. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1adae357._.js +2 -2
  278. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1d359752._.js +1 -1
  279. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e8fabeb._.js +3 -3
  280. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f8deca0._.js +8 -8
  281. package/.next/standalone/.next/server/chunks/[root-of-the-server]__253fdda1._.js +2 -2
  282. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28e6434f._.js +2 -2
  283. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a386564._.js +1 -1
  284. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2c20fb38._.js +2 -2
  285. package/.next/standalone/.next/server/chunks/[root-of-the-server]__309132cd._.js +1 -1
  286. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cf3c60c2._.js → [root-of-the-server]__33fec964._.js} +4 -4
  287. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3786d8ae._.js +1 -1
  288. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3ae92407._.js +2 -2
  289. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3beda9fe._.js +2 -2
  290. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4619e9bd._.js +1 -1
  291. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4a051043._.js +1 -1
  292. package/.next/standalone/.next/server/chunks/[root-of-the-server]__508002e4._.js +2 -2
  293. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5086c373._.js +2 -2
  294. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5913e097._.js +2 -2
  295. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5b5f68d2._.js +2 -2
  296. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c1f2459._.js +2 -2
  297. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ec8c977._.js +2 -2
  298. package/.next/standalone/.next/server/chunks/[root-of-the-server]__63cebc6c._.js +2 -2
  299. package/.next/standalone/.next/server/chunks/[root-of-the-server]__64d30d4d._.js +2 -2
  300. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c54fc2e._.js +2 -2
  301. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6dc1fb7e._.js +1 -1
  302. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e568102._.js +1 -1
  303. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6faa04c0._.js +2 -2
  304. package/.next/standalone/.next/server/chunks/[root-of-the-server]__74a34dc3._.js +2 -2
  305. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e7250a4._.js +3 -3
  306. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8309e0a4._.js +2 -2
  307. package/.next/standalone/.next/server/chunks/[root-of-the-server]__86cc0e2b._.js +6 -6
  308. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89c2565a._.js +2 -2
  309. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d178ad9._.js +2 -2
  310. package/.next/standalone/.next/server/chunks/[root-of-the-server]__93ee06f3._.js +3 -3
  311. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e4c154a._.js +2 -2
  312. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d2e1d3._.js +2 -2
  313. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ae53d343._.js +2 -2
  314. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b3a04cef._.js +2 -2
  315. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b4270b77._.js +1 -1
  316. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b6b6ce60._.js +1 -1
  317. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c88b63f7._.js +2 -2
  318. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__eee4c5e8._.js → [root-of-the-server]__cba5f007._.js} +2 -2
  319. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cbf4ceb0._.js +2 -2
  320. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cefdba2f._.js +2 -2
  321. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf9e82bb._.js +2 -2
  322. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d2897392._.js +2 -2
  323. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d3b2d856._.js +2 -2
  324. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d73273ca._.js +1 -1
  325. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8417eb6._.js +2 -2
  326. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dc2a55de._.js +2 -2
  327. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e0d4690b._.js +3 -3
  328. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e678dd53._.js +1 -1
  329. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e9223f55._.js +2 -2
  330. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ea630076._.js +3 -3
  331. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb8acb65._.js +1 -1
  332. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f26ca49d._.js +1 -1
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f33e1101._.js +1 -1
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f515f865._.js +2 -2
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fceb5d60._.js +2 -2
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fed41403._.js +2 -2
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff2e98c2._.js +2 -2
  338. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19afc53d._.js +3 -0
  339. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  340. package/.next/standalone/.next/server/chunks/ssr/{_036cbaa2._.js → _078dd64d._.js} +1 -1
  341. package/.next/standalone/.next/server/chunks/ssr/{_a4eeff0d._.js → _2230ad2d._.js} +2 -2
  342. package/.next/standalone/.next/server/chunks/ssr/{_43455582._.js → _701606d5._.js} +1 -1
  343. package/.next/standalone/.next/server/chunks/ssr/_72b1de37._.js +3 -0
  344. package/.next/standalone/.next/server/chunks/ssr/{_d39bcfda._.js → _93ef0f79._.js} +2 -2
  345. package/.next/standalone/.next/server/chunks/ssr/_950142a4._.js +1 -1
  346. package/.next/standalone/.next/server/chunks/ssr/_a22b5eb0._.js +3 -0
  347. package/.next/standalone/.next/server/chunks/ssr/_aeeff784._.js +3 -0
  348. package/.next/standalone/.next/server/chunks/ssr/_c1cfdd09._.js +3 -0
  349. package/.next/standalone/.next/server/chunks/ssr/_c2d3f6de._.js +3 -0
  350. package/.next/standalone/.next/server/chunks/ssr/{_8167090e._.js → _db2fec84._.js} +2 -2
  351. package/.next/standalone/.next/server/chunks/ssr/src_components_terminal_terminal-pane_tsx_803c5e2c._.js +2 -2
  352. package/.next/standalone/.next/server/edge/chunks/_d73df637._.js +1 -1
  353. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  354. package/.next/standalone/.next/server/pages/404.html +1 -1
  355. package/.next/standalone/.next/server/pages/500.html +2 -2
  356. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  357. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  358. package/.next/standalone/.next/static/chunks/25b7a243a404a1a7.js +1 -0
  359. package/.next/standalone/.next/static/chunks/2b997e211a5d547b.js +1 -0
  360. package/.next/standalone/.next/static/chunks/5e08abb00653754a.js +1 -0
  361. package/.next/standalone/.next/static/chunks/61f2ed39b75b1efc.js +1 -0
  362. package/.next/standalone/.next/static/chunks/6c78a1dfa7ec2959.css +3 -0
  363. package/.next/standalone/.next/static/chunks/7246f1ee445f7024.js +1 -0
  364. package/.next/standalone/.next/static/chunks/7424664c6ffa94bd.js +1 -0
  365. package/.next/standalone/.next/static/chunks/7e0091ab6c5ee8bd.js +1 -0
  366. package/.next/standalone/.next/static/chunks/8b3f4572fec83caa.js +5 -0
  367. package/.next/standalone/.next/static/chunks/{224aab5107987011.js → 9899cf4c2bdbe61d.js} +2 -2
  368. package/.next/standalone/.next/static/chunks/ac339e970df82fa5.js +5 -0
  369. package/.next/standalone/.next/static/chunks/f9f2628207848ac2.js +1 -0
  370. package/.next/standalone/bin/cortex-hook.sh +62 -62
  371. package/.next/standalone/bin/cortex-mcp.js +60 -60
  372. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
  373. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
  374. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
  375. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
  376. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
  377. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
  378. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
  379. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
  380. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
  381. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
  382. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
  383. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
  384. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
  385. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
  386. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
  387. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +46 -0
  388. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +221 -0
  389. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +1 -0
  390. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  391. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +42 -0
  392. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +46 -0
  393. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +221 -0
  394. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
  395. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  396. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
  397. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
  398. package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  399. package/.next/standalone/node_modules/@img/{sharp-win32-x64 → sharp-linux-x64}/package.json +46 -39
  400. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  401. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  402. package/.next/standalone/package.json +102 -102
  403. package/.next/standalone/server.js +1 -1
  404. package/.next/standalone/src/app/(desktop)/cortex/page.tsx +78 -78
  405. package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
  406. package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
  407. package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
  408. package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
  409. package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
  410. package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
  411. package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
  412. package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
  413. package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
  414. package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
  415. package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
  416. package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
  417. package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
  418. package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
  419. package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
  420. package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
  421. package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
  422. package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +29 -29
  423. package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
  424. package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
  425. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +93 -93
  426. package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
  427. package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
  428. package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
  429. package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
  430. package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
  431. package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
  432. package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +6 -6
  433. package/.next/standalone/src/app/api/cortex/search/route.ts +43 -43
  434. package/.next/standalone/src/app/api/cortex/settings/route.ts +33 -33
  435. package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
  436. package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
  437. package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
  438. package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
  439. package/.next/standalone/src/components/cortex/constants.ts +29 -29
  440. package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
  441. package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
  442. package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
  443. package/.next/standalone/src/components/cortex/cortex-settings.tsx +221 -221
  444. package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
  445. package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
  446. package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
  447. package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
  448. package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
  449. package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
  450. package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
  451. package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
  452. package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
  453. package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
  454. package/.next/standalone/src/lib/cortex/config.ts +40 -40
  455. package/.next/standalone/src/lib/cortex/debug.ts +10 -10
  456. package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
  457. package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
  458. package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
  459. package/.next/standalone/src/lib/cortex/index.ts +56 -56
  460. package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
  461. package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
  462. package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
  463. package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
  464. package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
  465. package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
  466. package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
  467. package/.next/standalone/src/lib/cortex/mcp/server.ts +8 -8
  468. package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
  469. package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
  470. package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
  471. package/.next/standalone/src/lib/cortex/types.ts +39 -39
  472. package/.next/standalone/tsconfig.json +34 -34
  473. package/LICENSE +661 -661
  474. package/README.md +131 -131
  475. package/bin/cortex-hook.sh +62 -62
  476. package/bin/cortex-mcp.js +60 -60
  477. package/bin/fix-standalone-externals.js +79 -79
  478. package/bin/lib/auto-setup.js +110 -110
  479. package/bin/mdns-service.js +171 -171
  480. package/bin/postinstall.js +35 -35
  481. package/bin/setup-admin.js +195 -195
  482. package/bin/spaces-dev.js +208 -208
  483. package/bin/spaces-install.js +599 -599
  484. package/bin/spaces-reset-totp.js +50 -50
  485. package/bin/spaces-service.js +1020 -1020
  486. package/bin/spaces-setup.js +253 -253
  487. package/bin/spaces.js +776 -717
  488. package/bin/ssh-auth-keys.sh +68 -68
  489. package/bin/terminal-server.js +1649 -1646
  490. package/package.json +102 -102
  491. package/.next/standalone/.claude/settings.local.json +0 -55
  492. package/.next/standalone/.claude/spaces-env.json +0 -1
  493. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__23f374a2._.js +0 -3
  494. package/.next/standalone/.next/server/chunks/ssr/_01842037._.js +0 -3
  495. package/.next/standalone/.next/server/chunks/ssr/_10c0d382._.js +0 -3
  496. package/.next/standalone/.next/server/chunks/ssr/_67887e33._.js +0 -3
  497. package/.next/standalone/.next/server/chunks/ssr/_a012c43b._.js +0 -3
  498. package/.next/standalone/.next/server/chunks/ssr/_ed6c285b._.js +0 -3
  499. package/.next/standalone/.next/static/chunks/17d164c01fa1aaa9.js +0 -5
  500. package/.next/standalone/.next/static/chunks/19da759dde107f02.js +0 -1
  501. package/.next/standalone/.next/static/chunks/415827af44b8c374.js +0 -1
  502. package/.next/standalone/.next/static/chunks/596bd56e0ad09173.js +0 -5
  503. package/.next/standalone/.next/static/chunks/79aacab676df80c4.js +0 -1
  504. package/.next/standalone/.next/static/chunks/846d6ef408f69390.js +0 -1
  505. package/.next/standalone/.next/static/chunks/8a7f58872c123a53.css +0 -3
  506. package/.next/standalone/.next/static/chunks/8de5e432a2fc563a.js +0 -1
  507. package/.next/standalone/.next/static/chunks/b0484608571d975a.js +0 -1
  508. package/.next/standalone/.next/static/chunks/b42a38df3e418ff0.js +0 -1
  509. package/.next/standalone/.next/static/chunks/d6474f65a17c483e.js +0 -1
  510. package/.next/standalone/.spaces/cortex-context.md +0 -70
  511. package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
  512. /package/.next/standalone/.next/static/{Ku7_sP1T1UuqtRhUTiJZw → 77VYbwIoyxFNr5xevTrCu}/_buildManifest.js +0 -0
  513. /package/.next/standalone/.next/static/{Ku7_sP1T1UuqtRhUTiJZw → 77VYbwIoyxFNr5xevTrCu}/_clientMiddlewareManifest.json +0 -0
  514. /package/.next/standalone/.next/static/{Ku7_sP1T1UuqtRhUTiJZw → 77VYbwIoyxFNr5xevTrCu}/_ssgManifest.js +0 -0
  515. /package/.next/standalone/node_modules/@img/{sharp-win32-x64 → sharp-libvips-linux-x64}/versions.json +0 -0
@@ -1,382 +1,382 @@
1
- 'use client';
2
-
3
- import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
4
- import { api } from '@/lib/api';
5
- import { EntityDetail } from './entity-detail';
6
-
7
- interface GraphEntity {
8
- id: string;
9
- name: string;
10
- type: string;
11
- metadata: Record<string, unknown>;
12
- }
13
-
14
- interface GraphEdge {
15
- source_id: string;
16
- target_id: string;
17
- relation: string;
18
- weight: number;
19
- }
20
-
21
- interface GraphNode extends GraphEntity {
22
- x?: number;
23
- y?: number;
24
- }
25
-
26
- interface GraphLink {
27
- source: string;
28
- target: string;
29
- relation: string;
30
- weight: number;
31
- }
32
-
33
- type GraphInstance = {
34
- graphData: (data: { nodes: GraphNode[]; links: GraphLink[] }) => GraphInstance;
35
- nodeCanvasObject: (cb: (node: GraphNode, ctx: CanvasRenderingContext2D, globalScale: number) => void) => GraphInstance;
36
- nodePointerAreaPaint: (cb: (node: GraphNode, color: string, ctx: CanvasRenderingContext2D) => void) => GraphInstance;
37
- linkColor: (cb: (link: GraphLink) => string) => GraphInstance;
38
- linkWidth: (cb: (link: GraphLink) => number) => GraphInstance;
39
- onNodeClick: (cb: (node: GraphNode) => void) => GraphInstance;
40
- onBackgroundClick: (cb: () => void) => GraphInstance;
41
- width: (w: number) => GraphInstance;
42
- height: (h: number) => GraphInstance;
43
- zoom: () => number;
44
- zoomToFit: (ms?: number, px?: number) => GraphInstance;
45
- _destructor: () => void;
46
- };
47
-
48
- const NODE_COLORS: Record<string, string> = {
49
- person: '#7c3aed',
50
- team: '#10b981',
51
- project: '#10b981',
52
- system: '#f59e0b',
53
- module: '#f59e0b',
54
- topic: '#06b6d4',
55
- department: '#3b82f6',
56
- organization: '#3b82f6',
57
- };
58
-
59
- function getNodeColor(type: string): string {
60
- return NODE_COLORS[type] ?? '#6b7280';
61
- }
62
-
63
- function drawNode(
64
- node: GraphNode,
65
- ctx: CanvasRenderingContext2D,
66
- globalScale: number,
67
- selected: boolean,
68
- ) {
69
- const color = getNodeColor(node.type);
70
- const type = node.type;
71
- const r = Math.max(4, 8 / Math.sqrt(globalScale));
72
- const x = node.x ?? 0;
73
- const y = node.y ?? 0;
74
-
75
- ctx.save();
76
-
77
- if (selected) {
78
- ctx.shadowColor = color;
79
- ctx.shadowBlur = 12;
80
- }
81
-
82
- if (type === 'person' || type === 'topic') {
83
- const radius = type === 'topic' ? r * 0.7 : r;
84
- ctx.beginPath();
85
- ctx.arc(x, y, radius, 0, Math.PI * 2);
86
- ctx.fillStyle = color + '44';
87
- ctx.fill();
88
- ctx.strokeStyle = color;
89
- ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
90
- ctx.stroke();
91
- } else if (type === 'system' || type === 'module') {
92
- const size = r * 1.1;
93
- ctx.beginPath();
94
- ctx.moveTo(x, y - size);
95
- ctx.lineTo(x + size, y);
96
- ctx.lineTo(x, y + size);
97
- ctx.lineTo(x - size, y);
98
- ctx.closePath();
99
- ctx.fillStyle = color + '44';
100
- ctx.fill();
101
- ctx.strokeStyle = color;
102
- ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
103
- ctx.stroke();
104
- } else {
105
- const w = r * 2.2;
106
- const h = r * 1.5;
107
- const rx = 3 / globalScale;
108
- const lx = x - w / 2;
109
- const ly = y - h / 2;
110
- ctx.beginPath();
111
- ctx.moveTo(lx + rx, ly);
112
- ctx.lineTo(lx + w - rx, ly);
113
- ctx.quadraticCurveTo(lx + w, ly, lx + w, ly + rx);
114
- ctx.lineTo(lx + w, ly + h - rx);
115
- ctx.quadraticCurveTo(lx + w, ly + h, lx + w - rx, ly + h);
116
- ctx.lineTo(lx + rx, ly + h);
117
- ctx.quadraticCurveTo(lx, ly + h, lx, ly + h - rx);
118
- ctx.lineTo(lx, ly + rx);
119
- ctx.quadraticCurveTo(lx, ly, lx + rx, ly);
120
- ctx.closePath();
121
- ctx.fillStyle = color + '44';
122
- ctx.fill();
123
- ctx.strokeStyle = color;
124
- ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
125
- ctx.stroke();
126
- }
127
-
128
- // Label — hide at very low zoom to reduce clutter
129
- if (globalScale > 0.4) {
130
- const fontSize = Math.max(2, 10 / globalScale);
131
- ctx.font = `${fontSize}px sans-serif`;
132
- ctx.textAlign = 'center';
133
- ctx.textBaseline = 'top';
134
- ctx.fillStyle = '#e5e7eb';
135
- const label =
136
- node.name.length > 16 ? node.name.slice(0, 15) + '\u2026' : node.name;
137
- ctx.fillText(label, x, y + r * 1.4);
138
- }
139
-
140
- ctx.restore();
141
- }
142
-
143
- const LEGEND_ITEMS = [
144
- { label: 'Person', color: '#7c3aed', shape: 'circle', types: ['person'] },
145
- { label: 'Team / Project', color: '#10b981', shape: 'rect', types: ['team', 'project'] },
146
- { label: 'System / Module', color: '#f59e0b', shape: 'diamond', types: ['system', 'module'] },
147
- { label: 'Topic', color: '#06b6d4', shape: 'circle-sm', types: ['topic'] },
148
- { label: 'Dept / Org', color: '#3b82f6', shape: 'rect', types: ['department', 'organization'] },
149
- ];
150
-
151
- export function EntityGraphView() {
152
- const containerRef = useRef<HTMLDivElement>(null);
153
- const graphRef = useRef<GraphInstance | null>(null);
154
- const [nodes, setNodes] = useState<GraphNode[]>([]);
155
- const [links, setLinks] = useState<GraphLink[]>([]);
156
- const [selected, setSelected] = useState<GraphNode | null>(null);
157
- const [loading, setLoading] = useState(true);
158
- const [hiddenTypes, setHiddenTypes] = useState<Set<string>>(new Set());
159
- const selectedRef = useRef<GraphNode | null>(null);
160
-
161
- useEffect(() => { selectedRef.current = selected; }, [selected]);
162
-
163
- // Fetch graph data
164
- useEffect(() => {
165
- setLoading(true);
166
- Promise.all([
167
- fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
168
- fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
169
- ])
170
- .then(([entityData, edgeData]) => {
171
- setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
172
- setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
173
- source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
174
- })));
175
- })
176
- .catch(() => { setNodes([]); setLinks([]); })
177
- .finally(() => setLoading(false));
178
- }, []);
179
-
180
- // Filter nodes/links by hidden types (memoized to avoid graph rebuild on unrelated re-renders)
181
- const visibleNodes = useMemo(() => nodes.filter(n => !hiddenTypes.has(n.type)), [nodes, hiddenTypes]);
182
- const visibleIds = useMemo(() => new Set(visibleNodes.map(n => n.id)), [visibleNodes]);
183
- const visibleLinks = useMemo(() => links.filter(l => visibleIds.has(l.source) && visibleIds.has(l.target)), [links, visibleIds]);
184
-
185
- // Build/update the graph
186
- useEffect(() => {
187
- if (loading || !containerRef.current) return;
188
- if (graphRef.current) { graphRef.current._destructor?.(); graphRef.current = null; }
189
- if (visibleNodes.length === 0) return;
190
-
191
- const el = containerRef.current;
192
- const width = el.clientWidth || 800;
193
- const height = el.clientHeight || 600;
194
- if (width < 10 || height < 10) return;
195
-
196
- import('force-graph').then(({ default: ForceGraph2D }) => {
197
- if (!containerRef.current) return;
198
-
199
- const builder = ForceGraph2D as unknown as () => (el: HTMLElement) => GraphInstance;
200
- const graph = builder()(containerRef.current)
201
- .graphData({ nodes: visibleNodes, links: visibleLinks })
202
- .width(width)
203
- .height(height)
204
- .nodeCanvasObject((node, ctx, globalScale) => {
205
- drawNode(node, ctx, globalScale, selectedRef.current?.id === node.id);
206
- })
207
- .nodePointerAreaPaint((node, color, ctx) => {
208
- const r = 12;
209
- const x = node.x ?? 0;
210
- const y = node.y ?? 0;
211
- ctx.beginPath();
212
- ctx.arc(x, y, r, 0, Math.PI * 2);
213
- ctx.fillStyle = color;
214
- ctx.fill();
215
- })
216
- .linkColor(() => 'rgba(124, 58, 237, 0.2)')
217
- .linkWidth((link) => Math.max(0.5, Math.min(4, Math.sqrt(link.weight ?? 1) * 0.8)))
218
- .onNodeClick((node) => setSelected(node))
219
- .onBackgroundClick(() => setSelected(null));
220
-
221
- graphRef.current = graph;
222
- setTimeout(() => graph.zoomToFit(400, 40), 300);
223
- });
224
-
225
- return () => { if (graphRef.current) { graphRef.current._destructor?.(); graphRef.current = null; } };
226
- // eslint-disable-next-line react-hooks/exhaustive-deps
227
- }, [loading, visibleNodes, visibleLinks]);
228
-
229
- const handleRecenter = useCallback(() => graphRef.current?.zoomToFit(400, 40), []);
230
- const handleClose = useCallback(() => setSelected(null), []);
231
-
232
- const toggleType = (types: string[]) => {
233
- setHiddenTypes(prev => {
234
- const next = new Set(prev);
235
- const allHidden = types.every(t => next.has(t));
236
- for (const t of types) {
237
- if (allHidden) next.delete(t); else next.add(t);
238
- }
239
- return next;
240
- });
241
- };
242
-
243
- if (loading) {
244
- return <div className="flex-1 flex items-center justify-center text-gray-500 text-sm">Loading graph&hellip;</div>;
245
- }
246
-
247
- if (nodes.length === 0) {
248
- const handlePopulate = async () => {
249
- setLoading(true);
250
- try {
251
- await fetch(api('/api/cortex/graph/populate'), { method: 'POST' });
252
- const [entityData, edgeData] = await Promise.all([
253
- fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
254
- fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
255
- ]);
256
- setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
257
- setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
258
- source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
259
- })));
260
- } catch { /* */ }
261
- finally { setLoading(false); }
262
- };
263
-
264
- return (
265
- <div className="flex-1 flex flex-col items-center justify-center text-gray-500 gap-3">
266
- <div className="text-4xl opacity-20">&#x25C8;</div>
267
- <div className="text-sm">No entities in the graph yet.</div>
268
- <div className="text-xs text-gray-600 text-center max-w-xs">
269
- Build the graph from your workspaces, projects, and sessions.
270
- </div>
271
- <button
272
- onClick={handlePopulate}
273
- className="mt-1 px-3 py-1.5 text-xs bg-purple-500/20 text-purple-300 border border-purple-500/30 rounded-md hover:bg-purple-500/30 transition-colors"
274
- >
275
- Populate graph
276
- </button>
277
- </div>
278
- );
279
- }
280
-
281
- return (
282
- <div className="flex-1 flex min-h-0 overflow-hidden h-full">
283
- <div className="relative flex-1 min-w-0">
284
- <div ref={containerRef} className="w-full h-full" />
285
-
286
- {/* Legend + filter — top-right */}
287
- <div className="absolute top-3 right-3 bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg p-2.5 text-[10px]">
288
- <div className="text-gray-400 uppercase tracking-wider mb-1.5 font-medium">
289
- Filter
290
- {hiddenTypes.size > 0 && (
291
- <span className="ml-1.5 text-gray-600 normal-case">
292
- {visibleNodes.length}/{nodes.length}
293
- </span>
294
- )}
295
- </div>
296
- {LEGEND_ITEMS.map((item) => {
297
- const isHidden = item.types.every(t => hiddenTypes.has(t));
298
- return (
299
- <button
300
- key={item.label}
301
- onClick={() => toggleType(item.types)}
302
- className={`flex items-center gap-1.5 mb-1 w-full text-left transition-opacity ${isHidden ? 'opacity-30' : 'opacity-100'} hover:opacity-100`}
303
- >
304
- <LegendShape shape={item.shape} color={item.color} />
305
- <span className="text-gray-300">{item.label}</span>
306
- {!isHidden && (
307
- <span className="ml-auto text-gray-600">
308
- {nodes.filter(n => item.types.includes(n.type)).length}
309
- </span>
310
- )}
311
- </button>
312
- );
313
- })}
314
- {hiddenTypes.size > 0 && (
315
- <button
316
- onClick={() => setHiddenTypes(new Set())}
317
- className="mt-1 text-[9px] text-gray-500 hover:text-gray-300 w-full text-center"
318
- >
319
- Show all
320
- </button>
321
- )}
322
- </div>
323
-
324
- {/* Bottom buttons */}
325
- <div className="absolute bottom-4 left-4 flex items-center gap-2">
326
- <button
327
- onClick={handleRecenter}
328
- className="bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg px-3 py-1.5 text-[11px] text-gray-300 hover:text-white hover:border-white/20 transition-colors"
329
- title="Recenter graph"
330
- >
331
- &oplus; Recenter
332
- </button>
333
- <button
334
- onClick={async () => {
335
- setLoading(true);
336
- try {
337
- await fetch(api('/api/cortex/graph/populate'), { method: 'POST' });
338
- const [entityData, edgeData] = await Promise.all([
339
- fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
340
- fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
341
- ]);
342
- setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
343
- setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
344
- source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
345
- })));
346
- } catch { /* */ }
347
- finally { setLoading(false); }
348
- }}
349
- className="bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg px-3 py-1.5 text-[11px] text-gray-300 hover:text-white hover:border-white/20 transition-colors"
350
- title="Re-scan workspaces, projects, branches, and topics"
351
- >
352
- &#x21BB; Rebuild
353
- </button>
354
- </div>
355
- </div>
356
-
357
- {/* Detail panel */}
358
- <div className="w-72 border-l border-white/[0.06] bg-black/20 overflow-y-auto">
359
- <EntityDetail node={selected} onClose={handleClose} />
360
- </div>
361
- </div>
362
- );
363
- }
364
-
365
- function LegendShape({ shape, color }: { shape: string; color: string }) {
366
- return (
367
- <svg width="14" height="14" viewBox="0 0 14 14">
368
- {shape === 'circle' && (
369
- <circle cx="7" cy="7" r="5" fill={color + '44'} stroke={color} strokeWidth="1.5" />
370
- )}
371
- {shape === 'circle-sm' && (
372
- <circle cx="7" cy="7" r="3.5" fill={color + '44'} stroke={color} strokeWidth="1.5" />
373
- )}
374
- {shape === 'rect' && (
375
- <rect x="1" y="3" width="12" height="8" rx="2" fill={color + '44'} stroke={color} strokeWidth="1.5" />
376
- )}
377
- {shape === 'diamond' && (
378
- <polygon points="7,1 13,7 7,13 1,7" fill={color + '44'} stroke={color} strokeWidth="1.5" />
379
- )}
380
- </svg>
381
- );
382
- }
1
+ 'use client';
2
+
3
+ import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
4
+ import { api } from '@/lib/api';
5
+ import { EntityDetail } from './entity-detail';
6
+
7
+ interface GraphEntity {
8
+ id: string;
9
+ name: string;
10
+ type: string;
11
+ metadata: Record<string, unknown>;
12
+ }
13
+
14
+ interface GraphEdge {
15
+ source_id: string;
16
+ target_id: string;
17
+ relation: string;
18
+ weight: number;
19
+ }
20
+
21
+ interface GraphNode extends GraphEntity {
22
+ x?: number;
23
+ y?: number;
24
+ }
25
+
26
+ interface GraphLink {
27
+ source: string;
28
+ target: string;
29
+ relation: string;
30
+ weight: number;
31
+ }
32
+
33
+ type GraphInstance = {
34
+ graphData: (data: { nodes: GraphNode[]; links: GraphLink[] }) => GraphInstance;
35
+ nodeCanvasObject: (cb: (node: GraphNode, ctx: CanvasRenderingContext2D, globalScale: number) => void) => GraphInstance;
36
+ nodePointerAreaPaint: (cb: (node: GraphNode, color: string, ctx: CanvasRenderingContext2D) => void) => GraphInstance;
37
+ linkColor: (cb: (link: GraphLink) => string) => GraphInstance;
38
+ linkWidth: (cb: (link: GraphLink) => number) => GraphInstance;
39
+ onNodeClick: (cb: (node: GraphNode) => void) => GraphInstance;
40
+ onBackgroundClick: (cb: () => void) => GraphInstance;
41
+ width: (w: number) => GraphInstance;
42
+ height: (h: number) => GraphInstance;
43
+ zoom: () => number;
44
+ zoomToFit: (ms?: number, px?: number) => GraphInstance;
45
+ _destructor: () => void;
46
+ };
47
+
48
+ const NODE_COLORS: Record<string, string> = {
49
+ person: '#7c3aed',
50
+ team: '#10b981',
51
+ project: '#10b981',
52
+ system: '#f59e0b',
53
+ module: '#f59e0b',
54
+ topic: '#06b6d4',
55
+ department: '#3b82f6',
56
+ organization: '#3b82f6',
57
+ };
58
+
59
+ function getNodeColor(type: string): string {
60
+ return NODE_COLORS[type] ?? '#6b7280';
61
+ }
62
+
63
+ function drawNode(
64
+ node: GraphNode,
65
+ ctx: CanvasRenderingContext2D,
66
+ globalScale: number,
67
+ selected: boolean,
68
+ ) {
69
+ const color = getNodeColor(node.type);
70
+ const type = node.type;
71
+ const r = Math.max(4, 8 / Math.sqrt(globalScale));
72
+ const x = node.x ?? 0;
73
+ const y = node.y ?? 0;
74
+
75
+ ctx.save();
76
+
77
+ if (selected) {
78
+ ctx.shadowColor = color;
79
+ ctx.shadowBlur = 12;
80
+ }
81
+
82
+ if (type === 'person' || type === 'topic') {
83
+ const radius = type === 'topic' ? r * 0.7 : r;
84
+ ctx.beginPath();
85
+ ctx.arc(x, y, radius, 0, Math.PI * 2);
86
+ ctx.fillStyle = color + '44';
87
+ ctx.fill();
88
+ ctx.strokeStyle = color;
89
+ ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
90
+ ctx.stroke();
91
+ } else if (type === 'system' || type === 'module') {
92
+ const size = r * 1.1;
93
+ ctx.beginPath();
94
+ ctx.moveTo(x, y - size);
95
+ ctx.lineTo(x + size, y);
96
+ ctx.lineTo(x, y + size);
97
+ ctx.lineTo(x - size, y);
98
+ ctx.closePath();
99
+ ctx.fillStyle = color + '44';
100
+ ctx.fill();
101
+ ctx.strokeStyle = color;
102
+ ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
103
+ ctx.stroke();
104
+ } else {
105
+ const w = r * 2.2;
106
+ const h = r * 1.5;
107
+ const rx = 3 / globalScale;
108
+ const lx = x - w / 2;
109
+ const ly = y - h / 2;
110
+ ctx.beginPath();
111
+ ctx.moveTo(lx + rx, ly);
112
+ ctx.lineTo(lx + w - rx, ly);
113
+ ctx.quadraticCurveTo(lx + w, ly, lx + w, ly + rx);
114
+ ctx.lineTo(lx + w, ly + h - rx);
115
+ ctx.quadraticCurveTo(lx + w, ly + h, lx + w - rx, ly + h);
116
+ ctx.lineTo(lx + rx, ly + h);
117
+ ctx.quadraticCurveTo(lx, ly + h, lx, ly + h - rx);
118
+ ctx.lineTo(lx, ly + rx);
119
+ ctx.quadraticCurveTo(lx, ly, lx + rx, ly);
120
+ ctx.closePath();
121
+ ctx.fillStyle = color + '44';
122
+ ctx.fill();
123
+ ctx.strokeStyle = color;
124
+ ctx.lineWidth = selected ? 2 / globalScale : 1.5 / globalScale;
125
+ ctx.stroke();
126
+ }
127
+
128
+ // Label — hide at very low zoom to reduce clutter
129
+ if (globalScale > 0.4) {
130
+ const fontSize = Math.max(2, 10 / globalScale);
131
+ ctx.font = `${fontSize}px sans-serif`;
132
+ ctx.textAlign = 'center';
133
+ ctx.textBaseline = 'top';
134
+ ctx.fillStyle = '#e5e7eb';
135
+ const label =
136
+ node.name.length > 16 ? node.name.slice(0, 15) + '\u2026' : node.name;
137
+ ctx.fillText(label, x, y + r * 1.4);
138
+ }
139
+
140
+ ctx.restore();
141
+ }
142
+
143
+ const LEGEND_ITEMS = [
144
+ { label: 'Person', color: '#7c3aed', shape: 'circle', types: ['person'] },
145
+ { label: 'Team / Project', color: '#10b981', shape: 'rect', types: ['team', 'project'] },
146
+ { label: 'System / Module', color: '#f59e0b', shape: 'diamond', types: ['system', 'module'] },
147
+ { label: 'Topic', color: '#06b6d4', shape: 'circle-sm', types: ['topic'] },
148
+ { label: 'Dept / Org', color: '#3b82f6', shape: 'rect', types: ['department', 'organization'] },
149
+ ];
150
+
151
+ export function EntityGraphView() {
152
+ const containerRef = useRef<HTMLDivElement>(null);
153
+ const graphRef = useRef<GraphInstance | null>(null);
154
+ const [nodes, setNodes] = useState<GraphNode[]>([]);
155
+ const [links, setLinks] = useState<GraphLink[]>([]);
156
+ const [selected, setSelected] = useState<GraphNode | null>(null);
157
+ const [loading, setLoading] = useState(true);
158
+ const [hiddenTypes, setHiddenTypes] = useState<Set<string>>(new Set());
159
+ const selectedRef = useRef<GraphNode | null>(null);
160
+
161
+ useEffect(() => { selectedRef.current = selected; }, [selected]);
162
+
163
+ // Fetch graph data
164
+ useEffect(() => {
165
+ setLoading(true);
166
+ Promise.all([
167
+ fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
168
+ fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
169
+ ])
170
+ .then(([entityData, edgeData]) => {
171
+ setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
172
+ setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
173
+ source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
174
+ })));
175
+ })
176
+ .catch(() => { setNodes([]); setLinks([]); })
177
+ .finally(() => setLoading(false));
178
+ }, []);
179
+
180
+ // Filter nodes/links by hidden types (memoized to avoid graph rebuild on unrelated re-renders)
181
+ const visibleNodes = useMemo(() => nodes.filter(n => !hiddenTypes.has(n.type)), [nodes, hiddenTypes]);
182
+ const visibleIds = useMemo(() => new Set(visibleNodes.map(n => n.id)), [visibleNodes]);
183
+ const visibleLinks = useMemo(() => links.filter(l => visibleIds.has(l.source) && visibleIds.has(l.target)), [links, visibleIds]);
184
+
185
+ // Build/update the graph
186
+ useEffect(() => {
187
+ if (loading || !containerRef.current) return;
188
+ if (graphRef.current) { graphRef.current._destructor?.(); graphRef.current = null; }
189
+ if (visibleNodes.length === 0) return;
190
+
191
+ const el = containerRef.current;
192
+ const width = el.clientWidth || 800;
193
+ const height = el.clientHeight || 600;
194
+ if (width < 10 || height < 10) return;
195
+
196
+ import('force-graph').then(({ default: ForceGraph2D }) => {
197
+ if (!containerRef.current) return;
198
+
199
+ const builder = ForceGraph2D as unknown as () => (el: HTMLElement) => GraphInstance;
200
+ const graph = builder()(containerRef.current)
201
+ .graphData({ nodes: visibleNodes, links: visibleLinks })
202
+ .width(width)
203
+ .height(height)
204
+ .nodeCanvasObject((node, ctx, globalScale) => {
205
+ drawNode(node, ctx, globalScale, selectedRef.current?.id === node.id);
206
+ })
207
+ .nodePointerAreaPaint((node, color, ctx) => {
208
+ const r = 12;
209
+ const x = node.x ?? 0;
210
+ const y = node.y ?? 0;
211
+ ctx.beginPath();
212
+ ctx.arc(x, y, r, 0, Math.PI * 2);
213
+ ctx.fillStyle = color;
214
+ ctx.fill();
215
+ })
216
+ .linkColor(() => 'rgba(124, 58, 237, 0.2)')
217
+ .linkWidth((link) => Math.max(0.5, Math.min(4, Math.sqrt(link.weight ?? 1) * 0.8)))
218
+ .onNodeClick((node) => setSelected(node))
219
+ .onBackgroundClick(() => setSelected(null));
220
+
221
+ graphRef.current = graph;
222
+ setTimeout(() => graph.zoomToFit(400, 40), 300);
223
+ });
224
+
225
+ return () => { if (graphRef.current) { graphRef.current._destructor?.(); graphRef.current = null; } };
226
+ // eslint-disable-next-line react-hooks/exhaustive-deps
227
+ }, [loading, visibleNodes, visibleLinks]);
228
+
229
+ const handleRecenter = useCallback(() => graphRef.current?.zoomToFit(400, 40), []);
230
+ const handleClose = useCallback(() => setSelected(null), []);
231
+
232
+ const toggleType = (types: string[]) => {
233
+ setHiddenTypes(prev => {
234
+ const next = new Set(prev);
235
+ const allHidden = types.every(t => next.has(t));
236
+ for (const t of types) {
237
+ if (allHidden) next.delete(t); else next.add(t);
238
+ }
239
+ return next;
240
+ });
241
+ };
242
+
243
+ if (loading) {
244
+ return <div className="flex-1 flex items-center justify-center text-gray-500 text-sm">Loading graph&hellip;</div>;
245
+ }
246
+
247
+ if (nodes.length === 0) {
248
+ const handlePopulate = async () => {
249
+ setLoading(true);
250
+ try {
251
+ await fetch(api('/api/cortex/graph/populate'), { method: 'POST' });
252
+ const [entityData, edgeData] = await Promise.all([
253
+ fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
254
+ fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
255
+ ]);
256
+ setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
257
+ setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
258
+ source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
259
+ })));
260
+ } catch { /* */ }
261
+ finally { setLoading(false); }
262
+ };
263
+
264
+ return (
265
+ <div className="flex-1 flex flex-col items-center justify-center text-gray-500 gap-3">
266
+ <div className="text-4xl opacity-20">&#x25C8;</div>
267
+ <div className="text-sm">No entities in the graph yet.</div>
268
+ <div className="text-xs text-gray-600 text-center max-w-xs">
269
+ Build the graph from your workspaces, projects, and sessions.
270
+ </div>
271
+ <button
272
+ onClick={handlePopulate}
273
+ className="mt-1 px-3 py-1.5 text-xs bg-purple-500/20 text-purple-300 border border-purple-500/30 rounded-md hover:bg-purple-500/30 transition-colors"
274
+ >
275
+ Populate graph
276
+ </button>
277
+ </div>
278
+ );
279
+ }
280
+
281
+ return (
282
+ <div className="flex-1 flex min-h-0 overflow-hidden h-full">
283
+ <div className="relative flex-1 min-w-0">
284
+ <div ref={containerRef} className="w-full h-full" />
285
+
286
+ {/* Legend + filter — top-right */}
287
+ <div className="absolute top-3 right-3 bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg p-2.5 text-[10px]">
288
+ <div className="text-gray-400 uppercase tracking-wider mb-1.5 font-medium">
289
+ Filter
290
+ {hiddenTypes.size > 0 && (
291
+ <span className="ml-1.5 text-gray-600 normal-case">
292
+ {visibleNodes.length}/{nodes.length}
293
+ </span>
294
+ )}
295
+ </div>
296
+ {LEGEND_ITEMS.map((item) => {
297
+ const isHidden = item.types.every(t => hiddenTypes.has(t));
298
+ return (
299
+ <button
300
+ key={item.label}
301
+ onClick={() => toggleType(item.types)}
302
+ className={`flex items-center gap-1.5 mb-1 w-full text-left transition-opacity ${isHidden ? 'opacity-30' : 'opacity-100'} hover:opacity-100`}
303
+ >
304
+ <LegendShape shape={item.shape} color={item.color} />
305
+ <span className="text-gray-300">{item.label}</span>
306
+ {!isHidden && (
307
+ <span className="ml-auto text-gray-600">
308
+ {nodes.filter(n => item.types.includes(n.type)).length}
309
+ </span>
310
+ )}
311
+ </button>
312
+ );
313
+ })}
314
+ {hiddenTypes.size > 0 && (
315
+ <button
316
+ onClick={() => setHiddenTypes(new Set())}
317
+ className="mt-1 text-[9px] text-gray-500 hover:text-gray-300 w-full text-center"
318
+ >
319
+ Show all
320
+ </button>
321
+ )}
322
+ </div>
323
+
324
+ {/* Bottom buttons */}
325
+ <div className="absolute bottom-4 left-4 flex items-center gap-2">
326
+ <button
327
+ onClick={handleRecenter}
328
+ className="bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg px-3 py-1.5 text-[11px] text-gray-300 hover:text-white hover:border-white/20 transition-colors"
329
+ title="Recenter graph"
330
+ >
331
+ &oplus; Recenter
332
+ </button>
333
+ <button
334
+ onClick={async () => {
335
+ setLoading(true);
336
+ try {
337
+ await fetch(api('/api/cortex/graph/populate'), { method: 'POST' });
338
+ const [entityData, edgeData] = await Promise.all([
339
+ fetch(api('/api/cortex/graph/entities')).then(r => r.json()),
340
+ fetch(api('/api/cortex/graph/edges?all=true')).then(r => r.json()),
341
+ ]);
342
+ setNodes((entityData.entities ?? []).map((e: GraphEntity) => ({ ...e })));
343
+ setLinks((edgeData.edges ?? []).map((e: GraphEdge) => ({
344
+ source: e.source_id, target: e.target_id, relation: e.relation, weight: e.weight ?? 1,
345
+ })));
346
+ } catch { /* */ }
347
+ finally { setLoading(false); }
348
+ }}
349
+ className="bg-black/60 backdrop-blur-sm border border-white/10 rounded-lg px-3 py-1.5 text-[11px] text-gray-300 hover:text-white hover:border-white/20 transition-colors"
350
+ title="Re-scan workspaces, projects, branches, and topics"
351
+ >
352
+ &#x21BB; Rebuild
353
+ </button>
354
+ </div>
355
+ </div>
356
+
357
+ {/* Detail panel */}
358
+ <div className="w-72 border-l border-white/[0.06] bg-black/20 overflow-y-auto">
359
+ <EntityDetail node={selected} onClose={handleClose} />
360
+ </div>
361
+ </div>
362
+ );
363
+ }
364
+
365
+ function LegendShape({ shape, color }: { shape: string; color: string }) {
366
+ return (
367
+ <svg width="14" height="14" viewBox="0 0 14 14">
368
+ {shape === 'circle' && (
369
+ <circle cx="7" cy="7" r="5" fill={color + '44'} stroke={color} strokeWidth="1.5" />
370
+ )}
371
+ {shape === 'circle-sm' && (
372
+ <circle cx="7" cy="7" r="3.5" fill={color + '44'} stroke={color} strokeWidth="1.5" />
373
+ )}
374
+ {shape === 'rect' && (
375
+ <rect x="1" y="3" width="12" height="8" rx="2" fill={color + '44'} stroke={color} strokeWidth="1.5" />
376
+ )}
377
+ {shape === 'diamond' && (
378
+ <polygon points="7,1 13,7 7,13 1,7" fill={color + '44'} stroke={color} strokeWidth="1.5" />
379
+ )}
380
+ </svg>
381
+ );
382
+ }