@jlongo78/agent-spaces 0.7.5 → 0.7.7

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 (634) 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 +3 -3
  214. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +3 -3
  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 +2 -2
  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/_2230ad2d._.js +1 -1
  421. package/.next/standalone/.next/server/chunks/ssr/_2e0dd6a7._.js +1 -1
  422. package/.next/standalone/.next/server/chunks/ssr/_3cd2355c._.js +1 -1
  423. package/.next/standalone/.next/server/chunks/ssr/_3d206597._.js +4 -0
  424. package/.next/standalone/.next/server/chunks/ssr/_47cc9af0._.js +1 -1
  425. package/.next/standalone/.next/server/chunks/ssr/_5cf334fd._.js +3 -0
  426. package/.next/standalone/.next/server/chunks/ssr/_7082788b._.js +1 -1
  427. package/.next/standalone/.next/server/chunks/ssr/_7154d8ae._.js +1 -1
  428. package/.next/standalone/.next/server/chunks/ssr/_75bb1b9a._.js +1 -1
  429. package/.next/standalone/.next/server/chunks/ssr/{_aeeff784._.js → _81abf587._.js} +2 -2
  430. package/.next/standalone/.next/server/chunks/ssr/_8acf81e2._.js +1 -1
  431. package/.next/standalone/.next/server/chunks/ssr/_8c36feb8._.js +1 -1
  432. package/.next/standalone/.next/server/chunks/ssr/_91e9bb86._.js +1 -1
  433. package/.next/standalone/.next/server/chunks/ssr/_ac4c1838._.js +1 -1
  434. package/.next/standalone/.next/server/chunks/ssr/_ad8515fc._.js +1 -1
  435. package/.next/standalone/.next/server/chunks/ssr/_b1f49e81._.js +1 -1
  436. package/.next/standalone/.next/server/chunks/ssr/_c0fe7614._.js +1 -1
  437. package/.next/standalone/.next/server/chunks/ssr/_d4825f5a._.js +1 -1
  438. package/.next/standalone/.next/server/chunks/ssr/_da10a9f4._.js +1 -1
  439. package/.next/standalone/.next/server/chunks/ssr/_db0abd0a._.js +3 -0
  440. package/.next/standalone/.next/server/chunks/ssr/_db2fec84._.js +1 -1
  441. package/.next/standalone/.next/server/chunks/ssr/_dee5d4a1._.js +1 -1
  442. package/.next/standalone/.next/server/chunks/ssr/_ef482c0c._.js +1 -1
  443. package/.next/standalone/.next/server/chunks/ssr/_efe43d2f._.js +1 -1
  444. package/.next/standalone/.next/server/chunks/ssr/_f4a4e116._.js +1 -1
  445. package/.next/standalone/.next/server/chunks/ssr/_f4d525d2._.js +1 -1
  446. package/.next/standalone/.next/server/chunks/ssr/_f4e57187._.js +3 -0
  447. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_vr_page_actions_3fb70d92.js +3 -0
  448. package/.next/standalone/.next/server/chunks/ssr/node_modules_32f9d62f._.js +1 -1
  449. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02f39477.js +1 -1
  450. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_eedfc1fd._.js +1 -1
  451. package/.next/standalone/.next/server/chunks/ssr/src_40fa36ce._.js +7 -0
  452. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +3 -0
  453. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__32a0045c._.js +1 -1
  454. package/.next/standalone/.next/server/edge/chunks/_d73df637._.js +1 -1
  455. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  456. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  457. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  458. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  459. package/.next/standalone/.next/server/pages/404.html +1 -1
  460. package/.next/standalone/.next/server/pages/500.html +2 -2
  461. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  462. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  463. package/.next/standalone/.next/static/chunks/045c83caa4d15373.js +1 -0
  464. package/.next/standalone/.next/static/chunks/07ea09e6024a523b.js +1 -0
  465. package/.next/standalone/.next/static/chunks/{aae9e0fa485bd835.js → 158b52b84e647ac1.js} +2 -2
  466. package/.next/standalone/.next/static/chunks/232d8aae4fefab70.js +1 -0
  467. package/.next/standalone/.next/static/chunks/2ad22562bb37ecad.js +1011 -0
  468. package/.next/standalone/.next/static/chunks/{a4e5c700421eaa46.js → 412140a02893327a.js} +1 -1
  469. package/.next/standalone/.next/static/chunks/481cc11ae80b08b1.js +1 -0
  470. package/.next/standalone/.next/static/chunks/5325351ef49cb65f.js +1 -0
  471. package/.next/standalone/.next/static/chunks/559735e598ca3cbb.js +1 -0
  472. package/.next/standalone/.next/static/chunks/59c63d5af5cf3daf.js +1 -0
  473. package/.next/standalone/.next/static/chunks/5d5d7b0095dd52ae.js +1 -0
  474. package/.next/standalone/.next/static/chunks/69606d281c39f9b2.js +1 -0
  475. package/.next/standalone/.next/static/chunks/6ae575967d091df4.js +1 -0
  476. package/.next/standalone/.next/static/chunks/7f8455bb855a6c84.js +1 -0
  477. package/.next/standalone/.next/static/chunks/84fe8d44deeeb74f.js +757 -0
  478. package/.next/standalone/.next/static/chunks/898f380eba90427a.js +1 -0
  479. package/.next/standalone/.next/static/chunks/95339e55722bb4ca.js +5 -0
  480. package/.next/standalone/.next/static/chunks/9cd594813c539df9.js +1 -0
  481. package/.next/standalone/.next/static/chunks/{7424664c6ffa94bd.js → 9cfa0291d55d8d2a.js} +1 -1
  482. package/.next/standalone/.next/static/chunks/ad1423eed05d129b.js +1 -0
  483. package/.next/standalone/.next/static/chunks/ae7b146884c67d2a.js +1 -0
  484. package/.next/standalone/.next/static/chunks/b84072d72aa86417.js +1 -0
  485. package/.next/standalone/.next/static/chunks/c1a95aebf6725f64.css +3 -0
  486. package/.next/standalone/.next/static/chunks/c515eb77d9410aa0.js +5 -0
  487. package/.next/standalone/.next/static/chunks/{9899cf4c2bdbe61d.js → d9ae203a7f123546.js} +2 -2
  488. package/.next/standalone/.next/static/chunks/e116953dc83d4eec.js +1 -0
  489. package/.next/standalone/.next/static/chunks/fdc09bd135846960.js +1 -0
  490. package/.next/standalone/.next/static/chunks/ff0196911449e745.js +1 -0
  491. package/.next/standalone/.next/static/chunks/{turbopack-4c21186b79fb4c10.js → turbopack-e1a0994ed4af988c.js} +1 -1
  492. package/.next/standalone/.spaces/cortex-context.md +70 -0
  493. package/.next/standalone/bin/cortex-hook.sh +62 -62
  494. package/.next/standalone/bin/cortex-mcp.js +60 -60
  495. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
  496. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
  497. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
  498. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
  499. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
  500. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
  501. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
  502. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
  503. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
  504. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
  505. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
  506. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
  507. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
  508. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
  509. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
  510. package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
  511. package/.next/standalone/node_modules/@img/{sharp-linux-x64 → sharp-win32-x64}/package.json +39 -46
  512. package/.next/standalone/package.json +104 -102
  513. package/.next/standalone/server.js +1 -1
  514. package/.next/standalone/src/app/(desktop)/cortex/page.tsx +78 -78
  515. package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
  516. package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
  517. package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
  518. package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
  519. package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
  520. package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
  521. package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
  522. package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
  523. package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
  524. package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
  525. package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
  526. package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
  527. package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
  528. package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
  529. package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
  530. package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
  531. package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
  532. package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +29 -29
  533. package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
  534. package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
  535. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +93 -93
  536. package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
  537. package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
  538. package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
  539. package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
  540. package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
  541. package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
  542. package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +6 -6
  543. package/.next/standalone/src/app/api/cortex/search/route.ts +43 -43
  544. package/.next/standalone/src/app/api/cortex/settings/route.ts +33 -33
  545. package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
  546. package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
  547. package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
  548. package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
  549. package/.next/standalone/src/components/cortex/constants.ts +29 -29
  550. package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
  551. package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
  552. package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
  553. package/.next/standalone/src/components/cortex/cortex-settings.tsx +221 -221
  554. package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
  555. package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
  556. package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
  557. package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
  558. package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
  559. package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
  560. package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
  561. package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
  562. package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
  563. package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
  564. package/.next/standalone/src/lib/cortex/config.ts +40 -40
  565. package/.next/standalone/src/lib/cortex/debug.ts +10 -10
  566. package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
  567. package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
  568. package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
  569. package/.next/standalone/src/lib/cortex/index.ts +56 -56
  570. package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
  571. package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
  572. package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
  573. package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
  574. package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
  575. package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
  576. package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
  577. package/.next/standalone/src/lib/cortex/mcp/server.ts +8 -8
  578. package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
  579. package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
  580. package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
  581. package/.next/standalone/src/lib/cortex/types.ts +39 -39
  582. package/.next/standalone/tsconfig.json +34 -34
  583. package/LICENSE +661 -661
  584. package/README.md +131 -131
  585. package/bin/cortex-hook.sh +62 -62
  586. package/bin/cortex-mcp.js +60 -60
  587. package/bin/fix-standalone-externals.js +79 -79
  588. package/bin/lib/auto-setup.js +110 -110
  589. package/bin/mdns-service.js +171 -171
  590. package/bin/postinstall.js +35 -35
  591. package/bin/setup-admin.js +195 -195
  592. package/bin/spaces-dev.js +208 -208
  593. package/bin/spaces-install.js +599 -599
  594. package/bin/spaces-reset-totp.js +50 -50
  595. package/bin/spaces-service.js +1020 -1020
  596. package/bin/spaces-setup.js +253 -253
  597. package/bin/spaces.js +776 -776
  598. package/bin/ssh-auth-keys.sh +68 -68
  599. package/bin/terminal-server.js +1683 -1649
  600. package/package.json +104 -102
  601. package/.next/standalone/.next/server/chunks/ssr/_078dd64d._.js +0 -3
  602. package/.next/standalone/.next/server/chunks/ssr/_701606d5._.js +0 -3
  603. package/.next/standalone/.next/server/chunks/ssr/_72b1de37._.js +0 -3
  604. package/.next/standalone/.next/server/chunks/ssr/_950142a4._.js +0 -3
  605. package/.next/standalone/.next/server/chunks/ssr/src_components_terminal_terminal-pane_tsx_803c5e2c._.js +0 -7
  606. package/.next/standalone/.next/static/chunks/18f168665aef1aab.js +0 -1
  607. package/.next/standalone/.next/static/chunks/25b7a243a404a1a7.js +0 -1
  608. package/.next/standalone/.next/static/chunks/4a50d2a3e9bc9b41.js +0 -1
  609. package/.next/standalone/.next/static/chunks/6c78a1dfa7ec2959.css +0 -3
  610. package/.next/standalone/.next/static/chunks/7e0091ab6c5ee8bd.js +0 -1
  611. package/.next/standalone/.next/static/chunks/869f562dc32e55f4.js +0 -1
  612. package/.next/standalone/.next/static/chunks/8b3f4572fec83caa.js +0 -5
  613. package/.next/standalone/.next/static/chunks/8d5419afc4b9116b.js +0 -1
  614. package/.next/standalone/.next/static/chunks/9b2c5451f0b67975.js +0 -1
  615. package/.next/standalone/.next/static/chunks/ac339e970df82fa5.js +0 -5
  616. package/.next/standalone/.next/static/chunks/e7772d64463868eb.js +0 -1
  617. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
  618. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  619. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
  620. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  621. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
  622. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
  623. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  624. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
  625. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  626. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
  627. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
  628. package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  629. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  630. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
  631. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → BEY-sql3lQLouidpurSQf}/_buildManifest.js +0 -0
  632. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → BEY-sql3lQLouidpurSQf}/_clientMiddlewareManifest.json +0 -0
  633. /package/.next/standalone/.next/static/{77VYbwIoyxFNr5xevTrCu → BEY-sql3lQLouidpurSQf}/_ssgManifest.js +0 -0
  634. /package/.next/standalone/node_modules/@img/{sharp-libvips-linux-x64 → sharp-win32-x64}/versions.json +0 -0
@@ -1,810 +1,810 @@
1
- 'use client';
2
-
3
- import { useState, useEffect, useCallback } from 'react';
4
- import { Upload, BarChart3, Search, RefreshCw, Package, Loader2 } from 'lucide-react';
5
- import { api } from '@/lib/api';
6
- import { TYPE_COLORS } from './constants';
7
-
8
- type Step = 'seed' | 'assess' | 'review' | 'refine' | 'publish';
9
-
10
- interface Workspace {
11
- id: string;
12
- name: string;
13
- color: string;
14
- }
15
-
16
- interface SeedResult {
17
- chunksCreated: number;
18
- chunksSkipped: number;
19
- errors: string[];
20
- }
21
-
22
- interface AssessResult {
23
- coverage_score: number;
24
- total_units: number;
25
- stale_count: number;
26
- type_distribution: Record<string, number>;
27
- }
28
-
29
- interface ReviewItem {
30
- text: string;
31
- confidence: number;
32
- similarity: number;
33
- }
34
-
35
- interface ReviewResult {
36
- topic: string;
37
- total_matches: number;
38
- by_type: Record<string, ReviewItem[]>;
39
- }
40
-
41
- interface RefineResult {
42
- source_units_found: number;
43
- distilled_purged: number;
44
- new_units_created: number;
45
- }
46
-
47
- interface PublishResult {
48
- quality_warning?: string;
49
- output_path?: string;
50
- pii_scrub?: { fields_scrubbed: number; records_checked: number };
51
- }
52
-
53
- const STEPS: { id: Step; label: string; icon: React.ReactNode }[] = [
54
- { id: 'seed', label: 'Seed', icon: <Upload className="w-3.5 h-3.5" /> },
55
- { id: 'assess', label: 'Assess', icon: <BarChart3 className="w-3.5 h-3.5" /> },
56
- { id: 'review', label: 'Review', icon: <Search className="w-3.5 h-3.5" /> },
57
- { id: 'refine', label: 'Refine', icon: <RefreshCw className="w-3.5 h-3.5" /> },
58
- { id: 'publish', label: 'Publish', icon: <Package className="w-3.5 h-3.5" /> },
59
- ];
60
-
61
- const TYPE_HEX: Record<string, string> = {
62
- decision: '#3b82f6',
63
- pattern: '#22c55e',
64
- preference: '#ec4899',
65
- error_fix: '#f59e0b',
66
- context: '#6b7280',
67
- code_pattern: '#06b6d4',
68
- command: '#f97316',
69
- conversation: '#64748b',
70
- summary: '#8b5cf6',
71
- };
72
-
73
-
74
- export function CurationTab() {
75
- const [workspaces, setWorkspaces] = useState<Workspace[]>([]);
76
- const [workspaceId, setWorkspaceId] = useState('');
77
- const [activeStep, setActiveStep] = useState<Step>('seed');
78
- const [error, setError] = useState('');
79
-
80
- // Seed state
81
- const [seedText, setSeedText] = useState('');
82
- const [seedFormat, setSeedFormat] = useState('auto');
83
- const [seedSourceRef, setSeedSourceRef] = useState('');
84
- const [seedDistill, setSeedDistill] = useState(true);
85
- const [seedLoading, setSeedLoading] = useState(false);
86
- const [seedResult, setSeedResult] = useState<SeedResult | null>(null);
87
-
88
- // Assess state
89
- const [assessLoading, setAssessLoading] = useState(false);
90
- const [assessResult, setAssessResult] = useState<AssessResult | null>(null);
91
-
92
- // Review state
93
- const [reviewTopic, setReviewTopic] = useState('');
94
- const [reviewLimit, setReviewLimit] = useState('25');
95
- const [reviewLoading, setReviewLoading] = useState(false);
96
- const [reviewResult, setReviewResult] = useState<ReviewResult | null>(null);
97
-
98
- // Refine state
99
- const [refineDomainContext, setRefineDomainContext] = useState('');
100
- const [refineTypes, setRefineTypes] = useState({
101
- decisions: true,
102
- patterns: true,
103
- preferences: true,
104
- error_fixes: true,
105
- });
106
- const [refineLoading, setRefineLoading] = useState(false);
107
- const [refineResult, setRefineResult] = useState<RefineResult | null>(null);
108
-
109
- // Publish state
110
- const [publishName, setPublishName] = useState('');
111
- const [publishAuthor, setPublishAuthor] = useState('');
112
- const [publishDescription, setPublishDescription] = useState('');
113
- const [publishTags, setPublishTags] = useState('');
114
- const [publishVersion, setPublishVersion] = useState('1.0.0');
115
- const [publishLicense, setPublishLicense] = useState('MIT');
116
- const [publishLoading, setPublishLoading] = useState(false);
117
- const [publishResult, setPublishResult] = useState<PublishResult | null>(null);
118
-
119
- const clearStepResults = useCallback(() => {
120
- setSeedResult(null);
121
- setAssessResult(null);
122
- setReviewResult(null);
123
- setRefineResult(null);
124
- setPublishResult(null);
125
- setError('');
126
- }, []);
127
-
128
- useEffect(() => {
129
- fetch(api('/api/workspaces'))
130
- .then(r => r.json())
131
- .then((data: Workspace[]) => {
132
- setWorkspaces(data);
133
- if (data.length > 0) setWorkspaceId(data[0].id);
134
- })
135
- .catch(() => {});
136
- }, []);
137
-
138
- const handleStepChange = (step: Step) => {
139
- setActiveStep(step);
140
- clearStepResults();
141
- };
142
-
143
- const handleWorkspaceChange = (id: string) => {
144
- setWorkspaceId(id);
145
- clearStepResults();
146
- };
147
-
148
- // --- Seed ---
149
- const handleSeed = async () => {
150
- if (!seedText.trim() || !workspaceId) return;
151
- setSeedLoading(true);
152
- setError('');
153
- setSeedResult(null);
154
- try {
155
- const res = await fetch(api('/api/cortex/curation/seed'), {
156
- method: 'POST',
157
- headers: { 'Content-Type': 'application/json' },
158
- body: JSON.stringify({
159
- text: seedText,
160
- format: seedFormat,
161
- source_ref: seedSourceRef || undefined,
162
- workspace_id: workspaceId,
163
- distill: seedDistill,
164
- }),
165
- });
166
- const data = await res.json();
167
- if (!res.ok) throw new Error(data.error || data.message || 'Seed failed');
168
- setSeedResult(data);
169
- } catch (e) {
170
- setError(e instanceof Error ? e.message : 'Seed failed');
171
- } finally {
172
- setSeedLoading(false);
173
- }
174
- };
175
-
176
- // --- Assess ---
177
- const handleAssess = async () => {
178
- if (!workspaceId) return;
179
- setAssessLoading(true);
180
- setError('');
181
- setAssessResult(null);
182
- try {
183
- const res = await fetch(
184
- api(`/api/cortex/curation/assess?workspace_id=${encodeURIComponent(workspaceId)}`),
185
- );
186
- const data = await res.json();
187
- if (!res.ok) throw new Error(data.error || data.message || 'Assessment failed');
188
- setAssessResult(data);
189
- } catch (e) {
190
- setError(e instanceof Error ? e.message : 'Assessment failed');
191
- } finally {
192
- setAssessLoading(false);
193
- }
194
- };
195
-
196
- // --- Review ---
197
- const handleReview = async () => {
198
- if (!workspaceId || !reviewTopic.trim()) return;
199
- setReviewLoading(true);
200
- setError('');
201
- setReviewResult(null);
202
- try {
203
- const params = new URLSearchParams({ workspace_id: workspaceId, topic: reviewTopic.trim(), limit: reviewLimit });
204
- const res = await fetch(api(`/api/cortex/curation/review?${params}`));
205
- const data = await res.json();
206
- if (!res.ok) throw new Error(data.error || data.message || 'Review failed');
207
- setReviewResult(data);
208
- } catch (e) {
209
- setError(e instanceof Error ? e.message : 'Review failed');
210
- } finally {
211
- setReviewLoading(false);
212
- }
213
- };
214
-
215
- // --- Refine ---
216
- const handleRefine = async () => {
217
- if (!workspaceId) return;
218
- setRefineLoading(true);
219
- setError('');
220
- setRefineResult(null);
221
- try {
222
- const types = (Object.keys(refineTypes) as Array<keyof typeof refineTypes>).filter(
223
- k => refineTypes[k],
224
- );
225
- const res = await fetch(api('/api/cortex/curation/refine'), {
226
- method: 'POST',
227
- headers: { 'Content-Type': 'application/json' },
228
- body: JSON.stringify({
229
- workspace_id: workspaceId,
230
- domain_context: refineDomainContext || undefined,
231
- types,
232
- }),
233
- });
234
- const data = await res.json();
235
- if (!res.ok) throw new Error(data.error || data.message || 'Refine failed');
236
- setRefineResult(data);
237
- } catch (e) {
238
- setError(e instanceof Error ? e.message : 'Refine failed');
239
- } finally {
240
- setRefineLoading(false);
241
- }
242
- };
243
-
244
- // --- Publish ---
245
- const handlePublish = async () => {
246
- if (!workspaceId || !publishName.trim()) return;
247
- setPublishLoading(true);
248
- setError('');
249
- setPublishResult(null);
250
- try {
251
- const res = await fetch(api('/api/cortex/curation/publish'), {
252
- method: 'POST',
253
- headers: { 'Content-Type': 'application/json' },
254
- body: JSON.stringify({
255
- workspace_id: workspaceId,
256
- name: publishName,
257
- author: publishAuthor || undefined,
258
- description: publishDescription || undefined,
259
- tags: publishTags
260
- ? publishTags
261
- .split(',')
262
- .map(t => t.trim())
263
- .filter(Boolean)
264
- : [],
265
- version: publishVersion,
266
- license: publishLicense,
267
- }),
268
- });
269
- const data = await res.json();
270
- if (!res.ok) throw new Error(data.error || data.message || 'Publish failed');
271
- setPublishResult(data);
272
- } catch (e) {
273
- setError(e instanceof Error ? e.message : 'Publish failed');
274
- } finally {
275
- setPublishLoading(false);
276
- }
277
- };
278
-
279
- const inputClass =
280
- 'w-full px-3 py-2 text-sm bg-white/5 border border-white/10 rounded-lg text-gray-300 placeholder-gray-600 focus:outline-none focus:border-purple-500/50';
281
- const labelClass = 'text-[11px] text-gray-500 mb-1 block';
282
- const resultPanelClass = 'bg-white/[0.02] border border-white/[0.06] rounded-lg p-4';
283
-
284
- const coverageColor = (score: number) =>
285
- score > 0.7 ? 'text-green-400' : score > 0.3 ? 'text-amber-400' : 'text-red-400';
286
-
287
- return (
288
- <div className="flex flex-col h-full">
289
- {/* Workspace selector */}
290
- <div className="px-4 pt-4 pb-3 border-b border-white/5">
291
- <label className={labelClass}>Workspace</label>
292
- <select
293
- value={workspaceId}
294
- onChange={e => handleWorkspaceChange(e.target.value)}
295
- className={`${inputClass} max-w-xs`}
296
- >
297
- {workspaces.length === 0 && (
298
- <option value="" disabled>
299
- No workspaces found
300
- </option>
301
- )}
302
- {workspaces.map(ws => (
303
- <option key={ws.id} value={ws.id}>
304
- {ws.name}
305
- </option>
306
- ))}
307
- </select>
308
- </div>
309
-
310
- {/* Pipeline bar */}
311
- <div className="px-4 py-3 border-b border-white/5">
312
- <div className="flex items-center">
313
- {STEPS.map((step, idx) => (
314
- <div key={step.id} className="flex items-center">
315
- <button
316
- onClick={() => handleStepChange(step.id)}
317
- className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium border transition-colors ${
318
- activeStep === step.id
319
- ? 'bg-purple-500/20 border-purple-500/30 text-purple-400'
320
- : 'bg-white/[0.03] border-white/[0.06] text-gray-500 hover:text-gray-300 hover:bg-white/[0.06]'
321
- }`}
322
- >
323
- {step.icon}
324
- {step.label}
325
- </button>
326
- {idx < STEPS.length - 1 && <div className="w-8 h-px bg-white/[0.06]" />}
327
- </div>
328
- ))}
329
- </div>
330
- </div>
331
-
332
- {/* Step content */}
333
- <div className="flex-1 overflow-y-auto p-4">
334
- <div className="max-w-2xl space-y-4">
335
- {/* Error banner */}
336
- {error && (
337
- <div className="bg-red-500/10 border border-red-500/20 text-red-400 rounded-lg px-4 py-2.5 text-sm">
338
- {error}
339
- </div>
340
- )}
341
-
342
- {/* SEED */}
343
- {activeStep === 'seed' && (
344
- <div className="space-y-3">
345
- <div>
346
- <label className={labelClass}>Document content</label>
347
- <textarea
348
- value={seedText}
349
- onChange={e => setSeedText(e.target.value)}
350
- placeholder="Paste document content here..."
351
- rows={8}
352
- className={inputClass}
353
- />
354
- </div>
355
- <div className="grid grid-cols-2 gap-3">
356
- <div>
357
- <label className={labelClass}>Format</label>
358
- <select
359
- value={seedFormat}
360
- onChange={e => setSeedFormat(e.target.value)}
361
- className={inputClass}
362
- >
363
- <option value="auto">Auto-detect</option>
364
- <option value="markdown">Markdown</option>
365
- <option value="plaintext">Plain text</option>
366
- <option value="csv">CSV</option>
367
- </select>
368
- </div>
369
- <div>
370
- <label className={labelClass}>Source reference</label>
371
- <input
372
- value={seedSourceRef}
373
- onChange={e => setSeedSourceRef(e.target.value)}
374
- placeholder="e.g. docs/guide.md"
375
- className={inputClass}
376
- />
377
- </div>
378
- </div>
379
- <label className="flex items-center gap-2 cursor-pointer select-none">
380
- <input
381
- type="checkbox"
382
- checked={seedDistill}
383
- onChange={e => setSeedDistill(e.target.checked)}
384
- className="rounded border-white/20 bg-white/5 accent-purple-500"
385
- />
386
- <span className="text-xs text-gray-400">Distill after seeding</span>
387
- </label>
388
- <button
389
- onClick={handleSeed}
390
- disabled={seedLoading || !seedText.trim() || !workspaceId}
391
- className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
392
- >
393
- {seedLoading ? (
394
- <Loader2 className="w-4 h-4 animate-spin" />
395
- ) : (
396
- <Upload className="w-4 h-4" />
397
- )}
398
- Seed Documents
399
- </button>
400
-
401
- {seedResult && (
402
- <div className={resultPanelClass}>
403
- <div className="text-xs font-medium text-gray-400 mb-3">Seed Results</div>
404
- <div className="grid grid-cols-3 gap-3">
405
- <div>
406
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Chunks Created</div>
407
- <div className="text-lg font-semibold text-green-400 tabular-nums">
408
- {seedResult.chunksCreated}
409
- </div>
410
- </div>
411
- <div>
412
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Chunks Skipped</div>
413
- <div className="text-lg font-semibold text-amber-400 tabular-nums">
414
- {seedResult.chunksSkipped}
415
- </div>
416
- </div>
417
- <div>
418
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Errors</div>
419
- <div
420
- className={`text-lg font-semibold tabular-nums ${
421
- seedResult.errors.length > 0 ? 'text-red-400' : 'text-gray-500'
422
- }`}
423
- >
424
- {seedResult.errors.length}
425
- </div>
426
- </div>
427
- </div>
428
- {seedResult.errors.length > 0 && (
429
- <div className="mt-3 space-y-1">
430
- {seedResult.errors.map((err, i) => (
431
- <div key={i} className="text-xs text-red-400/80">
432
- {err}
433
- </div>
434
- ))}
435
- </div>
436
- )}
437
- </div>
438
- )}
439
- </div>
440
- )}
441
-
442
- {/* ASSESS */}
443
- {activeStep === 'assess' && (
444
- <div className="space-y-3">
445
- <button
446
- onClick={handleAssess}
447
- disabled={assessLoading || !workspaceId}
448
- className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
449
- >
450
- {assessLoading ? (
451
- <Loader2 className="w-4 h-4 animate-spin" />
452
- ) : (
453
- <BarChart3 className="w-4 h-4" />
454
- )}
455
- Run Assessment
456
- </button>
457
-
458
- {assessResult && (
459
- <div className="space-y-3">
460
- <div className="grid grid-cols-3 gap-3">
461
- <div className={resultPanelClass}>
462
- <div className="text-[10px] text-gray-500 uppercase mb-1">Coverage Score</div>
463
- <div
464
- className={`text-2xl font-semibold tabular-nums ${coverageColor(assessResult.coverage_score)}`}
465
- >
466
- {assessResult.coverage_score.toFixed(2)}
467
- </div>
468
- <div className="text-[10px] text-gray-600 mt-0.5">
469
- {Math.round(assessResult.coverage_score * 100)}% covered
470
- </div>
471
- </div>
472
- <div className={resultPanelClass}>
473
- <div className="text-[10px] text-gray-500 uppercase mb-1">Total Units</div>
474
- <div className="text-2xl font-semibold text-white tabular-nums">
475
- {assessResult.total_units.toLocaleString()}
476
- </div>
477
- </div>
478
- <div className={resultPanelClass}>
479
- <div className="text-[10px] text-gray-500 uppercase mb-1">Stale Count</div>
480
- <div
481
- className={`text-2xl font-semibold tabular-nums ${
482
- assessResult.stale_count > 10 ? 'text-amber-400' : 'text-gray-300'
483
- }`}
484
- >
485
- {assessResult.stale_count}
486
- </div>
487
- </div>
488
- </div>
489
-
490
- {assessResult.type_distribution &&
491
- Object.keys(assessResult.type_distribution).length > 0 && (
492
- <div className={resultPanelClass}>
493
- <div className="text-xs font-medium text-gray-400 mb-3">Type Distribution</div>
494
- <div className="space-y-1.5">
495
- {Object.entries(assessResult.type_distribution)
496
- .sort((a, b) => b[1] - a[1])
497
- .map(([type, count]) => {
498
- const max = Math.max(
499
- ...Object.values(assessResult.type_distribution),
500
- 1,
501
- );
502
- return (
503
- <div key={type} className="flex items-center gap-2">
504
- <span className="text-[10px] text-gray-500 w-24 text-right truncate">
505
- {type.replace('_', ' ')}
506
- </span>
507
- <div className="flex-1 h-3 bg-white/[0.03] rounded-full overflow-hidden">
508
- <div
509
- className="h-full rounded-full transition-all duration-500"
510
- style={{
511
- width: `${Math.max(2, (count / max) * 100)}%`,
512
- backgroundColor: TYPE_HEX[type] || '#7c3aed',
513
- }}
514
- />
515
- </div>
516
- <span className="text-[10px] text-gray-400 w-10 text-right tabular-nums">
517
- {count}
518
- </span>
519
- </div>
520
- );
521
- })}
522
- </div>
523
- </div>
524
- )}
525
- </div>
526
- )}
527
- </div>
528
- )}
529
-
530
- {/* REVIEW */}
531
- {activeStep === 'review' && (
532
- <div className="space-y-3">
533
- <div className="flex gap-3">
534
- <div className="flex-1">
535
- <label className={labelClass}>Topic filter</label>
536
- <input
537
- value={reviewTopic}
538
- onChange={e => setReviewTopic(e.target.value)}
539
- onKeyDown={e => e.key === 'Enter' && handleReview()}
540
- placeholder="Filter by topic (optional)"
541
- className={inputClass}
542
- />
543
- </div>
544
- <div className="w-28">
545
- <label className={labelClass}>Limit</label>
546
- <select
547
- value={reviewLimit}
548
- onChange={e => setReviewLimit(e.target.value)}
549
- className={inputClass}
550
- >
551
- <option value="10">10</option>
552
- <option value="25">25</option>
553
- <option value="50">50</option>
554
- </select>
555
- </div>
556
- </div>
557
- <button
558
- onClick={handleReview}
559
- disabled={reviewLoading || !workspaceId || !reviewTopic.trim()}
560
- className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
561
- >
562
- {reviewLoading ? (
563
- <Loader2 className="w-4 h-4 animate-spin" />
564
- ) : (
565
- <Search className="w-4 h-4" />
566
- )}
567
- Review
568
- </button>
569
-
570
- {reviewResult && (
571
- <div className="space-y-2">
572
- <div className="text-[11px] text-gray-500">
573
- {reviewResult.total_matches} match
574
- {reviewResult.total_matches !== 1 ? 'es' : ''} for &ldquo;{reviewResult.topic}&rdquo;
575
- </div>
576
- {Object.entries(reviewResult.by_type).map(([type, items]) => (
577
- <details key={type} open className={resultPanelClass}>
578
- <summary className="flex items-center gap-2 cursor-pointer list-none">
579
- <span
580
- className={`text-[10px] px-1.5 py-0.5 rounded font-medium ${
581
- TYPE_COLORS[type] || TYPE_COLORS.context
582
- }`}
583
- >
584
- {type.replace('_', ' ')}
585
- </span>
586
- <span className="text-xs text-gray-500">
587
- {items.length} unit{items.length !== 1 ? 's' : ''}
588
- </span>
589
- </summary>
590
- <div className="mt-3 space-y-2">
591
- {items.map((item, i) => (
592
- <div
593
- key={i}
594
- className="bg-white/[0.02] border border-white/[0.04] rounded px-3 py-2"
595
- >
596
- <div className="text-xs text-gray-300 leading-relaxed">{item.text}</div>
597
- <div className="mt-1 text-[10px] text-gray-600">
598
- confidence: {item.confidence?.toFixed(2)} · similarity: {item.similarity?.toFixed(3)}
599
- </div>
600
- </div>
601
- ))}
602
- </div>
603
- </details>
604
- ))}
605
- </div>
606
- )}
607
- </div>
608
- )}
609
-
610
- {/* REFINE */}
611
- {activeStep === 'refine' && (
612
- <div className="space-y-3">
613
- <div className="bg-amber-500/10 border border-amber-500/20 text-amber-400 rounded-lg px-4 py-2.5 text-xs leading-relaxed">
614
- Refine uses LLM distillation and requires an API key configured in Cortex settings.
615
- Without a key, refinement will run in passthrough mode.
616
- </div>
617
-
618
- <div>
619
- <label className={labelClass}>Domain context</label>
620
- <textarea
621
- value={refineDomainContext}
622
- onChange={e => setRefineDomainContext(e.target.value)}
623
- placeholder="Describe the domain or project context to guide distillation..."
624
- rows={4}
625
- className={inputClass}
626
- />
627
- </div>
628
-
629
- <div>
630
- <label className={labelClass}>Distillation passes</label>
631
- <div className="grid grid-cols-2 gap-2">
632
- {(Object.keys(refineTypes) as Array<keyof typeof refineTypes>).map(key => (
633
- <label key={key} className="flex items-center gap-2 cursor-pointer select-none">
634
- <input
635
- type="checkbox"
636
- checked={refineTypes[key]}
637
- onChange={e =>
638
- setRefineTypes(prev => ({ ...prev, [key]: e.target.checked }))
639
- }
640
- className="rounded border-white/20 bg-white/5 accent-purple-500"
641
- />
642
- <span className="text-xs text-gray-400 capitalize">
643
- {key.replace('_', ' ')}
644
- </span>
645
- </label>
646
- ))}
647
- </div>
648
- </div>
649
-
650
- <button
651
- onClick={handleRefine}
652
- disabled={refineLoading || !workspaceId}
653
- className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
654
- >
655
- {refineLoading ? (
656
- <Loader2 className="w-4 h-4 animate-spin" />
657
- ) : (
658
- <RefreshCw className="w-4 h-4" />
659
- )}
660
- Refine Lobe
661
- </button>
662
-
663
- {refineResult && (
664
- <div className={resultPanelClass}>
665
- <div className="text-xs font-medium text-gray-400 mb-3">Refine Results</div>
666
- <div className="grid grid-cols-3 gap-3">
667
- <div>
668
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Source Units</div>
669
- <div className="text-lg font-semibold text-white tabular-nums">
670
- {refineResult.source_units_found}
671
- </div>
672
- </div>
673
- <div>
674
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Purged</div>
675
- <div className="text-lg font-semibold text-amber-400 tabular-nums">
676
- {refineResult.distilled_purged}
677
- </div>
678
- </div>
679
- <div>
680
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">New Units</div>
681
- <div className="text-lg font-semibold text-green-400 tabular-nums">
682
- {refineResult.new_units_created}
683
- </div>
684
- </div>
685
- </div>
686
- </div>
687
- )}
688
- </div>
689
- )}
690
-
691
- {/* PUBLISH */}
692
- {activeStep === 'publish' && (
693
- <div className="space-y-3">
694
- <div className="grid grid-cols-2 gap-3">
695
- <div>
696
- <label className={labelClass}>Package name *</label>
697
- <input
698
- value={publishName}
699
- onChange={e => setPublishName(e.target.value)}
700
- placeholder="my-knowledge-pack"
701
- className={inputClass}
702
- />
703
- </div>
704
- <div>
705
- <label className={labelClass}>Author</label>
706
- <input
707
- value={publishAuthor}
708
- onChange={e => setPublishAuthor(e.target.value)}
709
- placeholder="Your name or org"
710
- className={inputClass}
711
- />
712
- </div>
713
- </div>
714
- <div>
715
- <label className={labelClass}>Description</label>
716
- <textarea
717
- value={publishDescription}
718
- onChange={e => setPublishDescription(e.target.value)}
719
- placeholder="Describe the knowledge pack..."
720
- rows={3}
721
- className={inputClass}
722
- />
723
- </div>
724
- <div>
725
- <label className={labelClass}>Tags (comma-separated)</label>
726
- <input
727
- value={publishTags}
728
- onChange={e => setPublishTags(e.target.value)}
729
- placeholder="e.g. typescript, react, patterns"
730
- className={inputClass}
731
- />
732
- </div>
733
- <div className="grid grid-cols-2 gap-3">
734
- <div>
735
- <label className={labelClass}>Version</label>
736
- <input
737
- value={publishVersion}
738
- onChange={e => setPublishVersion(e.target.value)}
739
- placeholder="1.0.0"
740
- className={inputClass}
741
- />
742
- </div>
743
- <div>
744
- <label className={labelClass}>License</label>
745
- <select
746
- value={publishLicense}
747
- onChange={e => setPublishLicense(e.target.value)}
748
- className={inputClass}
749
- >
750
- <option value="MIT">MIT</option>
751
- <option value="Apache-2.0">Apache 2.0</option>
752
- <option value="GPL-3.0">GPL 3.0</option>
753
- <option value="BSD-3-Clause">BSD 3-Clause</option>
754
- <option value="CC-BY-4.0">CC BY 4.0</option>
755
- <option value="Proprietary">Proprietary</option>
756
- </select>
757
- </div>
758
- </div>
759
-
760
- <button
761
- onClick={handlePublish}
762
- disabled={publishLoading || !publishName.trim() || !workspaceId}
763
- className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
764
- >
765
- {publishLoading ? (
766
- <Loader2 className="w-4 h-4 animate-spin" />
767
- ) : (
768
- <Package className="w-4 h-4" />
769
- )}
770
- Publish to Marketplace
771
- </button>
772
-
773
- {publishResult && (
774
- <div className={resultPanelClass}>
775
- {publishResult.quality_warning && (
776
- <div className="mb-3 bg-amber-500/10 border border-amber-500/20 text-amber-400 rounded px-3 py-2 text-xs">
777
- {publishResult.quality_warning}
778
- </div>
779
- )}
780
- <div className="text-xs font-medium text-gray-400 mb-3">Published</div>
781
- {publishResult.output_path && (
782
- <div className="mb-2">
783
- <div className="text-[10px] text-gray-500 uppercase mb-0.5">Output Path</div>
784
- <div className="text-xs text-gray-300 font-mono break-all">
785
- {publishResult.output_path}
786
- </div>
787
- </div>
788
- )}
789
- {publishResult.pii_scrub && (
790
- <div className="mt-2 pt-2 border-t border-white/[0.06]">
791
- <div className="text-[10px] text-gray-500 uppercase mb-1">PII Scrub</div>
792
- <div className="flex gap-4 text-[11px] text-gray-400">
793
- <span>
794
- {publishResult.pii_scrub.records_checked.toLocaleString()} records checked
795
- </span>
796
- <span>
797
- {publishResult.pii_scrub.fields_scrubbed.toLocaleString()} fields scrubbed
798
- </span>
799
- </div>
800
- </div>
801
- )}
802
- </div>
803
- )}
804
- </div>
805
- )}
806
- </div>
807
- </div>
808
- </div>
809
- );
810
- }
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useCallback } from 'react';
4
+ import { Upload, BarChart3, Search, RefreshCw, Package, Loader2 } from 'lucide-react';
5
+ import { api } from '@/lib/api';
6
+ import { TYPE_COLORS } from './constants';
7
+
8
+ type Step = 'seed' | 'assess' | 'review' | 'refine' | 'publish';
9
+
10
+ interface Workspace {
11
+ id: string;
12
+ name: string;
13
+ color: string;
14
+ }
15
+
16
+ interface SeedResult {
17
+ chunksCreated: number;
18
+ chunksSkipped: number;
19
+ errors: string[];
20
+ }
21
+
22
+ interface AssessResult {
23
+ coverage_score: number;
24
+ total_units: number;
25
+ stale_count: number;
26
+ type_distribution: Record<string, number>;
27
+ }
28
+
29
+ interface ReviewItem {
30
+ text: string;
31
+ confidence: number;
32
+ similarity: number;
33
+ }
34
+
35
+ interface ReviewResult {
36
+ topic: string;
37
+ total_matches: number;
38
+ by_type: Record<string, ReviewItem[]>;
39
+ }
40
+
41
+ interface RefineResult {
42
+ source_units_found: number;
43
+ distilled_purged: number;
44
+ new_units_created: number;
45
+ }
46
+
47
+ interface PublishResult {
48
+ quality_warning?: string;
49
+ output_path?: string;
50
+ pii_scrub?: { fields_scrubbed: number; records_checked: number };
51
+ }
52
+
53
+ const STEPS: { id: Step; label: string; icon: React.ReactNode }[] = [
54
+ { id: 'seed', label: 'Seed', icon: <Upload className="w-3.5 h-3.5" /> },
55
+ { id: 'assess', label: 'Assess', icon: <BarChart3 className="w-3.5 h-3.5" /> },
56
+ { id: 'review', label: 'Review', icon: <Search className="w-3.5 h-3.5" /> },
57
+ { id: 'refine', label: 'Refine', icon: <RefreshCw className="w-3.5 h-3.5" /> },
58
+ { id: 'publish', label: 'Publish', icon: <Package className="w-3.5 h-3.5" /> },
59
+ ];
60
+
61
+ const TYPE_HEX: Record<string, string> = {
62
+ decision: '#3b82f6',
63
+ pattern: '#22c55e',
64
+ preference: '#ec4899',
65
+ error_fix: '#f59e0b',
66
+ context: '#6b7280',
67
+ code_pattern: '#06b6d4',
68
+ command: '#f97316',
69
+ conversation: '#64748b',
70
+ summary: '#8b5cf6',
71
+ };
72
+
73
+
74
+ export function CurationTab() {
75
+ const [workspaces, setWorkspaces] = useState<Workspace[]>([]);
76
+ const [workspaceId, setWorkspaceId] = useState('');
77
+ const [activeStep, setActiveStep] = useState<Step>('seed');
78
+ const [error, setError] = useState('');
79
+
80
+ // Seed state
81
+ const [seedText, setSeedText] = useState('');
82
+ const [seedFormat, setSeedFormat] = useState('auto');
83
+ const [seedSourceRef, setSeedSourceRef] = useState('');
84
+ const [seedDistill, setSeedDistill] = useState(true);
85
+ const [seedLoading, setSeedLoading] = useState(false);
86
+ const [seedResult, setSeedResult] = useState<SeedResult | null>(null);
87
+
88
+ // Assess state
89
+ const [assessLoading, setAssessLoading] = useState(false);
90
+ const [assessResult, setAssessResult] = useState<AssessResult | null>(null);
91
+
92
+ // Review state
93
+ const [reviewTopic, setReviewTopic] = useState('');
94
+ const [reviewLimit, setReviewLimit] = useState('25');
95
+ const [reviewLoading, setReviewLoading] = useState(false);
96
+ const [reviewResult, setReviewResult] = useState<ReviewResult | null>(null);
97
+
98
+ // Refine state
99
+ const [refineDomainContext, setRefineDomainContext] = useState('');
100
+ const [refineTypes, setRefineTypes] = useState({
101
+ decisions: true,
102
+ patterns: true,
103
+ preferences: true,
104
+ error_fixes: true,
105
+ });
106
+ const [refineLoading, setRefineLoading] = useState(false);
107
+ const [refineResult, setRefineResult] = useState<RefineResult | null>(null);
108
+
109
+ // Publish state
110
+ const [publishName, setPublishName] = useState('');
111
+ const [publishAuthor, setPublishAuthor] = useState('');
112
+ const [publishDescription, setPublishDescription] = useState('');
113
+ const [publishTags, setPublishTags] = useState('');
114
+ const [publishVersion, setPublishVersion] = useState('1.0.0');
115
+ const [publishLicense, setPublishLicense] = useState('MIT');
116
+ const [publishLoading, setPublishLoading] = useState(false);
117
+ const [publishResult, setPublishResult] = useState<PublishResult | null>(null);
118
+
119
+ const clearStepResults = useCallback(() => {
120
+ setSeedResult(null);
121
+ setAssessResult(null);
122
+ setReviewResult(null);
123
+ setRefineResult(null);
124
+ setPublishResult(null);
125
+ setError('');
126
+ }, []);
127
+
128
+ useEffect(() => {
129
+ fetch(api('/api/workspaces'))
130
+ .then(r => r.json())
131
+ .then((data: Workspace[]) => {
132
+ setWorkspaces(data);
133
+ if (data.length > 0) setWorkspaceId(data[0].id);
134
+ })
135
+ .catch(() => {});
136
+ }, []);
137
+
138
+ const handleStepChange = (step: Step) => {
139
+ setActiveStep(step);
140
+ clearStepResults();
141
+ };
142
+
143
+ const handleWorkspaceChange = (id: string) => {
144
+ setWorkspaceId(id);
145
+ clearStepResults();
146
+ };
147
+
148
+ // --- Seed ---
149
+ const handleSeed = async () => {
150
+ if (!seedText.trim() || !workspaceId) return;
151
+ setSeedLoading(true);
152
+ setError('');
153
+ setSeedResult(null);
154
+ try {
155
+ const res = await fetch(api('/api/cortex/curation/seed'), {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/json' },
158
+ body: JSON.stringify({
159
+ text: seedText,
160
+ format: seedFormat,
161
+ source_ref: seedSourceRef || undefined,
162
+ workspace_id: workspaceId,
163
+ distill: seedDistill,
164
+ }),
165
+ });
166
+ const data = await res.json();
167
+ if (!res.ok) throw new Error(data.error || data.message || 'Seed failed');
168
+ setSeedResult(data);
169
+ } catch (e) {
170
+ setError(e instanceof Error ? e.message : 'Seed failed');
171
+ } finally {
172
+ setSeedLoading(false);
173
+ }
174
+ };
175
+
176
+ // --- Assess ---
177
+ const handleAssess = async () => {
178
+ if (!workspaceId) return;
179
+ setAssessLoading(true);
180
+ setError('');
181
+ setAssessResult(null);
182
+ try {
183
+ const res = await fetch(
184
+ api(`/api/cortex/curation/assess?workspace_id=${encodeURIComponent(workspaceId)}`),
185
+ );
186
+ const data = await res.json();
187
+ if (!res.ok) throw new Error(data.error || data.message || 'Assessment failed');
188
+ setAssessResult(data);
189
+ } catch (e) {
190
+ setError(e instanceof Error ? e.message : 'Assessment failed');
191
+ } finally {
192
+ setAssessLoading(false);
193
+ }
194
+ };
195
+
196
+ // --- Review ---
197
+ const handleReview = async () => {
198
+ if (!workspaceId || !reviewTopic.trim()) return;
199
+ setReviewLoading(true);
200
+ setError('');
201
+ setReviewResult(null);
202
+ try {
203
+ const params = new URLSearchParams({ workspace_id: workspaceId, topic: reviewTopic.trim(), limit: reviewLimit });
204
+ const res = await fetch(api(`/api/cortex/curation/review?${params}`));
205
+ const data = await res.json();
206
+ if (!res.ok) throw new Error(data.error || data.message || 'Review failed');
207
+ setReviewResult(data);
208
+ } catch (e) {
209
+ setError(e instanceof Error ? e.message : 'Review failed');
210
+ } finally {
211
+ setReviewLoading(false);
212
+ }
213
+ };
214
+
215
+ // --- Refine ---
216
+ const handleRefine = async () => {
217
+ if (!workspaceId) return;
218
+ setRefineLoading(true);
219
+ setError('');
220
+ setRefineResult(null);
221
+ try {
222
+ const types = (Object.keys(refineTypes) as Array<keyof typeof refineTypes>).filter(
223
+ k => refineTypes[k],
224
+ );
225
+ const res = await fetch(api('/api/cortex/curation/refine'), {
226
+ method: 'POST',
227
+ headers: { 'Content-Type': 'application/json' },
228
+ body: JSON.stringify({
229
+ workspace_id: workspaceId,
230
+ domain_context: refineDomainContext || undefined,
231
+ types,
232
+ }),
233
+ });
234
+ const data = await res.json();
235
+ if (!res.ok) throw new Error(data.error || data.message || 'Refine failed');
236
+ setRefineResult(data);
237
+ } catch (e) {
238
+ setError(e instanceof Error ? e.message : 'Refine failed');
239
+ } finally {
240
+ setRefineLoading(false);
241
+ }
242
+ };
243
+
244
+ // --- Publish ---
245
+ const handlePublish = async () => {
246
+ if (!workspaceId || !publishName.trim()) return;
247
+ setPublishLoading(true);
248
+ setError('');
249
+ setPublishResult(null);
250
+ try {
251
+ const res = await fetch(api('/api/cortex/curation/publish'), {
252
+ method: 'POST',
253
+ headers: { 'Content-Type': 'application/json' },
254
+ body: JSON.stringify({
255
+ workspace_id: workspaceId,
256
+ name: publishName,
257
+ author: publishAuthor || undefined,
258
+ description: publishDescription || undefined,
259
+ tags: publishTags
260
+ ? publishTags
261
+ .split(',')
262
+ .map(t => t.trim())
263
+ .filter(Boolean)
264
+ : [],
265
+ version: publishVersion,
266
+ license: publishLicense,
267
+ }),
268
+ });
269
+ const data = await res.json();
270
+ if (!res.ok) throw new Error(data.error || data.message || 'Publish failed');
271
+ setPublishResult(data);
272
+ } catch (e) {
273
+ setError(e instanceof Error ? e.message : 'Publish failed');
274
+ } finally {
275
+ setPublishLoading(false);
276
+ }
277
+ };
278
+
279
+ const inputClass =
280
+ 'w-full px-3 py-2 text-sm bg-white/5 border border-white/10 rounded-lg text-gray-300 placeholder-gray-600 focus:outline-none focus:border-purple-500/50';
281
+ const labelClass = 'text-[11px] text-gray-500 mb-1 block';
282
+ const resultPanelClass = 'bg-white/[0.02] border border-white/[0.06] rounded-lg p-4';
283
+
284
+ const coverageColor = (score: number) =>
285
+ score > 0.7 ? 'text-green-400' : score > 0.3 ? 'text-amber-400' : 'text-red-400';
286
+
287
+ return (
288
+ <div className="flex flex-col h-full">
289
+ {/* Workspace selector */}
290
+ <div className="px-4 pt-4 pb-3 border-b border-white/5">
291
+ <label className={labelClass}>Workspace</label>
292
+ <select
293
+ value={workspaceId}
294
+ onChange={e => handleWorkspaceChange(e.target.value)}
295
+ className={`${inputClass} max-w-xs`}
296
+ >
297
+ {workspaces.length === 0 && (
298
+ <option value="" disabled>
299
+ No workspaces found
300
+ </option>
301
+ )}
302
+ {workspaces.map(ws => (
303
+ <option key={ws.id} value={ws.id}>
304
+ {ws.name}
305
+ </option>
306
+ ))}
307
+ </select>
308
+ </div>
309
+
310
+ {/* Pipeline bar */}
311
+ <div className="px-4 py-3 border-b border-white/5">
312
+ <div className="flex items-center">
313
+ {STEPS.map((step, idx) => (
314
+ <div key={step.id} className="flex items-center">
315
+ <button
316
+ onClick={() => handleStepChange(step.id)}
317
+ className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium border transition-colors ${
318
+ activeStep === step.id
319
+ ? 'bg-purple-500/20 border-purple-500/30 text-purple-400'
320
+ : 'bg-white/[0.03] border-white/[0.06] text-gray-500 hover:text-gray-300 hover:bg-white/[0.06]'
321
+ }`}
322
+ >
323
+ {step.icon}
324
+ {step.label}
325
+ </button>
326
+ {idx < STEPS.length - 1 && <div className="w-8 h-px bg-white/[0.06]" />}
327
+ </div>
328
+ ))}
329
+ </div>
330
+ </div>
331
+
332
+ {/* Step content */}
333
+ <div className="flex-1 overflow-y-auto p-4">
334
+ <div className="max-w-2xl space-y-4">
335
+ {/* Error banner */}
336
+ {error && (
337
+ <div className="bg-red-500/10 border border-red-500/20 text-red-400 rounded-lg px-4 py-2.5 text-sm">
338
+ {error}
339
+ </div>
340
+ )}
341
+
342
+ {/* SEED */}
343
+ {activeStep === 'seed' && (
344
+ <div className="space-y-3">
345
+ <div>
346
+ <label className={labelClass}>Document content</label>
347
+ <textarea
348
+ value={seedText}
349
+ onChange={e => setSeedText(e.target.value)}
350
+ placeholder="Paste document content here..."
351
+ rows={8}
352
+ className={inputClass}
353
+ />
354
+ </div>
355
+ <div className="grid grid-cols-2 gap-3">
356
+ <div>
357
+ <label className={labelClass}>Format</label>
358
+ <select
359
+ value={seedFormat}
360
+ onChange={e => setSeedFormat(e.target.value)}
361
+ className={inputClass}
362
+ >
363
+ <option value="auto">Auto-detect</option>
364
+ <option value="markdown">Markdown</option>
365
+ <option value="plaintext">Plain text</option>
366
+ <option value="csv">CSV</option>
367
+ </select>
368
+ </div>
369
+ <div>
370
+ <label className={labelClass}>Source reference</label>
371
+ <input
372
+ value={seedSourceRef}
373
+ onChange={e => setSeedSourceRef(e.target.value)}
374
+ placeholder="e.g. docs/guide.md"
375
+ className={inputClass}
376
+ />
377
+ </div>
378
+ </div>
379
+ <label className="flex items-center gap-2 cursor-pointer select-none">
380
+ <input
381
+ type="checkbox"
382
+ checked={seedDistill}
383
+ onChange={e => setSeedDistill(e.target.checked)}
384
+ className="rounded border-white/20 bg-white/5 accent-purple-500"
385
+ />
386
+ <span className="text-xs text-gray-400">Distill after seeding</span>
387
+ </label>
388
+ <button
389
+ onClick={handleSeed}
390
+ disabled={seedLoading || !seedText.trim() || !workspaceId}
391
+ className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
392
+ >
393
+ {seedLoading ? (
394
+ <Loader2 className="w-4 h-4 animate-spin" />
395
+ ) : (
396
+ <Upload className="w-4 h-4" />
397
+ )}
398
+ Seed Documents
399
+ </button>
400
+
401
+ {seedResult && (
402
+ <div className={resultPanelClass}>
403
+ <div className="text-xs font-medium text-gray-400 mb-3">Seed Results</div>
404
+ <div className="grid grid-cols-3 gap-3">
405
+ <div>
406
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Chunks Created</div>
407
+ <div className="text-lg font-semibold text-green-400 tabular-nums">
408
+ {seedResult.chunksCreated}
409
+ </div>
410
+ </div>
411
+ <div>
412
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Chunks Skipped</div>
413
+ <div className="text-lg font-semibold text-amber-400 tabular-nums">
414
+ {seedResult.chunksSkipped}
415
+ </div>
416
+ </div>
417
+ <div>
418
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Errors</div>
419
+ <div
420
+ className={`text-lg font-semibold tabular-nums ${
421
+ seedResult.errors.length > 0 ? 'text-red-400' : 'text-gray-500'
422
+ }`}
423
+ >
424
+ {seedResult.errors.length}
425
+ </div>
426
+ </div>
427
+ </div>
428
+ {seedResult.errors.length > 0 && (
429
+ <div className="mt-3 space-y-1">
430
+ {seedResult.errors.map((err, i) => (
431
+ <div key={i} className="text-xs text-red-400/80">
432
+ {err}
433
+ </div>
434
+ ))}
435
+ </div>
436
+ )}
437
+ </div>
438
+ )}
439
+ </div>
440
+ )}
441
+
442
+ {/* ASSESS */}
443
+ {activeStep === 'assess' && (
444
+ <div className="space-y-3">
445
+ <button
446
+ onClick={handleAssess}
447
+ disabled={assessLoading || !workspaceId}
448
+ className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
449
+ >
450
+ {assessLoading ? (
451
+ <Loader2 className="w-4 h-4 animate-spin" />
452
+ ) : (
453
+ <BarChart3 className="w-4 h-4" />
454
+ )}
455
+ Run Assessment
456
+ </button>
457
+
458
+ {assessResult && (
459
+ <div className="space-y-3">
460
+ <div className="grid grid-cols-3 gap-3">
461
+ <div className={resultPanelClass}>
462
+ <div className="text-[10px] text-gray-500 uppercase mb-1">Coverage Score</div>
463
+ <div
464
+ className={`text-2xl font-semibold tabular-nums ${coverageColor(assessResult.coverage_score)}`}
465
+ >
466
+ {assessResult.coverage_score.toFixed(2)}
467
+ </div>
468
+ <div className="text-[10px] text-gray-600 mt-0.5">
469
+ {Math.round(assessResult.coverage_score * 100)}% covered
470
+ </div>
471
+ </div>
472
+ <div className={resultPanelClass}>
473
+ <div className="text-[10px] text-gray-500 uppercase mb-1">Total Units</div>
474
+ <div className="text-2xl font-semibold text-white tabular-nums">
475
+ {assessResult.total_units.toLocaleString()}
476
+ </div>
477
+ </div>
478
+ <div className={resultPanelClass}>
479
+ <div className="text-[10px] text-gray-500 uppercase mb-1">Stale Count</div>
480
+ <div
481
+ className={`text-2xl font-semibold tabular-nums ${
482
+ assessResult.stale_count > 10 ? 'text-amber-400' : 'text-gray-300'
483
+ }`}
484
+ >
485
+ {assessResult.stale_count}
486
+ </div>
487
+ </div>
488
+ </div>
489
+
490
+ {assessResult.type_distribution &&
491
+ Object.keys(assessResult.type_distribution).length > 0 && (
492
+ <div className={resultPanelClass}>
493
+ <div className="text-xs font-medium text-gray-400 mb-3">Type Distribution</div>
494
+ <div className="space-y-1.5">
495
+ {Object.entries(assessResult.type_distribution)
496
+ .sort((a, b) => b[1] - a[1])
497
+ .map(([type, count]) => {
498
+ const max = Math.max(
499
+ ...Object.values(assessResult.type_distribution),
500
+ 1,
501
+ );
502
+ return (
503
+ <div key={type} className="flex items-center gap-2">
504
+ <span className="text-[10px] text-gray-500 w-24 text-right truncate">
505
+ {type.replace('_', ' ')}
506
+ </span>
507
+ <div className="flex-1 h-3 bg-white/[0.03] rounded-full overflow-hidden">
508
+ <div
509
+ className="h-full rounded-full transition-all duration-500"
510
+ style={{
511
+ width: `${Math.max(2, (count / max) * 100)}%`,
512
+ backgroundColor: TYPE_HEX[type] || '#7c3aed',
513
+ }}
514
+ />
515
+ </div>
516
+ <span className="text-[10px] text-gray-400 w-10 text-right tabular-nums">
517
+ {count}
518
+ </span>
519
+ </div>
520
+ );
521
+ })}
522
+ </div>
523
+ </div>
524
+ )}
525
+ </div>
526
+ )}
527
+ </div>
528
+ )}
529
+
530
+ {/* REVIEW */}
531
+ {activeStep === 'review' && (
532
+ <div className="space-y-3">
533
+ <div className="flex gap-3">
534
+ <div className="flex-1">
535
+ <label className={labelClass}>Topic filter</label>
536
+ <input
537
+ value={reviewTopic}
538
+ onChange={e => setReviewTopic(e.target.value)}
539
+ onKeyDown={e => e.key === 'Enter' && handleReview()}
540
+ placeholder="Filter by topic (optional)"
541
+ className={inputClass}
542
+ />
543
+ </div>
544
+ <div className="w-28">
545
+ <label className={labelClass}>Limit</label>
546
+ <select
547
+ value={reviewLimit}
548
+ onChange={e => setReviewLimit(e.target.value)}
549
+ className={inputClass}
550
+ >
551
+ <option value="10">10</option>
552
+ <option value="25">25</option>
553
+ <option value="50">50</option>
554
+ </select>
555
+ </div>
556
+ </div>
557
+ <button
558
+ onClick={handleReview}
559
+ disabled={reviewLoading || !workspaceId || !reviewTopic.trim()}
560
+ className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
561
+ >
562
+ {reviewLoading ? (
563
+ <Loader2 className="w-4 h-4 animate-spin" />
564
+ ) : (
565
+ <Search className="w-4 h-4" />
566
+ )}
567
+ Review
568
+ </button>
569
+
570
+ {reviewResult && (
571
+ <div className="space-y-2">
572
+ <div className="text-[11px] text-gray-500">
573
+ {reviewResult.total_matches} match
574
+ {reviewResult.total_matches !== 1 ? 'es' : ''} for &ldquo;{reviewResult.topic}&rdquo;
575
+ </div>
576
+ {Object.entries(reviewResult.by_type).map(([type, items]) => (
577
+ <details key={type} open className={resultPanelClass}>
578
+ <summary className="flex items-center gap-2 cursor-pointer list-none">
579
+ <span
580
+ className={`text-[10px] px-1.5 py-0.5 rounded font-medium ${
581
+ TYPE_COLORS[type] || TYPE_COLORS.context
582
+ }`}
583
+ >
584
+ {type.replace('_', ' ')}
585
+ </span>
586
+ <span className="text-xs text-gray-500">
587
+ {items.length} unit{items.length !== 1 ? 's' : ''}
588
+ </span>
589
+ </summary>
590
+ <div className="mt-3 space-y-2">
591
+ {items.map((item, i) => (
592
+ <div
593
+ key={i}
594
+ className="bg-white/[0.02] border border-white/[0.04] rounded px-3 py-2"
595
+ >
596
+ <div className="text-xs text-gray-300 leading-relaxed">{item.text}</div>
597
+ <div className="mt-1 text-[10px] text-gray-600">
598
+ confidence: {item.confidence?.toFixed(2)} · similarity: {item.similarity?.toFixed(3)}
599
+ </div>
600
+ </div>
601
+ ))}
602
+ </div>
603
+ </details>
604
+ ))}
605
+ </div>
606
+ )}
607
+ </div>
608
+ )}
609
+
610
+ {/* REFINE */}
611
+ {activeStep === 'refine' && (
612
+ <div className="space-y-3">
613
+ <div className="bg-amber-500/10 border border-amber-500/20 text-amber-400 rounded-lg px-4 py-2.5 text-xs leading-relaxed">
614
+ Refine uses LLM distillation and requires an API key configured in Cortex settings.
615
+ Without a key, refinement will run in passthrough mode.
616
+ </div>
617
+
618
+ <div>
619
+ <label className={labelClass}>Domain context</label>
620
+ <textarea
621
+ value={refineDomainContext}
622
+ onChange={e => setRefineDomainContext(e.target.value)}
623
+ placeholder="Describe the domain or project context to guide distillation..."
624
+ rows={4}
625
+ className={inputClass}
626
+ />
627
+ </div>
628
+
629
+ <div>
630
+ <label className={labelClass}>Distillation passes</label>
631
+ <div className="grid grid-cols-2 gap-2">
632
+ {(Object.keys(refineTypes) as Array<keyof typeof refineTypes>).map(key => (
633
+ <label key={key} className="flex items-center gap-2 cursor-pointer select-none">
634
+ <input
635
+ type="checkbox"
636
+ checked={refineTypes[key]}
637
+ onChange={e =>
638
+ setRefineTypes(prev => ({ ...prev, [key]: e.target.checked }))
639
+ }
640
+ className="rounded border-white/20 bg-white/5 accent-purple-500"
641
+ />
642
+ <span className="text-xs text-gray-400 capitalize">
643
+ {key.replace('_', ' ')}
644
+ </span>
645
+ </label>
646
+ ))}
647
+ </div>
648
+ </div>
649
+
650
+ <button
651
+ onClick={handleRefine}
652
+ disabled={refineLoading || !workspaceId}
653
+ className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
654
+ >
655
+ {refineLoading ? (
656
+ <Loader2 className="w-4 h-4 animate-spin" />
657
+ ) : (
658
+ <RefreshCw className="w-4 h-4" />
659
+ )}
660
+ Refine Lobe
661
+ </button>
662
+
663
+ {refineResult && (
664
+ <div className={resultPanelClass}>
665
+ <div className="text-xs font-medium text-gray-400 mb-3">Refine Results</div>
666
+ <div className="grid grid-cols-3 gap-3">
667
+ <div>
668
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Source Units</div>
669
+ <div className="text-lg font-semibold text-white tabular-nums">
670
+ {refineResult.source_units_found}
671
+ </div>
672
+ </div>
673
+ <div>
674
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Purged</div>
675
+ <div className="text-lg font-semibold text-amber-400 tabular-nums">
676
+ {refineResult.distilled_purged}
677
+ </div>
678
+ </div>
679
+ <div>
680
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">New Units</div>
681
+ <div className="text-lg font-semibold text-green-400 tabular-nums">
682
+ {refineResult.new_units_created}
683
+ </div>
684
+ </div>
685
+ </div>
686
+ </div>
687
+ )}
688
+ </div>
689
+ )}
690
+
691
+ {/* PUBLISH */}
692
+ {activeStep === 'publish' && (
693
+ <div className="space-y-3">
694
+ <div className="grid grid-cols-2 gap-3">
695
+ <div>
696
+ <label className={labelClass}>Package name *</label>
697
+ <input
698
+ value={publishName}
699
+ onChange={e => setPublishName(e.target.value)}
700
+ placeholder="my-knowledge-pack"
701
+ className={inputClass}
702
+ />
703
+ </div>
704
+ <div>
705
+ <label className={labelClass}>Author</label>
706
+ <input
707
+ value={publishAuthor}
708
+ onChange={e => setPublishAuthor(e.target.value)}
709
+ placeholder="Your name or org"
710
+ className={inputClass}
711
+ />
712
+ </div>
713
+ </div>
714
+ <div>
715
+ <label className={labelClass}>Description</label>
716
+ <textarea
717
+ value={publishDescription}
718
+ onChange={e => setPublishDescription(e.target.value)}
719
+ placeholder="Describe the knowledge pack..."
720
+ rows={3}
721
+ className={inputClass}
722
+ />
723
+ </div>
724
+ <div>
725
+ <label className={labelClass}>Tags (comma-separated)</label>
726
+ <input
727
+ value={publishTags}
728
+ onChange={e => setPublishTags(e.target.value)}
729
+ placeholder="e.g. typescript, react, patterns"
730
+ className={inputClass}
731
+ />
732
+ </div>
733
+ <div className="grid grid-cols-2 gap-3">
734
+ <div>
735
+ <label className={labelClass}>Version</label>
736
+ <input
737
+ value={publishVersion}
738
+ onChange={e => setPublishVersion(e.target.value)}
739
+ placeholder="1.0.0"
740
+ className={inputClass}
741
+ />
742
+ </div>
743
+ <div>
744
+ <label className={labelClass}>License</label>
745
+ <select
746
+ value={publishLicense}
747
+ onChange={e => setPublishLicense(e.target.value)}
748
+ className={inputClass}
749
+ >
750
+ <option value="MIT">MIT</option>
751
+ <option value="Apache-2.0">Apache 2.0</option>
752
+ <option value="GPL-3.0">GPL 3.0</option>
753
+ <option value="BSD-3-Clause">BSD 3-Clause</option>
754
+ <option value="CC-BY-4.0">CC BY 4.0</option>
755
+ <option value="Proprietary">Proprietary</option>
756
+ </select>
757
+ </div>
758
+ </div>
759
+
760
+ <button
761
+ onClick={handlePublish}
762
+ disabled={publishLoading || !publishName.trim() || !workspaceId}
763
+ className="flex items-center gap-2 px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg disabled:opacity-50 transition-colors"
764
+ >
765
+ {publishLoading ? (
766
+ <Loader2 className="w-4 h-4 animate-spin" />
767
+ ) : (
768
+ <Package className="w-4 h-4" />
769
+ )}
770
+ Publish to Marketplace
771
+ </button>
772
+
773
+ {publishResult && (
774
+ <div className={resultPanelClass}>
775
+ {publishResult.quality_warning && (
776
+ <div className="mb-3 bg-amber-500/10 border border-amber-500/20 text-amber-400 rounded px-3 py-2 text-xs">
777
+ {publishResult.quality_warning}
778
+ </div>
779
+ )}
780
+ <div className="text-xs font-medium text-gray-400 mb-3">Published</div>
781
+ {publishResult.output_path && (
782
+ <div className="mb-2">
783
+ <div className="text-[10px] text-gray-500 uppercase mb-0.5">Output Path</div>
784
+ <div className="text-xs text-gray-300 font-mono break-all">
785
+ {publishResult.output_path}
786
+ </div>
787
+ </div>
788
+ )}
789
+ {publishResult.pii_scrub && (
790
+ <div className="mt-2 pt-2 border-t border-white/[0.06]">
791
+ <div className="text-[10px] text-gray-500 uppercase mb-1">PII Scrub</div>
792
+ <div className="flex gap-4 text-[11px] text-gray-400">
793
+ <span>
794
+ {publishResult.pii_scrub.records_checked.toLocaleString()} records checked
795
+ </span>
796
+ <span>
797
+ {publishResult.pii_scrub.fields_scrubbed.toLocaleString()} fields scrubbed
798
+ </span>
799
+ </div>
800
+ </div>
801
+ )}
802
+ </div>
803
+ )}
804
+ </div>
805
+ )}
806
+ </div>
807
+ </div>
808
+ </div>
809
+ );
810
+ }