@creezio/shell-ui 0.22.0

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 (232) hide show
  1. package/README.md +336 -0
  2. package/dist/adapters/nav-shell.d.ts +54 -0
  3. package/dist/adapters/nav-shell.d.ts.map +1 -0
  4. package/dist/adapters/nav-shell.js +112 -0
  5. package/dist/adapters/nav-shell.js.map +1 -0
  6. package/dist/brand.d.ts +64 -0
  7. package/dist/brand.d.ts.map +1 -0
  8. package/dist/brand.js +59 -0
  9. package/dist/brand.js.map +1 -0
  10. package/dist/core-nav.d.ts +17 -0
  11. package/dist/core-nav.d.ts.map +1 -0
  12. package/dist/core-nav.js +40 -0
  13. package/dist/core-nav.js.map +1 -0
  14. package/dist/index.d.ts +29 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +24 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/api-scopes.d.ts +24 -0
  19. package/dist/lib/api-scopes.d.ts.map +1 -0
  20. package/dist/lib/api-scopes.js +78 -0
  21. package/dist/lib/api-scopes.js.map +1 -0
  22. package/dist/lib/catalog-suspense-key.d.ts +3 -0
  23. package/dist/lib/catalog-suspense-key.d.ts.map +1 -0
  24. package/dist/lib/catalog-suspense-key.js +12 -0
  25. package/dist/lib/catalog-suspense-key.js.map +1 -0
  26. package/dist/lib/data-changed.d.ts +51 -0
  27. package/dist/lib/data-changed.d.ts.map +1 -0
  28. package/dist/lib/data-changed.js +227 -0
  29. package/dist/lib/data-changed.js.map +1 -0
  30. package/dist/lib/desktop-home-path.d.ts +14 -0
  31. package/dist/lib/desktop-home-path.d.ts.map +1 -0
  32. package/dist/lib/desktop-home-path.js +29 -0
  33. package/dist/lib/desktop-home-path.js.map +1 -0
  34. package/dist/lib/geo-distance.d.ts +6 -0
  35. package/dist/lib/geo-distance.d.ts.map +1 -0
  36. package/dist/lib/geo-distance.js +27 -0
  37. package/dist/lib/geo-distance.js.map +1 -0
  38. package/dist/lib/img.d.ts +2 -0
  39. package/dist/lib/img.d.ts.map +1 -0
  40. package/dist/lib/img.js +40 -0
  41. package/dist/lib/img.js.map +1 -0
  42. package/dist/lib/keepalive-eviction.d.ts +14 -0
  43. package/dist/lib/keepalive-eviction.d.ts.map +1 -0
  44. package/dist/lib/keepalive-eviction.js +44 -0
  45. package/dist/lib/keepalive-eviction.js.map +1 -0
  46. package/dist/lib/ops-track.d.ts +29 -0
  47. package/dist/lib/ops-track.d.ts.map +1 -0
  48. package/dist/lib/ops-track.js +37 -0
  49. package/dist/lib/ops-track.js.map +1 -0
  50. package/dist/lib/optimize-cover-url.d.ts +10 -0
  51. package/dist/lib/optimize-cover-url.d.ts.map +1 -0
  52. package/dist/lib/optimize-cover-url.js +80 -0
  53. package/dist/lib/optimize-cover-url.js.map +1 -0
  54. package/dist/lib/page-trails.d.ts +9 -0
  55. package/dist/lib/page-trails.d.ts.map +1 -0
  56. package/dist/lib/page-trails.js +20 -0
  57. package/dist/lib/page-trails.js.map +1 -0
  58. package/dist/lib/public-origin.d.ts +32 -0
  59. package/dist/lib/public-origin.d.ts.map +1 -0
  60. package/dist/lib/public-origin.js +125 -0
  61. package/dist/lib/public-origin.js.map +1 -0
  62. package/dist/lib/server-incident.d.ts +12 -0
  63. package/dist/lib/server-incident.d.ts.map +1 -0
  64. package/dist/lib/server-incident.js +72 -0
  65. package/dist/lib/server-incident.js.map +1 -0
  66. package/dist/lib/tab-document-url.d.ts +13 -0
  67. package/dist/lib/tab-document-url.d.ts.map +1 -0
  68. package/dist/lib/tab-document-url.js +60 -0
  69. package/dist/lib/tab-document-url.js.map +1 -0
  70. package/dist/lib/utils.d.ts +20 -0
  71. package/dist/lib/utils.d.ts.map +1 -0
  72. package/dist/lib/utils.js +87 -0
  73. package/dist/lib/utils.js.map +1 -0
  74. package/dist/nav-catalog.d.ts +97 -0
  75. package/dist/nav-catalog.d.ts.map +1 -0
  76. package/dist/nav-catalog.js +282 -0
  77. package/dist/nav-catalog.js.map +1 -0
  78. package/dist/registry.d.ts +11 -0
  79. package/dist/registry.d.ts.map +1 -0
  80. package/dist/registry.js +60 -0
  81. package/dist/registry.js.map +1 -0
  82. package/dist/types.d.ts +22 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +2 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist-cjs/adapters/nav-shell.js +115 -0
  87. package/dist-cjs/adapters/nav-shell.js.map +1 -0
  88. package/dist-cjs/brand.js +66 -0
  89. package/dist-cjs/brand.js.map +1 -0
  90. package/dist-cjs/core-nav.js +43 -0
  91. package/dist-cjs/core-nav.js.map +1 -0
  92. package/dist-cjs/index.js +95 -0
  93. package/dist-cjs/index.js.map +1 -0
  94. package/dist-cjs/lib/api-scopes.js +86 -0
  95. package/dist-cjs/lib/api-scopes.js.map +1 -0
  96. package/dist-cjs/lib/catalog-suspense-key.js +15 -0
  97. package/dist-cjs/lib/catalog-suspense-key.js.map +1 -0
  98. package/dist-cjs/lib/data-changed.js +236 -0
  99. package/dist-cjs/lib/data-changed.js.map +1 -0
  100. package/dist-cjs/lib/desktop-home-path.js +34 -0
  101. package/dist-cjs/lib/desktop-home-path.js.map +1 -0
  102. package/dist-cjs/lib/geo-distance.js +30 -0
  103. package/dist-cjs/lib/geo-distance.js.map +1 -0
  104. package/dist-cjs/lib/img.js +43 -0
  105. package/dist-cjs/lib/img.js.map +1 -0
  106. package/dist-cjs/lib/keepalive-eviction.js +49 -0
  107. package/dist-cjs/lib/keepalive-eviction.js.map +1 -0
  108. package/dist-cjs/lib/ops-track.js +41 -0
  109. package/dist-cjs/lib/ops-track.js.map +1 -0
  110. package/dist-cjs/lib/optimize-cover-url.js +83 -0
  111. package/dist-cjs/lib/optimize-cover-url.js.map +1 -0
  112. package/dist-cjs/lib/page-trails.js +25 -0
  113. package/dist-cjs/lib/page-trails.js.map +1 -0
  114. package/dist-cjs/lib/public-origin.js +130 -0
  115. package/dist-cjs/lib/public-origin.js.map +1 -0
  116. package/dist-cjs/lib/server-incident.js +75 -0
  117. package/dist-cjs/lib/server-incident.js.map +1 -0
  118. package/dist-cjs/lib/tab-document-url.js +65 -0
  119. package/dist-cjs/lib/tab-document-url.js.map +1 -0
  120. package/dist-cjs/lib/utils.js +97 -0
  121. package/dist-cjs/lib/utils.js.map +1 -0
  122. package/dist-cjs/nav-catalog.js +293 -0
  123. package/dist-cjs/nav-catalog.js.map +1 -0
  124. package/dist-cjs/package.json +3 -0
  125. package/dist-cjs/registry.js +64 -0
  126. package/dist-cjs/registry.js.map +1 -0
  127. package/dist-cjs/types.js +3 -0
  128. package/dist-cjs/types.js.map +1 -0
  129. package/package.json +163 -0
  130. package/ui/app-error-boundary.tsx +59 -0
  131. package/ui/data-table.tsx +121 -0
  132. package/ui/desktop/auth-window-chrome.tsx +51 -0
  133. package/ui/desktop/desktop-bridge.tsx +87 -0
  134. package/ui/desktop/external-site-slot.tsx +313 -0
  135. package/ui/desktop/external-site-surface.ts +58 -0
  136. package/ui/desktop/site-link.tsx +105 -0
  137. package/ui/desktop/window-chrome-controls.tsx +5 -0
  138. package/ui/desktop-types.ts +30 -0
  139. package/ui/faceted-filters.tsx +119 -0
  140. package/ui/global-search-host.ts +20 -0
  141. package/ui/global-search.tsx +66 -0
  142. package/ui/index.ts +178 -0
  143. package/ui/kit.ts +30 -0
  144. package/ui/layout/app-shell.tsx +58 -0
  145. package/ui/layout/desktop-update-banner.tsx +100 -0
  146. package/ui/layout/entity-header.tsx +44 -0
  147. package/ui/layout/native-os-nav.ts +104 -0
  148. package/ui/layout/nav-catalog-loader.tsx +98 -0
  149. package/ui/layout/nav-icons.ts +67 -0
  150. package/ui/layout/page-chrome.tsx +90 -0
  151. package/ui/layout/page-toolbar-context.tsx +82 -0
  152. package/ui/layout/sandbox-banner.tsx +38 -0
  153. package/ui/layout/section-view-shell.tsx +73 -0
  154. package/ui/layout/sidebar-host.ts +144 -0
  155. package/ui/layout/sidebar.tsx +1150 -0
  156. package/ui/lib/ai-screencast-hub.ts +127 -0
  157. package/ui/lib/ai-workspace-client.ts +46 -0
  158. package/ui/lib/aid.ts +22 -0
  159. package/ui/lib/desktop-host.ts +114 -0
  160. package/ui/lib/fleet-tracker-client.ts +237 -0
  161. package/ui/lib/hermes-ui.ts +114 -0
  162. package/ui/lib/n8n-ui.ts +115 -0
  163. package/ui/lib/use-creezio-resource.tsx +121 -0
  164. package/ui/lib/use-shell-ui-brand.ts +22 -0
  165. package/ui/list-toolbar.tsx +309 -0
  166. package/ui/os-pages/desktop-settings-page.tsx +158 -0
  167. package/ui/os-pages/index.ts +8 -0
  168. package/ui/page-loading/entity-page-loading.tsx +59 -0
  169. package/ui/page-loading/list-page-loading.tsx +61 -0
  170. package/ui/pagination.tsx +56 -0
  171. package/ui/primitives/avatar.tsx +33 -0
  172. package/ui/primitives/badge.tsx +36 -0
  173. package/ui/primitives/breadcrumb.tsx +93 -0
  174. package/ui/primitives/button.tsx +44 -0
  175. package/ui/primitives/card.tsx +44 -0
  176. package/ui/primitives/chart.tsx +317 -0
  177. package/ui/primitives/command.tsx +111 -0
  178. package/ui/primitives/dialog.tsx +100 -0
  179. package/ui/primitives/dropdown-menu.tsx +187 -0
  180. package/ui/primitives/input.tsx +19 -0
  181. package/ui/primitives/label.tsx +17 -0
  182. package/ui/primitives/resizable.tsx +45 -0
  183. package/ui/primitives/scroll-area.tsx +41 -0
  184. package/ui/primitives/select.tsx +73 -0
  185. package/ui/primitives/separator.tsx +26 -0
  186. package/ui/primitives/sheet.tsx +90 -0
  187. package/ui/primitives/skeleton.tsx +7 -0
  188. package/ui/primitives/sonner.tsx +22 -0
  189. package/ui/primitives/tabs.tsx +51 -0
  190. package/ui/primitives/textarea.tsx +22 -0
  191. package/ui/primitives/tooltip.tsx +31 -0
  192. package/ui/pwa/client-error-reporter.tsx +62 -0
  193. package/ui/pwa/register-sw.tsx +50 -0
  194. package/ui/range-filters.tsx +174 -0
  195. package/ui/search/global-search-config.ts +32 -0
  196. package/ui/search/global-search-provider.tsx +528 -0
  197. package/ui/search/search-history.ts +74 -0
  198. package/ui/search-input.tsx +146 -0
  199. package/ui/settings/account-settings.tsx +140 -0
  200. package/ui/settings/agent-profile-settings.tsx +184 -0
  201. package/ui/settings/api-keys-settings.tsx +349 -0
  202. package/ui/settings/desktop-background-settings.tsx +128 -0
  203. package/ui/settings/desktop-connection-settings.tsx +251 -0
  204. package/ui/settings/desktop-embed-env-panel.tsx +257 -0
  205. package/ui/settings/desktop-fleet-telemetry-settings.tsx +269 -0
  206. package/ui/settings/desktop-hermes-settings.tsx +341 -0
  207. package/ui/settings/desktop-llm-keys.tsx +192 -0
  208. package/ui/settings/desktop-n8n-settings.tsx +306 -0
  209. package/ui/settings/desktop-tunnel.tsx +264 -0
  210. package/ui/settings/desktop-update-settings.tsx +175 -0
  211. package/ui/settings/factory-reset-settings.tsx +89 -0
  212. package/ui/settings/host-only-settings.tsx +62 -0
  213. package/ui/settings/locked-config-field.tsx +30 -0
  214. package/ui/settings/ops-diagnostic-settings.tsx +242 -0
  215. package/ui/settings/search-reindex-settings.tsx +158 -0
  216. package/ui/settings/server-mode-cards.tsx +801 -0
  217. package/ui/theme/tailwind-preset.cjs +82 -0
  218. package/ui/theme/theme.css +328 -0
  219. package/ui/workspace/ai-activity-panel-host.tsx +19 -0
  220. package/ui/workspace/ai-workspace-agent-host.tsx +54 -0
  221. package/ui/workspace/ai-workspace-banner.tsx +168 -0
  222. package/ui/workspace/impersonation-banner.tsx +39 -0
  223. package/ui/workspace/keep-alive.tsx +220 -0
  224. package/ui/workspace/tab-workspace-context.tsx +1172 -0
  225. package/ui/workspace/tab-workspace-host.ts +89 -0
  226. package/ui/workspace/types.ts +500 -0
  227. package/ui/workspace/use-location-search.tsx +50 -0
  228. package/ui/workspace/window-chrome-controls.tsx +116 -0
  229. package/ui/workspace/workspace-config.ts +47 -0
  230. package/ui/workspace/workspace-root.tsx +147 -0
  231. package/ui/workspace/workspace-shell.tsx +292 -0
  232. package/ui/workspace/workspace-tab-bar.tsx +572 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Entrées nav natives Creezio — aucune entrée métier marque
3
+ * (panier, dispatch, GED, RTI…).
4
+ *
5
+ * Liste historique (home / assistant / setup / login / about…) consommée
6
+ * par `createNavShellAdapter` — **pas** la sidebar CRM. La sidebar OS
7
+ * primaire (taches, mails, granola, grokbot…) vit dans le catalogue
8
+ * `defaultOsCatalogEntries()` / `registerOsNavEntry`
9
+ * (`nav-catalog.ts`, plan `docs/plans/PLAN-NAV-CATALOG.md`). Ne pas
10
+ * recopier granola/grokbot ici pour « aligner » : Phase D dérivera
11
+ * `CORE_NAV_ITEMS` du catalogue, ou documentera l'écart à vie.
12
+ */
13
+ export const CORE_NAV_ITEMS = [
14
+ { id: "core.home", label: "Accueil", href: "/", group: "core" },
15
+ { id: "core.settings", label: "Réglages", href: "/settings", group: "core" },
16
+ {
17
+ id: "core.assistant",
18
+ label: "Assistant",
19
+ href: "/assistant",
20
+ group: "core",
21
+ },
22
+ { id: "core.tasks", label: "Tâches", href: "/taches", group: "core" },
23
+ { id: "core.mails", label: "Mails", href: "/mails", group: "core" },
24
+ { id: "core.granola", label: "Granola", href: "/granola", group: "core" },
25
+ { id: "core.grokbot", label: "GrokBot", href: "/grokbot", group: "core" },
26
+ { id: "core.setup", label: "Setup", href: "/setup", group: "core" },
27
+ { id: "core.login", label: "Login", href: "/login", group: "core" },
28
+ {
29
+ id: "core.developers",
30
+ label: "Developers",
31
+ href: "/developers",
32
+ group: "core",
33
+ },
34
+ { id: "core.about", label: "À propos", href: "/about", group: "core" },
35
+ ];
36
+ /** Alias factory / demobrand. */
37
+ export const coreNavItems = CORE_NAV_ITEMS.map((i) => ({
38
+ ...i,
39
+ }));
40
+ //# sourceMappingURL=core-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-nav.js","sourceRoot":"","sources":["../src/core-nav.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/D,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;IAC5E;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,MAAM;KACd;IACD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;IACrE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACzE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACzE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,MAAM;KACd;IACD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;CAC9D,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAkB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC;CACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @creezio/shell-ui — nav + slots (H1.4 / I7) + libs plateforme (O9).
3
+ * UI React : `@creezio/shell-ui/ui`.
4
+ */
5
+ export type { CoreNavItem, NavItem, NavSlot, NavSlotId } from "./types.js";
6
+ export { CORE_NAV_ITEMS, coreNavItems } from "./core-nav.js";
7
+ export type { NavCatalogEntry, NavCatalogError, NavCatalogFeatures, NavCatalogGroup, NavCatalogSessionItem, NavCatalogSource, NavIconName, NavOverride, ResolveNavCatalogInput, ResolveNavCatalogResult, } from "./nav-catalog.js";
8
+ export { NAV_ICON_ALLOWLIST, defaultOsCatalogEntries, isKnownNavIcon, listOsNavEntries, parseNavCatalogSessionItems, registerDefaultOsNavEntries, registerOsNavEntry, resetOsNavRegistryForTests, resolveNavCatalog, } from "./nav-catalog.js";
9
+ export type { NavRegistry } from "./registry.js";
10
+ export { createNavRegistry, mergeNav } from "./registry.js";
11
+ export type { CreateNavShellAdapterOptions, NavRenderGroup, NavRenderItem, NavRenderModel, NavShellAdapter, } from "./adapters/nav-shell.js";
12
+ export { createNavShellAdapter } from "./adapters/nav-shell.js";
13
+ export type { ShellUiBrand, ShellUiLoginBrand } from "./brand.js";
14
+ export { configureShellUiBrand, getShellUiBrand, getShellDesktopApi, resetShellUiBrandForTests, subscribeShellUiBrand, } from "./brand.js";
15
+ export { API_SCOPE_FULL, API_SCOPE_CRM_READ, API_SCOPE_CRM_WRITE, API_SCOPE_TASKS_RUN, normalizeApiScopes, parseApiKeyScopes, apiKeyAllowsMethod, apiKeyAllowsTasks, scopesFromPluginPermissions, } from "./lib/api-scopes.js";
16
+ export { cn, formatDate, formatDateTime, formatMoney, parsePage, formatVariationPct, formatDeltaMoney, variationTone, } from "./lib/utils.js";
17
+ export { resolvePublicOrigin, resolveCookieSecure, isLoopbackHost, type HeaderReader, type ResolvedOrigin, } from "./lib/public-origin.js";
18
+ export { trailForRequestLogs, trailForAnalytics, trailForLoading, type TrailCrumb, } from "./lib/page-trails.js";
19
+ export { trackServer, trackServerDebounced, type ServerOpsLevel, type ServerOpsEvent, } from "./lib/ops-track.js";
20
+ export { reportServerIncident } from "./lib/server-incident.js";
21
+ export { haversineKm } from "./lib/geo-distance.js";
22
+ export { thumbUrl } from "./lib/img.js";
23
+ export { optimizeCoverUrl } from "./lib/optimize-cover-url.js";
24
+ export { buildCatalogSuspenseKey } from "./lib/catalog-suspense-key.js";
25
+ export { normalizeTabDocumentUrl, isSameTabDocument, isSameTabOrigin, } from "./lib/tab-document-url.js";
26
+ export { CRM_HOME_PATH, SERVER_COCKPIT_PATH, defaultHomePathSync, resolveDesktopHomePath, } from "./lib/desktop-home-path.js";
27
+ export { isKeepAliveProtectedKey, rankKeepAliveEvictionKeys, configureKeepAliveFullscreenMatchers, } from "./lib/keepalive-eviction.js";
28
+ export { CREEZIO_DATA_CHANGED_EVENT, CREEZIO_DATA_CHANGED_HEADER, emitDataChanged, subscribeDataChanged, parseDataChangedHeader, inferResourceFromToolName, installCreezioDataChangedFetch, resetDataChangedFetchForTests, type CreezioDataChangedDetail, } from "./lib/data-changed.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EACV,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EACV,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,EAAE,EACF,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,oCAAoC,GACrC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @creezio/shell-ui — nav + slots (H1.4 / I7) + libs plateforme (O9).
3
+ * UI React : `@creezio/shell-ui/ui`.
4
+ */
5
+ export { CORE_NAV_ITEMS, coreNavItems } from "./core-nav.js";
6
+ export { NAV_ICON_ALLOWLIST, defaultOsCatalogEntries, isKnownNavIcon, listOsNavEntries, parseNavCatalogSessionItems, registerDefaultOsNavEntries, registerOsNavEntry, resetOsNavRegistryForTests, resolveNavCatalog, } from "./nav-catalog.js";
7
+ export { createNavRegistry, mergeNav } from "./registry.js";
8
+ export { createNavShellAdapter } from "./adapters/nav-shell.js";
9
+ export { configureShellUiBrand, getShellUiBrand, getShellDesktopApi, resetShellUiBrandForTests, subscribeShellUiBrand, } from "./brand.js";
10
+ export { API_SCOPE_FULL, API_SCOPE_CRM_READ, API_SCOPE_CRM_WRITE, API_SCOPE_TASKS_RUN, normalizeApiScopes, parseApiKeyScopes, apiKeyAllowsMethod, apiKeyAllowsTasks, scopesFromPluginPermissions, } from "./lib/api-scopes.js";
11
+ export { cn, formatDate, formatDateTime, formatMoney, parsePage, formatVariationPct, formatDeltaMoney, variationTone, } from "./lib/utils.js";
12
+ export { resolvePublicOrigin, resolveCookieSecure, isLoopbackHost, } from "./lib/public-origin.js";
13
+ export { trailForRequestLogs, trailForAnalytics, trailForLoading, } from "./lib/page-trails.js";
14
+ export { trackServer, trackServerDebounced, } from "./lib/ops-track.js";
15
+ export { reportServerIncident } from "./lib/server-incident.js";
16
+ export { haversineKm } from "./lib/geo-distance.js";
17
+ export { thumbUrl } from "./lib/img.js";
18
+ export { optimizeCoverUrl } from "./lib/optimize-cover-url.js";
19
+ export { buildCatalogSuspenseKey } from "./lib/catalog-suspense-key.js";
20
+ export { normalizeTabDocumentUrl, isSameTabDocument, isSameTabOrigin, } from "./lib/tab-document-url.js";
21
+ export { CRM_HOME_PATH, SERVER_COCKPIT_PATH, defaultHomePathSync, resolveDesktopHomePath, } from "./lib/desktop-home-path.js";
22
+ export { isKeepAliveProtectedKey, rankKeepAliveEvictionKeys, configureKeepAliveFullscreenMatchers, } from "./lib/keepalive-eviction.js";
23
+ export { CREEZIO_DATA_CHANGED_EVENT, CREEZIO_DATA_CHANGED_HEADER, emitDataChanged, subscribeDataChanged, parseDataChangedHeader, inferResourceFromToolName, installCreezioDataChangedFetch, resetDataChangedFetchForTests, } from "./lib/data-changed.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAa7D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQ5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,EAAE,EACF,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,oBAAoB,GAGrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,oCAAoC,GACrC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Scopes des clés API publiques (`api_keys.scopes`).
3
+ *
4
+ * - `full` : accès intégration complet (Hermes, clés UI)
5
+ * - `crm:read` : GET/HEAD/OPTIONS uniquement
6
+ * - `crm:write` : lectures + mutations (implique read)
7
+ *
8
+ * Stockage : chaîne CSV (`crm:read,crm:write`) ou `full`.
9
+ */
10
+ export declare const API_SCOPE_FULL = "full";
11
+ export declare const API_SCOPE_CRM_READ = "crm:read";
12
+ export declare const API_SCOPE_CRM_WRITE = "crm:write";
13
+ /** Lancer / suivre des tâches de collaborateurs IA (/api/v1/tasks). */
14
+ export declare const API_SCOPE_TASKS_RUN = "tasks:run";
15
+ /** Normalise vers CSV canonique (write ⇒ read ; full gagne). */
16
+ export declare function normalizeApiScopes(scopes: string | string[] | undefined | null): string;
17
+ export declare function parseApiKeyScopes(scopes: string): Set<string>;
18
+ /** true si la clé peut exécuter la méthode HTTP sur les routes d’intégration. */
19
+ export declare function apiKeyAllowsMethod(scopes: string, method: string): boolean;
20
+ /** true si la clé peut lancer / suivre des tâches IA (/api/v1/tasks). */
21
+ export declare function apiKeyAllowsTasks(scopes: string): boolean;
22
+ /** Dérive les scopes DB depuis les permissions manifest plugin. */
23
+ export declare function scopesFromPluginPermissions(permissions: string[]): string | null;
24
+ //# sourceMappingURL=api-scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-scopes.d.ts","sourceRoot":"","sources":["../../src/lib/api-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAS/C,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAC3C,MAAM,CAkBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAI7D;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,mEAAmE;AACnE,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAShF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Scopes des clés API publiques (`api_keys.scopes`).
3
+ *
4
+ * - `full` : accès intégration complet (Hermes, clés UI)
5
+ * - `crm:read` : GET/HEAD/OPTIONS uniquement
6
+ * - `crm:write` : lectures + mutations (implique read)
7
+ *
8
+ * Stockage : chaîne CSV (`crm:read,crm:write`) ou `full`.
9
+ */
10
+ export const API_SCOPE_FULL = "full";
11
+ export const API_SCOPE_CRM_READ = "crm:read";
12
+ export const API_SCOPE_CRM_WRITE = "crm:write";
13
+ /** Lancer / suivre des tâches de collaborateurs IA (/api/v1/tasks). */
14
+ export const API_SCOPE_TASKS_RUN = "tasks:run";
15
+ const KNOWN = new Set([
16
+ API_SCOPE_FULL,
17
+ API_SCOPE_CRM_READ,
18
+ API_SCOPE_CRM_WRITE,
19
+ API_SCOPE_TASKS_RUN,
20
+ ]);
21
+ /** Normalise vers CSV canonique (write ⇒ read ; full gagne). */
22
+ export function normalizeApiScopes(scopes) {
23
+ if (scopes == null || scopes === "")
24
+ return API_SCOPE_FULL;
25
+ const list = Array.isArray(scopes)
26
+ ? scopes.map(String)
27
+ : String(scopes)
28
+ .split(/[,\s]+/)
29
+ .map((s) => s.trim())
30
+ .filter(Boolean);
31
+ if (list.includes(API_SCOPE_FULL) || list.includes("*")) {
32
+ return API_SCOPE_FULL;
33
+ }
34
+ const out = new Set();
35
+ for (const s of list) {
36
+ if (KNOWN.has(s) && s !== API_SCOPE_FULL)
37
+ out.add(s);
38
+ }
39
+ if (out.has(API_SCOPE_CRM_WRITE))
40
+ out.add(API_SCOPE_CRM_READ);
41
+ if (!out.size)
42
+ return API_SCOPE_FULL;
43
+ return Array.from(out).sort().join(",");
44
+ }
45
+ export function parseApiKeyScopes(scopes) {
46
+ const n = normalizeApiScopes(scopes);
47
+ if (n === API_SCOPE_FULL)
48
+ return new Set([API_SCOPE_FULL]);
49
+ return new Set(n.split(",").filter(Boolean));
50
+ }
51
+ /** true si la clé peut exécuter la méthode HTTP sur les routes d’intégration. */
52
+ export function apiKeyAllowsMethod(scopes, method) {
53
+ const s = parseApiKeyScopes(scopes);
54
+ if (s.has(API_SCOPE_FULL))
55
+ return true;
56
+ const m = method.toUpperCase();
57
+ if (m === "GET" || m === "HEAD" || m === "OPTIONS") {
58
+ return s.has(API_SCOPE_CRM_READ) || s.has(API_SCOPE_CRM_WRITE);
59
+ }
60
+ return s.has(API_SCOPE_CRM_WRITE);
61
+ }
62
+ /** true si la clé peut lancer / suivre des tâches IA (/api/v1/tasks). */
63
+ export function apiKeyAllowsTasks(scopes) {
64
+ const s = parseApiKeyScopes(scopes);
65
+ return s.has(API_SCOPE_FULL) || s.has(API_SCOPE_TASKS_RUN);
66
+ }
67
+ /** Dérive les scopes DB depuis les permissions manifest plugin. */
68
+ export function scopesFromPluginPermissions(permissions) {
69
+ const perms = new Set(permissions.map(String));
70
+ if (perms.has("crm:write")) {
71
+ return normalizeApiScopes([API_SCOPE_CRM_READ, API_SCOPE_CRM_WRITE]);
72
+ }
73
+ if (perms.has("crm:read")) {
74
+ return API_SCOPE_CRM_READ;
75
+ }
76
+ return null;
77
+ }
78
+ //# sourceMappingURL=api-scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-scopes.js","sourceRoot":"","sources":["../../src/lib/api-scopes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Clé Suspense stable — inclut la vue + filtres actifs (sans recréer page par page). */
2
+ export declare function buildCatalogSuspenseKey(sp: Record<string, string | undefined> | undefined, resolveView: (raw: string | undefined) => string, filterKeys: readonly string[]): string;
3
+ //# sourceMappingURL=catalog-suspense-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-suspense-key.d.ts","sourceRoot":"","sources":["../../src/lib/catalog-suspense-key.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,EAClD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,EAChD,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAQR"}
@@ -0,0 +1,12 @@
1
+ /** Clé Suspense stable — inclut la vue + filtres actifs (sans recréer page par page). */
2
+ export function buildCatalogSuspenseKey(sp, resolveView, filterKeys) {
3
+ const view = resolveView(sp?.view);
4
+ const parts = [view];
5
+ for (const key of filterKeys) {
6
+ const value = (sp?.[key] || "").trim();
7
+ if (value)
8
+ parts.push(`${key}=${value}`);
9
+ }
10
+ return parts.join("&");
11
+ }
12
+ //# sourceMappingURL=catalog-suspense-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-suspense-key.js","sourceRoot":"","sources":["../../src/lib/catalog-suspense-key.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,UAAU,uBAAuB,CACrC,EAAkD,EAClD,WAAgD,EAChD,UAA6B;IAE7B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Bus client de réactivité data (mutations → UI).
3
+ *
4
+ * Contrat :
5
+ * - Émetteurs : `emitDataChanged({ resource, ids?, source })` après une
6
+ * mutation confirmée (UI, fetch qui lit le header API, tool MCP/assistant).
7
+ * - Consommateurs : `subscribeDataChanged` / hook UI `useCreezioResource`
8
+ * (rafraîchit la page ouverte sans reload manuel).
9
+ *
10
+ * Header HTTP homonyme (EntitySpec / mounts) : `x-creezio-data-changed`
11
+ * (valeur = resource, CSV si plusieurs). Le fetch interceptor kit le
12
+ * transforme en événement navigateur.
13
+ *
14
+ * Tools MCP / assistant : `inferResourceFromToolName(toolName)` → resource
15
+ * (ou null si lecture). Convention `module.<owner>.<action>` + table d'alias
16
+ * + préfixes d'écriture legacy (`add_to_*`, `create_*`, …).
17
+ */
18
+ export declare const CREEZIO_DATA_CHANGED_EVENT = "creezio:data-changed";
19
+ export declare const CREEZIO_DATA_CHANGED_HEADER = "x-creezio-data-changed";
20
+ export type CreezioDataChangedDetail = {
21
+ /** Identifiant de ressource (ex. `panier`, `commandes`, table EntitySpec). */
22
+ resource: string;
23
+ ids?: string[];
24
+ /** Provenance : `ui` | `api` | `mcp` | `assistant` | libre. */
25
+ source?: string;
26
+ at?: number;
27
+ };
28
+ export declare function emitDataChanged(detail: CreezioDataChangedDetail): void;
29
+ export declare function subscribeDataChanged(handler: (detail: CreezioDataChangedDetail) => void, opts?: {
30
+ resource?: string | string[];
31
+ }): () => void;
32
+ /** Parse le header `x-creezio-data-changed` (CSV) → resources. */
33
+ export declare function parseDataChangedHeader(value: string | null | undefined): string[];
34
+ /**
35
+ * Heuristique tool MCP / assistant → resource (écriture).
36
+ * Retourne null si tool probablement lecture seule.
37
+ *
38
+ * Conventions supportées :
39
+ * 1. `module.<owner>.<action>` — action lecture → null ; sinon resource(owner)
40
+ * 2. Contient panier/cart / promotions… (mots-clés métier)
41
+ * 3. Préfixes d'écriture legacy → stem → resource
42
+ */
43
+ export declare function inferResourceFromToolName(toolName: string): string | null;
44
+ /**
45
+ * Intercepte `window.fetch` une fois : si la réponse porte
46
+ * `x-creezio-data-changed`, émet le bus client (source `api`).
47
+ */
48
+ export declare function installCreezioDataChangedFetch(): void;
49
+ /** Tests uniquement. */
50
+ export declare function resetDataChangedFetchForTests(): void;
51
+ //# sourceMappingURL=data-changed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-changed.d.ts","sourceRoot":"","sources":["../../src/lib/data-changed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,2BAA2B,2BAA2B,CAAC;AAEpE,MAAM,MAAM,wBAAwB,GAAG;IACrC,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CActE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,EACnD,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GACtC,MAAM,IAAI,CAkBZ;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,EAAE,CAMV;AA4ED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoDzE;AAID;;;GAGG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAgBrD;AAED,wBAAwB;AACxB,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Bus client de réactivité data (mutations → UI).
3
+ *
4
+ * Contrat :
5
+ * - Émetteurs : `emitDataChanged({ resource, ids?, source })` après une
6
+ * mutation confirmée (UI, fetch qui lit le header API, tool MCP/assistant).
7
+ * - Consommateurs : `subscribeDataChanged` / hook UI `useCreezioResource`
8
+ * (rafraîchit la page ouverte sans reload manuel).
9
+ *
10
+ * Header HTTP homonyme (EntitySpec / mounts) : `x-creezio-data-changed`
11
+ * (valeur = resource, CSV si plusieurs). Le fetch interceptor kit le
12
+ * transforme en événement navigateur.
13
+ *
14
+ * Tools MCP / assistant : `inferResourceFromToolName(toolName)` → resource
15
+ * (ou null si lecture). Convention `module.<owner>.<action>` + table d'alias
16
+ * + préfixes d'écriture legacy (`add_to_*`, `create_*`, …).
17
+ */
18
+ export const CREEZIO_DATA_CHANGED_EVENT = "creezio:data-changed";
19
+ export const CREEZIO_DATA_CHANGED_HEADER = "x-creezio-data-changed";
20
+ export function emitDataChanged(detail) {
21
+ if (typeof window === "undefined")
22
+ return;
23
+ const resource = String(detail.resource || "").trim();
24
+ if (!resource)
25
+ return;
26
+ window.dispatchEvent(new CustomEvent(CREEZIO_DATA_CHANGED_EVENT, {
27
+ detail: {
28
+ resource,
29
+ ids: detail.ids,
30
+ source: detail.source,
31
+ at: detail.at ?? Date.now(),
32
+ },
33
+ }));
34
+ }
35
+ export function subscribeDataChanged(handler, opts) {
36
+ if (typeof window === "undefined")
37
+ return () => { };
38
+ const wanted = opts?.resource
39
+ ? new Set((Array.isArray(opts.resource) ? opts.resource : [opts.resource]).map((r) => r.trim()))
40
+ : null;
41
+ const onEvent = (e) => {
42
+ const detail = e.detail;
43
+ if (!detail?.resource)
44
+ return;
45
+ if (wanted && !wanted.has(detail.resource))
46
+ return;
47
+ handler(detail);
48
+ };
49
+ window.addEventListener(CREEZIO_DATA_CHANGED_EVENT, onEvent);
50
+ return () => window.removeEventListener(CREEZIO_DATA_CHANGED_EVENT, onEvent);
51
+ }
52
+ /** Parse le header `x-creezio-data-changed` (CSV) → resources. */
53
+ export function parseDataChangedHeader(value) {
54
+ if (!value)
55
+ return [];
56
+ return value
57
+ .split(",")
58
+ .map((s) => s.trim())
59
+ .filter(Boolean);
60
+ }
61
+ /**
62
+ * Alias owner / stem outil → resource UI (`useCreezioResource`).
63
+ * Les clés sont en minuscules ; valeurs = id resource bus.
64
+ */
65
+ const TOOL_OWNER_TO_RESOURCE = {
66
+ panier: "panier",
67
+ cart: "panier",
68
+ commande: "commandes",
69
+ commandes: "commandes",
70
+ sku: "skus",
71
+ skus: "skus",
72
+ produit: "produits",
73
+ product: "produits",
74
+ products: "produits",
75
+ produits: "produits",
76
+ catalog: "produits",
77
+ catalogue: "produits",
78
+ fournisseur: "fournisseurs",
79
+ fournisseurs: "fournisseurs",
80
+ supplier: "fournisseurs",
81
+ vendor: "fournisseurs",
82
+ client: "clients",
83
+ customers: "clients",
84
+ customer: "clients",
85
+ clients: "clients",
86
+ task: "tasks",
87
+ tasks: "tasks",
88
+ tache: "tasks",
89
+ taches: "tasks",
90
+ todo: "tasks",
91
+ todos: "tasks",
92
+ ai_task: "tasks",
93
+ ai_collaborator: "tasks",
94
+ mail: "mails",
95
+ mails: "mails",
96
+ email: "mails",
97
+ emails: "mails",
98
+ promo: "promotions",
99
+ promotion: "promotions",
100
+ promotions: "promotions",
101
+ stack: "stack",
102
+ prix: "prix",
103
+ releve: "prix",
104
+ releves: "prix",
105
+ releves_prix: "prix",
106
+ optimiser: "optimiser",
107
+ conditions: "conditions",
108
+ data_mapping: "data_mapping",
109
+ widget: "widgets",
110
+ widgets: "widgets",
111
+ };
112
+ /** Verbes / préfixes d'action clairement lecture seule. */
113
+ const READ_ACTION_RE = /^(get|list|search|find|read|count|describe|schema|status|suggest|scenario|graph|stats|rfa)(_|$)/;
114
+ /** Préfixes d'écriture legacy (`add_to_panier`, `create_ai_task`, …). */
115
+ const WRITE_PREFIX_RE = /^(?:add_to_|add_|create_|update_|delete_|close_|set_|remove_|archive_|upsert_|patch_|answer_)/;
116
+ function normalizeOwnerStem(raw) {
117
+ return raw
118
+ .replace(/_ligne$/, "")
119
+ .replace(/_item$/, "")
120
+ .replace(/_line$/, "")
121
+ .replace(/_entry$/, "");
122
+ }
123
+ function resourceFromOwner(owner) {
124
+ const key = normalizeOwnerStem(owner.trim().toLowerCase());
125
+ if (!key)
126
+ return null;
127
+ return TOOL_OWNER_TO_RESOURCE[key] ?? key;
128
+ }
129
+ /**
130
+ * Heuristique tool MCP / assistant → resource (écriture).
131
+ * Retourne null si tool probablement lecture seule.
132
+ *
133
+ * Conventions supportées :
134
+ * 1. `module.<owner>.<action>` — action lecture → null ; sinon resource(owner)
135
+ * 2. Contient panier/cart / promotions… (mots-clés métier)
136
+ * 3. Préfixes d'écriture legacy → stem → resource
137
+ */
138
+ export function inferResourceFromToolName(toolName) {
139
+ const n = String(toolName || "").trim().toLowerCase();
140
+ if (!n)
141
+ return null;
142
+ // 1) Convention module.<owner>.<action>[_…]
143
+ const mod = /^module\.([a-z0-9_-]+)\.([a-z0-9_.-]+)$/.exec(n);
144
+ if (mod) {
145
+ const owner = mod[1];
146
+ const action = mod[2];
147
+ if (READ_ACTION_RE.test(action))
148
+ return null;
149
+ return resourceFromOwner(owner);
150
+ }
151
+ // Lecture seule legacy (préfixe ou suffixe)
152
+ if (/^(get_|list_|search_|find_|read_|count_|describe_|schema_)/.test(n) ||
153
+ n.endsWith("_get") ||
154
+ n.endsWith("_list") ||
155
+ n.endsWith("_search")) {
156
+ return null;
157
+ }
158
+ // 2) Mots-clés métier (outil plat ou composé)
159
+ if (/panier|cart/.test(n))
160
+ return "panier";
161
+ if (/promotions?|promo\b/.test(n))
162
+ return "promotions";
163
+ if (/\bstack\b|add_to_stack|remove_from_stack/.test(n))
164
+ return "stack";
165
+ if (/commande/.test(n))
166
+ return "commandes";
167
+ if (/\bskus?\b/.test(n))
168
+ return "skus";
169
+ if (/produit|product|catalog/.test(n))
170
+ return "produits";
171
+ if (/fournisseur|supplier|vendor/.test(n))
172
+ return "fournisseurs";
173
+ if (/client|customer/.test(n))
174
+ return "clients";
175
+ if (/task|tache|todo|ai_task|ai_collaborator|ai_question/.test(n)) {
176
+ return "tasks";
177
+ }
178
+ if (/mail|email/.test(n))
179
+ return "mails";
180
+ if (/optimiser/.test(n))
181
+ return "optimiser";
182
+ if (/conditions?|rfa/.test(n))
183
+ return "conditions";
184
+ if (/releve|prix/.test(n))
185
+ return "prix";
186
+ // 3) Préfixes d'écriture → stem
187
+ if (WRITE_PREFIX_RE.test(n)) {
188
+ const stem = n
189
+ .replace(WRITE_PREFIX_RE, "")
190
+ .replace(/_ligne$/, "")
191
+ .replace(/_item$/, "");
192
+ if (!stem)
193
+ return null;
194
+ // create_ai_task → ai_task ; add_to_panier déjà couvert plus haut
195
+ return resourceFromOwner(stem);
196
+ }
197
+ return null;
198
+ }
199
+ let fetchPatched = false;
200
+ /**
201
+ * Intercepte `window.fetch` une fois : si la réponse porte
202
+ * `x-creezio-data-changed`, émet le bus client (source `api`).
203
+ */
204
+ export function installCreezioDataChangedFetch() {
205
+ if (typeof window === "undefined" || fetchPatched)
206
+ return;
207
+ const original = window.fetch.bind(window);
208
+ fetchPatched = true;
209
+ window.fetch = async (input, init) => {
210
+ const res = await original(input, init);
211
+ try {
212
+ const header = res.headers.get(CREEZIO_DATA_CHANGED_HEADER);
213
+ for (const resource of parseDataChangedHeader(header)) {
214
+ emitDataChanged({ resource, source: "api" });
215
+ }
216
+ }
217
+ catch {
218
+ /* ignore */
219
+ }
220
+ return res;
221
+ };
222
+ }
223
+ /** Tests uniquement. */
224
+ export function resetDataChangedFetchForTests() {
225
+ fetchPatched = false;
226
+ }
227
+ //# sourceMappingURL=data-changed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-changed.js","sourceRoot":"","sources":["../../src/lib/data-changed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Accueil CRM classique (Client / legacy / navigateur). */
2
+ export declare const CRM_HOME_PATH = "/dashboard";
3
+ /** Surface ops de l'app desktop Serveur (kind=server). */
4
+ export declare const SERVER_COCKPIT_PATH = "/server-cockpit";
5
+ /**
6
+ * Chemin d'accueil par défaut hors contexte desktop (SSR, navigateur).
7
+ */
8
+ export declare function defaultHomePathSync(): string;
9
+ /**
10
+ * Après onboarding / skip / login sans `?next=` : cockpit serveur si
11
+ * `desktop:info` signale appKind=server, sinon dashboard CRM.
12
+ */
13
+ export declare function resolveDesktopHomePath(): Promise<string>;
14
+ //# sourceMappingURL=desktop-home-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-home-path.d.ts","sourceRoot":"","sources":["../../src/lib/desktop-home-path.ts"],"names":[],"mappings":"AACA,4DAA4D;AAC5D,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAS9D"}
@@ -0,0 +1,29 @@
1
+ import { getShellDesktopApi } from "../brand.js";
2
+ /** Accueil CRM classique (Client / legacy / navigateur). */
3
+ export const CRM_HOME_PATH = "/dashboard";
4
+ /** Surface ops de l'app desktop Serveur (kind=server). */
5
+ export const SERVER_COCKPIT_PATH = "/server-cockpit";
6
+ /**
7
+ * Chemin d'accueil par défaut hors contexte desktop (SSR, navigateur).
8
+ */
9
+ export function defaultHomePathSync() {
10
+ return CRM_HOME_PATH;
11
+ }
12
+ /**
13
+ * Après onboarding / skip / login sans `?next=` : cockpit serveur si
14
+ * `desktop:info` signale appKind=server, sinon dashboard CRM.
15
+ */
16
+ export async function resolveDesktopHomePath() {
17
+ if (typeof window === "undefined")
18
+ return CRM_HOME_PATH;
19
+ try {
20
+ const info = await getShellDesktopApi()?.getInfo?.();
21
+ if (info?.appKind === "server")
22
+ return SERVER_COCKPIT_PATH;
23
+ }
24
+ catch {
25
+ /* hors desktop ou IPC indisponible */
26
+ }
27
+ return CRM_HOME_PATH;
28
+ }
29
+ //# sourceMappingURL=desktop-home-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-home-path.js","sourceRoot":"","sources":["../../src/lib/desktop-home-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAE1C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,aAAa,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAkB,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,IAAI,EAAE,OAAO,KAAK,QAAQ;YAAE,OAAO,mBAAmB,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Distance géodésique (haversine) — logique pure, testable.
3
+ */
4
+ /** Distance en km entre deux points WGS84. Retourne null si coords invalides. */
5
+ export declare function haversineKm(lat1: number | null | undefined, lng1: number | null | undefined, lat2: number | null | undefined, lng2: number | null | undefined): number | null;
6
+ //# sourceMappingURL=geo-distance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo-distance.d.ts","sourceRoot":"","sources":["../../src/lib/geo-distance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,iFAAiF;AACjF,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAoBf"}