@jlongo78/agent-spaces 0.9.7 → 0.9.9

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 (643) hide show
  1. package/.next/standalone/.claude/settings.local.json +17 -4
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/routes-manifest.json +29 -0
  7. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(desktop)/admin/analytics/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(desktop)/admin/users/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(desktop)/analytics/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(desktop)/cortex/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(desktop)/network/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(desktop)/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(desktop)/projects/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(desktop)/sessions/[id]/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(desktop)/sessions/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(desktop)/settings/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(desktop)/terminal/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(desktop)/terminal/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(desktop)/terminal/pane/[id]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(desktop)/terminal/remote/[nodeId]/[workspaceId]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(desktop)/workspaces/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  25. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  33. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  34. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  35. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  36. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  37. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  40. package/.next/standalone/.next/server/app/admin/analytics.html +1 -1
  41. package/.next/standalone/.next/server/app/admin/analytics.rsc +3 -3
  42. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics/__PAGE__.segment.rsc +2 -2
  43. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin/analytics.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/admin/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  46. package/.next/standalone/.next/server/app/admin/analytics.segments/_full.segment.rsc +3 -3
  47. package/.next/standalone/.next/server/app/admin/analytics.segments/_head.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/admin/analytics.segments/_index.segment.rsc +2 -2
  49. package/.next/standalone/.next/server/app/admin/analytics.segments/_tree.segment.rsc +2 -2
  50. package/.next/standalone/.next/server/app/admin/users.html +1 -1
  51. package/.next/standalone/.next/server/app/admin/users.rsc +2 -2
  52. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users/__PAGE__.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin/users.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap/admin.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/admin/users.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/admin/users.segments/_full.segment.rsc +2 -2
  57. package/.next/standalone/.next/server/app/admin/users.segments/_head.segment.rsc +1 -1
  58. package/.next/standalone/.next/server/app/admin/users.segments/_index.segment.rsc +2 -2
  59. package/.next/standalone/.next/server/app/admin/users.segments/_tree.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/analytics.html +1 -1
  61. package/.next/standalone/.next/server/app/analytics.rsc +2 -2
  62. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics/__PAGE__.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap/analytics.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/analytics.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/analytics.segments/_full.segment.rsc +2 -2
  66. package/.next/standalone/.next/server/app/analytics.segments/_head.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/analytics.segments/_index.segment.rsc +2 -2
  68. package/.next/standalone/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  69. package/.next/standalone/.next/server/app/api/analytics/overview/route.js +1 -1
  70. package/.next/standalone/.next/server/app/api/analytics/overview/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js +1 -1
  72. package/.next/standalone/.next/server/app/api/benchmark/lobes/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/benchmark/run/route.js +1 -1
  74. package/.next/standalone/.next/server/app/api/benchmark/run/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js +1 -1
  76. package/.next/standalone/.next/server/app/api/benchmark/runs/[id]/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js +1 -1
  78. package/.next/standalone/.next/server/app/api/benchmark/runs/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/benchmark/status/route.js +1 -1
  80. package/.next/standalone/.next/server/app/api/benchmark/status/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/bulk/route.js +1 -1
  82. package/.next/standalone/.next/server/app/api/bulk/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/claude/usage/route/app-paths-manifest.json +3 -0
  84. package/.next/standalone/.next/server/app/api/claude/usage/route/build-manifest.json +11 -0
  85. package/.next/standalone/.next/server/app/api/claude/usage/route/server-reference-manifest.json +4 -0
  86. package/.next/standalone/.next/server/app/api/claude/usage/route.js +8 -0
  87. package/.next/standalone/.next/server/app/api/claude/usage/route.js.map +5 -0
  88. package/.next/standalone/.next/server/app/api/claude/usage/route.js.nft.json +1 -0
  89. package/.next/standalone/.next/server/app/api/claude/usage/route_client-reference-manifest.js +2 -0
  90. package/.next/standalone/.next/server/app/api/config/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cortex/context/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/cortex/context/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/cortex/curation/assess/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/cortex/curation/publish/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/cortex/curation/refine/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/cortex/curation/review/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/cortex/curation/seed/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cortex/export/route.js +1 -1
  105. package/.next/standalone/.next/server/app/api/cortex/export/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/cortex/federation/pending/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js +1 -1
  109. package/.next/standalone/.next/server/app/api/cortex/federation/resolve/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/cortex/federation/search/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/cortex/federation/teach/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/cortex/graph/edges/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/cortex/graph/entities/[id]/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/cortex/graph/entities/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/cortex/graph/populate/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/cortex/import/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/cortex/import/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/cortex/import/status/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/cortex/ingest/bootstrap/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/cortex/ingest/status/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/cortex/knowledge/[id]/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/cortex/knowledge/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/cortex/lobes/[id]/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/cortex/lobes/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/cortex/lobes/share/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/cortex/marketplace/browse/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/cortex/marketplace/preview/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/cortex/mcp/call/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/cortex/mcp/tools/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/cortex/search/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/cortex/search/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/cortex/settings/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/cortex/settings/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/cortex/status/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/cortex/status/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/cortex/timeline/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/cortex/usage/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/cortex/usage/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/cortex/workspace/[id]/context/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/files/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/folders/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/folders/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/network/handshake/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/network/handshake/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/network/panes/[id]/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/network/panes/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/network/panes/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/network/projects/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/network/projects/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/network/search/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/network/search/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/network/sessions/[id]/messages/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/network/sessions/[id]/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/network/sessions/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/network/sessions/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/network/workspaces/[id]/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/network/workspaces/route.js +1 -1
  185. package/.next/standalone/.next/server/app/api/network/workspaces/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js +1 -1
  187. package/.next/standalone/.next/server/app/api/panes/[id]/diff/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/panes/[id]/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/panes/[id]/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/panes/route.js +1 -1
  191. package/.next/standalone/.next/server/app/api/panes/route.js.nft.json +1 -1
  192. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  193. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/[...path]/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js +1 -1
  197. package/.next/standalone/.next/server/app/api/proxy/models/[modelId]/status/route.js.nft.json +1 -1
  198. package/.next/standalone/.next/server/app/api/search/route.js +2 -2
  199. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  200. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/sessions/[id]/chat/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/sessions/[id]/messages/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js +1 -1
  205. package/.next/standalone/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/sessions/route.js +2 -2
  207. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/sync/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/sync/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/tags/route.js +1 -1
  211. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  212. package/.next/standalone/.next/server/app/api/tier/route.js +1 -1
  213. package/.next/standalone/.next/server/app/api/tier/route.js.nft.json +1 -1
  214. package/.next/standalone/.next/server/app/api/whisper/config/route.js +1 -1
  215. package/.next/standalone/.next/server/app/api/whisper/config/route.js.nft.json +1 -1
  216. package/.next/standalone/.next/server/app/api/whisper/route.js.nft.json +1 -1
  217. package/.next/standalone/.next/server/app/api/wizard/chart/route/app-paths-manifest.json +3 -0
  218. package/.next/standalone/.next/server/app/api/wizard/chart/route/build-manifest.json +11 -0
  219. package/.next/standalone/.next/server/app/api/wizard/chart/route/server-reference-manifest.json +4 -0
  220. package/.next/standalone/.next/server/app/api/wizard/chart/route.js +7 -0
  221. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.map +5 -0
  222. package/.next/standalone/.next/server/app/api/wizard/chart/route.js.nft.json +1 -0
  223. package/.next/standalone/.next/server/app/api/wizard/chart/route_client-reference-manifest.js +2 -0
  224. package/.next/standalone/.next/server/app/api/wizard/chat/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/wizard/chat/route.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js +1 -1
  227. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/[key]/route.js.nft.json +1 -1
  228. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/workspaces/[id]/context/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js +1 -1
  231. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/[msgId]/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js +1 -1
  233. package/.next/standalone/.next/server/app/api/workspaces/[id]/messages/route.js.nft.json +1 -1
  234. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js +1 -1
  235. package/.next/standalone/.next/server/app/api/workspaces/[id]/route.js.nft.json +1 -1
  236. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js +1 -1
  237. package/.next/standalone/.next/server/app/api/workspaces/[id]/sessions/route.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/app-paths-manifest.json +3 -0
  239. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/build-manifest.json +11 -0
  240. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route/server-reference-manifest.json +4 -0
  241. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js +8 -0
  242. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.map +5 -0
  243. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route.js.nft.json +1 -0
  244. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/[todoId]/route_client-reference-manifest.js +2 -0
  245. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/app-paths-manifest.json +3 -0
  246. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/build-manifest.json +11 -0
  247. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route/server-reference-manifest.json +4 -0
  248. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js +8 -0
  249. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.map +5 -0
  250. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route.js.nft.json +1 -0
  251. package/.next/standalone/.next/server/app/api/workspaces/[id]/todos/route_client-reference-manifest.js +2 -0
  252. package/.next/standalone/.next/server/app/api/workspaces/route.js +2 -2
  253. package/.next/standalone/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  254. package/.next/standalone/.next/server/app/cortex.html +1 -1
  255. package/.next/standalone/.next/server/app/cortex.rsc +3 -3
  256. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex/__PAGE__.segment.rsc +2 -2
  257. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap/cortex.segment.rsc +1 -1
  258. package/.next/standalone/.next/server/app/cortex.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  259. package/.next/standalone/.next/server/app/cortex.segments/_full.segment.rsc +3 -3
  260. package/.next/standalone/.next/server/app/cortex.segments/_head.segment.rsc +1 -1
  261. package/.next/standalone/.next/server/app/cortex.segments/_index.segment.rsc +2 -2
  262. package/.next/standalone/.next/server/app/cortex.segments/_tree.segment.rsc +2 -2
  263. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  264. package/.next/standalone/.next/server/app/login.html +1 -1
  265. package/.next/standalone/.next/server/app/login.rsc +2 -2
  266. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  267. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  268. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  269. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  270. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  271. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  272. package/.next/standalone/.next/server/app/m/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/m/projects/page_client-reference-manifest.js +1 -1
  274. package/.next/standalone/.next/server/app/m/projects.html +1 -1
  275. package/.next/standalone/.next/server/app/m/projects.rsc +2 -2
  276. package/.next/standalone/.next/server/app/m/projects.segments/_full.segment.rsc +2 -2
  277. package/.next/standalone/.next/server/app/m/projects.segments/_head.segment.rsc +1 -1
  278. package/.next/standalone/.next/server/app/m/projects.segments/_index.segment.rsc +2 -2
  279. package/.next/standalone/.next/server/app/m/projects.segments/_tree.segment.rsc +2 -2
  280. package/.next/standalone/.next/server/app/m/projects.segments/m/projects/__PAGE__.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/m/projects.segments/m/projects.segment.rsc +1 -1
  282. package/.next/standalone/.next/server/app/m/projects.segments/m.segment.rsc +1 -1
  283. package/.next/standalone/.next/server/app/m/sessions/[id]/page.js.nft.json +1 -1
  284. package/.next/standalone/.next/server/app/m/sessions/[id]/page_client-reference-manifest.js +1 -1
  285. package/.next/standalone/.next/server/app/m/sessions/page_client-reference-manifest.js +1 -1
  286. package/.next/standalone/.next/server/app/m/sessions.html +1 -1
  287. package/.next/standalone/.next/server/app/m/sessions.rsc +2 -2
  288. package/.next/standalone/.next/server/app/m/sessions.segments/_full.segment.rsc +2 -2
  289. package/.next/standalone/.next/server/app/m/sessions.segments/_head.segment.rsc +1 -1
  290. package/.next/standalone/.next/server/app/m/sessions.segments/_index.segment.rsc +2 -2
  291. package/.next/standalone/.next/server/app/m/sessions.segments/_tree.segment.rsc +2 -2
  292. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions/__PAGE__.segment.rsc +1 -1
  293. package/.next/standalone/.next/server/app/m/sessions.segments/m/sessions.segment.rsc +1 -1
  294. package/.next/standalone/.next/server/app/m/sessions.segments/m.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/m/settings/page_client-reference-manifest.js +1 -1
  296. package/.next/standalone/.next/server/app/m/settings.html +1 -1
  297. package/.next/standalone/.next/server/app/m/settings.rsc +2 -2
  298. package/.next/standalone/.next/server/app/m/settings.segments/_full.segment.rsc +2 -2
  299. package/.next/standalone/.next/server/app/m/settings.segments/_head.segment.rsc +1 -1
  300. package/.next/standalone/.next/server/app/m/settings.segments/_index.segment.rsc +2 -2
  301. package/.next/standalone/.next/server/app/m/settings.segments/_tree.segment.rsc +2 -2
  302. package/.next/standalone/.next/server/app/m/settings.segments/m/settings/__PAGE__.segment.rsc +1 -1
  303. package/.next/standalone/.next/server/app/m/settings.segments/m/settings.segment.rsc +1 -1
  304. package/.next/standalone/.next/server/app/m/settings.segments/m.segment.rsc +1 -1
  305. package/.next/standalone/.next/server/app/m/terminal/page_client-reference-manifest.js +1 -1
  306. package/.next/standalone/.next/server/app/m/terminal.html +1 -1
  307. package/.next/standalone/.next/server/app/m/terminal.rsc +3 -3
  308. package/.next/standalone/.next/server/app/m/terminal.segments/_full.segment.rsc +3 -3
  309. package/.next/standalone/.next/server/app/m/terminal.segments/_head.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/m/terminal.segments/_index.segment.rsc +2 -2
  311. package/.next/standalone/.next/server/app/m/terminal.segments/_tree.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal/__PAGE__.segment.rsc +2 -2
  313. package/.next/standalone/.next/server/app/m/terminal.segments/m/terminal.segment.rsc +1 -1
  314. package/.next/standalone/.next/server/app/m/terminal.segments/m.segment.rsc +1 -1
  315. package/.next/standalone/.next/server/app/m.html +1 -1
  316. package/.next/standalone/.next/server/app/m.rsc +2 -2
  317. package/.next/standalone/.next/server/app/m.segments/_full.segment.rsc +2 -2
  318. package/.next/standalone/.next/server/app/m.segments/_head.segment.rsc +1 -1
  319. package/.next/standalone/.next/server/app/m.segments/_index.segment.rsc +2 -2
  320. package/.next/standalone/.next/server/app/m.segments/_tree.segment.rsc +2 -2
  321. package/.next/standalone/.next/server/app/m.segments/m/__PAGE__.segment.rsc +1 -1
  322. package/.next/standalone/.next/server/app/m.segments/m.segment.rsc +1 -1
  323. package/.next/standalone/.next/server/app/network.html +1 -1
  324. package/.next/standalone/.next/server/app/network.rsc +2 -2
  325. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network/__PAGE__.segment.rsc +1 -1
  326. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap/network.segment.rsc +1 -1
  327. package/.next/standalone/.next/server/app/network.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/network.segments/_full.segment.rsc +2 -2
  329. package/.next/standalone/.next/server/app/network.segments/_head.segment.rsc +1 -1
  330. package/.next/standalone/.next/server/app/network.segments/_index.segment.rsc +2 -2
  331. package/.next/standalone/.next/server/app/network.segments/_tree.segment.rsc +2 -2
  332. package/.next/standalone/.next/server/app/projects.html +1 -1
  333. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  334. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects/__PAGE__.segment.rsc +1 -1
  335. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap/projects.segment.rsc +1 -1
  336. package/.next/standalone/.next/server/app/projects.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  337. package/.next/standalone/.next/server/app/projects.segments/_full.segment.rsc +2 -2
  338. package/.next/standalone/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  339. package/.next/standalone/.next/server/app/projects.segments/_index.segment.rsc +2 -2
  340. package/.next/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
  341. package/.next/standalone/.next/server/app/sessions.html +1 -1
  342. package/.next/standalone/.next/server/app/sessions.rsc +2 -2
  343. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions/__PAGE__.segment.rsc +1 -1
  344. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap/sessions.segment.rsc +1 -1
  345. package/.next/standalone/.next/server/app/sessions.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  346. package/.next/standalone/.next/server/app/sessions.segments/_full.segment.rsc +2 -2
  347. package/.next/standalone/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  348. package/.next/standalone/.next/server/app/sessions.segments/_index.segment.rsc +2 -2
  349. package/.next/standalone/.next/server/app/sessions.segments/_tree.segment.rsc +2 -2
  350. package/.next/standalone/.next/server/app/settings.html +1 -1
  351. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  352. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings/__PAGE__.segment.rsc +2 -2
  353. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap/settings.segment.rsc +1 -1
  354. package/.next/standalone/.next/server/app/settings.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  355. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  356. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  357. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  358. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  359. package/.next/standalone/.next/server/app/terminal.html +1 -1
  360. package/.next/standalone/.next/server/app/terminal.rsc +3 -3
  361. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal/__PAGE__.segment.rsc +2 -2
  362. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap/terminal.segment.rsc +1 -1
  363. package/.next/standalone/.next/server/app/terminal.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  364. package/.next/standalone/.next/server/app/terminal.segments/_full.segment.rsc +3 -3
  365. package/.next/standalone/.next/server/app/terminal.segments/_head.segment.rsc +1 -1
  366. package/.next/standalone/.next/server/app/terminal.segments/_index.segment.rsc +2 -2
  367. package/.next/standalone/.next/server/app/terminal.segments/_tree.segment.rsc +2 -2
  368. package/.next/standalone/.next/server/app/vr/page/react-loadable-manifest.json +1 -1
  369. package/.next/standalone/.next/server/app/vr/page_client-reference-manifest.js +1 -1
  370. package/.next/standalone/.next/server/app/vr.html +1 -1
  371. package/.next/standalone/.next/server/app/vr.rsc +3 -3
  372. package/.next/standalone/.next/server/app/vr.segments/_full.segment.rsc +3 -3
  373. package/.next/standalone/.next/server/app/vr.segments/_head.segment.rsc +1 -1
  374. package/.next/standalone/.next/server/app/vr.segments/_index.segment.rsc +2 -2
  375. package/.next/standalone/.next/server/app/vr.segments/_tree.segment.rsc +2 -2
  376. package/.next/standalone/.next/server/app/vr.segments/vr/__PAGE__.segment.rsc +2 -2
  377. package/.next/standalone/.next/server/app/vr.segments/vr.segment.rsc +1 -1
  378. package/.next/standalone/.next/server/app/workspaces.html +1 -1
  379. package/.next/standalone/.next/server/app/workspaces.rsc +2 -2
  380. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces/__PAGE__.segment.rsc +1 -1
  381. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap/workspaces.segment.rsc +1 -1
  382. package/.next/standalone/.next/server/app/workspaces.segments/!KGRlc2t0b3Ap.segment.rsc +1 -1
  383. package/.next/standalone/.next/server/app/workspaces.segments/_full.segment.rsc +2 -2
  384. package/.next/standalone/.next/server/app/workspaces.segments/_head.segment.rsc +1 -1
  385. package/.next/standalone/.next/server/app/workspaces.segments/_index.segment.rsc +2 -2
  386. package/.next/standalone/.next/server/app/workspaces.segments/_tree.segment.rsc +2 -2
  387. package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00e90fc6._.js +111 -0
  389. package/.next/standalone/.next/server/chunks/[root-of-the-server]__01ab8675._.js +111 -0
  390. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03974f05._.js +111 -0
  391. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bb331da9._.js → [root-of-the-server]__046c9b91._.js} +16 -3
  392. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04ae6bf0._.js +111 -0
  393. package/.next/standalone/.next/server/chunks/[root-of-the-server]__056fa416._.js +1 -1
  394. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ac4ea3f._.js +3 -0
  395. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b8e64cb._.js +111 -0
  396. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0facd39e._.js +111 -0
  397. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10bc76a3._.js +3 -0
  398. package/.next/standalone/.next/server/chunks/[root-of-the-server]__115f3934._.js +111 -0
  399. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11f155f1._.js +3 -0
  400. package/.next/standalone/.next/server/chunks/[root-of-the-server]__160e7c73._.js +50 -33
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17a3b966._.js +111 -0
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17d3a2b2._.js +111 -0
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a86c055._.js +111 -0
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20b5e9c4._.js +3 -0
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28d6fbd8._.js +111 -0
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a3f866b._.js +119 -0
  407. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__a95bb38b._.js → [root-of-the-server]__316617e7._.js} +3 -3
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__32ad8f71._.js +111 -0
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35457394._.js +111 -0
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35de78e6._.js +111 -0
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3685ffcb._.js +111 -0
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__38954988._.js +111 -0
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3a32b624._.js +111 -0
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__426ad936._.js +119 -0
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4985c034._.js +111 -0
  416. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c6ce9ed._.js +111 -0
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cebe58a._.js +111 -0
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d5e4789._.js +111 -0
  419. package/.next/standalone/.next/server/chunks/[root-of-the-server]__65676930._.js +3 -0
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__67cab326._.js +58 -0
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__698c6f01._.js +111 -0
  422. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__7ebc4280._.js → [root-of-the-server]__6c64af29._.js} +22 -9
  423. package/.next/standalone/.next/server/chunks/[root-of-the-server]__73aed9f5._.js +111 -0
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__79b6a9bb._.js +111 -0
  425. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__e56abacf._.js → [root-of-the-server]__7db704c6._.js} +18 -5
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__812ca02b._.js +111 -0
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__821f50fa._.js +111 -0
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8716b86e._.js +111 -0
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__884ef754._.js +111 -0
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__88cdbd68._.js +111 -0
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89d9aba9._.js +111 -0
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8c2e1260._.js +111 -0
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8d536cb5._.js +111 -0
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8df8c5d1._.js +111 -0
  435. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f2ccc41._.js +111 -0
  436. package/.next/standalone/.next/server/chunks/[root-of-the-server]__95c9d682._.js +111 -0
  437. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9e5d7774._.js +111 -0
  438. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9edcff87._.js +111 -0
  439. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a049dfc2._.js +111 -0
  440. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a5b4bb9a._.js +111 -0
  441. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a83262a1._.js +111 -0
  442. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a9cd1240._.js +111 -0
  443. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__efb8251e._.js → [root-of-the-server]__a9d7f822._.js} +16 -3
  444. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad08c221._.js +111 -0
  445. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad585f2f._.js +111 -0
  446. package/.next/standalone/.next/server/chunks/[root-of-the-server]__afcb8f7d._.js +111 -0
  447. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bc250d43._.js +111 -0
  448. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bce2a6e7._.js +111 -0
  449. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c011bf91._.js +111 -0
  450. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0ac2895._.js +3 -0
  451. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c37d6380._.js +3 -0
  452. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cae392eb._.js +111 -0
  453. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc2616bb._.js +16 -3
  454. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d501fa9b._.js +111 -0
  455. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d59c6c15._.js +111 -0
  456. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d5c1db32._.js +111 -0
  457. package/.next/standalone/.next/server/chunks/[root-of-the-server]__dba60c86._.js +111 -0
  458. package/.next/standalone/.next/server/chunks/[root-of-the-server]__de14b9ae._.js +111 -0
  459. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e10643d1._.js +111 -0
  460. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e2a996e5._.js +127 -0
  461. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3477417._.js +111 -0
  462. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__32dc5513._.js → [root-of-the-server]__e4db362e._.js} +2 -2
  463. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e4e70b86._.js +111 -0
  464. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e54925af._.js +111 -0
  465. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8cbeaca._.js +111 -0
  466. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__cabaac2b._.js → [root-of-the-server]__e8edc5b0._.js} +16 -3
  467. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eab4d83b._.js +111 -0
  468. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ead29015._.js +1 -1
  469. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f056fd83._.js +111 -0
  470. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f0e99572._.js +111 -0
  471. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe1e16d0._.js +111 -0
  472. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ff9cd277._.js +111 -0
  473. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ffaea2ce._.js +111 -0
  474. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_claude_usage_route_actions_fe002ec1.js +3 -0
  475. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_wizard_chart_route_actions_888e2ec1.js +3 -0
  476. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_workspaces_[id]_todos_route_actions_0d4ffac5.js +3 -0
  477. package/.next/standalone/.next/server/chunks/ce889_server_app_api_workspaces_[id]_todos_[todoId]_route_actions_754fe6b9.js +3 -0
  478. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2cffc362._.js +3 -0
  479. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f1050870._.js → [root-of-the-server]__47c97637._.js} +2 -2
  480. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__66aca5d4._.js +1 -1
  481. package/.next/standalone/.next/server/chunks/ssr/_20c2cf3a._.js +3 -0
  482. package/.next/standalone/.next/server/chunks/ssr/_2a1d79e7._.js +1 -1
  483. package/.next/standalone/.next/server/chunks/ssr/_5c3c4cfa._.js +7 -5
  484. package/.next/standalone/.next/server/chunks/ssr/_5f55bf8f._.js +3 -0
  485. package/.next/standalone/.next/server/chunks/ssr/_ba432382._.js +7 -5
  486. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_cortex_page_tsx_0f33d8b3._.js +1 -1
  487. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_settings_page_tsx_f74824b3._.js +1 -1
  488. package/.next/standalone/.next/server/chunks/ssr/src_app_(desktop)_terminal_page_tsx_de5e8d85._.js +4 -4
  489. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__90eeddae._.js +1 -1
  490. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  491. package/.next/standalone/.next/server/pages/404.html +1 -1
  492. package/.next/standalone/.next/server/pages/500.html +2 -2
  493. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  494. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  495. package/.next/standalone/.next/static/chunks/{74d0ac0b1d0a1b79.js → 10b00b4f66102dcf.js} +1 -1
  496. package/.next/standalone/.next/static/chunks/14216197f9dcbe5b.css +3 -0
  497. package/.next/standalone/.next/static/chunks/{16eb77953dee9ea3.js → 19c71a8376c23c58.js} +1 -1
  498. package/.next/standalone/.next/static/chunks/{3e91fc608659c524.js → 350271fe79509caf.js} +1 -1
  499. package/.next/standalone/.next/static/chunks/4c9fb0a38f041a3d.js +85 -0
  500. package/.next/standalone/.next/static/chunks/{70423c7afd8abf5f.js → 597847c22200c212.js} +1 -1
  501. package/.next/standalone/.next/static/chunks/8f6f93ab45a5ff5b.js +1 -0
  502. package/.next/standalone/.next/static/chunks/{7ecd9bbb0ce4d68a.js → b7c8fe9b7275a84f.js} +1 -1
  503. package/.next/standalone/.next/static/chunks/{6245135a7afb8c7b.js → c9b10fc55516d142.js} +8 -6
  504. package/.next/standalone/.next/static/chunks/d0065f48eab94944.js +1 -0
  505. package/.next/standalone/.next/static/chunks/{e62bb488d02db247.js → d2566c2dcf53fef3.js} +1 -1
  506. package/.next/standalone/.next/static/chunks/{180c1b9ff31b979f.js → f7b34c807badf95d.js} +8 -6
  507. package/.next/standalone/.next/static/chunks/{fb0abd1933b2b2e1.js → ff7d85dade44d1f3.js} +1 -1
  508. package/.next/standalone/.spaces/cortex-context.md +35 -129
  509. package/.next/standalone/bin/spaces.js +7 -4
  510. package/.next/standalone/bin/terminal-server.js +48 -10
  511. package/.next/standalone/cortex-hook-debug.log +118 -23
  512. package/.next/standalone/docs/features/claude-usage.md +105 -0
  513. package/.next/standalone/docs/features/workspace-todos.md +127 -0
  514. package/.next/standalone/docs/superpowers/plans/2026-04-21-workspace-todos.md +1097 -0
  515. package/.next/standalone/docs/superpowers/plans/2026-04-22-claude-usage-display.md +749 -0
  516. package/.next/standalone/docs/superpowers/specs/2026-04-21-workspace-todos-design.md +180 -0
  517. package/.next/standalone/docs/superpowers/specs/2026-04-22-claude-usage-display-design.md +183 -0
  518. package/.next/standalone/package-lock.json +2 -2
  519. package/.next/standalone/package.json +1 -1
  520. package/.next/standalone/src/app/(desktop)/settings/page.tsx +40 -1
  521. package/.next/standalone/src/app/(desktop)/terminal/page.tsx +98 -7
  522. package/.next/standalone/src/app/api/benchmark/run/route.ts +24 -3
  523. package/.next/standalone/src/app/api/claude/usage/route.ts +33 -0
  524. package/.next/standalone/src/app/api/config/route.ts +3 -0
  525. package/.next/standalone/src/app/api/cortex/context/route.ts +1 -1
  526. package/.next/standalone/src/app/api/cortex/knowledge/route.ts +1 -1
  527. package/.next/standalone/src/app/api/cortex/search/route.ts +14 -2
  528. package/.next/standalone/src/app/api/folders/route.ts +16 -6
  529. package/.next/standalone/src/app/api/network/panes/[id]/route.ts +27 -11
  530. package/.next/standalone/src/app/api/network/panes/route.ts +25 -14
  531. package/.next/standalone/src/app/api/network/projects/route.ts +11 -4
  532. package/.next/standalone/src/app/api/network/search/route.ts +21 -14
  533. package/.next/standalone/src/app/api/network/sessions/[id]/messages/route.ts +18 -11
  534. package/.next/standalone/src/app/api/network/sessions/[id]/route.ts +16 -9
  535. package/.next/standalone/src/app/api/network/sessions/route.ts +25 -18
  536. package/.next/standalone/src/app/api/network/workspaces/[id]/route.ts +21 -12
  537. package/.next/standalone/src/app/api/network/workspaces/route.ts +16 -14
  538. package/.next/standalone/src/app/api/whisper/config/route.ts +16 -8
  539. package/.next/standalone/src/app/api/wizard/chart/route.ts +129 -0
  540. package/.next/standalone/src/app/api/workspaces/[id]/todos/[todoId]/route.ts +55 -0
  541. package/.next/standalone/src/app/api/workspaces/[id]/todos/route.ts +43 -0
  542. package/.next/standalone/src/components/claude/claude-usage-strip.tsx +175 -0
  543. package/.next/standalone/src/components/cortex/benchmark-tab.tsx +14 -0
  544. package/.next/standalone/src/components/terminal/terminal-pane.tsx +78 -12
  545. package/.next/standalone/src/components/wizard/chart-wizard.tsx +405 -0
  546. package/.next/standalone/src/components/workspace/workspace-todos.tsx +265 -0
  547. package/.next/standalone/src/hooks/use-benchmark.ts +1 -0
  548. package/.next/standalone/src/hooks/use-claude-usage.ts +66 -0
  549. package/.next/standalone/src/hooks/use-speech-recognition.ts +2 -1
  550. package/.next/standalone/src/lib/claude/credentials.ts +36 -0
  551. package/.next/standalone/src/lib/claude/usage.ts +69 -0
  552. package/.next/standalone/src/lib/config.ts +3 -0
  553. package/.next/standalone/src/lib/cortex/benchmark.ts +17 -1
  554. package/.next/standalone/src/lib/cortex/index.ts +54 -1
  555. package/.next/standalone/src/lib/db/queries.ts +105 -90
  556. package/.next/standalone/src/lib/db/schema.ts +18 -0
  557. package/.next/standalone/src/lib/shell-user.ts +101 -0
  558. package/.next/standalone/src/types/claude.ts +39 -0
  559. package/.next/standalone/tests/db/workspace-todos.test.ts +156 -0
  560. package/bin/spaces.js +7 -4
  561. package/bin/terminal-server.js +48 -10
  562. package/package.json +1 -1
  563. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00fdfbda._.js +0 -114
  564. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04f04898._.js +0 -106
  565. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0903a426._.js +0 -98
  566. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09e8ccc9._.js +0 -98
  567. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11c684b1._.js +0 -98
  568. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1572d4ef._.js +0 -98
  569. package/.next/standalone/.next/server/chunks/[root-of-the-server]__186cd0bb._.js +0 -3
  570. package/.next/standalone/.next/server/chunks/[root-of-the-server]__194955d4._.js +0 -98
  571. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1f054c65._.js +0 -98
  572. package/.next/standalone/.next/server/chunks/[root-of-the-server]__212760e6._.js +0 -98
  573. package/.next/standalone/.next/server/chunks/[root-of-the-server]__228595ec._.js +0 -98
  574. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2384f98e._.js +0 -98
  575. package/.next/standalone/.next/server/chunks/[root-of-the-server]__277d9445._.js +0 -98
  576. package/.next/standalone/.next/server/chunks/[root-of-the-server]__283c890f._.js +0 -3
  577. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2a2c5fc5._.js +0 -98
  578. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2d7a454e._.js +0 -98
  579. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f300a68._.js +0 -98
  580. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2f452778._.js +0 -98
  581. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35f8e77e._.js +0 -98
  582. package/.next/standalone/.next/server/chunks/[root-of-the-server]__379fc2e9._.js +0 -98
  583. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3b40d79f._.js +0 -98
  584. package/.next/standalone/.next/server/chunks/[root-of-the-server]__3d3dca2b._.js +0 -98
  585. package/.next/standalone/.next/server/chunks/[root-of-the-server]__49e42a3a._.js +0 -98
  586. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d5b78d2._.js +0 -98
  587. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4d903941._.js +0 -98
  588. package/.next/standalone/.next/server/chunks/[root-of-the-server]__54163e52._.js +0 -98
  589. package/.next/standalone/.next/server/chunks/[root-of-the-server]__563c0817._.js +0 -3
  590. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5812f90a._.js +0 -98
  591. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5e87f5._.js +0 -98
  592. package/.next/standalone/.next/server/chunks/[root-of-the-server]__60d15b16._.js +0 -98
  593. package/.next/standalone/.next/server/chunks/[root-of-the-server]__614458b7._.js +0 -98
  594. package/.next/standalone/.next/server/chunks/[root-of-the-server]__69d315e5._.js +0 -3
  595. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6fe5e6c8._.js +0 -98
  596. package/.next/standalone/.next/server/chunks/[root-of-the-server]__71f29038._.js +0 -98
  597. package/.next/standalone/.next/server/chunks/[root-of-the-server]__74084e07._.js +0 -3
  598. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7921aa80._.js +0 -98
  599. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7e077dd8._.js +0 -98
  600. package/.next/standalone/.next/server/chunks/[root-of-the-server]__857c60bb._.js +0 -98
  601. package/.next/standalone/.next/server/chunks/[root-of-the-server]__874fe565._.js +0 -98
  602. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8e2171f7._.js +0 -98
  603. package/.next/standalone/.next/server/chunks/[root-of-the-server]__91e23c96._.js +0 -98
  604. package/.next/standalone/.next/server/chunks/[root-of-the-server]__929ea03a._.js +0 -98
  605. package/.next/standalone/.next/server/chunks/[root-of-the-server]__95659b2d._.js +0 -98
  606. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9679b91e._.js +0 -98
  607. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d68157b._.js +0 -98
  608. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a90729a1._.js +0 -98
  609. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac39ecc7._.js +0 -98
  610. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ac84b704._.js +0 -98
  611. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ad4346fa._.js +0 -98
  612. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b0862d69._.js +0 -98
  613. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b43306ee._.js +0 -98
  614. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b689ff5e._.js +0 -106
  615. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba87daaa._.js +0 -98
  616. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c0461005._.js +0 -98
  617. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c1deb5f3._.js +0 -98
  618. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8a62f42._.js +0 -98
  619. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cb027619._.js +0 -98
  620. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc6e2885._.js +0 -98
  621. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cf608218._.js +0 -98
  622. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfc1290d._.js +0 -98
  623. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0109b9b._.js +0 -98
  624. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d0125483._.js +0 -3
  625. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d048ee6b._.js +0 -98
  626. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d12644e7._.js +0 -98
  627. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d95165f0._.js +0 -98
  628. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e3cc946c._.js +0 -98
  629. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e6fd27f8._.js +0 -98
  630. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eafd040b._.js +0 -98
  631. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f44c6882._.js +0 -98
  632. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f85283de._.js +0 -98
  633. package/.next/standalone/.next/server/chunks/[root-of-the-server]__feceb3e4._.js +0 -98
  634. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__843070a6._.js +0 -3
  635. package/.next/standalone/.next/server/chunks/ssr/_3ba93bdd._.js +0 -3
  636. package/.next/standalone/.next/server/chunks/ssr/_e84a0c06._.js +0 -3
  637. package/.next/standalone/.next/static/chunks/074df89a63b6a854.js +0 -1
  638. package/.next/standalone/.next/static/chunks/9d4164833c2c1fd6.js +0 -85
  639. package/.next/standalone/.next/static/chunks/bffaf378f7745d59.css +0 -3
  640. package/.next/standalone/.next/static/chunks/f091f4bf8d80fd07.js +0 -1
  641. /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_buildManifest.js +0 -0
  642. /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_clientMiddlewareManifest.json +0 -0
  643. /package/.next/standalone/.next/static/{0KefPNmR9NsrZHWWt9Xr7 → bAQs2gDlFrq3e8w9ni9tr}/_ssgManifest.js +0 -0
@@ -58,7 +58,7 @@ setInterval(() => logMemory(), 60000);
58
58
  const SPACES_DIR = path.join(os.homedir(), '.spaces');
59
59
  const CONFIG_PATH = path.join(SPACES_DIR, 'server.json');
60
60
  const SESSION_SECRET_PATH = path.join(SPACES_DIR, 'session_secret');
61
- const NEXT_INTERNAL_PORT = 3400;
61
+ let NEXT_INTERNAL_PORT = 3400;
62
62
  const projectDir = path.join(__dirname, '..');
63
63
  const MANAGED_PACKAGES = path.join(SPACES_DIR, 'packages');
64
64
  const MANAGED_NODE_MODULES = path.join(MANAGED_PACKAGES, 'node_modules');
@@ -227,8 +227,11 @@ function startServer() {
227
227
  || savedConfig.allowedOrigins
228
228
  || '';
229
229
 
230
+ // Use a unique internal port so multiple instances don't collide
231
+ NEXT_INTERNAL_PORT = PORT - 57; // 3457→3400, 3458→3401, etc.
232
+
230
233
  // ─── Kill any existing server on this port ───────────────────
231
- stopServer();
234
+ stopServer(PORT);
232
235
 
233
236
  // ─── Resolve optional packages once ─────────────────────────
234
237
  const proPath = resolveSpacesPro();
@@ -704,12 +707,12 @@ function findPidsOnPort(port) {
704
707
  return [...pids].filter(p => !isNaN(p) && p > 0);
705
708
  }
706
709
 
707
- function stopServer() {
710
+ function stopServer(overridePort) {
708
711
  let savedConfig = {};
709
712
  if (fs.existsSync(CONFIG_PATH)) {
710
713
  try { savedConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8')); } catch {}
711
714
  }
712
- const port = parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
715
+ const port = overridePort || parseInt(process.env.SPACES_PORT || '', 10) || savedConfig.port || 3457;
713
716
  const ports = [port, NEXT_INTERNAL_PORT];
714
717
  let killed = 0;
715
718
 
@@ -479,7 +479,7 @@ const AGENTS = {
479
479
  gemini: { command: 'gemini', resumeFlag: '--resume', resumeStyle: 'flag' },
480
480
  aider: { command: 'aider', resumeFlag: '', resumeStyle: '' },
481
481
  forge: { command: 'forge', resumeFlag: '--cid', resumeStyle: 'flag' },
482
- pi: { command: 'pi', resumeFlag: '--continue', resumeStyle: 'bare' },
482
+ pi: { command: 'pi', resumeFlag: '--session', resumeStyle: 'flag' },
483
483
  custom: { command: '', resumeFlag: '', resumeStyle: '' },
484
484
  };
485
485
 
@@ -1441,6 +1441,14 @@ function handleConnection(wss, ws, req) {
1441
1441
  // Check for existing session to reattach
1442
1442
  const existing = sessions.get(paneId);
1443
1443
  if (existing && existing.pty && !existing.exited) {
1444
+ // SECURITY: only the original owner may reattach. Without this, any
1445
+ // authenticated user who learns a paneId could hijack another user's PTY.
1446
+ if (existing.username !== username) {
1447
+ console.log(`[WS] REJECTED reattach pane=${paneId.slice(0,8)} — owner=${existing.username} requester=${username}`);
1448
+ ws.send(JSON.stringify({ type: 'error', data: 'Pane belongs to a different user' }));
1449
+ ws.close();
1450
+ return;
1451
+ }
1444
1452
  console.log(`[WS] Reattach pane=${paneId.slice(0,8)} buffer=${existing.buffer.length} chunks`);
1445
1453
  existing.ws = ws;
1446
1454
 
@@ -1732,15 +1740,22 @@ function handleConnection(wss, ws, req) {
1732
1740
 
1733
1741
  if (agentSession && agentSession !== 'new' && agent.resumeFlag) {
1734
1742
  // Resume an existing session
1735
- if (agentType === 'claude') {
1736
- // Claude needs to be run from the correct project CWD
1737
- const sessionCwd = findSessionCwd(agentSession, username);
1738
-
1739
- // Verify the session actually exists on disk before attempting resume.
1740
- // If the .jsonl file is gone (cleanup, etc.), fall back to `--continue`
1741
- // which resumes the most recent conversation in this project — much
1742
- // better than starting completely fresh.
1743
- const sessionExists = sessionCwd !== null || findSessionFile(agentSession, username);
1743
+ if (agentType === 'claude' || agentType === 'pi') {
1744
+ let sessionCwd = null;
1745
+ let sessionExists = false;
1746
+
1747
+ if (agentType === 'claude') {
1748
+ // Claude needs to be run from the correct project CWD
1749
+ sessionCwd = findSessionCwd(agentSession, username);
1750
+
1751
+ // Verify the session actually exists on disk before attempting resume.
1752
+ // If the .jsonl file is gone (cleanup, etc.), fall back to `--continue`
1753
+ // which resumes the most recent conversation in this project — much
1754
+ // better than starting completely fresh.
1755
+ sessionExists = sessionCwd !== null || findSessionFile(agentSession, username);
1756
+ } else if (agentType === 'pi') {
1757
+ sessionExists = findPiSessionFile(agentSession, username, safeCwd);
1758
+ }
1744
1759
 
1745
1760
  if (!sessionExists) {
1746
1761
  console.log(`[Resume] Session ${agentSession.slice(0, 8)} not found on disk for pane ${paneId.slice(0, 8)} — falling back to --continue`);
@@ -1915,6 +1930,29 @@ function findSessionFile(sessionId, username) {
1915
1930
  return false;
1916
1931
  }
1917
1932
 
1933
+ function findPiSessionFile(sessionId, username, cwd) {
1934
+ const homeDir = getUserHome(username);
1935
+ const globalSessionsDir = path.join(homeDir, '.pi', 'agent', 'sessions');
1936
+ const projectSessionsDir = path.join(cwd, '.pi', 'sessions');
1937
+
1938
+ for (const dir of [globalSessionsDir, projectSessionsDir]) {
1939
+ try {
1940
+ if (fs.existsSync(dir)) {
1941
+ for (const sub of fs.readdirSync(dir, { withFileTypes: true })) {
1942
+ if (sub.isDirectory()) {
1943
+ for (const file of fs.readdirSync(path.join(dir, sub.name))) {
1944
+ if (file.endsWith('.jsonl') && file.includes(sessionId)) return true;
1945
+ }
1946
+ } else if (sub.isFile() && sub.name.endsWith('.jsonl') && sub.name.includes(sessionId)) {
1947
+ return true;
1948
+ }
1949
+ }
1950
+ }
1951
+ } catch { /* ignore */ }
1952
+ }
1953
+ return false;
1954
+ }
1955
+
1918
1956
  function findSessionCwd(sessionId, username) {
1919
1957
  const claudeProjectsDir = path.join(getUserHome(username), '.claude', 'projects');
1920
1958
  try {
@@ -1,23 +1,118 @@
1
- [2026-04-07T14:23:08.558Z] Hook started
2
- [2026-04-07T14:23:08.569Z] Input length: 380
3
- [2026-04-07T14:23:08.569Z] Querying: http://localhost:3457/api/cortex/context/?q=it%20looks%20like%20we're%20using%20a%20ton%20of%20resources%20on%20this%20vm.%20%20what%20are%20the%20culprits%3F&limit=5&workspace_id=8 (event: UserPromptSubmit)
4
- [2026-04-07T14:23:08.614Z] Main error: 307
5
- [2026-04-07T14:23:08.614Z] Hook finished
6
- [2026-04-07T14:23:39.205Z] Hook started
7
- [2026-04-07T14:23:39.217Z] Input length: 398
8
- [2026-04-07T14:23:39.217Z] Querying: http://localhost:3457/api/cortex/context/?q=I%20installed%20the%20latest%20from%20npm%2C%20verified%20it%20says%200.9.5%20in%20settings%2C%20and%20I%20still%20can't%20copy%2Fpaste.&limit=5&workspace_id=8 (event: UserPromptSubmit)
9
- [2026-04-07T14:23:39.568Z] Success: Context found
10
- [2026-04-07T14:23:39.568Z] Hook finished
11
- [2026-04-07T14:24:06.849Z] [LEARN] Learn hook started
12
- [2026-04-07T14:24:06.856Z] [LEARN] Input length: 1826
13
- [2026-04-07T14:24:06.857Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
14
- [2026-04-07T14:24:06.888Z] [LEARN] Response: 307
15
- [2026-04-07T14:25:55.152Z] Hook started
16
- [2026-04-07T14:25:55.164Z] Input length: 342
17
- [2026-04-07T14:25:55.164Z] Querying: http://localhost:3457/api/cortex/context/?q=kill%20that%20power-flow-sim-backend%20container&limit=5&workspace_id=8 (event: UserPromptSubmit)
18
- [2026-04-07T14:25:55.206Z] Main error: 307
19
- [2026-04-07T14:25:55.206Z] Hook finished
20
- [2026-04-07T14:26:41.638Z] [LEARN] Learn hook started
21
- [2026-04-07T14:26:41.646Z] [LEARN] Input length: 416
22
- [2026-04-07T14:26:41.650Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
23
- [2026-04-07T14:26:41.691Z] [LEARN] Response: 307
1
+ [2026-04-17T18:44:07.219Z] [LEARN] Learn hook started
2
+ [2026-04-17T18:44:07.226Z] [LEARN] Input length: 857
3
+ [2026-04-17T18:44:07.236Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
4
+ [2026-04-17T18:44:07.274Z] [LEARN] Response: 307
5
+ [2026-04-17T18:45:18.172Z] Hook started
6
+ [2026-04-17T18:45:18.178Z] Input length: 423
7
+ [2026-04-17T18:45:18.179Z] Querying: http://localhost:3457/api/cortex/context/?q=tell%20me%20how%20the%20project%20wizard%20%20harness%20works%20from%20a%20high%20level.%20%20i%20need%20to%20talk%20about%20the%20functionality%20for%20another%20project%20i'm%20working%20on&limit=5&workspace_id=2 (event: UserPromptSubmit)
8
+ [2026-04-17T18:45:18.212Z] Main error: 307
9
+ [2026-04-17T18:45:18.212Z] Hook finished
10
+ [2026-04-17T18:45:37.672Z] [LEARN] Learn hook started
11
+ [2026-04-17T18:45:37.681Z] [LEARN] Input length: 3392
12
+ [2026-04-17T18:45:37.688Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
13
+ [2026-04-17T18:45:37.722Z] [LEARN] Response: 307
14
+ [2026-04-17T18:52:27.655Z] Hook started
15
+ [2026-04-17T18:52:27.661Z] Input length: 319
16
+ [2026-04-17T18:52:27.662Z] Querying: http://localhost:3457/api/cortex/context/?q=does%20it%20use%20skills%20and%20tools%20or%20no%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
17
+ [2026-04-17T18:52:27.697Z] Main error: 307
18
+ [2026-04-17T18:52:27.697Z] Hook finished
19
+ [2026-04-17T18:52:39.328Z] [LEARN] Learn hook started
20
+ [2026-04-17T18:52:39.336Z] [LEARN] Input length: 2048
21
+ [2026-04-17T18:52:39.344Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
22
+ [2026-04-17T18:52:39.385Z] [LEARN] Response: 307
23
+ [2026-04-19T13:26:25.015Z] Hook started
24
+ [2026-04-19T13:26:25.022Z] Input length: 413
25
+ [2026-04-19T13:26:25.023Z] Querying: http://localhost:3457/api/cortex/context/?q=pull%20the%20latest%20from%20github%20so%20we%20can%20do%20an%20npm%20release.%20%20can%20we%20use%20this%20access%20token%3F%20%20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&limit=5&workspace_id=2 (event: UserPromptSubmit)
26
+ [2026-04-19T13:26:25.063Z] Main error: 307
27
+ [2026-04-19T13:26:25.063Z] Hook finished
28
+ [2026-04-19T13:26:59.700Z] [LEARN] Learn hook started
29
+ [2026-04-19T13:26:59.707Z] [LEARN] Input length: 976
30
+ [2026-04-19T13:26:59.716Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
31
+ [2026-04-19T13:26:59.762Z] [LEARN] Response: 307
32
+ [2026-04-19T13:27:33.753Z] Hook started
33
+ [2026-04-19T13:27:33.759Z] Input length: 287
34
+ [2026-04-19T13:27:33.760Z] Prompt too short
35
+ [2026-04-19T13:27:51.049Z] Hook started
36
+ [2026-04-19T13:27:51.058Z] Input length: 335
37
+ [2026-04-19T13:27:51.059Z] Querying: http://localhost:3457/api/cortex/context/?q=yesyou'll%20have%20to%20bump%20again.%20%200.9.7%20is%20live%20on%20npm&limit=5&workspace_id=2 (event: UserPromptSubmit)
38
+ [2026-04-19T13:27:51.100Z] Main error: 307
39
+ [2026-04-19T13:27:51.100Z] Hook finished
40
+ [2026-04-19T13:31:43.687Z] [LEARN] Learn hook started
41
+ [2026-04-19T13:31:43.698Z] [LEARN] Input length: 508
42
+ [2026-04-19T13:31:43.707Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
43
+ [2026-04-19T13:31:43.747Z] [LEARN] Response: 307
44
+ [2026-04-19T13:35:50.269Z] Hook started
45
+ [2026-04-19T13:35:50.277Z] Input length: 307
46
+ [2026-04-19T13:35:50.278Z] Querying: http://localhost:3457/api/cortex/context/?q=try%20now%2C%20i%20disabled%202fa&limit=5&workspace_id=2 (event: UserPromptSubmit)
47
+ [2026-04-19T13:35:50.316Z] Main error: 307
48
+ [2026-04-19T13:35:50.316Z] Hook finished
49
+ [2026-04-19T13:38:15.302Z] [LEARN] Learn hook started
50
+ [2026-04-19T13:38:15.309Z] [LEARN] Input length: 943
51
+ [2026-04-19T13:38:15.318Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
52
+ [2026-04-19T13:38:15.356Z] [LEARN] Response: 307
53
+ [2026-04-19T13:39:55.427Z] Hook started
54
+ [2026-04-19T13:39:55.432Z] Input length: 324
55
+ [2026-04-19T13:39:55.433Z] Querying: http://localhost:3457/api/cortex/context/?q=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&limit=5&workspace_id=2 (event: UserPromptSubmit)
56
+ [2026-04-19T13:39:55.467Z] Main error: 307
57
+ [2026-04-19T13:39:55.467Z] Hook finished
58
+ [2026-04-19T13:42:05.596Z] [LEARN] Learn hook started
59
+ [2026-04-19T13:42:05.605Z] [LEARN] Input length: 573
60
+ [2026-04-19T13:42:05.615Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
61
+ [2026-04-19T13:42:05.657Z] [LEARN] Response: 307
62
+ [2026-04-19T13:42:36.645Z] Hook started
63
+ [2026-04-19T13:42:36.651Z] Input length: 356
64
+ [2026-04-19T13:42:36.652Z] Querying: http://localhost:3457/api/cortex/context/?q=this%20is%20my%20pc%20--%20why%20does%20it%20matter%20if%20it's%20exposed%20in%20the%20conversation%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
65
+ [2026-04-19T13:42:36.692Z] Main error: 307
66
+ [2026-04-19T13:42:36.693Z] Hook finished
67
+ [2026-04-19T13:42:48.628Z] [LEARN] Learn hook started
68
+ [2026-04-19T13:42:48.803Z] [LEARN] Input length: 1549
69
+ [2026-04-19T13:42:48.814Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
70
+ [2026-04-19T13:42:48.851Z] [LEARN] Response: 307
71
+ [2026-04-19T13:43:13.309Z] Hook started
72
+ [2026-04-19T13:43:13.315Z] Input length: 325
73
+ [2026-04-19T13:43:13.315Z] Querying: http://localhost:3457/api/cortex/context/?q=how%20do%20I%20check%20to%20see%20if%20telemetry%20is%20on%3F&limit=5&workspace_id=2 (event: UserPromptSubmit)
74
+ [2026-04-19T13:43:13.350Z] Main error: 307
75
+ [2026-04-19T13:43:13.350Z] Hook finished
76
+ [2026-04-19T13:43:53.691Z] [LEARN] Learn hook started
77
+ [2026-04-19T13:43:53.703Z] [LEARN] Input length: 1307
78
+ [2026-04-19T13:43:53.713Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
79
+ [2026-04-19T13:43:53.750Z] [LEARN] Response: 307
80
+ [2026-04-19T13:48:18.876Z] Hook started
81
+ [2026-04-19T13:48:18.882Z] Input length: 287
82
+ [2026-04-19T13:48:18.882Z] Prompt too short
83
+ [2026-04-19T13:52:11.498Z] [LEARN] Learn hook started
84
+ [2026-04-19T13:52:11.505Z] [LEARN] Input length: 354
85
+ [2026-04-19T13:52:11.514Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
86
+ [2026-04-19T13:52:11.557Z] [LEARN] Response: 307
87
+ [2026-04-19T13:52:37.908Z] Hook started
88
+ [2026-04-19T13:52:37.914Z] Input length: 314
89
+ [2026-04-19T13:52:37.916Z] Querying: http://localhost:3457/api/cortex/context/?q=add%20that%20to%20my%20claude%20settings&limit=5&workspace_id=2 (event: UserPromptSubmit)
90
+ [2026-04-19T13:52:37.948Z] Main error: 307
91
+ [2026-04-19T13:52:37.949Z] Hook finished
92
+ [2026-04-19T13:53:23.519Z] [LEARN] Learn hook started
93
+ [2026-04-19T13:53:23.529Z] [LEARN] Input length: 532
94
+ [2026-04-19T13:53:23.541Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
95
+ [2026-04-19T13:53:23.579Z] [LEARN] Response: 307
96
+ [2026-04-22T17:51:18.661Z] Hook started
97
+ [2026-04-22T17:51:18.668Z] Input length: 326
98
+ [2026-04-22T17:51:18.669Z] Querying: http://localhost:3457/api/cortex/context/?q=update%20ffrom%20github%20and%20push%20a%20new%20npm%20release&limit=5&workspace_id=2 (event: UserPromptSubmit)
99
+ [2026-04-22T17:51:18.696Z] Main error:
100
+ [2026-04-22T17:51:18.696Z] Hook finished
101
+ [2026-04-22T17:51:58.962Z] [LEARN] Learn hook started
102
+ [2026-04-22T17:51:58.968Z] [LEARN] Input length: 559
103
+ [2026-04-22T17:51:58.976Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
104
+ [2026-04-22T17:51:59.003Z] [LEARN] Request error:
105
+ [2026-04-22T18:06:02.839Z] Hook started
106
+ [2026-04-22T18:06:02.845Z] Input length: 1514
107
+ [2026-04-22T18:06:02.846Z] Querying: http://localhost:3457/api/cortex/context/?q=npm%20notice%201.4kB%20bin%2Fspaces-reset-totp.js%0Anpm%20notice%2036.8kB%20bin%2Fspaces-service.js%0Anpm%20notice%208.9kB%20bin%2Fspaces-setup.js%0Anpm%20notice%2033.6kB%20bin%2Fspaces.js%0Anpm%20notice%202.3kB%20bin%2Fssh-auth-keys.sh%0Anpm%20notice%20108.5kB%20bin%2Fterminal-server.js%0Anpm%20notice%203.4kB%20package.json%0Anpm%20notice%20Tarball%20Details%0Anpm%20notice%20name%3A%20%40jlongo78%2Fagent-spaces%0Anpm%20notice%20version%3A%200.9.9%0Anpm%20notice%20filename%3A%20jlongo78-agent-spaces-0.9.9.tgz%0Anpm%20notice%20package%20size%3A%2018.5%20MB%0Anpm%20notice%20unpacked%20size%3A%2089.8%20MB%0Anpm%20notice%20shasum%3A%2051e72b721f4acb1c8310031c78f24475639d870c%0Anpm%20notice%20integrity%3A%20sha512-L3MTwHtZpUSCN%5B...%5DY1n6%2FUIyMlpYA%3D%3D%0Anpm%20notice%20total%20files%3A%203341%0Anpm%20notice%0Anpm%20notice%20Publishing%20to%20https%3A%2F%2Fregistry.npmjs.org%2F%20with%20tag%20latest%20and%20public%20access%0Anpm%20error%20code%20E404%0Anpm%20error%20404%20Not%20Found%20-%20PUT%20https%3A%2F%2Fregistry.npmjs.org%2F%40jlongo78%252fagent-spaces%20-%20Not%20found%0Anpm%20error%20404%0Anpm%20error%20404%20%20'%40jlongo78%2Fagent-spaces%400.9.9'%20is%20not%20in%20this%20registry.%0Anpm%20error%20404%0Anpm%20error%20404%20Note%20that%20you%20can%20also%20install%20from%20a%0Anpm%20error%20404%20tarball%2C%20folder%2C%20http%20url%2C%20or%20git%20url.%0Anpm%20error%20A%20complete%20log%20of%20this%20run%20can%20be%20found%20in%3A%20C%3A%5CUsers%5Cjohns%5CAppData%5CLocal%5Cnpm-cache%5C_logs%5C2026-04-22T18_01_12_712Z-debug-0.log%0A%0AD%3A%5Cprojects%5Cspaces%3E&limit=5&workspace_id=2 (event: UserPromptSubmit)
108
+ [2026-04-22T18:06:02.872Z] Main error:
109
+ [2026-04-22T18:06:02.873Z] Hook finished
110
+ [2026-04-22T18:06:14.831Z] [LEARN] Learn hook started
111
+ [2026-04-22T18:06:14.838Z] [LEARN] Input length: 960
112
+ [2026-04-22T18:06:14.847Z] [LEARN] Sending POST to http://localhost:3457/api/cortex/knowledge/
113
+ [2026-04-22T18:06:14.877Z] [LEARN] Request error:
114
+ [2026-04-22T18:07:49.032Z] Hook started
115
+ [2026-04-22T18:07:49.039Z] Input length: 320
116
+ [2026-04-22T18:07:49.041Z] Querying: http://localhost:3457/api/cortex/context/?q=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&limit=5&workspace_id=2 (event: UserPromptSubmit)
117
+ [2026-04-22T18:07:49.071Z] Main error:
118
+ [2026-04-22T18:07:49.071Z] Hook finished
@@ -0,0 +1,105 @@
1
+ # Claude Plan-Usage Display
2
+
3
+ **Status:** stable
4
+ **Owner:** jlongo
5
+ **Last updated:** 2026-04-22
6
+
7
+ ## Overview
8
+
9
+ A compact readout of the user's Anthropic plan-usage rate limits, surfaced in the terminal page header whenever the active workspace has at least one Claude pane. Shows 5-hour, 7-day Opus, and 7-day Sonnet windows at a glance; click expands to all windows plus overage credits. Data matches what `/usage` shows inside Claude Code.
10
+
11
+ ## User-facing behavior
12
+
13
+ - Open any workspace on `/terminal` that has a Claude pane.
14
+ - A horizontal strip appears in the header (right side, before Files / Collab / Close / Add Pane).
15
+ - Three thin progress bars: **5h**, **Opus**, **Sonnet** — each with a percent label and a color that escalates green → amber → red.
16
+ - Hover a bar → tooltip `{label}: X% used · resets in 2h 14m`.
17
+ - Click the strip → popover with all five rate-limit windows + an overage-credits block if the account has overage enabled.
18
+ - If the OAuth token is missing or expired, the strip shows `sign in via Claude Code` with a small login icon. No auto-refresh.
19
+ - If the Anthropic endpoint fails or times out, the strip hides silently.
20
+
21
+ ## Architecture
22
+
23
+ UI (`src/components/claude/claude-usage-strip.tsx`) → polling hook (`src/hooks/use-claude-usage.ts`) → API route (`src/app/api/claude/usage/route.ts`) → credentials reader (`src/lib/claude/credentials.ts`) + Anthropic fetcher with 30s cache (`src/lib/claude/usage.ts`) → `https://api.anthropic.com/api/oauth/usage`.
24
+
25
+ Polling: hook calls the route on mount and every 60s while the strip is enabled. Server caches the Anthropic response 30s per access-token prefix so rapid re-polls don't hammer Anthropic.
26
+
27
+ ## Key files
28
+
29
+ | Path | Role |
30
+ |---|---|
31
+ | `src/lib/claude/credentials.ts` | Reads `~/.claude/.credentials.json`, extracts `claudeAiOauth`, exposes `isTokenExpired()`. |
32
+ | `src/lib/claude/usage.ts` | Calls Anthropic's `/api/oauth/usage`, 5s timeout, 30s in-memory cache. |
33
+ | `src/app/api/claude/usage/route.ts` | `GET` handler; returns one of `ok` / `unauthenticated` / `expired` / `upstream_error`. |
34
+ | `src/hooks/use-claude-usage.ts` | 60s polling hook, toggled by `enabled` arg. |
35
+ | `src/components/claude/claude-usage-strip.tsx` | Compact 3-bar strip + expanded popover. |
36
+ | `src/app/(desktop)/terminal/page.tsx` | Mounts the strip conditionally in the header. |
37
+ | `src/types/claude.ts` | `RateLimit`, `ExtraUsage`, `Utilization`, `UsageResponse`. |
38
+
39
+ ## Data model
40
+
41
+ No DB tables. All state is transient:
42
+ - Server-side: in-memory `Map<tokenPrefix, { fetchedAt, data }>` in `src/lib/claude/usage.ts` with 30s TTL. Process-local; resets on server restart.
43
+ - Client-side: React state in the hook.
44
+
45
+ ## APIs / contracts
46
+
47
+ ### Internal endpoints
48
+
49
+ - `GET /api/claude/usage` — returns `UsageResponse`:
50
+ - `200 { status: "ok", data: Utilization }` — happy path.
51
+ - `200 { status: "unauthenticated" }` — no credentials file or no `claudeAiOauth`.
52
+ - `200 { status: "expired" }` — access token past `expiresAt`.
53
+ - `200 { status: "upstream_error" }` — Anthropic non-2xx or timeout.
54
+
55
+ Auth: same `withUser`/`getAuthUser` wrapping as every other `/api/*` route.
56
+
57
+ ### External calls
58
+
59
+ - **Anthropic `GET https://api.anthropic.com/api/oauth/usage`** — uses the user's own OAuth access token read from `~/.claude/.credentials.json`. No secret of our own. User-Agent `claude-code/spaces-integration`.
60
+
61
+ ## Configuration & environment
62
+
63
+ - `CLAUDE_CONFIG_DIR` — respected (defaults to `~/.claude`). Same semantics as Claude Code.
64
+ - No env vars, feature flags, or tier gates specific to this feature.
65
+
66
+ ## How to run / test locally
67
+
68
+ ```bash
69
+ npm install
70
+ npm run build
71
+ npm start
72
+ # visit http://localhost:3457/terminal, enter a workspace, add a Claude pane
73
+ ```
74
+
75
+ Manual QA checklist:
76
+
77
+ 1. With a valid OAuth session (logged in via any recent Claude Code run): the strip appears in the header; percents match `/usage` inside Claude Code.
78
+ 2. Hover each bar → tooltip shows the reset timing.
79
+ 3. Click → popover with all five windows and overage block (if applicable).
80
+ 4. Delete the Claude pane from the workspace → strip disappears.
81
+ 5. Set `claudeAiOauth.expiresAt` to a past timestamp in `.credentials.json`, reload → strip shows "sign in via Claude Code".
82
+ 6. Move `.credentials.json` aside temporarily, reload → same sign-in hint.
83
+ 7. Disconnect network → within ~90s the strip silently hides (`upstream_error` → null render).
84
+
85
+ No automated tests for v1.
86
+
87
+ ## Known quirks & decisions
88
+
89
+ - **Passive refresh.** We do not refresh the OAuth access token. Claude Code owns the refresh lifecycle and writes `.credentials.json`; racing with it would corrupt the shared file.
90
+ - **Account-wide data, not per-pane.** The Anthropic endpoint returns account-level rate limits. Rendering once in the header (not per-pane) is intentional.
91
+ - **User-Agent and anthropic-beta header.** The Anthropic `/api/oauth/usage` endpoint requires the `anthropic-beta: oauth-2025-04-20` header in addition to the Bearer token — without it the call 4xx-errors out. Both the UA (`claude-code/spaces`) and the beta header are constants in `src/lib/claude/usage.ts`; if upstream ever rotates the beta header, bump it there.
92
+ - **30s cache + 60s poll.** Outer-bound staleness is ~90s; fine for windows that move in hours.
93
+ - **Token-prefix cache key.** First 16 chars of `accessToken`. Collision probability is effectively nil; avoids holding full tokens in the cache structure beyond the single request.
94
+ - **Silent upstream failure.** Errors hide the strip rather than showing a red toast — rate-limit info is nice-to-have, not mission-critical.
95
+ - **Ships direct to `main`.** Per repo convention.
96
+
97
+ ## Open questions / TODOs
98
+
99
+ - [ ] Active OAuth refresh — mirror Claude Code's `/oauth/token` dance to keep the widget live past expiry. Deferred for v1.
100
+ - [ ] Session-cost complement using local JSONL token counts (different data source).
101
+ - [ ] Consider surfacing 7-day-overall alongside the current three for users who care.
102
+
103
+ ## Changelog
104
+
105
+ - 2026-04-22 — Initial implementation. v1 ships direct to `main`.
@@ -0,0 +1,127 @@
1
+ # Workspace Todos
2
+
3
+ **Status:** stable
4
+ **Owner:** jlongo
5
+ **Last updated:** 2026-04-21
6
+
7
+ ## Overview
8
+
9
+ A lightweight todo list attached to each workspace. Renders inline at the top of `/terminal` above the pane grid, always visible. Minimal model: text + checkbox + delete. Scoped per-workspace — switching workspaces swaps the list. Not in scope: agent read/write, drag-reorder, priorities/due dates, cross-workspace views.
10
+
11
+ ## User-facing behavior
12
+
13
+ - Visit `/terminal`, enter any workspace.
14
+ - A "Todos" bar renders above the pane grid with an "Add todo…" input.
15
+ - Enter adds a todo at the bottom of the uncompleted list. Input stays focused.
16
+ - Click the checkbox → strike-through + sink to the completed section.
17
+ - Click text → inline edit. Enter saves, Esc cancels, blur saves.
18
+ - Hover row → `×` delete button.
19
+ - Eye icon in the header toggles visibility of completed todos (ephemeral, resets on reload).
20
+
21
+ ## Architecture
22
+
23
+ UI (`src/components/workspace/workspace-todos.tsx`) → API routes (`src/app/api/workspaces/[id]/todos/*`) → DB helpers (`src/lib/db/queries.ts`) → SQLite (`workspace_todos` table in the per-user DB at `~/.spaces/<user>.db`).
24
+
25
+ Mutations are optimistic client-side with rollback on failure. Workspace switch triggers a fresh refetch keyed on `workspaceId`.
26
+
27
+ ## Key files
28
+
29
+ | Path | Role |
30
+ |---|---|
31
+ | `src/components/workspace/workspace-todos.tsx` | Inline UI component — fetching, optimistic CRUD, rendering |
32
+ | `src/app/api/workspaces/[id]/todos/route.ts` | `GET` list, `POST` create |
33
+ | `src/app/api/workspaces/[id]/todos/[todoId]/route.ts` | `PATCH` update, `DELETE` remove |
34
+ | `src/lib/db/schema.ts` | `workspace_todos` table declaration inside `initSchema()` |
35
+ | `src/lib/db/queries.ts` | `getWorkspaceTodos`, `addWorkspaceTodo`, `updateWorkspaceTodo`, `deleteWorkspaceTodo` |
36
+ | `src/types/claude.ts` | `WorkspaceTodo` type |
37
+ | `src/app/(desktop)/terminal/page.tsx` | Mounts `<WorkspaceTodos>` above the pane grid |
38
+ | `tests/db/workspace-todos.test.ts` | Query-layer tests — ordering, cascade, scoping |
39
+
40
+ ## Data model
41
+
42
+ ### `workspace_todos`
43
+
44
+ | Column | Type | Notes |
45
+ |---|---|---|
46
+ | `id` | INTEGER PK | autoincrement |
47
+ | `workspace_id` | INTEGER NOT NULL | FK → `workspaces(id)` ON DELETE CASCADE |
48
+ | `text` | TEXT NOT NULL | trimmed on insert/update; empty rejected |
49
+ | `completed` | INTEGER NOT NULL DEFAULT 0 | 0 or 1 |
50
+ | `sort_order` | INTEGER NOT NULL DEFAULT 0 | meaningful only among uncompleted rows |
51
+ | `created` | TEXT NOT NULL DEFAULT datetime('now') | |
52
+ | `completed_at` | TEXT | set when completed flips 0→1, cleared on 1→0 |
53
+
54
+ Index: `idx_workspace_todos_workspace` on `workspace_id`.
55
+
56
+ ### TypeScript
57
+
58
+ ```ts
59
+ interface WorkspaceTodo {
60
+ id: number;
61
+ workspaceId: number;
62
+ text: string;
63
+ completed: boolean;
64
+ sortOrder: number;
65
+ created: string;
66
+ completedAt: string | null;
67
+ }
68
+ ```
69
+
70
+ ### Invariants
71
+
72
+ - Listing order: uncompleted first by `sort_order` ASC, then completed by `completed_at` DESC.
73
+ - New todos get `sort_order = MAX(sort_order WHERE completed=0) + 1`.
74
+ - `completed_at` is `NULL` iff `completed = 0`.
75
+ - Deleting a workspace deletes its todos via FK cascade.
76
+
77
+ ## APIs / contracts
78
+
79
+ ### Internal endpoints
80
+
81
+ | Method | Path | Request | Response |
82
+ |---|---|---|---|
83
+ | `GET` | `/api/workspaces/:id/todos` | — | `WorkspaceTodo[]` |
84
+ | `POST` | `/api/workspaces/:id/todos` | `{ text: string }` | `201 WorkspaceTodo` or `400 { error }` |
85
+ | `PATCH` | `/api/workspaces/:id/todos/:todoId` | `{ text?, completed? }` | `WorkspaceTodo` or `400`/`404` |
86
+ | `DELETE` | `/api/workspaces/:id/todos/:todoId` | — | `{ ok: true }` |
87
+
88
+ Auth via `getAuthUser` + `withUser`, same pattern as sibling workspace routes.
89
+
90
+ ### External calls
91
+ N/A.
92
+
93
+ ## Configuration & environment
94
+ None. Always-on Community-tier feature. No env vars, flags, or tier gates.
95
+
96
+ ## How to run / test locally
97
+
98
+ ```bash
99
+ npm install
100
+ npm run build
101
+ npm start
102
+ # visit http://localhost:3457/terminal, enter any workspace
103
+ ```
104
+
105
+ Automated:
106
+ ```bash
107
+ npx vitest run tests/db/workspace-todos.test.ts
108
+ ```
109
+
110
+ ## Known quirks & decisions
111
+
112
+ - **Schema lives in `initSchema()`, no migration file.** Matches the pattern in `src/lib/db/schema.ts`; the repo has no separate migration system.
113
+ - **No agent write path in v1.** The coworker's "pi /todos" plugin that inspired this lets agents add todos from inside the session — deferred because it requires an MCP tool or CLI surface.
114
+ - **Optimistic updates without toasts.** Failures `console.error` and revert local state; this is a local-only app, so silent revert is acceptable for v1.
115
+ - **`sort_order = Number.MAX_SAFE_INTEGER` for optimistic inserts.** The temp row sorts to the bottom of uncompleted; the server returns the real `sort_order` on response and replaces the temp.
116
+ - **No confirm on delete.** Minimal ethos. Add undo toast in a follow-up if this proves painful.
117
+ - **Direct-to-main workflow.** Per repo convention for this codebase; no PR flow.
118
+
119
+ ## Open questions / TODOs
120
+
121
+ - [ ] Agent write access via MCP tool once UI v1 proves out.
122
+ - [ ] Optional: persist the "show completed" toggle in localStorage.
123
+ - [ ] Optional: keyboard shortcut to focus the add-input from anywhere on `/terminal`.
124
+
125
+ ## Changelog
126
+
127
+ - 2026-04-21 — Initial implementation. v1 ships direct to `main`.