@manta-eu/react 0.1.5 → 0.1.6

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 (118) hide show
  1. package/dist/components/chat/chat-input/index.d.ts +1 -1
  2. package/dist/components/chat/chat-input/index.d.ts.map +1 -1
  3. package/dist/components/chat/chat-input/index.js +4 -5
  4. package/dist/components/chat-view/Chat.js +13 -3
  5. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  6. package/dist/components/layouts/Sidebar.js +15 -2
  7. package/dist/components/sidebar/nav-menu.d.ts +2 -0
  8. package/dist/components/sidebar/nav-menu.d.ts.map +1 -1
  9. package/dist/components/sidebar/nav-menu.js +11 -6
  10. package/dist/components/table/index.d.ts +26 -0
  11. package/dist/components/table/index.d.ts.map +1 -1
  12. package/dist/components/table/index.js +31 -1
  13. package/dist/explain-fact/DatalogCode.d.ts.map +1 -1
  14. package/dist/explain-fact/DatalogCode.js +7 -2
  15. package/dist/explain-fact/FactValue.js +3 -3
  16. package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.d.ts.map +1 -1
  17. package/dist/explain-fact/proof-tree/ProofTreeFormulaFooter.js +2 -1
  18. package/dist/globals.css +10 -102
  19. package/dist/graph/createNodeRouter.d.ts.map +1 -1
  20. package/dist/graph/createNodeRouter.js +3 -0
  21. package/dist/graph/nodes/BrandFacetRuleView.d.ts.map +1 -1
  22. package/dist/graph/nodes/BrandFacetRuleView.js +6 -4
  23. package/dist/graph/nodes/BrandFontFamilyView.d.ts +3 -0
  24. package/dist/graph/nodes/BrandFontFamilyView.d.ts.map +1 -0
  25. package/dist/graph/nodes/BrandFontFamilyView.js +56 -0
  26. package/dist/graph/nodes/BrandFontUploadButton.d.ts +6 -0
  27. package/dist/graph/nodes/BrandFontUploadButton.d.ts.map +1 -0
  28. package/dist/graph/nodes/BrandFontUploadButton.js +65 -0
  29. package/dist/graph/nodes/BrandGuidelinesView.d.ts.map +1 -1
  30. package/dist/graph/nodes/BrandGuidelinesView.js +2 -6
  31. package/dist/graph/nodes/brand-font.d.ts +12 -0
  32. package/dist/graph/nodes/brand-font.d.ts.map +1 -0
  33. package/dist/graph/nodes/brand-font.js +12 -0
  34. package/dist/graph/nodes/brand-shared.d.ts +3 -2
  35. package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
  36. package/dist/graph/nodes/brand-shared.js +3 -2
  37. package/dist/hooks/use-connection-problems.d.ts +15 -0
  38. package/dist/hooks/use-connection-problems.d.ts.map +1 -0
  39. package/dist/hooks/use-connection-problems.js +9 -0
  40. package/dist/hooks/use-font-face.d.ts +3 -0
  41. package/dist/hooks/use-font-face.d.ts.map +1 -0
  42. package/dist/hooks/use-font-face.js +33 -0
  43. package/dist/hooks/use-graph-refresh-after-turn.d.ts +2 -0
  44. package/dist/hooks/use-graph-refresh-after-turn.d.ts.map +1 -0
  45. package/dist/hooks/use-graph-refresh-after-turn.js +12 -0
  46. package/dist/hooks/useAuth.d.ts +1 -0
  47. package/dist/hooks/useAuth.d.ts.map +1 -1
  48. package/dist/hooks/useAuth.js +32 -9
  49. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  50. package/dist/lib/activity-changeset.d.ts.map +1 -1
  51. package/dist/lib/activity-changeset.js +6 -3
  52. package/dist/lib/datastore-route-table.d.ts +1 -0
  53. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  54. package/dist/lib/datastore-route-table.js +2 -0
  55. package/dist/lib/tool-icons.d.ts.map +1 -1
  56. package/dist/lib/tool-icons.js +1 -5
  57. package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
  58. package/dist/providers/ActiveChatProvider.js +2 -0
  59. package/dist/providers/KnowledgeGraphStateContext.d.ts +0 -1
  60. package/dist/providers/KnowledgeGraphStateContext.d.ts.map +1 -1
  61. package/dist/providers/KnowledgeGraphStateProvider.d.ts.map +1 -1
  62. package/dist/providers/KnowledgeGraphStateProvider.js +8 -19
  63. package/dist/routes/activity/change-display.js +1 -1
  64. package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.d.ts.map +1 -1
  65. package/dist/routes/data-explorer/components/record-detail/ActionFormDialog.js +23 -9
  66. package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts +2 -4
  67. package/dist/routes/data-explorer/components/record-detail/action-properties.d.ts.map +1 -1
  68. package/dist/routes/data-explorer/components/record-detail/action-properties.js +8 -50
  69. package/dist/routes/integrations/connection-view.d.ts +4 -1
  70. package/dist/routes/integrations/connection-view.d.ts.map +1 -1
  71. package/dist/routes/integrations/connection-view.js +25 -5
  72. package/dist/routes/integrations/types.d.ts +1 -0
  73. package/dist/routes/integrations/types.d.ts.map +1 -1
  74. package/dist/shacl/shacl-form-types.d.ts +2 -3
  75. package/dist/shacl/shacl-form-types.d.ts.map +1 -1
  76. package/dist/shared/graph-derived-queries.d.ts +5 -0
  77. package/dist/shared/graph-derived-queries.d.ts.map +1 -0
  78. package/dist/shared/graph-derived-queries.js +28 -0
  79. package/package.json +8 -11
  80. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  81. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  82. package/dist/components/ai-elements/chain-of-thought.js +0 -57
  83. package/dist/components/context-menu.d.ts +0 -29
  84. package/dist/components/context-menu.d.ts.map +0 -1
  85. package/dist/components/context-menu.js +0 -67
  86. package/dist/components/hover-card.d.ts +0 -6
  87. package/dist/components/hover-card.d.ts.map +0 -1
  88. package/dist/components/hover-card.js +0 -15
  89. package/dist/components/layouts/ChatHistoryItem.d.ts +0 -9
  90. package/dist/components/layouts/ChatHistoryItem.d.ts.map +0 -1
  91. package/dist/components/layouts/ChatHistoryItem.js +0 -7
  92. package/dist/components/layouts/SectionHeader.d.ts +0 -8
  93. package/dist/components/layouts/SectionHeader.d.ts.map +0 -1
  94. package/dist/components/layouts/SectionHeader.js +0 -6
  95. package/dist/components/orbit-site/Block.d.ts +0 -8
  96. package/dist/components/orbit-site/Block.d.ts.map +0 -1
  97. package/dist/components/orbit-site/Block.js +0 -7
  98. package/dist/components/orbit-site/Inset.d.ts +0 -7
  99. package/dist/components/orbit-site/Inset.d.ts.map +0 -1
  100. package/dist/components/orbit-site/Inset.js +0 -6
  101. package/dist/components/orbit-site/Section.d.ts +0 -7
  102. package/dist/components/orbit-site/Section.d.ts.map +0 -1
  103. package/dist/components/orbit-site/Section.js +0 -6
  104. package/dist/components/orbit-site/ThemeSelector.d.ts +0 -3
  105. package/dist/components/orbit-site/ThemeSelector.d.ts.map +0 -1
  106. package/dist/components/orbit-site/ThemeSelector.js +0 -42
  107. package/dist/components/planning/SampleChanges.d.ts +0 -9
  108. package/dist/components/planning/SampleChanges.d.ts.map +0 -1
  109. package/dist/components/planning/SampleChanges.js +0 -117
  110. package/dist/components/tool-invocation-card/index.d.ts +0 -8
  111. package/dist/components/tool-invocation-card/index.d.ts.map +0 -1
  112. package/dist/components/tool-invocation-card/index.js +0 -7
  113. package/dist/lib/schema-fields.d.ts +0 -2
  114. package/dist/lib/schema-fields.d.ts.map +0 -1
  115. package/dist/lib/schema-fields.js +0 -3
  116. package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts +0 -7
  117. package/dist/routes/memories/components/ConflictTimeoutFooter.d.ts.map +0 -1
  118. 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;;;;;;;;;sBAkB4nuJ,CAAC;;sBAAwF,CAAC;iBAAsC,CAAC;uBAA4C,CAAC;;;mBAAuI,CAAC;;;;;EAD9gvJ"}
@@ -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)
@@ -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;AAuDtB,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,7 @@ 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,
23
19
  markAsLowRisk: CheckCircle2,
24
20
  readUploadedFile: Paperclip,
25
21
  };
@@ -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;
@@ -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
  }
@@ -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 +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
  }
@@ -1,5 +1,5 @@
1
1
  import type { Status } from "./components/StatusChip.js";
2
- import type { ProviderConnection } from "./types.js";
2
+ import type { OAuthConnection, ProviderConnection } from "./types.js";
3
3
  /**
4
4
  * The display projection of a `ProviderConnection`. It retains the source only so
5
5
  * row-level actions can dispatch correctly; rendering otherwise uses normalized fields.
@@ -24,5 +24,8 @@ export type ConnectionView = {
24
24
  syncedLabel?: string;
25
25
  namedAccount?: NamedAccount;
26
26
  };
27
+ export type GrantFacts = Pick<OAuthConnection, "revokedAt" | "grantExpiresAt">;
28
+ /** The accounts whose grant a person has to renew: revoked, expired, or inside the warning window. */
29
+ export declare function connectionProblems<T extends GrantFacts>(connections: readonly T[]): T[];
27
30
  export declare function toConnectionView(connection: ProviderConnection): ConnectionView;
28
31
  //# sourceMappingURL=connection-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-view.d.ts","sourceRoot":"","sources":["../../../src/routes/integrations/connection-view.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAuD,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEvG;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AA6EF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,kBAAkB,GAAG,cAAc,CAoB/E"}
1
+ {"version":3,"file":"connection-view.d.ts","sourceRoot":"","sources":["../../../src/routes/integrations/connection-view.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAsC,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEvG;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAiDF,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAC;AAY/E,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvF;AA8BD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,kBAAkB,GAAG,cAAc,CAoB/E"}
@@ -1,6 +1,6 @@
1
1
  import { GQLGmailIntegrationStatus, GQLIntegration, GQLRelayIntegrationStatus } from "@manta-eu/client";
2
2
  import { isPresent } from "@manta-eu/lib/present";
3
- import { formatDistanceToNow, isValid } from "date-fns";
3
+ import { addDays, formatDistanceToNow, isAfter, isValid } from "date-fns";
4
4
  import { match } from "ts-pattern";
5
5
  // Fallback nouns shown until the ontology carries rdfs:labels for these classes (MNT-503).
6
6
  // https://linear.app/manta-eu/issue/MNT-503/add-rdfslabel-to-provider-entity-classes-in-the-ontology
@@ -31,6 +31,8 @@ const statusMap = {
31
31
  };
32
32
  const oauthConnectedStatus = { label: "Connected", tone: "success" };
33
33
  const oauthRevokedStatus = { label: "Reconnect needed", tone: "error" };
34
+ const oauthExpiredStatus = { label: "Expired", tone: "error" };
35
+ const grantExpiryWarningDays = 14;
34
36
  // Integrations whose account is limited to what was picked at connect time, so an empty pick reads nothing.
35
37
  const oauthIncludedResourcesLabels = {
36
38
  [GQLIntegration.Dash]: { label: "Folders", noneLabel: "No folders selected" },
@@ -43,14 +45,32 @@ function connectedLabel(connectedAt) {
43
45
  return undefined;
44
46
  return `Connected ${formatDistanceToNow(connected, { addSuffix: true })}`;
45
47
  }
46
- function oauthScope({ integration, includedResources, revokedAt, }) {
47
- const revoked = isPresent(revokedAt);
48
- const status = revoked ? oauthRevokedStatus : oauthConnectedStatus;
48
+ function grantStatus({ revokedAt, grantExpiresAt }) {
49
+ if (isPresent(revokedAt))
50
+ return oauthRevokedStatus;
51
+ if (!isPresent(grantExpiresAt))
52
+ return undefined;
53
+ const expiresAt = new Date(grantExpiresAt);
54
+ const now = new Date();
55
+ if (!isValid(expiresAt) || isAfter(expiresAt, addDays(now, grantExpiryWarningDays)))
56
+ return undefined;
57
+ if (!isAfter(expiresAt, now))
58
+ return oauthExpiredStatus;
59
+ return { label: `Expires ${formatDistanceToNow(expiresAt, { addSuffix: true })}`, tone: "warning" };
60
+ }
61
+ /** The accounts whose grant a person has to renew: revoked, expired, or inside the warning window. */
62
+ export function connectionProblems(connections) {
63
+ return connections.filter((connection) => isPresent(grantStatus(connection)));
64
+ }
65
+ function oauthScope(connection) {
66
+ const { integration, includedResources } = connection;
67
+ const grant = grantStatus(connection);
68
+ const status = grant ?? oauthConnectedStatus;
49
69
  const labels = oauthIncludedResourcesLabels[integration];
50
70
  if (!labels || !includedResources)
51
71
  return { status };
52
72
  if (!isPresent(includedResources)) {
53
- return { status: revoked ? oauthRevokedStatus : { label: labels.noneLabel, tone: "warning" } };
73
+ return { status: grant ?? { label: labels.noneLabel, tone: "warning" } };
54
74
  }
55
75
  return {
56
76
  status,
@@ -36,6 +36,7 @@ export type OAuthConnection = {
36
36
  includedResources?: GQLIncludedResource[];
37
37
  connectedAt?: string | null;
38
38
  revokedAt?: string | null;
39
+ grantExpiresAt?: string | null;
39
40
  };
40
41
  export type GmailConnection = {
41
42
  kind: "gmail";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/routes/integrations/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,MAAM,MAAM,UAAU,GAClB,GAAG,6BAA6B,EAAE,GAClC,OAAO,eAAe,GACtB,OAAO,eAAe,GACtB,OAAO,cAAc,CAAC;AAC1B,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAC7D,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,CAAC,EAAE,SAAS,MAAM,GAAG,UAAU,IAAI;IACjE,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,QAAQ,CAAC;IACrB,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,yBAAyB,CAAC;IAClC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,mGAAmG;AACnG,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,yBAAyB,CAAC;IAClC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAC;AAEvF,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,MAAM,GAAG,UAAU,IAAI;IAC9D,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/routes/integrations/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,MAAM,MAAM,UAAU,GAClB,GAAG,6BAA6B,EAAE,GAClC,OAAO,eAAe,GACtB,OAAO,eAAe,GACtB,OAAO,cAAc,CAAC;AAC1B,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAC7D,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,CAAC,EAAE,SAAS,MAAM,GAAG,UAAU,IAAI;IACjE,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,QAAQ,CAAC;IACrB,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,yBAAyB,CAAC;IAClC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,mGAAmG;AACnG,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,yBAAyB,CAAC;IAClC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAC;AAEvF,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,MAAM,GAAG,UAAU,IAAI;IAC9D,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B,CAAC"}
@@ -22,9 +22,8 @@ declare module "@ulb-darmstadt/shacl-form" {
22
22
  };
23
23
  };
24
24
  }
25
- /** The n3 Store `toRDF` returns, narrowed to the quad access this repo needs. */
26
- interface ShaclFormStore {
27
- getQuads(subject: unknown, predicate: unknown, object: unknown, graph: unknown): ShaclFormQuad[];
25
+ interface ShaclFormStore extends Iterable<ShaclFormQuad> {
26
+ readonly size: number;
28
27
  }
29
28
  interface ShaclFormElement extends HTMLElement {
30
29
  serialize(format?: SerializationFormat, graph?: ShaclFormStore): string;
@@ -1 +1 @@
1
- {"version":3,"file":"shacl-form-types.d.ts","sourceRoot":"","sources":["../../src/shacl/shacl-form-types.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,CAAC;AAEf,OAAO,QAAQ,2BAA2B,CAAC;IACzC,KAAY,mBAAmB,GAC3B,aAAa,GACb,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,CAAC;IAE1B,uFAAuF;IACvF,UAAiB,yBAAyB;QACxC,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC;KACpB;IAED,UAAiB,aAAa;QAC5B,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAC3E;IAED,iFAAiF;IACjF,UAAiB,cAAc;QAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,CAAC;KAClG;IAED,UAAiB,gBAAiB,SAAQ,WAAW;QACnD,SAAS,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;QACxE,KAAK,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;QAC9C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;KAC3E;IAED,UAAiB,oBAAqB,SAAQ,WAAW;QACvD,MAAM,EAAE;YACN,KAAK,EAAE,OAAO,CAAC;YACf,MAAM,CAAC,EAAE,yBAAyB,CAAC;SACpC,CAAC;KACH;CACF;AAED,OAAO,QAAQ,OAAO,CAAC;IAErB,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,YAAY,EAAE,OAAO,OAAO,EAAE,iBAAiB,CAC7C,OAAO,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;gBAC5C,oBAAoB,CAAC,EAAE,MAAM,CAAC;gBAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;gBAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;gBACzB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,eAAe,CAAC,EAAE,MAAM,CAAC;gBACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;aAC/B,EACD,WAAW,CACZ,CAAC;SACH;KACF;CACF"}
1
+ {"version":3,"file":"shacl-form-types.d.ts","sourceRoot":"","sources":["../../src/shacl/shacl-form-types.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,CAAC;AAEf,OAAO,QAAQ,2BAA2B,CAAC;IACzC,KAAY,mBAAmB,GAC3B,aAAa,GACb,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,CAAC;IAE1B,uFAAuF;IACvF,UAAiB,yBAAyB;QACxC,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC;KACpB;IAED,UAAiB,aAAa;QAC5B,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KAC3E;IAGD,UAAiB,cAAe,SAAQ,QAAQ,CAAC,aAAa,CAAC;QAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB;IAED,UAAiB,gBAAiB,SAAQ,WAAW;QACnD,SAAS,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;QACxE,KAAK,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;QAC9C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;KAC3E;IAED,UAAiB,oBAAqB,SAAQ,WAAW;QACvD,MAAM,EAAE;YACN,KAAK,EAAE,OAAO,CAAC;YACf,MAAM,CAAC,EAAE,yBAAyB,CAAC;SACpC,CAAC;KACH;CACF;AAED,OAAO,QAAQ,OAAO,CAAC;IAErB,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,YAAY,EAAE,OAAO,OAAO,EAAE,iBAAiB,CAC7C,OAAO,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;gBAC5C,oBAAoB,CAAC,EAAE,MAAM,CAAC;gBAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;gBAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;gBACzB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,eAAe,CAAC,EAAE,MAAM,CAAC;gBACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;aAC/B,EACD,WAAW,CACZ,CAAC;SACH;KACF;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { QueryClient } from "@tanstack/react-query";
2
+ import { type QueryWithGetKey } from "#lib/tanstack-query";
3
+ export declare const graphDerivedQueries: QueryWithGetKey[];
4
+ export declare function invalidateGraphDerivedQueries(queryClient: QueryClient): Promise<void>;
5
+ //# sourceMappingURL=graph-derived-queries.d.ts.map