@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,891 @@
1
+ import { a2 as attr_class, a3 as ensure_array_like, a0 as escape_html, a4 as bind_props, T as derived, $ as attr, a5 as attr_style, a6 as element } from '../../chunks/renderer.js-DsOhU1UZ.js';
2
+ import '../../chunks/edgeLinkModes.js-CfRqrZtd.js';
3
+ import { A as ALL_ONTOLOGIES } from '../../chunks/ontologyInspect.js-Dm3l7KgF.js';
4
+ import '../../chunks/render-context.js-CTu5Wkzp.js';
5
+
6
+ const LAYOUT_TEMPLATES = [
7
+ { id: "circular_force", label: "Circular + ForceAtlas2 (default)" },
8
+ { id: "circular_only", label: "Circular ring only" },
9
+ { id: "random_force", label: "Random seed + ForceAtlas2" },
10
+ { id: "linlog_clusters", label: "ForceAtlas2 LinLog (clusters)" }
11
+ ];
12
+ const PLATFORM_HULL_DEPTH = 3;
13
+ const CHANTIER_WEEK_GRAPH_DEPTH = 2;
14
+ function GraphCanvas($$renderer, $$props) {
15
+ $$renderer.component(($$renderer2) => {
16
+ let {
17
+ ontologyKey = "all",
18
+ providerKey = null,
19
+ layoutTemplate = "circular_force",
20
+ dbKey = "default",
21
+ edgeLinkMode = "all",
22
+ expandHops = 0,
23
+ focusCompositionOnly = false,
24
+ graphSource = "auto",
25
+ workspaceId = null,
26
+ scenarioId = null,
27
+ topK = 30,
28
+ groupByDimension = null,
29
+ dataSource = "sqlite-demo",
30
+ brainSeedIds = [],
31
+ facetFilter = null,
32
+ legendBlocks = [],
33
+ onSelect
34
+ /** Native graph: extra hops beyond `type:*` seed (see /api/graph expandHops). */
35
+ /** Kept for compatibility with the original canvas props; SQLite light always returns `graph`. */
36
+ /** Native graph: `metadata->>'scenario_id'` subgraph + 1-hop expand; forces `source=graph` on fetch. */
37
+ /**
38
+ * Facet key to group nodes spatially before ForceAtlas2 (e.g. 'entity_layer', 'criticality').
39
+ * When set, cluster pre-layout replaces the normal seed; null = standard layout template.
40
+ */
41
+ } = $$props;
42
+ $$renderer2.push(`<div class="wrap svelte-11bec40"><div class="canvas svelte-11bec40" aria-label="Knowledge graph visualization"></div> `);
43
+ {
44
+ $$renderer2.push("<!--[-1-->");
45
+ }
46
+ $$renderer2.push(`<!--]--> `);
47
+ {
48
+ $$renderer2.push("<!--[-1-->");
49
+ }
50
+ $$renderer2.push(`<!--]--> `);
51
+ {
52
+ $$renderer2.push("<!--[-1-->");
53
+ }
54
+ $$renderer2.push(`<!--]--> `);
55
+ {
56
+ $$renderer2.push("<!--[0-->");
57
+ $$renderer2.push(`<div class="overlay svelte-11bec40">Loading graph…</div>`);
58
+ }
59
+ $$renderer2.push(`<!--]--> `);
60
+ {
61
+ $$renderer2.push("<!--[-1-->");
62
+ }
63
+ $$renderer2.push(`<!--]--> `);
64
+ {
65
+ $$renderer2.push("<!--[-1-->");
66
+ }
67
+ $$renderer2.push(`<!--]--></div>`);
68
+ bind_props($$props, { facetFilter, legendBlocks });
69
+ });
70
+ }
71
+ function SearchBar($$renderer, $$props) {
72
+ $$renderer.component(($$renderer2) => {
73
+ let mode = "graph";
74
+ let query = "";
75
+ let loading = false;
76
+ let results = [];
77
+ let focusedKey = "";
78
+ $$renderer2.push(`<section class="search svelte-yyldap" aria-label="Graph search"><form class="search-form svelte-yyldap">`);
79
+ $$renderer2.select(
80
+ { value: mode, "aria-label": "Search mode", class: "" },
81
+ ($$renderer3) => {
82
+ $$renderer3.option({ value: "graph" }, ($$renderer4) => {
83
+ $$renderer4.push(`Graph`);
84
+ });
85
+ $$renderer3.option({ value: "bm25" }, ($$renderer4) => {
86
+ $$renderer4.push(`BM25`);
87
+ });
88
+ },
89
+ "svelte-yyldap"
90
+ );
91
+ $$renderer2.push(` <input${attr("value", query)} placeholder="Search graph" aria-label="Search query" class="svelte-yyldap"/> <button type="submit"${attr("disabled", loading, true)} class="svelte-yyldap">${escape_html("Search")}</button></form></section> `);
92
+ {
93
+ $$renderer2.push("<!--[-1-->");
94
+ }
95
+ $$renderer2.push(`<!--]--> `);
96
+ if (results.length > 0) {
97
+ $$renderer2.push("<!--[0-->");
98
+ $$renderer2.push(`<div class="results svelte-yyldap"><!--[-->`);
99
+ const each_array = ensure_array_like(results.slice(0, 8));
100
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
101
+ let result = each_array[$$index];
102
+ $$renderer2.push(`<div${attr_class("result-wrap svelte-yyldap", void 0, { "focused": focusedKey === result.key })}><button type="button" class="result svelte-yyldap"${attr("disabled", result.entityId == null, true)}><span class="result-label svelte-yyldap">${escape_html(result.label)}</span> `);
103
+ if (result.subtitle) {
104
+ $$renderer2.push("<!--[0-->");
105
+ $$renderer2.push(`<span class="result-sub svelte-yyldap">${escape_html(result.subtitle)}</span>`);
106
+ } else {
107
+ $$renderer2.push("<!--[-1-->");
108
+ }
109
+ $$renderer2.push(`<!--]--></button> `);
110
+ if (focusedKey === result.key) {
111
+ $$renderer2.push("<!--[0-->");
112
+ $$renderer2.push(`<button type="button" class="clear-result svelte-yyldap"${attr("aria-label", `Clear search focus for ${result.label}`)} title="Clear search focus">×</button>`);
113
+ } else {
114
+ $$renderer2.push("<!--[-1-->");
115
+ }
116
+ $$renderer2.push(`<!--]--></div>`);
117
+ }
118
+ $$renderer2.push(`<!--]--></div>`);
119
+ } else {
120
+ $$renderer2.push("<!--[-1-->");
121
+ }
122
+ $$renderer2.push(`<!--]-->`);
123
+ });
124
+ }
125
+ function GraphLegend($$renderer, $$props) {
126
+ $$renderer.component(($$renderer2) => {
127
+ let {
128
+ legendBlocks = [],
129
+ facetFilter = null,
130
+ focusDepth = 2,
131
+ variant = "all"
132
+ } = $$props;
133
+ function isFacetBlock(block) {
134
+ return block.rows.some((row) => row.facetFilter);
135
+ }
136
+ const visibleBlocks = derived(() => variant === "all" ? legendBlocks : variant === "facets" ? legendBlocks.filter(isFacetBlock) : legendBlocks.filter((block) => !isFacetBlock(block)));
137
+ function facetFiltersEqual(a, b) {
138
+ if (a === b) return true;
139
+ if (!a || !b) return false;
140
+ if (a.kind !== b.kind) return false;
141
+ if (a.kind === "scalar" && b.kind === "scalar") {
142
+ return a.key === b.key && a.value === b.value;
143
+ }
144
+ if (a.kind === "platform_hull" && b.kind === "platform_hull") {
145
+ return a.platformId === b.platformId;
146
+ }
147
+ if (a.kind === "abstraction" && b.kind === "abstraction") {
148
+ return a.value === b.value;
149
+ }
150
+ if (a.kind === "chantier_week_neighborhood" && b.kind === "chantier_week_neighborhood") {
151
+ return a.week === b.week;
152
+ }
153
+ if (a.kind === "audit_phase_neighborhood" && b.kind === "audit_phase_neighborhood") {
154
+ return a.phase === b.phase;
155
+ }
156
+ return false;
157
+ }
158
+ function facetFilterLabel(f) {
159
+ if (f.kind === "scalar") return `${f.key} = ${f.value}`;
160
+ if (f.kind === "abstraction") return `abstraction = ${f.value}`;
161
+ if (f.kind === "chantier_week_neighborhood") {
162
+ return `week_number = ${f.week} (≤${CHANTIER_WEEK_GRAPH_DEPTH} hops)`;
163
+ }
164
+ if (f.kind === "audit_phase_neighborhood") return `audit_phase = ${f.phase}`;
165
+ return `hull = ${f.platformId}`;
166
+ }
167
+ function rowFacetActive(row) {
168
+ return !!(row.facetFilter && facetFiltersEqual(facetFilter, row.facetFilter));
169
+ }
170
+ let expandedBlocks = /* @__PURE__ */ new Set();
171
+ function blockKey(block) {
172
+ return block.title;
173
+ }
174
+ function isBlockExpanded(key) {
175
+ return expandedBlocks.has(key);
176
+ }
177
+ function blockHasActiveFilter(block) {
178
+ return block.rows.some((row) => rowFacetActive(row));
179
+ }
180
+ $$renderer2.push(`<div class="legend svelte-lmk6mp"${attr("aria-label", variant === "facets" ? "Graph facets" : "Graph legend")}>`);
181
+ if (variant === "all" || variant === "legend") {
182
+ $$renderer2.push("<!--[0-->");
183
+ $$renderer2.push(`<div class="legend-hint svelte-lmk6mp"><p class="legend-hint-line svelte-lmk6mp"><strong>Node</strong>: neighborhood ≤${escape_html(focusDepth)} hops · <strong>Background</strong>: reset selection</p> `);
184
+ if (variant === "all") {
185
+ $$renderer2.push("<!--[0-->");
186
+ $$renderer2.push(`<p class="legend-hint-line svelte-lmk6mp"><strong>Facet row</strong>: filter graph — chantier weeks use <code class="svelte-lmk6mp">week_number</code> + neighbors
187
+ ≤${escape_html(CHANTIER_WEEK_GRAPH_DEPTH)} hops; click the same row again to clear</p>`);
188
+ } else {
189
+ $$renderer2.push("<!--[-1-->");
190
+ }
191
+ $$renderer2.push(`<!--]--> <p class="legend-hint-line svelte-lmk6mp">`);
192
+ if (variant === "all") {
193
+ $$renderer2.push("<!--[0-->");
194
+ $$renderer2.push(`<strong>Ship</strong>: hull ≤${escape_html(PLATFORM_HULL_DEPTH)} hops ·`);
195
+ } else {
196
+ $$renderer2.push("<!--[-1-->");
197
+ }
198
+ $$renderer2.push(`<!--]--> <strong>Links</strong>: edge mode + composition when a node is focused</p></div>`);
199
+ } else {
200
+ $$renderer2.push("<!--[-1-->");
201
+ }
202
+ $$renderer2.push(`<!--]--> `);
203
+ if (variant === "all" || variant === "facets") {
204
+ $$renderer2.push("<!--[0-->");
205
+ if (variant === "facets") {
206
+ $$renderer2.push("<!--[0-->");
207
+ $$renderer2.push(`<div class="legend-hint svelte-lmk6mp"><p class="legend-hint-line svelte-lmk6mp"><strong>Facet row</strong>: filter graph — chantier weeks use <code class="svelte-lmk6mp">week_number</code> + neighbors
208
+ ≤${escape_html(CHANTIER_WEEK_GRAPH_DEPTH)} hops; click the same row again to clear</p> <p class="legend-hint-line svelte-lmk6mp"><strong>Ship</strong>: hull ≤${escape_html(PLATFORM_HULL_DEPTH)} hops</p></div>`);
209
+ } else {
210
+ $$renderer2.push("<!--[-1-->");
211
+ }
212
+ $$renderer2.push(`<!--]--> `);
213
+ if (facetFilter) {
214
+ $$renderer2.push("<!--[0-->");
215
+ $$renderer2.push(`<div class="legend-active svelte-lmk6mp" role="status" aria-label="Active facet filter"><span class="svelte-lmk6mp">Active filter</span> <strong class="svelte-lmk6mp">${escape_html(facetFilterLabel(facetFilter))}</strong> <button type="button" class="svelte-lmk6mp">clear</button></div>`);
216
+ } else {
217
+ $$renderer2.push("<!--[-1-->");
218
+ }
219
+ $$renderer2.push(`<!--]-->`);
220
+ } else {
221
+ $$renderer2.push("<!--[-1-->");
222
+ }
223
+ $$renderer2.push(`<!--]--> `);
224
+ if (visibleBlocks().length === 0) {
225
+ $$renderer2.push("<!--[0-->");
226
+ $$renderer2.push(`<p class="legend-empty svelte-lmk6mp">`);
227
+ if (variant === "facets") {
228
+ $$renderer2.push("<!--[0-->");
229
+ $$renderer2.push(`No facet dimensions in this graph.`);
230
+ } else if (variant === "legend") {
231
+ $$renderer2.push("<!--[1-->");
232
+ $$renderer2.push(`Load a graph to see ontology and relation colours.`);
233
+ } else {
234
+ $$renderer2.push("<!--[-1-->");
235
+ $$renderer2.push(`Load a graph to see ontology and relation facets.`);
236
+ }
237
+ $$renderer2.push(`<!--]--></p>`);
238
+ } else {
239
+ $$renderer2.push("<!--[-1-->");
240
+ $$renderer2.push(`<!--[-->`);
241
+ const each_array = ensure_array_like(visibleBlocks());
242
+ for (let $$index_1 = 0, $$length = each_array.length; $$index_1 < $$length; $$index_1++) {
243
+ let block = each_array[$$index_1];
244
+ $$renderer2.push(`<div class="legend-block svelte-lmk6mp"><button type="button"${attr_class("legend-block-toggle svelte-lmk6mp", void 0, { "legend-block-toggle--active": blockHasActiveFilter(block) })}${attr("aria-expanded", isBlockExpanded(blockKey(block)))}><span${attr_class("block-chevron svelte-lmk6mp", void 0, { "expanded": isBlockExpanded(blockKey(block)) })} aria-hidden="true">›</span> <span class="legend-block-title svelte-lmk6mp">${escape_html(block.title)}</span></button> `);
245
+ if (isBlockExpanded(blockKey(block))) {
246
+ $$renderer2.push("<!--[0-->");
247
+ $$renderer2.push(`<div class="legend-block-rows svelte-lmk6mp"><!--[-->`);
248
+ const each_array_1 = ensure_array_like(block.rows);
249
+ for (let $$index = 0, $$length2 = each_array_1.length; $$index < $$length2; $$index++) {
250
+ let row = each_array_1[$$index];
251
+ if (row.facetFilter) {
252
+ $$renderer2.push("<!--[0-->");
253
+ $$renderer2.push(`<button type="button"${attr_class("legend-row legend-row--clickable svelte-lmk6mp", void 0, { "legend-row--active": rowFacetActive(row) })}><span class="swatch svelte-lmk6mp"${attr_style("", { background: row.swatch })}></span> <span class="legend-label svelte-lmk6mp">${escape_html(row.label)}</span></button>`);
254
+ } else {
255
+ $$renderer2.push("<!--[-1-->");
256
+ $$renderer2.push(`<div class="legend-row svelte-lmk6mp"><span class="swatch svelte-lmk6mp"${attr_style("", { background: row.swatch })}></span> <span class="legend-label svelte-lmk6mp">${escape_html(row.label)}</span></div>`);
257
+ }
258
+ $$renderer2.push(`<!--]-->`);
259
+ }
260
+ $$renderer2.push(`<!--]--></div>`);
261
+ } else {
262
+ $$renderer2.push("<!--[-1-->");
263
+ }
264
+ $$renderer2.push(`<!--]--></div>`);
265
+ }
266
+ $$renderer2.push(`<!--]-->`);
267
+ }
268
+ $$renderer2.push(`<!--]--></div>`);
269
+ bind_props($$props, { facetFilter });
270
+ });
271
+ }
272
+ function InspectorPanel($$renderer, $$props) {
273
+ $$renderer.component(($$renderer2) => {
274
+ let {
275
+ selection = null,
276
+ ontologyId = "",
277
+ workspaceId = "",
278
+ onOpenType,
279
+ embedded = false
280
+ } = $$props;
281
+ element(
282
+ $$renderer2,
283
+ embedded ? "div" : "aside",
284
+ () => {
285
+ $$renderer2.push(`${attr_class("inspector svelte-k2kih7", void 0, { "embedded": embedded })}`);
286
+ },
287
+ () => {
288
+ if (!embedded) {
289
+ $$renderer2.push("<!--[0-->");
290
+ $$renderer2.push(`<h2 class="svelte-k2kih7">Inspector</h2>`);
291
+ } else {
292
+ $$renderer2.push("<!--[-1-->");
293
+ }
294
+ $$renderer2.push(`<!--]--> `);
295
+ if (!selection) {
296
+ $$renderer2.push("<!--[0-->");
297
+ $$renderer2.push(`<p class="muted svelte-k2kih7">Select a node or edge to inspect instance facts and ontology definition.</p>`);
298
+ } else {
299
+ $$renderer2.push("<!--[-1-->");
300
+ {
301
+ $$renderer2.push("<!--[-1-->");
302
+ }
303
+ $$renderer2.push(`<!--]--> `);
304
+ {
305
+ $$renderer2.push("<!--[-1-->");
306
+ }
307
+ $$renderer2.push(`<!--]--> `);
308
+ {
309
+ $$renderer2.push("<!--[-1-->");
310
+ }
311
+ $$renderer2.push(`<!--]--> `);
312
+ {
313
+ $$renderer2.push("<!--[-1-->");
314
+ }
315
+ $$renderer2.push(`<!--]--> <button type="button" class="toggle-raw svelte-k2kih7">${escape_html("Show raw JSON")}</button> `);
316
+ {
317
+ $$renderer2.push("<!--[-1-->");
318
+ }
319
+ $$renderer2.push(`<!--]-->`);
320
+ }
321
+ $$renderer2.push(`<!--]-->`);
322
+ }
323
+ );
324
+ bind_props($$props, { selection });
325
+ });
326
+ }
327
+ function InspectorColumn($$renderer, $$props) {
328
+ $$renderer.component(($$renderer2) => {
329
+ let {
330
+ open = false,
331
+ sections = {
332
+ search: true,
333
+ display: false,
334
+ facets: false,
335
+ legend: false,
336
+ selection: true
337
+ },
338
+ showGraphTools = false,
339
+ brainOnline = false,
340
+ selection = null,
341
+ ontologyId = "",
342
+ workspaceId = "",
343
+ onOpenType,
344
+ ontologyKey = "all",
345
+ layoutTemplate = "circular_force",
346
+ edgeLinkMode = "all",
347
+ topK = "30",
348
+ ontologies = [],
349
+ ontologyLabel,
350
+ onOntologyChange,
351
+ filterEntityType,
352
+ onSeeds,
353
+ legendBlocks = [],
354
+ facetFilter = null
355
+ } = $$props;
356
+ let $$settled = true;
357
+ let $$inner_renderer;
358
+ function $$render_inner($$renderer3) {
359
+ $$renderer3.push(`<aside${attr_class("shell svelte-9xspyz", void 0, { "open": open })} aria-label="Inspector sidebar"><button type="button"${attr_class("rail svelte-9xspyz", void 0, { "active": open })}${attr("aria-expanded", open)} aria-controls="inspector-panel"><span class="rail-label svelte-9xspyz">Inspector</span> <span class="rail-chevron svelte-9xspyz" aria-hidden="true">${escape_html(open ? "▸" : "◂")}</span></button> `);
360
+ if (open) {
361
+ $$renderer3.push("<!--[0-->");
362
+ $$renderer3.push(`<div id="inspector-panel" class="panel svelte-9xspyz"><div class="sections svelte-9xspyz"><div class="sections-upper svelte-9xspyz">`);
363
+ if (showGraphTools && brainOnline) {
364
+ $$renderer3.push("<!--[0-->");
365
+ $$renderer3.push(`<section class="collapsible svelte-9xspyz"><button type="button" class="section-toggle svelte-9xspyz"><span${attr_class("chevron svelte-9xspyz", void 0, { "expanded": sections.search })} aria-hidden="true">›</span> Search</button> `);
366
+ if (sections.search) {
367
+ $$renderer3.push("<!--[0-->");
368
+ $$renderer3.push(`<div class="section-body svelte-9xspyz">`);
369
+ SearchBar($$renderer3, {
370
+ workspaceId: workspaceId.trim() || "default",
371
+ entityType: filterEntityType?.() ?? null
372
+ });
373
+ $$renderer3.push(`<!----></div>`);
374
+ } else {
375
+ $$renderer3.push("<!--[-1-->");
376
+ }
377
+ $$renderer3.push(`<!--]--></section> <section class="collapsible svelte-9xspyz"><button type="button" class="section-toggle svelte-9xspyz"><span${attr_class("chevron svelte-9xspyz", void 0, { "expanded": sections.display })} aria-hidden="true">›</span> Display</button> `);
378
+ if (sections.display) {
379
+ $$renderer3.push("<!--[0-->");
380
+ $$renderer3.push(`<div class="section-body display-fields svelte-9xspyz"><label class="field svelte-9xspyz"><span class="field-label svelte-9xspyz">Filter type</span> `);
381
+ $$renderer3.select(
382
+ {
383
+ class: "select",
384
+ value: ontologyKey,
385
+ onchange: onOntologyChange,
386
+ "aria-label": "Filter type"
387
+ },
388
+ ($$renderer4) => {
389
+ $$renderer4.option({ value: "all" }, ($$renderer5) => {
390
+ $$renderer5.push(`${escape_html(ontologyLabel?.("all") ?? "All entity types")}`);
391
+ });
392
+ $$renderer4.push(`<!--[-->`);
393
+ const each_array = ensure_array_like(ontologies);
394
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
395
+ let o = each_array[$$index];
396
+ $$renderer4.option({ value: o.id }, ($$renderer5) => {
397
+ $$renderer5.push(`${escape_html(ontologyLabel?.(o.id) ?? o.id)} (${escape_html(o.nodeCount)})`);
398
+ });
399
+ }
400
+ $$renderer4.push(`<!--]-->`);
401
+ },
402
+ "svelte-9xspyz"
403
+ );
404
+ $$renderer3.push(`</label> <label class="field svelte-9xspyz"><span class="field-label svelte-9xspyz">Layout</span> `);
405
+ $$renderer3.select(
406
+ {
407
+ class: "select",
408
+ value: layoutTemplate,
409
+ "aria-label": "Graph layout template"
410
+ },
411
+ ($$renderer4) => {
412
+ $$renderer4.push(`<!--[-->`);
413
+ const each_array_1 = ensure_array_like(LAYOUT_TEMPLATES);
414
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
415
+ let t = each_array_1[$$index_1];
416
+ $$renderer4.option({ value: t.id }, ($$renderer5) => {
417
+ $$renderer5.push(`${escape_html(t.label)}`);
418
+ });
419
+ }
420
+ $$renderer4.push(`<!--]-->`);
421
+ },
422
+ "svelte-9xspyz"
423
+ );
424
+ $$renderer3.push(`</label> <label class="field svelte-9xspyz"><span class="field-label svelte-9xspyz">Links</span> `);
425
+ $$renderer3.select(
426
+ {
427
+ class: "select",
428
+ value: edgeLinkMode,
429
+ "aria-label": "Edge link semantics"
430
+ },
431
+ ($$renderer4) => {
432
+ $$renderer4.option({ value: "all" }, ($$renderer5) => {
433
+ $$renderer5.push(`All edge types`);
434
+ });
435
+ $$renderer4.option({ value: "composition" }, ($$renderer5) => {
436
+ $$renderer5.push(`Composition`);
437
+ });
438
+ $$renderer4.option({ value: "discovery" }, ($$renderer5) => {
439
+ $$renderer5.push(`Discovery`);
440
+ });
441
+ },
442
+ "svelte-9xspyz"
443
+ );
444
+ $$renderer3.push(`</label> <label class="field svelte-9xspyz"><span class="field-label svelte-9xspyz">TopK</span> `);
445
+ $$renderer3.select(
446
+ {
447
+ class: "select",
448
+ value: topK,
449
+ "aria-label": "Maximum links per source node"
450
+ },
451
+ ($$renderer4) => {
452
+ $$renderer4.option({ value: "10" }, ($$renderer5) => {
453
+ $$renderer5.push(`10 per source`);
454
+ });
455
+ $$renderer4.option({ value: "30" }, ($$renderer5) => {
456
+ $$renderer5.push(`30 per source`);
457
+ });
458
+ $$renderer4.option({ value: "100" }, ($$renderer5) => {
459
+ $$renderer5.push(`100 per source`);
460
+ });
461
+ $$renderer4.option({ value: "none" }, ($$renderer5) => {
462
+ $$renderer5.push(`All links`);
463
+ });
464
+ },
465
+ "svelte-9xspyz"
466
+ );
467
+ $$renderer3.push(`</label></div>`);
468
+ } else {
469
+ $$renderer3.push("<!--[-1-->");
470
+ }
471
+ $$renderer3.push(`<!--]--></section> <section class="collapsible svelte-9xspyz"><button type="button" class="section-toggle svelte-9xspyz"><span${attr_class("chevron svelte-9xspyz", void 0, { "expanded": sections.legend })} aria-hidden="true">›</span> Legend</button> `);
472
+ if (sections.legend) {
473
+ $$renderer3.push("<!--[0-->");
474
+ $$renderer3.push(`<div class="section-body svelte-9xspyz">`);
475
+ GraphLegend($$renderer3, {
476
+ legendBlocks,
477
+ variant: "legend",
478
+ get facetFilter() {
479
+ return facetFilter;
480
+ },
481
+ set facetFilter($$value) {
482
+ facetFilter = $$value;
483
+ $$settled = false;
484
+ }
485
+ });
486
+ $$renderer3.push(`<!----></div>`);
487
+ } else {
488
+ $$renderer3.push("<!--[-1-->");
489
+ }
490
+ $$renderer3.push(`<!--]--></section>`);
491
+ } else {
492
+ $$renderer3.push("<!--[-1-->");
493
+ }
494
+ $$renderer3.push(`<!--]--> <section class="collapsible svelte-9xspyz"><button type="button" class="section-toggle svelte-9xspyz"><span${attr_class("chevron svelte-9xspyz", void 0, { "expanded": sections.selection })} aria-hidden="true">›</span> Selection</button> `);
495
+ if (sections.selection) {
496
+ $$renderer3.push("<!--[0-->");
497
+ $$renderer3.push(`<div class="section-body selection-body svelte-9xspyz">`);
498
+ InspectorPanel($$renderer3, {
499
+ embedded: true,
500
+ ontologyId,
501
+ workspaceId,
502
+ onOpenType,
503
+ get selection() {
504
+ return selection;
505
+ },
506
+ set selection($$value) {
507
+ selection = $$value;
508
+ $$settled = false;
509
+ }
510
+ });
511
+ $$renderer3.push(`<!----></div>`);
512
+ } else {
513
+ $$renderer3.push("<!--[-1-->");
514
+ }
515
+ $$renderer3.push(`<!--]--></section></div> `);
516
+ if (showGraphTools && brainOnline) {
517
+ $$renderer3.push("<!--[0-->");
518
+ $$renderer3.push(`<section${attr_class("collapsible collapsible-grow svelte-9xspyz", void 0, { "expanded": sections.facets })}><button type="button" class="section-toggle svelte-9xspyz"><span${attr_class("chevron svelte-9xspyz", void 0, { "expanded": sections.facets })} aria-hidden="true">›</span> Facets</button> `);
519
+ if (sections.facets) {
520
+ $$renderer3.push("<!--[0-->");
521
+ $$renderer3.push(`<div class="section-body grow-body svelte-9xspyz">`);
522
+ GraphLegend($$renderer3, {
523
+ legendBlocks,
524
+ variant: "facets",
525
+ get facetFilter() {
526
+ return facetFilter;
527
+ },
528
+ set facetFilter($$value) {
529
+ facetFilter = $$value;
530
+ $$settled = false;
531
+ }
532
+ });
533
+ $$renderer3.push(`<!----></div>`);
534
+ } else {
535
+ $$renderer3.push("<!--[-1-->");
536
+ }
537
+ $$renderer3.push(`<!--]--></section>`);
538
+ } else {
539
+ $$renderer3.push("<!--[-1-->");
540
+ }
541
+ $$renderer3.push(`<!--]--></div></div>`);
542
+ } else {
543
+ $$renderer3.push("<!--[-1-->");
544
+ }
545
+ $$renderer3.push(`<!--]--></aside>`);
546
+ }
547
+ do {
548
+ $$settled = true;
549
+ $$inner_renderer = $$renderer2.copy();
550
+ $$render_inner($$inner_renderer);
551
+ } while (!$$settled);
552
+ $$renderer2.subsume($$inner_renderer);
553
+ bind_props($$props, {
554
+ open,
555
+ sections,
556
+ selection,
557
+ ontologyKey,
558
+ layoutTemplate,
559
+ edgeLinkMode,
560
+ topK,
561
+ facetFilter
562
+ });
563
+ });
564
+ }
565
+ function _page($$renderer, $$props) {
566
+ $$renderer.component(($$renderer2) => {
567
+ let activeTab = "donnees";
568
+ let ontologyKey = "all";
569
+ let layoutTemplate = "circular_force";
570
+ let edgeLinkMode = "all";
571
+ let workspaceId = "";
572
+ let ontologyId = "";
573
+ let topK = "30";
574
+ let graphWorkspaces = [];
575
+ let ontologies = [];
576
+ let brainOntologies = [];
577
+ let ontologiesError = null;
578
+ let brainOnline = null;
579
+ let dataSource = "brain";
580
+ let inspectorSelection = null;
581
+ let brainSeedIds = [];
582
+ let inspectorOpen = false;
583
+ let inspectorSections = {
584
+ search: true,
585
+ display: false,
586
+ facets: false,
587
+ legend: false,
588
+ selection: true
589
+ };
590
+ let graphFacetFilter = null;
591
+ let graphLegendBlocks = [];
592
+ let effectiveTopK = derived(() => topK === "none" ? null : Number(topK));
593
+ let effectiveGraphDataSource = derived(() => workspaceId.trim() === "immeuble-demo" ? "sqlite-demo" : dataSource);
594
+ let effectiveInspectorOntologyId = derived(() => {
595
+ const sel = inspectorSelection;
596
+ if (sel?.kind === "ontology" && sel.payload?.ontology_id) {
597
+ return String(sel.payload.ontology_id);
598
+ }
599
+ return ontologyId === ALL_ONTOLOGIES ? "" : ontologyId;
600
+ });
601
+ async function loadOntologies() {
602
+ ontologiesError = null;
603
+ try {
604
+ const q = new URLSearchParams();
605
+ if (workspaceId) q.set("workspace", workspaceId);
606
+ const r = await fetch(`/api/graph/ontologies?${q}`);
607
+ if (!r.ok) throw new Error(r.statusText);
608
+ const d = await r.json();
609
+ ontologies = d.ontologies ?? [];
610
+ graphWorkspaces = d.graphWorkspaces ?? [];
611
+ if (workspaceId && !graphWorkspaces.some((w) => w.id === workspaceId)) {
612
+ workspaceId = "";
613
+ }
614
+ if (ontologyKey !== "all" && !ontologies.some((o) => o.id === ontologyKey)) {
615
+ ontologyKey = "all";
616
+ }
617
+ } catch (e) {
618
+ ontologiesError = e instanceof Error ? e.message : String(e);
619
+ }
620
+ }
621
+ function onWorkspaceChange(ev) {
622
+ const el = ev.currentTarget;
623
+ workspaceId = el.value;
624
+ ontologyKey = "all";
625
+ brainSeedIds = [];
626
+ inspectorSelection = null;
627
+ {
628
+ void loadOntologies();
629
+ }
630
+ }
631
+ function onOntologyChange(ev) {
632
+ const el = ev.currentTarget;
633
+ ontologyKey = el.value;
634
+ }
635
+ function onBrainOntologyChange(ev) {
636
+ const el = ev.currentTarget;
637
+ ontologyId = el.value;
638
+ }
639
+ function ontologyLabel(id) {
640
+ if (id === "all") return "All entity types";
641
+ const known = ontologies.find((o) => o.id === id);
642
+ if (known?.label) return known.label;
643
+ if (id.toLowerCase().startsWith("type:")) return id.slice(5);
644
+ return id;
645
+ }
646
+ function filterEntityType() {
647
+ if (ontologyKey === "all") return null;
648
+ return ontologyLabel(ontologyKey);
649
+ }
650
+ function focusInspectorSelection(next) {
651
+ inspectorSelection = next;
652
+ inspectorOpen = true;
653
+ if (next) {
654
+ inspectorSections = { ...inspectorSections, selection: true };
655
+ }
656
+ }
657
+ function openTypeInModele(typeName, nodeKind) {
658
+ activeTab = "modele";
659
+ focusInspectorSelection({ kind: "ontology", nodeKind, typeName });
660
+ }
661
+ let $$settled = true;
662
+ let $$inner_renderer;
663
+ function $$render_inner($$renderer3) {
664
+ $$renderer3.push(`<main class="page svelte-1uha8ag"><header class="bar svelte-1uha8ag"><div class="bar-top svelte-1uha8ag"><div class="title-block svelte-1uha8ag"><h1 class="svelte-1uha8ag">GhostCrab Graph Explorer</h1> <span class="hint svelte-1uha8ag"><span${attr_class("health-badge svelte-1uha8ag", void 0, {
665
+ "online": brainOnline === true,
666
+ "offline": brainOnline === false,
667
+ "demo": dataSource === "sqlite-demo"
668
+ })}></span> `);
669
+ {
670
+ $$renderer3.push("<!--[-1-->");
671
+ $$renderer3.push(`Brain offline · demo fallback recommended`);
672
+ }
673
+ $$renderer3.push(`<!--]--></span></div> <div class="tabs svelte-1uha8ag"><button${attr_class("svelte-1uha8ag", void 0, { "active": activeTab === "modele" })}>Modèle</button> <button${attr_class("svelte-1uha8ag", void 0, { "active": activeTab === "donnees" })}>Données</button> <button${attr_class("svelte-1uha8ag", void 0, { "active": activeTab === "projections" })}>Projections</button> <button${attr_class("svelte-1uha8ag", void 0, { "active": activeTab === "rules" })}>Rules</button></div> <div class="controls svelte-1uha8ag"><label class="field field-workspace svelte-1uha8ag"><span class="field-label svelte-1uha8ag">Workspace</span> `);
674
+ $$renderer3.select(
675
+ {
676
+ class: "select",
677
+ value: workspaceId,
678
+ onchange: onWorkspaceChange,
679
+ "aria-label": "Workspace"
680
+ },
681
+ ($$renderer4) => {
682
+ {
683
+ $$renderer4.push("<!--[0-->");
684
+ $$renderer4.option({ value: "" }, ($$renderer5) => {
685
+ $$renderer5.push(`All workspaces`);
686
+ });
687
+ }
688
+ $$renderer4.push(`<!--]--><!--[-->`);
689
+ const each_array = ensure_array_like(graphWorkspaces);
690
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
691
+ let w = each_array[$$index];
692
+ $$renderer4.option({ value: w.id }, ($$renderer5) => {
693
+ $$renderer5.push(`${escape_html(w.label ? `${w.label} · ${w.id}` : w.id)} (${escape_html(w.entityCount)})`);
694
+ });
695
+ }
696
+ $$renderer4.push(`<!--]-->`);
697
+ },
698
+ "svelte-1uha8ag"
699
+ );
700
+ $$renderer3.push(`</label> `);
701
+ if (activeTab === "modele") {
702
+ $$renderer3.push("<!--[0-->");
703
+ $$renderer3.push(`<label class="field svelte-1uha8ag"><span class="field-label svelte-1uha8ag">Ontology</span> `);
704
+ $$renderer3.select(
705
+ {
706
+ class: "select",
707
+ value: ontologyId,
708
+ onchange: onBrainOntologyChange,
709
+ "aria-label": "Ontology model"
710
+ },
711
+ ($$renderer4) => {
712
+ if (brainOntologies.length > 1) {
713
+ $$renderer4.push("<!--[0-->");
714
+ $$renderer4.option({ value: ALL_ONTOLOGIES }, ($$renderer5) => {
715
+ $$renderer5.push(`Tous · ${escape_html(brainOntologies.length)} ontologies`);
716
+ });
717
+ } else {
718
+ $$renderer4.push("<!--[-1-->");
719
+ }
720
+ $$renderer4.push(`<!--]--><!--[-->`);
721
+ const each_array_1 = ensure_array_like(brainOntologies);
722
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
723
+ let o = each_array_1[$$index_1];
724
+ $$renderer4.option({ value: o.ontology_id }, ($$renderer5) => {
725
+ $$renderer5.push(`${escape_html(o.name)} · ${escape_html(o.ontology_id)}`);
726
+ });
727
+ }
728
+ $$renderer4.push(`<!--]-->`);
729
+ },
730
+ "svelte-1uha8ag"
731
+ );
732
+ $$renderer3.push(`</label>`);
733
+ } else {
734
+ $$renderer3.push("<!--[-1-->");
735
+ }
736
+ $$renderer3.push(`<!--]--></div></div> `);
737
+ if (ontologiesError) {
738
+ $$renderer3.push("<!--[0-->");
739
+ $$renderer3.push(`<p class="ontologies-warn svelte-1uha8ag" role="status">Ontology list unavailable: ${escape_html(ontologiesError)}</p>`);
740
+ } else {
741
+ $$renderer3.push("<!--[-1-->");
742
+ }
743
+ $$renderer3.push(`<!--]--></header> <div${attr_class("workspace svelte-1uha8ag", void 0, {
744
+ "with-inspector": activeTab !== "projections" && activeTab !== "rules"
745
+ })}><div class="stage svelte-1uha8ag">`);
746
+ if (activeTab === "modele") {
747
+ $$renderer3.push("<!--[0-->");
748
+ {
749
+ $$renderer3.push("<!--[-1-->");
750
+ $$renderer3.push(`<p class="panel-message svelte-1uha8ag">Modèle view requires MindBrain online.</p>`);
751
+ }
752
+ $$renderer3.push(`<!--]-->`);
753
+ } else if (activeTab === "donnees") {
754
+ $$renderer3.push("<!--[1-->");
755
+ $$renderer3.push(`<div class="donnees-stage svelte-1uha8ag">`);
756
+ GraphCanvas($$renderer3, {
757
+ ontologyKey,
758
+ layoutTemplate,
759
+ edgeLinkMode,
760
+ workspaceId: workspaceId.trim() || "default",
761
+ topK: effectiveTopK(),
762
+ dataSource: effectiveGraphDataSource(),
763
+ brainSeedIds,
764
+ onSelect: (selection) => {
765
+ focusInspectorSelection(selection);
766
+ },
767
+ get facetFilter() {
768
+ return graphFacetFilter;
769
+ },
770
+ set facetFilter($$value) {
771
+ graphFacetFilter = $$value;
772
+ $$settled = false;
773
+ },
774
+ get legendBlocks() {
775
+ return graphLegendBlocks;
776
+ },
777
+ set legendBlocks($$value) {
778
+ graphLegendBlocks = $$value;
779
+ $$settled = false;
780
+ }
781
+ });
782
+ $$renderer3.push(`<!----> `);
783
+ {
784
+ $$renderer3.push("<!--[-1-->");
785
+ }
786
+ $$renderer3.push(`<!--]--></div>`);
787
+ } else if (activeTab === "projections") {
788
+ $$renderer3.push("<!--[2-->");
789
+ {
790
+ $$renderer3.push("<!--[0-->");
791
+ $$renderer3.push(`<p class="panel-message svelte-1uha8ag">Projections require MindBrain online (brain mode).</p>`);
792
+ }
793
+ $$renderer3.push(`<!--]-->`);
794
+ } else {
795
+ $$renderer3.push("<!--[-1-->");
796
+ {
797
+ $$renderer3.push("<!--[0-->");
798
+ $$renderer3.push(`<p class="panel-message svelte-1uha8ag">Rules require MindBrain online (brain mode).</p>`);
799
+ }
800
+ $$renderer3.push(`<!--]-->`);
801
+ }
802
+ $$renderer3.push(`<!--]--></div> `);
803
+ if (activeTab !== "projections" && activeTab !== "rules") {
804
+ $$renderer3.push("<!--[0-->");
805
+ InspectorColumn($$renderer3, {
806
+ showGraphTools: activeTab === "donnees" && dataSource === "brain" && brainOnline === true,
807
+ brainOnline: brainOnline === true,
808
+ ontologyId: effectiveInspectorOntologyId(),
809
+ workspaceId: workspaceId.trim(),
810
+ onOpenType: openTypeInModele,
811
+ ontologies,
812
+ ontologyLabel,
813
+ onOntologyChange,
814
+ filterEntityType,
815
+ onSeeds: (ids) => {
816
+ brainSeedIds = ids;
817
+ },
818
+ legendBlocks: graphLegendBlocks,
819
+ get open() {
820
+ return inspectorOpen;
821
+ },
822
+ set open($$value) {
823
+ inspectorOpen = $$value;
824
+ $$settled = false;
825
+ },
826
+ get sections() {
827
+ return inspectorSections;
828
+ },
829
+ set sections($$value) {
830
+ inspectorSections = $$value;
831
+ $$settled = false;
832
+ },
833
+ get selection() {
834
+ return inspectorSelection;
835
+ },
836
+ set selection($$value) {
837
+ inspectorSelection = $$value;
838
+ $$settled = false;
839
+ },
840
+ get ontologyKey() {
841
+ return ontologyKey;
842
+ },
843
+ set ontologyKey($$value) {
844
+ ontologyKey = $$value;
845
+ $$settled = false;
846
+ },
847
+ get layoutTemplate() {
848
+ return layoutTemplate;
849
+ },
850
+ set layoutTemplate($$value) {
851
+ layoutTemplate = $$value;
852
+ $$settled = false;
853
+ },
854
+ get edgeLinkMode() {
855
+ return edgeLinkMode;
856
+ },
857
+ set edgeLinkMode($$value) {
858
+ edgeLinkMode = $$value;
859
+ $$settled = false;
860
+ },
861
+ get topK() {
862
+ return topK;
863
+ },
864
+ set topK($$value) {
865
+ topK = $$value;
866
+ $$settled = false;
867
+ },
868
+ get facetFilter() {
869
+ return graphFacetFilter;
870
+ },
871
+ set facetFilter($$value) {
872
+ graphFacetFilter = $$value;
873
+ $$settled = false;
874
+ }
875
+ });
876
+ } else {
877
+ $$renderer3.push("<!--[-1-->");
878
+ }
879
+ $$renderer3.push(`<!--]--></div></main>`);
880
+ }
881
+ do {
882
+ $$settled = true;
883
+ $$inner_renderer = $$renderer2.copy();
884
+ $$render_inner($$inner_renderer);
885
+ } while (!$$settled);
886
+ $$renderer2.subsume($$inner_renderer);
887
+ });
888
+ }
889
+
890
+ export { _page as default };
891
+ //# sourceMappingURL=_page.svelte.js-DMEbD3K6.js.map