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
+ };
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (C) 2018 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,14 @@
1
+ # @lezer/common
2
+
3
+ [ [**WEBSITE**](http://lezer.codemirror.net) | [**ISSUES**](https://github.com/lezer-parser/lezer/issues) | [**FORUM**](https://discuss.codemirror.net/c/lezer) | [**CHANGELOG**](https://github.com/lezer-parser/common/blob/master/CHANGELOG.md) ]
4
+
5
+ [Lezer](https://lezer.codemirror.net/) is an incremental parser system
6
+ intended for use in an editor or similar system.
7
+
8
+ @lezer/common provides the syntax tree data structure and parser
9
+ abstractions for Lezer parsers.
10
+
11
+ Its programming interface is documented on [the
12
+ website](https://lezer.codemirror.net/docs/ref/#common).
13
+
14
+ This code is licensed under an MIT license.