@jlongo78/agent-spaces 0.10.0-beta.2 → 0.10.0-beta.4

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 (721) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +2 -2
  3. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  4. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  18. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  26. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  27. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  30. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  32. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  34. package/.next/standalone/.next/server/app/admin/analytics.rsc +2 -2
  35. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +2 -2
  40. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  41. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  42. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  43. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  44. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  45. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  50. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  51. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  53. package/.next/standalone/.next/server/app/analytics.html +1 -1
  54. package/.next/standalone/.next/server/app/analytics.rsc +2 -2
  55. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  57. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  58. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
  59. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  60. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  61. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  62. package/.next/standalone/.next/server/app/api/admin/analytics/route.js +4 -2
  63. package/.next/standalone/.next/server/app/api/admin/analytics/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/users/[id]/route.js +4 -2
  65. package/.next/standalone/.next/server/app/api/admin/users/[id]/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/admin/users/route.js +4 -2
  67. package/.next/standalone/.next/server/app/api/admin/users/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/analytics/overview/route.js +5 -4
  69. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/auth/login/route.js +3 -2
  71. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
  73. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/me/route.js +3 -2
  75. package/.next/standalone/.next/server/app/api/auth/me/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/totp/setup/route.js +2 -2
  77. package/.next/standalone/.next/server/app/api/auth/totp/setup/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/totp/status/route.js +2 -2
  79. package/.next/standalone/.next/server/app/api/auth/totp/status/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/auth/totp/verify/route.js +3 -2
  81. package/.next/standalone/.next/server/app/api/auth/totp/verify/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +4 -3
  83. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/benchmark/run/route.js +4 -3
  85. package/.next/standalone/.next/server/app/api/benchmark/run/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js +4 -3
  87. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js +4 -3
  89. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/benchmark/status/route.js +4 -3
  91. package/.next/standalone/.next/server/app/api/benchmark/status/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/bulk/route.js +5 -4
  93. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/chat/route.js +4 -2
  95. package/.next/standalone/.next/server/app/api/chat/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/claude/usage/route.js +5 -4
  97. package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/config/route.js +3 -3
  99. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/context/route.js +4 -3
  101. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js +4 -3
  103. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js +4 -3
  105. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js +4 -3
  107. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js +4 -3
  109. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js +4 -3
  111. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/export/route.js +4 -3
  113. package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js +4 -3
  115. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js +4 -3
  117. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js +4 -3
  119. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js +4 -3
  121. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js +4 -3
  123. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js +4 -3
  125. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js +4 -3
  127. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js +4 -3
  129. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/cortex/import/route.js +4 -3
  131. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js +4 -3
  133. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js +4 -3
  135. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js +4 -3
  137. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js +4 -3
  139. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js +4 -3
  141. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js +4 -3
  143. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js +4 -3
  145. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js +4 -3
  147. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js +3 -3
  149. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js +3 -3
  151. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js +4 -3
  153. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js +4 -3
  155. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/cortex/search/route.js +4 -3
  157. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/cortex/settings/route.js +4 -3
  159. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/cortex/status/route.js +4 -3
  161. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js +4 -3
  163. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/cortex/usage/route.js +4 -3
  165. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js +4 -3
  167. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/events/route.js +5 -3
  169. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/files/route.js +3 -2
  171. package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/folders/route.js +3 -3
  173. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/network/connect-callback/route.js +2 -2
  175. package/.next/standalone/.next/server/app/api/network/connect-callback/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/network/connect-request/[id]/route.js +2 -2
  177. package/.next/standalone/.next/server/app/api/network/connect-request/[id]/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/network/connect-request/route.js +2 -2
  179. package/.next/standalone/.next/server/app/api/network/connect-request/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/network/discovered/route.js +2 -2
  181. package/.next/standalone/.next/server/app/api/network/discovered/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/network/handshake/route.js +4 -3
  183. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/network/health/route.js +2 -2
  185. package/.next/standalone/.next/server/app/api/network/health/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/network/identity/route.js +2 -2
  187. package/.next/standalone/.next/server/app/api/network/identity/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/network/keys/[id]/route.js +2 -2
  189. package/.next/standalone/.next/server/app/api/network/keys/[id]/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/network/keys/route.js +2 -2
  191. package/.next/standalone/.next/server/app/api/network/keys/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/network/nodes/[id]/route.js +2 -2
  193. package/.next/standalone/.next/server/app/api/network/nodes/[id]/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/network/nodes/check/route.js +2 -2
  195. package/.next/standalone/.next/server/app/api/network/nodes/check/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/network/nodes/route.js +2 -2
  197. package/.next/standalone/.next/server/app/api/network/nodes/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +6 -5
  199. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/network/panes/route.js +6 -5
  201. package/.next/standalone/.next/server/app/api/network/panes/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/network/projects/route.js +6 -5
  203. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/network/proxy/[nodeId]/[...path]/route.js +2 -2
  205. package/.next/standalone/.next/server/app/api/network/proxy/[nodeId]/[...path]/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/network/search/route.js +6 -5
  207. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js +6 -5
  209. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js +6 -5
  211. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  212. package/.next/standalone/.next/server/app/api/network/sessions/route.js +6 -5
  213. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  214. package/.next/standalone/.next/server/app/api/network/terminal/token/route.js +2 -2
  215. package/.next/standalone/.next/server/app/api/network/terminal/token/route.js.nft.json +1 -1
  216. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +6 -5
  217. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  218. package/.next/standalone/.next/server/app/api/network/workspaces/route.js +6 -5
  219. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  220. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js +5 -4
  221. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js.nft.json +1 -1
  222. package/.next/standalone/.next/server/app/api/panes/[id]/route.js +5 -4
  223. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  224. package/.next/standalone/.next/server/app/api/panes/route.js +5 -4
  225. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/api/projects/route.js +5 -4
  227. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js +3 -3
  229. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js +3 -3
  231. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/search/route.js +6 -5
  233. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  234. package/.next/standalone/.next/server/app/api/server-config/route.js +2 -2
  235. package/.next/standalone/.next/server/app/api/server-config/route.js.nft.json +1 -1
  236. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +5 -3
  237. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js +5 -4
  239. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  240. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +5 -4
  241. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  242. package/.next/standalone/.next/server/app/api/sessions/route.js +6 -5
  243. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  244. package/.next/standalone/.next/server/app/api/sync/route.js +4 -3
  245. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/app/api/tags/route.js +5 -4
  247. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  248. package/.next/standalone/.next/server/app/api/tier/route.js +4 -3
  249. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/app/api/updates/route.js +2 -2
  251. package/.next/standalone/.next/server/app/api/updates/route.js.nft.json +1 -1
  252. package/.next/standalone/.next/server/app/api/whisper/config/route.js +2 -2
  253. package/.next/standalone/.next/server/app/api/whisper/config/route.js.nft.json +1 -1
  254. package/.next/standalone/.next/server/app/api/whisper/route.js +2 -2
  255. package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
  256. package/.next/standalone/.next/server/app/api/wizard/chat/route.js +3 -3
  257. package/.next/standalone/.next/server/app/api/wizard/chat/route.js.nft.json +1 -1
  258. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js +5 -3
  259. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  260. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js +5 -3
  261. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  262. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js +5 -3
  263. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  264. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js +5 -3
  265. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  266. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js +5 -4
  267. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  268. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js +5 -4
  269. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  270. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js +5 -4
  271. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -1
  272. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js +5 -4
  273. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -1
  274. package/.next/standalone/.next/server/app/api/workspaces/route.js +6 -5
  275. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  276. package/.next/standalone/.next/server/app/cortex.html +1 -1
  277. package/.next/standalone/.next/server/app/cortex.rsc +2 -2
  278. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +1 -1
  279. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  280. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +2 -2
  282. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  283. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  284. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  285. package/.next/standalone/.next/server/app/icon.png/route.js +2 -2
  286. package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +1 -1
  287. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  288. package/.next/standalone/.next/server/app/login.html +1 -1
  289. package/.next/standalone/.next/server/app/login.rsc +2 -2
  290. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  291. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  292. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  293. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  294. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  296. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  297. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  298. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  299. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  300. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  301. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  302. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  303. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  304. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  305. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  306. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  307. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  308. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  309. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  310. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  311. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  313. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  314. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  315. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  316. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  317. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  318. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  319. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  320. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  321. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  322. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  323. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  324. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  325. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  326. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  327. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  329. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  330. package/.next/standalone/.next/server/app/m/terminal.rsc +2 -2
  331. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +2 -2
  332. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  333. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  334. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  335. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +1 -1
  336. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  337. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  338. package/.next/standalone/.next/server/app/m.html +1 -1
  339. package/.next/standalone/.next/server/app/m.rsc +2 -2
  340. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  341. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  342. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  343. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  344. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  345. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  346. package/.next/standalone/.next/server/app/network.html +1 -1
  347. package/.next/standalone/.next/server/app/network.rsc +2 -2
  348. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  349. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  350. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  351. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  352. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  353. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  354. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  355. package/.next/standalone/.next/server/app/projects.html +1 -1
  356. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  357. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  358. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  359. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  360. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  361. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  362. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  363. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  364. package/.next/standalone/.next/server/app/sessions.html +1 -1
  365. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  366. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  367. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  368. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  369. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  370. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  371. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  372. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  373. package/.next/standalone/.next/server/app/settings.html +1 -1
  374. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  375. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
  376. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  377. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  378. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  379. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  380. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  381. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  382. package/.next/standalone/.next/server/app/terminal.html +1 -1
  383. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  384. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  385. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  386. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  387. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  388. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  389. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  390. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  391. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
  392. package/.next/standalone/.next/server/app/vr.html +1 -1
  393. package/.next/standalone/.next/server/app/vr.rsc +2 -2
  394. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +2 -2
  395. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
  396. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
  397. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
  398. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +1 -1
  399. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
  400. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  401. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  402. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  403. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  404. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  405. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  406. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  407. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  408. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cf5ebdb._.js +3 -0
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0f15af1e._.js +78 -0
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__107eab8a._.js +3 -0
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1094360c._.js +1 -1
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__118ea5e0._.js +42 -0
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +5 -5
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16d4da21._.js +3 -0
  416. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1c542684._.js +3 -0
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f23bae4._.js +3 -0
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1faefa3e._.js +19 -0
  419. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2145098e._.js +42 -0
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2748c76c._.js +42 -0
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2c08d908._.js +3 -0
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e29b4bd._.js +3 -0
  423. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e3ecfd17._.js → [root-of-the-server]__34fd47d2._.js} +3 -3
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__366b6cec._.js +78 -0
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d51508f._.js +3 -0
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5663673e._.js +3 -0
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__57e0cc31._.js +133 -0
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__57ebbe63._.js +42 -0
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d3345e4._.js +3 -0
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ee7aa9d._.js +11 -0
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__60caf825._.js +3 -0
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__65c9857f._.js +3 -0
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__678f6823._.js +3 -0
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__685c95d8._.js +3 -0
  435. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__41d4d426._.js → [root-of-the-server]__69568dc2._.js} +1 -1
  436. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6a0bc4ae._.js +3 -0
  437. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6b876561._.js +3 -0
  438. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e89713c._.js +42 -0
  439. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f713737._.js +3 -0
  440. package/.next/standalone/.next/server/chunks/[root-of-the-server]__725f10f4._.js +78 -0
  441. package/.next/standalone/.next/server/chunks/[root-of-the-server]__785b0597._.js +38 -0
  442. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7c728bed._.js +3 -0
  443. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7da958b5._.js +42 -0
  444. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7daed406._.js +3 -0
  445. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7f140e4b._.js +78 -0
  446. package/.next/standalone/.next/server/chunks/[root-of-the-server]__80d826f7._.js +3 -0
  447. package/.next/standalone/.next/server/chunks/[root-of-the-server]__83a3c97b._.js +3 -0
  448. package/.next/standalone/.next/server/chunks/[root-of-the-server]__84c15a0e._.js +3 -0
  449. package/.next/standalone/.next/server/chunks/[root-of-the-server]__85c33341._.js +42 -0
  450. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88f3d920._.js +78 -0
  451. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8c916e85._.js +3 -0
  452. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8deb2ae3._.js +3 -0
  453. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df5a740._.js +3 -0
  454. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f238bd9._.js +3 -0
  455. package/.next/standalone/.next/server/chunks/[root-of-the-server]__955ab668._.js +3 -0
  456. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9a061e91._.js +42 -0
  457. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a04a87d5._.js +42 -0
  458. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a803051f._.js +42 -0
  459. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac0a9b09._.js +3 -0
  460. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac3e37b6._.js +13 -0
  461. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__96685488._.js → [root-of-the-server]__add9e50d._.js} +1 -1
  462. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b57f4274._.js +3 -0
  463. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b84b3426._.js +3 -0
  464. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba8224a1._.js +42 -0
  465. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bd1c1d0d._.js +42 -0
  466. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1442c38._.js +42 -0
  467. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c18bdab2._.js +42 -0
  468. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1efc6a8._.js +3 -0
  469. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c697b87e._.js +3 -0
  470. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c6dc43c6._.js +3 -0
  471. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ccce7f4f._.js +78 -0
  472. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d92f347c._.js +3 -0
  473. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dac9e21e._.js +3 -0
  474. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3f9ddbc._.js +78 -0
  475. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e66fc05f._.js +3 -0
  476. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e7add82c._.js +3 -0
  477. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fa9a5ec0._.js +42 -0
  478. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9f6af0._.js +42 -0
  479. package/.next/standalone/.next/server/chunks/_0142f96b._.js +3 -0
  480. package/.next/standalone/.next/server/chunks/_0ebd30d3._.js +3 -0
  481. package/.next/standalone/.next/server/chunks/_19a59078._.js +3 -0
  482. package/.next/standalone/.next/server/chunks/_1bc02021._.js +11 -0
  483. package/.next/standalone/.next/server/chunks/_1e381a28._.js +3 -0
  484. package/.next/standalone/.next/server/chunks/_2699eda7._.js +3 -0
  485. package/.next/standalone/.next/server/chunks/_2fd02f70._.js +3 -0
  486. package/.next/standalone/.next/server/chunks/_373d522f._.js +3 -0
  487. package/.next/standalone/.next/server/chunks/_43fc1196._.js +3 -0
  488. package/.next/standalone/.next/server/chunks/_48ec4374._.js +3 -0
  489. package/.next/standalone/.next/server/chunks/_563d9ecc._.js +3 -0
  490. package/.next/standalone/.next/server/chunks/_583f9ae2._.js +3 -0
  491. package/.next/standalone/.next/server/chunks/_5a167705._.js +3 -0
  492. package/.next/standalone/.next/server/chunks/_5a8cc3a5._.js +3 -0
  493. package/.next/standalone/.next/server/chunks/_5d894fb4._.js +3 -0
  494. package/.next/standalone/.next/server/chunks/_6bbf8264._.js +3 -0
  495. package/.next/standalone/.next/server/chunks/_6c4bcec1._.js +3 -0
  496. package/.next/standalone/.next/server/chunks/_7a29d111._.js +3 -0
  497. package/.next/standalone/.next/server/chunks/_7d3bab25._.js +3 -0
  498. package/.next/standalone/.next/server/chunks/_7ed4d1a4._.js +3 -0
  499. package/.next/standalone/.next/server/chunks/_8072d20c._.js +3 -0
  500. package/.next/standalone/.next/server/chunks/_81b87c01._.js +3 -0
  501. package/.next/standalone/.next/server/chunks/_881b7b28._.js +3 -0
  502. package/.next/standalone/.next/server/chunks/_902a1d56._.js +3 -0
  503. package/.next/standalone/.next/server/chunks/_96258f1c._.js +3 -0
  504. package/.next/standalone/.next/server/chunks/_96f79f8f._.js +3 -0
  505. package/.next/standalone/.next/server/chunks/_a0379bc2._.js +3 -0
  506. package/.next/standalone/.next/server/chunks/_a0f604e8._.js +3 -0
  507. package/.next/standalone/.next/server/chunks/_a959b121._.js +3 -0
  508. package/.next/standalone/.next/server/chunks/_a975011f._.js +3 -0
  509. package/.next/standalone/.next/server/chunks/_aa956b66._.js +3 -0
  510. package/.next/standalone/.next/server/chunks/_ad7e7d57._.js +3 -0
  511. package/.next/standalone/.next/server/chunks/_aebf2285._.js +3 -0
  512. package/.next/standalone/.next/server/chunks/_b259dda0._.js +36 -0
  513. package/.next/standalone/.next/server/chunks/_b7c60fdc._.js +3 -0
  514. package/.next/standalone/.next/server/chunks/_bd23ddeb._.js +3 -0
  515. package/.next/standalone/.next/server/chunks/_cd02dfbe._.js +3 -0
  516. package/.next/standalone/.next/server/chunks/_d3ecca80._.js +3 -0
  517. package/.next/standalone/.next/server/chunks/_d48dfa43._.js +11 -0
  518. package/.next/standalone/.next/server/chunks/_dba648d6._.js +3 -0
  519. package/.next/standalone/.next/server/chunks/_df42ac6e._.js +3 -0
  520. package/.next/standalone/.next/server/chunks/_dfe0e460._.js +42 -0
  521. package/.next/standalone/.next/server/chunks/_ead2734e._.js +3 -0
  522. package/.next/standalone/.next/server/chunks/_eb4efd0a._.js +3 -0
  523. package/.next/standalone/.next/server/chunks/_eb66a871._.js +3 -0
  524. package/.next/standalone/.next/server/chunks/_ef715efd._.js +3 -0
  525. package/.next/standalone/.next/server/chunks/_f361a656._.js +3 -0
  526. package/.next/standalone/.next/server/chunks/_f54ddbf4._.js +3 -0
  527. package/.next/standalone/.next/server/chunks/_fe2866f2._.js +3 -0
  528. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_4c408326.js +3 -0
  529. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5603adbc.js +3 -0
  530. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_7180f8ad.js +3 -0
  531. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_b6be66d9.js +3 -0
  532. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f7054fd7.js +3 -0
  533. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  534. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +1 -1
  535. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
  536. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__ca3f649e._.js +1 -1
  537. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  538. package/.next/standalone/.next/server/pages/404.html +1 -1
  539. package/.next/standalone/.next/server/pages/500.html +2 -2
  540. package/.next/standalone/.next/static/chunks/{732b7502f82e7c37.css → 044decb96250e420.css} +1 -1
  541. package/.next/standalone/.next/static/chunks/{23a9627a951672ed.js → 8b53c673e79b82f1.js} +3 -3
  542. package/.next/standalone/bin/scrub-standalone.js +5 -0
  543. package/.next/standalone/bin/spaces-dev.js +13 -3
  544. package/.next/standalone/bin/spaces.js +25 -4
  545. package/.next/standalone/package-lock.json +2 -2
  546. package/.next/standalone/package.json +3 -2
  547. package/.next/standalone/src/app/(desktop)/terminal/page.tsx +22 -1
  548. package/.next/standalone/src/app/api/network/discovered/route.ts +2 -2
  549. package/.next/standalone/src/app/api/network/nodes/check/route.ts +2 -2
  550. package/.next/standalone/src/app/api/network/nodes/route.ts +2 -2
  551. package/.next/standalone/src/app/api/server-config/route.ts +9 -18
  552. package/.next/standalone/src/lib/admin/api/analytics.ts +1 -8
  553. package/.next/standalone/src/lib/admin/api/users.ts +1 -8
  554. package/.next/standalone/src/lib/admin/api/usersById.ts +1 -8
  555. package/.next/standalone/src/lib/auth/guard.ts +46 -0
  556. package/.next/standalone/src/lib/auth/index.ts +1 -0
  557. package/.next/standalone/src/lib/db/queries.ts +11 -1
  558. package/.next/standalone/src/lib/network/api/discovered.ts +4 -1
  559. package/.next/standalone/src/lib/network/api/identity.ts +6 -0
  560. package/.next/standalone/src/lib/network/api/keys.ts +6 -0
  561. package/.next/standalone/src/lib/network/api/keysById.ts +3 -0
  562. package/.next/standalone/src/lib/network/api/nodes.ts +49 -3
  563. package/.next/standalone/src/lib/network/api/nodesById.ts +5 -0
  564. package/.next/standalone/src/lib/network/api/nodesCheck.ts +4 -1
  565. package/.next/standalone/src/lib/network/api/proxy.ts +5 -0
  566. package/.next/standalone/src/middleware.ts +24 -10
  567. package/.next/standalone/tsconfig.tsbuildinfo +1 -1
  568. package/bin/scrub-standalone.js +5 -0
  569. package/bin/spaces-dev.js +13 -3
  570. package/bin/spaces.js +25 -4
  571. package/package.json +3 -2
  572. package/.next/standalone/.next/server/chunks/[externals]_next_dist_b89b5a39._.js +0 -3
  573. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0153ac12._.js +0 -133
  574. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01a4559c._.js +0 -3
  575. package/.next/standalone/.next/server/chunks/[root-of-the-server]__029ab763._.js +0 -133
  576. package/.next/standalone/.next/server/chunks/[root-of-the-server]__037992dc._.js +0 -141
  577. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06bb204a._.js +0 -133
  578. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fd17dcf._.js +0 -3
  579. package/.next/standalone/.next/server/chunks/[root-of-the-server]__107439ea._.js +0 -133
  580. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12dff461._.js +0 -78
  581. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13eb511a._.js +0 -133
  582. package/.next/standalone/.next/server/chunks/[root-of-the-server]__141c8d34._.js +0 -172
  583. package/.next/standalone/.next/server/chunks/[root-of-the-server]__151efd48._.js +0 -3
  584. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16c141c2._.js +0 -133
  585. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17fee60c._.js +0 -133
  586. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a525be8._.js +0 -3
  587. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1aea45f5._.js +0 -3
  588. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1cb4ee6b._.js +0 -133
  589. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e25d3db._.js +0 -133
  590. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f7566a3._.js +0 -3
  591. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20382bee._.js +0 -133
  592. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2082a624._.js +0 -133
  593. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2091a7ed._.js +0 -42
  594. package/.next/standalone/.next/server/chunks/[root-of-the-server]__24525ae7._.js +0 -133
  595. package/.next/standalone/.next/server/chunks/[root-of-the-server]__284b02fc._.js +0 -42
  596. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a1a1d0f._.js +0 -42
  597. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2cf17888._.js +0 -42
  598. package/.next/standalone/.next/server/chunks/[root-of-the-server]__323ae5c9._.js +0 -133
  599. package/.next/standalone/.next/server/chunks/[root-of-the-server]__34db98f7._.js +0 -133
  600. package/.next/standalone/.next/server/chunks/[root-of-the-server]__39efba69._.js +0 -3
  601. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3aeedc57._.js +0 -133
  602. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3bbe9d04._.js +0 -78
  603. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3c2324ba._.js +0 -42
  604. package/.next/standalone/.next/server/chunks/[root-of-the-server]__40df3f5d._.js +0 -172
  605. package/.next/standalone/.next/server/chunks/[root-of-the-server]__42a3fe3c._.js +0 -141
  606. package/.next/standalone/.next/server/chunks/[root-of-the-server]__42d5d5be._.js +0 -3
  607. package/.next/standalone/.next/server/chunks/[root-of-the-server]__49821b61._.js +0 -133
  608. package/.next/standalone/.next/server/chunks/[root-of-the-server]__49f58cee._.js +0 -133
  609. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4b9c38dc._.js +0 -141
  610. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4c0ee9c7._.js +0 -133
  611. package/.next/standalone/.next/server/chunks/[root-of-the-server]__530862c6._.js +0 -3
  612. package/.next/standalone/.next/server/chunks/[root-of-the-server]__55504160._.js +0 -133
  613. package/.next/standalone/.next/server/chunks/[root-of-the-server]__599f26fe._.js +0 -42
  614. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5efa69f5._.js +0 -3
  615. package/.next/standalone/.next/server/chunks/[root-of-the-server]__60483ece._.js +0 -3
  616. package/.next/standalone/.next/server/chunks/[root-of-the-server]__61135659._.js +0 -133
  617. package/.next/standalone/.next/server/chunks/[root-of-the-server]__66331034._.js +0 -133
  618. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6887294d._.js +0 -3
  619. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6b9396b4._.js +0 -133
  620. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6cfd7062._.js +0 -166
  621. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6e8d89e2._.js +0 -149
  622. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6f5b3cfe._.js +0 -133
  623. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71d5b087._.js +0 -133
  624. package/.next/standalone/.next/server/chunks/[root-of-the-server]__76434a8e._.js +0 -78
  625. package/.next/standalone/.next/server/chunks/[root-of-the-server]__798bafa7._.js +0 -133
  626. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7b873fdb._.js +0 -78
  627. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7d73f791._.js +0 -133
  628. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7dc76d0e._.js +0 -133
  629. package/.next/standalone/.next/server/chunks/[root-of-the-server]__80a85d1f._.js +0 -133
  630. package/.next/standalone/.next/server/chunks/[root-of-the-server]__81f2a9b7._.js +0 -133
  631. package/.next/standalone/.next/server/chunks/[root-of-the-server]__82f11618._.js +0 -3
  632. package/.next/standalone/.next/server/chunks/[root-of-the-server]__834efefe._.js +0 -42
  633. package/.next/standalone/.next/server/chunks/[root-of-the-server]__853663ea._.js +0 -42
  634. package/.next/standalone/.next/server/chunks/[root-of-the-server]__861f2472._.js +0 -172
  635. package/.next/standalone/.next/server/chunks/[root-of-the-server]__882d0924._.js +0 -133
  636. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88959e7f._.js +0 -133
  637. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8b6c05dc._.js +0 -133
  638. package/.next/standalone/.next/server/chunks/[root-of-the-server]__912a22a4._.js +0 -133
  639. package/.next/standalone/.next/server/chunks/[root-of-the-server]__93d21ad1._.js +0 -42
  640. package/.next/standalone/.next/server/chunks/[root-of-the-server]__94532b09._.js +0 -42
  641. package/.next/standalone/.next/server/chunks/[root-of-the-server]__97e87518._.js +0 -78
  642. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9c13c8d0._.js +0 -78
  643. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9cb13212._.js +0 -133
  644. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d315363._.js +0 -133
  645. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9ec369db._.js +0 -13
  646. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f09ade5._.js +0 -133
  647. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f986ad2._.js +0 -133
  648. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a35913cf._.js +0 -172
  649. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a3641117._.js +0 -78
  650. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a76c75a0._.js +0 -133
  651. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a934c48d._.js +0 -133
  652. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9431ac6._.js +0 -133
  653. package/.next/standalone/.next/server/chunks/[root-of-the-server]__aa3381a4._.js +0 -133
  654. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ab1cc16c._.js +0 -133
  655. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ab22ca4f._.js +0 -133
  656. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac20d518._.js +0 -78
  657. package/.next/standalone/.next/server/chunks/[root-of-the-server]__aee3bf91._.js +0 -172
  658. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b1114936._.js +0 -133
  659. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b15ade1f._.js +0 -133
  660. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b2bc7a81._.js +0 -133
  661. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b51446e5._.js +0 -133
  662. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba344563._.js +0 -133
  663. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c3b2e20c._.js +0 -133
  664. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ca93ae79._.js +0 -42
  665. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf4a76c0._.js +0 -133
  666. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d20bed9e._.js +0 -78
  667. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d2d59054._.js +0 -133
  668. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d4f1c0c0._.js +0 -38
  669. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d6de7a45._.js +0 -133
  670. package/.next/standalone/.next/server/chunks/[root-of-the-server]__da33b519._.js +0 -133
  671. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dc820e44._.js +0 -133
  672. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e1058e69._.js +0 -133
  673. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e1dfb4d4._.js +0 -3
  674. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3606cd1._.js +0 -3
  675. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e55b6fc5._.js +0 -133
  676. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6555dc3._.js +0 -133
  677. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e65c3971._.js +0 -3
  678. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ea9e2d75._.js +0 -133
  679. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ec37cbee._.js +0 -133
  680. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f3c19e4b._.js +0 -42
  681. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f445bd01._.js +0 -3
  682. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f7b0b4da._.js +0 -133
  683. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fb4c016b._.js +0 -133
  684. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fd86530e._.js +0 -78
  685. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fef9b1ec._.js +0 -133
  686. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-design.md +0 -133
  687. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-plan.md +0 -959
  688. package/.next/standalone/docs/plans/2026-03-07-service-command-design.md +0 -146
  689. package/.next/standalone/docs/plans/2026-03-07-service-command-plan.md +0 -254
  690. package/.next/standalone/docs/plans/2026-04-23-consolidate-addons-design.md +0 -212
  691. package/.next/standalone/docs/plans/2026-04-23-consolidate-addons-plan.md +0 -1509
  692. package/.next/standalone/docs/superpowers/plans/2026-03-12-spaces-cortex.md +0 -5270
  693. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +0 -1387
  694. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +0 -1923
  695. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +0 -1113
  696. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +0 -853
  697. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +0 -1274
  698. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +0 -933
  699. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +0 -1080
  700. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +0 -768
  701. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +0 -1108
  702. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +0 -1846
  703. package/.next/standalone/docs/superpowers/plans/2026-03-19-vr-phase1-shell.md +0 -1639
  704. package/.next/standalone/docs/superpowers/plans/2026-03-27-dockview-pane-layout.md +0 -98
  705. package/.next/standalone/docs/superpowers/plans/2026-04-21-workspace-todos.md +0 -1097
  706. package/.next/standalone/docs/superpowers/plans/2026-04-22-claude-usage-display.md +0 -749
  707. package/.next/standalone/docs/superpowers/specs/2026-03-11-universe-view-design.md +0 -320
  708. package/.next/standalone/docs/superpowers/specs/2026-03-12-spaces-brain-design.md +0 -720
  709. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +0 -268
  710. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +0 -623
  711. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +0 -263
  712. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +0 -240
  713. package/.next/standalone/docs/superpowers/specs/2026-03-16-pane-ux-design.md +0 -77
  714. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +0 -341
  715. package/.next/standalone/docs/superpowers/specs/2026-03-19-vr-phase1-shell-design.md +0 -288
  716. package/.next/standalone/docs/superpowers/specs/2026-03-27-pane-diff-review-and-project-wizard-design.md +0 -322
  717. package/.next/standalone/docs/superpowers/specs/2026-04-21-workspace-todos-design.md +0 -180
  718. package/.next/standalone/docs/superpowers/specs/2026-04-22-claude-usage-display-design.md +0 -183
  719. /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_buildManifest.js +0 -0
  720. /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_clientMiddlewareManifest.json +0 -0
  721. /package/.next/standalone/.next/static/{Y9EeSGuSi-8qpkLvIBy0a → mimGB6C_ZmJMiVnOe9tqZ}/_ssgManifest.js +0 -0
@@ -1,1274 +0,0 @@
1
- # Cortex v2 — Pillar 3: Context Assembly Engine
2
-
3
- > **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
4
-
5
- **Goal:** Replace the flat layer-iteration search with a 6-stage context assembly pipeline that detects intent, resolves entities, computes graph-aware weights, searches multiple scopes in parallel, fuses results with evidence scoring, and surfaces conflicts — all within 150ms.
6
-
7
- **Architecture:** A new `ContextEngine` class wraps the existing `CortexStore` (for low-level vector search) and `EntityGraph` (for graph distance/proximity). It does NOT replace `CortexSearch` — instead it provides the higher-level retrieval interface that the RAG hook calls. The existing `CortexSearch` remains for backward-compatible simple searches. The RAG hook (`cortex-hook.js`) switches from calling the search API to calling a new context-assembly API endpoint.
8
-
9
- **Tech Stack:** TypeScript, vitest, LanceDB, SQLite (entity graph)
10
-
11
- **Spec:** `docs/superpowers/specs/2026-03-14-cortex-v2-design.md` — Pillar 3
12
-
13
- **Depends on:** Pillar 1 (Entity Graph) + Pillar 2 (Knowledge Unit Evolution) — both completed
14
-
15
- ---
16
-
17
- ## File Structure
18
-
19
- ```
20
- New files:
21
- ├── src/lib/cortex/retrieval/intent.ts — Intent detection (regex + keyword)
22
- ├── src/lib/cortex/retrieval/weight.ts — Weight computation (graph × intent × freshness × authority)
23
- ├── src/lib/cortex/retrieval/conflict.ts — Conflict detection in results
24
- ├── src/lib/cortex/retrieval/formatter.ts — Context formatting for RAG injection
25
- ├── src/lib/cortex/retrieval/context-engine.ts — Main 6-stage ContextEngine class
26
- ├── src/app/api/cortex/context/route.ts — API endpoint for context assembly
27
-
28
- Modified files:
29
- ├── bin/cortex-hook.js — Switch to context-assembly endpoint
30
-
31
- Test files:
32
- ├── tests/lib/cortex/retrieval/intent.test.ts
33
- ├── tests/lib/cortex/retrieval/weight.test.ts
34
- ├── tests/lib/cortex/retrieval/conflict.test.ts
35
- ├── tests/lib/cortex/retrieval/formatter.test.ts
36
- ├── tests/lib/cortex/retrieval/context-engine.test.ts
37
- ```
38
-
39
- ---
40
-
41
- ## Chunk 1: Intent Detection and Weight Computation
42
-
43
- ### Task 1: Intent detection
44
-
45
- **Files:**
46
- - Create: `src/lib/cortex/retrieval/intent.ts`
47
- - Create: `tests/lib/cortex/retrieval/intent.test.ts`
48
-
49
- - [ ] **Step 1: Write failing tests**
50
-
51
- ```typescript
52
- // tests/lib/cortex/retrieval/intent.test.ts
53
- import { describe, it, expect } from 'vitest';
54
- import { detectIntent, INTENTS } from '@/lib/cortex/retrieval/intent';
55
- import type { IntentResult } from '@/lib/cortex/retrieval/intent';
56
-
57
- describe('detectIntent', () => {
58
- it('detects debugging intent', () => {
59
- const result = detectIntent('why does the auth service throw a timeout error?');
60
- expect(result.intent).toBe('debugging');
61
- expect(result.confidence).toBeGreaterThan(0.5);
62
- });
63
-
64
- it('detects architecture intent', () => {
65
- const result = detectIntent('what architecture pattern should we use for the new service?');
66
- expect(result.intent).toBe('architecture');
67
- });
68
-
69
- it('detects how-to intent', () => {
70
- const result = detectIntent('how do I deploy this service to production?');
71
- expect(result.intent).toBe('how-to');
72
- });
73
-
74
- it('detects security intent', () => {
75
- const result = detectIntent('is there a vulnerability in our authentication flow?');
76
- expect(result.intent).toBe('security');
77
- });
78
-
79
- it('defaults to general for ambiguous queries', () => {
80
- const result = detectIntent('tell me about the project');
81
- expect(result.intent).toBe('general');
82
- });
83
-
84
- it('returns bias config for the detected intent', () => {
85
- const result = detectIntent('fix this bug in the login page');
86
- expect(result.biases).toBeDefined();
87
- expect(result.biases.scope_boost).toBeDefined();
88
- expect(result.biases.type_boost).toBeDefined();
89
- });
90
-
91
- it('exports all intent definitions', () => {
92
- expect(Object.keys(INTENTS)).toContain('debugging');
93
- expect(Object.keys(INTENTS)).toContain('architecture');
94
- expect(Object.keys(INTENTS)).toContain('general');
95
- expect(Object.keys(INTENTS).length).toBe(8);
96
- });
97
- });
98
- ```
99
-
100
- - [ ] **Step 2: Run tests to verify they fail**
101
-
102
- Run: `npx vitest run tests/lib/cortex/retrieval/intent.test.ts`
103
-
104
- - [ ] **Step 3: Implement intent detection**
105
-
106
- ```typescript
107
- // src/lib/cortex/retrieval/intent.ts
108
-
109
- export interface IntentBiases {
110
- scope_boost: Record<string, number>; // scope level → multiplier
111
- type_boost: Record<string, number>; // knowledge type → multiplier
112
- recency_boost: number; // extra recency multiplier
113
- }
114
-
115
- export interface IntentResult {
116
- intent: string;
117
- confidence: number;
118
- biases: IntentBiases;
119
- }
120
-
121
- interface IntentDef {
122
- patterns: RegExp[];
123
- keywords: string[];
124
- biases: IntentBiases;
125
- }
126
-
127
- export const INTENTS: Record<string, IntentDef> = {
128
- debugging: {
129
- patterns: [
130
- /\b(error|bug|fix|crash|fail|broken|throw|exception|timeout|issue)\b/i,
131
- /\bwhy\s+(does|is|did|do)\b/i,
132
- /\bnot\s+work/i,
133
- ],
134
- keywords: ['error', 'bug', 'fix', 'debug', 'crash', 'fail', 'broken', 'throw', 'exception', 'timeout', 'issue', 'stack trace'],
135
- biases: {
136
- scope_boost: { personal: 1.2, team: 1.0, department: 0.9, organization: 0.8 },
137
- type_boost: { error_fix: 1.3, pattern: 1.0, decision: 0.8, conversation: 0.7 },
138
- recency_boost: 1.1,
139
- },
140
- },
141
- architecture: {
142
- patterns: [
143
- /\b(architect|design|pattern|structure|approach)\b/i,
144
- /\bshould\s+we\s+(use|adopt|switch|migrate)\b/i,
145
- ],
146
- keywords: ['architecture', 'design', 'pattern', 'structure', 'approach', 'decision', 'migration', 'refactor'],
147
- biases: {
148
- scope_boost: { personal: 0.9, team: 1.1, department: 1.2, organization: 1.0 },
149
- type_boost: { decision: 1.5, pattern: 1.2, error_fix: 0.7, conversation: 0.5 },
150
- recency_boost: 1.0,
151
- },
152
- },
153
- onboarding: {
154
- patterns: [
155
- /\b(how\s+does|explain|what\s+is|overview|getting\s+started)\b/i,
156
- /\bnew\s+to\b/i,
157
- ],
158
- keywords: ['explain', 'overview', 'introduction', 'getting started', 'onboarding', 'how does'],
159
- biases: {
160
- scope_boost: { personal: 0.7, team: 1.0, department: 1.1, organization: 1.2 },
161
- type_boost: { pattern: 1.3, decision: 1.2, summary: 1.2, conversation: 0.5 },
162
- recency_boost: 0.9,
163
- },
164
- },
165
- policy: {
166
- patterns: [
167
- /\b(policy|compliance|regulation|standard|rule|requirement)\b/i,
168
- /\ballowed\s+to\b/i,
169
- ],
170
- keywords: ['policy', 'compliance', 'standard', 'regulation', 'rule', 'requirement', 'allowed'],
171
- biases: {
172
- scope_boost: { personal: 0.6, team: 0.8, department: 1.0, organization: 1.3 },
173
- type_boost: { decision: 1.5, preference: 1.2, pattern: 0.8, conversation: 0.3 },
174
- recency_boost: 1.0,
175
- },
176
- },
177
- 'how-to': {
178
- patterns: [
179
- /\bhow\s+(do|can|to|should)\s+I?\b/i,
180
- /\bsteps?\s+(to|for)\b/i,
181
- /\bwhat('s| is)\s+the\s+(command|way|process)\b/i,
182
- ],
183
- keywords: ['how to', 'steps', 'command', 'run', 'deploy', 'install', 'configure', 'setup'],
184
- biases: {
185
- scope_boost: { personal: 1.2, team: 1.0, department: 0.8, organization: 0.7 },
186
- type_boost: { command: 1.3, pattern: 1.2, error_fix: 1.0, conversation: 0.6 },
187
- recency_boost: 1.05,
188
- },
189
- },
190
- review: {
191
- patterns: [
192
- /\b(review|feedback|improve|quality|best\s+practice)\b/i,
193
- /\bis\s+this\s+(good|correct|right)\b/i,
194
- ],
195
- keywords: ['review', 'feedback', 'quality', 'improve', 'best practice', 'convention'],
196
- biases: {
197
- scope_boost: { personal: 0.9, team: 1.2, department: 1.0, organization: 0.8 },
198
- type_boost: { preference: 1.3, pattern: 1.2, code_pattern: 1.2, decision: 1.0 },
199
- recency_boost: 1.0,
200
- },
201
- },
202
- security: {
203
- patterns: [
204
- /\b(security|vulnerab|exploit|attack|auth|cve|injection|xss)\b/i,
205
- /\bsecure\b/i,
206
- ],
207
- keywords: ['security', 'vulnerability', 'exploit', 'attack', 'authentication', 'authorization', 'cve', 'injection', 'xss', 'csrf'],
208
- biases: {
209
- scope_boost: { personal: 0.8, team: 1.0, department: 1.2, organization: 1.0 },
210
- type_boost: { error_fix: 1.3, decision: 1.2, pattern: 1.0, conversation: 0.5 },
211
- recency_boost: 1.1,
212
- },
213
- },
214
- general: {
215
- patterns: [],
216
- keywords: [],
217
- biases: {
218
- scope_boost: { personal: 1.0, team: 1.0, department: 1.0, organization: 1.0 },
219
- type_boost: {},
220
- recency_boost: 1.0,
221
- },
222
- },
223
- };
224
-
225
- /**
226
- * Detect the intent of a query using regex patterns and keyword scoring.
227
- * No LLM call — fast and deterministic.
228
- */
229
- export function detectIntent(query: string): IntentResult {
230
- const lower = query.toLowerCase();
231
- let bestIntent = 'general';
232
- let bestScore = 0;
233
-
234
- for (const [name, def] of Object.entries(INTENTS)) {
235
- if (name === 'general') continue;
236
-
237
- let score = 0;
238
-
239
- // Regex pattern matches (high weight)
240
- for (const pattern of def.patterns) {
241
- if (pattern.test(query)) score += 2;
242
- }
243
-
244
- // Keyword matches (lower weight)
245
- for (const keyword of def.keywords) {
246
- if (lower.includes(keyword)) score += 1;
247
- }
248
-
249
- if (score > bestScore) {
250
- bestScore = score;
251
- bestIntent = name;
252
- }
253
- }
254
-
255
- return {
256
- intent: bestIntent,
257
- confidence: bestScore > 0 ? Math.min(1.0, bestScore / 6) : 0.5,
258
- biases: INTENTS[bestIntent].biases,
259
- };
260
- }
261
- ```
262
-
263
- - [ ] **Step 4: Run tests to verify they pass**
264
-
265
- Run: `npx vitest run tests/lib/cortex/retrieval/intent.test.ts`
266
- Expected: PASS (7 tests)
267
-
268
- - [ ] **Step 5: Commit**
269
-
270
- ```bash
271
- git add src/lib/cortex/retrieval/intent.ts tests/lib/cortex/retrieval/intent.test.ts
272
- git commit -m "feat(cortex): add intent detection for context assembly"
273
- ```
274
-
275
- ---
276
-
277
- ### Task 2: Weight computation
278
-
279
- **Files:**
280
- - Create: `src/lib/cortex/retrieval/weight.ts`
281
- - Create: `tests/lib/cortex/retrieval/weight.test.ts`
282
-
283
- - [ ] **Step 1: Write failing tests**
284
-
285
- ```typescript
286
- // tests/lib/cortex/retrieval/weight.test.ts
287
- import { describe, it, expect } from 'vitest';
288
- import { computeScopeWeight } from '@/lib/cortex/retrieval/weight';
289
- import type { IntentBiases } from '@/lib/cortex/retrieval/intent';
290
-
291
- describe('computeScopeWeight', () => {
292
- const neutralBiases: IntentBiases = {
293
- scope_boost: { personal: 1.0, team: 1.0, department: 1.0, organization: 1.0 },
294
- type_boost: {},
295
- recency_boost: 1.0,
296
- };
297
-
298
- it('returns 1.0 for self (distance 0)', () => {
299
- const weight = computeScopeWeight({
300
- graphProximity: 1.0, // 1/(1+0)
301
- scopeLevel: 'personal',
302
- intentBiases: neutralBiases,
303
- authorityFactor: 1.0,
304
- });
305
- expect(weight).toBeCloseTo(1.0);
306
- });
307
-
308
- it('decreases with graph distance', () => {
309
- const close = computeScopeWeight({
310
- graphProximity: 0.5, // distance 1
311
- scopeLevel: 'team',
312
- intentBiases: neutralBiases,
313
- authorityFactor: 1.0,
314
- });
315
- const far = computeScopeWeight({
316
- graphProximity: 0.25, // distance 3
317
- scopeLevel: 'organization',
318
- intentBiases: neutralBiases,
319
- authorityFactor: 1.0,
320
- });
321
- expect(close).toBeGreaterThan(far);
322
- });
323
-
324
- it('is boosted by intent biases', () => {
325
- const debugBiases: IntentBiases = {
326
- scope_boost: { personal: 1.2, team: 0.8 },
327
- type_boost: {},
328
- recency_boost: 1.0,
329
- };
330
- const personal = computeScopeWeight({
331
- graphProximity: 0.5,
332
- scopeLevel: 'personal',
333
- intentBiases: debugBiases,
334
- authorityFactor: 1.0,
335
- });
336
- const team = computeScopeWeight({
337
- graphProximity: 0.5,
338
- scopeLevel: 'team',
339
- intentBiases: debugBiases,
340
- authorityFactor: 1.0,
341
- });
342
- expect(personal).toBeGreaterThan(team);
343
- });
344
-
345
- it('is boosted by authority factor', () => {
346
- const low = computeScopeWeight({
347
- graphProximity: 0.5,
348
- scopeLevel: 'team',
349
- intentBiases: neutralBiases,
350
- authorityFactor: 1.0,
351
- });
352
- const high = computeScopeWeight({
353
- graphProximity: 0.5,
354
- scopeLevel: 'team',
355
- intentBiases: neutralBiases,
356
- authorityFactor: 1.2,
357
- });
358
- expect(high).toBeGreaterThan(low);
359
- });
360
-
361
- it('never returns negative', () => {
362
- const weight = computeScopeWeight({
363
- graphProximity: 0,
364
- scopeLevel: 'organization',
365
- intentBiases: neutralBiases,
366
- authorityFactor: 1.0,
367
- });
368
- expect(weight).toBeGreaterThanOrEqual(0);
369
- });
370
- });
371
- ```
372
-
373
- - [ ] **Step 2: Run tests to verify they fail**
374
-
375
- Run: `npx vitest run tests/lib/cortex/retrieval/weight.test.ts`
376
-
377
- - [ ] **Step 3: Implement weight computation**
378
-
379
- ```typescript
380
- // src/lib/cortex/retrieval/weight.ts
381
- import type { IntentBiases } from './intent';
382
- import type { ScopeLevel } from '../knowledge/types';
383
-
384
- export interface ScopeWeightInput {
385
- graphProximity: number; // 0-1, from EntityGraph.proximity()
386
- scopeLevel: ScopeLevel | string;
387
- intentBiases: IntentBiases;
388
- authorityFactor: number; // 1.0 default, higher for experts/docs
389
- }
390
-
391
- /**
392
- * Compute the retrieval weight for a knowledge scope.
393
- *
394
- * weight = graphProximity × intentBias × authorityFactor
395
- *
396
- * Per spec: weight(scope) = graph_proximity × intent_bias × freshness_bonus × authority
397
- * Freshness is applied per-result in the fusion stage, not per-scope.
398
- */
399
- export function computeScopeWeight(input: ScopeWeightInput): number {
400
- const { graphProximity, scopeLevel, intentBiases, authorityFactor } = input;
401
-
402
- const intentBias = intentBiases.scope_boost[scopeLevel] ?? 1.0;
403
-
404
- return Math.max(0, graphProximity * intentBias * authorityFactor);
405
- }
406
-
407
- /**
408
- * Compute per-result type boost from intent biases.
409
- */
410
- export function computeTypeBoost(knowledgeType: string, intentBiases: IntentBiases): number {
411
- return intentBiases.type_boost[knowledgeType] ?? 1.0;
412
- }
413
-
414
- /**
415
- * Authority factor for a source based on role and expertise.
416
- *
417
- * role_boost: 0.0 member, 0.1 lead, 0.15 senior/principal, 0.2 director+
418
- * expertise_weight: EXPERT_IN edge weight (0-1)
419
- * Documents get 1.2 base authority.
420
- */
421
- export function computeAuthority(params: {
422
- role?: string;
423
- expertiseWeight?: number;
424
- isDocument?: boolean;
425
- }): number {
426
- const { role, expertiseWeight = 0, isDocument = false } = params;
427
-
428
- if (isDocument) return 1.2;
429
-
430
- const roleBoosts: Record<string, number> = {
431
- member: 0.0,
432
- lead: 0.1,
433
- senior: 0.15,
434
- principal: 0.15,
435
- director: 0.2,
436
- vp: 0.2,
437
- cto: 0.2,
438
- };
439
-
440
- const roleBoost = roleBoosts[role?.toLowerCase() ?? 'member'] ?? 0.0;
441
- return Math.max(1.0, roleBoost + expertiseWeight);
442
- }
443
- ```
444
-
445
- - [ ] **Step 4: Run tests to verify they pass**
446
-
447
- Run: `npx vitest run tests/lib/cortex/retrieval/weight.test.ts`
448
- Expected: PASS (5 tests)
449
-
450
- - [ ] **Step 5: Commit**
451
-
452
- ```bash
453
- git add src/lib/cortex/retrieval/weight.ts tests/lib/cortex/retrieval/weight.test.ts
454
- git commit -m "feat(cortex): add scope weight computation for context assembly"
455
- ```
456
-
457
- ---
458
-
459
- ## Chunk 2: Conflict Detection and Context Formatting
460
-
461
- ### Task 3: Conflict detection
462
-
463
- **Files:**
464
- - Create: `src/lib/cortex/retrieval/conflict.ts`
465
- - Create: `tests/lib/cortex/retrieval/conflict.test.ts`
466
-
467
- - [ ] **Step 1: Write failing tests**
468
-
469
- ```typescript
470
- // tests/lib/cortex/retrieval/conflict.test.ts
471
- import { describe, it, expect } from 'vitest';
472
- import { detectConflicts } from '@/lib/cortex/retrieval/conflict';
473
- import type { ScoredKnowledge } from '@/lib/cortex/knowledge/types';
474
-
475
- function makeResult(overrides: Partial<ScoredKnowledge> = {}): ScoredKnowledge {
476
- return {
477
- id: 'r1', vector: [], text: 'test', type: 'decision', layer: 'personal',
478
- workspace_id: null, session_id: null, agent_type: 'claude',
479
- project_path: null, file_refs: [], confidence: 0.8,
480
- created: new Date().toISOString(), source_timestamp: new Date().toISOString(),
481
- stale_score: 0, access_count: 0, last_accessed: null, metadata: {},
482
- relevance_score: 0.9, similarity: 0.9,
483
- contradiction_refs: [], ...overrides,
484
- };
485
- }
486
-
487
- describe('detectConflicts', () => {
488
- it('returns no conflicts when no contradiction_refs', () => {
489
- const results = [makeResult({ id: 'a' }), makeResult({ id: 'b' })];
490
- const conflicts = detectConflicts(results);
491
- expect(conflicts).toHaveLength(0);
492
- });
493
-
494
- it('detects conflict between two results', () => {
495
- const results = [
496
- makeResult({ id: 'a', text: 'use pool size 50', contradiction_refs: ['b'] }),
497
- makeResult({ id: 'b', text: 'scale horizontally', contradiction_refs: ['a'] }),
498
- ];
499
- const conflicts = detectConflicts(results);
500
- expect(conflicts).toHaveLength(1);
501
- expect(conflicts[0].unitA.id).toBe('a');
502
- expect(conflicts[0].unitB.id).toBe('b');
503
- });
504
-
505
- it('ignores contradiction_refs pointing to results not in the set', () => {
506
- const results = [
507
- makeResult({ id: 'a', contradiction_refs: ['z'] }), // z is not in results
508
- ];
509
- const conflicts = detectConflicts(results);
510
- expect(conflicts).toHaveLength(0);
511
- });
512
-
513
- it('deduplicates symmetric conflicts', () => {
514
- // A contradicts B and B contradicts A should produce one conflict, not two
515
- const results = [
516
- makeResult({ id: 'a', contradiction_refs: ['b'] }),
517
- makeResult({ id: 'b', contradiction_refs: ['a'] }),
518
- ];
519
- const conflicts = detectConflicts(results);
520
- expect(conflicts).toHaveLength(1);
521
- });
522
- });
523
- ```
524
-
525
- - [ ] **Step 2: Implement conflict detection**
526
-
527
- ```typescript
528
- // src/lib/cortex/retrieval/conflict.ts
529
- import type { ScoredKnowledge } from '../knowledge/types';
530
-
531
- export interface ConflictPair {
532
- unitA: ScoredKnowledge;
533
- unitB: ScoredKnowledge;
534
- }
535
-
536
- /**
537
- * Detect conflicts among search results by checking contradiction_refs.
538
- * Returns deduplicated conflict pairs (A↔B counted once, not twice).
539
- */
540
- export function detectConflicts(results: ScoredKnowledge[]): ConflictPair[] {
541
- const resultMap = new Map(results.map(r => [r.id, r]));
542
- const seen = new Set<string>();
543
- const conflicts: ConflictPair[] = [];
544
-
545
- for (const result of results) {
546
- const refs = result.contradiction_refs ?? [];
547
- for (const refId of refs) {
548
- const other = resultMap.get(refId);
549
- if (!other) continue;
550
-
551
- const key = [result.id, refId].sort().join('|');
552
- if (seen.has(key)) continue;
553
- seen.add(key);
554
-
555
- conflicts.push({ unitA: result, unitB: other });
556
- }
557
- }
558
-
559
- return conflicts;
560
- }
561
- ```
562
-
563
- - [ ] **Step 3: Run tests, commit**
564
-
565
- Run: `npx vitest run tests/lib/cortex/retrieval/conflict.test.ts`
566
-
567
- ```bash
568
- git add src/lib/cortex/retrieval/conflict.ts tests/lib/cortex/retrieval/conflict.test.ts
569
- git commit -m "feat(cortex): add conflict detection for search results"
570
- ```
571
-
572
- ---
573
-
574
- ### Task 4: Context formatter
575
-
576
- **Files:**
577
- - Create: `src/lib/cortex/retrieval/formatter.ts`
578
- - Create: `tests/lib/cortex/retrieval/formatter.test.ts`
579
-
580
- - [ ] **Step 1: Write failing tests**
581
-
582
- ```typescript
583
- // tests/lib/cortex/retrieval/formatter.test.ts
584
- import { describe, it, expect } from 'vitest';
585
- import { formatContext } from '@/lib/cortex/retrieval/formatter';
586
- import type { ScoredKnowledge } from '@/lib/cortex/knowledge/types';
587
- import type { ConflictPair } from '@/lib/cortex/retrieval/conflict';
588
-
589
- function makeResult(overrides: Partial<ScoredKnowledge> = {}): ScoredKnowledge {
590
- return {
591
- id: 'r1', vector: [], text: 'test knowledge', type: 'decision', layer: 'personal',
592
- workspace_id: null, session_id: null, agent_type: 'claude',
593
- project_path: null, file_refs: [], confidence: 0.8,
594
- created: '2026-03-15T00:00:00.000Z', source_timestamp: '2026-03-15T00:00:00.000Z',
595
- stale_score: 0, access_count: 5, last_accessed: null, metadata: {},
596
- relevance_score: 0.9, similarity: 0.9,
597
- ...overrides,
598
- };
599
- }
600
-
601
- describe('formatContext', () => {
602
- it('wraps results in cortex-context tags', () => {
603
- const output = formatContext([makeResult()], []);
604
- expect(output).toContain('<cortex-context>');
605
- expect(output).toContain('</cortex-context>');
606
- });
607
-
608
- it('includes type labels and dates', () => {
609
- const output = formatContext([makeResult({ type: 'error_fix', source_timestamp: '2026-03-10T00:00:00.000Z' })], []);
610
- expect(output).toContain('[Error Fix]');
611
- expect(output).toContain('2026-03-10');
612
- });
613
-
614
- it('includes source attribution when origin is present', () => {
615
- const output = formatContext([makeResult({
616
- origin: { source_type: 'conversation', source_ref: 'sess-1', creator_entity_id: 'person-alice' },
617
- })], []);
618
- expect(output).toContain('person-alice');
619
- });
620
-
621
- it('includes conflict callout when conflicts exist', () => {
622
- const a = makeResult({ id: 'a', text: 'use pool size 50' });
623
- const b = makeResult({ id: 'b', text: 'scale horizontally' });
624
- const conflicts: ConflictPair[] = [{ unitA: a, unitB: b }];
625
- const output = formatContext([a, b], conflicts);
626
- expect(output).toContain('Conflicting');
627
- });
628
-
629
- it('respects max token budget', () => {
630
- const bigResults = Array.from({ length: 20 }, (_, i) =>
631
- makeResult({ id: `r${i}`, text: 'x'.repeat(500) })
632
- );
633
- const output = formatContext(bigResults, [], { maxTokens: 500 });
634
- // Should not include all 20 results (would be ~2500 tokens)
635
- expect(output.length).toBeLessThan(3000);
636
- });
637
-
638
- it('returns empty string when no results', () => {
639
- expect(formatContext([], [])).toBe('');
640
- });
641
- });
642
- ```
643
-
644
- - [ ] **Step 2: Implement context formatter**
645
-
646
- ```typescript
647
- // src/lib/cortex/retrieval/formatter.ts
648
- import type { ScoredKnowledge } from '../knowledge/types';
649
- import type { ConflictPair } from './conflict';
650
-
651
- const TYPE_LABELS: Record<string, string> = {
652
- decision: 'Decision', pattern: 'Pattern', preference: 'Preference',
653
- error_fix: 'Error Fix', context: 'Context', code_pattern: 'Code',
654
- command: 'Command', conversation: 'Conversation', summary: 'Summary',
655
- };
656
-
657
- export interface FormatOptions {
658
- maxTokens?: number;
659
- }
660
-
661
- /**
662
- * Format search results + conflicts as annotated <cortex-context> for RAG injection.
663
- */
664
- export function formatContext(
665
- results: ScoredKnowledge[],
666
- conflicts: ConflictPair[],
667
- options: FormatOptions = {},
668
- ): string {
669
- if (results.length === 0) return '';
670
-
671
- const maxTokens = options.maxTokens ?? 1500;
672
- const entries: string[] = [];
673
- let tokens = 20; // overhead for tags
674
-
675
- // Format each result with attribution
676
- for (const unit of results) {
677
- const label = TYPE_LABELS[unit.type] || unit.type;
678
- const date = (unit.source_timestamp || '').slice(0, 10);
679
- const creator = unit.origin?.creator_entity_id ?? '';
680
- const sourceInfo = creator ? ` (${creator})` : '';
681
-
682
- let entry = `[${label}] ${date}${sourceInfo}:\n ${unit.text}`;
683
-
684
- const entryTokens = Math.ceil(entry.length / 4);
685
- if (tokens + entryTokens > maxTokens) break;
686
-
687
- entries.push(entry);
688
- tokens += entryTokens;
689
- }
690
-
691
- if (entries.length === 0) return '';
692
-
693
- // Build conflict section
694
- let conflictSection = '';
695
- if (conflicts.length > 0) {
696
- const conflictLines = conflicts.map(c =>
697
- ` - "${c.unitA.text.slice(0, 80)}..." vs "${c.unitB.text.slice(0, 80)}..."`
698
- );
699
- conflictSection = `\nConflicting perspectives (${conflicts.length}):\n${conflictLines.join('\n')}\n`;
700
- }
701
-
702
- const sourceCount = entries.length;
703
- const header = `Relevant knowledge (${sourceCount} source${sourceCount > 1 ? 's' : ''}${conflicts.length > 0 ? `, ${conflicts.length} conflict${conflicts.length > 1 ? 's' : ''}` : ''}):`;
704
-
705
- return [
706
- '<cortex-context>',
707
- header,
708
- '',
709
- ...entries,
710
- conflictSection,
711
- '</cortex-context>',
712
- ].join('\n');
713
- }
714
- ```
715
-
716
- - [ ] **Step 3: Run tests, commit**
717
-
718
- Run: `npx vitest run tests/lib/cortex/retrieval/formatter.test.ts`
719
-
720
- ```bash
721
- git add src/lib/cortex/retrieval/formatter.ts tests/lib/cortex/retrieval/formatter.test.ts
722
- git commit -m "feat(cortex): add context formatter for RAG injection"
723
- ```
724
-
725
- ---
726
-
727
- ## Chunk 3: Context Assembly Engine
728
-
729
- ### Task 5: ContextEngine — the 6-stage pipeline
730
-
731
- **Files:**
732
- - Create: `src/lib/cortex/retrieval/context-engine.ts`
733
- - Create: `tests/lib/cortex/retrieval/context-engine.test.ts`
734
-
735
- - [ ] **Step 1: Write failing tests**
736
-
737
- ```typescript
738
- // tests/lib/cortex/retrieval/context-engine.test.ts
739
- import { describe, it, expect, vi, beforeEach } from 'vitest';
740
- import { ContextEngine } from '@/lib/cortex/retrieval/context-engine';
741
-
742
- // Create mocks for dependencies
743
- const mockStore = {
744
- search: vi.fn().mockResolvedValue([]),
745
- };
746
-
747
- const mockGraph = {
748
- proximity: vi.fn().mockReturnValue(0.5),
749
- neighborhood: vi.fn().mockReturnValue([]),
750
- getEntity: vi.fn().mockReturnValue(null),
751
- };
752
-
753
- const mockResolver = {
754
- extractEntities: vi.fn().mockReturnValue([]),
755
- };
756
-
757
- const mockEmbedding = {
758
- embed: vi.fn().mockResolvedValue([[0.1, 0.2, 0.3]]),
759
- dimensions: 3,
760
- name: 'mock',
761
- init: vi.fn(),
762
- };
763
-
764
- describe('ContextEngine', () => {
765
- let engine: ContextEngine;
766
-
767
- beforeEach(() => {
768
- vi.clearAllMocks();
769
- engine = new ContextEngine({
770
- store: mockStore as any,
771
- graph: mockGraph as any,
772
- resolver: mockResolver as any,
773
- embedding: mockEmbedding as any,
774
- requesterId: 'person-alice',
775
- });
776
- });
777
-
778
- it('returns empty context for empty results', async () => {
779
- const result = await engine.assemble('some query');
780
- expect(result.results).toHaveLength(0);
781
- expect(result.context).toBe('');
782
- });
783
-
784
- it('calls embedding.embed with the query', async () => {
785
- await engine.assemble('test query');
786
- expect(mockEmbedding.embed).toHaveBeenCalledWith(['test query']);
787
- });
788
-
789
- it('detects intent from the query', async () => {
790
- const result = await engine.assemble('why does auth throw an error?');
791
- expect(result.intent.intent).toBe('debugging');
792
- });
793
-
794
- it('extracts entities from the query', async () => {
795
- mockResolver.extractEntities.mockReturnValue([
796
- { entity: { id: 'system-auth', type: 'system', name: 'Auth' }, confidence: 0.9, method: 'alias' },
797
- ]);
798
- const result = await engine.assemble('fix the auth service');
799
- expect(mockResolver.extractEntities).toHaveBeenCalledWith('fix the auth service');
800
- expect(result.entities).toHaveLength(1);
801
- });
802
-
803
- it('searches store with embedded query vector', async () => {
804
- mockStore.search.mockResolvedValue([{
805
- id: 'k1', text: 'test knowledge', type: 'decision', layer: 'personal',
806
- confidence: 0.8, stale_score: 0, created: new Date().toISOString(),
807
- source_timestamp: new Date().toISOString(), evidence_score: 0.7,
808
- contradiction_refs: [], _distance: 0.2,
809
- workspace_id: null, session_id: null, agent_type: 'claude',
810
- project_path: null, file_refs: [], access_count: 0, last_accessed: null,
811
- metadata: {},
812
- }]);
813
-
814
- const result = await engine.assemble('test query');
815
- expect(result.results.length).toBeGreaterThanOrEqual(1);
816
- expect(result.context).toContain('<cortex-context>');
817
- });
818
-
819
- it('completes within performance budget', async () => {
820
- const start = Date.now();
821
- await engine.assemble('test query');
822
- const elapsed = Date.now() - start;
823
- expect(elapsed).toBeLessThan(500); // generous for CI, target is 150ms
824
- });
825
- });
826
- ```
827
-
828
- - [ ] **Step 2: Implement ContextEngine**
829
-
830
- ```typescript
831
- // src/lib/cortex/retrieval/context-engine.ts
832
- import type { CortexStore } from '../store';
833
- import type { EntityGraph } from '../graph/entity-graph';
834
- import type { EntityResolver, ResolvedEntity } from '../graph/resolver';
835
- import type { EmbeddingProvider } from '../embeddings';
836
- import type { ScoredKnowledge } from '../knowledge/types';
837
- import { detectIntent } from './intent';
838
- import type { IntentResult } from './intent';
839
- import { computeScopeWeight, computeTypeBoost } from './weight';
840
- import { detectConflicts } from './conflict';
841
- import type { ConflictPair } from './conflict';
842
- import { formatContext } from './formatter';
843
- import { computeRelevanceScore } from './scoring';
844
-
845
- export interface ContextEngineDeps {
846
- store: CortexStore;
847
- graph: EntityGraph;
848
- resolver: EntityResolver;
849
- embedding: EmbeddingProvider;
850
- requesterId: string; // entity ID of the person making the query
851
- }
852
-
853
- export interface AssemblyResult {
854
- results: ScoredKnowledge[];
855
- conflicts: ConflictPair[];
856
- context: string; // formatted <cortex-context> string
857
- intent: IntentResult;
858
- entities: ResolvedEntity[];
859
- timing: {
860
- intentMs: number;
861
- entityMs: number;
862
- searchMs: number;
863
- totalMs: number;
864
- };
865
- }
866
-
867
- interface SearchSource {
868
- layerKey: string;
869
- weight: number;
870
- limit: number;
871
- }
872
-
873
- const DEFAULT_LAYERS = ['personal', 'workspace', 'team'] as const;
874
- const SEARCH_TIMEOUT_MS = 100;
875
-
876
- export class ContextEngine {
877
- constructor(private deps: ContextEngineDeps) {}
878
-
879
- async assemble(query: string, options: { limit?: number; workspaceId?: number | null; maxTokens?: number } = {}): Promise<AssemblyResult> {
880
- const totalStart = Date.now();
881
- const { limit = 5, workspaceId = null, maxTokens = 1500 } = options;
882
-
883
- // Stage 1: Intent Detection
884
- const intentStart = Date.now();
885
- const intent = detectIntent(query);
886
- const intentMs = Date.now() - intentStart;
887
-
888
- // Stage 2: Entity Resolution
889
- const entityStart = Date.now();
890
- const entities = this.deps.resolver.extractEntities(query);
891
- const entityMs = Date.now() - entityStart;
892
-
893
- // Embed the query
894
- const [queryVector] = await this.deps.embedding.embed([query]);
895
-
896
- // Stage 3: Weight Computation
897
- const sources = this.computeSourceWeights(intent, workspaceId);
898
-
899
- // Stage 4: Parallel Multi-Source Search
900
- const searchStart = Date.now();
901
- const allResults = await this.parallelSearch(queryVector, sources, limit);
902
- const searchMs = Date.now() - searchStart;
903
-
904
- // Stage 5: Fusion + Re-Ranking
905
- const fused = this.fuseAndRank(allResults, intent, limit);
906
-
907
- // Stage 6: Conflict Detection + Formatting
908
- const conflicts = detectConflicts(fused);
909
- const context = formatContext(fused, conflicts, { maxTokens });
910
-
911
- return {
912
- results: fused,
913
- conflicts,
914
- context,
915
- intent,
916
- entities,
917
- timing: {
918
- intentMs,
919
- entityMs,
920
- searchMs,
921
- totalMs: Date.now() - totalStart,
922
- },
923
- };
924
- }
925
-
926
- private computeSourceWeights(intent: IntentResult, workspaceId: number | null): SearchSource[] {
927
- const sources: SearchSource[] = [];
928
-
929
- for (const layer of DEFAULT_LAYERS) {
930
- const layerKey = layer === 'workspace' && workspaceId
931
- ? `workspace/${workspaceId}` : layer;
932
-
933
- // Map v1 layer to scope level for intent bias lookup
934
- const scopeLevel = layer === 'personal' ? 'personal'
935
- : layer === 'workspace' ? 'team' : 'organization';
936
-
937
- // Use graph proximity if available, else fall back to fixed weights
938
- let graphProximity: number;
939
- try {
940
- // For personal, distance is 0; for workspace, 1; for team, 2
941
- const layerEntity = layer === 'personal' ? this.deps.requesterId
942
- : layer === 'workspace' ? 'team-default' : 'organization-default';
943
- graphProximity = this.deps.graph.proximity(this.deps.requesterId, layerEntity);
944
- } catch {
945
- // Graph not populated, use fallback
946
- graphProximity = layer === 'personal' ? 1.0 : layer === 'workspace' ? 0.5 : 0.33;
947
- }
948
-
949
- // If graph returns 0 (unreachable/not found), use fallback
950
- if (graphProximity === 0) {
951
- graphProximity = layer === 'personal' ? 1.0 : layer === 'workspace' ? 0.5 : 0.33;
952
- }
953
-
954
- const weight = computeScopeWeight({
955
- graphProximity,
956
- scopeLevel,
957
- intentBiases: intent.biases,
958
- authorityFactor: 1.0,
959
- });
960
-
961
- sources.push({
962
- layerKey,
963
- weight,
964
- limit: Math.max(3, Math.round(weight * 10)), // proportional slots
965
- });
966
- }
967
-
968
- return sources.sort((a, b) => b.weight - a.weight);
969
- }
970
-
971
- private async parallelSearch(
972
- queryVector: number[],
973
- sources: SearchSource[],
974
- limit: number,
975
- ): Promise<Array<ScoredKnowledge & { sourceWeight: number }>> {
976
- const searchPromises = sources.map(async (source) => {
977
- try {
978
- const results = await Promise.race([
979
- this.deps.store.search(source.layerKey, queryVector, source.limit),
980
- new Promise<never>((_, reject) =>
981
- setTimeout(() => reject(new Error('timeout')), SEARCH_TIMEOUT_MS)
982
- ),
983
- ]);
984
-
985
- return results.map(unit => {
986
- const similarity = 1 - ((unit as any)._distance ?? 0);
987
- return {
988
- ...unit,
989
- similarity,
990
- relevance_score: 0, // computed in fusion
991
- sourceWeight: source.weight,
992
- } as ScoredKnowledge & { sourceWeight: number };
993
- });
994
- } catch {
995
- return []; // source failed or timed out
996
- }
997
- });
998
-
999
- const settled = await Promise.allSettled(searchPromises);
1000
- const allResults: Array<ScoredKnowledge & { sourceWeight: number }> = [];
1001
-
1002
- for (const result of settled) {
1003
- if (result.status === 'fulfilled') {
1004
- allResults.push(...result.value);
1005
- }
1006
- }
1007
-
1008
- return allResults;
1009
- }
1010
-
1011
- private fuseAndRank(
1012
- results: Array<ScoredKnowledge & { sourceWeight: number }>,
1013
- intent: IntentResult,
1014
- limit: number,
1015
- ): ScoredKnowledge[] {
1016
- // Score each result
1017
- for (const result of results) {
1018
- const typeBoost = computeTypeBoost(result.type, intent.biases);
1019
- const recencyBoost = intent.biases.recency_boost;
1020
-
1021
- result.relevance_score = computeRelevanceScore({
1022
- similarity: result.similarity,
1023
- confidence: result.confidence,
1024
- stale_score: result.stale_score,
1025
- created: result.created,
1026
- evidence_score: result.evidence_score,
1027
- }) * result.sourceWeight * typeBoost * recencyBoost;
1028
- }
1029
-
1030
- // Deduplicate: cosine > 0.9 between results (approximate via text similarity)
1031
- const deduped = this.deduplicateResults(results);
1032
-
1033
- // Sort and take top K
1034
- deduped.sort((a, b) => b.relevance_score - a.relevance_score);
1035
- return deduped.slice(0, limit);
1036
- }
1037
-
1038
- private deduplicateResults(results: ScoredKnowledge[]): ScoredKnowledge[] {
1039
- const kept: ScoredKnowledge[] = [];
1040
- const seenTexts = new Set<string>();
1041
-
1042
- // Sort by score first so we keep the better-scored version
1043
- results.sort((a, b) => b.relevance_score - a.relevance_score);
1044
-
1045
- for (const result of results) {
1046
- // Simple text-based dedup: normalize and check prefix overlap
1047
- const normalized = result.text.slice(0, 200).toLowerCase().trim();
1048
- if (seenTexts.has(normalized)) continue;
1049
-
1050
- // Check against existing kept items for high text overlap
1051
- let isDupe = false;
1052
- for (const existing of kept) {
1053
- if (result.id === existing.id) { isDupe = true; break; }
1054
- // If texts share >80% of content, consider duplicate
1055
- const existNorm = existing.text.slice(0, 200).toLowerCase().trim();
1056
- if (normalized === existNorm) { isDupe = true; break; }
1057
- }
1058
-
1059
- if (!isDupe) {
1060
- seenTexts.add(normalized);
1061
- kept.push(result);
1062
- }
1063
- }
1064
-
1065
- return kept;
1066
- }
1067
- }
1068
- ```
1069
-
1070
- - [ ] **Step 3: Run tests to verify they pass**
1071
-
1072
- Run: `npx vitest run tests/lib/cortex/retrieval/context-engine.test.ts`
1073
- Expected: PASS (6 tests)
1074
-
1075
- - [ ] **Step 4: Commit**
1076
-
1077
- ```bash
1078
- git add src/lib/cortex/retrieval/context-engine.ts tests/lib/cortex/retrieval/context-engine.test.ts
1079
- git commit -m "feat(cortex): add ContextEngine with 6-stage retrieval pipeline"
1080
- ```
1081
-
1082
- ---
1083
-
1084
- ## Chunk 4: API Endpoint and Hook Integration
1085
-
1086
- ### Task 6: Context assembly API endpoint
1087
-
1088
- **Files:**
1089
- - Create: `src/app/api/cortex/context/route.ts`
1090
-
1091
- - [ ] **Step 1: Create the endpoint**
1092
-
1093
- ```typescript
1094
- // src/app/api/cortex/context/route.ts
1095
- import { NextResponse } from 'next/server';
1096
- import type { NextRequest } from 'next/server';
1097
- import { getAuthUser, withUser } from '@/lib/auth';
1098
- import { getCortex, isCortexAvailable } from '@/lib/cortex';
1099
- import { ContextEngine } from '@/lib/cortex/retrieval/context-engine';
1100
- import { EntityResolver } from '@/lib/cortex/graph/resolver';
1101
- import { slugify } from '@/lib/cortex/graph/types';
1102
-
1103
- export async function GET(request: NextRequest) {
1104
- const user = getAuthUser(request);
1105
- return withUser(user, async () => {
1106
- if (!isCortexAvailable()) {
1107
- return NextResponse.json({ error: 'Cortex unavailable' }, { status: 403 });
1108
- }
1109
- const cortex = await getCortex();
1110
- if (!cortex) return NextResponse.json({ results: [], context: '' });
1111
-
1112
- const url = new URL(request.url);
1113
- const query = url.searchParams.get('q') || '';
1114
- const limit = parseInt(url.searchParams.get('limit') || '5', 10);
1115
- const workspaceId = url.searchParams.get('workspace_id');
1116
- const maxTokens = parseInt(url.searchParams.get('max_tokens') || '1500', 10);
1117
-
1118
- if (!query || query.length < 3) {
1119
- return NextResponse.json({ results: [], context: '' });
1120
- }
1121
-
1122
- const resolver = new EntityResolver(cortex.graph);
1123
- const requesterId = `person-${slugify(user)}`;
1124
-
1125
- const engine = new ContextEngine({
1126
- store: cortex.store,
1127
- graph: cortex.graph,
1128
- resolver,
1129
- embedding: cortex.embedding,
1130
- requesterId,
1131
- });
1132
-
1133
- const result = await engine.assemble(query, {
1134
- limit,
1135
- workspaceId: workspaceId ? parseInt(workspaceId, 10) : null,
1136
- maxTokens,
1137
- });
1138
-
1139
- return NextResponse.json({
1140
- results: result.results.map(r => ({ ...r, vector: undefined })), // strip vectors
1141
- context: result.context,
1142
- intent: result.intent,
1143
- conflicts: result.conflicts.length,
1144
- timing: result.timing,
1145
- });
1146
- });
1147
- }
1148
- ```
1149
-
1150
- - [ ] **Step 2: Commit**
1151
-
1152
- ```bash
1153
- git add src/app/api/cortex/context/route.ts
1154
- git commit -m "feat(cortex): add context assembly API endpoint"
1155
- ```
1156
-
1157
- ---
1158
-
1159
- ### Task 7: Update RAG hook to use context assembly endpoint
1160
-
1161
- **Files:**
1162
- - Modify: `bin/cortex-hook.js`
1163
-
1164
- - [ ] **Step 1: Read current cortex-hook.js**
1165
-
1166
- Read the file to understand the current flow: query → /api/cortex/search → format results → output.
1167
-
1168
- - [ ] **Step 2: Update to call context assembly endpoint**
1169
-
1170
- Change the URL from `/api/cortex/search/?q=...` to `/api/cortex/context/?q=...`. The new endpoint returns `{ context, results, intent, conflicts, timing }` — the `context` field is already pre-formatted as `<cortex-context>`, so the hook can output it directly instead of doing its own formatting.
1171
-
1172
- Key changes:
1173
- 1. URL: `/api/cortex/search/` → `/api/cortex/context/`
1174
- 2. Response handling: use `parsed.context` directly instead of formatting results manually
1175
- 3. Keep the fallback: if the new endpoint returns empty or fails, fall back to old behavior
1176
-
1177
- ```javascript
1178
- // Replace the response handling section:
1179
- const parsed = JSON.parse(body);
1180
-
1181
- // New: context is pre-formatted by the Context Assembly Engine
1182
- if (parsed.context) {
1183
- const output = JSON.stringify({
1184
- hookSpecificOutput: {
1185
- hookEventName: 'UserPromptSubmit',
1186
- additionalContext: parsed.context,
1187
- },
1188
- });
1189
- process.stdout.write(output);
1190
- process.exit(0);
1191
- }
1192
-
1193
- // Fallback: old-style results formatting (if context endpoint not available)
1194
- const results = parsed.results;
1195
- if (!results || results.length === 0) process.exit(0);
1196
- // ... existing formatting code stays as fallback ...
1197
- ```
1198
-
1199
- - [ ] **Step 3: Commit**
1200
-
1201
- ```bash
1202
- git add bin/cortex-hook.js
1203
- git commit -m "feat(cortex): switch RAG hook to context assembly endpoint"
1204
- ```
1205
-
1206
- ---
1207
-
1208
- ### Task 8: Integrate ContextEngine into CortexInstance
1209
-
1210
- **Files:**
1211
- - Modify: `src/lib/cortex/index.ts`
1212
-
1213
- - [ ] **Step 1: Read current index.ts**
1214
-
1215
- - [ ] **Step 2: Add ContextEngine to CortexInstance**
1216
-
1217
- 1. Import: `import { ContextEngine } from './retrieval/context-engine';` and `import { EntityResolver } from './graph/resolver';`
1218
- 2. Add `contextEngine?: ContextEngine` to `CortexInstance` interface (optional since it depends on graph)
1219
- 3. In `getCortex()`, after graph initialization, create the ContextEngine:
1220
-
1221
- ```typescript
1222
- const resolver = new EntityResolver(graph);
1223
- const contextEngine = new ContextEngine({
1224
- store,
1225
- graph,
1226
- resolver,
1227
- embedding,
1228
- requesterId: 'person-default-user', // default; overridden per-request in API
1229
- });
1230
- ```
1231
-
1232
- 4. Add to instance object: `contextEngine,`
1233
-
1234
- - [ ] **Step 3: Run full cortex test suite**
1235
-
1236
- Run: `npx vitest run tests/lib/cortex/`
1237
-
1238
- - [ ] **Step 4: Commit**
1239
-
1240
- ```bash
1241
- git add src/lib/cortex/index.ts
1242
- git commit -m "feat(cortex): add ContextEngine to CortexInstance"
1243
- ```
1244
-
1245
- ---
1246
-
1247
- ## Summary
1248
-
1249
- | Task | Component | Tests | Status |
1250
- |------|-----------|-------|--------|
1251
- | 1 | Intent detection | 7 | |
1252
- | 2 | Weight computation | 5 | |
1253
- | 3 | Conflict detection | 4 | |
1254
- | 4 | Context formatter | 6 | |
1255
- | 5 | ContextEngine (6-stage pipeline) | 6 | |
1256
- | 6 | Context assembly API endpoint | — | |
1257
- | 7 | RAG hook integration | — | |
1258
- | 8 | CortexInstance integration | regression | |
1259
-
1260
- **Total: 8 tasks, ~28 new tests, 4 chunks**
1261
-
1262
- **Performance budget:** The ContextEngine targets <150ms total latency:
1263
- - Intent detection: <5ms (regex, no LLM)
1264
- - Entity resolution: <5ms (alias lookup)
1265
- - Weight computation: <10ms (graph proximity, cached)
1266
- - Parallel search: <100ms (concurrent vector search with 100ms timeout)
1267
- - Fusion + formatting: <10ms
1268
-
1269
- **Key design decisions:**
1270
- - ContextEngine sits ABOVE CortexSearch — doesn't replace it, wraps it
1271
- - Graph proximity drives weights — but gracefully degrades to fixed weights when graph is empty
1272
- - Deduplication uses text prefix comparison (not cosine between result vectors — that would require N² vector ops)
1273
- - RAG hook uses pre-formatted `context` from the engine — no more client-side formatting
1274
- - Old `/api/cortex/search` endpoint still works — new `/api/cortex/context` endpoint adds the intelligence layer