@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,280 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { resolve } from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { b as private_env } from './shared-server.js-DaWdgxVh.js';
7
+
8
+ const ONTOLOGY_TOKEN_RE = /^[a-z0-9_.:-]+$/i;
9
+ function sanitizeOntologyParam(raw) {
10
+ if (raw == null || raw === "" || raw === "all") return "all";
11
+ if (raw === "_none") return "_none";
12
+ if (ONTOLOGY_TOKEN_RE.test(raw)) return raw;
13
+ return "all";
14
+ }
15
+ const GRAPH_TYPE_PREFIX = "type:";
16
+ function graphEntityTypeFromOntology(ontology) {
17
+ const t = ontology.trim();
18
+ if (!t.toLowerCase().startsWith(GRAPH_TYPE_PREFIX)) return null;
19
+ const rest = t.slice(GRAPH_TYPE_PREFIX.length).trim();
20
+ if (rest === "" || rest.includes(":")) return null;
21
+ if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(rest)) return null;
22
+ return rest;
23
+ }
24
+ const execFileAsync = promisify(execFile);
25
+ const TOP_K_MAX = 500;
26
+ function sanitizeWorkspaceParam(raw) {
27
+ const s = raw?.trim();
28
+ if (!s) return null;
29
+ if (/^[a-z0-9_.-]+$/i.test(s)) return s;
30
+ return null;
31
+ }
32
+ function sanitizeTopKParam(raw) {
33
+ if (raw === null || raw === "") return 30;
34
+ if (raw === "none" || raw === "0") return null;
35
+ const n = Number.parseInt(raw, 10);
36
+ if (!Number.isFinite(n) || n < 1) return 30;
37
+ return Math.min(Math.floor(n), TOP_K_MAX);
38
+ }
39
+ function expandHome(path) {
40
+ if (path === "~") return homedir();
41
+ if (path.startsWith("~/")) return resolve(homedir(), path.slice(2));
42
+ return path;
43
+ }
44
+ function candidateSqlitePaths() {
45
+ return [
46
+ private_env.GHOSTCRAB_PERSO_SQLITE_PATH,
47
+ private_env.MCP_GHOSTCRAB_SQLITE_PATH,
48
+ "~/.ghostcrab/databases/ghostcrab.sqlite",
49
+ "~/data/ghostcrab.sqlite",
50
+ "~/.ghostcrab/ghostcrab.sqlite",
51
+ "~/Library/Application Support/GhostCrab/ghostcrab.sqlite",
52
+ "data/ghostcrab.sqlite"
53
+ ].map((p) => p?.trim()).filter((p) => Boolean(p)).map((p) => resolve(expandHome(p)));
54
+ }
55
+ function sqlitePath() {
56
+ const configured = private_env.GHOSTCRAB_SQLITE_PATH?.trim();
57
+ if (configured && configured !== "auto") return resolve(expandHome(configured));
58
+ const candidates = candidateSqlitePaths();
59
+ return candidates.find((p) => existsSync(p)) ?? candidates[candidates.length - 1];
60
+ }
61
+ let repository = null;
62
+ function getGraphRepository() {
63
+ const path = sqlitePath();
64
+ if (!repository || repository.path !== path) {
65
+ repository?.close();
66
+ repository = new SQLiteGraphRepository(path);
67
+ }
68
+ return repository;
69
+ }
70
+ function parseJsonObject(raw) {
71
+ if (!raw) return {};
72
+ try {
73
+ const value = JSON.parse(raw);
74
+ if (value && typeof value === "object" && !Array.isArray(value)) {
75
+ return value;
76
+ }
77
+ } catch {
78
+ }
79
+ return {};
80
+ }
81
+ function placeholders(values) {
82
+ return values.map((value) => sqlString(String(value))).join(", ");
83
+ }
84
+ function sqlString(value) {
85
+ return `'${value.replaceAll("'", "''")}'`;
86
+ }
87
+ function sqlNullableEquals(column, value) {
88
+ return value == null ? "1=1" : `${column} = ${sqlString(value)}`;
89
+ }
90
+ async function queryJsonRows(dbPath, sql) {
91
+ const { stdout } = await execFileAsync("sqlite3", ["-readonly", "-json", dbPath, sql], {
92
+ maxBuffer: 64 * 1024 * 1024
93
+ });
94
+ const trimmed = stdout.trim();
95
+ if (!trimmed) return [];
96
+ const parsed = JSON.parse(trimmed);
97
+ return Array.isArray(parsed) ? parsed : [];
98
+ }
99
+ class SQLiteGraphRepository {
100
+ constructor(path) {
101
+ this.path = path;
102
+ }
103
+ path;
104
+ close() {
105
+ return;
106
+ }
107
+ async listWorkspaces() {
108
+ const rows = await queryJsonRows(
109
+ this.path,
110
+ `
111
+ WITH entity_counts AS (
112
+ SELECT workspace_id, COUNT(*) AS entity_count
113
+ FROM graph_entity
114
+ WHERE deprecated_at IS NULL
115
+ GROUP BY workspace_id
116
+ )
117
+ SELECT
118
+ COALESCE(w.workspace_id, w.id, e.workspace_id) AS id,
119
+ COALESCE(e.entity_count, 0) AS entityCount,
120
+ w.label AS label
121
+ FROM workspaces w
122
+ LEFT JOIN entity_counts e
123
+ ON e.workspace_id = COALESCE(w.workspace_id, w.id)
124
+ UNION
125
+ SELECT e.workspace_id AS id, e.entity_count AS entityCount, NULL AS label
126
+ FROM entity_counts e
127
+ WHERE NOT EXISTS (
128
+ SELECT 1 FROM workspaces w
129
+ WHERE COALESCE(w.workspace_id, w.id) = e.workspace_id
130
+ )
131
+ ORDER BY entityCount DESC, id
132
+ `
133
+ );
134
+ return rows.map((r) => ({
135
+ id: r.id,
136
+ entityCount: Number(r.entityCount ?? 0),
137
+ label: r.label
138
+ }));
139
+ }
140
+ async listOntologyRows(workspace) {
141
+ const rows = await queryJsonRows(
142
+ this.path,
143
+ `
144
+ SELECT ('type:' || entity_type) AS id, COUNT(*) AS nodeCount
145
+ FROM graph_entity
146
+ WHERE deprecated_at IS NULL
147
+ AND ${sqlNullableEquals("workspace_id", workspace)}
148
+ GROUP BY entity_type
149
+ ORDER BY nodeCount DESC, entity_type
150
+ `
151
+ );
152
+ return rows.map((r) => ({ id: r.id, nodeCount: Number(r.nodeCount ?? 0) }));
153
+ }
154
+ async fetchGraph(args) {
155
+ const entityType = graphEntityTypeFromOntology(args.ontology);
156
+ const entityRows = await queryJsonRows(
157
+ this.path,
158
+ `
159
+ SELECT
160
+ CAST(e.entity_id AS TEXT) AS id,
161
+ e.name,
162
+ e.entity_type,
163
+ e.workspace_id,
164
+ e.metadata_json,
165
+ NULL AS facet_json
166
+ FROM graph_entity e
167
+ WHERE e.deprecated_at IS NULL
168
+ AND ${sqlNullableEquals("e.workspace_id", args.workspace)}
169
+ AND ${sqlNullableEquals("e.entity_type", entityType)}
170
+ ORDER BY e.entity_type, e.name, e.entity_id
171
+ `
172
+ );
173
+ const nodes = entityRows.map((r) => {
174
+ const metadata = parseJsonObject(r.metadata_json);
175
+ const facetJson = parseJsonObject(r.facet_json);
176
+ return {
177
+ id: String(r.id),
178
+ label: r.name,
179
+ node_type: r.entity_type,
180
+ schema_id: r.entity_type,
181
+ facets: {
182
+ ...metadata,
183
+ ...facetJson,
184
+ workspace_id: r.workspace_id,
185
+ record_id: String(facetJson.record_id ?? metadata.record_id ?? r.name),
186
+ entity_type: r.entity_type
187
+ }
188
+ };
189
+ });
190
+ const edgeRows = await this.fetchEdgeRows(args);
191
+ const liveNodeIds = new Set(nodes.map((n) => n.id));
192
+ const edges = edgeRows.filter((e) => liveNodeIds.has(String(e.source)) && liveNodeIds.has(String(e.target))).map((e) => ({
193
+ id: String(e.id),
194
+ source: String(e.source),
195
+ target: String(e.target),
196
+ label: e.label,
197
+ weight: e.weight == null ? null : Number(e.weight)
198
+ }));
199
+ return { nodes, edges, sourceUsed: "graph" };
200
+ }
201
+ async countGraph(args) {
202
+ const entityType = graphEntityTypeFromOntology(args.ontology);
203
+ const [nodeRow = { nodeCount: 0 }] = await queryJsonRows(
204
+ this.path,
205
+ `
206
+ SELECT COUNT(*) AS nodeCount
207
+ FROM graph_entity
208
+ WHERE deprecated_at IS NULL
209
+ AND ${sqlNullableEquals("workspace_id", args.workspace)}
210
+ AND ${sqlNullableEquals("entity_type", entityType)}
211
+ `
212
+ );
213
+ const edgeRows = await this.fetchEdgeRows(args);
214
+ const topEdgeLabels = await this.topEdgeLabels(args);
215
+ return {
216
+ nodeCount: Number(nodeRow.nodeCount ?? 0),
217
+ edgeCount: edgeRows.length,
218
+ edgeCountCapped: false,
219
+ topEdgeLabels,
220
+ sourceUsed: "graph"
221
+ };
222
+ }
223
+ async fetchEdgeRows(args) {
224
+ const entityType = graphEntityTypeFromOntology(args.ontology);
225
+ const labelFilter = args.edgeLabelAllowlist?.length ? `AND r.relation_type IN (${placeholders(args.edgeLabelAllowlist)})` : "";
226
+ return queryJsonRows(
227
+ this.path,
228
+ `
229
+ WITH ent AS (
230
+ SELECT entity_id
231
+ FROM graph_entity
232
+ WHERE deprecated_at IS NULL
233
+ AND ${sqlNullableEquals("workspace_id", args.workspace)}
234
+ AND ${sqlNullableEquals("entity_type", entityType)}
235
+ )
236
+ SELECT id, source, target, label, weight
237
+ FROM (
238
+ SELECT
239
+ CAST(r.relation_id AS TEXT) AS id,
240
+ CAST(r.source_id AS TEXT) AS source,
241
+ CAST(r.target_id AS TEXT) AS target,
242
+ r.relation_type AS label,
243
+ r.confidence AS weight,
244
+ ROW_NUMBER() OVER (
245
+ PARTITION BY r.source_id
246
+ ORDER BY r.confidence DESC, r.relation_id
247
+ ) AS rn
248
+ FROM graph_relation r
249
+ INNER JOIN ent s ON s.entity_id = r.source_id
250
+ INNER JOIN ent t ON t.entity_id = r.target_id
251
+ WHERE r.deprecated_at IS NULL
252
+ AND ${sqlNullableEquals("r.workspace_id", args.workspace)}
253
+ ${labelFilter}
254
+ )
255
+ ${args.topKEdgesPerNode == null ? "" : `WHERE rn <= ${args.topKEdgesPerNode}`}
256
+ ORDER BY source, target, id
257
+ `
258
+ );
259
+ }
260
+ async topEdgeLabels(args) {
261
+ const labelFilter = args.edgeLabelAllowlist?.length ? `AND relation_type IN (${placeholders(args.edgeLabelAllowlist)})` : "";
262
+ const rows = await queryJsonRows(
263
+ this.path,
264
+ `
265
+ SELECT relation_type AS label, COUNT(*) AS count
266
+ FROM graph_relation
267
+ WHERE deprecated_at IS NULL
268
+ AND ${sqlNullableEquals("workspace_id", args.workspace)}
269
+ ${labelFilter}
270
+ GROUP BY relation_type
271
+ ORDER BY count DESC, relation_type
272
+ LIMIT 10
273
+ `
274
+ );
275
+ return rows.map((r) => ({ label: r.label, count: Number(r.count ?? 0) }));
276
+ }
277
+ }
278
+
279
+ export { sanitizeTopKParam as a, sanitizeWorkspaceParam as b, sqlitePath as c, getGraphRepository as g, sanitizeOntologyParam as s };
280
+ //# sourceMappingURL=graphRepository.js-D2DARfVY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphRepository.js-D2DARfVY.js","sources":["../../../../.svelte-kit/output/server/chunks/graphRepository.js"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { b as private_env } from \"./shared-server.js\";\nconst ONTOLOGY_TOKEN_RE = /^[a-z0-9_.:-]+$/i;\nfunction sanitizeOntologyParam(raw) {\n if (raw == null || raw === \"\" || raw === \"all\") return \"all\";\n if (raw === \"_none\") return \"_none\";\n if (ONTOLOGY_TOKEN_RE.test(raw)) return raw;\n return \"all\";\n}\nconst GRAPH_TYPE_PREFIX = \"type:\";\nfunction graphEntityTypeFromOntology(ontology) {\n const t = ontology.trim();\n if (!t.toLowerCase().startsWith(GRAPH_TYPE_PREFIX)) return null;\n const rest = t.slice(GRAPH_TYPE_PREFIX.length).trim();\n if (rest === \"\" || rest.includes(\":\")) return null;\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(rest)) return null;\n return rest;\n}\nconst execFileAsync = promisify(execFile);\nconst TOP_K_MAX = 500;\nfunction sanitizeWorkspaceParam(raw) {\n const s = raw?.trim();\n if (!s) return null;\n if (/^[a-z0-9_.-]+$/i.test(s)) return s;\n return null;\n}\nfunction sanitizeTopKParam(raw) {\n if (raw === null || raw === \"\") return 30;\n if (raw === \"none\" || raw === \"0\") return null;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1) return 30;\n return Math.min(Math.floor(n), TOP_K_MAX);\n}\nfunction expandHome(path) {\n if (path === \"~\") return homedir();\n if (path.startsWith(\"~/\")) return resolve(homedir(), path.slice(2));\n return path;\n}\nfunction candidateSqlitePaths() {\n return [\n private_env.GHOSTCRAB_PERSO_SQLITE_PATH,\n private_env.MCP_GHOSTCRAB_SQLITE_PATH,\n \"~/.ghostcrab/databases/ghostcrab.sqlite\",\n \"~/data/ghostcrab.sqlite\",\n \"~/.ghostcrab/ghostcrab.sqlite\",\n \"~/Library/Application Support/GhostCrab/ghostcrab.sqlite\",\n \"data/ghostcrab.sqlite\"\n ].map((p) => p?.trim()).filter((p) => Boolean(p)).map((p) => resolve(expandHome(p)));\n}\nfunction sqlitePath() {\n const configured = private_env.GHOSTCRAB_SQLITE_PATH?.trim();\n if (configured && configured !== \"auto\") return resolve(expandHome(configured));\n const candidates = candidateSqlitePaths();\n return candidates.find((p) => existsSync(p)) ?? candidates[candidates.length - 1];\n}\nlet repository = null;\nfunction getGraphRepository() {\n const path = sqlitePath();\n if (!repository || repository.path !== path) {\n repository?.close();\n repository = new SQLiteGraphRepository(path);\n }\n return repository;\n}\nfunction parseJsonObject(raw) {\n if (!raw) return {};\n try {\n const value = JSON.parse(raw);\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value;\n }\n } catch {\n }\n return {};\n}\nfunction placeholders(values) {\n return values.map((value) => sqlString(String(value))).join(\", \");\n}\nfunction sqlString(value) {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\nfunction sqlNullableEquals(column, value) {\n return value == null ? \"1=1\" : `${column} = ${sqlString(value)}`;\n}\nasync function queryJsonRows(dbPath, sql) {\n const { stdout } = await execFileAsync(\"sqlite3\", [\"-readonly\", \"-json\", dbPath, sql], {\n maxBuffer: 64 * 1024 * 1024\n });\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n const parsed = JSON.parse(trimmed);\n return Array.isArray(parsed) ? parsed : [];\n}\nclass SQLiteGraphRepository {\n constructor(path) {\n this.path = path;\n }\n path;\n close() {\n return;\n }\n async listWorkspaces() {\n const rows = await queryJsonRows(\n this.path,\n `\n\t\t\t\tWITH entity_counts AS (\n\t\t\t\t\tSELECT workspace_id, COUNT(*) AS entity_count\n\t\t\t\t\tFROM graph_entity\n\t\t\t\t\tWHERE deprecated_at IS NULL\n\t\t\t\t\tGROUP BY workspace_id\n\t\t\t\t)\n\t\t\t\tSELECT\n\t\t\t\t\tCOALESCE(w.workspace_id, w.id, e.workspace_id) AS id,\n\t\t\t\t\tCOALESCE(e.entity_count, 0) AS entityCount,\n\t\t\t\t\tw.label AS label\n\t\t\t\tFROM workspaces w\n\t\t\t\tLEFT JOIN entity_counts e\n\t\t\t\t\tON e.workspace_id = COALESCE(w.workspace_id, w.id)\n\t\t\t\tUNION\n\t\t\t\tSELECT e.workspace_id AS id, e.entity_count AS entityCount, NULL AS label\n\t\t\t\tFROM entity_counts e\n\t\t\t\tWHERE NOT EXISTS (\n\t\t\t\t\tSELECT 1 FROM workspaces w\n\t\t\t\t\tWHERE COALESCE(w.workspace_id, w.id) = e.workspace_id\n\t\t\t\t)\n\t\t\t\tORDER BY entityCount DESC, id\n\t\t\t\t`\n );\n return rows.map((r) => ({\n id: r.id,\n entityCount: Number(r.entityCount ?? 0),\n label: r.label\n }));\n }\n async listOntologyRows(workspace) {\n const rows = await queryJsonRows(\n this.path,\n `\n\t\t\t\tSELECT ('type:' || entity_type) AS id, COUNT(*) AS nodeCount\n\t\t\t\tFROM graph_entity\n\t\t\t\tWHERE deprecated_at IS NULL\n\t\t\t\t\tAND ${sqlNullableEquals(\"workspace_id\", workspace)}\n\t\t\t\tGROUP BY entity_type\n\t\t\t\tORDER BY nodeCount DESC, entity_type\n\t\t\t\t`\n );\n return rows.map((r) => ({ id: r.id, nodeCount: Number(r.nodeCount ?? 0) }));\n }\n async fetchGraph(args) {\n const entityType = graphEntityTypeFromOntology(args.ontology);\n const entityRows = await queryJsonRows(\n this.path,\n `\n\t\t\t\tSELECT\n\t\t\t\t\tCAST(e.entity_id AS TEXT) AS id,\n\t\t\t\t\te.name,\n\t\t\t\t\te.entity_type,\n\t\t\t\t\te.workspace_id,\n\t\t\t\t\te.metadata_json,\n\t\t\t\t\tNULL AS facet_json\n\t\t\t\tFROM graph_entity e\n\t\t\t\tWHERE e.deprecated_at IS NULL\n\t\t\t\t\tAND ${sqlNullableEquals(\"e.workspace_id\", args.workspace)}\n\t\t\t\t\tAND ${sqlNullableEquals(\"e.entity_type\", entityType)}\n\t\t\t\tORDER BY e.entity_type, e.name, e.entity_id\n\t\t\t\t`\n );\n const nodes = entityRows.map((r) => {\n const metadata = parseJsonObject(r.metadata_json);\n const facetJson = parseJsonObject(r.facet_json);\n return {\n id: String(r.id),\n label: r.name,\n node_type: r.entity_type,\n schema_id: r.entity_type,\n facets: {\n ...metadata,\n ...facetJson,\n workspace_id: r.workspace_id,\n record_id: String(facetJson.record_id ?? metadata.record_id ?? r.name),\n entity_type: r.entity_type\n }\n };\n });\n const edgeRows = await this.fetchEdgeRows(args);\n const liveNodeIds = new Set(nodes.map((n) => n.id));\n const edges = edgeRows.filter((e) => liveNodeIds.has(String(e.source)) && liveNodeIds.has(String(e.target))).map((e) => ({\n id: String(e.id),\n source: String(e.source),\n target: String(e.target),\n label: e.label,\n weight: e.weight == null ? null : Number(e.weight)\n }));\n return { nodes, edges, sourceUsed: \"graph\" };\n }\n async countGraph(args) {\n const entityType = graphEntityTypeFromOntology(args.ontology);\n const [nodeRow = { nodeCount: 0 }] = await queryJsonRows(\n this.path,\n `\n\t\t\t\tSELECT COUNT(*) AS nodeCount\n\t\t\t\tFROM graph_entity\n\t\t\t\tWHERE deprecated_at IS NULL\n\t\t\t\t\tAND ${sqlNullableEquals(\"workspace_id\", args.workspace)}\n\t\t\t\t\tAND ${sqlNullableEquals(\"entity_type\", entityType)}\n\t\t\t\t`\n );\n const edgeRows = await this.fetchEdgeRows(args);\n const topEdgeLabels = await this.topEdgeLabels(args);\n return {\n nodeCount: Number(nodeRow.nodeCount ?? 0),\n edgeCount: edgeRows.length,\n edgeCountCapped: false,\n topEdgeLabels,\n sourceUsed: \"graph\"\n };\n }\n async fetchEdgeRows(args) {\n const entityType = graphEntityTypeFromOntology(args.ontology);\n const labelFilter = args.edgeLabelAllowlist?.length ? `AND r.relation_type IN (${placeholders(args.edgeLabelAllowlist)})` : \"\";\n return queryJsonRows(\n this.path,\n `\n\t\t\t\tWITH ent AS (\n\t\t\t\t\tSELECT entity_id\n\t\t\t\t\tFROM graph_entity\n\t\t\t\t\tWHERE deprecated_at IS NULL\n\t\t\t\t\t\tAND ${sqlNullableEquals(\"workspace_id\", args.workspace)}\n\t\t\t\t\t\tAND ${sqlNullableEquals(\"entity_type\", entityType)}\n\t\t\t\t)\n\t\t\t\tSELECT id, source, target, label, weight\n\t\t\t\tFROM (\n\t\t\t\t\tSELECT\n\t\t\t\t\t\tCAST(r.relation_id AS TEXT) AS id,\n\t\t\t\t\t\tCAST(r.source_id AS TEXT) AS source,\n\t\t\t\t\t\tCAST(r.target_id AS TEXT) AS target,\n\t\t\t\t\t\tr.relation_type AS label,\n\t\t\t\t\t\tr.confidence AS weight,\n\t\t\t\t\t\tROW_NUMBER() OVER (\n\t\t\t\t\t\t\tPARTITION BY r.source_id\n\t\t\t\t\t\t\tORDER BY r.confidence DESC, r.relation_id\n\t\t\t\t\t\t) AS rn\n\t\t\t\t\tFROM graph_relation r\n\t\t\t\t\tINNER JOIN ent s ON s.entity_id = r.source_id\n\t\t\t\t\tINNER JOIN ent t ON t.entity_id = r.target_id\n\t\t\t\t\tWHERE r.deprecated_at IS NULL\n\t\t\t\t\t\tAND ${sqlNullableEquals(\"r.workspace_id\", args.workspace)}\n\t\t\t\t\t\t${labelFilter}\n\t\t\t\t)\n\t\t\t\t${args.topKEdgesPerNode == null ? \"\" : `WHERE rn <= ${args.topKEdgesPerNode}`}\n\t\t\t\tORDER BY source, target, id\n\t\t\t\t`\n );\n }\n async topEdgeLabels(args) {\n const labelFilter = args.edgeLabelAllowlist?.length ? `AND relation_type IN (${placeholders(args.edgeLabelAllowlist)})` : \"\";\n const rows = await queryJsonRows(\n this.path,\n `\n\t\t\t\tSELECT relation_type AS label, COUNT(*) AS count\n\t\t\t\tFROM graph_relation\n\t\t\t\tWHERE deprecated_at IS NULL\n\t\t\t\t\tAND ${sqlNullableEquals(\"workspace_id\", args.workspace)}\n\t\t\t\t\t${labelFilter}\n\t\t\t\tGROUP BY relation_type\n\t\t\t\tORDER BY count DESC, relation_type\n\t\t\t\tLIMIT 10\n\t\t\t\t`\n );\n return rows.map((r) => ({ label: r.label, count: Number(r.count ?? 0) }));\n }\n}\nexport {\n sanitizeTopKParam as a,\n sanitizeWorkspaceParam as b,\n sqlitePath as c,\n getGraphRepository as g,\n sanitizeOntologyParam as s\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ import { r as root } from './root.js-DCnlE3XY.js';
2
+
3
+ let read_implementation = null;
4
+ function set_read_implementation(fn) {
5
+ read_implementation = fn;
6
+ }
7
+ const options = {
8
+ app_template_contains_nonce: false,
9
+ async: false,
10
+ csp: { "mode": "auto", "directives": { "upgrade-insecure-requests": false, "block-all-mixed-content": false }, "reportOnly": { "upgrade-insecure-requests": false, "block-all-mixed-content": false } },
11
+ csrf_check_origin: true,
12
+ csrf_trusted_origins: [],
13
+ embedded: false,
14
+ env_public_prefix: "PUBLIC_",
15
+ env_private_prefix: "",
16
+ hash_routing: false,
17
+ hooks: null,
18
+ // added lazily, via `get_hooks`
19
+ preload_strategy: "modulepreload",
20
+ root,
21
+ service_worker: false,
22
+ service_worker_options: void 0,
23
+ server_error_boundaries: false,
24
+ templates: {
25
+ app: ({ head, body, assets, nonce, env }) => '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="utf-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1" />\n <meta name="text-scale" content="scale" />\n ' + head + '\n </head>\n <body data-sveltekit-preload-data="hover">\n <div style="display: contents">' + body + "</div>\n </body>\n</html>\n",
26
+ error: ({ status, message }) => '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="utf-8" />\n <title>' + message + `</title>
27
+
28
+ <style>
29
+ body {
30
+ --bg: white;
31
+ --fg: #222;
32
+ --divider: #ccc;
33
+ background: var(--bg);
34
+ color: var(--fg);
35
+ font-family:
36
+ system-ui,
37
+ -apple-system,
38
+ BlinkMacSystemFont,
39
+ 'Segoe UI',
40
+ Roboto,
41
+ Oxygen,
42
+ Ubuntu,
43
+ Cantarell,
44
+ 'Open Sans',
45
+ 'Helvetica Neue',
46
+ sans-serif;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ height: 100vh;
51
+ margin: 0;
52
+ }
53
+
54
+ .error {
55
+ display: flex;
56
+ align-items: center;
57
+ max-width: 32rem;
58
+ margin: 0 1rem;
59
+ }
60
+
61
+ .status {
62
+ font-weight: 200;
63
+ font-size: 3rem;
64
+ line-height: 1;
65
+ position: relative;
66
+ top: -0.05rem;
67
+ }
68
+
69
+ .message {
70
+ border-left: 1px solid var(--divider);
71
+ padding: 0 0 0 1rem;
72
+ margin: 0 0 0 1rem;
73
+ min-height: 2.5rem;
74
+ display: flex;
75
+ align-items: center;
76
+ }
77
+
78
+ .message h1 {
79
+ font-weight: 400;
80
+ font-size: 1em;
81
+ margin: 0;
82
+ }
83
+
84
+ @media (prefers-color-scheme: dark) {
85
+ body {
86
+ --bg: #222;
87
+ --fg: #ddd;
88
+ --divider: #666;
89
+ }
90
+ }
91
+ </style>
92
+ </head>
93
+ <body>
94
+ <div class="error">
95
+ <span class="status">` + status + '</span>\n <div class="message">\n <h1>' + message + "</h1>\n </div>\n </div>\n </body>\n</html>\n"
96
+ },
97
+ version_hash: "1i9q8jd"
98
+ };
99
+ async function get_hooks() {
100
+ let handle;
101
+ let handleFetch;
102
+ let handleError;
103
+ let handleValidationError;
104
+ let init;
105
+ let reroute;
106
+ let transport;
107
+ return {
108
+ handle,
109
+ handleFetch,
110
+ handleError,
111
+ handleValidationError,
112
+ init,
113
+ reroute,
114
+ transport
115
+ };
116
+ }
117
+
118
+ export { get_hooks as g, options as o, read_implementation as r, set_read_implementation as s };
119
+ //# sourceMappingURL=internal.js-D8EA_he2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js-D8EA_he2.js","sources":["../../../../.svelte-kit/output/server/chunks/internal.js"],"sourcesContent":["import { r as root } from \"./root.js\";\nimport \"./environment.js\";\nimport \"./shared-server.js\";\nlet read_implementation = null;\nfunction set_read_implementation(fn) {\n read_implementation = fn;\n}\nfunction set_manifest(_) {\n}\nconst options = {\n app_template_contains_nonce: false,\n async: false,\n csp: { \"mode\": \"auto\", \"directives\": { \"upgrade-insecure-requests\": false, \"block-all-mixed-content\": false }, \"reportOnly\": { \"upgrade-insecure-requests\": false, \"block-all-mixed-content\": false } },\n csrf_check_origin: true,\n csrf_trusted_origins: [],\n embedded: false,\n env_public_prefix: \"PUBLIC_\",\n env_private_prefix: \"\",\n hash_routing: false,\n hooks: null,\n // added lazily, via `get_hooks`\n preload_strategy: \"modulepreload\",\n root,\n service_worker: false,\n service_worker_options: void 0,\n server_error_boundaries: false,\n templates: {\n app: ({ head, body, assets, nonce, env }) => '<!doctype html>\\n<html lang=\"en\">\\n\t<head>\\n\t\t<meta charset=\"utf-8\" />\\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\\n\t\t<meta name=\"text-scale\" content=\"scale\" />\\n\t\t' + head + '\\n\t</head>\\n\t<body data-sveltekit-preload-data=\"hover\">\\n\t\t<div style=\"display: contents\">' + body + \"</div>\\n\t</body>\\n</html>\\n\",\n error: ({ status, message }) => '<!doctype html>\\n<html lang=\"en\">\\n\t<head>\\n\t\t<meta charset=\"utf-8\" />\\n\t\t<title>' + message + `</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">` + status + '</span>\\n\t\t\t<div class=\"message\">\\n\t\t\t\t<h1>' + message + \"</h1>\\n\t\t\t</div>\\n\t\t</div>\\n\t</body>\\n</html>\\n\"\n },\n version_hash: \"1i9q8jd\"\n};\nasync function get_hooks() {\n let handle;\n let handleFetch;\n let handleError;\n let handleValidationError;\n let init;\n let reroute;\n let transport;\n return {\n handle,\n handleFetch,\n handleError,\n handleValidationError,\n init,\n reroute,\n transport\n };\n}\nexport {\n set_manifest as a,\n get_hooks as g,\n options as o,\n read_implementation as r,\n set_read_implementation as s\n};\n"],"names":[],"mappings":";;AAGG,IAAC,mBAAmB,GAAG;AAC1B,SAAS,uBAAuB,CAAC,EAAE,EAAE;AACrC,EAAE,mBAAmB,GAAG,EAAE;AAC1B;AAGK,MAAC,OAAO,GAAG;AAChB,EAAE,2BAA2B,EAAE,KAAK;AACpC,EAAE,KAAK,EAAE,KAAK;AACd,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,2BAA2B,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,2BAA2B,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,EAAE;AACzM,EAAE,iBAAiB,EAAE,IAAI;AACzB,EAAE,oBAAoB,EAAE,EAAE;AAC1B,EAAE,QAAQ,EAAE,KAAK;AACjB,EAAE,iBAAiB,EAAE,SAAS;AAC9B,EAAE,kBAAkB,EAAE,EAAE;AACxB,EAAE,YAAY,EAAE,KAAK;AACrB,EAAE,KAAK,EAAE,IAAI;AACb;AACA,EAAE,gBAAgB,EAAE,eAAe;AACnC,EAAE,IAAI;AACN,EAAE,cAAc,EAAE,KAAK;AACvB,EAAE,sBAAsB,EAAE,MAAM;AAChC,EAAE,uBAAuB,EAAE,KAAK;AAChC,EAAE,SAAS,EAAE;AACb,IAAI,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,oMAAoM,GAAG,IAAI,GAAG,4FAA4F,GAAG,IAAI,GAAG,6BAA6B;AAClY,IAAI,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,mFAAmF,GAAG,OAAO,GAAG,CAAC;;AAErI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,CAAC,GAAG,MAAM,GAAG,6CAA6C,GAAG,OAAO,GAAG;AAC/F,GAAG;AACH,EAAE,YAAY,EAAE;AAChB;AACA,eAAe,SAAS,GAAG;AAC3B,EAAE,IAAI,MAAM;AACZ,EAAE,IAAI,WAAW;AACjB,EAAE,IAAI,WAAW;AACjB,EAAE,IAAI,qBAAqB;AAC3B,EAAE,IAAI,IAAI;AACV,EAAE,IAAI,OAAO;AACb,EAAE,IAAI,SAAS;AACf,EAAE,OAAO;AACT,IAAI,MAAM;AACV,IAAI,WAAW;AACf,IAAI,WAAW;AACf,IAAI,qBAAqB;AACzB,IAAI,IAAI;AACR,IAAI,OAAO;AACX,IAAI;AACJ,GAAG;AACH;;;;"}
@@ -0,0 +1,108 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { resolve, basename } from 'node:path';
4
+
5
+ const DEFAULT_BASE = "http://127.0.0.1:8091";
6
+ const TIMEOUT_MS = 15e3;
7
+ const RUNTIME_DIR = "data/runtime";
8
+ const DEFAULT_SQLITE_PATH = "data/immeuble-demo.sqlite";
9
+ function resolveDataSource() {
10
+ const raw = process.env.DATA_SOURCE?.trim().toLowerCase();
11
+ return raw === "sqlite-demo" ? "sqlite-demo" : "brain";
12
+ }
13
+ function mindbrainBaseUrl() {
14
+ return resolveMindbrainRuntime().baseUrl;
15
+ }
16
+ function runtimeSidecarPath(sqlitePath) {
17
+ const resolved = resolve(sqlitePath);
18
+ const hash = createHash("sha256").update(resolved).digest("hex").slice(0, 12);
19
+ const name = basename(resolved, ".sqlite").replace(/[^A-Za-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "") || "sqlite";
20
+ return resolve(process.cwd(), RUNTIME_DIR, `${name}-${hash}.backend.json`);
21
+ }
22
+ function configuredSqlitePath() {
23
+ const raw = process.env.GHOSTCRAB_SQLITE_PATH?.trim();
24
+ if (!raw || raw === "auto") return null;
25
+ return resolve(raw);
26
+ }
27
+ function resolveMindbrainRuntime() {
28
+ const envUrl = process.env.MINDBRAIN_HTTP_URL?.trim() || process.env.GHOSTCRAB_MINDBRAIN_URL?.trim();
29
+ if (envUrl) {
30
+ const runtimeSource = process.env.MINDBRAIN_RUNTIME_SOURCE?.trim();
31
+ if (runtimeSource === "runtime-json") {
32
+ const runtimePath2 = process.env.MINDBRAIN_RUNTIME_PATH?.trim();
33
+ const runtime2 = runtimePath2 ? readBackendRuntime(runtimePath2) : null;
34
+ return {
35
+ baseUrl: envUrl,
36
+ source: "runtime-json",
37
+ runtimePath: runtimePath2 || void 0,
38
+ sqlitePath: typeof runtime2?.sqlite_path === "string" ? runtime2.sqlite_path : void 0,
39
+ pid: typeof runtime2?.pid === "number" ? runtime2.pid : void 0,
40
+ port: typeof runtime2?.port === "number" ? runtime2.port : void 0
41
+ };
42
+ }
43
+ return { baseUrl: envUrl, source: "env" };
44
+ }
45
+ const sqlitePath = configuredSqlitePath() ?? resolve(process.cwd(), DEFAULT_SQLITE_PATH);
46
+ const runtimePath = runtimeSidecarPath(sqlitePath);
47
+ const runtime = readBackendRuntime(runtimePath);
48
+ if (runtime?.base_url && typeof runtime.base_url === "string") {
49
+ const runtimeSqlitePath = typeof runtime.sqlite_path === "string" ? runtime.sqlite_path : sqlitePath;
50
+ const pid = typeof runtime.pid === "number" ? runtime.pid : void 0;
51
+ const port = typeof runtime.port === "number" ? runtime.port : void 0;
52
+ return {
53
+ baseUrl: runtime.base_url,
54
+ source: "runtime-json",
55
+ runtimePath,
56
+ sqlitePath: runtimeSqlitePath,
57
+ pid,
58
+ port
59
+ };
60
+ }
61
+ return { baseUrl: DEFAULT_BASE, source: "default" };
62
+ }
63
+ function readBackendRuntime(runtimePath) {
64
+ if (!existsSync(runtimePath)) return null;
65
+ try {
66
+ const parsed = JSON.parse(readFileSync(runtimePath, "utf8"));
67
+ if (!parsed || typeof parsed !== "object") return null;
68
+ return parsed;
69
+ } catch {
70
+ return null;
71
+ }
72
+ }
73
+ function normalizeBrainPath(path) {
74
+ const clean = path.startsWith("/") ? path : `/${path}`;
75
+ return clean.startsWith("/api/mindbrain/") || clean === "/health" ? clean : `/api/mindbrain${clean}`;
76
+ }
77
+ function mindbrainUrl(path, search = "") {
78
+ return `${mindbrainBaseUrl()}${normalizeBrainPath(path)}${search}`;
79
+ }
80
+ async function brainFetch(path, init) {
81
+ const url = mindbrainUrl(path);
82
+ const controller = new AbortController();
83
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
84
+ try {
85
+ return await fetch(url, { ...init, signal: controller.signal });
86
+ } finally {
87
+ clearTimeout(timer);
88
+ }
89
+ }
90
+ async function brainHealth() {
91
+ try {
92
+ const res = await brainFetch("/health");
93
+ return res.ok;
94
+ } catch {
95
+ return false;
96
+ }
97
+ }
98
+ async function brainJson(path, init) {
99
+ const res = await brainFetch(path, init);
100
+ if (!res.ok) {
101
+ const text = await res.text().catch(() => res.statusText);
102
+ throw new Error(`${res.status} ${text}`);
103
+ }
104
+ return await res.json();
105
+ }
106
+
107
+ export { resolveMindbrainRuntime as a, brainHealth as b, brainJson as c, mindbrainUrl as m, resolveDataSource as r };
108
+ //# sourceMappingURL=mindbrainClient.js-BFAJqRSL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindbrainClient.js-BFAJqRSL.js","sources":["../../../../.svelte-kit/output/server/chunks/mindbrainClient.js"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve, basename } from \"node:path\";\nconst DEFAULT_BASE = \"http://127.0.0.1:8091\";\nconst TIMEOUT_MS = 15e3;\nconst RUNTIME_DIR = \"data/runtime\";\nconst DEFAULT_SQLITE_PATH = \"data/immeuble-demo.sqlite\";\nfunction resolveDataSource() {\n const raw = process.env.DATA_SOURCE?.trim().toLowerCase();\n return raw === \"sqlite-demo\" ? \"sqlite-demo\" : \"brain\";\n}\nfunction mindbrainBaseUrl() {\n return resolveMindbrainRuntime().baseUrl;\n}\nfunction runtimeSidecarPath(sqlitePath) {\n const resolved = resolve(sqlitePath);\n const hash = createHash(\"sha256\").update(resolved).digest(\"hex\").slice(0, 12);\n const name = basename(resolved, \".sqlite\").replace(/[^A-Za-z0-9_.-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"sqlite\";\n return resolve(process.cwd(), RUNTIME_DIR, `${name}-${hash}.backend.json`);\n}\nfunction configuredSqlitePath() {\n const raw = process.env.GHOSTCRAB_SQLITE_PATH?.trim();\n if (!raw || raw === \"auto\") return null;\n return resolve(raw);\n}\nfunction resolveMindbrainRuntime() {\n const envUrl = process.env.MINDBRAIN_HTTP_URL?.trim() || process.env.GHOSTCRAB_MINDBRAIN_URL?.trim();\n if (envUrl) {\n const runtimeSource = process.env.MINDBRAIN_RUNTIME_SOURCE?.trim();\n if (runtimeSource === \"runtime-json\") {\n const runtimePath2 = process.env.MINDBRAIN_RUNTIME_PATH?.trim();\n const runtime2 = runtimePath2 ? readBackendRuntime(runtimePath2) : null;\n return {\n baseUrl: envUrl,\n source: \"runtime-json\",\n runtimePath: runtimePath2 || void 0,\n sqlitePath: typeof runtime2?.sqlite_path === \"string\" ? runtime2.sqlite_path : void 0,\n pid: typeof runtime2?.pid === \"number\" ? runtime2.pid : void 0,\n port: typeof runtime2?.port === \"number\" ? runtime2.port : void 0\n };\n }\n return { baseUrl: envUrl, source: \"env\" };\n }\n const sqlitePath = configuredSqlitePath() ?? resolve(process.cwd(), DEFAULT_SQLITE_PATH);\n const runtimePath = runtimeSidecarPath(sqlitePath);\n const runtime = readBackendRuntime(runtimePath);\n if (runtime?.base_url && typeof runtime.base_url === \"string\") {\n const runtimeSqlitePath = typeof runtime.sqlite_path === \"string\" ? runtime.sqlite_path : sqlitePath;\n const pid = typeof runtime.pid === \"number\" ? runtime.pid : void 0;\n const port = typeof runtime.port === \"number\" ? runtime.port : void 0;\n return {\n baseUrl: runtime.base_url,\n source: \"runtime-json\",\n runtimePath,\n sqlitePath: runtimeSqlitePath,\n pid,\n port\n };\n }\n return { baseUrl: DEFAULT_BASE, source: \"default\" };\n}\nfunction readBackendRuntime(runtimePath) {\n if (!existsSync(runtimePath)) return null;\n try {\n const parsed = JSON.parse(readFileSync(runtimePath, \"utf8\"));\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\nfunction normalizeBrainPath(path) {\n const clean = path.startsWith(\"/\") ? path : `/${path}`;\n return clean.startsWith(\"/api/mindbrain/\") || clean === \"/health\" ? clean : `/api/mindbrain${clean}`;\n}\nfunction mindbrainUrl(path, search = \"\") {\n return `${mindbrainBaseUrl()}${normalizeBrainPath(path)}${search}`;\n}\nasync function brainFetch(path, init) {\n const url = mindbrainUrl(path);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\nasync function brainHealth() {\n try {\n const res = await brainFetch(\"/health\");\n return res.ok;\n } catch {\n return false;\n }\n}\nasync function brainJson(path, init) {\n const res = await brainFetch(path, init);\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`${res.status} ${text}`);\n }\n return await res.json();\n}\nexport {\n resolveMindbrainRuntime as a,\n brainHealth as b,\n brainJson as c,\n mindbrainUrl as m,\n resolveDataSource as r\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const ALL_ONTOLOGIES = "__all__";
2
+ function schemaOntologyKey(schemaId, workspaceId) {
3
+ const ontologyPrefix = `${workspaceId}::`;
4
+ if (schemaId.startsWith(ontologyPrefix)) {
5
+ return schemaId.slice(ontologyPrefix.length).split(":")[0] || "other";
6
+ }
7
+ const prefix = `${workspaceId}:`;
8
+ if (!schemaId.startsWith(prefix)) return "other";
9
+ return schemaId.slice(prefix.length).split(":")[0] || "other";
10
+ }
11
+
12
+ export { ALL_ONTOLOGIES as A, schemaOntologyKey as s };
13
+ //# sourceMappingURL=ontologyInspect.js-Dm3l7KgF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ontologyInspect.js-Dm3l7KgF.js","sources":["../../../../.svelte-kit/output/server/chunks/ontologyInspect.js"],"sourcesContent":["const ALL_ONTOLOGIES = \"__all__\";\nfunction schemaOntologyKey(schemaId, workspaceId) {\n const ontologyPrefix = `${workspaceId}::`;\n if (schemaId.startsWith(ontologyPrefix)) {\n return schemaId.slice(ontologyPrefix.length).split(\":\")[0] || \"other\";\n }\n const prefix = `${workspaceId}:`;\n if (!schemaId.startsWith(prefix)) return \"other\";\n return schemaId.slice(prefix.length).split(\":\")[0] || \"other\";\n}\nexport {\n ALL_ONTOLOGIES as A,\n schemaOntologyKey as s\n};\n"],"names":[],"mappings":"AAAK,MAAC,cAAc,GAAG;AACvB,SAAS,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE;AAClD,EAAE,MAAM,cAAc,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;AAC3C,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;AAC3C,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;AACzE,EAAE;AACF,EAAE,MAAM,MAAM,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AAClC,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,OAAO;AAClD,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;AAC/D;;;;"}