@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,933 +1,933 @@
1
- # Cortex v2 — Pillar 5: Observable Signal Ingestion
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:** Build the adapter-based signal ingestion framework and implement the 3 core adapters (Conversations, Git History, Documents). The remaining 4 adapters (PR Reviews, Test Signals, Deployment, Behavioral) are deferred — they require external webhooks/APIs and can be added incrementally since the adapter interface is extensible.
6
-
7
- **Architecture:** A new `src/lib/cortex/signals/` module with a `SignalPipeline` class that consumes `SignalEnvelope` objects from any adapter. Each adapter implements a `SignalAdapter` interface with `extract()` (AsyncIterable) and `healthCheck()`. The existing `IngestionPipeline` is wrapped as the Conversation adapter for backward compat. The Git adapter parses `git log` output. The Document adapter watches `docs/**` for ADRs/READMEs.
8
-
9
- **Tech Stack:** TypeScript, vitest, child_process (for git), fs (for docs)
10
-
11
- **Spec:** `docs/superpowers/specs/2026-03-14-cortex-v2-design.md` — Pillar 5
12
-
13
- **Depends on:** Pillars 1-4 (all completed)
14
-
15
- **Deferred to future:** PR Review adapter, Test Signal adapter, Deployment adapter, Behavioral Inference adapter
16
-
17
- ---
18
-
19
- ## File Structure
20
-
21
- ```
22
- New files:
23
- ├── src/lib/cortex/signals/types.ts — SignalEnvelope, SignalAdapter interfaces
24
- ├── src/lib/cortex/signals/pipeline.ts — Unified SignalPipeline
25
- ├── src/lib/cortex/signals/adapters/conversation.ts — Wraps existing IngestionPipeline
26
- ├── src/lib/cortex/signals/adapters/git.ts — Git history adapter
27
- ├── src/lib/cortex/signals/adapters/document.ts — Document/ADR adapter
28
- ├── src/lib/cortex/signals/index.ts — Barrel export
29
-
30
- Test files:
31
- ├── tests/lib/cortex/signals/pipeline.test.ts
32
- ├── tests/lib/cortex/signals/adapters/git.test.ts
33
- ├── tests/lib/cortex/signals/adapters/document.test.ts
34
- ```
35
-
36
- ---
37
-
38
- ## Chunk 1: Signal Types and Unified Pipeline
39
-
40
- ### Task 1: Signal types
41
-
42
- **Files:**
43
- - Create: `src/lib/cortex/signals/types.ts`
44
-
45
- - [ ] **Step 1: Create types file**
46
-
47
- ```typescript
48
- // src/lib/cortex/signals/types.ts
49
- import type { KnowledgeType, SensitivityClass, Origin, EntityLink } from '../knowledge/types';
50
-
51
- export interface SignalEnvelope {
52
- text: string;
53
- origin: Origin;
54
- entities: EntityLink[];
55
- suggested_type: KnowledgeType;
56
- suggested_sensitivity: SensitivityClass;
57
- raw_metadata: Record<string, unknown>;
58
- }
59
-
60
- export interface SignalAdapter {
61
- name: string;
62
- schedule: 'realtime' | 'polling' | 'webhook' | 'cron';
63
- extract(): AsyncIterable<SignalEnvelope>;
64
- healthCheck(): Promise<boolean>;
65
- }
66
-
67
- export interface IngestResult {
68
- accepted: number;
69
- skipped: number; // dedup
70
- errors: string[];
71
- }
72
-
73
- /**
74
- * Graph edge update carried in raw_metadata.
75
- * Adapters can include these to update the entity graph during ingestion.
76
- */
77
- export interface EdgeUpdate {
78
- source_id: string;
79
- target_id: string;
80
- relation: string;
81
- weight_delta: number; // increment (not absolute)
82
- }
83
- ```
84
-
85
- - [ ] **Step 2: Commit**
86
-
87
- ```bash
88
- git add src/lib/cortex/signals/types.ts
89
- git commit -m "feat(cortex): add signal ingestion type definitions"
90
- ```
91
-
92
- ---
93
-
94
- ### Task 2: Unified SignalPipeline
95
-
96
- **Files:**
97
- - Create: `src/lib/cortex/signals/pipeline.ts`
98
- - Create: `tests/lib/cortex/signals/pipeline.test.ts`
99
-
100
- - [ ] **Step 1: Write failing tests**
101
-
102
- ```typescript
103
- // tests/lib/cortex/signals/pipeline.test.ts
104
- import { describe, it, expect, vi, beforeEach } from 'vitest';
105
- import { SignalPipeline } from '@/lib/cortex/signals/pipeline';
106
- import type { SignalEnvelope } from '@/lib/cortex/signals/types';
107
-
108
- const mockStore = {
109
- add: vi.fn().mockResolvedValue(undefined),
110
- search: vi.fn().mockResolvedValue([]),
111
- };
112
-
113
- const mockEmbedding = {
114
- embed: vi.fn().mockResolvedValue([[0.1, 0.2, 0.3]]),
115
- dimensions: 3,
116
- name: 'mock',
117
- init: vi.fn(),
118
- };
119
-
120
- const mockGraph = {
121
- createEdge: vi.fn(),
122
- incrementEdgeWeight: vi.fn(),
123
- getEntity: vi.fn().mockReturnValue(null),
124
- };
125
-
126
- const mockResolver = {
127
- extractEntities: vi.fn().mockReturnValue([]),
128
- };
129
-
130
- function makeEnvelope(overrides: Partial<SignalEnvelope> = {}): SignalEnvelope {
131
- return {
132
- text: 'Fix auth timeout by increasing pool size',
133
- origin: { source_type: 'git_commit', source_ref: 'abc123', creator_entity_id: 'person-alice' },
134
- entities: [],
135
- suggested_type: 'error_fix',
136
- suggested_sensitivity: 'internal',
137
- raw_metadata: {},
138
- ...overrides,
139
- };
140
- }
141
-
142
- describe('SignalPipeline', () => {
143
- let pipeline: SignalPipeline;
144
-
145
- beforeEach(() => {
146
- vi.clearAllMocks();
147
- pipeline = new SignalPipeline({
148
- store: mockStore as any,
149
- embedding: mockEmbedding as any,
150
- graph: mockGraph as any,
151
- resolver: mockResolver as any,
152
- });
153
- });
154
-
155
- it('ingests a signal envelope and stores it', async () => {
156
- const result = await pipeline.ingest(makeEnvelope());
157
- expect(result.accepted).toBe(1);
158
- expect(mockEmbedding.embed).toHaveBeenCalledWith(['Fix auth timeout by increasing pool size']);
159
- expect(mockStore.add).toHaveBeenCalledTimes(1);
160
- });
161
-
162
- it('uses suggested_type from envelope', async () => {
163
- await pipeline.ingest(makeEnvelope({ suggested_type: 'decision' }));
164
- const addCall = mockStore.add.mock.calls[0];
165
- expect(addCall[1].type).toBe('decision');
166
- });
167
-
168
- it('auto-classifies sensitivity (most restrictive wins)', async () => {
169
- // Text contains API key → confidential, overrides suggested 'internal'
170
- await pipeline.ingest(makeEnvelope({
171
- text: 'Set API_KEY=sk-ant-abc123 in production',
172
- suggested_sensitivity: 'internal',
173
- }));
174
- const addCall = mockStore.add.mock.calls[0];
175
- expect(addCall[1].sensitivity).toBe('confidential');
176
- });
177
-
178
- it('keeps suggested_sensitivity when more restrictive than auto-classification', async () => {
179
- await pipeline.ingest(makeEnvelope({
180
- text: 'General technical note', // auto-classifies as internal
181
- suggested_sensitivity: 'restricted', // more restrictive
182
- }));
183
- const addCall = mockStore.add.mock.calls[0];
184
- expect(addCall[1].sensitivity).toBe('restricted');
185
- });
186
-
187
- it('processes edge updates from raw_metadata', async () => {
188
- await pipeline.ingest(makeEnvelope({
189
- raw_metadata: {
190
- edge_updates: [
191
- { source_id: 'person-alice', target_id: 'topic-auth', relation: 'expert_in', weight_delta: 0.05 },
192
- ],
193
- },
194
- }));
195
- expect(mockGraph.incrementEdgeWeight).toHaveBeenCalledWith(
196
- 'person-alice', 'topic-auth', 'expert_in', 0.05
197
- );
198
- });
199
-
200
- it('deduplicates by text hash', async () => {
201
- const envelope = makeEnvelope();
202
- await pipeline.ingest(envelope);
203
- const result = await pipeline.ingest(envelope); // same text
204
- expect(result.skipped).toBe(1);
205
- expect(result.accepted).toBe(0);
206
- expect(mockStore.add).toHaveBeenCalledTimes(1); // only first call
207
- });
208
-
209
- it('ingests batch of envelopes', async () => {
210
- const envelopes = [
211
- makeEnvelope({ text: 'First signal' }),
212
- makeEnvelope({ text: 'Second signal' }),
213
- makeEnvelope({ text: 'Third signal' }),
214
- ];
215
- const result = await pipeline.ingestBatch(envelopes);
216
- expect(result.accepted).toBe(3);
217
- expect(mockStore.add).toHaveBeenCalledTimes(3);
218
- });
219
-
220
- it('handles embedding failures gracefully', async () => {
221
- mockEmbedding.embed.mockRejectedValueOnce(new Error('embed failed'));
222
- const result = await pipeline.ingest(makeEnvelope());
223
- expect(result.errors).toHaveLength(1);
224
- expect(result.accepted).toBe(0);
225
- });
226
- });
227
- ```
228
-
229
- - [ ] **Step 2: Run tests to verify they fail**
230
-
231
- Run: `npx vitest run tests/lib/cortex/signals/pipeline.test.ts`
232
-
233
- - [ ] **Step 3: Implement SignalPipeline**
234
-
235
- ```typescript
236
- // src/lib/cortex/signals/pipeline.ts
237
- import { createHash } from 'crypto';
238
- import type { CortexStore } from '../store';
239
- import type { EmbeddingProvider } from '../embeddings';
240
- import type { EntityGraph } from '../graph/entity-graph';
241
- import type { EntityResolver } from '../graph/resolver';
242
- import type { KnowledgeUnit } from '../knowledge/types';
243
- import { classifySensitivity } from '../boundary/classifier';
244
- import { layerToScope, scopeToLayerKey } from '../knowledge/compat';
245
- import type { SignalEnvelope, IngestResult, EdgeUpdate } from './types';
246
-
247
- const SENSITIVITY_PRIORITY: Record<string, number> = {
248
- public: 0, internal: 1, restricted: 2, confidential: 3,
249
- };
250
-
251
- export interface SignalPipelineDeps {
252
- store: CortexStore;
253
- embedding: EmbeddingProvider;
254
- graph: EntityGraph;
255
- resolver: EntityResolver;
256
- }
257
-
258
- export class SignalPipeline {
259
- private hashSet = new Set<string>();
260
- private deps: SignalPipelineDeps;
261
-
262
- constructor(deps: SignalPipelineDeps) {
263
- this.deps = deps;
264
- }
265
-
266
- async ingest(envelope: SignalEnvelope): Promise<IngestResult> {
267
- const result: IngestResult = { accepted: 0, skipped: 0, errors: [] };
268
-
269
- try {
270
- // 1. Dedup by text hash
271
- const hash = createHash('sha256')
272
- .update(envelope.text.replace(/\s+/g, ' ').trim())
273
- .digest('hex');
274
-
275
- if (this.hashSet.has(hash)) {
276
- result.skipped = 1;
277
- return result;
278
- }
279
- this.hashSet.add(hash);
280
-
281
- // 2. Sensitivity: most restrictive wins between suggested and auto-classified
282
- const autoSensitivity = classifySensitivity(envelope.text);
283
- const suggestedPriority = SENSITIVITY_PRIORITY[envelope.suggested_sensitivity] ?? 1;
284
- const autoPriority = SENSITIVITY_PRIORITY[autoSensitivity] ?? 1;
285
- const sensitivity = suggestedPriority >= autoPriority
286
- ? envelope.suggested_sensitivity : autoSensitivity;
287
-
288
- // 3. Embed
289
- const [vector] = await this.deps.embedding.embed([envelope.text]);
290
-
291
- // 4. Build scope from origin
292
- const scope = layerToScope('personal', null, envelope.origin.creator_entity_id.replace('person-', ''));
293
- const layerKey = scopeToLayerKey(scope);
294
- const layer = 'personal' as const; // default; adapters can override via metadata
295
-
296
- // 5. Build KnowledgeUnit
297
- const unit: KnowledgeUnit = {
298
- id: crypto.randomUUID(),
299
- vector,
300
- text: envelope.text,
301
- type: envelope.suggested_type,
302
- layer,
303
- workspace_id: (envelope.raw_metadata.workspace_id as number) ?? null,
304
- session_id: (envelope.raw_metadata.session_id as string) ?? null,
305
- agent_type: 'claude',
306
- project_path: (envelope.raw_metadata.project_path as string) ?? null,
307
- file_refs: (envelope.raw_metadata.file_refs as string[]) ?? [],
308
- confidence: 0.8,
309
- created: new Date().toISOString(),
310
- source_timestamp: new Date().toISOString(),
311
- stale_score: 0,
312
- access_count: 0,
313
- last_accessed: null,
314
- metadata: { source: envelope.origin.source_type },
315
- // v2 fields
316
- scope,
317
- entity_links: envelope.entities,
318
- evidence_score: 0.8,
319
- corroborations: 0,
320
- contradiction_refs: [],
321
- sensitivity,
322
- creator_scope: null,
323
- origin: envelope.origin,
324
- propagation_path: [],
325
- };
326
-
327
- // 6. Store
328
- await this.deps.store.add(layerKey, unit);
329
- result.accepted = 1;
330
-
331
- // 7. Process edge updates
332
- const edgeUpdates = (envelope.raw_metadata.edge_updates as EdgeUpdate[]) ?? [];
333
- for (const update of edgeUpdates) {
334
- try {
335
- this.deps.graph.incrementEdgeWeight(
336
- update.source_id, update.target_id, update.relation as any, update.weight_delta
337
- );
338
- } catch {
339
- // Edge entities may not exist yet, skip
340
- }
341
- }
342
-
343
- } catch (err: any) {
344
- result.errors.push(err.message);
345
- }
346
-
347
- return result;
348
- }
349
-
350
- async ingestBatch(envelopes: SignalEnvelope[]): Promise<IngestResult> {
351
- const totals: IngestResult = { accepted: 0, skipped: 0, errors: [] };
352
- for (const envelope of envelopes) {
353
- const r = await this.ingest(envelope);
354
- totals.accepted += r.accepted;
355
- totals.skipped += r.skipped;
356
- totals.errors.push(...r.errors);
357
- }
358
- return totals;
359
- }
360
- }
361
- ```
362
-
363
- - [ ] **Step 4: Run tests to verify they pass**
364
-
365
- Run: `npx vitest run tests/lib/cortex/signals/pipeline.test.ts`
366
- Expected: PASS (8 tests)
367
-
368
- - [ ] **Step 5: Commit**
369
-
370
- ```bash
371
- git add src/lib/cortex/signals/pipeline.ts tests/lib/cortex/signals/pipeline.test.ts
372
- git commit -m "feat(cortex): add unified SignalPipeline for multi-source ingestion"
373
- ```
374
-
375
- ---
376
-
377
- ## Chunk 2: Core Adapters
378
-
379
- ### Task 3: Conversation adapter (wraps existing pipeline)
380
-
381
- **Files:**
382
- - Create: `src/lib/cortex/signals/adapters/conversation.ts`
383
-
384
- - [ ] **Step 1: Implement conversation adapter**
385
-
386
- This adapter wraps the existing `IngestionPipeline` to produce `SignalEnvelope` objects from Claude Code session transcripts. It does NOT replace the existing pipeline — it wraps it so conversations flow through the unified `SignalPipeline`.
387
-
388
- ```typescript
389
- // src/lib/cortex/signals/adapters/conversation.ts
390
- import type { SignalAdapter, SignalEnvelope } from '../types';
391
-
392
- /**
393
- * Conversation adapter — wraps the learn hook's output format.
394
- * This is a "pull" adapter: it doesn't actively extract.
395
- * Instead, the learn hook POSTs to the knowledge API, and this adapter
396
- * can be used to convert raw session messages into SignalEnvelopes
397
- * for batch processing.
398
- */
399
- export class ConversationAdapter implements SignalAdapter {
400
- name = 'conversation';
401
- schedule = 'realtime' as const;
402
-
403
- async *extract(): AsyncIterable<SignalEnvelope> {
404
- // No-op for the conversation adapter.
405
- // Conversations are ingested in real-time via the learn hook → knowledge API.
406
- // This adapter exists to satisfy the interface and for future batch reprocessing.
407
- }
408
-
409
- async healthCheck(): Promise<boolean> {
410
- return true;
411
- }
412
-
413
- /**
414
- * Convert a raw Q&A pair into a SignalEnvelope (used by learn hook).
415
- */
416
- static fromQA(question: string, answer: string, sessionId: string, type: string = 'conversation'): SignalEnvelope {
417
- return {
418
- text: `Q: ${question}\nA: ${answer}`,
419
- origin: {
420
- source_type: 'conversation',
421
- source_ref: sessionId,
422
- creator_entity_id: 'person-default-user',
423
- },
424
- entities: [],
425
- suggested_type: type as any,
426
- suggested_sensitivity: 'internal',
427
- raw_metadata: { session_id: sessionId },
428
- };
429
- }
430
- }
431
- ```
432
-
433
- - [ ] **Step 2: Commit**
434
-
435
- ```bash
436
- git add src/lib/cortex/signals/adapters/conversation.ts
437
- git commit -m "feat(cortex): add conversation signal adapter"
438
- ```
439
-
440
- ---
441
-
442
- ### Task 4: Git history adapter
443
-
444
- **Files:**
445
- - Create: `src/lib/cortex/signals/adapters/git.ts`
446
- - Create: `tests/lib/cortex/signals/adapters/git.test.ts`
447
-
448
- - [ ] **Step 1: Write failing tests**
449
-
450
- ```typescript
451
- // tests/lib/cortex/signals/adapters/git.test.ts
452
- import { describe, it, expect, vi } from 'vitest';
453
- import { GitAdapter, parseGitLog } from '@/lib/cortex/signals/adapters/git';
454
- import type { SignalEnvelope } from '@/lib/cortex/signals/types';
455
-
456
- describe('parseGitLog', () => {
457
- it('parses a commit into a SignalEnvelope', () => {
458
- const logEntry = {
459
- sha: 'abc123def',
460
- author: 'alice@acme.com',
461
- authorName: 'Alice Smith',
462
- date: '2026-03-15T10:00:00Z',
463
- message: 'fix(auth): increase connection pool to handle concurrent load\n\nThe default pool of 10 was exhausted under peak traffic.',
464
- files: ['src/services/auth/pool.ts', 'config/auth.yaml'],
465
- };
466
-
467
- const envelopes = parseGitLog(logEntry);
468
- expect(envelopes.length).toBeGreaterThanOrEqual(1);
469
-
470
- const main = envelopes[0];
471
- expect(main.origin.source_type).toBe('git_commit');
472
- expect(main.origin.source_ref).toBe('abc123def');
473
- expect(main.suggested_type).toBe('error_fix'); // "fix" in message
474
- expect(main.text).toContain('increase connection pool');
475
- expect(main.raw_metadata.file_refs).toEqual(['src/services/auth/pool.ts', 'config/auth.yaml']);
476
- });
477
-
478
- it('classifies refactor commits as decisions', () => {
479
- const logEntry = {
480
- sha: 'def456',
481
- author: 'bob@acme.com',
482
- authorName: 'Bob',
483
- date: '2026-03-15T11:00:00Z',
484
- message: 'refactor: migrate auth from Express to Fastify',
485
- files: ['src/server.ts'],
486
- };
487
-
488
- const envelopes = parseGitLog(logEntry);
489
- expect(envelopes[0].suggested_type).toBe('decision');
490
- });
491
-
492
- it('classifies generic commits as context', () => {
493
- const logEntry = {
494
- sha: 'ghi789',
495
- author: 'charlie@acme.com',
496
- authorName: 'Charlie',
497
- date: '2026-03-15T12:00:00Z',
498
- message: 'update dependencies',
499
- files: ['package.json'],
500
- };
501
-
502
- const envelopes = parseGitLog(logEntry);
503
- expect(envelopes[0].suggested_type).toBe('context');
504
- });
505
-
506
- it('includes edge updates for author TOUCHES files', () => {
507
- const logEntry = {
508
- sha: 'jkl012',
509
- author: 'alice@acme.com',
510
- authorName: 'Alice Smith',
511
- date: '2026-03-15T13:00:00Z',
512
- message: 'feat: add new endpoint',
513
- files: ['src/api/users.ts'],
514
- };
515
-
516
- const envelopes = parseGitLog(logEntry);
517
- const edgeUpdates = envelopes[0].raw_metadata.edge_updates as any[];
518
- expect(edgeUpdates).toBeDefined();
519
- expect(edgeUpdates.length).toBeGreaterThanOrEqual(1);
520
- expect(edgeUpdates[0].relation).toBe('touches');
521
- });
522
-
523
- it('skips merge commits', () => {
524
- const logEntry = {
525
- sha: 'mno345',
526
- author: 'alice@acme.com',
527
- authorName: 'Alice',
528
- date: '2026-03-15T14:00:00Z',
529
- message: 'Merge branch \'feature/foo\' into main',
530
- files: [],
531
- };
532
-
533
- const envelopes = parseGitLog(logEntry);
534
- expect(envelopes).toHaveLength(0);
535
- });
536
- });
537
- ```
538
-
539
- - [ ] **Step 2: Implement git adapter**
540
-
541
- ```typescript
542
- // src/lib/cortex/signals/adapters/git.ts
543
- import type { SignalAdapter, SignalEnvelope, EdgeUpdate } from '../types';
544
- import { slugify } from '../../graph/types';
545
-
546
- export interface GitLogEntry {
547
- sha: string;
548
- author: string; // email
549
- authorName: string;
550
- date: string; // ISO timestamp
551
- message: string;
552
- files: string[];
553
- }
554
-
555
- const FIX_PATTERNS = [/^fix[:(]/, /\bfix\b/i, /\bbug\b/i, /\bhotfix\b/i];
556
- const DECISION_PATTERNS = [/^refactor[:(]/, /\bmigrat/i, /\bswitch\s+to\b/i, /\breplace\b.*\bwith\b/i, /^feat[:(]/];
557
- const MERGE_PATTERN = /^Merge\s+(branch|pull\s+request|remote)/i;
558
-
559
- /**
560
- * Parse a git log entry into SignalEnvelopes.
561
- */
562
- export function parseGitLog(entry: GitLogEntry): SignalEnvelope[] {
563
- // Skip merge commits
564
- if (MERGE_PATTERN.test(entry.message)) return [];
565
-
566
- // Skip very short messages
567
- const body = entry.message.trim();
568
- if (body.length < 10) return [];
569
-
570
- // Classify commit type
571
- let suggestedType: string = 'context';
572
- if (FIX_PATTERNS.some(p => p.test(body))) suggestedType = 'error_fix';
573
- else if (DECISION_PATTERNS.some(p => p.test(body))) suggestedType = 'decision';
574
-
575
- const authorSlug = slugify(entry.authorName);
576
- const creatorEntityId = `person-${authorSlug}`;
577
-
578
- // Build edge updates: author TOUCHES each file
579
- const edgeUpdates: EdgeUpdate[] = entry.files.map(file => ({
580
- source_id: creatorEntityId,
581
- target_id: `module-${slugify(file)}`,
582
- relation: 'touches',
583
- weight_delta: 0.05,
584
- }));
585
-
586
- const envelope: SignalEnvelope = {
587
- text: body,
588
- origin: {
589
- source_type: 'git_commit',
590
- source_ref: entry.sha,
591
- creator_entity_id: creatorEntityId,
592
- },
593
- entities: [],
594
- suggested_type: suggestedType as any,
595
- suggested_sensitivity: 'internal',
596
- raw_metadata: {
597
- file_refs: entry.files,
598
- edge_updates: edgeUpdates,
599
- author_email: entry.author,
600
- commit_date: entry.date,
601
- },
602
- };
603
-
604
- return [envelope];
605
- }
606
-
607
- /**
608
- * Git adapter — extracts knowledge from git history.
609
- * Uses `git log` to scan recent commits.
610
- */
611
- export class GitAdapter implements SignalAdapter {
612
- name = 'git';
613
- schedule = 'polling' as const;
614
-
615
- constructor(private repoPath: string, private sinceDate?: string) {}
616
-
617
- async *extract(): AsyncIterable<SignalEnvelope> {
618
- const { execSync } = await import('child_process');
619
- const since = this.sinceDate ?? new Date(Date.now() - 86400000).toISOString(); // default: last 24h
620
-
621
- try {
622
- const log = execSync(
623
- `git log --since="${since}" --format="%H|%ae|%an|%aI|%s" --name-only`,
624
- { cwd: this.repoPath, encoding: 'utf-8', timeout: 10000 }
625
- );
626
-
627
- const entries = this.parseLogOutput(log);
628
- for (const entry of entries) {
629
- for (const envelope of parseGitLog(entry)) {
630
- yield envelope;
631
- }
632
- }
633
- } catch {
634
- // Git not available or not a repo, yield nothing
635
- }
636
- }
637
-
638
- async healthCheck(): Promise<boolean> {
639
- try {
640
- const { execSync } = await import('child_process');
641
- execSync('git rev-parse HEAD', { cwd: this.repoPath, encoding: 'utf-8', timeout: 5000 });
642
- return true;
643
- } catch {
644
- return false;
645
- }
646
- }
647
-
648
- private parseLogOutput(log: string): GitLogEntry[] {
649
- const entries: GitLogEntry[] = [];
650
- const lines = log.split('\n');
651
- let current: GitLogEntry | null = null;
652
-
653
- for (const line of lines) {
654
- if (line.includes('|') && line.split('|').length >= 5) {
655
- if (current) entries.push(current);
656
- const [sha, author, authorName, date, ...messageParts] = line.split('|');
657
- current = {
658
- sha, author, authorName, date,
659
- message: messageParts.join('|'),
660
- files: [],
661
- };
662
- } else if (line.trim() && current) {
663
- current.files.push(line.trim());
664
- }
665
- }
666
-
667
- if (current) entries.push(current);
668
- return entries;
669
- }
670
- }
671
- ```
672
-
673
- - [ ] **Step 3: Run tests, commit**
674
-
675
- Run: `npx vitest run tests/lib/cortex/signals/adapters/git.test.ts`
676
-
677
- ```bash
678
- git commit -m "feat(cortex): add git history signal adapter"
679
- ```
680
-
681
- ---
682
-
683
- ### Task 5: Document adapter
684
-
685
- **Files:**
686
- - Create: `src/lib/cortex/signals/adapters/document.ts`
687
- - Create: `tests/lib/cortex/signals/adapters/document.test.ts`
688
-
689
- - [ ] **Step 1: Write failing tests**
690
-
691
- ```typescript
692
- // tests/lib/cortex/signals/adapters/document.test.ts
693
- import { describe, it, expect } from 'vitest';
694
- import { parseDocument, classifyDocument } from '@/lib/cortex/signals/adapters/document';
695
-
696
- describe('classifyDocument', () => {
697
- it('classifies ADR files as decisions', () => {
698
- expect(classifyDocument('docs/adr/001-use-postgres.md')).toBe('decision');
699
- expect(classifyDocument('docs/ADR-002.md')).toBe('decision');
700
- });
701
-
702
- it('classifies runbook files as pattern', () => {
703
- expect(classifyDocument('docs/runbooks/deploy-production.md')).toBe('pattern');
704
- });
705
-
706
- it('classifies README as context', () => {
707
- expect(classifyDocument('README.md')).toBe('context');
708
- expect(classifyDocument('docs/getting-started.md')).toBe('context');
709
- });
710
- });
711
-
712
- describe('parseDocument', () => {
713
- it('creates envelope from document content', () => {
714
- const envelope = parseDocument({
715
- path: 'docs/adr/001-use-postgres.md',
716
- content: '# ADR-001: Use PostgreSQL\n\nWe decided to use PostgreSQL for all new services due to its reliability and JSON support.',
717
- });
718
-
719
- expect(envelope.origin.source_type).toBe('document');
720
- expect(envelope.origin.source_ref).toBe('docs/adr/001-use-postgres.md');
721
- expect(envelope.suggested_type).toBe('decision');
722
- expect(envelope.text).toContain('PostgreSQL');
723
- expect(envelope.suggested_sensitivity).toBe('internal');
724
- });
725
-
726
- it('truncates very long documents', () => {
727
- const longContent = 'x'.repeat(10000);
728
- const envelope = parseDocument({
729
- path: 'docs/guide.md',
730
- content: longContent,
731
- });
732
- expect(envelope.text.length).toBeLessThanOrEqual(4000);
733
- });
734
-
735
- it('sets higher authority via raw_metadata', () => {
736
- const envelope = parseDocument({
737
- path: 'docs/adr/001.md',
738
- content: 'ADR content',
739
- });
740
- expect(envelope.raw_metadata.authority_boost).toBe(true);
741
- });
742
- });
743
- ```
744
-
745
- - [ ] **Step 2: Implement document adapter**
746
-
747
- ```typescript
748
- // src/lib/cortex/signals/adapters/document.ts
749
- import type { SignalAdapter, SignalEnvelope } from '../types';
750
- import type { KnowledgeType } from '../../knowledge/types';
751
-
752
- const MAX_DOC_LENGTH = 4000;
753
-
754
- const DOC_TYPE_PATTERNS: [RegExp, KnowledgeType][] = [
755
- [/\badr[s]?\b/i, 'decision'],
756
- [/\bADR[-_]/i, 'decision'],
757
- [/\brunbook/i, 'pattern'],
758
- [/\bplaybook/i, 'pattern'],
759
- [/\bREADME/i, 'context'],
760
- [/\bguide/i, 'context'],
761
- [/\bchangelog/i, 'summary'],
762
- ];
763
-
764
- export function classifyDocument(filepath: string): KnowledgeType {
765
- for (const [pattern, type] of DOC_TYPE_PATTERNS) {
766
- if (pattern.test(filepath)) return type;
767
- }
768
- return 'context';
769
- }
770
-
771
- export interface DocumentInput {
772
- path: string;
773
- content: string;
774
- }
775
-
776
- export function parseDocument(input: DocumentInput): SignalEnvelope {
777
- const type = classifyDocument(input.path);
778
- const text = input.content.length > MAX_DOC_LENGTH
779
- ? input.content.slice(0, MAX_DOC_LENGTH)
780
- : input.content;
781
-
782
- return {
783
- text,
784
- origin: {
785
- source_type: 'document',
786
- source_ref: input.path,
787
- creator_entity_id: 'person-default-user',
788
- },
789
- entities: [],
790
- suggested_type: type,
791
- suggested_sensitivity: 'internal',
792
- raw_metadata: {
793
- file_path: input.path,
794
- authority_boost: true, // documents have higher authority
795
- },
796
- };
797
- }
798
-
799
- /**
800
- * Document adapter — scans docs directories for markdown files.
801
- */
802
- export class DocumentAdapter implements SignalAdapter {
803
- name = 'document';
804
- schedule = 'polling' as const;
805
-
806
- constructor(private docPaths: string[]) {}
807
-
808
- async *extract(): AsyncIterable<SignalEnvelope> {
809
- const fs = await import('fs');
810
- const path = await import('path');
811
-
812
- for (const docDir of this.docPaths) {
813
- try {
814
- const files = this.walkDir(docDir, fs, path);
815
- for (const file of files) {
816
- if (!file.endsWith('.md')) continue;
817
- try {
818
- const content = fs.readFileSync(file, 'utf-8');
819
- yield parseDocument({ path: file, content });
820
- } catch {
821
- // File not readable, skip
822
- }
823
- }
824
- } catch {
825
- // Directory not accessible, skip
826
- }
827
- }
828
- }
829
-
830
- async healthCheck(): Promise<boolean> {
831
- const fs = await import('fs');
832
- return this.docPaths.some(p => {
833
- try { return fs.statSync(p).isDirectory(); } catch { return false; }
834
- });
835
- }
836
-
837
- private walkDir(dir: string, fs: any, path: any): string[] {
838
- const results: string[] = [];
839
- try {
840
- const entries = fs.readdirSync(dir, { withFileTypes: true });
841
- for (const entry of entries) {
842
- const full = path.join(dir, entry.name);
843
- if (entry.isDirectory() && !entry.name.startsWith('.')) {
844
- results.push(...this.walkDir(full, fs, path));
845
- } else if (entry.isFile()) {
846
- results.push(full);
847
- }
848
- }
849
- } catch { /* not accessible */ }
850
- return results;
851
- }
852
- }
853
- ```
854
-
855
- - [ ] **Step 3: Run tests, commit**
856
-
857
- Run: `npx vitest run tests/lib/cortex/signals/adapters/document.test.ts`
858
-
859
- ```bash
860
- git commit -m "feat(cortex): add document signal adapter"
861
- ```
862
-
863
- ---
864
-
865
- ## Chunk 3: Integration and Barrel Export
866
-
867
- ### Task 6: Barrel export and CortexInstance integration
868
-
869
- **Files:**
870
- - Create: `src/lib/cortex/signals/index.ts`
871
- - Modify: `src/lib/cortex/index.ts`
872
-
873
- - [ ] **Step 1: Create barrel export**
874
-
875
- ```typescript
876
- // src/lib/cortex/signals/index.ts
877
- export { SignalPipeline } from './pipeline';
878
- export type { SignalPipelineDeps } from './pipeline';
879
- export { ConversationAdapter } from './adapters/conversation';
880
- export { GitAdapter, parseGitLog } from './adapters/git';
881
- export type { GitLogEntry } from './adapters/git';
882
- export { DocumentAdapter, parseDocument, classifyDocument } from './adapters/document';
883
- export type { DocumentInput } from './adapters/document';
884
- export type { SignalEnvelope, SignalAdapter, IngestResult, EdgeUpdate } from './types';
885
- ```
886
-
887
- - [ ] **Step 2: Add SignalPipeline to CortexInstance**
888
-
889
- Read `src/lib/cortex/index.ts`. Add:
890
-
891
- 1. Import: `import { SignalPipeline } from './signals/pipeline';`
892
- 2. Add `signalPipeline?: SignalPipeline` to CortexInstance interface
893
- 3. In getCortex(), after graph/resolver initialization:
894
-
895
- ```typescript
896
- const signalPipeline = new SignalPipeline({ store, embedding, graph, resolver });
897
- ```
898
-
899
- 4. Include in instance object.
900
-
901
- - [ ] **Step 3: Run full test suite**
902
-
903
- Run: `npx vitest run tests/lib/cortex/`
904
-
905
- - [ ] **Step 4: Commit**
906
-
907
- ```bash
908
- git add src/lib/cortex/signals/index.ts src/lib/cortex/index.ts
909
- git commit -m "feat(cortex): add signal module barrel export and CortexInstance integration"
910
- ```
911
-
912
- ---
913
-
914
- ## Summary
915
-
916
- | Task | Component | Tests | Status |
917
- |------|-----------|-------|--------|
918
- | 1 | Signal types | — | |
919
- | 2 | Unified SignalPipeline | 8 | |
920
- | 3 | Conversation adapter | — | |
921
- | 4 | Git history adapter | 5 | |
922
- | 5 | Document adapter | 6 | |
923
- | 6 | Barrel export + integration | regression | |
924
-
925
- **Total: 6 tasks, ~19 new tests, 3 chunks**
926
-
927
- **Deferred adapters** (require external APIs/webhooks — implement when infrastructure is ready):
928
- - PR Review adapter (GitHub API)
929
- - Test Signal adapter (CI pipeline webhook)
930
- - Deployment adapter (deploy system webhook)
931
- - Behavioral Inference adapter (daily cron analyzing accumulated signals)
932
-
933
- Each deferred adapter = implement `SignalAdapter` interface + test, zero changes to SignalPipeline.
1
+ # Cortex v2 — Pillar 5: Observable Signal Ingestion
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:** Build the adapter-based signal ingestion framework and implement the 3 core adapters (Conversations, Git History, Documents). The remaining 4 adapters (PR Reviews, Test Signals, Deployment, Behavioral) are deferred — they require external webhooks/APIs and can be added incrementally since the adapter interface is extensible.
6
+
7
+ **Architecture:** A new `src/lib/cortex/signals/` module with a `SignalPipeline` class that consumes `SignalEnvelope` objects from any adapter. Each adapter implements a `SignalAdapter` interface with `extract()` (AsyncIterable) and `healthCheck()`. The existing `IngestionPipeline` is wrapped as the Conversation adapter for backward compat. The Git adapter parses `git log` output. The Document adapter watches `docs/**` for ADRs/READMEs.
8
+
9
+ **Tech Stack:** TypeScript, vitest, child_process (for git), fs (for docs)
10
+
11
+ **Spec:** `docs/superpowers/specs/2026-03-14-cortex-v2-design.md` — Pillar 5
12
+
13
+ **Depends on:** Pillars 1-4 (all completed)
14
+
15
+ **Deferred to future:** PR Review adapter, Test Signal adapter, Deployment adapter, Behavioral Inference adapter
16
+
17
+ ---
18
+
19
+ ## File Structure
20
+
21
+ ```
22
+ New files:
23
+ ├── src/lib/cortex/signals/types.ts — SignalEnvelope, SignalAdapter interfaces
24
+ ├── src/lib/cortex/signals/pipeline.ts — Unified SignalPipeline
25
+ ├── src/lib/cortex/signals/adapters/conversation.ts — Wraps existing IngestionPipeline
26
+ ├── src/lib/cortex/signals/adapters/git.ts — Git history adapter
27
+ ├── src/lib/cortex/signals/adapters/document.ts — Document/ADR adapter
28
+ ├── src/lib/cortex/signals/index.ts — Barrel export
29
+
30
+ Test files:
31
+ ├── tests/lib/cortex/signals/pipeline.test.ts
32
+ ├── tests/lib/cortex/signals/adapters/git.test.ts
33
+ ├── tests/lib/cortex/signals/adapters/document.test.ts
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Chunk 1: Signal Types and Unified Pipeline
39
+
40
+ ### Task 1: Signal types
41
+
42
+ **Files:**
43
+ - Create: `src/lib/cortex/signals/types.ts`
44
+
45
+ - [ ] **Step 1: Create types file**
46
+
47
+ ```typescript
48
+ // src/lib/cortex/signals/types.ts
49
+ import type { KnowledgeType, SensitivityClass, Origin, EntityLink } from '../knowledge/types';
50
+
51
+ export interface SignalEnvelope {
52
+ text: string;
53
+ origin: Origin;
54
+ entities: EntityLink[];
55
+ suggested_type: KnowledgeType;
56
+ suggested_sensitivity: SensitivityClass;
57
+ raw_metadata: Record<string, unknown>;
58
+ }
59
+
60
+ export interface SignalAdapter {
61
+ name: string;
62
+ schedule: 'realtime' | 'polling' | 'webhook' | 'cron';
63
+ extract(): AsyncIterable<SignalEnvelope>;
64
+ healthCheck(): Promise<boolean>;
65
+ }
66
+
67
+ export interface IngestResult {
68
+ accepted: number;
69
+ skipped: number; // dedup
70
+ errors: string[];
71
+ }
72
+
73
+ /**
74
+ * Graph edge update carried in raw_metadata.
75
+ * Adapters can include these to update the entity graph during ingestion.
76
+ */
77
+ export interface EdgeUpdate {
78
+ source_id: string;
79
+ target_id: string;
80
+ relation: string;
81
+ weight_delta: number; // increment (not absolute)
82
+ }
83
+ ```
84
+
85
+ - [ ] **Step 2: Commit**
86
+
87
+ ```bash
88
+ git add src/lib/cortex/signals/types.ts
89
+ git commit -m "feat(cortex): add signal ingestion type definitions"
90
+ ```
91
+
92
+ ---
93
+
94
+ ### Task 2: Unified SignalPipeline
95
+
96
+ **Files:**
97
+ - Create: `src/lib/cortex/signals/pipeline.ts`
98
+ - Create: `tests/lib/cortex/signals/pipeline.test.ts`
99
+
100
+ - [ ] **Step 1: Write failing tests**
101
+
102
+ ```typescript
103
+ // tests/lib/cortex/signals/pipeline.test.ts
104
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
105
+ import { SignalPipeline } from '@/lib/cortex/signals/pipeline';
106
+ import type { SignalEnvelope } from '@/lib/cortex/signals/types';
107
+
108
+ const mockStore = {
109
+ add: vi.fn().mockResolvedValue(undefined),
110
+ search: vi.fn().mockResolvedValue([]),
111
+ };
112
+
113
+ const mockEmbedding = {
114
+ embed: vi.fn().mockResolvedValue([[0.1, 0.2, 0.3]]),
115
+ dimensions: 3,
116
+ name: 'mock',
117
+ init: vi.fn(),
118
+ };
119
+
120
+ const mockGraph = {
121
+ createEdge: vi.fn(),
122
+ incrementEdgeWeight: vi.fn(),
123
+ getEntity: vi.fn().mockReturnValue(null),
124
+ };
125
+
126
+ const mockResolver = {
127
+ extractEntities: vi.fn().mockReturnValue([]),
128
+ };
129
+
130
+ function makeEnvelope(overrides: Partial<SignalEnvelope> = {}): SignalEnvelope {
131
+ return {
132
+ text: 'Fix auth timeout by increasing pool size',
133
+ origin: { source_type: 'git_commit', source_ref: 'abc123', creator_entity_id: 'person-alice' },
134
+ entities: [],
135
+ suggested_type: 'error_fix',
136
+ suggested_sensitivity: 'internal',
137
+ raw_metadata: {},
138
+ ...overrides,
139
+ };
140
+ }
141
+
142
+ describe('SignalPipeline', () => {
143
+ let pipeline: SignalPipeline;
144
+
145
+ beforeEach(() => {
146
+ vi.clearAllMocks();
147
+ pipeline = new SignalPipeline({
148
+ store: mockStore as any,
149
+ embedding: mockEmbedding as any,
150
+ graph: mockGraph as any,
151
+ resolver: mockResolver as any,
152
+ });
153
+ });
154
+
155
+ it('ingests a signal envelope and stores it', async () => {
156
+ const result = await pipeline.ingest(makeEnvelope());
157
+ expect(result.accepted).toBe(1);
158
+ expect(mockEmbedding.embed).toHaveBeenCalledWith(['Fix auth timeout by increasing pool size']);
159
+ expect(mockStore.add).toHaveBeenCalledTimes(1);
160
+ });
161
+
162
+ it('uses suggested_type from envelope', async () => {
163
+ await pipeline.ingest(makeEnvelope({ suggested_type: 'decision' }));
164
+ const addCall = mockStore.add.mock.calls[0];
165
+ expect(addCall[1].type).toBe('decision');
166
+ });
167
+
168
+ it('auto-classifies sensitivity (most restrictive wins)', async () => {
169
+ // Text contains API key → confidential, overrides suggested 'internal'
170
+ await pipeline.ingest(makeEnvelope({
171
+ text: 'Set API_KEY=sk-ant-abc123 in production',
172
+ suggested_sensitivity: 'internal',
173
+ }));
174
+ const addCall = mockStore.add.mock.calls[0];
175
+ expect(addCall[1].sensitivity).toBe('confidential');
176
+ });
177
+
178
+ it('keeps suggested_sensitivity when more restrictive than auto-classification', async () => {
179
+ await pipeline.ingest(makeEnvelope({
180
+ text: 'General technical note', // auto-classifies as internal
181
+ suggested_sensitivity: 'restricted', // more restrictive
182
+ }));
183
+ const addCall = mockStore.add.mock.calls[0];
184
+ expect(addCall[1].sensitivity).toBe('restricted');
185
+ });
186
+
187
+ it('processes edge updates from raw_metadata', async () => {
188
+ await pipeline.ingest(makeEnvelope({
189
+ raw_metadata: {
190
+ edge_updates: [
191
+ { source_id: 'person-alice', target_id: 'topic-auth', relation: 'expert_in', weight_delta: 0.05 },
192
+ ],
193
+ },
194
+ }));
195
+ expect(mockGraph.incrementEdgeWeight).toHaveBeenCalledWith(
196
+ 'person-alice', 'topic-auth', 'expert_in', 0.05
197
+ );
198
+ });
199
+
200
+ it('deduplicates by text hash', async () => {
201
+ const envelope = makeEnvelope();
202
+ await pipeline.ingest(envelope);
203
+ const result = await pipeline.ingest(envelope); // same text
204
+ expect(result.skipped).toBe(1);
205
+ expect(result.accepted).toBe(0);
206
+ expect(mockStore.add).toHaveBeenCalledTimes(1); // only first call
207
+ });
208
+
209
+ it('ingests batch of envelopes', async () => {
210
+ const envelopes = [
211
+ makeEnvelope({ text: 'First signal' }),
212
+ makeEnvelope({ text: 'Second signal' }),
213
+ makeEnvelope({ text: 'Third signal' }),
214
+ ];
215
+ const result = await pipeline.ingestBatch(envelopes);
216
+ expect(result.accepted).toBe(3);
217
+ expect(mockStore.add).toHaveBeenCalledTimes(3);
218
+ });
219
+
220
+ it('handles embedding failures gracefully', async () => {
221
+ mockEmbedding.embed.mockRejectedValueOnce(new Error('embed failed'));
222
+ const result = await pipeline.ingest(makeEnvelope());
223
+ expect(result.errors).toHaveLength(1);
224
+ expect(result.accepted).toBe(0);
225
+ });
226
+ });
227
+ ```
228
+
229
+ - [ ] **Step 2: Run tests to verify they fail**
230
+
231
+ Run: `npx vitest run tests/lib/cortex/signals/pipeline.test.ts`
232
+
233
+ - [ ] **Step 3: Implement SignalPipeline**
234
+
235
+ ```typescript
236
+ // src/lib/cortex/signals/pipeline.ts
237
+ import { createHash } from 'crypto';
238
+ import type { CortexStore } from '../store';
239
+ import type { EmbeddingProvider } from '../embeddings';
240
+ import type { EntityGraph } from '../graph/entity-graph';
241
+ import type { EntityResolver } from '../graph/resolver';
242
+ import type { KnowledgeUnit } from '../knowledge/types';
243
+ import { classifySensitivity } from '../boundary/classifier';
244
+ import { layerToScope, scopeToLayerKey } from '../knowledge/compat';
245
+ import type { SignalEnvelope, IngestResult, EdgeUpdate } from './types';
246
+
247
+ const SENSITIVITY_PRIORITY: Record<string, number> = {
248
+ public: 0, internal: 1, restricted: 2, confidential: 3,
249
+ };
250
+
251
+ export interface SignalPipelineDeps {
252
+ store: CortexStore;
253
+ embedding: EmbeddingProvider;
254
+ graph: EntityGraph;
255
+ resolver: EntityResolver;
256
+ }
257
+
258
+ export class SignalPipeline {
259
+ private hashSet = new Set<string>();
260
+ private deps: SignalPipelineDeps;
261
+
262
+ constructor(deps: SignalPipelineDeps) {
263
+ this.deps = deps;
264
+ }
265
+
266
+ async ingest(envelope: SignalEnvelope): Promise<IngestResult> {
267
+ const result: IngestResult = { accepted: 0, skipped: 0, errors: [] };
268
+
269
+ try {
270
+ // 1. Dedup by text hash
271
+ const hash = createHash('sha256')
272
+ .update(envelope.text.replace(/\s+/g, ' ').trim())
273
+ .digest('hex');
274
+
275
+ if (this.hashSet.has(hash)) {
276
+ result.skipped = 1;
277
+ return result;
278
+ }
279
+ this.hashSet.add(hash);
280
+
281
+ // 2. Sensitivity: most restrictive wins between suggested and auto-classified
282
+ const autoSensitivity = classifySensitivity(envelope.text);
283
+ const suggestedPriority = SENSITIVITY_PRIORITY[envelope.suggested_sensitivity] ?? 1;
284
+ const autoPriority = SENSITIVITY_PRIORITY[autoSensitivity] ?? 1;
285
+ const sensitivity = suggestedPriority >= autoPriority
286
+ ? envelope.suggested_sensitivity : autoSensitivity;
287
+
288
+ // 3. Embed
289
+ const [vector] = await this.deps.embedding.embed([envelope.text]);
290
+
291
+ // 4. Build scope from origin
292
+ const scope = layerToScope('personal', null, envelope.origin.creator_entity_id.replace('person-', ''));
293
+ const layerKey = scopeToLayerKey(scope);
294
+ const layer = 'personal' as const; // default; adapters can override via metadata
295
+
296
+ // 5. Build KnowledgeUnit
297
+ const unit: KnowledgeUnit = {
298
+ id: crypto.randomUUID(),
299
+ vector,
300
+ text: envelope.text,
301
+ type: envelope.suggested_type,
302
+ layer,
303
+ workspace_id: (envelope.raw_metadata.workspace_id as number) ?? null,
304
+ session_id: (envelope.raw_metadata.session_id as string) ?? null,
305
+ agent_type: 'claude',
306
+ project_path: (envelope.raw_metadata.project_path as string) ?? null,
307
+ file_refs: (envelope.raw_metadata.file_refs as string[]) ?? [],
308
+ confidence: 0.8,
309
+ created: new Date().toISOString(),
310
+ source_timestamp: new Date().toISOString(),
311
+ stale_score: 0,
312
+ access_count: 0,
313
+ last_accessed: null,
314
+ metadata: { source: envelope.origin.source_type },
315
+ // v2 fields
316
+ scope,
317
+ entity_links: envelope.entities,
318
+ evidence_score: 0.8,
319
+ corroborations: 0,
320
+ contradiction_refs: [],
321
+ sensitivity,
322
+ creator_scope: null,
323
+ origin: envelope.origin,
324
+ propagation_path: [],
325
+ };
326
+
327
+ // 6. Store
328
+ await this.deps.store.add(layerKey, unit);
329
+ result.accepted = 1;
330
+
331
+ // 7. Process edge updates
332
+ const edgeUpdates = (envelope.raw_metadata.edge_updates as EdgeUpdate[]) ?? [];
333
+ for (const update of edgeUpdates) {
334
+ try {
335
+ this.deps.graph.incrementEdgeWeight(
336
+ update.source_id, update.target_id, update.relation as any, update.weight_delta
337
+ );
338
+ } catch {
339
+ // Edge entities may not exist yet, skip
340
+ }
341
+ }
342
+
343
+ } catch (err: any) {
344
+ result.errors.push(err.message);
345
+ }
346
+
347
+ return result;
348
+ }
349
+
350
+ async ingestBatch(envelopes: SignalEnvelope[]): Promise<IngestResult> {
351
+ const totals: IngestResult = { accepted: 0, skipped: 0, errors: [] };
352
+ for (const envelope of envelopes) {
353
+ const r = await this.ingest(envelope);
354
+ totals.accepted += r.accepted;
355
+ totals.skipped += r.skipped;
356
+ totals.errors.push(...r.errors);
357
+ }
358
+ return totals;
359
+ }
360
+ }
361
+ ```
362
+
363
+ - [ ] **Step 4: Run tests to verify they pass**
364
+
365
+ Run: `npx vitest run tests/lib/cortex/signals/pipeline.test.ts`
366
+ Expected: PASS (8 tests)
367
+
368
+ - [ ] **Step 5: Commit**
369
+
370
+ ```bash
371
+ git add src/lib/cortex/signals/pipeline.ts tests/lib/cortex/signals/pipeline.test.ts
372
+ git commit -m "feat(cortex): add unified SignalPipeline for multi-source ingestion"
373
+ ```
374
+
375
+ ---
376
+
377
+ ## Chunk 2: Core Adapters
378
+
379
+ ### Task 3: Conversation adapter (wraps existing pipeline)
380
+
381
+ **Files:**
382
+ - Create: `src/lib/cortex/signals/adapters/conversation.ts`
383
+
384
+ - [ ] **Step 1: Implement conversation adapter**
385
+
386
+ This adapter wraps the existing `IngestionPipeline` to produce `SignalEnvelope` objects from Claude Code session transcripts. It does NOT replace the existing pipeline — it wraps it so conversations flow through the unified `SignalPipeline`.
387
+
388
+ ```typescript
389
+ // src/lib/cortex/signals/adapters/conversation.ts
390
+ import type { SignalAdapter, SignalEnvelope } from '../types';
391
+
392
+ /**
393
+ * Conversation adapter — wraps the learn hook's output format.
394
+ * This is a "pull" adapter: it doesn't actively extract.
395
+ * Instead, the learn hook POSTs to the knowledge API, and this adapter
396
+ * can be used to convert raw session messages into SignalEnvelopes
397
+ * for batch processing.
398
+ */
399
+ export class ConversationAdapter implements SignalAdapter {
400
+ name = 'conversation';
401
+ schedule = 'realtime' as const;
402
+
403
+ async *extract(): AsyncIterable<SignalEnvelope> {
404
+ // No-op for the conversation adapter.
405
+ // Conversations are ingested in real-time via the learn hook → knowledge API.
406
+ // This adapter exists to satisfy the interface and for future batch reprocessing.
407
+ }
408
+
409
+ async healthCheck(): Promise<boolean> {
410
+ return true;
411
+ }
412
+
413
+ /**
414
+ * Convert a raw Q&A pair into a SignalEnvelope (used by learn hook).
415
+ */
416
+ static fromQA(question: string, answer: string, sessionId: string, type: string = 'conversation'): SignalEnvelope {
417
+ return {
418
+ text: `Q: ${question}\nA: ${answer}`,
419
+ origin: {
420
+ source_type: 'conversation',
421
+ source_ref: sessionId,
422
+ creator_entity_id: 'person-default-user',
423
+ },
424
+ entities: [],
425
+ suggested_type: type as any,
426
+ suggested_sensitivity: 'internal',
427
+ raw_metadata: { session_id: sessionId },
428
+ };
429
+ }
430
+ }
431
+ ```
432
+
433
+ - [ ] **Step 2: Commit**
434
+
435
+ ```bash
436
+ git add src/lib/cortex/signals/adapters/conversation.ts
437
+ git commit -m "feat(cortex): add conversation signal adapter"
438
+ ```
439
+
440
+ ---
441
+
442
+ ### Task 4: Git history adapter
443
+
444
+ **Files:**
445
+ - Create: `src/lib/cortex/signals/adapters/git.ts`
446
+ - Create: `tests/lib/cortex/signals/adapters/git.test.ts`
447
+
448
+ - [ ] **Step 1: Write failing tests**
449
+
450
+ ```typescript
451
+ // tests/lib/cortex/signals/adapters/git.test.ts
452
+ import { describe, it, expect, vi } from 'vitest';
453
+ import { GitAdapter, parseGitLog } from '@/lib/cortex/signals/adapters/git';
454
+ import type { SignalEnvelope } from '@/lib/cortex/signals/types';
455
+
456
+ describe('parseGitLog', () => {
457
+ it('parses a commit into a SignalEnvelope', () => {
458
+ const logEntry = {
459
+ sha: 'abc123def',
460
+ author: 'alice@acme.com',
461
+ authorName: 'Alice Smith',
462
+ date: '2026-03-15T10:00:00Z',
463
+ message: 'fix(auth): increase connection pool to handle concurrent load\n\nThe default pool of 10 was exhausted under peak traffic.',
464
+ files: ['src/services/auth/pool.ts', 'config/auth.yaml'],
465
+ };
466
+
467
+ const envelopes = parseGitLog(logEntry);
468
+ expect(envelopes.length).toBeGreaterThanOrEqual(1);
469
+
470
+ const main = envelopes[0];
471
+ expect(main.origin.source_type).toBe('git_commit');
472
+ expect(main.origin.source_ref).toBe('abc123def');
473
+ expect(main.suggested_type).toBe('error_fix'); // "fix" in message
474
+ expect(main.text).toContain('increase connection pool');
475
+ expect(main.raw_metadata.file_refs).toEqual(['src/services/auth/pool.ts', 'config/auth.yaml']);
476
+ });
477
+
478
+ it('classifies refactor commits as decisions', () => {
479
+ const logEntry = {
480
+ sha: 'def456',
481
+ author: 'bob@acme.com',
482
+ authorName: 'Bob',
483
+ date: '2026-03-15T11:00:00Z',
484
+ message: 'refactor: migrate auth from Express to Fastify',
485
+ files: ['src/server.ts'],
486
+ };
487
+
488
+ const envelopes = parseGitLog(logEntry);
489
+ expect(envelopes[0].suggested_type).toBe('decision');
490
+ });
491
+
492
+ it('classifies generic commits as context', () => {
493
+ const logEntry = {
494
+ sha: 'ghi789',
495
+ author: 'charlie@acme.com',
496
+ authorName: 'Charlie',
497
+ date: '2026-03-15T12:00:00Z',
498
+ message: 'update dependencies',
499
+ files: ['package.json'],
500
+ };
501
+
502
+ const envelopes = parseGitLog(logEntry);
503
+ expect(envelopes[0].suggested_type).toBe('context');
504
+ });
505
+
506
+ it('includes edge updates for author TOUCHES files', () => {
507
+ const logEntry = {
508
+ sha: 'jkl012',
509
+ author: 'alice@acme.com',
510
+ authorName: 'Alice Smith',
511
+ date: '2026-03-15T13:00:00Z',
512
+ message: 'feat: add new endpoint',
513
+ files: ['src/api/users.ts'],
514
+ };
515
+
516
+ const envelopes = parseGitLog(logEntry);
517
+ const edgeUpdates = envelopes[0].raw_metadata.edge_updates as any[];
518
+ expect(edgeUpdates).toBeDefined();
519
+ expect(edgeUpdates.length).toBeGreaterThanOrEqual(1);
520
+ expect(edgeUpdates[0].relation).toBe('touches');
521
+ });
522
+
523
+ it('skips merge commits', () => {
524
+ const logEntry = {
525
+ sha: 'mno345',
526
+ author: 'alice@acme.com',
527
+ authorName: 'Alice',
528
+ date: '2026-03-15T14:00:00Z',
529
+ message: 'Merge branch \'feature/foo\' into main',
530
+ files: [],
531
+ };
532
+
533
+ const envelopes = parseGitLog(logEntry);
534
+ expect(envelopes).toHaveLength(0);
535
+ });
536
+ });
537
+ ```
538
+
539
+ - [ ] **Step 2: Implement git adapter**
540
+
541
+ ```typescript
542
+ // src/lib/cortex/signals/adapters/git.ts
543
+ import type { SignalAdapter, SignalEnvelope, EdgeUpdate } from '../types';
544
+ import { slugify } from '../../graph/types';
545
+
546
+ export interface GitLogEntry {
547
+ sha: string;
548
+ author: string; // email
549
+ authorName: string;
550
+ date: string; // ISO timestamp
551
+ message: string;
552
+ files: string[];
553
+ }
554
+
555
+ const FIX_PATTERNS = [/^fix[:(]/, /\bfix\b/i, /\bbug\b/i, /\bhotfix\b/i];
556
+ const DECISION_PATTERNS = [/^refactor[:(]/, /\bmigrat/i, /\bswitch\s+to\b/i, /\breplace\b.*\bwith\b/i, /^feat[:(]/];
557
+ const MERGE_PATTERN = /^Merge\s+(branch|pull\s+request|remote)/i;
558
+
559
+ /**
560
+ * Parse a git log entry into SignalEnvelopes.
561
+ */
562
+ export function parseGitLog(entry: GitLogEntry): SignalEnvelope[] {
563
+ // Skip merge commits
564
+ if (MERGE_PATTERN.test(entry.message)) return [];
565
+
566
+ // Skip very short messages
567
+ const body = entry.message.trim();
568
+ if (body.length < 10) return [];
569
+
570
+ // Classify commit type
571
+ let suggestedType: string = 'context';
572
+ if (FIX_PATTERNS.some(p => p.test(body))) suggestedType = 'error_fix';
573
+ else if (DECISION_PATTERNS.some(p => p.test(body))) suggestedType = 'decision';
574
+
575
+ const authorSlug = slugify(entry.authorName);
576
+ const creatorEntityId = `person-${authorSlug}`;
577
+
578
+ // Build edge updates: author TOUCHES each file
579
+ const edgeUpdates: EdgeUpdate[] = entry.files.map(file => ({
580
+ source_id: creatorEntityId,
581
+ target_id: `module-${slugify(file)}`,
582
+ relation: 'touches',
583
+ weight_delta: 0.05,
584
+ }));
585
+
586
+ const envelope: SignalEnvelope = {
587
+ text: body,
588
+ origin: {
589
+ source_type: 'git_commit',
590
+ source_ref: entry.sha,
591
+ creator_entity_id: creatorEntityId,
592
+ },
593
+ entities: [],
594
+ suggested_type: suggestedType as any,
595
+ suggested_sensitivity: 'internal',
596
+ raw_metadata: {
597
+ file_refs: entry.files,
598
+ edge_updates: edgeUpdates,
599
+ author_email: entry.author,
600
+ commit_date: entry.date,
601
+ },
602
+ };
603
+
604
+ return [envelope];
605
+ }
606
+
607
+ /**
608
+ * Git adapter — extracts knowledge from git history.
609
+ * Uses `git log` to scan recent commits.
610
+ */
611
+ export class GitAdapter implements SignalAdapter {
612
+ name = 'git';
613
+ schedule = 'polling' as const;
614
+
615
+ constructor(private repoPath: string, private sinceDate?: string) {}
616
+
617
+ async *extract(): AsyncIterable<SignalEnvelope> {
618
+ const { execSync } = await import('child_process');
619
+ const since = this.sinceDate ?? new Date(Date.now() - 86400000).toISOString(); // default: last 24h
620
+
621
+ try {
622
+ const log = execSync(
623
+ `git log --since="${since}" --format="%H|%ae|%an|%aI|%s" --name-only`,
624
+ { cwd: this.repoPath, encoding: 'utf-8', timeout: 10000 }
625
+ );
626
+
627
+ const entries = this.parseLogOutput(log);
628
+ for (const entry of entries) {
629
+ for (const envelope of parseGitLog(entry)) {
630
+ yield envelope;
631
+ }
632
+ }
633
+ } catch {
634
+ // Git not available or not a repo, yield nothing
635
+ }
636
+ }
637
+
638
+ async healthCheck(): Promise<boolean> {
639
+ try {
640
+ const { execSync } = await import('child_process');
641
+ execSync('git rev-parse HEAD', { cwd: this.repoPath, encoding: 'utf-8', timeout: 5000 });
642
+ return true;
643
+ } catch {
644
+ return false;
645
+ }
646
+ }
647
+
648
+ private parseLogOutput(log: string): GitLogEntry[] {
649
+ const entries: GitLogEntry[] = [];
650
+ const lines = log.split('\n');
651
+ let current: GitLogEntry | null = null;
652
+
653
+ for (const line of lines) {
654
+ if (line.includes('|') && line.split('|').length >= 5) {
655
+ if (current) entries.push(current);
656
+ const [sha, author, authorName, date, ...messageParts] = line.split('|');
657
+ current = {
658
+ sha, author, authorName, date,
659
+ message: messageParts.join('|'),
660
+ files: [],
661
+ };
662
+ } else if (line.trim() && current) {
663
+ current.files.push(line.trim());
664
+ }
665
+ }
666
+
667
+ if (current) entries.push(current);
668
+ return entries;
669
+ }
670
+ }
671
+ ```
672
+
673
+ - [ ] **Step 3: Run tests, commit**
674
+
675
+ Run: `npx vitest run tests/lib/cortex/signals/adapters/git.test.ts`
676
+
677
+ ```bash
678
+ git commit -m "feat(cortex): add git history signal adapter"
679
+ ```
680
+
681
+ ---
682
+
683
+ ### Task 5: Document adapter
684
+
685
+ **Files:**
686
+ - Create: `src/lib/cortex/signals/adapters/document.ts`
687
+ - Create: `tests/lib/cortex/signals/adapters/document.test.ts`
688
+
689
+ - [ ] **Step 1: Write failing tests**
690
+
691
+ ```typescript
692
+ // tests/lib/cortex/signals/adapters/document.test.ts
693
+ import { describe, it, expect } from 'vitest';
694
+ import { parseDocument, classifyDocument } from '@/lib/cortex/signals/adapters/document';
695
+
696
+ describe('classifyDocument', () => {
697
+ it('classifies ADR files as decisions', () => {
698
+ expect(classifyDocument('docs/adr/001-use-postgres.md')).toBe('decision');
699
+ expect(classifyDocument('docs/ADR-002.md')).toBe('decision');
700
+ });
701
+
702
+ it('classifies runbook files as pattern', () => {
703
+ expect(classifyDocument('docs/runbooks/deploy-production.md')).toBe('pattern');
704
+ });
705
+
706
+ it('classifies README as context', () => {
707
+ expect(classifyDocument('README.md')).toBe('context');
708
+ expect(classifyDocument('docs/getting-started.md')).toBe('context');
709
+ });
710
+ });
711
+
712
+ describe('parseDocument', () => {
713
+ it('creates envelope from document content', () => {
714
+ const envelope = parseDocument({
715
+ path: 'docs/adr/001-use-postgres.md',
716
+ content: '# ADR-001: Use PostgreSQL\n\nWe decided to use PostgreSQL for all new services due to its reliability and JSON support.',
717
+ });
718
+
719
+ expect(envelope.origin.source_type).toBe('document');
720
+ expect(envelope.origin.source_ref).toBe('docs/adr/001-use-postgres.md');
721
+ expect(envelope.suggested_type).toBe('decision');
722
+ expect(envelope.text).toContain('PostgreSQL');
723
+ expect(envelope.suggested_sensitivity).toBe('internal');
724
+ });
725
+
726
+ it('truncates very long documents', () => {
727
+ const longContent = 'x'.repeat(10000);
728
+ const envelope = parseDocument({
729
+ path: 'docs/guide.md',
730
+ content: longContent,
731
+ });
732
+ expect(envelope.text.length).toBeLessThanOrEqual(4000);
733
+ });
734
+
735
+ it('sets higher authority via raw_metadata', () => {
736
+ const envelope = parseDocument({
737
+ path: 'docs/adr/001.md',
738
+ content: 'ADR content',
739
+ });
740
+ expect(envelope.raw_metadata.authority_boost).toBe(true);
741
+ });
742
+ });
743
+ ```
744
+
745
+ - [ ] **Step 2: Implement document adapter**
746
+
747
+ ```typescript
748
+ // src/lib/cortex/signals/adapters/document.ts
749
+ import type { SignalAdapter, SignalEnvelope } from '../types';
750
+ import type { KnowledgeType } from '../../knowledge/types';
751
+
752
+ const MAX_DOC_LENGTH = 4000;
753
+
754
+ const DOC_TYPE_PATTERNS: [RegExp, KnowledgeType][] = [
755
+ [/\badr[s]?\b/i, 'decision'],
756
+ [/\bADR[-_]/i, 'decision'],
757
+ [/\brunbook/i, 'pattern'],
758
+ [/\bplaybook/i, 'pattern'],
759
+ [/\bREADME/i, 'context'],
760
+ [/\bguide/i, 'context'],
761
+ [/\bchangelog/i, 'summary'],
762
+ ];
763
+
764
+ export function classifyDocument(filepath: string): KnowledgeType {
765
+ for (const [pattern, type] of DOC_TYPE_PATTERNS) {
766
+ if (pattern.test(filepath)) return type;
767
+ }
768
+ return 'context';
769
+ }
770
+
771
+ export interface DocumentInput {
772
+ path: string;
773
+ content: string;
774
+ }
775
+
776
+ export function parseDocument(input: DocumentInput): SignalEnvelope {
777
+ const type = classifyDocument(input.path);
778
+ const text = input.content.length > MAX_DOC_LENGTH
779
+ ? input.content.slice(0, MAX_DOC_LENGTH)
780
+ : input.content;
781
+
782
+ return {
783
+ text,
784
+ origin: {
785
+ source_type: 'document',
786
+ source_ref: input.path,
787
+ creator_entity_id: 'person-default-user',
788
+ },
789
+ entities: [],
790
+ suggested_type: type,
791
+ suggested_sensitivity: 'internal',
792
+ raw_metadata: {
793
+ file_path: input.path,
794
+ authority_boost: true, // documents have higher authority
795
+ },
796
+ };
797
+ }
798
+
799
+ /**
800
+ * Document adapter — scans docs directories for markdown files.
801
+ */
802
+ export class DocumentAdapter implements SignalAdapter {
803
+ name = 'document';
804
+ schedule = 'polling' as const;
805
+
806
+ constructor(private docPaths: string[]) {}
807
+
808
+ async *extract(): AsyncIterable<SignalEnvelope> {
809
+ const fs = await import('fs');
810
+ const path = await import('path');
811
+
812
+ for (const docDir of this.docPaths) {
813
+ try {
814
+ const files = this.walkDir(docDir, fs, path);
815
+ for (const file of files) {
816
+ if (!file.endsWith('.md')) continue;
817
+ try {
818
+ const content = fs.readFileSync(file, 'utf-8');
819
+ yield parseDocument({ path: file, content });
820
+ } catch {
821
+ // File not readable, skip
822
+ }
823
+ }
824
+ } catch {
825
+ // Directory not accessible, skip
826
+ }
827
+ }
828
+ }
829
+
830
+ async healthCheck(): Promise<boolean> {
831
+ const fs = await import('fs');
832
+ return this.docPaths.some(p => {
833
+ try { return fs.statSync(p).isDirectory(); } catch { return false; }
834
+ });
835
+ }
836
+
837
+ private walkDir(dir: string, fs: any, path: any): string[] {
838
+ const results: string[] = [];
839
+ try {
840
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
841
+ for (const entry of entries) {
842
+ const full = path.join(dir, entry.name);
843
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
844
+ results.push(...this.walkDir(full, fs, path));
845
+ } else if (entry.isFile()) {
846
+ results.push(full);
847
+ }
848
+ }
849
+ } catch { /* not accessible */ }
850
+ return results;
851
+ }
852
+ }
853
+ ```
854
+
855
+ - [ ] **Step 3: Run tests, commit**
856
+
857
+ Run: `npx vitest run tests/lib/cortex/signals/adapters/document.test.ts`
858
+
859
+ ```bash
860
+ git commit -m "feat(cortex): add document signal adapter"
861
+ ```
862
+
863
+ ---
864
+
865
+ ## Chunk 3: Integration and Barrel Export
866
+
867
+ ### Task 6: Barrel export and CortexInstance integration
868
+
869
+ **Files:**
870
+ - Create: `src/lib/cortex/signals/index.ts`
871
+ - Modify: `src/lib/cortex/index.ts`
872
+
873
+ - [ ] **Step 1: Create barrel export**
874
+
875
+ ```typescript
876
+ // src/lib/cortex/signals/index.ts
877
+ export { SignalPipeline } from './pipeline';
878
+ export type { SignalPipelineDeps } from './pipeline';
879
+ export { ConversationAdapter } from './adapters/conversation';
880
+ export { GitAdapter, parseGitLog } from './adapters/git';
881
+ export type { GitLogEntry } from './adapters/git';
882
+ export { DocumentAdapter, parseDocument, classifyDocument } from './adapters/document';
883
+ export type { DocumentInput } from './adapters/document';
884
+ export type { SignalEnvelope, SignalAdapter, IngestResult, EdgeUpdate } from './types';
885
+ ```
886
+
887
+ - [ ] **Step 2: Add SignalPipeline to CortexInstance**
888
+
889
+ Read `src/lib/cortex/index.ts`. Add:
890
+
891
+ 1. Import: `import { SignalPipeline } from './signals/pipeline';`
892
+ 2. Add `signalPipeline?: SignalPipeline` to CortexInstance interface
893
+ 3. In getCortex(), after graph/resolver initialization:
894
+
895
+ ```typescript
896
+ const signalPipeline = new SignalPipeline({ store, embedding, graph, resolver });
897
+ ```
898
+
899
+ 4. Include in instance object.
900
+
901
+ - [ ] **Step 3: Run full test suite**
902
+
903
+ Run: `npx vitest run tests/lib/cortex/`
904
+
905
+ - [ ] **Step 4: Commit**
906
+
907
+ ```bash
908
+ git add src/lib/cortex/signals/index.ts src/lib/cortex/index.ts
909
+ git commit -m "feat(cortex): add signal module barrel export and CortexInstance integration"
910
+ ```
911
+
912
+ ---
913
+
914
+ ## Summary
915
+
916
+ | Task | Component | Tests | Status |
917
+ |------|-----------|-------|--------|
918
+ | 1 | Signal types | — | |
919
+ | 2 | Unified SignalPipeline | 8 | |
920
+ | 3 | Conversation adapter | — | |
921
+ | 4 | Git history adapter | 5 | |
922
+ | 5 | Document adapter | 6 | |
923
+ | 6 | Barrel export + integration | regression | |
924
+
925
+ **Total: 6 tasks, ~19 new tests, 3 chunks**
926
+
927
+ **Deferred adapters** (require external APIs/webhooks — implement when infrastructure is ready):
928
+ - PR Review adapter (GitHub API)
929
+ - Test Signal adapter (CI pipeline webhook)
930
+ - Deployment adapter (deploy system webhook)
931
+ - Behavioral Inference adapter (daily cron analyzing accumulated signals)
932
+
933
+ Each deferred adapter = implement `SignalAdapter` interface + test, zero changes to SignalPipeline.