@mindflight/mindbrain-personal-studio 0.6.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 (166) hide show
  1. package/.env.example +50 -0
  2. package/README.md +134 -0
  3. package/bin/mindbrain-studio.mjs +20 -0
  4. package/build/client/_app/immutable/assets/2.BXRKVU9n.css +1 -0
  5. package/build/client/_app/immutable/assets/2.BXRKVU9n.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.BXRKVU9n.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/-OSExkSk.js +2 -0
  8. package/build/client/_app/immutable/chunks/-OSExkSk.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/-OSExkSk.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/BIHI7g3E.js +1 -0
  11. package/build/client/_app/immutable/chunks/BIHI7g3E.js.br +2 -0
  12. package/build/client/_app/immutable/chunks/BIHI7g3E.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BJB7pSge.js +1 -0
  14. package/build/client/_app/immutable/chunks/BJB7pSge.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BJB7pSge.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/BNUkRZqg.js +1 -0
  17. package/build/client/_app/immutable/chunks/BNUkRZqg.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BNUkRZqg.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/BP2JbIUZ.js +1 -0
  20. package/build/client/_app/immutable/chunks/BP2JbIUZ.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BP2JbIUZ.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BVrgUHq-.js +1 -0
  23. package/build/client/_app/immutable/chunks/BVrgUHq-.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BVrgUHq-.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/BmeSanva.js +1 -0
  26. package/build/client/_app/immutable/chunks/BmeSanva.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BmeSanva.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/BnkCgNCx.js +1 -0
  29. package/build/client/_app/immutable/chunks/BnkCgNCx.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BnkCgNCx.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/C5KYKPa8.js +311 -0
  32. package/build/client/_app/immutable/chunks/C5KYKPa8.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/C5KYKPa8.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/CBDzfqXr.js +1 -0
  35. package/build/client/_app/immutable/chunks/CBDzfqXr.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/CBDzfqXr.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/Cp9dXlPT.js +1 -0
  38. package/build/client/_app/immutable/chunks/Cp9dXlPT.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/Cp9dXlPT.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/D0daF8Eh.js +2 -0
  41. package/build/client/_app/immutable/chunks/D0daF8Eh.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/D0daF8Eh.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/D4SoBmS0.js +1 -0
  44. package/build/client/_app/immutable/chunks/D4SoBmS0.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/D4SoBmS0.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/DpVrWha3.js +1 -0
  47. package/build/client/_app/immutable/chunks/DpVrWha3.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/DpVrWha3.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/DyXQogav.js +1 -0
  50. package/build/client/_app/immutable/chunks/DyXQogav.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/DyXQogav.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/Gs0cNFYG.js +1 -0
  53. package/build/client/_app/immutable/chunks/Gs0cNFYG.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/Gs0cNFYG.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/NXeHtWpC.js +1 -0
  56. package/build/client/_app/immutable/chunks/NXeHtWpC.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/NXeHtWpC.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/i0D5dc1Y.js +1 -0
  59. package/build/client/_app/immutable/chunks/i0D5dc1Y.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/i0D5dc1Y.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/nnWk1BBo.js +1 -0
  62. package/build/client/_app/immutable/chunks/nnWk1BBo.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/nnWk1BBo.js.gz +0 -0
  64. package/build/client/_app/immutable/entry/app.CVz6aYsT.js +2 -0
  65. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.br +0 -0
  66. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.gz +0 -0
  67. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js +1 -0
  68. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.br +2 -0
  69. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js +1 -0
  71. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js +1 -0
  74. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.gz +0 -0
  76. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js +9 -0
  77. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js.br +0 -0
  78. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js.gz +0 -0
  79. package/build/client/_app/version.json +1 -0
  80. package/build/client/_app/version.json.br +0 -0
  81. package/build/client/_app/version.json.gz +0 -0
  82. package/build/client/robots.txt +3 -0
  83. package/build/client/robots.txt.br +0 -0
  84. package/build/client/robots.txt.gz +0 -0
  85. package/build/env.js +70 -0
  86. package/build/env.js.map +1 -0
  87. package/build/handler.js +26 -0
  88. package/build/handler.js.map +1 -0
  89. package/build/index.js +149 -0
  90. package/build/index.js.map +1 -0
  91. package/build/server/chunks/chunks/edgeLinkModes.js-CfRqrZtd.js +50 -0
  92. package/build/server/chunks/chunks/edgeLinkModes.js-CfRqrZtd.js.map +1 -0
  93. package/build/server/chunks/chunks/environment.js-Bf8x1V_n.js +16 -0
  94. package/build/server/chunks/chunks/environment.js-Bf8x1V_n.js.map +1 -0
  95. package/build/server/chunks/chunks/exports.js-DFR3riS9.js +217 -0
  96. package/build/server/chunks/chunks/exports.js-DFR3riS9.js.map +1 -0
  97. package/build/server/chunks/chunks/false.js-CRHihH2U.js +4 -0
  98. package/build/server/chunks/chunks/false.js-CRHihH2U.js.map +1 -0
  99. package/build/server/chunks/chunks/graphRepository.js-D2DARfVY.js +280 -0
  100. package/build/server/chunks/chunks/graphRepository.js-D2DARfVY.js.map +1 -0
  101. package/build/server/chunks/chunks/internal.js-D8EA_he2.js +119 -0
  102. package/build/server/chunks/chunks/internal.js-D8EA_he2.js.map +1 -0
  103. package/build/server/chunks/chunks/mindbrainClient.js-BFAJqRSL.js +108 -0
  104. package/build/server/chunks/chunks/mindbrainClient.js-BFAJqRSL.js.map +1 -0
  105. package/build/server/chunks/chunks/ontologyInspect.js-Dm3l7KgF.js +13 -0
  106. package/build/server/chunks/chunks/ontologyInspect.js-Dm3l7KgF.js.map +1 -0
  107. package/build/server/chunks/chunks/render-context.js-CTu5Wkzp.js +475 -0
  108. package/build/server/chunks/chunks/render-context.js-CTu5Wkzp.js.map +1 -0
  109. package/build/server/chunks/chunks/renderer.js-DsOhU1UZ.js +1243 -0
  110. package/build/server/chunks/chunks/renderer.js-DsOhU1UZ.js.map +1 -0
  111. package/build/server/chunks/chunks/root.js-DCnlE3XY.js +2815 -0
  112. package/build/server/chunks/chunks/root.js-DCnlE3XY.js.map +1 -0
  113. package/build/server/chunks/chunks/shared-server.js-DaWdgxVh.js +11 -0
  114. package/build/server/chunks/chunks/shared-server.js-DaWdgxVh.js.map +1 -0
  115. package/build/server/chunks/chunks/shared.js-DuDDTJVi.js +1338 -0
  116. package/build/server/chunks/chunks/shared.js-DuDDTJVi.js.map +1 -0
  117. package/build/server/chunks/chunks/utils.js-DGYJFmnf.js +39 -0
  118. package/build/server/chunks/chunks/utils.js-DGYJFmnf.js.map +1 -0
  119. package/build/server/chunks/entries/endpoints/api/brain/_...path_/_server.ts.js-MgPpKBks.js +82 -0
  120. package/build/server/chunks/entries/endpoints/api/brain/_...path_/_server.ts.js-MgPpKBks.js.map +1 -0
  121. package/build/server/chunks/entries/endpoints/api/brain/health/_server.ts.js-DnJQNmWV.js +19 -0
  122. package/build/server/chunks/entries/endpoints/api/brain/health/_server.ts.js-DnJQNmWV.js.map +1 -0
  123. package/build/server/chunks/entries/endpoints/api/graph/_server.ts.js-Bxo7qHVz.js +37 -0
  124. package/build/server/chunks/entries/endpoints/api/graph/_server.ts.js-Bxo7qHVz.js.map +1 -0
  125. package/build/server/chunks/entries/endpoints/api/graph/count/_server.ts.js-BajaLnqp.js +37 -0
  126. package/build/server/chunks/entries/endpoints/api/graph/count/_server.ts.js-BajaLnqp.js.map +1 -0
  127. package/build/server/chunks/entries/endpoints/api/graph/ontologies/_server.ts.js-BFq2mbbX.js +146 -0
  128. package/build/server/chunks/entries/endpoints/api/graph/ontologies/_server.ts.js-BFq2mbbX.js.map +1 -0
  129. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js +154 -0
  130. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js.map +1 -0
  131. package/build/server/chunks/entries/endpoints/api/projections/catalog/_server.ts.js-Ds1RymA0.js +351 -0
  132. package/build/server/chunks/entries/endpoints/api/projections/catalog/_server.ts.js-Ds1RymA0.js.map +1 -0
  133. package/build/server/chunks/entries/fallbacks/error.svelte.js-B7V4yZjo.js +51 -0
  134. package/build/server/chunks/entries/fallbacks/error.svelte.js-B7V4yZjo.js.map +1 -0
  135. package/build/server/chunks/entries/pages/_layout.svelte.js-CoC9BAeH.js +15 -0
  136. package/build/server/chunks/entries/pages/_layout.svelte.js-CoC9BAeH.js.map +1 -0
  137. package/build/server/chunks/entries/pages/_page.svelte.js-DMEbD3K6.js +891 -0
  138. package/build/server/chunks/entries/pages/_page.svelte.js-DMEbD3K6.js.map +1 -0
  139. package/build/server/chunks/handler-BjXBCd1c.js +1698 -0
  140. package/build/server/chunks/handler-BjXBCd1c.js.map +1 -0
  141. package/build/server/chunks/index.js-BJYcV8V7.js +4183 -0
  142. package/build/server/chunks/index.js-BJYcV8V7.js.map +1 -0
  143. package/build/server/chunks/manifest.js-Ddaot0P4.js +91 -0
  144. package/build/server/chunks/manifest.js-Ddaot0P4.js.map +1 -0
  145. package/build/server/chunks/nodes/0.js-87v83UX9.js +9 -0
  146. package/build/server/chunks/nodes/0.js-87v83UX9.js.map +1 -0
  147. package/build/server/chunks/nodes/1.js-BRigw_9J.js +9 -0
  148. package/build/server/chunks/nodes/1.js-BRigw_9J.js.map +1 -0
  149. package/build/server/chunks/nodes/2.js-D9-B_qyX.js +9 -0
  150. package/build/server/chunks/nodes/2.js-D9-B_qyX.js.map +1 -0
  151. package/build/shims.js +33 -0
  152. package/build/shims.js.map +1 -0
  153. package/fixtures/minimal-graph.sqlite +0 -0
  154. package/package.json +81 -0
  155. package/scripts/backend-sqlite.mjs +190 -0
  156. package/scripts/build-serenity-v6-concept-review-pack.mjs +493 -0
  157. package/scripts/build-serenity-v6-review-pack.mjs +479 -0
  158. package/scripts/create-serenity-production-v6.mjs +627 -0
  159. package/scripts/dev-sqlite.mjs +86 -0
  160. package/scripts/export-serenity-v6-backup.mjs +178 -0
  161. package/scripts/import-serenity-v6-user-decisions.mjs +543 -0
  162. package/scripts/lib/sqlite-runtime.mjs +197 -0
  163. package/scripts/materialize-serenity-v6-snapshots.mjs +675 -0
  164. package/scripts/publish-npm.mjs +134 -0
  165. package/scripts/seed-immeuble-projections.mjs +169 -0
  166. package/scripts/studio-sqlite.mjs +74 -0
@@ -0,0 +1,91 @@
1
+ const manifest = (() => {
2
+ function __memo(fn) {
3
+ let value;
4
+ return () => value ??= (value = fn());
5
+ }
6
+
7
+ return {
8
+ appDir: "_app",
9
+ appPath: "_app",
10
+ assets: new Set(["robots.txt"]),
11
+ mimeTypes: {".txt":"text/plain"},
12
+ _: {
13
+ client: {start:"_app/immutable/entry/start.Bt5tVOz8.js",app:"_app/immutable/entry/app.CVz6aYsT.js",imports:["_app/immutable/entry/start.Bt5tVOz8.js","_app/immutable/chunks/BmeSanva.js","_app/immutable/chunks/BnkCgNCx.js","_app/immutable/chunks/BNUkRZqg.js","_app/immutable/entry/app.CVz6aYsT.js","_app/immutable/chunks/nnWk1BBo.js","_app/immutable/chunks/BnkCgNCx.js","_app/immutable/chunks/D4SoBmS0.js","_app/immutable/chunks/D0daF8Eh.js","_app/immutable/chunks/NXeHtWpC.js","_app/immutable/chunks/BNUkRZqg.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
14
+ nodes: [
15
+ __memo(() => import('./nodes/0.js-87v83UX9.js')),
16
+ __memo(() => import('./nodes/1.js-BRigw_9J.js')),
17
+ __memo(() => import('./nodes/2.js-D9-B_qyX.js'))
18
+ ],
19
+ remotes: {
20
+
21
+ },
22
+ routes: [
23
+ {
24
+ id: "/",
25
+ pattern: /^\/$/,
26
+ params: [],
27
+ page: { layouts: [0,], errors: [1,], leaf: 2 },
28
+ endpoint: null
29
+ },
30
+ {
31
+ id: "/api/brain/health",
32
+ pattern: /^\/api\/brain\/health\/?$/,
33
+ params: [],
34
+ page: null,
35
+ endpoint: __memo(() => import('./entries/endpoints/api/brain/health/_server.ts.js-DnJQNmWV.js'))
36
+ },
37
+ {
38
+ id: "/api/brain/[...path]",
39
+ pattern: /^\/api\/brain(?:\/([^]*))?\/?$/,
40
+ params: [{"name":"path","optional":false,"rest":true,"chained":true}],
41
+ page: null,
42
+ endpoint: __memo(() => import('./entries/endpoints/api/brain/_...path_/_server.ts.js-MgPpKBks.js'))
43
+ },
44
+ {
45
+ id: "/api/graph",
46
+ pattern: /^\/api\/graph\/?$/,
47
+ params: [],
48
+ page: null,
49
+ endpoint: __memo(() => import('./entries/endpoints/api/graph/_server.ts.js-Bxo7qHVz.js'))
50
+ },
51
+ {
52
+ id: "/api/graph/count",
53
+ pattern: /^\/api\/graph\/count\/?$/,
54
+ params: [],
55
+ page: null,
56
+ endpoint: __memo(() => import('./entries/endpoints/api/graph/count/_server.ts.js-BajaLnqp.js'))
57
+ },
58
+ {
59
+ id: "/api/graph/ontologies",
60
+ pattern: /^\/api\/graph\/ontologies\/?$/,
61
+ params: [],
62
+ page: null,
63
+ endpoint: __memo(() => import('./entries/endpoints/api/graph/ontologies/_server.ts.js-BFq2mbbX.js'))
64
+ },
65
+ {
66
+ id: "/api/graph/schema-registry",
67
+ pattern: /^\/api\/graph\/schema-registry\/?$/,
68
+ params: [],
69
+ page: null,
70
+ endpoint: __memo(() => import('./entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js'))
71
+ },
72
+ {
73
+ id: "/api/projections/catalog",
74
+ pattern: /^\/api\/projections\/catalog\/?$/,
75
+ params: [],
76
+ page: null,
77
+ endpoint: __memo(() => import('./entries/endpoints/api/projections/catalog/_server.ts.js-Ds1RymA0.js'))
78
+ }
79
+ ],
80
+ prerendered_routes: new Set([]),
81
+ matchers: async () => {
82
+
83
+ return { };
84
+ },
85
+ server_assets: {}
86
+ }
87
+ }
88
+ })();
89
+
90
+ export { manifest as m };
91
+ //# sourceMappingURL=manifest.js-Ddaot0P4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js-Ddaot0P4.js","sources":["../../../.svelte-kit/output/server/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"robots.txt\"]),\n\tmimeTypes: {\".txt\":\"text/plain\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.Bt5tVOz8.js\",app:\"_app/immutable/entry/app.CVz6aYsT.js\",imports:[\"_app/immutable/entry/start.Bt5tVOz8.js\",\"_app/immutable/chunks/BmeSanva.js\",\"_app/immutable/chunks/BnkCgNCx.js\",\"_app/immutable/chunks/BNUkRZqg.js\",\"_app/immutable/entry/app.CVz6aYsT.js\",\"_app/immutable/chunks/nnWk1BBo.js\",\"_app/immutable/chunks/BnkCgNCx.js\",\"_app/immutable/chunks/D4SoBmS0.js\",\"_app/immutable/chunks/D0daF8Eh.js\",\"_app/immutable/chunks/NXeHtWpC.js\",\"_app/immutable/chunks/BNUkRZqg.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/\",\n\t\t\t\tpattern: /^\\/$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 2 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/brain/health\",\n\t\t\t\tpattern: /^\\/api\\/brain\\/health\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/brain/health/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/brain/[...path]\",\n\t\t\t\tpattern: /^\\/api\\/brain(?:\\/([^]*))?\\/?$/,\n\t\t\t\tparams: [{\"name\":\"path\",\"optional\":false,\"rest\":true,\"chained\":true}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/brain/_...path_/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/graph\",\n\t\t\t\tpattern: /^\\/api\\/graph\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/graph/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/graph/count\",\n\t\t\t\tpattern: /^\\/api\\/graph\\/count\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/graph/count/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/graph/ontologies\",\n\t\t\t\tpattern: /^\\/api\\/graph\\/ontologies\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/graph/ontologies/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/graph/schema-registry\",\n\t\t\t\tpattern: /^\\/api\\/graph\\/schema-registry\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/graph/schema-registry/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/projections/catalog\",\n\t\t\t\tpattern: /^\\/api\\/projections\\/catalog\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/projections/catalog/_server.ts.js'))\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ const index = 0;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js-CoC9BAeH.js')).default;
4
+ const imports = ["_app/immutable/nodes/0.C2sXq0eH.js","_app/immutable/chunks/NXeHtWpC.js","_app/immutable/chunks/BnkCgNCx.js","_app/immutable/chunks/DpVrWha3.js","_app/immutable/chunks/D4SoBmS0.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=0.js-87v83UX9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"0.js-87v83UX9.js","sources":["../../../../.svelte-kit/output/server/nodes/0.js"],"sourcesContent":["\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/0.C2sXq0eH.js\",\"_app/immutable/chunks/NXeHtWpC.js\",\"_app/immutable/chunks/BnkCgNCx.js\",\"_app/immutable/chunks/DpVrWha3.js\",\"_app/immutable/chunks/D4SoBmS0.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,gDAAoC,CAAC,EAAE;AAClG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAChM,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;;;"}
@@ -0,0 +1,9 @@
1
+ const index = 1;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js-B7V4yZjo.js')).default;
4
+ const imports = ["_app/immutable/nodes/1.BBtxY46Q.js","_app/immutable/chunks/NXeHtWpC.js","_app/immutable/chunks/BnkCgNCx.js","_app/immutable/chunks/D0daF8Eh.js","_app/immutable/chunks/BmeSanva.js","_app/immutable/chunks/BNUkRZqg.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=1.js-BRigw_9J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1.js-BRigw_9J.js","sources":["../../../../.svelte-kit/output/server/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.BBtxY46Q.js\",\"_app/immutable/chunks/NXeHtWpC.js\",\"_app/immutable/chunks/BnkCgNCx.js\",\"_app/immutable/chunks/D0daF8Eh.js\",\"_app/immutable/chunks/BmeSanva.js\",\"_app/immutable/chunks/BNUkRZqg.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,kDAAsC,CAAC,EAAE;AACpG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AACpO,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;;;"}
@@ -0,0 +1,9 @@
1
+ const index = 2;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-DMEbD3K6.js')).default;
4
+ const imports = ["_app/immutable/nodes/2.D0pSa9ko.js","_app/immutable/chunks/NXeHtWpC.js","_app/immutable/chunks/BnkCgNCx.js","_app/immutable/chunks/BNUkRZqg.js","_app/immutable/chunks/D0daF8Eh.js","_app/immutable/chunks/nnWk1BBo.js","_app/immutable/chunks/D4SoBmS0.js","_app/immutable/chunks/DpVrWha3.js"];
5
+ const stylesheets = ["_app/immutable/assets/2.BXRKVU9n.css"];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=2.js-D9-B_qyX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2.js-D9-B_qyX.js","sources":["../../../../.svelte-kit/output/server/nodes/2.js"],"sourcesContent":["\n\nexport const index = 2;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/2.D0pSa9ko.js\",\"_app/immutable/chunks/NXeHtWpC.js\",\"_app/immutable/chunks/BnkCgNCx.js\",\"_app/immutable/chunks/BNUkRZqg.js\",\"_app/immutable/chunks/D0daF8Eh.js\",\"_app/immutable/chunks/nnWk1BBo.js\",\"_app/immutable/chunks/D4SoBmS0.js\",\"_app/immutable/chunks/DpVrWha3.js\"];\nexport const stylesheets = [\"_app/immutable/assets/2.BXRKVU9n.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8CAAkC,CAAC,EAAE;AAChG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAC5S,MAAC,WAAW,GAAG,CAAC,sCAAsC;AACtD,MAAC,KAAK,GAAG;;;;"}
package/build/shims.js ADDED
@@ -0,0 +1,33 @@
1
+ import buffer from 'node:buffer';
2
+ import { webcrypto } from 'node:crypto';
3
+
4
+ // `buffer.File` was added in Node 18.13.0 while the `File` global was added in Node 20.0.0
5
+ const File = /** @type {import('node:buffer') & { File?: File}} */ (buffer).File;
6
+
7
+ /** @type {Record<string, any>} */
8
+ const globals = {
9
+ crypto: webcrypto,
10
+ File
11
+ };
12
+
13
+ // exported for dev/preview and node environments
14
+ /**
15
+ * Make various web APIs available as globals:
16
+ * - `crypto`
17
+ * - `File`
18
+ */
19
+ function installPolyfills() {
20
+ for (const name in globals) {
21
+ if (name in globalThis) continue;
22
+
23
+ Object.defineProperty(globalThis, name, {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: globals[name]
28
+ });
29
+ }
30
+ }
31
+
32
+ installPolyfills();
33
+ //# sourceMappingURL=shims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shims.js","sources":["../node_modules/.pnpm/@sveltejs+kit@2.56.1_@sveltejs+vite-plugin-svelte@6.2.4_svelte@5.55.1_vite@7.3.1_@types_b6128aca79733c4841488f96218eb217/node_modules/@sveltejs/kit/src/exports/node/polyfills.js","../.svelte-kit/adapter-node/entries/shims.js"],"sourcesContent":["import buffer from 'node:buffer';\nimport { webcrypto as crypto } from 'node:crypto';\n\n// `buffer.File` was added in Node 18.13.0 while the `File` global was added in Node 20.0.0\nconst File = /** @type {import('node:buffer') & { File?: File}} */ (buffer).File;\n\n/** @type {Record<string, any>} */\nconst globals = {\n\tcrypto,\n\tFile\n};\n\n// exported for dev/preview and node environments\n/**\n * Make various web APIs available as globals:\n * - `crypto`\n * - `File`\n */\nexport function installPolyfills() {\n\tfor (const name in globals) {\n\t\tif (name in globalThis) continue;\n\n\t\tObject.defineProperty(globalThis, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t\tvalue: globals[name]\n\t\t});\n\t}\n}\n","import { installPolyfills } from '@sveltejs/kit/node/polyfills';\n\ninstallPolyfills();\n"],"names":["crypto"],"mappings":";;;AAGA;AACA,MAAM,IAAI,yDAAyD,CAAC,MAAM,EAAE,IAAI;;AAEhF;AACA,MAAM,OAAO,GAAG;AAChB,SAACA,SAAM;AACP,CAAC;AACD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,GAAG;AACnC,CAAC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;AAC7B,EAAE,IAAI,IAAI,IAAI,UAAU,EAAE;;AAE1B,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE;AAC1C,GAAG,UAAU,EAAE,IAAI;AACnB,GAAG,YAAY,EAAE,IAAI;AACrB,GAAG,QAAQ,EAAE,IAAI;AACjB,GAAG,KAAK,EAAE,OAAO,CAAC,IAAI;AACtB,GAAG,CAAC;AACJ,CAAC;AACD;;AC3BA,gBAAgB,EAAE","x_google_ignoreList":[0]}
Binary file
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@mindflight/mindbrain-personal-studio",
3
+ "version": "0.6.1",
4
+ "description": "Local GhostCrab MindBrain Studio for SQLite-backed workspaces.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "bin": {
8
+ "ghostcrab-studio": "bin/mindbrain-studio.mjs",
9
+ "mindbrain-studio": "bin/mindbrain-studio.mjs"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "build",
14
+ "fixtures/minimal-graph.sqlite",
15
+ "scripts/*.mjs",
16
+ "scripts/lib",
17
+ "README.md",
18
+ ".env.example"
19
+ ],
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/mindflight-orchestrator/mindbrain-personal-studio.git"
23
+ },
24
+ "homepage": "https://github.com/mindflight-orchestrator/mindbrain-personal-studio#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/mindflight-orchestrator/mindbrain-personal-studio/issues"
27
+ },
28
+ "keywords": [
29
+ "ghostcrab",
30
+ "mindbrain",
31
+ "studio",
32
+ "sqlite",
33
+ "graph"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "packageManager": "pnpm@10.28.1",
39
+ "engines": {
40
+ "node": ">=20.0.0"
41
+ },
42
+ "scripts": {
43
+ "backend": "node scripts/backend-sqlite.mjs",
44
+ "dev": "node scripts/dev-sqlite.mjs",
45
+ "studio": "node scripts/studio-sqlite.mjs --dev",
46
+ "start": "node scripts/studio-sqlite.mjs --serve",
47
+ "load:demo": "bash scripts/load-immeuble-demo.sh",
48
+ "dev:fixture": "DATA_SOURCE=sqlite-demo GHOSTCRAB_SQLITE_PATH=fixtures/minimal-graph.sqlite vite dev",
49
+ "backend:immeuble": "node -e \"console.warn('deprecated: use pnpm backend');\" && node scripts/backend-sqlite.mjs",
50
+ "dev:immeuble": "node -e \"console.warn('deprecated: use pnpm dev');\" && node scripts/dev-sqlite.mjs",
51
+ "backend:sqlite": "node -e \"console.warn('deprecated: use pnpm backend');\" && node scripts/backend-sqlite.mjs",
52
+ "dev:sqlite": "node -e \"console.warn('deprecated: use pnpm dev');\" && node scripts/dev-sqlite.mjs",
53
+ "studio:sqlite": "node -e \"console.warn('deprecated: use pnpm studio');\" && node scripts/studio-sqlite.mjs",
54
+ "load:immeuble": "pnpm load:demo",
55
+ "seed:immeuble-projections": "bash scripts/seed-immeuble-projections.sh",
56
+ "build": "vite build",
57
+ "pack:local": "pnpm run build && mkdir -p dist-pack && npm pack --pack-destination dist-pack",
58
+ "publish:npm": "node scripts/publish-npm.mjs",
59
+ "preview": "vite preview",
60
+ "prepare": "svelte-kit sync || true",
61
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json"
62
+ },
63
+ "devDependencies": {
64
+ "@sveltejs/adapter-node": "^5.5.7",
65
+ "@sveltejs/kit": "^2.50.2",
66
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
67
+ "@types/node": "^24.10.1",
68
+ "svelte": "^5.54.0",
69
+ "svelte-check": "^4.4.2",
70
+ "typescript": "^5.9.3",
71
+ "vite": "^7.3.1"
72
+ },
73
+ "dependencies": {
74
+ "@keenmate/svelte-treeview": "5.0.0-rc07",
75
+ "graphology": "^0.26.0",
76
+ "graphology-layout": "^0.6.1",
77
+ "graphology-layout-forceatlas2": "^0.10.1",
78
+ "graphology-types": "^0.24.8",
79
+ "sigma": "^3.0.2"
80
+ }
81
+ }
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { constants, existsSync, mkdirSync, openSync, writeFileSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { dirname, resolve } from "node:path";
6
+ import {
7
+ baseUrlForPort,
8
+ findFreePort,
9
+ healthOk,
10
+ loadDotEnv,
11
+ parseAddr,
12
+ readRuntimeJson,
13
+ resolveStudioDataTarget,
14
+ runtimeIsUsable,
15
+ runtimePathsForSqlite,
16
+ stripPnpmSeparator,
17
+ studioRootFromScript
18
+ } from "./lib/sqlite-runtime.mjs";
19
+
20
+ function parseFlags(args) {
21
+ const rest = stripPnpmSeparator(args);
22
+ const detach = rest.includes("--detach");
23
+ const filtered = rest.filter((arg) => arg !== "--detach");
24
+ return { detach, filtered };
25
+ }
26
+
27
+ function platformPackageSuffix() {
28
+ const platform = process.platform;
29
+ const arch = process.arch;
30
+ if (!["darwin", "linux", "win32"].includes(platform)) return null;
31
+ if (!["x64", "arm64"].includes(arch)) return null;
32
+ return `${platform}-${arch}`;
33
+ }
34
+
35
+ function resolveBackendBin(ghostcrabRoot) {
36
+ const suffix = platformPackageSuffix();
37
+ const executable = process.platform === "win32" ? "ghostcrab-backend.exe" : "ghostcrab-backend";
38
+ const configured = process.env.GHOSTCRAB_BACKEND_BIN?.trim();
39
+ const roots = [
40
+ ghostcrabRoot,
41
+ resolve(process.cwd(), "node_modules", "@mindflight", "ghostcrab-personal-mcp"),
42
+ resolve(studioRootFromScript(import.meta.url), "node_modules", "@mindflight", "ghostcrab-personal-mcp")
43
+ ].filter(Boolean);
44
+ const candidates = configured ? [resolve(configured)] : [];
45
+ for (const root of roots) {
46
+ candidates.push(resolve(root, "cmd/backend/zig-out/bin", executable));
47
+ }
48
+ if (suffix) {
49
+ for (const root of roots) {
50
+ candidates.push(
51
+ resolve(
52
+ root,
53
+ "node_modules",
54
+ `@mindflight/ghostcrab-personal-mcp-${suffix}`,
55
+ "bin",
56
+ executable
57
+ ),
58
+ resolve(root, "prebuilds", suffix, executable),
59
+ resolve(root, "packages", `prebuild-${suffix}`, "bin", executable)
60
+ );
61
+ }
62
+ candidates.push(
63
+ resolve(process.cwd(), "node_modules", `@mindflight/ghostcrab-personal-mcp-${suffix}`, "bin", executable),
64
+ resolve(homedir(), ".ghostcrab", "bin", executable)
65
+ );
66
+ }
67
+ return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
68
+ }
69
+
70
+ const studioRoot = studioRootFromScript(import.meta.url);
71
+ loadDotEnv(studioRoot);
72
+ const { detach, filtered } = parseFlags(process.argv.slice(2));
73
+ const { sqlitePath, mode, fallbackReason } = resolveStudioDataTarget(studioRoot, filtered);
74
+ if (fallbackReason) {
75
+ console.error(`==> ${fallbackReason}; using packaged demo fixture.`);
76
+ }
77
+ if (mode === "sqlite-demo") {
78
+ console.error(`==> Demo fixture mode; no GhostCrab backend needed: ${sqlitePath}`);
79
+ process.exit(0);
80
+ }
81
+ const ghostcrabRoot = process.env.GHOSTCRAB_ROOT
82
+ ? resolve(process.env.GHOSTCRAB_ROOT)
83
+ : resolve(studioRoot, "..", "ghostcrab-personal-mcp");
84
+ const backendBin = resolveBackendBin(ghostcrabRoot);
85
+ const paths = runtimePathsForSqlite(studioRoot, sqlitePath);
86
+ const runtimeJson = readRuntimeJson(paths.jsonPath);
87
+
88
+ if (!existsSync(sqlitePath)) {
89
+ console.error(`error: SQLite not found at ${sqlitePath}`);
90
+ console.error("Pass --sqlite /path/to/db.sqlite, or set GHOSTCRAB_SQLITE_PATH.");
91
+ process.exit(1);
92
+ }
93
+
94
+ if (!existsSync(backendBin)) {
95
+ console.error(`error: ghostcrab-backend not found at ${backendBin}`);
96
+ console.error("Run in ghostcrab-personal-mcp: pnpm run backend:build");
97
+ process.exit(1);
98
+ }
99
+
100
+ if (!process.env.GHOSTCRAB_BACKEND_ADDR && (await runtimeIsUsable(runtimeJson, sqlitePath))) {
101
+ console.error(`==> Reusing GhostCrab backend ${runtimeJson.base_url}`);
102
+ console.error(` pid: ${runtimeJson.pid}`);
103
+ console.error(` DB: ${runtimeJson.sqlite_path}`);
104
+ console.error(` Runtime: ${paths.jsonPath}`);
105
+ process.exit(0);
106
+ }
107
+
108
+ const explicitPort = parseAddr(process.env.GHOSTCRAB_BACKEND_ADDR);
109
+ const port = explicitPort ?? (await findFreePort(8092, 50));
110
+ const backendAddr = process.env.GHOSTCRAB_BACKEND_ADDR || `127.0.0.1:${port}`;
111
+ const baseUrl = baseUrlForPort(port);
112
+
113
+ mkdirSync(dirname(paths.jsonPath), { recursive: true });
114
+
115
+ console.error(`==> GhostCrab backend on ${backendAddr}`);
116
+ console.error(` URL: ${baseUrl}`);
117
+ console.error(` DB: ${sqlitePath}`);
118
+ console.error(` Runtime: ${paths.jsonPath}`);
119
+ console.error("");
120
+
121
+ const logFd = openSync(paths.logPath, constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND);
122
+ const child = spawn(backendBin, [], {
123
+ env: {
124
+ ...process.env,
125
+ GHOSTCRAB_SQLITE_PATH: sqlitePath,
126
+ GHOSTCRAB_BACKEND_ADDR: backendAddr
127
+ },
128
+ stdio: detach ? ["ignore", logFd, logFd] : ["ignore", "inherit", logFd],
129
+ detached: detach
130
+ });
131
+
132
+ let childExited = false;
133
+ let childExitCode = null;
134
+ child.on("exit", (code) => {
135
+ childExited = true;
136
+ childExitCode = code;
137
+ });
138
+
139
+ child.on("error", (err) => {
140
+ console.error(`error: failed to spawn backend: ${err.message}`);
141
+ process.exit(1);
142
+ });
143
+
144
+ const deadline = Date.now() + 15_000;
145
+ while (Date.now() < deadline) {
146
+ if (childExited) {
147
+ console.error(`error: backend exited early with code ${childExitCode ?? "unknown"}`);
148
+ process.exit(childExitCode ?? 1);
149
+ }
150
+ if (await healthOk(baseUrl)) {
151
+ const runtime = {
152
+ schema_version: 1,
153
+ pid: child.pid,
154
+ port,
155
+ base_url: baseUrl,
156
+ sqlite_path: sqlitePath,
157
+ backend_addr: backendAddr,
158
+ started_at: new Date().toISOString(),
159
+ source: "mindbrain-personal-studio:sqlite"
160
+ };
161
+ writeFileSync(paths.pidPath, `${child.pid}:${port}:studio\n`, "utf8");
162
+ writeFileSync(paths.jsonPath, `${JSON.stringify(runtime, null, 2)}\n`, "utf8");
163
+ console.error(`==> Backend healthy: ${baseUrl}/health`);
164
+ console.error(` Smoke: curl -fsS ${baseUrl}/api/mindbrain/workspace/list`);
165
+ break;
166
+ }
167
+ await new Promise((resolveWait) => setTimeout(resolveWait, 150));
168
+ }
169
+
170
+ if (!(await healthOk(baseUrl))) {
171
+ console.error("error: backend did not become healthy within 15s");
172
+ child.kill();
173
+ process.exit(1);
174
+ }
175
+
176
+ if (detach) {
177
+ child.unref();
178
+ process.exit(0);
179
+ }
180
+
181
+ function stopChild(signal) {
182
+ if (!child.killed) child.kill(signal);
183
+ }
184
+
185
+ process.on("SIGINT", () => stopChild("SIGINT"));
186
+ process.on("SIGTERM", () => stopChild("SIGTERM"));
187
+
188
+ child.on("exit", (code, signal) => {
189
+ process.exitCode = code ?? (signal ? 128 : 0);
190
+ });