groove-dev 0.15.1 → 0.16.1

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 (334) hide show
  1. package/docs/FILE-EDITOR-PLAN.md +253 -0
  2. package/node_modules/@codemirror/autocomplete/.github/workflows/dispatch.yml +16 -0
  3. package/node_modules/@codemirror/autocomplete/CHANGELOG.md +639 -0
  4. package/node_modules/@codemirror/autocomplete/LICENSE +21 -0
  5. package/node_modules/@codemirror/autocomplete/README.md +43 -0
  6. package/node_modules/@codemirror/autocomplete/dist/index.cjs +2151 -0
  7. package/node_modules/@codemirror/autocomplete/dist/index.d.cts +648 -0
  8. package/node_modules/@codemirror/autocomplete/dist/index.d.ts +648 -0
  9. package/node_modules/@codemirror/autocomplete/dist/index.js +2120 -0
  10. package/node_modules/@codemirror/autocomplete/package.json +41 -0
  11. package/node_modules/@codemirror/commands/.github/workflows/dispatch.yml +16 -0
  12. package/node_modules/@codemirror/commands/CHANGELOG.md +386 -0
  13. package/node_modules/@codemirror/commands/LICENSE +21 -0
  14. package/node_modules/@codemirror/commands/README.md +35 -0
  15. package/node_modules/@codemirror/commands/dist/index.cjs +1909 -0
  16. package/node_modules/@codemirror/commands/dist/index.d.cts +650 -0
  17. package/node_modules/@codemirror/commands/dist/index.d.ts +650 -0
  18. package/node_modules/@codemirror/commands/dist/index.js +1795 -0
  19. package/node_modules/@codemirror/commands/package.json +42 -0
  20. package/node_modules/@codemirror/lang-css/.github/workflows/dispatch.yml +16 -0
  21. package/node_modules/@codemirror/lang-css/CHANGELOG.md +106 -0
  22. package/node_modules/@codemirror/lang-css/LICENSE +21 -0
  23. package/node_modules/@codemirror/lang-css/README.md +50 -0
  24. package/node_modules/@codemirror/lang-css/dist/index.cjs +269 -0
  25. package/node_modules/@codemirror/lang-css/dist/index.d.cts +28 -0
  26. package/node_modules/@codemirror/lang-css/dist/index.d.ts +28 -0
  27. package/node_modules/@codemirror/lang-css/dist/index.js +264 -0
  28. package/node_modules/@codemirror/lang-css/package.json +42 -0
  29. package/node_modules/@codemirror/lang-html/.github/workflows/dispatch.yml +16 -0
  30. package/node_modules/@codemirror/lang-html/CHANGELOG.md +210 -0
  31. package/node_modules/@codemirror/lang-html/LICENSE +21 -0
  32. package/node_modules/@codemirror/lang-html/README.md +147 -0
  33. package/node_modules/@codemirror/lang-html/dist/index.cjs +667 -0
  34. package/node_modules/@codemirror/lang-html/dist/index.d.cts +115 -0
  35. package/node_modules/@codemirror/lang-html/dist/index.d.ts +115 -0
  36. package/node_modules/@codemirror/lang-html/dist/index.js +661 -0
  37. package/node_modules/@codemirror/lang-html/package.json +46 -0
  38. package/node_modules/@codemirror/lang-javascript/.github/workflows/dispatch.yml +16 -0
  39. package/node_modules/@codemirror/lang-javascript/CHANGELOG.md +206 -0
  40. package/node_modules/@codemirror/lang-javascript/LICENSE +21 -0
  41. package/node_modules/@codemirror/lang-javascript/README.md +125 -0
  42. package/node_modules/@codemirror/lang-javascript/dist/index.cjs +526 -0
  43. package/node_modules/@codemirror/lang-javascript/dist/index.d.cts +93 -0
  44. package/node_modules/@codemirror/lang-javascript/dist/index.d.ts +93 -0
  45. package/node_modules/@codemirror/lang-javascript/dist/index.js +513 -0
  46. package/node_modules/@codemirror/lang-javascript/package.json +45 -0
  47. package/node_modules/@codemirror/lang-json/.github/workflows/dispatch.yml +16 -0
  48. package/node_modules/@codemirror/lang-json/CHANGELOG.md +59 -0
  49. package/node_modules/@codemirror/lang-json/LICENSE +21 -0
  50. package/node_modules/@codemirror/lang-json/README.md +56 -0
  51. package/node_modules/@codemirror/lang-json/dist/index.cjs +68 -0
  52. package/node_modules/@codemirror/lang-json/dist/index.d.cts +22 -0
  53. package/node_modules/@codemirror/lang-json/dist/index.d.ts +22 -0
  54. package/node_modules/@codemirror/lang-json/dist/index.js +64 -0
  55. package/node_modules/@codemirror/lang-json/package.json +39 -0
  56. package/node_modules/@codemirror/lang-markdown/.github/workflows/dispatch.yml +16 -0
  57. package/node_modules/@codemirror/lang-markdown/CHANGELOG.md +246 -0
  58. package/node_modules/@codemirror/lang-markdown/LICENSE +21 -0
  59. package/node_modules/@codemirror/lang-markdown/README.md +162 -0
  60. package/node_modules/@codemirror/lang-markdown/dist/index.cjs +501 -0
  61. package/node_modules/@codemirror/lang-markdown/dist/index.d.cts +124 -0
  62. package/node_modules/@codemirror/lang-markdown/dist/index.d.ts +124 -0
  63. package/node_modules/@codemirror/lang-markdown/dist/index.js +492 -0
  64. package/node_modules/@codemirror/lang-markdown/package.json +44 -0
  65. package/node_modules/@codemirror/lang-python/.github/workflows/dispatch.yml +16 -0
  66. package/node_modules/@codemirror/lang-python/CHANGELOG.md +174 -0
  67. package/node_modules/@codemirror/lang-python/LICENSE +21 -0
  68. package/node_modules/@codemirror/lang-python/README.md +61 -0
  69. package/node_modules/@codemirror/lang-python/dist/index.cjs +313 -0
  70. package/node_modules/@codemirror/lang-python/dist/index.d.cts +26 -0
  71. package/node_modules/@codemirror/lang-python/dist/index.d.ts +26 -0
  72. package/node_modules/@codemirror/lang-python/dist/index.js +308 -0
  73. package/node_modules/@codemirror/lang-python/package.json +42 -0
  74. package/node_modules/@codemirror/language/.github/workflows/dispatch.yml +16 -0
  75. package/node_modules/@codemirror/language/CHANGELOG.md +412 -0
  76. package/node_modules/@codemirror/language/LICENSE +21 -0
  77. package/node_modules/@codemirror/language/README.md +66 -0
  78. package/node_modules/@codemirror/language/dist/index.cjs +2742 -0
  79. package/node_modules/@codemirror/language/dist/index.d.cts +1220 -0
  80. package/node_modules/@codemirror/language/dist/index.d.ts +1220 -0
  81. package/node_modules/@codemirror/language/dist/index.js +2687 -0
  82. package/node_modules/@codemirror/language/package.json +44 -0
  83. package/node_modules/@codemirror/lint/.github/workflows/dispatch.yml +16 -0
  84. package/node_modules/@codemirror/lint/CHANGELOG.md +318 -0
  85. package/node_modules/@codemirror/lint/LICENSE +21 -0
  86. package/node_modules/@codemirror/lint/README.md +18 -0
  87. package/node_modules/@codemirror/lint/dist/index.cjs +958 -0
  88. package/node_modules/@codemirror/lint/dist/index.d.cts +195 -0
  89. package/node_modules/@codemirror/lint/dist/index.d.ts +195 -0
  90. package/node_modules/@codemirror/lint/dist/index.js +945 -0
  91. package/node_modules/@codemirror/lint/package.json +40 -0
  92. package/node_modules/@codemirror/search/.github/workflows/dispatch.yml +16 -0
  93. package/node_modules/@codemirror/search/CHANGELOG.md +324 -0
  94. package/node_modules/@codemirror/search/LICENSE +21 -0
  95. package/node_modules/@codemirror/search/README.md +18 -0
  96. package/node_modules/@codemirror/search/dist/index.cjs +1237 -0
  97. package/node_modules/@codemirror/search/dist/index.d.cts +385 -0
  98. package/node_modules/@codemirror/search/dist/index.d.ts +385 -0
  99. package/node_modules/@codemirror/search/dist/index.js +1217 -0
  100. package/node_modules/@codemirror/search/package.json +40 -0
  101. package/node_modules/@codemirror/state/.github/workflows/dispatch.yml +16 -0
  102. package/node_modules/@codemirror/state/CHANGELOG.md +308 -0
  103. package/node_modules/@codemirror/state/LICENSE +21 -0
  104. package/node_modules/@codemirror/state/README.md +18 -0
  105. package/node_modules/@codemirror/state/dist/index.cjs +3922 -0
  106. package/node_modules/@codemirror/state/dist/index.d.cts +1713 -0
  107. package/node_modules/@codemirror/state/dist/index.d.ts +1713 -0
  108. package/node_modules/@codemirror/state/dist/index.js +3892 -0
  109. package/node_modules/@codemirror/state/package.json +38 -0
  110. package/node_modules/@codemirror/theme-one-dark/.github/workflows/dispatch.yml +16 -0
  111. package/node_modules/@codemirror/theme-one-dark/CHANGELOG.md +97 -0
  112. package/node_modules/@codemirror/theme-one-dark/LICENSE +21 -0
  113. package/node_modules/@codemirror/theme-one-dark/README.md +46 -0
  114. package/node_modules/@codemirror/theme-one-dark/dist/index.cjs +139 -0
  115. package/node_modules/@codemirror/theme-one-dark/dist/index.d.cts +39 -0
  116. package/node_modules/@codemirror/theme-one-dark/dist/index.d.ts +39 -0
  117. package/node_modules/@codemirror/theme-one-dark/dist/index.js +134 -0
  118. package/node_modules/@codemirror/theme-one-dark/package.json +41 -0
  119. package/node_modules/@codemirror/view/.github/workflows/dispatch.yml +16 -0
  120. package/node_modules/@codemirror/view/CHANGELOG.md +2284 -0
  121. package/node_modules/@codemirror/view/LICENSE +21 -0
  122. package/node_modules/@codemirror/view/README.md +37 -0
  123. package/node_modules/@codemirror/view/dist/index.cjs +11796 -0
  124. package/node_modules/@codemirror/view/dist/index.d.cts +2389 -0
  125. package/node_modules/@codemirror/view/dist/index.d.ts +2389 -0
  126. package/node_modules/@codemirror/view/dist/index.js +11745 -0
  127. package/node_modules/@codemirror/view/package.json +41 -0
  128. package/node_modules/@groove-dev/daemon/src/api.js +268 -2
  129. package/node_modules/@groove-dev/daemon/src/filewatcher.js +59 -0
  130. package/node_modules/@groove-dev/daemon/src/index.js +28 -1
  131. package/node_modules/@groove-dev/daemon/src/mimetypes.js +43 -0
  132. package/node_modules/@groove-dev/gui/dist/assets/index-BQSznoq0.js +103 -0
  133. package/node_modules/@groove-dev/gui/dist/index.html +1 -1
  134. package/node_modules/@groove-dev/gui/package.json +15 -2
  135. package/node_modules/@groove-dev/gui/src/App.jsx +3 -0
  136. package/node_modules/@groove-dev/gui/src/components/CodeEditor.jsx +143 -0
  137. package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +83 -0
  138. package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +492 -0
  139. package/node_modules/@groove-dev/gui/src/components/MediaViewer.jsx +104 -0
  140. package/node_modules/@groove-dev/gui/src/stores/groove.js +287 -1
  141. package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +149 -0
  142. package/node_modules/@lezer/common/LICENSE +21 -0
  143. package/node_modules/@lezer/common/README.md +14 -0
  144. package/node_modules/@lezer/common/dist/index.cjs +2209 -0
  145. package/node_modules/@lezer/common/dist/index.d.cts +1174 -0
  146. package/node_modules/@lezer/common/dist/index.d.ts +1174 -0
  147. package/node_modules/@lezer/common/dist/index.js +2196 -0
  148. package/node_modules/@lezer/common/package.json +32 -0
  149. package/node_modules/@lezer/css/CHANGELOG.md +307 -0
  150. package/node_modules/@lezer/css/LICENSE +21 -0
  151. package/node_modules/@lezer/css/README.md +6 -0
  152. package/node_modules/@lezer/css/dist/index.cjs +151 -0
  153. package/node_modules/@lezer/css/dist/index.d.cts +3 -0
  154. package/node_modules/@lezer/css/dist/index.d.ts +3 -0
  155. package/node_modules/@lezer/css/dist/index.js +147 -0
  156. package/node_modules/@lezer/css/package.json +36 -0
  157. package/node_modules/@lezer/css/rollup.config.js +16 -0
  158. package/node_modules/@lezer/css/src/css.grammar +290 -0
  159. package/node_modules/@lezer/css/src/highlight.js +36 -0
  160. package/node_modules/@lezer/css/src/parser.js +31 -0
  161. package/node_modules/@lezer/css/src/parser.terms.js +63 -0
  162. package/node_modules/@lezer/css/src/tokens.js +75 -0
  163. package/node_modules/@lezer/css/test/declarations.txt +241 -0
  164. package/node_modules/@lezer/css/test/selector.txt +178 -0
  165. package/node_modules/@lezer/css/test/statements.txt +227 -0
  166. package/node_modules/@lezer/css/test/test-css.js +16 -0
  167. package/node_modules/@lezer/highlight/LICENSE +21 -0
  168. package/node_modules/@lezer/highlight/README.md +14 -0
  169. package/node_modules/@lezer/highlight/dist/index.cjs +936 -0
  170. package/node_modules/@lezer/highlight/dist/index.d.cts +623 -0
  171. package/node_modules/@lezer/highlight/dist/index.d.ts +623 -0
  172. package/node_modules/@lezer/highlight/dist/index.js +927 -0
  173. package/node_modules/@lezer/highlight/package.json +31 -0
  174. package/node_modules/@lezer/html/CHANGELOG.md +303 -0
  175. package/node_modules/@lezer/html/LICENSE +21 -0
  176. package/node_modules/@lezer/html/README.md +37 -0
  177. package/node_modules/@lezer/html/dist/index.cjs +354 -0
  178. package/node_modules/@lezer/html/dist/index.d.cts +14 -0
  179. package/node_modules/@lezer/html/dist/index.d.ts +14 -0
  180. package/node_modules/@lezer/html/dist/index.js +349 -0
  181. package/node_modules/@lezer/html/package.json +37 -0
  182. package/node_modules/@lezer/html/rollup.config.js +16 -0
  183. package/node_modules/@lezer/html/src/.tern-port +1 -0
  184. package/node_modules/@lezer/html/src/content.js +87 -0
  185. package/node_modules/@lezer/html/src/highlight.js +15 -0
  186. package/node_modules/@lezer/html/src/html.grammar +181 -0
  187. package/node_modules/@lezer/html/src/index.js +2 -0
  188. package/node_modules/@lezer/html/src/parser.js +27 -0
  189. package/node_modules/@lezer/html/src/parser.terms.js +53 -0
  190. package/node_modules/@lezer/html/src/tokens.js +199 -0
  191. package/node_modules/@lezer/html/test/mixed.txt +69 -0
  192. package/node_modules/@lezer/html/test/tags.txt +370 -0
  193. package/node_modules/@lezer/html/test/test-html.js +29 -0
  194. package/node_modules/@lezer/html/test/test-incremental.js +97 -0
  195. package/node_modules/@lezer/html/test/vue.txt +56 -0
  196. package/node_modules/@lezer/javascript/CHANGELOG.md +485 -0
  197. package/node_modules/@lezer/javascript/LICENSE +21 -0
  198. package/node_modules/@lezer/javascript/README.md +14 -0
  199. package/node_modules/@lezer/javascript/dist/index.cjs +196 -0
  200. package/node_modules/@lezer/javascript/dist/index.d.cts +3 -0
  201. package/node_modules/@lezer/javascript/dist/index.d.ts +3 -0
  202. package/node_modules/@lezer/javascript/dist/index.js +192 -0
  203. package/node_modules/@lezer/javascript/package.json +36 -0
  204. package/node_modules/@lezer/javascript/rollup.config.js +16 -0
  205. package/node_modules/@lezer/javascript/src/highlight.js +62 -0
  206. package/node_modules/@lezer/javascript/src/javascript.grammar +735 -0
  207. package/node_modules/@lezer/javascript/src/parser.js +33 -0
  208. package/node_modules/@lezer/javascript/src/parser.terms.js +177 -0
  209. package/node_modules/@lezer/javascript/src/tokens.js +87 -0
  210. package/node_modules/@lezer/javascript/test/decorator.txt +64 -0
  211. package/node_modules/@lezer/javascript/test/expression.txt +686 -0
  212. package/node_modules/@lezer/javascript/test/jsx.txt +79 -0
  213. package/node_modules/@lezer/javascript/test/semicolon.txt +77 -0
  214. package/node_modules/@lezer/javascript/test/statement.txt +404 -0
  215. package/node_modules/@lezer/javascript/test/test-javascript.js +17 -0
  216. package/node_modules/@lezer/javascript/test/typescript.txt +401 -0
  217. package/node_modules/@lezer/json/CHANGELOG.md +79 -0
  218. package/node_modules/@lezer/json/LICENSE +21 -0
  219. package/node_modules/@lezer/json/README.md +7 -0
  220. package/node_modules/@lezer/json/dist/index.cjs +41 -0
  221. package/node_modules/@lezer/json/dist/index.d.cts +3 -0
  222. package/node_modules/@lezer/json/dist/index.d.ts +3 -0
  223. package/node_modules/@lezer/json/dist/index.js +37 -0
  224. package/node_modules/@lezer/json/package.json +36 -0
  225. package/node_modules/@lezer/json/rollup.config.js +15 -0
  226. package/node_modules/@lezer/json/src/highlight.js +12 -0
  227. package/node_modules/@lezer/json/src/json.grammar +38 -0
  228. package/node_modules/@lezer/json/src/parser.js +23 -0
  229. package/node_modules/@lezer/json/src/parser.terms.js +12 -0
  230. package/node_modules/@lezer/json/test/arrays.txt +34 -0
  231. package/node_modules/@lezer/json/test/literals.txt +23 -0
  232. package/node_modules/@lezer/json/test/numbers.txt +87 -0
  233. package/node_modules/@lezer/json/test/objects.txt +34 -0
  234. package/node_modules/@lezer/json/test/strings.txt +50 -0
  235. package/node_modules/@lezer/json/test/test-json.js +17 -0
  236. package/node_modules/@lezer/lr/LICENSE +21 -0
  237. package/node_modules/@lezer/lr/README.md +25 -0
  238. package/node_modules/@lezer/lr/dist/constants.d.ts +45 -0
  239. package/node_modules/@lezer/lr/dist/constants.js +5 -0
  240. package/node_modules/@lezer/lr/dist/index.cjs +1891 -0
  241. package/node_modules/@lezer/lr/dist/index.d.cts +303 -0
  242. package/node_modules/@lezer/lr/dist/index.d.ts +303 -0
  243. package/node_modules/@lezer/lr/dist/index.js +1884 -0
  244. package/node_modules/@lezer/lr/package.json +32 -0
  245. package/node_modules/@lezer/markdown/CHANGELOG.md +279 -0
  246. package/node_modules/@lezer/markdown/LICENSE +21 -0
  247. package/node_modules/@lezer/markdown/README.md +725 -0
  248. package/node_modules/@lezer/markdown/bin/build-readme.cjs +39 -0
  249. package/node_modules/@lezer/markdown/build.js +16 -0
  250. package/node_modules/@lezer/markdown/dist/index.cjs +2352 -0
  251. package/node_modules/@lezer/markdown/dist/index.d.cts +600 -0
  252. package/node_modules/@lezer/markdown/dist/index.d.ts +600 -0
  253. package/node_modules/@lezer/markdown/dist/index.js +2335 -0
  254. package/node_modules/@lezer/markdown/package.json +37 -0
  255. package/node_modules/@lezer/markdown/src/README.md +83 -0
  256. package/node_modules/@lezer/markdown/src/extension.ts +301 -0
  257. package/node_modules/@lezer/markdown/src/index.ts +5 -0
  258. package/node_modules/@lezer/markdown/src/markdown.ts +1961 -0
  259. package/node_modules/@lezer/markdown/src/nest.ts +46 -0
  260. package/node_modules/@lezer/markdown/test/compare-tree.ts +14 -0
  261. package/node_modules/@lezer/markdown/test/spec.ts +79 -0
  262. package/node_modules/@lezer/markdown/test/test-extension.ts +269 -0
  263. package/node_modules/@lezer/markdown/test/test-incremental.ts +265 -0
  264. package/node_modules/@lezer/markdown/test/test-markdown.ts +3574 -0
  265. package/node_modules/@lezer/markdown/test/test-nesting.ts +86 -0
  266. package/node_modules/@lezer/markdown/test/tsconfig.json +12 -0
  267. package/node_modules/@lezer/markdown/tsconfig.json +14 -0
  268. package/node_modules/@lezer/python/CHANGELOG.md +243 -0
  269. package/node_modules/@lezer/python/LICENSE +21 -0
  270. package/node_modules/@lezer/python/README.md +6 -0
  271. package/node_modules/@lezer/python/dist/index.cjs +330 -0
  272. package/node_modules/@lezer/python/dist/index.d.cts +3 -0
  273. package/node_modules/@lezer/python/dist/index.d.ts +3 -0
  274. package/node_modules/@lezer/python/dist/index.js +326 -0
  275. package/node_modules/@lezer/python/package.json +36 -0
  276. package/node_modules/@lezer/python/rollup.config.js +16 -0
  277. package/node_modules/@lezer/python/src/highlight.js +35 -0
  278. package/node_modules/@lezer/python/src/python.grammar +381 -0
  279. package/node_modules/@lezer/python/src/tokens.js +224 -0
  280. package/node_modules/@lezer/python/test/expression.txt +231 -0
  281. package/node_modules/@lezer/python/test/statement.txt +442 -0
  282. package/node_modules/@lezer/python/test/test-incremental.js +33 -0
  283. package/node_modules/@lezer/python/test/test-python.js +17 -0
  284. package/node_modules/@marijn/find-cluster-break/LICENSE +21 -0
  285. package/node_modules/@marijn/find-cluster-break/README.md +28 -0
  286. package/node_modules/@marijn/find-cluster-break/dist/index.cjs +85 -0
  287. package/node_modules/@marijn/find-cluster-break/dist/index.d.cts +15 -0
  288. package/node_modules/@marijn/find-cluster-break/package.json +35 -0
  289. package/node_modules/@marijn/find-cluster-break/rollup.config.js +7 -0
  290. package/node_modules/@marijn/find-cluster-break/src/index.d.ts +15 -0
  291. package/node_modules/@marijn/find-cluster-break/src/index.js +87 -0
  292. package/node_modules/@marijn/find-cluster-break/test/test-cluster.js +30 -0
  293. package/node_modules/crelt/LICENSE +19 -0
  294. package/node_modules/crelt/README.md +23 -0
  295. package/node_modules/crelt/dist/index.cjs +31 -0
  296. package/node_modules/crelt/dist/index.d.cts +4 -0
  297. package/node_modules/crelt/index.d.ts +4 -0
  298. package/node_modules/crelt/index.js +28 -0
  299. package/node_modules/crelt/package.json +35 -0
  300. package/node_modules/crelt/rollup.config.js +13 -0
  301. package/node_modules/style-mod/LICENSE +19 -0
  302. package/node_modules/style-mod/README.md +98 -0
  303. package/node_modules/style-mod/dist/style-mod.cjs +165 -0
  304. package/node_modules/style-mod/dist/style-mod.d.cts +16 -0
  305. package/node_modules/style-mod/package.json +39 -0
  306. package/node_modules/style-mod/src/README.md +34 -0
  307. package/node_modules/style-mod/src/style-mod.d.ts +16 -0
  308. package/node_modules/style-mod/src/style-mod.js +172 -0
  309. package/node_modules/style-mod/test/test-style-mod.js +104 -0
  310. package/node_modules/w3c-keyname/.tern-port +1 -0
  311. package/node_modules/w3c-keyname/LICENSE +19 -0
  312. package/node_modules/w3c-keyname/README.md +18 -0
  313. package/node_modules/w3c-keyname/index.cjs +127 -0
  314. package/node_modules/w3c-keyname/index.d.cts +5 -0
  315. package/node_modules/w3c-keyname/index.d.ts +5 -0
  316. package/node_modules/w3c-keyname/index.js +119 -0
  317. package/node_modules/w3c-keyname/package.json +37 -0
  318. package/package.json +1 -1
  319. package/packages/daemon/src/api.js +268 -2
  320. package/packages/daemon/src/filewatcher.js +59 -0
  321. package/packages/daemon/src/index.js +28 -1
  322. package/packages/daemon/src/mimetypes.js +43 -0
  323. package/packages/gui/dist/assets/index-BQSznoq0.js +103 -0
  324. package/packages/gui/dist/index.html +1 -1
  325. package/packages/gui/package.json +15 -2
  326. package/packages/gui/src/App.jsx +3 -0
  327. package/packages/gui/src/components/CodeEditor.jsx +143 -0
  328. package/packages/gui/src/components/EditorTabs.jsx +83 -0
  329. package/packages/gui/src/components/FileTree.jsx +492 -0
  330. package/packages/gui/src/components/MediaViewer.jsx +104 -0
  331. package/packages/gui/src/stores/groove.js +287 -1
  332. package/packages/gui/src/views/FileEditor.jsx +149 -0
  333. package/node_modules/@groove-dev/gui/dist/assets/index-8Kqi_LVo.js +0 -74
  334. package/packages/gui/dist/assets/index-8Kqi_LVo.js +0 -74
@@ -15,7 +15,7 @@ export const useGrooveStore = create((set, get) => ({
15
15
  tunneled: false, // true when accessed via SSH tunnel (port mismatch)
16
16
 
17
17
  // UI state — unified panel model
18
- activeTab: 'agents', // 'agents' | 'stats' | 'teams' | 'approvals'
18
+ activeTab: 'agents', // 'agents' | 'stats' | 'teams' | 'approvals' | 'editor'
19
19
  detailPanel: null, // null | { type: 'agent', agentId } | { type: 'spawn' } | { type: 'journalist' }
20
20
  activityLog: {},
21
21
  statusMessage: null, // inline status text (replaces toast notifications)
@@ -24,6 +24,14 @@ export const useGrooveStore = create((set, get) => ({
24
24
  tokenTimeline: {}, // { [agentId]: [{ t: timestamp, v: tokensUsed }] }
25
25
  dashTelemetry: {}, // { [agentId]: [{ t, v, name }] } — persists across tab switches
26
26
 
27
+ // Editor state
28
+ editorFiles: {}, // { [path]: { content, originalContent, language, loadedAt } }
29
+ editorActiveFile: null, // currently visible file path
30
+ editorOpenTabs: [], // ordered array of open file paths
31
+ editorTreeCache: {}, // { [dirPath]: entries[] }
32
+ editorChangedFiles: {}, // { [path]: timestamp } — externally modified files
33
+ editorRecentSaves: {}, // { [path]: timestamp } — suppress self-triggered change events
34
+
27
35
  // Connection
28
36
  connect() {
29
37
  if (get().ws) return;
@@ -124,6 +132,15 @@ export const useGrooveStore = create((set, get) => ({
124
132
  get().showStatus(`rotation failed: ${msg.error}`);
125
133
  break;
126
134
 
135
+ case 'file:changed': {
136
+ const savedAt = get().editorRecentSaves[msg.path];
137
+ if (savedAt && Date.now() - savedAt < 2000) break; // ignore self-triggered
138
+ set((s) => ({
139
+ editorChangedFiles: { ...s.editorChangedFiles, [msg.path]: msg.timestamp },
140
+ }));
141
+ break;
142
+ }
143
+
127
144
  case 'journalist:cycle':
128
145
  break; // Journalist feed polls separately
129
146
  }
@@ -256,6 +273,275 @@ export const useGrooveStore = create((set, get) => ({
256
273
  return data;
257
274
  },
258
275
 
276
+ // Editor actions
277
+ async openFile(path) {
278
+ // Already loaded — just switch tab
279
+ if (get().editorFiles[path] || get().editorOpenTabs.includes(path)) {
280
+ set((s) => ({
281
+ editorActiveFile: path,
282
+ editorOpenTabs: s.editorOpenTabs.includes(path) ? s.editorOpenTabs : [...s.editorOpenTabs, path],
283
+ }));
284
+ return;
285
+ }
286
+
287
+ // Media files — open as tab directly (served via /api/files/raw)
288
+ const ext = path.split('.').pop()?.toLowerCase();
289
+ const MEDIA_EXTS = ['png','jpg','jpeg','gif','svg','webp','ico','bmp','avif','mp4','webm','mov','avi','mkv','ogv'];
290
+ if (MEDIA_EXTS.includes(ext)) {
291
+ set((s) => ({
292
+ editorActiveFile: path,
293
+ editorOpenTabs: [...s.editorOpenTabs, path],
294
+ }));
295
+ return;
296
+ }
297
+
298
+ try {
299
+ const res = await fetch(`${API_BASE}/api/files/read?path=${encodeURIComponent(path)}`);
300
+ if (!res.ok) {
301
+ const err = await res.json().catch(() => ({}));
302
+ get().showStatus(err.error || 'Failed to read file');
303
+ return;
304
+ }
305
+ const data = await res.json();
306
+ if (data.binary) {
307
+ get().showStatus('Binary file — cannot open');
308
+ return;
309
+ }
310
+ set((s) => ({
311
+ editorFiles: {
312
+ ...s.editorFiles,
313
+ [path]: { content: data.content, originalContent: data.content, language: data.language, loadedAt: Date.now() },
314
+ },
315
+ editorActiveFile: path,
316
+ editorOpenTabs: s.editorOpenTabs.includes(path) ? s.editorOpenTabs : [...s.editorOpenTabs, path],
317
+ }));
318
+ // Tell daemon to watch this file
319
+ const ws = get().ws;
320
+ if (ws?.readyState === 1) {
321
+ ws.send(JSON.stringify({ type: 'editor:watch', path }));
322
+ }
323
+ } catch {
324
+ get().showStatus('Failed to open file');
325
+ }
326
+ },
327
+
328
+ closeFile(path) {
329
+ set((s) => {
330
+ const tabs = s.editorOpenTabs.filter((t) => t !== path);
331
+ const files = { ...s.editorFiles };
332
+ delete files[path];
333
+ const changed = { ...s.editorChangedFiles };
334
+ delete changed[path];
335
+ let active = s.editorActiveFile;
336
+ if (active === path) {
337
+ const idx = s.editorOpenTabs.indexOf(path);
338
+ active = tabs[Math.min(idx, tabs.length - 1)] || null;
339
+ }
340
+ return { editorOpenTabs: tabs, editorFiles: files, editorChangedFiles: changed, editorActiveFile: active };
341
+ });
342
+ // Stop watching
343
+ const ws = get().ws;
344
+ if (ws?.readyState === 1) {
345
+ ws.send(JSON.stringify({ type: 'editor:unwatch', path }));
346
+ }
347
+ },
348
+
349
+ setActiveFile(path) {
350
+ set({ editorActiveFile: path });
351
+ },
352
+
353
+ updateFileContent(path, content) {
354
+ set((s) => ({
355
+ editorFiles: {
356
+ ...s.editorFiles,
357
+ [path]: { ...s.editorFiles[path], content },
358
+ },
359
+ }));
360
+ },
361
+
362
+ async saveFile(path) {
363
+ const file = get().editorFiles[path];
364
+ if (!file) return;
365
+ try {
366
+ const res = await fetch(`${API_BASE}/api/files/write`, {
367
+ method: 'POST',
368
+ headers: { 'Content-Type': 'application/json' },
369
+ body: JSON.stringify({ path, content: file.content }),
370
+ });
371
+ if (!res.ok) {
372
+ const err = await res.json().catch(() => ({}));
373
+ get().showStatus(err.error || 'Save failed');
374
+ return;
375
+ }
376
+ set((s) => ({
377
+ editorFiles: {
378
+ ...s.editorFiles,
379
+ [path]: { ...s.editorFiles[path], originalContent: file.content },
380
+ },
381
+ editorChangedFiles: (() => {
382
+ const c = { ...s.editorChangedFiles };
383
+ delete c[path];
384
+ return c;
385
+ })(),
386
+ editorRecentSaves: { ...s.editorRecentSaves, [path]: Date.now() },
387
+ }));
388
+ get().showStatus('Saved');
389
+ } catch {
390
+ get().showStatus('Save failed');
391
+ }
392
+ },
393
+
394
+ async reloadFile(path) {
395
+ try {
396
+ const res = await fetch(`${API_BASE}/api/files/read?path=${encodeURIComponent(path)}`);
397
+ if (!res.ok) return;
398
+ const data = await res.json();
399
+ if (data.binary) return;
400
+ set((s) => ({
401
+ editorFiles: {
402
+ ...s.editorFiles,
403
+ [path]: { content: data.content, originalContent: data.content, language: data.language, loadedAt: Date.now() },
404
+ },
405
+ editorChangedFiles: (() => {
406
+ const c = { ...s.editorChangedFiles };
407
+ delete c[path];
408
+ return c;
409
+ })(),
410
+ }));
411
+ } catch { /* ignore */ }
412
+ },
413
+
414
+ dismissFileChange(path) {
415
+ set((s) => {
416
+ const c = { ...s.editorChangedFiles };
417
+ delete c[path];
418
+ return { editorChangedFiles: c };
419
+ });
420
+ },
421
+
422
+ async fetchTreeDir(dirPath) {
423
+ try {
424
+ const res = await fetch(`${API_BASE}/api/files/tree?path=${encodeURIComponent(dirPath)}`);
425
+ if (!res.ok) return;
426
+ const data = await res.json();
427
+ set((s) => ({
428
+ editorTreeCache: { ...s.editorTreeCache, [dirPath]: data.entries },
429
+ }));
430
+ } catch { /* ignore */ }
431
+ },
432
+
433
+ async createFile(relPath) {
434
+ try {
435
+ const res = await fetch(`${API_BASE}/api/files/create`, {
436
+ method: 'POST',
437
+ headers: { 'Content-Type': 'application/json' },
438
+ body: JSON.stringify({ path: relPath }),
439
+ });
440
+ if (!res.ok) {
441
+ const err = await res.json().catch(() => ({}));
442
+ get().showStatus(err.error || 'Create failed');
443
+ return false;
444
+ }
445
+ // Refresh parent directory in tree
446
+ const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
447
+ await get().fetchTreeDir(parentDir);
448
+ get().showStatus('File created');
449
+ return true;
450
+ } catch {
451
+ get().showStatus('Create failed');
452
+ return false;
453
+ }
454
+ },
455
+
456
+ async createDir(relPath) {
457
+ try {
458
+ const res = await fetch(`${API_BASE}/api/files/mkdir`, {
459
+ method: 'POST',
460
+ headers: { 'Content-Type': 'application/json' },
461
+ body: JSON.stringify({ path: relPath }),
462
+ });
463
+ if (!res.ok) {
464
+ const err = await res.json().catch(() => ({}));
465
+ get().showStatus(err.error || 'Create failed');
466
+ return false;
467
+ }
468
+ const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
469
+ await get().fetchTreeDir(parentDir);
470
+ get().showStatus('Folder created');
471
+ return true;
472
+ } catch {
473
+ get().showStatus('Create failed');
474
+ return false;
475
+ }
476
+ },
477
+
478
+ async deleteFile(relPath) {
479
+ try {
480
+ const res = await fetch(`${API_BASE}/api/files/delete?path=${encodeURIComponent(relPath)}`, {
481
+ method: 'DELETE',
482
+ });
483
+ if (!res.ok) {
484
+ const err = await res.json().catch(() => ({}));
485
+ get().showStatus(err.error || 'Delete failed');
486
+ return false;
487
+ }
488
+ // Close tab if open
489
+ if (get().editorOpenTabs.includes(relPath)) {
490
+ get().closeFile(relPath);
491
+ }
492
+ // Refresh parent
493
+ const parentDir = relPath.includes('/') ? relPath.split('/').slice(0, -1).join('/') : '';
494
+ await get().fetchTreeDir(parentDir);
495
+ // Also clear cached children if it was a dir
496
+ set((s) => {
497
+ const cache = { ...s.editorTreeCache };
498
+ delete cache[relPath];
499
+ return { editorTreeCache: cache };
500
+ });
501
+ get().showStatus('Deleted');
502
+ return true;
503
+ } catch {
504
+ get().showStatus('Delete failed');
505
+ return false;
506
+ }
507
+ },
508
+
509
+ async renameFile(oldPath, newPath) {
510
+ try {
511
+ const res = await fetch(`${API_BASE}/api/files/rename`, {
512
+ method: 'POST',
513
+ headers: { 'Content-Type': 'application/json' },
514
+ body: JSON.stringify({ oldPath, newPath }),
515
+ });
516
+ if (!res.ok) {
517
+ const err = await res.json().catch(() => ({}));
518
+ get().showStatus(err.error || 'Rename failed');
519
+ return false;
520
+ }
521
+ // Update open tabs if renamed file was open
522
+ set((s) => {
523
+ const tabs = s.editorOpenTabs.map((t) => t === oldPath ? newPath : t);
524
+ const files = { ...s.editorFiles };
525
+ if (files[oldPath]) {
526
+ files[newPath] = files[oldPath];
527
+ delete files[oldPath];
528
+ }
529
+ const active = s.editorActiveFile === oldPath ? newPath : s.editorActiveFile;
530
+ return { editorOpenTabs: tabs, editorFiles: files, editorActiveFile: active };
531
+ });
532
+ // Refresh both parent dirs
533
+ const oldParent = oldPath.includes('/') ? oldPath.split('/').slice(0, -1).join('/') : '';
534
+ const newParent = newPath.includes('/') ? newPath.split('/').slice(0, -1).join('/') : '';
535
+ await get().fetchTreeDir(oldParent);
536
+ if (newParent !== oldParent) await get().fetchTreeDir(newParent);
537
+ get().showStatus('Renamed');
538
+ return true;
539
+ } catch {
540
+ get().showStatus('Rename failed');
541
+ return false;
542
+ }
543
+ },
544
+
259
545
  addCommand(text) {
260
546
  set((s) => ({
261
547
  commandHistory: [...s.commandHistory.slice(-49), text],
@@ -0,0 +1,149 @@
1
+ // GROOVE GUI — File Editor View
2
+ // FSL-1.1-Apache-2.0 — see LICENSE
3
+
4
+ import React, { useCallback } from 'react';
5
+ import { useGrooveStore } from '../stores/groove';
6
+ import FileTree from '../components/FileTree';
7
+ import EditorTabs from '../components/EditorTabs';
8
+ import CodeEditor from '../components/CodeEditor';
9
+ import MediaViewer, { isMediaFile } from '../components/MediaViewer';
10
+
11
+ export default function FileEditor() {
12
+ const activeFile = useGrooveStore((s) => s.editorActiveFile);
13
+ const files = useGrooveStore((s) => s.editorFiles);
14
+ const changedFiles = useGrooveStore((s) => s.editorChangedFiles);
15
+ const openTabs = useGrooveStore((s) => s.editorOpenTabs);
16
+ const updateFileContent = useGrooveStore((s) => s.updateFileContent);
17
+ const saveFile = useGrooveStore((s) => s.saveFile);
18
+ const reloadFile = useGrooveStore((s) => s.reloadFile);
19
+ const dismissFileChange = useGrooveStore((s) => s.dismissFileChange);
20
+
21
+ const file = activeFile ? files[activeFile] : null;
22
+ const isChanged = activeFile && changedFiles[activeFile];
23
+ const isMedia = activeFile && isMediaFile(activeFile);
24
+ // Media files go straight to viewer — they won't be in editorFiles
25
+ const isMediaTab = activeFile && openTabs.includes(activeFile) && isMedia;
26
+
27
+ const onContentChange = useCallback((content) => {
28
+ if (activeFile) updateFileContent(activeFile, content);
29
+ }, [activeFile, updateFileContent]);
30
+
31
+ const onSave = useCallback(() => {
32
+ if (activeFile) saveFile(activeFile);
33
+ }, [activeFile, saveFile]);
34
+
35
+ return (
36
+ <div style={styles.container}>
37
+ {/* Tab bar */}
38
+ <EditorTabs />
39
+
40
+ {/* Main content row */}
41
+ <div style={styles.contentRow}>
42
+ {/* File tree sidebar */}
43
+ <div style={styles.sidebar}>
44
+ <FileTree />
45
+ </div>
46
+
47
+ {/* Editor area */}
48
+ <div style={styles.editorArea}>
49
+ {/* External change banner */}
50
+ {isChanged && !isMedia && (
51
+ <div style={styles.changeBanner}>
52
+ <span style={styles.bannerText}>File modified externally</span>
53
+ <button
54
+ onClick={() => reloadFile(activeFile)}
55
+ style={styles.bannerBtn}
56
+ >
57
+ Reload
58
+ </button>
59
+ <button
60
+ onClick={() => dismissFileChange(activeFile)}
61
+ style={styles.bannerDismiss}
62
+ >
63
+ Dismiss
64
+ </button>
65
+ </div>
66
+ )}
67
+
68
+ {/* Media viewer */}
69
+ {isMediaTab ? (
70
+ <MediaViewer path={activeFile} />
71
+ ) : file ? (
72
+ <CodeEditor
73
+ key={activeFile}
74
+ content={file.content}
75
+ language={file.language}
76
+ onContentChange={onContentChange}
77
+ onSave={onSave}
78
+ />
79
+ ) : (
80
+ <div style={styles.emptyState}>
81
+ <div style={styles.emptyIcon}>{'\u2190'}</div>
82
+ <div style={styles.emptyText}>Select a file from the tree</div>
83
+ <div style={styles.emptyHint}>Cmd+S to save | right-click for options</div>
84
+ </div>
85
+ )}
86
+ </div>
87
+ </div>
88
+ </div>
89
+ );
90
+ }
91
+
92
+ const styles = {
93
+ container: {
94
+ display: 'flex', flexDirection: 'column',
95
+ height: '100%', width: '100%',
96
+ },
97
+ contentRow: {
98
+ flex: 1, display: 'flex', overflow: 'hidden',
99
+ },
100
+ sidebar: {
101
+ width: 240, flexShrink: 0,
102
+ borderRight: '1px solid var(--border)',
103
+ overflow: 'hidden',
104
+ },
105
+ editorArea: {
106
+ flex: 1, display: 'flex', flexDirection: 'column',
107
+ position: 'relative', overflow: 'hidden',
108
+ background: 'var(--bg-base)',
109
+ },
110
+ changeBanner: {
111
+ position: 'absolute', top: 0, left: 0, right: 0, zIndex: 10,
112
+ display: 'flex', alignItems: 'center', gap: 8,
113
+ padding: '6px 12px',
114
+ background: 'rgba(229, 192, 123, 0.15)',
115
+ borderBottom: '1px solid var(--amber)',
116
+ },
117
+ bannerText: {
118
+ fontSize: 11, color: 'var(--amber)', fontWeight: 500,
119
+ fontFamily: 'var(--font)', flex: 1,
120
+ },
121
+ bannerBtn: {
122
+ padding: '3px 10px',
123
+ background: 'var(--amber)', border: 'none',
124
+ borderRadius: 2, color: 'var(--bg-base)',
125
+ fontSize: 10, fontWeight: 700,
126
+ fontFamily: 'var(--font)', cursor: 'pointer',
127
+ },
128
+ bannerDismiss: {
129
+ padding: '3px 10px',
130
+ background: 'transparent', border: '1px solid var(--amber)',
131
+ borderRadius: 2, color: 'var(--amber)',
132
+ fontSize: 10, fontWeight: 500,
133
+ fontFamily: 'var(--font)', cursor: 'pointer',
134
+ },
135
+ emptyState: {
136
+ flex: 1, display: 'flex', flexDirection: 'column',
137
+ alignItems: 'center', justifyContent: 'center',
138
+ gap: 8,
139
+ },
140
+ emptyIcon: {
141
+ fontSize: 28, color: 'var(--text-muted)', opacity: 0.5,
142
+ },
143
+ emptyText: {
144
+ fontSize: 13, color: 'var(--text-dim)', fontWeight: 500,
145
+ },
146
+ emptyHint: {
147
+ fontSize: 10, color: 'var(--text-muted)',
148
+ },
149
+ };