@jlongo78/agent-spaces 0.9.6 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (917) hide show
  1. package/.next/standalone/.claude/settings.local.json +68 -0
  2. package/.next/standalone/.claude/spaces-env.json +1 -0
  3. package/.next/standalone/.next/BUILD_ID +1 -1
  4. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  5. package/.next/standalone/.next/build-manifest.json +2 -2
  6. package/.next/standalone/.next/prerender-manifest.json +3 -3
  7. package/.next/standalone/.next/required-server-files.json +19 -19
  8. package/.next/standalone/.next/routes-manifest.json +6 -0
  9. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  26. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  27. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  28. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  34. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  35. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  36. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  38. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  42. package/.next/standalone/.next/server/app/admin/analytics.rsc +2 -2
  43. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  47. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +2 -2
  48. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  50. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  52. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  53. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  57. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  61. package/.next/standalone/.next/server/app/analytics.html +1 -1
  62. package/.next/standalone/.next/server/app/analytics.rsc +2 -2
  63. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
  67. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  70. package/.next/standalone/.next/server/app/api/analytics/overview/route.js +1 -1
  71. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/benchmark/run/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/benchmark/run/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/benchmark/status/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/benchmark/status/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/bulk/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  85. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/cortex/context/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/cortex/export/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js +1 -1
  105. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js +1 -1
  109. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/import/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/cortex/search/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/cortex/settings/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/cortex/status/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/cortex/usage/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/files/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/folders/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/network/handshake/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/network/panes/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/network/panes/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/network/projects/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/network/search/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/network/sessions/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/network/workspaces/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/panes/[id]/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/panes/route.js +1 -1
  185. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  187. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js +1 -1
  191. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/search/route.js +2 -2
  193. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js +1 -1
  197. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +1 -1
  199. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/sessions/route.js +2 -2
  201. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/sync/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/tags/route.js +1 -1
  205. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/tier/route.js +1 -1
  207. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/whisper/config/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/whisper/config/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/wizard/chart/route/app-paths-manifest.json +3 -0
  212. package/.next/standalone/.next/server/app/api/wizard/chart/route/build-manifest.json +11 -0
  213. package/.next/standalone/.next/server/app/api/wizard/chart/route/server-reference-manifest.json +4 -0
  214. package/.next/standalone/.next/server/app/api/wizard/chart/route.js +7 -0
  215. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.map +5 -0
  216. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.nft.json +1 -0
  217. package/.next/standalone/.next/server/app/api/wizard/chart/route_client-reference-manifest.js +2 -0
  218. package/.next/standalone/.next/server/app/api/wizard/chat/route.js +1 -1
  219. package/.next/standalone/.next/server/app/api/wizard/chat/route.js.nft.json +1 -1
  220. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js +1 -1
  221. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  222. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js +1 -1
  223. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  224. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js +1 -1
  227. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js +1 -1
  231. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/workspaces/route.js +2 -2
  233. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  234. package/.next/standalone/.next/server/app/cortex.html +1 -1
  235. package/.next/standalone/.next/server/app/cortex.rsc +3 -3
  236. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
  237. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  238. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  239. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +3 -3
  240. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  242. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  243. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/login.html +1 -1
  245. package/.next/standalone/.next/server/app/login.rsc +2 -2
  246. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  247. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  248. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  249. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  250. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  251. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  252. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  255. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  256. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  257. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  258. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  259. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  260. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  262. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  263. package/.next/standalone/.next/server/app/m/sessions/[id]/page.js.nft.json +1 -1
  264. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  267. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  268. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  270. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  271. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  272. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  273. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  274. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  275. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  277. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  278. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  279. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  280. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  281. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  282. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  283. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  284. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  285. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  287. package/.next/standalone/.next/server/app/m/terminal.rsc +3 -3
  288. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +3 -3
  289. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  290. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  291. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  292. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +2 -2
  293. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  294. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/m.html +1 -1
  296. package/.next/standalone/.next/server/app/m.rsc +2 -2
  297. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  298. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  299. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  300. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  301. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  302. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  303. package/.next/standalone/.next/server/app/network.html +1 -1
  304. package/.next/standalone/.next/server/app/network.rsc +2 -2
  305. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  306. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  307. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  308. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  309. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  311. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/projects.html +1 -1
  313. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  314. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  315. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  316. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  317. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  318. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  319. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  320. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  321. package/.next/standalone/.next/server/app/sessions.html +1 -1
  322. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  323. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  324. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  325. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  326. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  327. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  329. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  330. package/.next/standalone/.next/server/app/settings.html +1 -1
  331. package/.next/standalone/.next/server/app/settings.rsc +2 -2
  332. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +1 -1
  333. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  334. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  335. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  336. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  337. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  338. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  339. package/.next/standalone/.next/server/app/terminal.html +1 -1
  340. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  341. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  342. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  343. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  344. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  345. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  346. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  347. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  348. package/.next/standalone/.next/server/app/vr/page/react-loadable-manifest.json +1 -1
  349. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
  350. package/.next/standalone/.next/server/app/vr.html +1 -1
  351. package/.next/standalone/.next/server/app/vr.rsc +3 -3
  352. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +3 -3
  353. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
  354. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
  355. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
  356. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +2 -2
  357. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
  358. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  359. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  360. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  361. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  362. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  363. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  364. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  365. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  366. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  367. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  368. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +98 -0
  369. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +98 -0
  370. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +98 -0
  371. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bb331da9._.js → [root-of-the-server]__046c9b91._.js} +3 -3
  372. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +98 -0
  373. package/.next/standalone/.next/server/chunks/[root-of-the-server]__056fa416._.js +1 -1
  374. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ac4ea3f._.js +3 -0
  375. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8e64cb._.js +98 -0
  376. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__d95165f0._.js → [root-of-the-server]__0facd39e._.js} +3 -3
  377. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +3 -0
  378. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__9d68157b._.js → [root-of-the-server]__115f3934._.js} +3 -3
  379. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11f155f1._.js +3 -0
  380. package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +22 -33
  381. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__91e23c96._.js → [root-of-the-server]__17a3b966._.js} +3 -3
  382. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__277d9445._.js → [root-of-the-server]__17d3a2b2._.js} +3 -3
  383. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +98 -0
  384. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20b5e9c4._.js +3 -0
  385. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28d6fbd8._.js +98 -0
  386. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__04f04898._.js → [root-of-the-server]__2a3f866b._.js} +2 -2
  387. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a95bb38b._.js → [root-of-the-server]__316617e7._.js} +2 -2
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +98 -0
  389. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__6fe5e6c8._.js → [root-of-the-server]__35457394._.js} +2 -2
  390. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1f054c65._.js → [root-of-the-server]__35de78e6._.js} +3 -3
  391. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +98 -0
  392. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__614458b7._.js → [root-of-the-server]__38954988._.js} +3 -3
  393. package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +106 -0
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +98 -0
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +98 -0
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +98 -0
  397. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +98 -0
  398. package/.next/standalone/.next/server/chunks/[root-of-the-server]__65676930._.js +3 -0
  399. package/.next/standalone/.next/server/chunks/[root-of-the-server]__67cab326._.js +58 -0
  400. package/.next/standalone/.next/server/chunks/[root-of-the-server]__698c6f01._.js +98 -0
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6c64af29._.js +131 -0
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +98 -0
  403. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac84b704._.js → [root-of-the-server]__79b6a9bb._.js} +3 -3
  404. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e56abacf._.js → [root-of-the-server]__7db704c6._.js} +4 -4
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +98 -0
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +98 -0
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +98 -0
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +98 -0
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +98 -0
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +98 -0
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +98 -0
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +98 -0
  413. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2d7a454e._.js → [root-of-the-server]__8f2ccc41._.js} +3 -3
  414. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2a2c5fc5._.js → [root-of-the-server]__95c9d682._.js} +4 -4
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +98 -0
  416. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cc6e2885._.js → [root-of-the-server]__9edcff87._.js} +2 -2
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +98 -0
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +98 -0
  419. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__929ea03a._.js → [root-of-the-server]__a83262a1._.js} +2 -2
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +98 -0
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9d7f822._.js +98 -0
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +98 -0
  423. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +98 -0
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +98 -0
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +98 -0
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +98 -0
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +98 -0
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0ac2895._.js +3 -0
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c130a00c._.js +1 -1
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c37d6380._.js +3 -0
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +98 -0
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +3 -3
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +98 -0
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +98 -0
  435. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +98 -0
  436. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5d92527._.js +1 -1
  437. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +98 -0
  438. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__2384f98e._.js → [root-of-the-server]__de14b9ae._.js} +3 -3
  439. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +98 -0
  440. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00fdfbda._.js → [root-of-the-server]__e2a996e5._.js} +2 -2
  441. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__4d903941._.js → [root-of-the-server]__e3477417._.js} +3 -3
  442. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__32dc5513._.js → [root-of-the-server]__e4db362e._.js} +2 -2
  443. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__49e42a3a._.js → [root-of-the-server]__e4e70b86._.js} +3 -3
  444. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__ac39ecc7._.js → [root-of-the-server]__e54925af._.js} +3 -3
  445. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8edc5b0._.js +98 -0
  446. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__eafd040b._.js → [root-of-the-server]__eab4d83b._.js} +2 -2
  447. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
  448. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__194955d4._.js → [root-of-the-server]__f056fd83._.js} +3 -3
  449. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +98 -0
  450. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +98 -0
  451. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +98 -0
  452. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +98 -0
  453. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wizard_chart_route_actions_888e2ec1.js +3 -0
  454. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2cffc362._.js +3 -0
  455. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f1050870._.js → [root-of-the-server]__47c97637._.js} +2 -2
  456. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  457. package/.next/standalone/.next/server/chunks/ssr/_17b946fd._.js +3 -0
  458. package/.next/standalone/.next/server/chunks/ssr/_2a1d79e7._.js +1 -1
  459. package/.next/standalone/.next/server/chunks/ssr/_5c3c4cfa._.js +7 -5
  460. package/.next/standalone/.next/server/chunks/ssr/_ba432382._.js +7 -5
  461. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +1 -1
  462. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +4 -4
  463. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
  464. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  465. package/.next/standalone/.next/server/pages/404.html +1 -1
  466. package/.next/standalone/.next/server/pages/500.html +2 -2
  467. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  468. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  469. package/.next/standalone/.next/static/chunks/0852575eb90c1e8d.js +85 -0
  470. package/.next/standalone/.next/static/chunks/{74d0ac0b1d0a1b79.js → 10b00b4f66102dcf.js} +1 -1
  471. package/.next/standalone/.next/static/chunks/{16eb77953dee9ea3.js → 19c71a8376c23c58.js} +1 -1
  472. package/.next/standalone/.next/static/chunks/2b769d1597e4fc1c.css +3 -0
  473. package/.next/standalone/.next/static/chunks/{3e91fc608659c524.js → 350271fe79509caf.js} +1 -1
  474. package/.next/standalone/.next/static/chunks/{70423c7afd8abf5f.js → 597847c22200c212.js} +1 -1
  475. package/.next/standalone/.next/static/chunks/{fb0abd1933b2b2e1.js → 7f6a14f1849fa94d.js} +1 -1
  476. package/.next/standalone/.next/static/chunks/{7ecd9bbb0ce4d68a.js → b7c8fe9b7275a84f.js} +1 -1
  477. package/.next/standalone/.next/static/chunks/{6245135a7afb8c7b.js → c9b10fc55516d142.js} +8 -6
  478. package/.next/standalone/.next/static/chunks/d0065f48eab94944.js +1 -0
  479. package/.next/standalone/.next/static/chunks/{180c1b9ff31b979f.js → f7b34c807badf95d.js} +8 -6
  480. package/.next/standalone/.spaces/cortex-context.md +50 -144
  481. package/.next/standalone/LICENSE +661 -661
  482. package/.next/standalone/NOTICE +5 -5
  483. package/.next/standalone/README.md +131 -131
  484. package/.next/standalone/bin/cortex-hook.js +79 -79
  485. package/.next/standalone/bin/cortex-hook.sh +62 -62
  486. package/.next/standalone/bin/cortex-learn-hook.js +138 -138
  487. package/.next/standalone/bin/cortex-mcp.js +60 -60
  488. package/.next/standalone/bin/cortex-pi-extension.ts +170 -170
  489. package/.next/standalone/bin/fix-standalone-externals.js +79 -79
  490. package/.next/standalone/bin/lib/auto-setup.js +110 -110
  491. package/.next/standalone/bin/mdns-service.js +171 -171
  492. package/.next/standalone/bin/postinstall.js +35 -35
  493. package/.next/standalone/bin/setup-admin.js +195 -195
  494. package/.next/standalone/bin/spaces-dev.js +247 -247
  495. package/.next/standalone/bin/spaces-install.js +660 -660
  496. package/.next/standalone/bin/spaces-postinstall.js +50 -50
  497. package/.next/standalone/bin/spaces-reset-totp.js +50 -50
  498. package/.next/standalone/bin/spaces-service.js +1046 -1046
  499. package/.next/standalone/bin/spaces-setup.js +253 -253
  500. package/.next/standalone/bin/spaces.js +808 -805
  501. package/.next/standalone/bin/ssh-auth-keys.sh +68 -68
  502. package/.next/standalone/bin/terminal-server.js +2819 -2781
  503. package/.next/standalone/cortex-hook-debug.log +57 -23
  504. package/.next/standalone/docker-compose.yml +28 -28
  505. package/.next/standalone/docs/architecture.md +387 -387
  506. package/.next/standalone/docs/cortex-integration-reference.md +268 -268
  507. package/.next/standalone/docs/cortex.md +293 -293
  508. package/.next/standalone/docs/getting-started.md +96 -96
  509. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-design.md +133 -133
  510. package/.next/standalone/docs/plans/2026-02-24-multi-agent-sessions-plan.md +959 -959
  511. package/.next/standalone/docs/plans/2026-03-02-security-audit.md +229 -229
  512. package/.next/standalone/docs/plans/2026-03-07-service-command-design.md +146 -146
  513. package/.next/standalone/docs/plans/2026-03-07-service-command-plan.md +254 -254
  514. package/.next/standalone/docs/server-install.md +564 -564
  515. package/.next/standalone/docs/social-card.html +150 -150
  516. package/.next/standalone/docs/superpowers/plans/2026-03-12-spaces-cortex.md +5270 -5270
  517. package/.next/standalone/docs/superpowers/plans/2026-03-13-cortex-wiring.md +1387 -1387
  518. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-entity-graph.md +1923 -1923
  519. package/.next/standalone/docs/superpowers/plans/2026-03-14-cortex-v2-knowledge-evolution.md +1113 -1113
  520. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-boundary-engine.md +853 -853
  521. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-context-engine.md +1274 -1274
  522. package/.next/standalone/docs/superpowers/plans/2026-03-15-cortex-v2-signal-ingestion.md +933 -933
  523. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-lobes.md +1080 -1080
  524. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-gravity-system.md +768 -768
  525. package/.next/standalone/docs/superpowers/plans/2026-03-16-cortex-v2-ui.md +1108 -1108
  526. package/.next/standalone/docs/superpowers/plans/2026-03-18-cortex-ui-integration.md +1846 -1846
  527. package/.next/standalone/docs/superpowers/plans/2026-03-19-vr-phase1-shell.md +1639 -1639
  528. package/.next/standalone/docs/superpowers/plans/2026-03-27-dockview-pane-layout.md +98 -98
  529. package/.next/standalone/docs/superpowers/specs/2026-03-11-universe-view-design.md +320 -320
  530. package/.next/standalone/docs/superpowers/specs/2026-03-12-spaces-brain-design.md +720 -720
  531. package/.next/standalone/docs/superpowers/specs/2026-03-13-cortex-wiring-design.md +268 -268
  532. package/.next/standalone/docs/superpowers/specs/2026-03-14-cortex-v2-design.md +623 -623
  533. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-lobes-design.md +263 -263
  534. package/.next/standalone/docs/superpowers/specs/2026-03-16-cortex-v2-ui-design.md +240 -240
  535. package/.next/standalone/docs/superpowers/specs/2026-03-16-pane-ux-design.md +77 -77
  536. package/.next/standalone/docs/superpowers/specs/2026-03-18-cortex-ui-integration-design.md +341 -341
  537. package/.next/standalone/docs/superpowers/specs/2026-03-19-vr-phase1-shell-design.md +288 -288
  538. package/.next/standalone/docs/superpowers/specs/2026-03-27-pane-diff-review-and-project-wizard-design.md +322 -322
  539. package/.next/standalone/docs/tiers.md +104 -104
  540. package/.next/standalone/eslint.config.mjs +18 -18
  541. package/.next/standalone/next.config.ts +20 -20
  542. package/.next/standalone/nginx.conf +53 -53
  543. package/.next/standalone/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node +0 -0
  544. package/.next/standalone/node_modules/@img/{sharp-linux-x64 → sharp-win32-x64}/package.json +39 -46
  545. package/.next/standalone/package-lock.json +14985 -14986
  546. package/.next/standalone/package.json +111 -111
  547. package/.next/standalone/postcss.config.mjs +7 -7
  548. package/.next/standalone/scripts/rebuild.cmd +65 -65
  549. package/.next/standalone/scripts/rebuild.sh +59 -59
  550. package/.next/standalone/server.js +1 -1
  551. package/.next/standalone/src/app/(desktop)/admin/analytics/page.tsx +266 -266
  552. package/.next/standalone/src/app/(desktop)/admin/users/page.tsx +399 -399
  553. package/.next/standalone/src/app/(desktop)/analytics/page.tsx +166 -166
  554. package/.next/standalone/src/app/(desktop)/cortex/page.tsx +81 -81
  555. package/.next/standalone/src/app/(desktop)/dashboard-client.tsx +56 -56
  556. package/.next/standalone/src/app/(desktop)/layout.tsx +18 -18
  557. package/.next/standalone/src/app/(desktop)/network/page.tsx +137 -137
  558. package/.next/standalone/src/app/(desktop)/page.tsx +17 -17
  559. package/.next/standalone/src/app/(desktop)/projects/page.tsx +68 -68
  560. package/.next/standalone/src/app/(desktop)/sessions/[id]/page.tsx +519 -519
  561. package/.next/standalone/src/app/(desktop)/sessions/page.tsx +145 -145
  562. package/.next/standalone/src/app/(desktop)/settings/page.tsx +446 -446
  563. package/.next/standalone/src/app/(desktop)/terminal/layout.tsx +7 -7
  564. package/.next/standalone/src/app/(desktop)/terminal/page.tsx +1330 -1291
  565. package/.next/standalone/src/app/(desktop)/terminal/pane/[id]/page.tsx +211 -211
  566. package/.next/standalone/src/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page.tsx +252 -252
  567. package/.next/standalone/src/app/(desktop)/workspaces/page.tsx +12 -12
  568. package/.next/standalone/src/app/api/admin/analytics/route.ts +10 -10
  569. package/.next/standalone/src/app/api/admin/users/[id]/route.ts +20 -20
  570. package/.next/standalone/src/app/api/admin/users/route.ts +15 -15
  571. package/.next/standalone/src/app/api/analytics/overview/route.ts +80 -80
  572. package/.next/standalone/src/app/api/auth/login/route.ts +10 -10
  573. package/.next/standalone/src/app/api/auth/logout/route.ts +9 -9
  574. package/.next/standalone/src/app/api/auth/me/route.ts +22 -22
  575. package/.next/standalone/src/app/api/auth/totp/setup/route.ts +10 -10
  576. package/.next/standalone/src/app/api/auth/totp/status/route.ts +10 -10
  577. package/.next/standalone/src/app/api/auth/totp/verify/route.ts +10 -10
  578. package/.next/standalone/src/app/api/benchmark/lobes/route.ts +16 -16
  579. package/.next/standalone/src/app/api/benchmark/run/route.ts +113 -92
  580. package/.next/standalone/src/app/api/benchmark/runs/[id]/route.ts +26 -26
  581. package/.next/standalone/src/app/api/benchmark/runs/route.ts +16 -16
  582. package/.next/standalone/src/app/api/benchmark/status/route.ts +35 -35
  583. package/.next/standalone/src/app/api/bulk/route.ts +34 -34
  584. package/.next/standalone/src/app/api/chat/route.ts +85 -85
  585. package/.next/standalone/src/app/api/config/route.ts +30 -30
  586. package/.next/standalone/src/app/api/cortex/context/route.ts +78 -78
  587. package/.next/standalone/src/app/api/cortex/curation/assess/route.ts +27 -27
  588. package/.next/standalone/src/app/api/cortex/curation/publish/route.ts +23 -23
  589. package/.next/standalone/src/app/api/cortex/curation/refine/route.ts +23 -23
  590. package/.next/standalone/src/app/api/cortex/curation/review/route.ts +29 -29
  591. package/.next/standalone/src/app/api/cortex/curation/seed/route.ts +23 -23
  592. package/.next/standalone/src/app/api/cortex/export/route.ts +40 -40
  593. package/.next/standalone/src/app/api/cortex/federation/pending/route.ts +20 -20
  594. package/.next/standalone/src/app/api/cortex/federation/resolve/route.ts +43 -43
  595. package/.next/standalone/src/app/api/cortex/federation/search/route.ts +35 -35
  596. package/.next/standalone/src/app/api/cortex/federation/teach/route.ts +76 -76
  597. package/.next/standalone/src/app/api/cortex/graph/edges/route.ts +112 -112
  598. package/.next/standalone/src/app/api/cortex/graph/entities/[id]/route.ts +73 -73
  599. package/.next/standalone/src/app/api/cortex/graph/entities/route.ts +75 -75
  600. package/.next/standalone/src/app/api/cortex/graph/populate/route.ts +203 -203
  601. package/.next/standalone/src/app/api/cortex/import/route.ts +75 -75
  602. package/.next/standalone/src/app/api/cortex/import/status/route.ts +15 -15
  603. package/.next/standalone/src/app/api/cortex/ingest/bootstrap/route.ts +39 -39
  604. package/.next/standalone/src/app/api/cortex/ingest/status/route.ts +15 -15
  605. package/.next/standalone/src/app/api/cortex/knowledge/[id]/route.ts +91 -91
  606. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +97 -97
  607. package/.next/standalone/src/app/api/cortex/lobes/[id]/route.ts +67 -67
  608. package/.next/standalone/src/app/api/cortex/lobes/route.ts +22 -22
  609. package/.next/standalone/src/app/api/cortex/lobes/share/route.ts +80 -80
  610. package/.next/standalone/src/app/api/cortex/marketplace/browse/route.ts +43 -43
  611. package/.next/standalone/src/app/api/cortex/marketplace/preview/route.ts +46 -46
  612. package/.next/standalone/src/app/api/cortex/mcp/call/route.ts +11 -11
  613. package/.next/standalone/src/app/api/cortex/mcp/tools/route.ts +8 -8
  614. package/.next/standalone/src/app/api/cortex/search/route.ts +57 -45
  615. package/.next/standalone/src/app/api/cortex/settings/route.ts +35 -35
  616. package/.next/standalone/src/app/api/cortex/status/route.ts +169 -169
  617. package/.next/standalone/src/app/api/cortex/timeline/route.ts +42 -42
  618. package/.next/standalone/src/app/api/cortex/usage/route.ts +31 -31
  619. package/.next/standalone/src/app/api/cortex/workspace/[id]/context/route.ts +41 -41
  620. package/.next/standalone/src/app/api/events/route.ts +40 -40
  621. package/.next/standalone/src/app/api/files/route.ts +187 -187
  622. package/.next/standalone/src/app/api/folders/route.ts +107 -97
  623. package/.next/standalone/src/app/api/network/connect-callback/route.ts +11 -11
  624. package/.next/standalone/src/app/api/network/connect-request/[id]/route.ts +11 -11
  625. package/.next/standalone/src/app/api/network/connect-request/route.ts +17 -17
  626. package/.next/standalone/src/app/api/network/discovered/route.ts +9 -9
  627. package/.next/standalone/src/app/api/network/handshake/route.ts +25 -25
  628. package/.next/standalone/src/app/api/network/health/route.ts +10 -10
  629. package/.next/standalone/src/app/api/network/identity/route.ts +15 -15
  630. package/.next/standalone/src/app/api/network/keys/[id]/route.ts +10 -10
  631. package/.next/standalone/src/app/api/network/keys/route.ts +15 -15
  632. package/.next/standalone/src/app/api/network/nodes/[id]/route.ts +15 -15
  633. package/.next/standalone/src/app/api/network/nodes/check/route.ts +9 -9
  634. package/.next/standalone/src/app/api/network/nodes/route.ts +15 -15
  635. package/.next/standalone/src/app/api/network/panes/[id]/route.ts +78 -62
  636. package/.next/standalone/src/app/api/network/panes/route.ts +61 -50
  637. package/.next/standalone/src/app/api/network/projects/route.ts +32 -25
  638. package/.next/standalone/src/app/api/network/proxy/[nodeId]/[...path]/route.ts +25 -25
  639. package/.next/standalone/src/app/api/network/search/route.ts +45 -38
  640. package/.next/standalone/src/app/api/network/sessions/[id]/messages/route.ts +43 -36
  641. package/.next/standalone/src/app/api/network/sessions/[id]/route.ts +41 -34
  642. package/.next/standalone/src/app/api/network/sessions/route.ts +50 -43
  643. package/.next/standalone/src/app/api/network/terminal/token/route.ts +10 -10
  644. package/.next/standalone/src/app/api/network/workspaces/[id]/route.ts +80 -71
  645. package/.next/standalone/src/app/api/network/workspaces/route.ts +87 -85
  646. package/.next/standalone/src/app/api/panes/[id]/diff/route.ts +121 -121
  647. package/.next/standalone/src/app/api/panes/[id]/route.ts +60 -60
  648. package/.next/standalone/src/app/api/panes/route.ts +39 -39
  649. package/.next/standalone/src/app/api/projects/route.ts +13 -13
  650. package/.next/standalone/src/app/api/proxy/models/[modelId]/[...path]/route.ts +80 -80
  651. package/.next/standalone/src/app/api/proxy/models/[modelId]/status/route.ts +33 -33
  652. package/.next/standalone/src/app/api/search/route.ts +47 -47
  653. package/.next/standalone/src/app/api/sessions/[id]/chat/route.ts +120 -120
  654. package/.next/standalone/src/app/api/sessions/[id]/messages/route.ts +34 -34
  655. package/.next/standalone/src/app/api/sessions/[id]/route.ts +73 -73
  656. package/.next/standalone/src/app/api/sessions/route.ts +64 -64
  657. package/.next/standalone/src/app/api/sync/route.ts +24 -24
  658. package/.next/standalone/src/app/api/tags/route.ts +35 -35
  659. package/.next/standalone/src/app/api/tier/route.ts +16 -16
  660. package/.next/standalone/src/app/api/updates/route.ts +65 -65
  661. package/.next/standalone/src/app/api/whisper/config/route.ts +50 -42
  662. package/.next/standalone/src/app/api/whisper/route.ts +91 -91
  663. package/.next/standalone/src/app/api/wizard/chart/route.ts +129 -0
  664. package/.next/standalone/src/app/api/wizard/chat/route.ts +113 -113
  665. package/.next/standalone/src/app/api/workspaces/[id]/context/[key]/route.ts +39 -39
  666. package/.next/standalone/src/app/api/workspaces/[id]/context/route.ts +28 -28
  667. package/.next/standalone/src/app/api/workspaces/[id]/messages/[msgId]/route.ts +17 -17
  668. package/.next/standalone/src/app/api/workspaces/[id]/messages/route.ts +39 -39
  669. package/.next/standalone/src/app/api/workspaces/[id]/route.ts +47 -47
  670. package/.next/standalone/src/app/api/workspaces/[id]/sessions/route.ts +62 -62
  671. package/.next/standalone/src/app/api/workspaces/route.ts +79 -79
  672. package/.next/standalone/src/app/globals.css +88 -88
  673. package/.next/standalone/src/app/layout.tsx +33 -33
  674. package/.next/standalone/src/app/login/layout.tsx +7 -7
  675. package/.next/standalone/src/app/login/page.tsx +315 -315
  676. package/.next/standalone/src/app/m/layout.tsx +16 -16
  677. package/.next/standalone/src/app/m/page.tsx +118 -118
  678. package/.next/standalone/src/app/m/projects/page.tsx +64 -64
  679. package/.next/standalone/src/app/m/sessions/[id]/page.tsx +168 -168
  680. package/.next/standalone/src/app/m/sessions/page.tsx +177 -177
  681. package/.next/standalone/src/app/m/settings/page.tsx +230 -230
  682. package/.next/standalone/src/app/m/terminal/page.tsx +413 -413
  683. package/.next/standalone/src/app/vr/page.tsx +21 -21
  684. package/.next/standalone/src/app/vr/vr-app.tsx +163 -163
  685. package/.next/standalone/src/app/vr/vr-controls.tsx +139 -139
  686. package/.next/standalone/src/app/vr/vr-door.tsx +82 -82
  687. package/.next/standalone/src/app/vr/vr-environment.tsx +71 -71
  688. package/.next/standalone/src/app/vr/vr-gaze.tsx +89 -89
  689. package/.next/standalone/src/app/vr/vr-layout.ts +49 -49
  690. package/.next/standalone/src/app/vr/vr-lobby.tsx +97 -97
  691. package/.next/standalone/src/app/vr/vr-pane.tsx +195 -195
  692. package/.next/standalone/src/app/vr/vr-room.tsx +79 -79
  693. package/.next/standalone/src/app/vr/vr-terminal.tsx +303 -303
  694. package/.next/standalone/src/components/auth/totp-gate.tsx +183 -183
  695. package/.next/standalone/src/components/bus/activity-panel.tsx +261 -261
  696. package/.next/standalone/src/components/common/color-picker.tsx +35 -35
  697. package/.next/standalone/src/components/common/dev-directory-picker.tsx +339 -339
  698. package/.next/standalone/src/components/common/folder-picker.tsx +200 -200
  699. package/.next/standalone/src/components/common/tag-picker.tsx +190 -190
  700. package/.next/standalone/src/components/common/workspace-picker.tsx +113 -113
  701. package/.next/standalone/src/components/cortex/benchmark-tab.tsx +894 -880
  702. package/.next/standalone/src/components/cortex/constants.ts +29 -29
  703. package/.next/standalone/src/components/cortex/cortex-dashboard.tsx +304 -304
  704. package/.next/standalone/src/components/cortex/cortex-indicator.tsx +44 -44
  705. package/.next/standalone/src/components/cortex/cortex-panel.tsx +140 -140
  706. package/.next/standalone/src/components/cortex/cortex-settings.tsx +280 -280
  707. package/.next/standalone/src/components/cortex/curation-tab.tsx +810 -810
  708. package/.next/standalone/src/components/cortex/entity-detail.tsx +101 -101
  709. package/.next/standalone/src/components/cortex/entity-graph.tsx +382 -382
  710. package/.next/standalone/src/components/cortex/import-dialog.tsx +212 -212
  711. package/.next/standalone/src/components/cortex/injection-badge.tsx +72 -72
  712. package/.next/standalone/src/components/cortex/knowledge-card.tsx +109 -109
  713. package/.next/standalone/src/components/cortex/knowledge-tab.tsx +158 -158
  714. package/.next/standalone/src/components/cortex/lobe-settings.tsx +215 -215
  715. package/.next/standalone/src/components/cortex/marketplace-card.tsx +126 -126
  716. package/.next/standalone/src/components/cortex/marketplace-tab.tsx +113 -113
  717. package/.next/standalone/src/components/dashboard/activity-chart.tsx +41 -41
  718. package/.next/standalone/src/components/dashboard/model-usage-chart.tsx +61 -61
  719. package/.next/standalone/src/components/dashboard/recent-sessions.tsx +68 -68
  720. package/.next/standalone/src/components/dashboard/stats-cards.tsx +36 -36
  721. package/.next/standalone/src/components/files/file-explorer.tsx +703 -703
  722. package/.next/standalone/src/components/layout/providers.tsx +38 -38
  723. package/.next/standalone/src/components/layout/sidebar.tsx +170 -170
  724. package/.next/standalone/src/components/layout/tier-provider.tsx +53 -53
  725. package/.next/standalone/src/components/layout/update-banner.tsx +92 -92
  726. package/.next/standalone/src/components/mobile/bottom-nav.tsx +46 -46
  727. package/.next/standalone/src/components/mobile/immersive-voice-button.tsx +123 -123
  728. package/.next/standalone/src/components/mobile/mobile-chat-input.tsx +244 -244
  729. package/.next/standalone/src/components/mobile/mobile-header.tsx +44 -44
  730. package/.next/standalone/src/components/mobile/mobile-session-card.tsx +56 -56
  731. package/.next/standalone/src/components/mobile/mobile-terminal-input.tsx +74 -74
  732. package/.next/standalone/src/components/mobile/mobile-terminal-pane.tsx +302 -302
  733. package/.next/standalone/src/components/mobile/mobile-terminal-toolbar.tsx +76 -76
  734. package/.next/standalone/src/components/mobile/pull-to-refresh.tsx +82 -82
  735. package/.next/standalone/src/components/mobile/voice-input.tsx +53 -53
  736. package/.next/standalone/src/components/network/api-key-list.tsx +190 -190
  737. package/.next/standalone/src/components/network/connection-requests.tsx +94 -94
  738. package/.next/standalone/src/components/network/node-add-dialog.tsx +131 -131
  739. package/.next/standalone/src/components/network/node-badge.tsx +26 -26
  740. package/.next/standalone/src/components/network/node-list.tsx +207 -207
  741. package/.next/standalone/src/components/network/node-selector.tsx +49 -49
  742. package/.next/standalone/src/components/sessions/session-filters.tsx +116 -116
  743. package/.next/standalone/src/components/sessions/session-list.tsx +485 -485
  744. package/.next/standalone/src/components/terminal/pane-diff-panel.tsx +179 -179
  745. package/.next/standalone/src/components/terminal/terminal-pane.tsx +1530 -1464
  746. package/.next/standalone/src/components/viewer/chat-input.tsx +275 -275
  747. package/.next/standalone/src/components/viewer/message-renderer.tsx +551 -551
  748. package/.next/standalone/src/components/wizard/chart-wizard.tsx +405 -0
  749. package/.next/standalone/src/components/wizard/project-wizard.tsx +153 -153
  750. package/.next/standalone/src/components/wizard/wizard-chat.tsx +99 -99
  751. package/.next/standalone/src/components/wizard/wizard-plan-summary.tsx +103 -103
  752. package/.next/standalone/src/components/wizard/wizard-review.tsx +225 -225
  753. package/.next/standalone/src/components/workspace/universe-cluster.tsx +131 -131
  754. package/.next/standalone/src/components/workspace/universe-orb.tsx +128 -128
  755. package/.next/standalone/src/components/workspace/universe-types.ts +22 -22
  756. package/.next/standalone/src/components/workspace/universe-utils.ts +11 -11
  757. package/.next/standalone/src/components/workspace/universe-view.tsx +397 -397
  758. package/.next/standalone/src/components/workspace/workspace-chooser.tsx +634 -634
  759. package/.next/standalone/src/hooks/use-benchmark.ts +72 -71
  760. package/.next/standalone/src/hooks/use-bus.ts +147 -147
  761. package/.next/standalone/src/hooks/use-idle-detection.ts +79 -79
  762. package/.next/standalone/src/hooks/use-network.ts +229 -229
  763. package/.next/standalone/src/hooks/use-sessions.ts +437 -437
  764. package/.next/standalone/src/hooks/use-speech-recognition.ts +114 -113
  765. package/.next/standalone/src/hooks/use-sse.ts +35 -35
  766. package/.next/standalone/src/hooks/use-tier.ts +39 -39
  767. package/.next/standalone/src/lib/agents.ts +97 -97
  768. package/.next/standalone/src/lib/aider/parser.ts +111 -111
  769. package/.next/standalone/src/lib/api.ts +19 -19
  770. package/.next/standalone/src/lib/auth.ts +47 -47
  771. package/.next/standalone/src/lib/claude/parser.ts +212 -212
  772. package/.next/standalone/src/lib/claude/stats.ts +204 -204
  773. package/.next/standalone/src/lib/codex/parser.test.ts +111 -111
  774. package/.next/standalone/src/lib/codex/parser.ts +287 -287
  775. package/.next/standalone/src/lib/config.ts +132 -132
  776. package/.next/standalone/src/lib/cortex/benchmark.ts +83 -67
  777. package/.next/standalone/src/lib/cortex/config.ts +42 -42
  778. package/.next/standalone/src/lib/cortex/debug.ts +10 -10
  779. package/.next/standalone/src/lib/cortex/distillation/usage-store.ts +18 -18
  780. package/.next/standalone/src/lib/cortex/graph/resolver.ts +10 -10
  781. package/.next/standalone/src/lib/cortex/graph/types.ts +22 -22
  782. package/.next/standalone/src/lib/cortex/index.ts +109 -56
  783. package/.next/standalone/src/lib/cortex/ingestion/bootstrap.ts +14 -14
  784. package/.next/standalone/src/lib/cortex/knowledge/compat.ts +14 -14
  785. package/.next/standalone/src/lib/cortex/knowledge/contradiction.ts +10 -10
  786. package/.next/standalone/src/lib/cortex/knowledge/types.ts +67 -67
  787. package/.next/standalone/src/lib/cortex/lobes/config.ts +16 -16
  788. package/.next/standalone/src/lib/cortex/lobes/resolver.ts +8 -8
  789. package/.next/standalone/src/lib/cortex/lobes/shares.ts +14 -14
  790. package/.next/standalone/src/lib/cortex/mcp/server.ts +12 -12
  791. package/.next/standalone/src/lib/cortex/portability/exporter.ts +6 -6
  792. package/.next/standalone/src/lib/cortex/portability/importer.ts +10 -10
  793. package/.next/standalone/src/lib/cortex/retrieval/context-engine.ts +10 -10
  794. package/.next/standalone/src/lib/cortex/types.ts +39 -39
  795. package/.next/standalone/src/lib/cost-calculator.ts +48 -48
  796. package/.next/standalone/src/lib/db/init.ts +71 -71
  797. package/.next/standalone/src/lib/db/queries.ts +740 -827
  798. package/.next/standalone/src/lib/db/schema.ts +206 -206
  799. package/.next/standalone/src/lib/events/sse.ts +36 -36
  800. package/.next/standalone/src/lib/forge/parser.ts +52 -52
  801. package/.next/standalone/src/lib/gemini/parser.ts +258 -258
  802. package/.next/standalone/src/lib/license.ts +56 -56
  803. package/.next/standalone/src/lib/pro.ts +31 -31
  804. package/.next/standalone/src/lib/shell-user.ts +101 -0
  805. package/.next/standalone/src/lib/sync/indexer.ts +504 -504
  806. package/.next/standalone/src/lib/sync/watcher.ts +64 -64
  807. package/.next/standalone/src/lib/teams.ts +31 -31
  808. package/.next/standalone/src/lib/telemetry.ts +75 -75
  809. package/.next/standalone/src/lib/terminal/server.ts +188 -188
  810. package/.next/standalone/src/lib/tier.ts +38 -38
  811. package/.next/standalone/src/lib/utils.ts +72 -72
  812. package/.next/standalone/src/lib/vms/manager.ts +121 -121
  813. package/.next/standalone/src/middleware.ts +133 -133
  814. package/.next/standalone/src/types/claude.ts +208 -208
  815. package/.next/standalone/src/types/network.ts +61 -61
  816. package/.next/standalone/tests/setup.ts +8 -8
  817. package/.next/standalone/tsconfig.json +34 -34
  818. package/.next/standalone/vitest.config.ts +24 -24
  819. package/LICENSE +661 -661
  820. package/README.md +131 -131
  821. package/bin/cortex-hook.js +79 -79
  822. package/bin/cortex-hook.sh +62 -62
  823. package/bin/cortex-learn-hook.js +138 -138
  824. package/bin/cortex-mcp.js +60 -60
  825. package/bin/cortex-pi-extension.ts +170 -170
  826. package/bin/fix-standalone-externals.js +79 -79
  827. package/bin/lib/auto-setup.js +110 -110
  828. package/bin/mdns-service.js +171 -171
  829. package/bin/postinstall.js +35 -35
  830. package/bin/setup-admin.js +195 -195
  831. package/bin/spaces-dev.js +247 -247
  832. package/bin/spaces-install.js +660 -660
  833. package/bin/spaces-postinstall.js +50 -50
  834. package/bin/spaces-reset-totp.js +50 -50
  835. package/bin/spaces-service.js +1046 -1046
  836. package/bin/spaces-setup.js +253 -253
  837. package/bin/spaces.js +808 -805
  838. package/bin/ssh-auth-keys.sh +68 -68
  839. package/bin/terminal-server.js +2819 -2781
  840. package/package.json +111 -111
  841. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0903a426._.js +0 -98
  842. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e8ccc9._.js +0 -98
  843. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11c684b1._.js +0 -98
  844. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1572d4ef._.js +0 -98
  845. package/.next/standalone/.next/server/chunks/[root-of-the-server]__186cd0bb._.js +0 -3
  846. package/.next/standalone/.next/server/chunks/[root-of-the-server]__212760e6._.js +0 -98
  847. package/.next/standalone/.next/server/chunks/[root-of-the-server]__228595ec._.js +0 -98
  848. package/.next/standalone/.next/server/chunks/[root-of-the-server]__283c890f._.js +0 -3
  849. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f300a68._.js +0 -98
  850. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f452778._.js +0 -98
  851. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35f8e77e._.js +0 -98
  852. package/.next/standalone/.next/server/chunks/[root-of-the-server]__379fc2e9._.js +0 -98
  853. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3b40d79f._.js +0 -98
  854. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3d3dca2b._.js +0 -98
  855. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d5b78d2._.js +0 -98
  856. package/.next/standalone/.next/server/chunks/[root-of-the-server]__54163e52._.js +0 -98
  857. package/.next/standalone/.next/server/chunks/[root-of-the-server]__563c0817._.js +0 -3
  858. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5812f90a._.js +0 -98
  859. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5e87f5._.js +0 -98
  860. package/.next/standalone/.next/server/chunks/[root-of-the-server]__60d15b16._.js +0 -98
  861. package/.next/standalone/.next/server/chunks/[root-of-the-server]__69d315e5._.js +0 -3
  862. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71f29038._.js +0 -98
  863. package/.next/standalone/.next/server/chunks/[root-of-the-server]__74084e07._.js +0 -3
  864. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7921aa80._.js +0 -98
  865. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e077dd8._.js +0 -98
  866. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7ebc4280._.js +0 -131
  867. package/.next/standalone/.next/server/chunks/[root-of-the-server]__857c60bb._.js +0 -98
  868. package/.next/standalone/.next/server/chunks/[root-of-the-server]__874fe565._.js +0 -98
  869. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8e2171f7._.js +0 -98
  870. package/.next/standalone/.next/server/chunks/[root-of-the-server]__95659b2d._.js +0 -98
  871. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9679b91e._.js +0 -98
  872. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a90729a1._.js +0 -98
  873. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad4346fa._.js +0 -98
  874. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b0862d69._.js +0 -98
  875. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b43306ee._.js +0 -98
  876. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b689ff5e._.js +0 -106
  877. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba87daaa._.js +0 -98
  878. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0461005._.js +0 -98
  879. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1deb5f3._.js +0 -98
  880. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8a62f42._.js +0 -98
  881. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cabaac2b._.js +0 -98
  882. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cb027619._.js +0 -98
  883. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf608218._.js +0 -98
  884. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfc1290d._.js +0 -98
  885. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0109b9b._.js +0 -98
  886. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0125483._.js +0 -3
  887. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d048ee6b._.js +0 -98
  888. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d12644e7._.js +0 -98
  889. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3cc946c._.js +0 -98
  890. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6fd27f8._.js +0 -98
  891. package/.next/standalone/.next/server/chunks/[root-of-the-server]__efb8251e._.js +0 -98
  892. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f44c6882._.js +0 -98
  893. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f85283de._.js +0 -98
  894. package/.next/standalone/.next/server/chunks/[root-of-the-server]__feceb3e4._.js +0 -98
  895. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__843070a6._.js +0 -3
  896. package/.next/standalone/.next/server/chunks/ssr/_e84a0c06._.js +0 -3
  897. package/.next/standalone/.next/static/chunks/470cade58d4eceeb.css +0 -3
  898. package/.next/standalone/.next/static/chunks/9d4164833c2c1fd6.js +0 -85
  899. package/.next/standalone/.next/static/chunks/f091f4bf8d80fd07.js +0 -1
  900. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
  901. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  902. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
  903. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  904. package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
  905. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
  906. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
  907. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
  908. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  909. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
  910. package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
  911. package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  912. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  913. package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
  914. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_buildManifest.js +0 -0
  915. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_clientMiddlewareManifest.json +0 -0
  916. /package/.next/standalone/.next/static/{5S4TviTCiNiTjf6KjXjBo → u1pHON3drz1mBi7owkbBP}/_ssgManifest.js +0 -0
  917. /package/.next/standalone/node_modules/@img/{sharp-libvips-linux-x64 → sharp-win32-x64}/versions.json +0 -0
@@ -1,768 +1,768 @@
1
- # Cortex v2 — Pillar 6: Gravity System
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:** Implement bi-directional knowledge flow — evidence-based bubble-up promotion, decision trickle-down, conflict detection during ingestion, stale knowledge decay, and a background gravity scheduler that runs every 6 hours.
6
-
7
- **Architecture:** A new `src/lib/cortex/gravity/` module with four components: `promotion.ts` (bubble-up logic), `trickle.ts` (push-down logic), `contradiction.ts` (ingestion-time conflict detection), and `scheduler.ts` (background timer orchestrating all gravity operations). Uses the `gravity_state` SQLite table (created in Pillar 1) for checkpoint persistence.
8
-
9
- **Tech Stack:** TypeScript, better-sqlite3, LanceDB, vitest
10
-
11
- **Spec:** `docs/superpowers/specs/2026-03-14-cortex-v2-design.md` — Pillar 6
12
-
13
- **Depends on:** All previous pillars (1-5) — completed
14
-
15
- ---
16
-
17
- ## File Structure
18
-
19
- ```
20
- New files:
21
- ├── src/lib/cortex/gravity/promotion.ts — Bubble-up: evidence-based promotion
22
- ├── src/lib/cortex/gravity/trickle.ts — Trickle-down: decision push + visibility
23
- ├── src/lib/cortex/gravity/contradiction.ts — Ingestion-time conflict detection
24
- ├── src/lib/cortex/gravity/decay.ts — Stale knowledge decay + archival
25
- ├── src/lib/cortex/gravity/scheduler.ts — Background scheduler (setInterval)
26
- ├── src/lib/cortex/gravity/index.ts — Barrel export
27
-
28
- Modified files:
29
- ├── src/lib/cortex/index.ts — Add GravityScheduler to CortexInstance
30
-
31
- Test files:
32
- ├── tests/lib/cortex/gravity/promotion.test.ts
33
- ├── tests/lib/cortex/gravity/trickle.test.ts
34
- ├── tests/lib/cortex/gravity/contradiction.test.ts
35
- ├── tests/lib/cortex/gravity/decay.test.ts
36
- ├── tests/lib/cortex/gravity/scheduler.test.ts
37
- ```
38
-
39
- ---
40
-
41
- ## Chunk 1: Promotion and Trickle-Down
42
-
43
- ### Task 1: Bubble-up promotion logic
44
-
45
- **Files:**
46
- - Create: `src/lib/cortex/gravity/promotion.ts`
47
- - Create: `tests/lib/cortex/gravity/promotion.test.ts`
48
-
49
- - [ ] **Step 1: Write failing tests**
50
-
51
- ```typescript
52
- // tests/lib/cortex/gravity/promotion.test.ts
53
- import { describe, it, expect } from 'vitest';
54
- import {
55
- computePromotionScore,
56
- shouldPromote,
57
- PROMOTION_TYPE_WEIGHTS,
58
- } from '@/lib/cortex/gravity/promotion';
59
-
60
- describe('computePromotionScore', () => {
61
- it('computes score from evidence, type weight, and freshness', () => {
62
- const score = computePromotionScore({
63
- evidenceScore: 0.8,
64
- type: 'decision',
65
- createdDaysAgo: 10,
66
- });
67
- // 0.8 * 1.5 (decision weight) * 1.0 (< 30 days) = 1.2 → capped at 1.0
68
- expect(score).toBeLessThanOrEqual(1.0);
69
- expect(score).toBeGreaterThan(0.5);
70
- });
71
-
72
- it('applies type weights correctly', () => {
73
- const decision = computePromotionScore({ evidenceScore: 0.5, type: 'decision', createdDaysAgo: 10 });
74
- const conversation = computePromotionScore({ evidenceScore: 0.5, type: 'conversation', createdDaysAgo: 10 });
75
- expect(decision).toBeGreaterThan(conversation);
76
- });
77
-
78
- it('decays with age', () => {
79
- const recent = computePromotionScore({ evidenceScore: 0.8, type: 'pattern', createdDaysAgo: 5 });
80
- const old = computePromotionScore({ evidenceScore: 0.8, type: 'pattern', createdDaysAgo: 120 });
81
- expect(recent).toBeGreaterThan(old);
82
- });
83
- });
84
-
85
- describe('shouldPromote', () => {
86
- it('promotes personal→team when score and corroborations meet threshold', () => {
87
- expect(shouldPromote({
88
- currentLevel: 'personal',
89
- promotionScore: 0.7,
90
- corroborations: 3,
91
- sensitivity: 'internal',
92
- hasContradictions: false,
93
- })).toBe(true);
94
- });
95
-
96
- it('blocks promotion when sensitivity is restricted', () => {
97
- expect(shouldPromote({
98
- currentLevel: 'personal',
99
- promotionScore: 0.7,
100
- corroborations: 3,
101
- sensitivity: 'restricted',
102
- hasContradictions: false,
103
- })).toBe(false);
104
- });
105
-
106
- it('blocks promotion when corroborations insufficient', () => {
107
- expect(shouldPromote({
108
- currentLevel: 'personal',
109
- promotionScore: 0.7,
110
- corroborations: 1, // needs ≥ 2
111
- sensitivity: 'internal',
112
- hasContradictions: false,
113
- })).toBe(false);
114
- });
115
-
116
- it('blocks dept→org promotion when contradictions exist', () => {
117
- expect(shouldPromote({
118
- currentLevel: 'department',
119
- promotionScore: 0.95,
120
- corroborations: 6,
121
- sensitivity: 'internal',
122
- hasContradictions: true,
123
- })).toBe(false);
124
- });
125
-
126
- it('requires higher thresholds for higher promotions', () => {
127
- // Score 0.65 passes personal→team but not team→dept
128
- expect(shouldPromote({
129
- currentLevel: 'personal', promotionScore: 0.65, corroborations: 2,
130
- sensitivity: 'internal', hasContradictions: false,
131
- })).toBe(true);
132
-
133
- expect(shouldPromote({
134
- currentLevel: 'team', promotionScore: 0.65, corroborations: 3,
135
- sensitivity: 'internal', hasContradictions: false,
136
- })).toBe(false); // needs ≥ 0.75
137
- });
138
- });
139
- ```
140
-
141
- - [ ] **Step 2: Implement promotion logic**
142
-
143
- ```typescript
144
- // src/lib/cortex/gravity/promotion.ts
145
- import type { KnowledgeType, ScopeLevel, SensitivityClass } from '../knowledge/types';
146
-
147
- export const PROMOTION_TYPE_WEIGHTS: Record<string, number> = {
148
- decision: 1.5,
149
- error_fix: 1.3,
150
- pattern: 1.2,
151
- preference: 1.0,
152
- code_pattern: 1.0,
153
- command: 0.8,
154
- context: 0.7,
155
- summary: 0.7,
156
- conversation: 0.5,
157
- };
158
-
159
- const FRESHNESS_THRESHOLDS = [
160
- { maxDays: 30, multiplier: 1.0 },
161
- { maxDays: 90, multiplier: 0.8 },
162
- { maxDays: Infinity, multiplier: 0.5 },
163
- ];
164
-
165
- interface PromotionScoreInput {
166
- evidenceScore: number;
167
- type: string;
168
- createdDaysAgo: number;
169
- }
170
-
171
- export function computePromotionScore(input: PromotionScoreInput): number {
172
- const typeWeight = PROMOTION_TYPE_WEIGHTS[input.type] ?? 1.0;
173
- const freshness = FRESHNESS_THRESHOLDS.find(t => input.createdDaysAgo <= t.maxDays)?.multiplier ?? 0.5;
174
- return Math.min(1.0, input.evidenceScore * typeWeight * freshness);
175
- }
176
-
177
- interface PromotionCheck {
178
- currentLevel: ScopeLevel;
179
- promotionScore: number;
180
- corroborations: number;
181
- sensitivity: string;
182
- hasContradictions: boolean;
183
- }
184
-
185
- const PROMOTION_THRESHOLDS: Record<string, { minScore: number; minCorroborations: number; noContradictions?: boolean }> = {
186
- personal: { minScore: 0.6, minCorroborations: 2 },
187
- team: { minScore: 0.75, minCorroborations: 3 },
188
- department: { minScore: 0.9, minCorroborations: 5, noContradictions: true },
189
- };
190
-
191
- const NEXT_LEVEL: Record<string, ScopeLevel> = {
192
- personal: 'team',
193
- team: 'department',
194
- department: 'organization',
195
- };
196
-
197
- export function shouldPromote(check: PromotionCheck): boolean {
198
- const threshold = PROMOTION_THRESHOLDS[check.currentLevel];
199
- if (!threshold) return false; // organization can't promote further
200
-
201
- if (check.sensitivity === 'restricted' || check.sensitivity === 'confidential') return false;
202
- if (check.promotionScore < threshold.minScore) return false;
203
- if (check.corroborations < threshold.minCorroborations) return false;
204
- if (threshold.noContradictions && check.hasContradictions) return false;
205
-
206
- return true;
207
- }
208
-
209
- export function getNextLevel(current: ScopeLevel): ScopeLevel | null {
210
- return NEXT_LEVEL[current] ?? null;
211
- }
212
-
213
- export const HOP_DECAY = 0.85;
214
- ```
215
-
216
- - [ ] **Step 3: Run tests, commit**
217
-
218
- ```bash
219
- git commit -m "feat(cortex): add evidence-based promotion logic for gravity system"
220
- ```
221
-
222
- ---
223
-
224
- ### Task 2: Trickle-down logic
225
-
226
- **Files:**
227
- - Create: `src/lib/cortex/gravity/trickle.ts`
228
- - Create: `tests/lib/cortex/gravity/trickle.test.ts`
229
-
230
- - [ ] **Step 1: Write failing tests**
231
-
232
- ```typescript
233
- // tests/lib/cortex/gravity/trickle.test.ts
234
- import { describe, it, expect } from 'vitest';
235
- import { getTrickleMode, TRICKLE_DEFAULTS } from '@/lib/cortex/gravity/trickle';
236
-
237
- describe('getTrickleMode', () => {
238
- it('returns PUSH for org decisions', () => {
239
- expect(getTrickleMode('decision', 'organization')).toBe('push');
240
- });
241
-
242
- it('returns PUSH for security policies', () => {
243
- expect(getTrickleMode('error_fix', 'organization', ['security'])).toBe('push');
244
- });
245
-
246
- it('returns VISIBILITY for best practices', () => {
247
- expect(getTrickleMode('pattern', 'organization')).toBe('visibility');
248
- });
249
-
250
- it('returns VISIBILITY for general patterns', () => {
251
- expect(getTrickleMode('conversation', 'organization')).toBe('visibility');
252
- });
253
-
254
- it('returns null for non-org scopes', () => {
255
- expect(getTrickleMode('decision', 'team')).toBeNull();
256
- });
257
-
258
- it('exports trickle defaults table', () => {
259
- expect(TRICKLE_DEFAULTS).toBeDefined();
260
- expect(TRICKLE_DEFAULTS.decision).toBe('push');
261
- expect(TRICKLE_DEFAULTS.pattern).toBe('visibility');
262
- });
263
- });
264
- ```
265
-
266
- - [ ] **Step 2: Implement trickle-down**
267
-
268
- ```typescript
269
- // src/lib/cortex/gravity/trickle.ts
270
- import type { KnowledgeType, ScopeLevel } from '../knowledge/types';
271
-
272
- export type TrickleMode = 'push' | 'visibility';
273
-
274
- export const TRICKLE_DEFAULTS: Record<string, TrickleMode> = {
275
- decision: 'push',
276
- preference: 'push',
277
- error_fix: 'visibility',
278
- pattern: 'visibility',
279
- code_pattern: 'visibility',
280
- command: 'visibility',
281
- context: 'visibility',
282
- conversation: 'visibility',
283
- summary: 'visibility',
284
- };
285
-
286
- const SECURITY_TOPICS = ['security', 'vulnerability', 'exploit', 'cve', 'incident'];
287
-
288
- /**
289
- * Determine trickle mode for knowledge at a given scope.
290
- * Only org-level knowledge trickles down.
291
- * Returns null if knowledge shouldn't trickle (not at org scope).
292
- */
293
- export function getTrickleMode(
294
- type: string,
295
- scopeLevel: string,
296
- topics?: string[],
297
- ): TrickleMode | null {
298
- // Only org-level knowledge trickles down
299
- if (scopeLevel !== 'organization') return null;
300
-
301
- // Security topics always push
302
- if (topics?.some(t => SECURITY_TOPICS.includes(t.toLowerCase()))) {
303
- return 'push';
304
- }
305
-
306
- return TRICKLE_DEFAULTS[type] ?? 'visibility';
307
- }
308
- ```
309
-
310
- - [ ] **Step 3: Run tests, commit**
311
-
312
- ```bash
313
- git commit -m "feat(cortex): add trickle-down logic for gravity system"
314
- ```
315
-
316
- ---
317
-
318
- ## Chunk 2: Contradiction Detection and Decay
319
-
320
- ### Task 3: Ingestion-time contradiction detection
321
-
322
- **Files:**
323
- - Create: `src/lib/cortex/gravity/contradiction.ts`
324
- - Create: `tests/lib/cortex/gravity/contradiction.test.ts`
325
-
326
- - [ ] **Step 1: Write failing tests**
327
-
328
- ```typescript
329
- // tests/lib/cortex/gravity/contradiction.test.ts
330
- import { describe, it, expect } from 'vitest';
331
- import {
332
- detectSentimentConflict,
333
- CONTRADICTION_KEYWORDS,
334
- } from '@/lib/cortex/gravity/contradiction';
335
-
336
- describe('detectSentimentConflict', () => {
337
- it('detects opposing sentiments', () => {
338
- expect(detectSentimentConflict(
339
- 'increase connection pool size to 50',
340
- 'do NOT increase pool size, scale horizontally instead',
341
- )).toBe(true);
342
- });
343
-
344
- it('returns false for agreeing statements', () => {
345
- expect(detectSentimentConflict(
346
- 'use PostgreSQL for the new service',
347
- 'PostgreSQL is the right choice for reliability',
348
- )).toBe(false);
349
- });
350
-
351
- it('detects negation patterns', () => {
352
- expect(detectSentimentConflict(
353
- 'we should use Redis for caching',
354
- 'we should not use Redis for caching',
355
- )).toBe(true);
356
- });
357
-
358
- it('detects replacement/alternative patterns', () => {
359
- expect(detectSentimentConflict(
360
- 'use Express for the API',
361
- 'use Fastify instead of Express',
362
- )).toBe(true);
363
- });
364
-
365
- it('returns false for unrelated statements', () => {
366
- expect(detectSentimentConflict(
367
- 'the auth service handles JWT',
368
- 'deploy to production on Fridays',
369
- )).toBe(false);
370
- });
371
- });
372
- ```
373
-
374
- - [ ] **Step 2: Implement contradiction detection**
375
-
376
- ```typescript
377
- // src/lib/cortex/gravity/contradiction.ts
378
-
379
- export const CONTRADICTION_KEYWORDS = {
380
- negation: [/\bnot\b/i, /\bdon't\b/i, /\bdo\s+not\b/i, /\bnever\b/i, /\bavoid\b/i, /\bstop\b/i],
381
- replacement: [/\binstead\s+of\b/i, /\brather\s+than\b/i, /\breplace\b.*\bwith\b/i, /\bswitch\s+(from|to)\b/i],
382
- opposition: [/\bhowever\b/i, /\bbut\b/i, /\bcontra/i, /\boppos/i],
383
- };
384
-
385
- /**
386
- * Detect if two texts express conflicting conclusions.
387
- * Uses keyword-based sentiment analysis (no LLM needed).
388
- *
389
- * Returns true if text B appears to contradict text A.
390
- */
391
- export function detectSentimentConflict(textA: string, textB: string): boolean {
392
- const lowerB = textB.toLowerCase();
393
- const lowerA = textA.toLowerCase();
394
-
395
- // Check if B contains negation of key terms from A
396
- const aWords = extractKeyTerms(lowerA);
397
- const bWords = extractKeyTerms(lowerB);
398
-
399
- // If B negates something A asserts
400
- for (const patterns of Object.values(CONTRADICTION_KEYWORDS)) {
401
- for (const pattern of patterns) {
402
- if (pattern.test(textB)) {
403
- // B has negation/replacement language
404
- // Check if they share subject matter (at least 2 common key terms)
405
- const commonTerms = aWords.filter(w => bWords.includes(w));
406
- if (commonTerms.length >= 2) return true;
407
- }
408
- }
409
- }
410
-
411
- return false;
412
- }
413
-
414
- function extractKeyTerms(text: string): string[] {
415
- const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
416
- 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'we', 'should', 'it',
417
- 'this', 'that', 'and', 'or', 'but', 'not', 'do', 'does', 'did', 'has', 'have', 'had']);
418
- return text.split(/\W+/).filter(w => w.length > 2 && !stopWords.has(w));
419
- }
420
-
421
- export const CONTRADICTION_COSINE_THRESHOLD = 0.80;
422
- export const DEDUP_COSINE_THRESHOLD = 0.90;
423
- ```
424
-
425
- - [ ] **Step 3: Run tests, commit**
426
-
427
- ```bash
428
- git commit -m "feat(cortex): add ingestion-time contradiction detection"
429
- ```
430
-
431
- ---
432
-
433
- ### Task 4: Stale knowledge decay
434
-
435
- **Files:**
436
- - Create: `src/lib/cortex/gravity/decay.ts`
437
- - Create: `tests/lib/cortex/gravity/decay.test.ts`
438
-
439
- - [ ] **Step 1: Write failing tests**
440
-
441
- ```typescript
442
- // tests/lib/cortex/gravity/decay.test.ts
443
- import { describe, it, expect } from 'vitest';
444
- import { computeDecay, shouldArchive, ARCHIVE_THRESHOLD } from '@/lib/cortex/gravity/decay';
445
-
446
- describe('computeDecay', () => {
447
- it('returns 0 decay for recently accessed knowledge', () => {
448
- expect(computeDecay({ daysSinceAccess: 5, currentEvidenceScore: 0.8 })).toBeCloseTo(0);
449
- });
450
-
451
- it('returns small decay for moderately old knowledge', () => {
452
- const decay = computeDecay({ daysSinceAccess: 60, currentEvidenceScore: 0.8 });
453
- expect(decay).toBeGreaterThan(0);
454
- expect(decay).toBeLessThan(0.2);
455
- });
456
-
457
- it('returns larger decay for very old knowledge', () => {
458
- const moderate = computeDecay({ daysSinceAccess: 60, currentEvidenceScore: 0.8 });
459
- const old = computeDecay({ daysSinceAccess: 180, currentEvidenceScore: 0.8 });
460
- expect(old).toBeGreaterThan(moderate);
461
- });
462
-
463
- it('never makes evidence score negative', () => {
464
- const decay = computeDecay({ daysSinceAccess: 365, currentEvidenceScore: 0.1 });
465
- expect(0.1 - decay).toBeGreaterThanOrEqual(0);
466
- });
467
- });
468
-
469
- describe('shouldArchive', () => {
470
- it('archives units with evidence below threshold after 6 months', () => {
471
- expect(shouldArchive({ evidenceScore: 0.05, daysSinceCreated: 200 })).toBe(true);
472
- });
473
-
474
- it('does not archive recent units even with low evidence', () => {
475
- expect(shouldArchive({ evidenceScore: 0.05, daysSinceCreated: 30 })).toBe(false);
476
- });
477
-
478
- it('does not archive units above threshold', () => {
479
- expect(shouldArchive({ evidenceScore: 0.5, daysSinceCreated: 200 })).toBe(false);
480
- });
481
-
482
- it('uses ARCHIVE_THRESHOLD of 0.1', () => {
483
- expect(ARCHIVE_THRESHOLD).toBe(0.1);
484
- });
485
- });
486
- ```
487
-
488
- - [ ] **Step 2: Implement decay**
489
-
490
- ```typescript
491
- // src/lib/cortex/gravity/decay.ts
492
-
493
- export const ARCHIVE_THRESHOLD = 0.1;
494
- const ARCHIVE_MIN_AGE_DAYS = 180; // 6 months
495
- const DECAY_START_DAYS = 30; // no decay within first 30 days of last access
496
-
497
- interface DecayInput {
498
- daysSinceAccess: number;
499
- currentEvidenceScore: number;
500
- }
501
-
502
- /**
503
- * Compute evidence score decay for unaccessed knowledge.
504
- * Returns the amount to SUBTRACT from evidence_score.
505
- *
506
- * Decay formula: gradual increase after 30 days of no access.
507
- * decay = max(0, (daysSinceAccess - 30) / 365) * 0.2
508
- * Capped so evidence never goes below 0.
509
- */
510
- export function computeDecay(input: DecayInput): number {
511
- const { daysSinceAccess, currentEvidenceScore } = input;
512
-
513
- if (daysSinceAccess <= DECAY_START_DAYS) return 0;
514
-
515
- const rawDecay = ((daysSinceAccess - DECAY_START_DAYS) / 365) * 0.2;
516
- return Math.min(rawDecay, currentEvidenceScore); // never go below 0
517
- }
518
-
519
- interface ArchiveCheck {
520
- evidenceScore: number;
521
- daysSinceCreated: number;
522
- }
523
-
524
- /**
525
- * Determine if a knowledge unit should be archived.
526
- * Archived when evidence < ARCHIVE_THRESHOLD and older than 6 months.
527
- */
528
- export function shouldArchive(check: ArchiveCheck): boolean {
529
- return check.evidenceScore < ARCHIVE_THRESHOLD && check.daysSinceCreated >= ARCHIVE_MIN_AGE_DAYS;
530
- }
531
- ```
532
-
533
- - [ ] **Step 3: Run tests, commit**
534
-
535
- ```bash
536
- git commit -m "feat(cortex): add knowledge decay and archival logic"
537
- ```
538
-
539
- ---
540
-
541
- ## Chunk 3: Gravity Scheduler and Integration
542
-
543
- ### Task 5: Gravity scheduler
544
-
545
- **Files:**
546
- - Create: `src/lib/cortex/gravity/scheduler.ts`
547
- - Create: `tests/lib/cortex/gravity/scheduler.test.ts`
548
-
549
- - [ ] **Step 1: Write failing tests**
550
-
551
- ```typescript
552
- // tests/lib/cortex/gravity/scheduler.test.ts
553
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
554
- import { GravityScheduler } from '@/lib/cortex/gravity/scheduler';
555
-
556
- describe('GravityScheduler', () => {
557
- let scheduler: GravityScheduler;
558
- const mockRunCycle = vi.fn().mockResolvedValue(undefined);
559
-
560
- beforeEach(() => {
561
- vi.useFakeTimers();
562
- scheduler = new GravityScheduler({
563
- intervalMs: 1000, // 1 second for testing (real: 6 hours)
564
- runCycle: mockRunCycle,
565
- });
566
- });
567
-
568
- afterEach(() => {
569
- scheduler.stop();
570
- vi.useRealTimers();
571
- });
572
-
573
- it('starts and runs the first cycle', async () => {
574
- scheduler.start();
575
- expect(scheduler.isRunning()).toBe(true);
576
- // First cycle runs immediately
577
- await vi.advanceTimersByTimeAsync(10);
578
- expect(mockRunCycle).toHaveBeenCalledTimes(1);
579
- });
580
-
581
- it('runs on interval', async () => {
582
- scheduler.start();
583
- await vi.advanceTimersByTimeAsync(10); // first immediate run
584
- await vi.advanceTimersByTimeAsync(1000); // second interval run
585
- expect(mockRunCycle).toHaveBeenCalledTimes(2);
586
- });
587
-
588
- it('stops cleanly', async () => {
589
- scheduler.start();
590
- await vi.advanceTimersByTimeAsync(10);
591
- scheduler.stop();
592
- expect(scheduler.isRunning()).toBe(false);
593
- await vi.advanceTimersByTimeAsync(2000);
594
- expect(mockRunCycle).toHaveBeenCalledTimes(1); // no more runs after stop
595
- });
596
-
597
- it('does not run concurrent cycles', async () => {
598
- let resolveFirst: () => void;
599
- const slowCycle = vi.fn().mockImplementation(() =>
600
- new Promise<void>(resolve => { resolveFirst = resolve; })
601
- );
602
- const slow = new GravityScheduler({ intervalMs: 100, runCycle: slowCycle });
603
- slow.start();
604
- await vi.advanceTimersByTimeAsync(10); // starts first cycle
605
- await vi.advanceTimersByTimeAsync(200); // interval fires but first still running
606
- expect(slowCycle).toHaveBeenCalledTimes(1);
607
- resolveFirst!();
608
- slow.stop();
609
- });
610
-
611
- it('handles cycle errors without crashing', async () => {
612
- const failingCycle = vi.fn().mockRejectedValue(new Error('cycle failed'));
613
- const failing = new GravityScheduler({ intervalMs: 1000, runCycle: failingCycle });
614
- failing.start();
615
- await vi.advanceTimersByTimeAsync(10);
616
- expect(failing.isRunning()).toBe(true); // still running despite error
617
- failing.stop();
618
- });
619
- });
620
- ```
621
-
622
- - [ ] **Step 2: Implement scheduler**
623
-
624
- ```typescript
625
- // src/lib/cortex/gravity/scheduler.ts
626
-
627
- export const GRAVITY_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
628
-
629
- export interface GravitySchedulerConfig {
630
- intervalMs?: number;
631
- runCycle: () => Promise<void>;
632
- }
633
-
634
- export class GravityScheduler {
635
- private timer: ReturnType<typeof setInterval> | null = null;
636
- private running = false;
637
- private cycling = false;
638
- private config: Required<GravitySchedulerConfig>;
639
-
640
- constructor(config: GravitySchedulerConfig) {
641
- this.config = {
642
- intervalMs: config.intervalMs ?? GRAVITY_INTERVAL_MS,
643
- runCycle: config.runCycle,
644
- };
645
- }
646
-
647
- start(): void {
648
- if (this.running) return;
649
- this.running = true;
650
-
651
- // Run first cycle immediately (non-blocking)
652
- this.executeCycle();
653
-
654
- // Schedule recurring cycles
655
- this.timer = setInterval(() => this.executeCycle(), this.config.intervalMs);
656
- }
657
-
658
- stop(): void {
659
- this.running = false;
660
- if (this.timer) {
661
- clearInterval(this.timer);
662
- this.timer = null;
663
- }
664
- }
665
-
666
- isRunning(): boolean {
667
- return this.running;
668
- }
669
-
670
- private async executeCycle(): Promise<void> {
671
- if (this.cycling) return; // prevent concurrent cycles
672
- this.cycling = true;
673
- try {
674
- await this.config.runCycle();
675
- } catch {
676
- // Log but don't crash — scheduler continues
677
- } finally {
678
- this.cycling = false;
679
- }
680
- }
681
- }
682
- ```
683
-
684
- - [ ] **Step 3: Run tests, commit**
685
-
686
- ```bash
687
- git commit -m "feat(cortex): add gravity scheduler with interval execution"
688
- ```
689
-
690
- ---
691
-
692
- ### Task 6: Barrel export and CortexInstance integration
693
-
694
- **Files:**
695
- - Create: `src/lib/cortex/gravity/index.ts`
696
- - Modify: `src/lib/cortex/index.ts`
697
-
698
- - [ ] **Step 1: Create barrel export**
699
-
700
- ```typescript
701
- // src/lib/cortex/gravity/index.ts
702
- export { computePromotionScore, shouldPromote, getNextLevel, HOP_DECAY, PROMOTION_TYPE_WEIGHTS } from './promotion';
703
- export { getTrickleMode, TRICKLE_DEFAULTS } from './trickle';
704
- export type { TrickleMode } from './trickle';
705
- export { detectSentimentConflict, CONTRADICTION_COSINE_THRESHOLD, DEDUP_COSINE_THRESHOLD } from './contradiction';
706
- export { computeDecay, shouldArchive, ARCHIVE_THRESHOLD } from './decay';
707
- export { GravityScheduler, GRAVITY_INTERVAL_MS } from './scheduler';
708
- export type { GravitySchedulerConfig } from './scheduler';
709
- ```
710
-
711
- - [ ] **Step 2: Add GravityScheduler to CortexInstance**
712
-
713
- Read `src/lib/cortex/index.ts`. Add:
714
-
715
- 1. Import: `import { GravityScheduler } from './gravity/scheduler';`
716
- 2. Add `gravityScheduler?: GravityScheduler` to CortexInstance interface
717
- 3. In getCortex(), after signalPipeline initialization:
718
-
719
- ```typescript
720
- const gravityScheduler = new GravityScheduler({
721
- runCycle: async () => {
722
- // Gravity cycle placeholder — full implementation requires
723
- // scanning all knowledge units, computing promotion scores,
724
- // executing trickle-down, decaying stale knowledge, etc.
725
- // Individual functions are ready; the orchestration wiring
726
- // will be connected when the system has enough data to test.
727
- },
728
- });
729
- // Don't auto-start — let the application decide when to start
730
- ```
731
-
732
- 4. Include `gravityScheduler` in instance object
733
- 5. In `resetCortex()`, add `_instance.gravityScheduler?.stop()` before nulling
734
-
735
- - [ ] **Step 3: Run full test suite**
736
-
737
- ```bash
738
- npx vitest run tests/lib/cortex/
739
- ```
740
-
741
- - [ ] **Step 4: Commit**
742
-
743
- ```bash
744
- git commit -m "feat(cortex): add gravity module barrel export and CortexInstance integration"
745
- ```
746
-
747
- ---
748
-
749
- ## Summary
750
-
751
- | Task | Component | Tests | Status |
752
- |------|-----------|-------|--------|
753
- | 1 | Promotion (bubble-up) | 8 | |
754
- | 2 | Trickle-down | 6 | |
755
- | 3 | Contradiction detection | 5 | |
756
- | 4 | Decay + archival | 8 | |
757
- | 5 | Gravity scheduler | 5 | |
758
- | 6 | Barrel export + integration | regression | |
759
-
760
- **Total: 6 tasks, ~32 new tests, 3 chunks**
761
-
762
- **Key design decisions:**
763
- - Promotion is COPY (not move) — original stays, promoted copy gets decayed confidence (×0.85)
764
- - Trickle-down has two modes: PUSH (copies to lower scopes) and VISIBILITY (accessible via graph but not copied)
765
- - Contradiction detection uses keyword-based sentiment analysis (not LLM) — fast and deterministic
766
- - Decay is gradual — starts after 30 days of no access, increases over time, archives below 0.1 after 6 months
767
- - Scheduler uses setInterval (consistent with FederationSync pattern), prevents concurrent cycles, survives errors
768
- - The runCycle body is a placeholder — individual gravity functions are ready but the full orchestration loop connecting them to store iteration will be wired when there's enough data to test against
1
+ # Cortex v2 — Pillar 6: Gravity System
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:** Implement bi-directional knowledge flow — evidence-based bubble-up promotion, decision trickle-down, conflict detection during ingestion, stale knowledge decay, and a background gravity scheduler that runs every 6 hours.
6
+
7
+ **Architecture:** A new `src/lib/cortex/gravity/` module with four components: `promotion.ts` (bubble-up logic), `trickle.ts` (push-down logic), `contradiction.ts` (ingestion-time conflict detection), and `scheduler.ts` (background timer orchestrating all gravity operations). Uses the `gravity_state` SQLite table (created in Pillar 1) for checkpoint persistence.
8
+
9
+ **Tech Stack:** TypeScript, better-sqlite3, LanceDB, vitest
10
+
11
+ **Spec:** `docs/superpowers/specs/2026-03-14-cortex-v2-design.md` — Pillar 6
12
+
13
+ **Depends on:** All previous pillars (1-5) — completed
14
+
15
+ ---
16
+
17
+ ## File Structure
18
+
19
+ ```
20
+ New files:
21
+ ├── src/lib/cortex/gravity/promotion.ts — Bubble-up: evidence-based promotion
22
+ ├── src/lib/cortex/gravity/trickle.ts — Trickle-down: decision push + visibility
23
+ ├── src/lib/cortex/gravity/contradiction.ts — Ingestion-time conflict detection
24
+ ├── src/lib/cortex/gravity/decay.ts — Stale knowledge decay + archival
25
+ ├── src/lib/cortex/gravity/scheduler.ts — Background scheduler (setInterval)
26
+ ├── src/lib/cortex/gravity/index.ts — Barrel export
27
+
28
+ Modified files:
29
+ ├── src/lib/cortex/index.ts — Add GravityScheduler to CortexInstance
30
+
31
+ Test files:
32
+ ├── tests/lib/cortex/gravity/promotion.test.ts
33
+ ├── tests/lib/cortex/gravity/trickle.test.ts
34
+ ├── tests/lib/cortex/gravity/contradiction.test.ts
35
+ ├── tests/lib/cortex/gravity/decay.test.ts
36
+ ├── tests/lib/cortex/gravity/scheduler.test.ts
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Chunk 1: Promotion and Trickle-Down
42
+
43
+ ### Task 1: Bubble-up promotion logic
44
+
45
+ **Files:**
46
+ - Create: `src/lib/cortex/gravity/promotion.ts`
47
+ - Create: `tests/lib/cortex/gravity/promotion.test.ts`
48
+
49
+ - [ ] **Step 1: Write failing tests**
50
+
51
+ ```typescript
52
+ // tests/lib/cortex/gravity/promotion.test.ts
53
+ import { describe, it, expect } from 'vitest';
54
+ import {
55
+ computePromotionScore,
56
+ shouldPromote,
57
+ PROMOTION_TYPE_WEIGHTS,
58
+ } from '@/lib/cortex/gravity/promotion';
59
+
60
+ describe('computePromotionScore', () => {
61
+ it('computes score from evidence, type weight, and freshness', () => {
62
+ const score = computePromotionScore({
63
+ evidenceScore: 0.8,
64
+ type: 'decision',
65
+ createdDaysAgo: 10,
66
+ });
67
+ // 0.8 * 1.5 (decision weight) * 1.0 (< 30 days) = 1.2 → capped at 1.0
68
+ expect(score).toBeLessThanOrEqual(1.0);
69
+ expect(score).toBeGreaterThan(0.5);
70
+ });
71
+
72
+ it('applies type weights correctly', () => {
73
+ const decision = computePromotionScore({ evidenceScore: 0.5, type: 'decision', createdDaysAgo: 10 });
74
+ const conversation = computePromotionScore({ evidenceScore: 0.5, type: 'conversation', createdDaysAgo: 10 });
75
+ expect(decision).toBeGreaterThan(conversation);
76
+ });
77
+
78
+ it('decays with age', () => {
79
+ const recent = computePromotionScore({ evidenceScore: 0.8, type: 'pattern', createdDaysAgo: 5 });
80
+ const old = computePromotionScore({ evidenceScore: 0.8, type: 'pattern', createdDaysAgo: 120 });
81
+ expect(recent).toBeGreaterThan(old);
82
+ });
83
+ });
84
+
85
+ describe('shouldPromote', () => {
86
+ it('promotes personal→team when score and corroborations meet threshold', () => {
87
+ expect(shouldPromote({
88
+ currentLevel: 'personal',
89
+ promotionScore: 0.7,
90
+ corroborations: 3,
91
+ sensitivity: 'internal',
92
+ hasContradictions: false,
93
+ })).toBe(true);
94
+ });
95
+
96
+ it('blocks promotion when sensitivity is restricted', () => {
97
+ expect(shouldPromote({
98
+ currentLevel: 'personal',
99
+ promotionScore: 0.7,
100
+ corroborations: 3,
101
+ sensitivity: 'restricted',
102
+ hasContradictions: false,
103
+ })).toBe(false);
104
+ });
105
+
106
+ it('blocks promotion when corroborations insufficient', () => {
107
+ expect(shouldPromote({
108
+ currentLevel: 'personal',
109
+ promotionScore: 0.7,
110
+ corroborations: 1, // needs ≥ 2
111
+ sensitivity: 'internal',
112
+ hasContradictions: false,
113
+ })).toBe(false);
114
+ });
115
+
116
+ it('blocks dept→org promotion when contradictions exist', () => {
117
+ expect(shouldPromote({
118
+ currentLevel: 'department',
119
+ promotionScore: 0.95,
120
+ corroborations: 6,
121
+ sensitivity: 'internal',
122
+ hasContradictions: true,
123
+ })).toBe(false);
124
+ });
125
+
126
+ it('requires higher thresholds for higher promotions', () => {
127
+ // Score 0.65 passes personal→team but not team→dept
128
+ expect(shouldPromote({
129
+ currentLevel: 'personal', promotionScore: 0.65, corroborations: 2,
130
+ sensitivity: 'internal', hasContradictions: false,
131
+ })).toBe(true);
132
+
133
+ expect(shouldPromote({
134
+ currentLevel: 'team', promotionScore: 0.65, corroborations: 3,
135
+ sensitivity: 'internal', hasContradictions: false,
136
+ })).toBe(false); // needs ≥ 0.75
137
+ });
138
+ });
139
+ ```
140
+
141
+ - [ ] **Step 2: Implement promotion logic**
142
+
143
+ ```typescript
144
+ // src/lib/cortex/gravity/promotion.ts
145
+ import type { KnowledgeType, ScopeLevel, SensitivityClass } from '../knowledge/types';
146
+
147
+ export const PROMOTION_TYPE_WEIGHTS: Record<string, number> = {
148
+ decision: 1.5,
149
+ error_fix: 1.3,
150
+ pattern: 1.2,
151
+ preference: 1.0,
152
+ code_pattern: 1.0,
153
+ command: 0.8,
154
+ context: 0.7,
155
+ summary: 0.7,
156
+ conversation: 0.5,
157
+ };
158
+
159
+ const FRESHNESS_THRESHOLDS = [
160
+ { maxDays: 30, multiplier: 1.0 },
161
+ { maxDays: 90, multiplier: 0.8 },
162
+ { maxDays: Infinity, multiplier: 0.5 },
163
+ ];
164
+
165
+ interface PromotionScoreInput {
166
+ evidenceScore: number;
167
+ type: string;
168
+ createdDaysAgo: number;
169
+ }
170
+
171
+ export function computePromotionScore(input: PromotionScoreInput): number {
172
+ const typeWeight = PROMOTION_TYPE_WEIGHTS[input.type] ?? 1.0;
173
+ const freshness = FRESHNESS_THRESHOLDS.find(t => input.createdDaysAgo <= t.maxDays)?.multiplier ?? 0.5;
174
+ return Math.min(1.0, input.evidenceScore * typeWeight * freshness);
175
+ }
176
+
177
+ interface PromotionCheck {
178
+ currentLevel: ScopeLevel;
179
+ promotionScore: number;
180
+ corroborations: number;
181
+ sensitivity: string;
182
+ hasContradictions: boolean;
183
+ }
184
+
185
+ const PROMOTION_THRESHOLDS: Record<string, { minScore: number; minCorroborations: number; noContradictions?: boolean }> = {
186
+ personal: { minScore: 0.6, minCorroborations: 2 },
187
+ team: { minScore: 0.75, minCorroborations: 3 },
188
+ department: { minScore: 0.9, minCorroborations: 5, noContradictions: true },
189
+ };
190
+
191
+ const NEXT_LEVEL: Record<string, ScopeLevel> = {
192
+ personal: 'team',
193
+ team: 'department',
194
+ department: 'organization',
195
+ };
196
+
197
+ export function shouldPromote(check: PromotionCheck): boolean {
198
+ const threshold = PROMOTION_THRESHOLDS[check.currentLevel];
199
+ if (!threshold) return false; // organization can't promote further
200
+
201
+ if (check.sensitivity === 'restricted' || check.sensitivity === 'confidential') return false;
202
+ if (check.promotionScore < threshold.minScore) return false;
203
+ if (check.corroborations < threshold.minCorroborations) return false;
204
+ if (threshold.noContradictions && check.hasContradictions) return false;
205
+
206
+ return true;
207
+ }
208
+
209
+ export function getNextLevel(current: ScopeLevel): ScopeLevel | null {
210
+ return NEXT_LEVEL[current] ?? null;
211
+ }
212
+
213
+ export const HOP_DECAY = 0.85;
214
+ ```
215
+
216
+ - [ ] **Step 3: Run tests, commit**
217
+
218
+ ```bash
219
+ git commit -m "feat(cortex): add evidence-based promotion logic for gravity system"
220
+ ```
221
+
222
+ ---
223
+
224
+ ### Task 2: Trickle-down logic
225
+
226
+ **Files:**
227
+ - Create: `src/lib/cortex/gravity/trickle.ts`
228
+ - Create: `tests/lib/cortex/gravity/trickle.test.ts`
229
+
230
+ - [ ] **Step 1: Write failing tests**
231
+
232
+ ```typescript
233
+ // tests/lib/cortex/gravity/trickle.test.ts
234
+ import { describe, it, expect } from 'vitest';
235
+ import { getTrickleMode, TRICKLE_DEFAULTS } from '@/lib/cortex/gravity/trickle';
236
+
237
+ describe('getTrickleMode', () => {
238
+ it('returns PUSH for org decisions', () => {
239
+ expect(getTrickleMode('decision', 'organization')).toBe('push');
240
+ });
241
+
242
+ it('returns PUSH for security policies', () => {
243
+ expect(getTrickleMode('error_fix', 'organization', ['security'])).toBe('push');
244
+ });
245
+
246
+ it('returns VISIBILITY for best practices', () => {
247
+ expect(getTrickleMode('pattern', 'organization')).toBe('visibility');
248
+ });
249
+
250
+ it('returns VISIBILITY for general patterns', () => {
251
+ expect(getTrickleMode('conversation', 'organization')).toBe('visibility');
252
+ });
253
+
254
+ it('returns null for non-org scopes', () => {
255
+ expect(getTrickleMode('decision', 'team')).toBeNull();
256
+ });
257
+
258
+ it('exports trickle defaults table', () => {
259
+ expect(TRICKLE_DEFAULTS).toBeDefined();
260
+ expect(TRICKLE_DEFAULTS.decision).toBe('push');
261
+ expect(TRICKLE_DEFAULTS.pattern).toBe('visibility');
262
+ });
263
+ });
264
+ ```
265
+
266
+ - [ ] **Step 2: Implement trickle-down**
267
+
268
+ ```typescript
269
+ // src/lib/cortex/gravity/trickle.ts
270
+ import type { KnowledgeType, ScopeLevel } from '../knowledge/types';
271
+
272
+ export type TrickleMode = 'push' | 'visibility';
273
+
274
+ export const TRICKLE_DEFAULTS: Record<string, TrickleMode> = {
275
+ decision: 'push',
276
+ preference: 'push',
277
+ error_fix: 'visibility',
278
+ pattern: 'visibility',
279
+ code_pattern: 'visibility',
280
+ command: 'visibility',
281
+ context: 'visibility',
282
+ conversation: 'visibility',
283
+ summary: 'visibility',
284
+ };
285
+
286
+ const SECURITY_TOPICS = ['security', 'vulnerability', 'exploit', 'cve', 'incident'];
287
+
288
+ /**
289
+ * Determine trickle mode for knowledge at a given scope.
290
+ * Only org-level knowledge trickles down.
291
+ * Returns null if knowledge shouldn't trickle (not at org scope).
292
+ */
293
+ export function getTrickleMode(
294
+ type: string,
295
+ scopeLevel: string,
296
+ topics?: string[],
297
+ ): TrickleMode | null {
298
+ // Only org-level knowledge trickles down
299
+ if (scopeLevel !== 'organization') return null;
300
+
301
+ // Security topics always push
302
+ if (topics?.some(t => SECURITY_TOPICS.includes(t.toLowerCase()))) {
303
+ return 'push';
304
+ }
305
+
306
+ return TRICKLE_DEFAULTS[type] ?? 'visibility';
307
+ }
308
+ ```
309
+
310
+ - [ ] **Step 3: Run tests, commit**
311
+
312
+ ```bash
313
+ git commit -m "feat(cortex): add trickle-down logic for gravity system"
314
+ ```
315
+
316
+ ---
317
+
318
+ ## Chunk 2: Contradiction Detection and Decay
319
+
320
+ ### Task 3: Ingestion-time contradiction detection
321
+
322
+ **Files:**
323
+ - Create: `src/lib/cortex/gravity/contradiction.ts`
324
+ - Create: `tests/lib/cortex/gravity/contradiction.test.ts`
325
+
326
+ - [ ] **Step 1: Write failing tests**
327
+
328
+ ```typescript
329
+ // tests/lib/cortex/gravity/contradiction.test.ts
330
+ import { describe, it, expect } from 'vitest';
331
+ import {
332
+ detectSentimentConflict,
333
+ CONTRADICTION_KEYWORDS,
334
+ } from '@/lib/cortex/gravity/contradiction';
335
+
336
+ describe('detectSentimentConflict', () => {
337
+ it('detects opposing sentiments', () => {
338
+ expect(detectSentimentConflict(
339
+ 'increase connection pool size to 50',
340
+ 'do NOT increase pool size, scale horizontally instead',
341
+ )).toBe(true);
342
+ });
343
+
344
+ it('returns false for agreeing statements', () => {
345
+ expect(detectSentimentConflict(
346
+ 'use PostgreSQL for the new service',
347
+ 'PostgreSQL is the right choice for reliability',
348
+ )).toBe(false);
349
+ });
350
+
351
+ it('detects negation patterns', () => {
352
+ expect(detectSentimentConflict(
353
+ 'we should use Redis for caching',
354
+ 'we should not use Redis for caching',
355
+ )).toBe(true);
356
+ });
357
+
358
+ it('detects replacement/alternative patterns', () => {
359
+ expect(detectSentimentConflict(
360
+ 'use Express for the API',
361
+ 'use Fastify instead of Express',
362
+ )).toBe(true);
363
+ });
364
+
365
+ it('returns false for unrelated statements', () => {
366
+ expect(detectSentimentConflict(
367
+ 'the auth service handles JWT',
368
+ 'deploy to production on Fridays',
369
+ )).toBe(false);
370
+ });
371
+ });
372
+ ```
373
+
374
+ - [ ] **Step 2: Implement contradiction detection**
375
+
376
+ ```typescript
377
+ // src/lib/cortex/gravity/contradiction.ts
378
+
379
+ export const CONTRADICTION_KEYWORDS = {
380
+ negation: [/\bnot\b/i, /\bdon't\b/i, /\bdo\s+not\b/i, /\bnever\b/i, /\bavoid\b/i, /\bstop\b/i],
381
+ replacement: [/\binstead\s+of\b/i, /\brather\s+than\b/i, /\breplace\b.*\bwith\b/i, /\bswitch\s+(from|to)\b/i],
382
+ opposition: [/\bhowever\b/i, /\bbut\b/i, /\bcontra/i, /\boppos/i],
383
+ };
384
+
385
+ /**
386
+ * Detect if two texts express conflicting conclusions.
387
+ * Uses keyword-based sentiment analysis (no LLM needed).
388
+ *
389
+ * Returns true if text B appears to contradict text A.
390
+ */
391
+ export function detectSentimentConflict(textA: string, textB: string): boolean {
392
+ const lowerB = textB.toLowerCase();
393
+ const lowerA = textA.toLowerCase();
394
+
395
+ // Check if B contains negation of key terms from A
396
+ const aWords = extractKeyTerms(lowerA);
397
+ const bWords = extractKeyTerms(lowerB);
398
+
399
+ // If B negates something A asserts
400
+ for (const patterns of Object.values(CONTRADICTION_KEYWORDS)) {
401
+ for (const pattern of patterns) {
402
+ if (pattern.test(textB)) {
403
+ // B has negation/replacement language
404
+ // Check if they share subject matter (at least 2 common key terms)
405
+ const commonTerms = aWords.filter(w => bWords.includes(w));
406
+ if (commonTerms.length >= 2) return true;
407
+ }
408
+ }
409
+ }
410
+
411
+ return false;
412
+ }
413
+
414
+ function extractKeyTerms(text: string): string[] {
415
+ const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
416
+ 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'we', 'should', 'it',
417
+ 'this', 'that', 'and', 'or', 'but', 'not', 'do', 'does', 'did', 'has', 'have', 'had']);
418
+ return text.split(/\W+/).filter(w => w.length > 2 && !stopWords.has(w));
419
+ }
420
+
421
+ export const CONTRADICTION_COSINE_THRESHOLD = 0.80;
422
+ export const DEDUP_COSINE_THRESHOLD = 0.90;
423
+ ```
424
+
425
+ - [ ] **Step 3: Run tests, commit**
426
+
427
+ ```bash
428
+ git commit -m "feat(cortex): add ingestion-time contradiction detection"
429
+ ```
430
+
431
+ ---
432
+
433
+ ### Task 4: Stale knowledge decay
434
+
435
+ **Files:**
436
+ - Create: `src/lib/cortex/gravity/decay.ts`
437
+ - Create: `tests/lib/cortex/gravity/decay.test.ts`
438
+
439
+ - [ ] **Step 1: Write failing tests**
440
+
441
+ ```typescript
442
+ // tests/lib/cortex/gravity/decay.test.ts
443
+ import { describe, it, expect } from 'vitest';
444
+ import { computeDecay, shouldArchive, ARCHIVE_THRESHOLD } from '@/lib/cortex/gravity/decay';
445
+
446
+ describe('computeDecay', () => {
447
+ it('returns 0 decay for recently accessed knowledge', () => {
448
+ expect(computeDecay({ daysSinceAccess: 5, currentEvidenceScore: 0.8 })).toBeCloseTo(0);
449
+ });
450
+
451
+ it('returns small decay for moderately old knowledge', () => {
452
+ const decay = computeDecay({ daysSinceAccess: 60, currentEvidenceScore: 0.8 });
453
+ expect(decay).toBeGreaterThan(0);
454
+ expect(decay).toBeLessThan(0.2);
455
+ });
456
+
457
+ it('returns larger decay for very old knowledge', () => {
458
+ const moderate = computeDecay({ daysSinceAccess: 60, currentEvidenceScore: 0.8 });
459
+ const old = computeDecay({ daysSinceAccess: 180, currentEvidenceScore: 0.8 });
460
+ expect(old).toBeGreaterThan(moderate);
461
+ });
462
+
463
+ it('never makes evidence score negative', () => {
464
+ const decay = computeDecay({ daysSinceAccess: 365, currentEvidenceScore: 0.1 });
465
+ expect(0.1 - decay).toBeGreaterThanOrEqual(0);
466
+ });
467
+ });
468
+
469
+ describe('shouldArchive', () => {
470
+ it('archives units with evidence below threshold after 6 months', () => {
471
+ expect(shouldArchive({ evidenceScore: 0.05, daysSinceCreated: 200 })).toBe(true);
472
+ });
473
+
474
+ it('does not archive recent units even with low evidence', () => {
475
+ expect(shouldArchive({ evidenceScore: 0.05, daysSinceCreated: 30 })).toBe(false);
476
+ });
477
+
478
+ it('does not archive units above threshold', () => {
479
+ expect(shouldArchive({ evidenceScore: 0.5, daysSinceCreated: 200 })).toBe(false);
480
+ });
481
+
482
+ it('uses ARCHIVE_THRESHOLD of 0.1', () => {
483
+ expect(ARCHIVE_THRESHOLD).toBe(0.1);
484
+ });
485
+ });
486
+ ```
487
+
488
+ - [ ] **Step 2: Implement decay**
489
+
490
+ ```typescript
491
+ // src/lib/cortex/gravity/decay.ts
492
+
493
+ export const ARCHIVE_THRESHOLD = 0.1;
494
+ const ARCHIVE_MIN_AGE_DAYS = 180; // 6 months
495
+ const DECAY_START_DAYS = 30; // no decay within first 30 days of last access
496
+
497
+ interface DecayInput {
498
+ daysSinceAccess: number;
499
+ currentEvidenceScore: number;
500
+ }
501
+
502
+ /**
503
+ * Compute evidence score decay for unaccessed knowledge.
504
+ * Returns the amount to SUBTRACT from evidence_score.
505
+ *
506
+ * Decay formula: gradual increase after 30 days of no access.
507
+ * decay = max(0, (daysSinceAccess - 30) / 365) * 0.2
508
+ * Capped so evidence never goes below 0.
509
+ */
510
+ export function computeDecay(input: DecayInput): number {
511
+ const { daysSinceAccess, currentEvidenceScore } = input;
512
+
513
+ if (daysSinceAccess <= DECAY_START_DAYS) return 0;
514
+
515
+ const rawDecay = ((daysSinceAccess - DECAY_START_DAYS) / 365) * 0.2;
516
+ return Math.min(rawDecay, currentEvidenceScore); // never go below 0
517
+ }
518
+
519
+ interface ArchiveCheck {
520
+ evidenceScore: number;
521
+ daysSinceCreated: number;
522
+ }
523
+
524
+ /**
525
+ * Determine if a knowledge unit should be archived.
526
+ * Archived when evidence < ARCHIVE_THRESHOLD and older than 6 months.
527
+ */
528
+ export function shouldArchive(check: ArchiveCheck): boolean {
529
+ return check.evidenceScore < ARCHIVE_THRESHOLD && check.daysSinceCreated >= ARCHIVE_MIN_AGE_DAYS;
530
+ }
531
+ ```
532
+
533
+ - [ ] **Step 3: Run tests, commit**
534
+
535
+ ```bash
536
+ git commit -m "feat(cortex): add knowledge decay and archival logic"
537
+ ```
538
+
539
+ ---
540
+
541
+ ## Chunk 3: Gravity Scheduler and Integration
542
+
543
+ ### Task 5: Gravity scheduler
544
+
545
+ **Files:**
546
+ - Create: `src/lib/cortex/gravity/scheduler.ts`
547
+ - Create: `tests/lib/cortex/gravity/scheduler.test.ts`
548
+
549
+ - [ ] **Step 1: Write failing tests**
550
+
551
+ ```typescript
552
+ // tests/lib/cortex/gravity/scheduler.test.ts
553
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
554
+ import { GravityScheduler } from '@/lib/cortex/gravity/scheduler';
555
+
556
+ describe('GravityScheduler', () => {
557
+ let scheduler: GravityScheduler;
558
+ const mockRunCycle = vi.fn().mockResolvedValue(undefined);
559
+
560
+ beforeEach(() => {
561
+ vi.useFakeTimers();
562
+ scheduler = new GravityScheduler({
563
+ intervalMs: 1000, // 1 second for testing (real: 6 hours)
564
+ runCycle: mockRunCycle,
565
+ });
566
+ });
567
+
568
+ afterEach(() => {
569
+ scheduler.stop();
570
+ vi.useRealTimers();
571
+ });
572
+
573
+ it('starts and runs the first cycle', async () => {
574
+ scheduler.start();
575
+ expect(scheduler.isRunning()).toBe(true);
576
+ // First cycle runs immediately
577
+ await vi.advanceTimersByTimeAsync(10);
578
+ expect(mockRunCycle).toHaveBeenCalledTimes(1);
579
+ });
580
+
581
+ it('runs on interval', async () => {
582
+ scheduler.start();
583
+ await vi.advanceTimersByTimeAsync(10); // first immediate run
584
+ await vi.advanceTimersByTimeAsync(1000); // second interval run
585
+ expect(mockRunCycle).toHaveBeenCalledTimes(2);
586
+ });
587
+
588
+ it('stops cleanly', async () => {
589
+ scheduler.start();
590
+ await vi.advanceTimersByTimeAsync(10);
591
+ scheduler.stop();
592
+ expect(scheduler.isRunning()).toBe(false);
593
+ await vi.advanceTimersByTimeAsync(2000);
594
+ expect(mockRunCycle).toHaveBeenCalledTimes(1); // no more runs after stop
595
+ });
596
+
597
+ it('does not run concurrent cycles', async () => {
598
+ let resolveFirst: () => void;
599
+ const slowCycle = vi.fn().mockImplementation(() =>
600
+ new Promise<void>(resolve => { resolveFirst = resolve; })
601
+ );
602
+ const slow = new GravityScheduler({ intervalMs: 100, runCycle: slowCycle });
603
+ slow.start();
604
+ await vi.advanceTimersByTimeAsync(10); // starts first cycle
605
+ await vi.advanceTimersByTimeAsync(200); // interval fires but first still running
606
+ expect(slowCycle).toHaveBeenCalledTimes(1);
607
+ resolveFirst!();
608
+ slow.stop();
609
+ });
610
+
611
+ it('handles cycle errors without crashing', async () => {
612
+ const failingCycle = vi.fn().mockRejectedValue(new Error('cycle failed'));
613
+ const failing = new GravityScheduler({ intervalMs: 1000, runCycle: failingCycle });
614
+ failing.start();
615
+ await vi.advanceTimersByTimeAsync(10);
616
+ expect(failing.isRunning()).toBe(true); // still running despite error
617
+ failing.stop();
618
+ });
619
+ });
620
+ ```
621
+
622
+ - [ ] **Step 2: Implement scheduler**
623
+
624
+ ```typescript
625
+ // src/lib/cortex/gravity/scheduler.ts
626
+
627
+ export const GRAVITY_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
628
+
629
+ export interface GravitySchedulerConfig {
630
+ intervalMs?: number;
631
+ runCycle: () => Promise<void>;
632
+ }
633
+
634
+ export class GravityScheduler {
635
+ private timer: ReturnType<typeof setInterval> | null = null;
636
+ private running = false;
637
+ private cycling = false;
638
+ private config: Required<GravitySchedulerConfig>;
639
+
640
+ constructor(config: GravitySchedulerConfig) {
641
+ this.config = {
642
+ intervalMs: config.intervalMs ?? GRAVITY_INTERVAL_MS,
643
+ runCycle: config.runCycle,
644
+ };
645
+ }
646
+
647
+ start(): void {
648
+ if (this.running) return;
649
+ this.running = true;
650
+
651
+ // Run first cycle immediately (non-blocking)
652
+ this.executeCycle();
653
+
654
+ // Schedule recurring cycles
655
+ this.timer = setInterval(() => this.executeCycle(), this.config.intervalMs);
656
+ }
657
+
658
+ stop(): void {
659
+ this.running = false;
660
+ if (this.timer) {
661
+ clearInterval(this.timer);
662
+ this.timer = null;
663
+ }
664
+ }
665
+
666
+ isRunning(): boolean {
667
+ return this.running;
668
+ }
669
+
670
+ private async executeCycle(): Promise<void> {
671
+ if (this.cycling) return; // prevent concurrent cycles
672
+ this.cycling = true;
673
+ try {
674
+ await this.config.runCycle();
675
+ } catch {
676
+ // Log but don't crash — scheduler continues
677
+ } finally {
678
+ this.cycling = false;
679
+ }
680
+ }
681
+ }
682
+ ```
683
+
684
+ - [ ] **Step 3: Run tests, commit**
685
+
686
+ ```bash
687
+ git commit -m "feat(cortex): add gravity scheduler with interval execution"
688
+ ```
689
+
690
+ ---
691
+
692
+ ### Task 6: Barrel export and CortexInstance integration
693
+
694
+ **Files:**
695
+ - Create: `src/lib/cortex/gravity/index.ts`
696
+ - Modify: `src/lib/cortex/index.ts`
697
+
698
+ - [ ] **Step 1: Create barrel export**
699
+
700
+ ```typescript
701
+ // src/lib/cortex/gravity/index.ts
702
+ export { computePromotionScore, shouldPromote, getNextLevel, HOP_DECAY, PROMOTION_TYPE_WEIGHTS } from './promotion';
703
+ export { getTrickleMode, TRICKLE_DEFAULTS } from './trickle';
704
+ export type { TrickleMode } from './trickle';
705
+ export { detectSentimentConflict, CONTRADICTION_COSINE_THRESHOLD, DEDUP_COSINE_THRESHOLD } from './contradiction';
706
+ export { computeDecay, shouldArchive, ARCHIVE_THRESHOLD } from './decay';
707
+ export { GravityScheduler, GRAVITY_INTERVAL_MS } from './scheduler';
708
+ export type { GravitySchedulerConfig } from './scheduler';
709
+ ```
710
+
711
+ - [ ] **Step 2: Add GravityScheduler to CortexInstance**
712
+
713
+ Read `src/lib/cortex/index.ts`. Add:
714
+
715
+ 1. Import: `import { GravityScheduler } from './gravity/scheduler';`
716
+ 2. Add `gravityScheduler?: GravityScheduler` to CortexInstance interface
717
+ 3. In getCortex(), after signalPipeline initialization:
718
+
719
+ ```typescript
720
+ const gravityScheduler = new GravityScheduler({
721
+ runCycle: async () => {
722
+ // Gravity cycle placeholder — full implementation requires
723
+ // scanning all knowledge units, computing promotion scores,
724
+ // executing trickle-down, decaying stale knowledge, etc.
725
+ // Individual functions are ready; the orchestration wiring
726
+ // will be connected when the system has enough data to test.
727
+ },
728
+ });
729
+ // Don't auto-start — let the application decide when to start
730
+ ```
731
+
732
+ 4. Include `gravityScheduler` in instance object
733
+ 5. In `resetCortex()`, add `_instance.gravityScheduler?.stop()` before nulling
734
+
735
+ - [ ] **Step 3: Run full test suite**
736
+
737
+ ```bash
738
+ npx vitest run tests/lib/cortex/
739
+ ```
740
+
741
+ - [ ] **Step 4: Commit**
742
+
743
+ ```bash
744
+ git commit -m "feat(cortex): add gravity module barrel export and CortexInstance integration"
745
+ ```
746
+
747
+ ---
748
+
749
+ ## Summary
750
+
751
+ | Task | Component | Tests | Status |
752
+ |------|-----------|-------|--------|
753
+ | 1 | Promotion (bubble-up) | 8 | |
754
+ | 2 | Trickle-down | 6 | |
755
+ | 3 | Contradiction detection | 5 | |
756
+ | 4 | Decay + archival | 8 | |
757
+ | 5 | Gravity scheduler | 5 | |
758
+ | 6 | Barrel export + integration | regression | |
759
+
760
+ **Total: 6 tasks, ~32 new tests, 3 chunks**
761
+
762
+ **Key design decisions:**
763
+ - Promotion is COPY (not move) — original stays, promoted copy gets decayed confidence (×0.85)
764
+ - Trickle-down has two modes: PUSH (copies to lower scopes) and VISIBILITY (accessible via graph but not copied)
765
+ - Contradiction detection uses keyword-based sentiment analysis (not LLM) — fast and deterministic
766
+ - Decay is gradual — starts after 30 days of no access, increases over time, archives below 0.1 after 6 months
767
+ - Scheduler uses setInterval (consistent with FederationSync pattern), prevents concurrent cycles, survives errors
768
+ - The runCycle body is a placeholder — individual gravity functions are ready but the full orchestration loop connecting them to store iteration will be wired when there's enough data to test against