@manta-eu/react 0.1.5 → 0.1.7

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 (143) hide show
  1. package/README.md +1 -0
  2. package/dist/components/chat/chat-input/index.d.ts +1 -1
  3. package/dist/components/chat/chat-input/index.d.ts.map +1 -1
  4. package/dist/components/chat/chat-input/index.js +4 -5
  5. package/dist/components/chat-view/Chat.js +13 -3
  6. package/dist/components/embedded-chat/index.d.ts.map +1 -1
  7. package/dist/components/embedded-chat/index.js +2 -1
  8. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  9. package/dist/components/layouts/Sidebar.js +15 -2
  10. package/dist/components/layouts/StatusScreen.d.ts.map +1 -1
  11. package/dist/components/layouts/StatusScreen.js +3 -1
  12. package/dist/components/sidebar/nav-menu.d.ts +2 -0
  13. package/dist/components/sidebar/nav-menu.d.ts.map +1 -1
  14. package/dist/components/sidebar/nav-menu.js +11 -6
  15. package/dist/components/table/index.d.ts +26 -0
  16. package/dist/components/table/index.d.ts.map +1 -1
  17. package/dist/components/table/index.js +31 -1
  18. package/dist/components/thinking/manta-swim.d.ts.map +1 -1
  19. package/dist/components/thinking/manta-swim.js +3 -1
  20. package/dist/explain-fact/DatalogCode.d.ts.map +1 -1
  21. package/dist/explain-fact/DatalogCode.js +7 -2
  22. package/dist/explain-fact/FactValue.js +3 -3
  23. package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.d.ts.map +1 -1
  24. package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.js +2 -1
  25. package/dist/globals.css +10 -102
  26. package/dist/graph/createNodeRouter.d.ts.map +1 -1
  27. package/dist/graph/createNodeRouter.js +3 -0
  28. package/dist/graph/nodes/BrandFacetRuleView.d.ts.map +1 -1
  29. package/dist/graph/nodes/BrandFacetRuleView.js +6 -4
  30. package/dist/graph/nodes/BrandFontFamilyView.d.ts +3 -0
  31. package/dist/graph/nodes/BrandFontFamilyView.d.ts.map +1 -0
  32. package/dist/graph/nodes/BrandFontFamilyView.js +56 -0
  33. package/dist/graph/nodes/BrandFontUploadButton.d.ts +6 -0
  34. package/dist/graph/nodes/BrandFontUploadButton.d.ts.map +1 -0
  35. package/dist/graph/nodes/BrandFontUploadButton.js +65 -0
  36. package/dist/graph/nodes/BrandGuidelinesView.d.ts.map +1 -1
  37. package/dist/graph/nodes/BrandGuidelinesView.js +2 -6
  38. package/dist/graph/nodes/brand-font.d.ts +12 -0
  39. package/dist/graph/nodes/brand-font.d.ts.map +1 -0
  40. package/dist/graph/nodes/brand-font.js +12 -0
  41. package/dist/graph/nodes/brand-shared.d.ts +3 -2
  42. package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
  43. package/dist/graph/nodes/brand-shared.js +3 -2
  44. package/dist/hooks/use-connection-problems.d.ts +15 -0
  45. package/dist/hooks/use-connection-problems.d.ts.map +1 -0
  46. package/dist/hooks/use-connection-problems.js +9 -0
  47. package/dist/hooks/use-font-face.d.ts +3 -0
  48. package/dist/hooks/use-font-face.d.ts.map +1 -0
  49. package/dist/hooks/use-font-face.js +33 -0
  50. package/dist/hooks/use-graph-refresh-after-turn.d.ts +2 -0
  51. package/dist/hooks/use-graph-refresh-after-turn.d.ts.map +1 -0
  52. package/dist/hooks/use-graph-refresh-after-turn.js +12 -0
  53. package/dist/hooks/useAuth.d.ts +1 -0
  54. package/dist/hooks/useAuth.d.ts.map +1 -1
  55. package/dist/hooks/useAuth.js +32 -9
  56. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  57. package/dist/lib/activity-changeset.d.ts.map +1 -1
  58. package/dist/lib/activity-changeset.js +6 -3
  59. package/dist/lib/chat-types.d.ts +2 -0
  60. package/dist/lib/chat-types.d.ts.map +1 -1
  61. package/dist/lib/datastore-route-table.d.ts +1 -0
  62. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  63. package/dist/lib/datastore-route-table.js +2 -0
  64. package/dist/lib/tool-icons.d.ts.map +1 -1
  65. package/dist/lib/tool-icons.js +2 -5
  66. package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
  67. package/dist/providers/ActiveChatProvider.js +2 -0
  68. package/dist/providers/AssistantIconProvider.d.ts +11 -0
  69. package/dist/providers/AssistantIconProvider.d.ts.map +1 -0
  70. package/dist/providers/AssistantIconProvider.js +10 -0
  71. package/dist/providers/KnowledgeGraphStateContext.d.ts +0 -1
  72. package/dist/providers/KnowledgeGraphStateContext.d.ts.map +1 -1
  73. package/dist/providers/KnowledgeGraphStateProvider.d.ts.map +1 -1
  74. package/dist/providers/KnowledgeGraphStateProvider.js +8 -19
  75. package/dist/providers/index.d.ts +1 -0
  76. package/dist/providers/index.d.ts.map +1 -1
  77. package/dist/providers/index.js +1 -0
  78. package/dist/routes/activity/change-display.js +1 -1
  79. package/dist/routes/chat/index.d.ts +2 -0
  80. package/dist/routes/chat/index.d.ts.map +1 -1
  81. package/dist/routes/chat/index.js +3 -2
  82. package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.d.ts.map +1 -1
  83. package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.js +23 -9
  84. package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts +2 -4
  85. package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts.map +1 -1
  86. package/dist/routes/data-explorer/components/record-detail/action-properties.js +8 -50
  87. package/dist/routes/integrations/catalog-shape.d.ts +6 -2
  88. package/dist/routes/integrations/catalog-shape.d.ts.map +1 -1
  89. package/dist/routes/integrations/components/AddIntegrationModal.d.ts.map +1 -1
  90. package/dist/routes/integrations/components/AddIntegrationModal.js +1 -1
  91. package/dist/routes/integrations/components/connect-forms/types.d.ts +1 -0
  92. package/dist/routes/integrations/components/connect-forms/types.d.ts.map +1 -1
  93. package/dist/routes/integrations/connection-view.d.ts +4 -1
  94. package/dist/routes/integrations/connection-view.d.ts.map +1 -1
  95. package/dist/routes/integrations/connection-view.js +55 -12
  96. package/dist/routes/integrations/types.d.ts +25 -4
  97. package/dist/routes/integrations/types.d.ts.map +1 -1
  98. package/dist/routes/integrations/types.js +10 -0
  99. package/dist/shacl/shacl-form-types.d.ts +2 -3
  100. package/dist/shacl/shacl-form-types.d.ts.map +1 -1
  101. package/dist/shared/graph-derived-queries.d.ts +5 -0
  102. package/dist/shared/graph-derived-queries.d.ts.map +1 -0
  103. package/dist/shared/graph-derived-queries.js +28 -0
  104. package/package.json +15 -13
  105. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  106. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  107. package/dist/components/ai-elements/chain-of-thought.js +0 -57
  108. package/dist/components/context-menu.d.ts +0 -29
  109. package/dist/components/context-menu.d.ts.map +0 -1
  110. package/dist/components/context-menu.js +0 -67
  111. package/dist/components/hover-card.d.ts +0 -6
  112. package/dist/components/hover-card.d.ts.map +0 -1
  113. package/dist/components/hover-card.js +0 -15
  114. package/dist/components/layouts/ChatHistoryItem.d.ts +0 -9
  115. package/dist/components/layouts/ChatHistoryItem.d.ts.map +0 -1
  116. package/dist/components/layouts/ChatHistoryItem.js +0 -7
  117. package/dist/components/layouts/SectionHeader.d.ts +0 -8
  118. package/dist/components/layouts/SectionHeader.d.ts.map +0 -1
  119. package/dist/components/layouts/SectionHeader.js +0 -6
  120. package/dist/components/orbit-site/Block.d.ts +0 -8
  121. package/dist/components/orbit-site/Block.d.ts.map +0 -1
  122. package/dist/components/orbit-site/Block.js +0 -7
  123. package/dist/components/orbit-site/Inset.d.ts +0 -7
  124. package/dist/components/orbit-site/Inset.d.ts.map +0 -1
  125. package/dist/components/orbit-site/Inset.js +0 -6
  126. package/dist/components/orbit-site/Section.d.ts +0 -7
  127. package/dist/components/orbit-site/Section.d.ts.map +0 -1
  128. package/dist/components/orbit-site/Section.js +0 -6
  129. package/dist/components/orbit-site/ThemeSelector.d.ts +0 -3
  130. package/dist/components/orbit-site/ThemeSelector.d.ts.map +0 -1
  131. package/dist/components/orbit-site/ThemeSelector.js +0 -42
  132. package/dist/components/planning/SampleChanges.d.ts +0 -9
  133. package/dist/components/planning/SampleChanges.d.ts.map +0 -1
  134. package/dist/components/planning/SampleChanges.js +0 -117
  135. package/dist/components/tool-invocation-card/index.d.ts +0 -8
  136. package/dist/components/tool-invocation-card/index.d.ts.map +0 -1
  137. package/dist/components/tool-invocation-card/index.js +0 -7
  138. package/dist/lib/schema-fields.d.ts +0 -2
  139. package/dist/lib/schema-fields.d.ts.map +0 -1
  140. package/dist/lib/schema-fields.js +0 -3
  141. package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts +0 -7
  142. package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts.map +0 -1
  143. package/dist/routes/memories/components/ConflictTimeoutFooter.js +0 -6
@@ -73,5 +73,6 @@ export type SessionContextFailure = {
73
73
  };
74
74
  export declare function parseSessionContext(payload: unknown): ContextResponse;
75
75
  export declare function sessionContextFailure(failure: SessionContextFailure | undefined): Error | undefined;
76
+ export declare function sessionEndedLogoutPath(pathname: string): string;
76
77
  export declare function useAuth(): UseAuthResult;
77
78
  //# sourceMappingURL=useAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAO3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,kGAAkG;IAClG,cAAc,EAAE,OAAO,CAAC;IACxB,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,+EAA+E;IAC/E,kBAAkB,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrD,CAAC;AAuBF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAErE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAKnG;AAqBD,wBAAgB,OAAO,IAAI,aAAa,CA4IvC"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAO3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,kGAAkG;IAClG,cAAc,EAAE,OAAO,CAAC;IACxB,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,+EAA+E;IAC/E,kBAAkB,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrD,CAAC;AAuBF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAErE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAKnG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI/D;AAqBD,wBAAgB,OAAO,IAAI,aAAa,CAkKvC"}
@@ -56,6 +56,12 @@ export function sessionContextFailure(failure) {
56
56
  return createHttpError(failure.message, status);
57
57
  return new Error(failure.message);
58
58
  }
59
+ export function sessionEndedLogoutPath(pathname) {
60
+ const params = new URLSearchParams({ session_ended: "1" });
61
+ if (pathname !== "/")
62
+ params.set("redirect", pathname);
63
+ return `/logout?${params.toString()}`;
64
+ }
59
65
  // A user with no datastore waits on an operator; the grant rides in the token, so recovery is a re-fetch.
60
66
  const awaitingDatastorePollMs = 15_000;
61
67
  function isAwaitingDatastore(context) {
@@ -77,10 +83,12 @@ function sessionDatastore(datastore) {
77
83
  export function useAuth() {
78
84
  const { mantaBaseUrl, datastoreId } = useMantaClient();
79
85
  const queryClient = useQueryClient();
80
- const logout = useCallback(async () => {
86
+ const leaveTo = useCallback((path) => {
81
87
  queryClient.clear();
82
- window.location.href = "/logout";
88
+ window.location.href = path;
83
89
  }, [queryClient]);
90
+ const logout = useCallback(async () => leaveTo("/logout"), [leaveTo]);
91
+ const endSession = useCallback(() => leaveTo(sessionEndedLogoutPath(window.location.pathname)), [leaveTo]);
84
92
  const { data: loginStatus, isLoading: isLoginStatusLoading, error: loginStatusError, refetch: refetchLoginStatusQuery, } = useQuery({
85
93
  queryKey: ["login-status"],
86
94
  queryFn: async ({ signal }) => {
@@ -139,11 +147,26 @@ export function useAuth() {
139
147
  return;
140
148
  // Only redirect if the user was previously authenticated (contextData exists)
141
149
  // to avoid showing "session expired" on the initial unauthenticated load
142
- if (loginStatus?.valid === false && contextData) {
143
- toast.error("Your session has expired. Please sign in again.");
144
- void logout();
145
- }
146
- }, [isLoginStatusLoading, loginStatus?.valid, contextData, logout]);
150
+ if (loginStatus?.valid !== false || !contextData)
151
+ return;
152
+ let checking = false;
153
+ const checkAndEnd = () => {
154
+ if (checking || document.visibilityState !== "visible")
155
+ return;
156
+ checking = true;
157
+ void refetchLoginStatusQuery().then(({ data, isError }) => {
158
+ if (isError || data?.valid) {
159
+ checking = false;
160
+ return;
161
+ }
162
+ toast.error("Your session has expired. Please sign in again.");
163
+ endSession();
164
+ });
165
+ };
166
+ checkAndEnd();
167
+ document.addEventListener("visibilitychange", checkAndEnd);
168
+ return () => document.removeEventListener("visibilitychange", checkAndEnd);
169
+ }, [isLoginStatusLoading, loginStatus?.valid, contextData, refetchLoginStatusQuery, endSession]);
147
170
  useEffect(() => {
148
171
  if (!contextEnabled || !contextError)
149
172
  return;
@@ -154,12 +177,12 @@ export function useAuth() {
154
177
  // when user exists only in Keycloak, but not Hasura, so we can't get their data at all
155
178
  if (isHttpError(contextError) && [401, 403].includes(contextError.status)) {
156
179
  toast.error("Your session has expired. Please sign in again.");
157
- void logout();
180
+ endSession();
158
181
  }
159
182
  else {
160
183
  toast.error(`Failed to load user data. (${contextError.message})`);
161
184
  }
162
- }, [contextEnabled, contextError, logout]);
185
+ }, [contextEnabled, contextError, endSession]);
163
186
  const user = contextData?.user
164
187
  ? { id: contextData.user.id, email: contextData.user.email, name: contextData.user.name ?? undefined }
165
188
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"useValidateActionPlan.d.ts","sourceRoot":"","sources":["../../src/hooks/useValidateActionPlan.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS;;;;;;;;;sBAkB8osJ,CAAC;;sBAAwF,CAAC;iBAAsC,CAAC;uBAA4C,CAAC;;;mBAAuI,CAAC;;;;;EADhitJ"}
1
+ {"version":3,"file":"useValidateActionPlan.d.ts","sourceRoot":"","sources":["../../src/hooks/useValidateActionPlan.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS;;;;;;;;;sBAkBqw5J,CAAC;;sBAAwF,CAAC;iBAAsC,CAAC;uBAA4C,CAAC;;;mBAAuI,CAAC;;;;;EADvp6J"}
@@ -1 +1 @@
1
- {"version":3,"file":"activity-changeset.d.ts","sourceRoot":"","sources":["../../src/lib/activity-changeset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAG3B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAEhC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC;AA2IF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAY5D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAiBlE;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACjC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;EAiDzC"}
1
+ {"version":3,"file":"activity-changeset.d.ts","sourceRoot":"","sources":["../../src/lib/activity-changeset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAG3B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAEhC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC;AA6IF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAY5D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,YAiBlE;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACjC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;;EAiDzC"}
@@ -1,13 +1,14 @@
1
1
  import { isQueryableTermIri } from "@manta-eu/datalog-parser";
2
2
  import { isPresent } from "@manta-eu/lib/present";
3
- import { rdf, wellKnownPredicates } from "@manta-eu/rdf-lib/namespaces";
3
+ import { igraphNodeIri, rdf, wellKnownPredicates } from "@manta-eu/rdf-lib/namespaces";
4
4
  import { formatDisplayValue } from "../graph/property-formatters.js";
5
5
  import { DefaultMap } from "./default-map.js";
6
6
  import { extractLabel, extractTypeName, formatPropertyLabel } from "./iri-labels.js";
7
7
  import { bindingNodeIri, bindingValue } from "./rdf-helpers.js";
8
8
  const rdfTypeIri = rdf.type;
9
+ const hiddenArtifactPredicates = new Set([igraphNodeIri]);
9
10
  // `:actionShape` links a planned subject to its request shape — structural noise in a diff.
10
- const hiddenDiffPredicates = new Set([wellKnownPredicates.actionShape]);
11
+ const hiddenDiffPredicates = new Set([wellKnownPredicates.actionShape, ...hiddenArtifactPredicates]);
11
12
  function isIriLike(value) {
12
13
  return value.startsWith("http://") || value.startsWith("https://") || value.startsWith("urn:");
13
14
  }
@@ -46,7 +47,9 @@ function joinValues(values, labels, predicate, field, valueScale) {
46
47
  }
47
48
  // `:actionShape` is kept though the diff table hides it — it routes a planned action to its own card.
48
49
  function buildChangeTriples(predicateEntries) {
49
- return predicateEntries.flatMap(([predicate, values]) => values.additions.map((value) => ({ predicate, object: value, objectIsIri: isIriLike(value) })));
50
+ return predicateEntries
51
+ .filter(([predicate]) => !hiddenArtifactPredicates.has(predicate))
52
+ .flatMap(([predicate, values]) => values.additions.map((value) => ({ predicate, object: value, objectIsIri: isIriLike(value) })));
50
53
  }
51
54
  function buildTypeReplacementDiff(typeEntry) {
52
55
  if (!typeEntry || typeEntry.additions.length === 0 || typeEntry.removals.length === 0)
@@ -1,6 +1,7 @@
1
1
  import type { MantaModelId } from "@manta-eu/client/shared/model";
2
2
  import type { ReactNode } from "react";
3
3
  import type { Datastore } from "#ldo-ui";
4
+ import type { AssistantIcon } from "#providers/AssistantIconProvider";
4
5
  export type User = {
5
6
  id: string;
6
7
  email: string;
@@ -36,6 +37,7 @@ export type AuthenticatedChatProps = {
36
37
  title?: string;
37
38
  welcomeSubtitle?: string;
38
39
  assistantName?: string;
40
+ assistantIcon?: AssistantIcon;
39
41
  mark?: ReactNode;
40
42
  renderMenuItems?: (defaults: CopilotMenuDefaults) => ReactNode[];
41
43
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chat-types.d.ts","sourceRoot":"","sources":["../../src/lib/chat-types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAGrD,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,SAAS,EAAE,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,GAAG;IACvD,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAEjF;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"chat-types.d.ts","sourceRoot":"","sources":["../../src/lib/chat-types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAGrD,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,SAAS,EAAE,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,GAAG;IACvD,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAEjF;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC"}
@@ -11,6 +11,7 @@ export type RouteElements = {
11
11
  Activity?: ReactNode;
12
12
  ActivityDetail?: ReactNode;
13
13
  Integrations?: ReactNode;
14
+ ShopifyConnect?: ReactNode;
14
15
  Team?: ReactNode;
15
16
  DataExplorerLayout?: ReactNode;
16
17
  DataExplorerIndex?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"datastore-route-table.d.ts","sourceRoot":"","sources":["../../src/lib/datastore-route-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,aAEtD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,eAAO,MAAM,YAAY,EAAE,eAAe,EAEzC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAAe,EA4B5C,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAEvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAA+B,CAAC"}
1
+ {"version":3,"file":"datastore-route-table.d.ts","sourceRoot":"","sources":["../../src/lib/datastore-route-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,aAEtD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,eAAO,MAAM,YAAY,EAAE,eAAe,EAIzC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAAe,EA4B5C,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAEvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAA+B,CAAC"}
@@ -4,6 +4,8 @@ export function notFoundElement(elements) {
4
4
  export const notFoundRoutePath = "*";
5
5
  export const globalRoutes = [
6
6
  { path: "/datastores", render: (e) => e.Datastores || notFoundElement(e) },
7
+ // Global, not datastore-scoped: Shopify sends the merchant here before any datastore is known.
8
+ { path: "/shopify/connect", render: (e) => e.ShopifyConnect || notFoundElement(e) },
7
9
  ];
8
10
  export const datastoreRoutes = [
9
11
  { path: "/", render: (e) => e.Chat },
@@ -1 +1 @@
1
- {"version":3,"file":"tool-icons.d.ts","sourceRoot":"","sources":["../../src/lib/tool-icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAeL,KAAK,UAAU,EAShB,MAAM,cAAc,CAAC;AA2DtB,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAEzE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAYxD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAK7F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAKtF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuDpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAG/D"}
1
+ {"version":3,"file":"tool-icons.d.ts","sourceRoot":"","sources":["../../src/lib/tool-icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAeL,KAAK,UAAU,EAQhB,MAAM,cAAc,CAAC;AAwDtB,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAEzE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAYxD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAK7F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAKtF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuDpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAG/D"}
@@ -1,5 +1,5 @@
1
1
  import { getSkillToolLabel } from "@manta-eu/client/shared/tools";
2
- import { AlertTriangle, BarChart3, BookOpen, Brain, Building2, CheckCircle2, Circle, Clock, Database, DollarSign, GitBranch, Images, Lightbulb, Link, Megaphone, Network, Package, Paperclip, Pause, Target, TrendingUp, Zap, } from "lucide-react";
2
+ import { AlertTriangle, BarChart3, BookOpen, Brain, Building2, CheckCircle2, Circle, Clock, Database, DollarSign, GitBranch, Images, Lightbulb, Link, Megaphone, Network, Package, Paperclip, Target, TrendingUp, Zap, } from "lucide-react";
3
3
  import { match } from "ts-pattern";
4
4
  const toolIconMap = {
5
5
  getRDFoxFacts: Database,
@@ -15,11 +15,8 @@ const toolIconMap = {
15
15
  executeActionPlan: Zap,
16
16
  actionPlanShowcase: Zap,
17
17
  showEntities: Images,
18
- enableAutoPilot: Zap,
19
- enableAutoPilotCron: Zap,
20
- disableAutoPilot: Pause,
21
18
  checkAutoPilotStatus: Zap,
22
- setAutoPilotCadence: Clock,
19
+ setDailyChangeLimit: DollarSign,
23
20
  markAsLowRisk: CheckCircle2,
24
21
  readUploadedFile: Paperclip,
25
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveChatProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ActiveChatProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrH,OAAO,EAAgC,KAAK,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAI3G,YAAY,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,KAAK,gCAAgC,GAAG;IACtC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IACzE,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,eAAe,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACvD,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAIF,wBAAgB,uBAAuB,IAAI,gCAAgC,GAAG,SAAS,CAEtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2UAkChE"}
1
+ {"version":3,"file":"ActiveChatProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ActiveChatProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrH,OAAO,EAAgC,KAAK,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAK3G,YAAY,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,KAAK,gCAAgC,GAAG;IACtC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IACzE,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,eAAe,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACvD,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAIF,wBAAgB,uBAAuB,IAAI,gCAAgC,GAAG,SAAS,CAEtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2UAkChE"}
@@ -8,6 +8,7 @@ import { useChatManagerContext } from "./chat-connection-context.js";
8
8
  import { mapActiveChatConnectionState } from "./chat-connection-lifecycle.js";
9
9
  import { createChatReconnectRecoveryTracker } from "./chat-reconnect-recovery.js";
10
10
  import { prepareThinkChatSendRequest } from "./think-chat-request.js";
11
+ import { useGraphRefreshAfterTurn } from "#hooks/use-graph-refresh-after-turn";
11
12
  const ActiveChatConnectionContext = createContext(undefined);
12
13
  export function useActiveChatConnection() {
13
14
  return useContext(ActiveChatConnectionContext);
@@ -73,6 +74,7 @@ function ThinkChatSession(props) {
73
74
  prepareSendMessagesRequest: prepareThinkChatSendRequest,
74
75
  resume: true,
75
76
  });
77
+ useGraphRefreshAfterTurn(chatData.isStreaming);
76
78
  useEffect(() => {
77
79
  if (!pendingStaleResponseId || chatData.isToolContinuation)
78
80
  return;
@@ -0,0 +1,11 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ export type AssistantIcon = ComponentType<{
3
+ className?: string;
4
+ }>;
5
+ export type AssistantIconProviderProps = {
6
+ icon?: AssistantIcon;
7
+ children: ReactNode;
8
+ };
9
+ export declare function AssistantIconProvider(props: AssistantIconProviderProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function useAssistantIcon(): AssistantIcon | undefined;
11
+ //# sourceMappingURL=AssistantIconProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantIconProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AssistantIconProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIlE,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAItE;AAED,wBAAgB,gBAAgB,8BAE/B"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, use } from "react";
3
+ const AssistantIconContext = createContext(undefined);
4
+ export function AssistantIconProvider(props) {
5
+ const { icon, children } = props;
6
+ return _jsx(AssistantIconContext.Provider, { value: icon, children: children });
7
+ }
8
+ export function useAssistantIcon() {
9
+ return use(AssistantIconContext);
10
+ }
@@ -7,7 +7,6 @@ export type KnowledgeGraphStateContextValue = {
7
7
  isKnowledgeGraphUnavailable: boolean;
8
8
  isLoading: boolean;
9
9
  error: Error | null;
10
- lastDataVersionChange?: Date;
11
10
  };
12
11
  export declare function useKnowledgeGraphState(): KnowledgeGraphStateContextValue;
13
12
  //# sourceMappingURL=KnowledgeGraphStateContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgeGraphStateContext.d.ts","sourceRoot":"","sources":["../../src/providers/KnowledgeGraphStateContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,eAAO,MAAM,0BAA0B,sEAAwE,CAAC;AAEhH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnD,0BAA0B,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC9D,2BAA2B,EAAE,OAAO,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,sBAAsB,IAAI,+BAA+B,CAQxE"}
1
+ {"version":3,"file":"KnowledgeGraphStateContext.d.ts","sourceRoot":"","sources":["../../src/providers/KnowledgeGraphStateContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAEjF,eAAO,MAAM,0BAA0B,sEAAwE,CAAC;AAEhH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnD,0BAA0B,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC9D,2BAA2B,EAAE,OAAO,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,sBAAsB,IAAI,+BAA+B,CAQxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgeGraphStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/KnowledgeGraphStateProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,MAAM,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gCAAgC,2CAyJlF"}
1
+ {"version":3,"file":"KnowledgeGraphStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/KnowledgeGraphStateProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,MAAM,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gCAAgC,2CA2IlF"}
@@ -8,7 +8,7 @@ import { deriveAvailability } from "./knowledge-graph-availability.js";
8
8
  import { useKnowledgeGraphPollInterval } from "./KnowledgeGraphPollingProvider.js";
9
9
  import { KnowledgeGraphStateContext } from "./KnowledgeGraphStateContext.js";
10
10
  import { useMantaClient } from "./MantaClientProvider.js";
11
- import { invalidateQueries } from "#lib/tanstack-query";
11
+ import { invalidateGraphDerivedQueries } from "#shared/graph-derived-queries";
12
12
  export function KnowledgeGraphStateProvider(props) {
13
13
  const { children, datastoreId } = props;
14
14
  const { mantaClient } = useMantaClient();
@@ -17,9 +17,11 @@ export function KnowledgeGraphStateProvider(props) {
17
17
  const pollIntervalMs = useKnowledgeGraphPollInterval();
18
18
  const reportedNotProvisionedDatastoreIds = useRef(new Set());
19
19
  const [previousDataVersion, setPreviousDataVersion] = useState();
20
- const [lastDataVersionChange, setLastDataVersionChange] = useState();
21
20
  const [cachedCapacity, setCachedCapacity] = useState();
22
21
  const { data, isLoading, error } = useKnowledgeGraphStateQuery(mantaClient, { dataVersion: previousDataVersion }, {
22
+ // Keep dataVersion out of the key. It only lets the server skip the triple count, and with one cache
23
+ // entry per version the effect below can bounce between two cached answers forever.
24
+ queryKey: useKnowledgeGraphStateQuery.getKey(),
23
25
  refetchInterval: pollIntervalMs,
24
26
  refetchIntervalInBackground: false,
25
27
  staleTime: 0,
@@ -99,21 +101,9 @@ export function KnowledgeGraphStateProvider(props) {
99
101
  ]);
100
102
  useEffect(() => {
101
103
  const currentDataVersion = data?.knowledgeGraphState?.dataVersion?.uniqueId;
102
- if (currentDataVersion && previousDataVersion !== null && previousDataVersion !== currentDataVersion) {
103
- const changeTimestamp = new Date();
104
- setLastDataVersionChange(changeTimestamp);
105
- void invalidateQueries(queryClient, [
106
- ["ActionPlans"],
107
- ["ActionPlanSamples"],
108
- ["SparqlQuery"],
109
- ["ExplainRDFoxFact"],
110
- ["CurrentFactValue"],
111
- ["ValidateActionPlan"],
112
- ["Rules"],
113
- // Every ldo-ui query is graph-derived, so a version change invalidates the whole namespace.
114
- ["ldo-ui"],
115
- ]);
116
- console.debug(`Knowledge graph dataVersion changed at ${changeTimestamp.toISOString()}, invalidating RDFox-related queries`);
104
+ if (currentDataVersion && isPresent(previousDataVersion) && previousDataVersion !== currentDataVersion) {
105
+ void invalidateGraphDerivedQueries(queryClient);
106
+ console.debug("Knowledge graph dataVersion changed, invalidating RDFox-related queries");
117
107
  }
118
108
  if (currentDataVersion && currentDataVersion !== previousDataVersion) {
119
109
  console.debug(`Updating cached dataVersion from ${previousDataVersion} to ${currentDataVersion}`);
@@ -126,7 +116,6 @@ export function KnowledgeGraphStateProvider(props) {
126
116
  isKnowledgeGraphUnavailable: isPresent(knowledgeGraphAvailability) && knowledgeGraphAvailability !== "online",
127
117
  isLoading,
128
118
  error: error,
129
- lastDataVersionChange,
130
- }), [enrichedKnowledgeGraphState, knowledgeGraphAvailability, isLoading, error, lastDataVersionChange]);
119
+ }), [enrichedKnowledgeGraphState, knowledgeGraphAvailability, isLoading, error]);
131
120
  return _jsx(KnowledgeGraphStateContext.Provider, { value: value, children: children });
132
121
  }
@@ -1,6 +1,7 @@
1
1
  import { QueryClient } from "@tanstack/react-query";
2
2
  import type { ReactNode } from "react";
3
3
  export * from "./ActiveDatastoreProvider.js";
4
+ export * from "./AssistantIconProvider.js";
4
5
  export * from "./AssistantNameProvider.js";
5
6
  export * from "./GenerateStructuredDataProvider.js";
6
7
  export * from "./MantaClientProvider.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAsCF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAc9C;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG1G,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAItE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAsCF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAc9C;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG1G,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAItE"}
@@ -12,6 +12,7 @@ import { ThemeProvider } from "./ThemeProvider.js";
12
12
  import { TooltipProvider as TooltipStateProvider } from "./TooltipProvider.js";
13
13
  import { TooltipProvider } from "#components/tooltip/index";
14
14
  export * from "./ActiveDatastoreProvider.js";
15
+ export * from "./AssistantIconProvider.js";
15
16
  export * from "./AssistantNameProvider.js";
16
17
  export * from "./GenerateStructuredDataProvider.js";
17
18
  export * from "./MantaClientProvider.js";
@@ -27,5 +27,5 @@ export function DiffRow(props) {
27
27
  const { field, before, after } = props.diff;
28
28
  const changeType = diffChangeType(props.diff);
29
29
  const badge = diffBadge[changeType];
30
- return (_jsxs("div", { className: cn("grid grid-cols-[fit-content(150px)_minmax(0,1fr)_auto] items-baseline gap-2 rounded-md px-2 py-1", diffRowTint[changeType]), children: [_jsx("span", { className: "typography-small text-muted-foreground truncate", title: field, children: field }), _jsxs("div", { className: "min-w-0 line-clamp-2 break-words text-right", children: [isPresent(before) && (_jsx("span", { className: "typography-small text-muted-foreground line-through mr-1.5", title: before, children: shortenValue(before) })), isPresent(after) && (_jsx("span", { className: "typography-small text-default-foreground", title: after, children: shortenValue(after) }))] }), _jsx(Badge, { size: "sm", variant: badge.variant, className: cn("shrink-0", badge.className), children: badge.label })] }));
30
+ return (_jsxs("div", { className: cn("grid grid-cols-[fit-content(40%)_minmax(0,1fr)_auto] items-baseline gap-2 rounded-md px-2 py-1", diffRowTint[changeType]), children: [_jsx("span", { className: "typography-small text-muted-foreground truncate", title: field, children: field }), _jsxs("div", { className: "min-w-0 break-words text-right", children: [isPresent(before) && (_jsx("span", { className: "typography-small text-muted-foreground line-through mr-1.5", title: before, children: shortenValue(before) })), isPresent(after) && (_jsx("span", { className: "typography-small text-default-foreground", title: after, children: shortenValue(after) }))] }), _jsx(Badge, { size: "sm", variant: badge.variant, className: cn("shrink-0", badge.className), children: badge.label })] }));
31
31
  }
@@ -1,6 +1,7 @@
1
1
  import type { MantaModelId } from "@manta-eu/client/shared/model";
2
2
  import type { ReactNode } from "react";
3
3
  import type { ChatDraft, Datastore, User } from "#lib/chat-types";
4
+ import { type AssistantIcon } from "#providers/AssistantIconProvider";
4
5
  type ChatRouteProps = {
5
6
  datastore?: Datastore;
6
7
  user: User;
@@ -14,6 +15,7 @@ type ChatRouteProps = {
14
15
  title?: string;
15
16
  welcomeSubtitle?: string;
16
17
  assistantName?: string;
18
+ assistantIcon?: AssistantIcon;
17
19
  mark?: ReactNode;
18
20
  };
19
21
  export declare function ChatRoute(props: ChatRouteProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/chat/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGlE,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA4C9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/chat/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAG7F,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA+C9C"}
@@ -1,8 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Chat } from "#components/chat-view/index";
3
3
  import { RouteLayout } from "#components/layouts/RouteLayout";
4
+ import { AssistantIconProvider } from "#providers/AssistantIconProvider";
4
5
  import { AssistantNameProvider } from "#providers/AssistantNameProvider";
5
6
  export function ChatRoute(props) {
6
- const { datastore, user, logout, isOperator, canSwitchDatastore, datastores, allowedModels, initialPrompt, initialDraft, title, welcomeSubtitle, assistantName, mark, } = props;
7
- return (_jsx(AssistantNameProvider, { name: assistantName, children: _jsx(RouteLayout, { user: user, datastore: datastore, datastores: datastores, isOperator: isOperator, canSwitchDatastore: canSwitchDatastore, logout: logout, floatingMobileMenu: true, title: title, mark: mark, children: _jsx(Chat, { datastore: datastore, user: user, onLogout: logout, isOperator: isOperator, allowedModels: allowedModels, initialPrompt: initialPrompt, initialDraft: initialDraft, welcomeSubtitle: welcomeSubtitle, mark: mark }) }) }));
7
+ const { datastore, user, logout, isOperator, canSwitchDatastore, datastores, allowedModels, initialPrompt, initialDraft, title, welcomeSubtitle, assistantName, assistantIcon, mark, } = props;
8
+ return (_jsx(AssistantNameProvider, { name: assistantName, children: _jsx(AssistantIconProvider, { icon: assistantIcon, children: _jsx(RouteLayout, { user: user, datastore: datastore, datastores: datastores, isOperator: isOperator, canSwitchDatastore: canSwitchDatastore, logout: logout, floatingMobileMenu: true, title: title, mark: mark, children: _jsx(Chat, { datastore: datastore, user: user, onLogout: logout, isOperator: isOperator, allowedModels: allowedModels, initialPrompt: initialPrompt, initialDraft: initialDraft, welcomeSubtitle: welcomeSubtitle, mark: mark }) }) }) }));
8
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ActionFormDialog.d.ts","sourceRoot":"","sources":["../../../../../src/routes/data-explorer/components/record-detail/ActionFormDialog.tsx"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAY7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,IAAI,CAAC;CAC7C,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAkH5D"}
1
+ {"version":3,"file":"ActionFormDialog.d.ts","sourceRoot":"","sources":["../../../../../src/routes/data-explorer/components/record-detail/ActionFormDialog.tsx"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAY7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,IAAI,CAAC;CAC7C,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAwI5D"}
@@ -28,6 +28,7 @@ export function ActionFormDialog(props) {
28
28
  const baselineRef = useRef(null);
29
29
  const [refusal, setRefusal] = useState(null);
30
30
  const [formElement, setFormElement] = useState(null);
31
+ const [isReadingForm, setIsReadingForm] = useState(false);
31
32
  const attachForm = useCallback((element) => setFormElement(element), []);
32
33
  const { data, isLoading, error } = useShaclShapesQuery(mantaClient, { shapeIri: actionShape }, { enabled: open });
33
34
  const hasShapesError = isPresent(error);
@@ -38,25 +39,38 @@ export function ActionFormDialog(props) {
38
39
  useEffect(() => {
39
40
  if (!formElement || !isUpdate)
40
41
  return;
42
+ let cancelled = false;
41
43
  // Baseline is the form's own serialization: its editors normalize literals, the triples do not.
42
- function captureBaseline() {
44
+ async function captureBaseline() {
43
45
  const store = formElement?.toRDF();
44
- const baseline = store ? baselineFromStore(store, subjectIri) : null;
45
- if (baseline)
46
+ const baseline = store ? await baselineFromStore(store, subjectIri) : null;
47
+ if (baseline && !cancelled)
46
48
  baselineRef.current = baseline;
47
49
  }
48
- captureBaseline();
49
- formElement.addEventListener("ready", captureBaseline);
50
- return () => formElement.removeEventListener("ready", captureBaseline);
50
+ function onReady() {
51
+ void captureBaseline();
52
+ }
53
+ onReady();
54
+ formElement.addEventListener("ready", onReady);
55
+ return () => {
56
+ cancelled = true;
57
+ formElement.removeEventListener("ready", onReady);
58
+ };
51
59
  }, [formElement, isUpdate, subjectIri]);
52
- function submit() {
60
+ async function submit() {
53
61
  const store = formElement?.toRDF();
54
62
  const baseline = baselineRef.current;
55
63
  if (!store || (isUpdate && !baseline)) {
56
64
  setRefusal("The form is not ready yet.");
57
65
  return;
58
66
  }
59
- const edited = propertiesFromStore(store, subjectIri);
67
+ setIsReadingForm(true);
68
+ const edited = await propertiesFromStore(store, subjectIri).catch(() => null);
69
+ setIsReadingForm(false);
70
+ if (!edited) {
71
+ setRefusal("The form could not be read.");
72
+ return;
73
+ }
60
74
  if (isUpdate && baseline) {
61
75
  const cleared = removedPredicates(baseline, edited);
62
76
  if (isPresent(cleared)) {
@@ -72,5 +86,5 @@ export function ActionFormDialog(props) {
72
86
  setRefusal(null);
73
87
  onSubmit(properties);
74
88
  }
75
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[85vh] flex-col overflow-hidden", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { text: copy.title }), _jsxs(DialogDescription, { children: [copy.description, " Shape ", _jsx("code", { className: "font-mono", children: compactUri(actionShape) }), "."] })] }), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", children: [isLoading && _jsx(LoadingRows, { rows: 4 }), hasShapesError && _jsx(StatusText, { children: "Failed to load the form for this shape." }), !isLoading && !hasShapesError && !shapesTurtle && _jsx(StatusText, { children: "This shape defines no fields." }), shapesTurtle && (_jsx(ShaclForm, { shapes: shapesTurtle, shapeSubject: actionShape, values: valuesTurtle, valuesSubject: subjectIri, collapse: "open", formRef: attachForm }))] }), refusal && (_jsx(StatusText, { className: "text-error-foreground", role: "alert", children: refusal })), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "tertiary", size: "sm", onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(Button, { size: "sm", onClick: submit, isLoading: isPending, disabled: !shapesTurtle, children: copy.submitLabel })] })] }) }));
89
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[85vh] flex-col overflow-hidden", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { text: copy.title }), _jsxs(DialogDescription, { children: [copy.description, " Shape ", _jsx("code", { className: "font-mono", children: compactUri(actionShape) }), "."] })] }), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto", children: [isLoading && _jsx(LoadingRows, { rows: 4 }), hasShapesError && _jsx(StatusText, { children: "Failed to load the form for this shape." }), !isLoading && !hasShapesError && !shapesTurtle && _jsx(StatusText, { children: "This shape defines no fields." }), shapesTurtle && (_jsx(ShaclForm, { shapes: shapesTurtle, shapeSubject: actionShape, values: valuesTurtle, valuesSubject: subjectIri, collapse: "open", formRef: attachForm }))] }), refusal && (_jsx(StatusText, { className: "text-error-foreground", role: "alert", children: refusal })), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "tertiary", size: "sm", onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(Button, { size: "sm", onClick: () => void submit(), isLoading: isPending || isReadingForm, disabled: !shapesTurtle, children: copy.submitLabel })] })] }) }));
76
90
  }
@@ -1,9 +1,7 @@
1
1
  import type { ShaclFormStore } from "@ulb-darmstadt/shacl-form";
2
2
  export type PropertyMap = Record<string, unknown>;
3
- export declare function propertiesFromStore(store: ShaclFormStore, subjectIri: string): PropertyMap;
4
- export declare function baselineFromStore(store: ShaclFormStore, subjectIri: string): PropertyMap | null;
5
- /** Only what changed: the backend merges the rest, and a predicate the form dropped cannot express a retraction. */
3
+ export declare function propertiesFromStore(store: ShaclFormStore, subjectIri: string): Promise<PropertyMap>;
4
+ export declare function baselineFromStore(store: ShaclFormStore, subjectIri: string): Promise<PropertyMap | null>;
6
5
  export declare function changedProperties(current: PropertyMap, next: PropertyMap): PropertyMap;
7
- /** The predicates the edit cleared: a patch cannot retract, so the caller must refuse rather than claim success. */
8
6
  export declare function removedPredicates(current: PropertyMap, next: PropertyMap): string[];
9
7
  //# sourceMappingURL=action-properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action-properties.d.ts","sourceRoot":"","sources":["../../../../../src/routes/data-explorer/components/record-detail/action-properties.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2DlD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAE1F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI/F;AASD,oHAAoH;AACpH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAUtF;AAED,oHAAoH;AACpH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAEnF"}
1
+ {"version":3,"file":"action-properties.d.ts","sourceRoot":"","sources":["../../../../../src/routes/data-explorer/components/record-detail/action-properties.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAKlD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAKzG;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAI9G;AASD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAUtF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAEnF"}
@@ -1,54 +1,14 @@
1
- import { namespaces, wellKnownPredicates } from "@manta-eu/client/shared/rdf-namespaces";
2
- import { isPresent } from "@manta-eu/lib/present";
3
- const xsdString = `${namespaces.xsd}string`;
4
- /** The form stamps this on every serialization; it describes the shape, not the record. */
1
+ import { documentFromQuads } from "@manta-eu/client/shared/action-document";
2
+ import { namespaces } from "@manta-eu/client/shared/rdf-namespaces";
3
+ // The form stamps this on every serialization
5
4
  const conformsTo = `${namespaces.dcterms}conformsTo`;
6
- function literalValue(value, datatype) {
7
- if (!datatype || datatype === xsdString)
8
- return value;
9
- return { "@value": value, "@type": datatype };
10
- }
11
- function addValue(properties, predicate, value) {
12
- const existing = properties[predicate];
13
- if (existing === undefined) {
14
- properties[predicate] = value;
15
- return;
16
- }
17
- properties[predicate] = Array.isArray(existing) ? [...existing, value] : [existing, value];
18
- }
19
- // `seen` is path-scoped: a cycle still terminates, but two references to one blank node each get described.
20
- function nodeDescription(store, subject, visited, includeType) {
21
- const properties = {};
22
- const seen = new Set(visited).add(subject);
23
- for (const quad of store.getQuads(null, null, null, null)) {
24
- if (quad.subject.value !== subject)
25
- continue;
26
- if (quad.predicate.value === conformsTo)
27
- continue;
28
- const isType = quad.predicate.value === wellKnownPredicates.type;
29
- if (isType && !includeType)
30
- continue;
31
- let value;
32
- if (quad.object.termType === "NamedNode") {
33
- value = isType ? quad.object.value : { "@id": quad.object.value };
34
- }
35
- else if (quad.object.termType === "BlankNode") {
36
- if (seen.has(quad.object.value))
37
- continue;
38
- value = nodeDescription(store, quad.object.value, seen, true);
39
- }
40
- else {
41
- value = literalValue(quad.object.value, quad.object.datatype?.value);
42
- }
43
- addValue(properties, isType ? "@type" : quad.predicate.value, value);
44
- }
5
+ export async function propertiesFromStore(store, subjectIri) {
6
+ const quads = [...store].filter((quad) => quad.predicate.value !== conformsTo);
7
+ const { "@id": _id, "@type": _type, ...properties } = await documentFromQuads(quads, subjectIri);
45
8
  return properties;
46
9
  }
47
- export function propertiesFromStore(store, subjectIri) {
48
- return nodeDescription(store, subjectIri, new Set(), false);
49
- }
50
- export function baselineFromStore(store, subjectIri) {
51
- if (!isPresent(store.getQuads(null, null, null, null)))
10
+ export async function baselineFromStore(store, subjectIri) {
11
+ if (store.size === 0)
52
12
  return null;
53
13
  return propertiesFromStore(store, subjectIri);
54
14
  }
@@ -56,7 +16,6 @@ function sameValue(left, right) {
56
16
  const normalize = (value) => Array.isArray(value) ? JSON.stringify(value.map((entry) => JSON.stringify(entry)).sort()) : JSON.stringify(value);
57
17
  return normalize(left) === normalize(right);
58
18
  }
59
- /** Only what changed: the backend merges the rest, and a predicate the form dropped cannot express a retraction. */
60
19
  export function changedProperties(current, next) {
61
20
  const changed = {};
62
21
  for (const [predicate, value] of Object.entries(next)) {
@@ -66,7 +25,6 @@ export function changedProperties(current, next) {
66
25
  }
67
26
  return changed;
68
27
  }
69
- /** The predicates the edit cleared: a patch cannot retract, so the caller must refuse rather than claim success. */
70
28
  export function removedPredicates(current, next) {
71
29
  return Object.keys(current).filter((predicate) => !(predicate in next));
72
30
  }