@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.
- package/README.md +1 -0
- package/dist/components/chat/chat-input/index.d.ts +1 -1
- package/dist/components/chat/chat-input/index.d.ts.map +1 -1
- package/dist/components/chat/chat-input/index.js +4 -5
- package/dist/components/chat-view/Chat.js +13 -3
- package/dist/components/embedded-chat/index.d.ts.map +1 -1
- package/dist/components/embedded-chat/index.js +2 -1
- package/dist/components/layouts/Sidebar.d.ts.map +1 -1
- package/dist/components/layouts/Sidebar.js +15 -2
- package/dist/components/layouts/StatusScreen.d.ts.map +1 -1
- package/dist/components/layouts/StatusScreen.js +3 -1
- package/dist/components/sidebar/nav-menu.d.ts +2 -0
- package/dist/components/sidebar/nav-menu.d.ts.map +1 -1
- package/dist/components/sidebar/nav-menu.js +11 -6
- package/dist/components/table/index.d.ts +26 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +31 -1
- package/dist/components/thinking/manta-swim.d.ts.map +1 -1
- package/dist/components/thinking/manta-swim.js +3 -1
- package/dist/explain-fact/DatalogCode.d.ts.map +1 -1
- package/dist/explain-fact/DatalogCode.js +7 -2
- package/dist/explain-fact/FactValue.js +3 -3
- package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.d.ts.map +1 -1
- package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.js +2 -1
- package/dist/globals.css +10 -102
- package/dist/graph/createNodeRouter.d.ts.map +1 -1
- package/dist/graph/createNodeRouter.js +3 -0
- package/dist/graph/nodes/BrandFacetRuleView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandFacetRuleView.js +6 -4
- package/dist/graph/nodes/BrandFontFamilyView.d.ts +3 -0
- package/dist/graph/nodes/BrandFontFamilyView.d.ts.map +1 -0
- package/dist/graph/nodes/BrandFontFamilyView.js +56 -0
- package/dist/graph/nodes/BrandFontUploadButton.d.ts +6 -0
- package/dist/graph/nodes/BrandFontUploadButton.d.ts.map +1 -0
- package/dist/graph/nodes/BrandFontUploadButton.js +65 -0
- package/dist/graph/nodes/BrandGuidelinesView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandGuidelinesView.js +2 -6
- package/dist/graph/nodes/brand-font.d.ts +12 -0
- package/dist/graph/nodes/brand-font.d.ts.map +1 -0
- package/dist/graph/nodes/brand-font.js +12 -0
- package/dist/graph/nodes/brand-shared.d.ts +3 -2
- package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
- package/dist/graph/nodes/brand-shared.js +3 -2
- package/dist/hooks/use-connection-problems.d.ts +15 -0
- package/dist/hooks/use-connection-problems.d.ts.map +1 -0
- package/dist/hooks/use-connection-problems.js +9 -0
- package/dist/hooks/use-font-face.d.ts +3 -0
- package/dist/hooks/use-font-face.d.ts.map +1 -0
- package/dist/hooks/use-font-face.js +33 -0
- package/dist/hooks/use-graph-refresh-after-turn.d.ts +2 -0
- package/dist/hooks/use-graph-refresh-after-turn.d.ts.map +1 -0
- package/dist/hooks/use-graph-refresh-after-turn.js +12 -0
- package/dist/hooks/useAuth.d.ts +1 -0
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +32 -9
- package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
- package/dist/lib/activity-changeset.d.ts.map +1 -1
- package/dist/lib/activity-changeset.js +6 -3
- package/dist/lib/chat-types.d.ts +2 -0
- package/dist/lib/chat-types.d.ts.map +1 -1
- package/dist/lib/datastore-route-table.d.ts +1 -0
- package/dist/lib/datastore-route-table.d.ts.map +1 -1
- package/dist/lib/datastore-route-table.js +2 -0
- package/dist/lib/tool-icons.d.ts.map +1 -1
- package/dist/lib/tool-icons.js +2 -5
- package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
- package/dist/providers/ActiveChatProvider.js +2 -0
- package/dist/providers/AssistantIconProvider.d.ts +11 -0
- package/dist/providers/AssistantIconProvider.d.ts.map +1 -0
- package/dist/providers/AssistantIconProvider.js +10 -0
- package/dist/providers/KnowledgeGraphStateContext.d.ts +0 -1
- package/dist/providers/KnowledgeGraphStateContext.d.ts.map +1 -1
- package/dist/providers/KnowledgeGraphStateProvider.d.ts.map +1 -1
- package/dist/providers/KnowledgeGraphStateProvider.js +8 -19
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/routes/activity/change-display.js +1 -1
- package/dist/routes/chat/index.d.ts +2 -0
- package/dist/routes/chat/index.d.ts.map +1 -1
- package/dist/routes/chat/index.js +3 -2
- package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.js +23 -9
- package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts +2 -4
- package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/record-detail/action-properties.js +8 -50
- package/dist/routes/integrations/catalog-shape.d.ts +6 -2
- package/dist/routes/integrations/catalog-shape.d.ts.map +1 -1
- package/dist/routes/integrations/components/AddIntegrationModal.d.ts.map +1 -1
- package/dist/routes/integrations/components/AddIntegrationModal.js +1 -1
- package/dist/routes/integrations/components/connect-forms/types.d.ts +1 -0
- package/dist/routes/integrations/components/connect-forms/types.d.ts.map +1 -1
- package/dist/routes/integrations/connection-view.d.ts +4 -1
- package/dist/routes/integrations/connection-view.d.ts.map +1 -1
- package/dist/routes/integrations/connection-view.js +55 -12
- package/dist/routes/integrations/types.d.ts +25 -4
- package/dist/routes/integrations/types.d.ts.map +1 -1
- package/dist/routes/integrations/types.js +10 -0
- package/dist/shacl/shacl-form-types.d.ts +2 -3
- package/dist/shacl/shacl-form-types.d.ts.map +1 -1
- package/dist/shared/graph-derived-queries.d.ts +5 -0
- package/dist/shared/graph-derived-queries.d.ts.map +1 -0
- package/dist/shared/graph-derived-queries.js +28 -0
- package/package.json +15 -13
- package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
- package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
- package/dist/components/ai-elements/chain-of-thought.js +0 -57
- package/dist/components/context-menu.d.ts +0 -29
- package/dist/components/context-menu.d.ts.map +0 -1
- package/dist/components/context-menu.js +0 -67
- package/dist/components/hover-card.d.ts +0 -6
- package/dist/components/hover-card.d.ts.map +0 -1
- package/dist/components/hover-card.js +0 -15
- package/dist/components/layouts/ChatHistoryItem.d.ts +0 -9
- package/dist/components/layouts/ChatHistoryItem.d.ts.map +0 -1
- package/dist/components/layouts/ChatHistoryItem.js +0 -7
- package/dist/components/layouts/SectionHeader.d.ts +0 -8
- package/dist/components/layouts/SectionHeader.d.ts.map +0 -1
- package/dist/components/layouts/SectionHeader.js +0 -6
- package/dist/components/orbit-site/Block.d.ts +0 -8
- package/dist/components/orbit-site/Block.d.ts.map +0 -1
- package/dist/components/orbit-site/Block.js +0 -7
- package/dist/components/orbit-site/Inset.d.ts +0 -7
- package/dist/components/orbit-site/Inset.d.ts.map +0 -1
- package/dist/components/orbit-site/Inset.js +0 -6
- package/dist/components/orbit-site/Section.d.ts +0 -7
- package/dist/components/orbit-site/Section.d.ts.map +0 -1
- package/dist/components/orbit-site/Section.js +0 -6
- package/dist/components/orbit-site/ThemeSelector.d.ts +0 -3
- package/dist/components/orbit-site/ThemeSelector.d.ts.map +0 -1
- package/dist/components/orbit-site/ThemeSelector.js +0 -42
- package/dist/components/planning/SampleChanges.d.ts +0 -9
- package/dist/components/planning/SampleChanges.d.ts.map +0 -1
- package/dist/components/planning/SampleChanges.js +0 -117
- package/dist/components/tool-invocation-card/index.d.ts +0 -8
- package/dist/components/tool-invocation-card/index.d.ts.map +0 -1
- package/dist/components/tool-invocation-card/index.js +0 -7
- package/dist/lib/schema-fields.d.ts +0 -2
- package/dist/lib/schema-fields.d.ts.map +0 -1
- package/dist/lib/schema-fields.js +0 -3
- package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts +0 -7
- package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts.map +0 -1
- package/dist/routes/memories/components/ConflictTimeoutFooter.js +0 -6
package/dist/hooks/useAuth.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/hooks/useAuth.js
CHANGED
|
@@ -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
|
|
86
|
+
const leaveTo = useCallback((path) => {
|
|
81
87
|
queryClient.clear();
|
|
82
|
-
window.location.href =
|
|
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
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
180
|
+
endSession();
|
|
158
181
|
}
|
|
159
182
|
else {
|
|
160
183
|
toast.error(`Failed to load user data. (${contextError.message})`);
|
|
161
184
|
}
|
|
162
|
-
}, [contextEnabled, contextError,
|
|
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;;;;;;;;;
|
|
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;
|
|
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
|
|
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)
|
package/dist/lib/chat-types.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -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,
|
|
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,
|
|
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"}
|
package/dist/lib/tool-icons.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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;
|
|
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;
|
|
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,
|
|
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 {
|
|
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
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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"}
|
package/dist/providers/index.js
CHANGED
|
@@ -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(
|
|
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;
|
|
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,
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
48
|
-
|
|
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
|
}
|