@epam/ai-dial-chat-hooks 1.3.0-dev.253 → 1.3.0-dev.259

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@epam/ai-dial-chat-hooks",
3
3
  "description": "Framework-level React hooks extracted from AI DIAL Chat for building custom chat interfaces",
4
- "version": "1.3.0-dev.253",
4
+ "version": "1.3.0-dev.259",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -131,7 +131,7 @@
131
131
  }
132
132
  },
133
133
  "dependencies": {
134
- "@epam/ai-dial-chat-api-client": "1.3.0-dev.253",
134
+ "@epam/ai-dial-chat-api-client": "1.3.0-dev.259",
135
135
  "dompurify": "3.4.17",
136
136
  "fflate": "^0.8.3",
137
137
  "lru-cache": "^10.4.3",
@@ -140,23 +140,23 @@
140
140
  },
141
141
  "peerDependencies": {
142
142
  "react": "^19.2.8",
143
- "@epam/ai-dial-attachment-canvas": "1.3.0-dev.253",
144
- "@epam/ai-dial-attachment-input": "1.3.0-dev.253",
145
- "@epam/ai-dial-catalog": "1.3.0-dev.253",
146
- "@epam/ai-dial-chat-overlay": "1.3.0-dev.253",
147
- "@epam/ai-dial-chat-shared": "1.3.0-dev.253",
148
- "@epam/ai-dial-conversation-input": "1.3.0-dev.253",
149
- "@epam/ai-dial-mcp-apps": "1.3.0-dev.253",
150
- "@epam/ai-dial-projects": "1.3.0-dev.253",
151
- "@epam/ai-dial-publish-panel": "1.3.0-dev.253",
152
- "@epam/ai-dial-quotations": "1.3.0-dev.253",
143
+ "@epam/ai-dial-attachment-canvas": "1.3.0-dev.259",
144
+ "@epam/ai-dial-attachment-input": "1.3.0-dev.259",
145
+ "@epam/ai-dial-catalog": "1.3.0-dev.259",
146
+ "@epam/ai-dial-chat-overlay": "1.3.0-dev.259",
147
+ "@epam/ai-dial-chat-shared": "1.3.0-dev.259",
148
+ "@epam/ai-dial-conversation-input": "1.3.0-dev.259",
149
+ "@epam/ai-dial-mcp-apps": "1.3.0-dev.259",
150
+ "@epam/ai-dial-projects": "1.3.0-dev.259",
151
+ "@epam/ai-dial-publish-panel": "1.3.0-dev.259",
152
+ "@epam/ai-dial-quotations": "1.3.0-dev.259",
153
153
  "@epam/ai-dial-react-file-manager": "^0.4.0-dev.19",
154
- "@epam/ai-dial-scheduled-tasks": "1.3.0-dev.253",
155
- "@epam/ai-dial-share": "1.3.0-dev.253",
156
- "@epam/ai-dial-skill-editor": "1.3.0-dev.253",
157
- "@epam/ai-dial-source-panel": "1.3.0-dev.253",
154
+ "@epam/ai-dial-scheduled-tasks": "1.3.0-dev.259",
155
+ "@epam/ai-dial-share": "1.3.0-dev.259",
156
+ "@epam/ai-dial-skill-editor": "1.3.0-dev.259",
157
+ "@epam/ai-dial-source-panel": "1.3.0-dev.259",
158
158
  "@epam/ai-dial-ui-kit": "^0.16.0-dev.56",
159
- "@epam/ai-dial-usage-dashboard": "1.3.0-dev.253",
159
+ "@epam/ai-dial-usage-dashboard": "1.3.0-dev.259",
160
160
  "@modelcontextprotocol/sdk": "^1.32.1",
161
161
  "@epam/pdf-highlighter-kit": "^0.0.19"
162
162
  },
@@ -0,0 +1,14 @@
1
+ import { ProjectWatchEventDto } from '@epam/ai-dial-chat-api-client';
2
+ import { ProjectItem } from '@epam/ai-dial-projects';
3
+ /** The part of a projects watch event the list reacts to. */
4
+ export type ProjectWatchEvent = Pick<ProjectWatchEventDto, 'id' | 'action' | 'timestamp'>;
5
+ /** Returns the payload as a {@link ProjectWatchEvent}, or `undefined` when it is not one. */
6
+ export declare const parseProjectWatchEvent: (payload: unknown) => ProjectWatchEvent | undefined;
7
+ /**
8
+ * Returns the projects after one watch event: a create or update moves the
9
+ * project's `updatedAt` forward (never back), a delete removes it, and an
10
+ * event for an unlisted project is ignored. Returns `items` itself when
11
+ * nothing changed.
12
+ */
13
+ export declare const applyProjectEvent: (items: ProjectItem[], event: ProjectWatchEvent) => ProjectItem[];
14
+ //# sourceMappingURL=project-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-events.d.ts","sourceRoot":"","sources":["../../src/project/project-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,6DAA6D;AAC7D,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,oBAAoB,EACpB,IAAI,GAAG,QAAQ,GAAG,WAAW,CAC9B,CAAC;AAMF,6FAA6F;AAC7F,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,iBAAiB,GAAG,SAYtB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,WAAW,EAAE,EACpB,OAAO,iBAAiB,KACvB,WAAW,EAab,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ProjectWatchAction as e } from "@epam/ai-dial-chat-api-client";
2
+ //#region src/project/project-events.ts
3
+ var t = new Set(Object.values(e)), n = (e) => {
4
+ if (typeof e != "object" || !e) return;
5
+ let { id: n, action: r, timestamp: i } = e;
6
+ if (typeof n == "string" && typeof r == "string" && t.has(r) && typeof i == "number") return {
7
+ id: n,
8
+ action: r,
9
+ timestamp: i
10
+ };
11
+ }, r = (t, n) => {
12
+ let r = t.findIndex((e) => e.id === n.id);
13
+ if (r < 0) return t;
14
+ if (n.action === e.Delete) return t.filter((e, t) => t !== r);
15
+ let i = t[r];
16
+ if ((i.updatedAt ?? 0) >= n.timestamp) return t;
17
+ let a = [...t];
18
+ return a[r] = {
19
+ ...i,
20
+ updatedAt: n.timestamp
21
+ }, a;
22
+ };
23
+ //#endregion
24
+ export { r as applyProjectEvent, n as parseProjectWatchEvent };
@@ -75,6 +75,11 @@ export interface ProjectsConfiguredClient {
75
75
  path: string;
76
76
  };
77
77
  }, options?: RequestInit) => Promise<RawApiResponse>;
78
+ watchProjectsRaw: (request: {
79
+ watchProjectsBodyDto: {
80
+ ids: string[];
81
+ };
82
+ }, options?: RequestInit) => Promise<RawApiResponse>;
78
83
  }
79
84
  /** Text fields of a project create or edit request. */
80
85
  export interface ProjectFields {
@@ -136,6 +141,8 @@ export interface ProjectsApiClient {
136
141
  renameProjectConversation: (conversationId: string, newTitle: string) => Promise<RenameConversationResponseDto>;
137
142
  deleteProjectConversation: (conversationId: string) => Promise<void>;
138
143
  attachToProjectGeneration: (projectId: string, path: string, signal?: AbortSignal) => Promise<ReadableStream<Uint8Array>>;
144
+ /** Opens the SSE stream of changes to the given projects; a host without it gets no live updates. */
145
+ watchProjects?: (ids: string[], signal?: AbortSignal) => Promise<ReadableStream<Uint8Array>>;
139
146
  }
140
147
  /**
141
148
  * Splits a project conversation id `projects/{bucket}/{projectPath…}/conversations/{name}`
@@ -152,6 +159,6 @@ export declare const buildCreateConversationDto: ({ firstMessage, deploymentId,
152
159
  * File names travel as JSON fields, positionally paired with `files`,
153
160
  * because the BFF never trusts a multipart part's own filename.
154
161
  */
155
- export declare const createProjectsApiClient: (client: ProjectsConfiguredClient) => ProjectsApiClient;
162
+ export declare const createProjectsApiClient: (client: ProjectsConfiguredClient) => Required<ProjectsApiClient>;
156
163
  export {};
157
164
  //# sourceMappingURL=projects-api-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects-api-client.d.ts","sourceRoot":"","sources":["../../src/project/projects-api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects-api-client.d.ts","sourceRoot":"","sources":["../../src/project/projects-api-client.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,11 @@ var e = (e) => {
75
75
  }, ...n(i));
76
76
  if (!a.body) throw Error("Attach endpoint returned no response body");
77
77
  return a.body;
78
+ },
79
+ watchProjects: async (t, r) => {
80
+ let { raw: i } = await e.watchProjectsRaw({ watchProjectsBodyDto: { ids: t } }, ...n(r));
81
+ if (!i.body) throw Error("Watch endpoint returned no response body");
82
+ return i.body;
78
83
  }
79
84
  });
80
85
  //#endregion
@@ -2,14 +2,22 @@ import { ProjectItem, ProjectSource } from '@epam/ai-dial-projects';
2
2
  import { ProjectsApiClient } from './projects-api-client';
3
3
  /**
4
4
  * Loads the projects the session user can see, mapped to the Projects lib's
5
- * cards. Loading is derived from whether a result answers the current reload
6
- * token, so an enabled page is loading from its very first render. The
7
- * request is aborted on unmount or when `enabled` turns false.
5
+ * cards, and keeps them current while mounted. Loading is derived from
6
+ * whether a result answers the current reload token, so an enabled page is
7
+ * loading from its very first render. The request is aborted on unmount or
8
+ * when `enabled` turns false.
9
+ *
10
+ * When the client offers `watchProjects`, a successful load opens one watch
11
+ * stream for the listed projects: an update moves a card's `updatedAt`
12
+ * forward and a delete removes it. A stream that drops is reopened with a
13
+ * bounded backoff and followed by a silent reload, so changes made during
14
+ * the gap are not lost; a watch that cannot be opened at all is not retried
15
+ * for the rest of the visit.
8
16
  *
9
17
  * @param client - Configured project requests, from `createProjectsApiClient`; it must be referentially stable, because a new object reloads.
10
18
  * @param enabled - Whether the page is enabled; no request is sent while `false`.
11
19
  */
12
- export declare const useProjects: (client: Pick<ProjectsApiClient, "listProjects">, enabled: boolean) => {
20
+ export declare const useProjects: (client: Pick<ProjectsApiClient, "listProjects" | "watchProjects">, enabled: boolean) => {
13
21
  projects: ProjectItem[];
14
22
  incompleteSources: ProjectSource[];
15
23
  isLoading: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"use-projects.d.ts","sourceRoot":"","sources":["../../src/project/use-projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAU/D;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,EAC/C,SAAS,OAAO;;;;;;CAiDjB,CAAC"}
1
+ {"version":3,"file":"use-projects.d.ts","sourceRoot":"","sources":["../../src/project/use-projects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAuC/D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,IAAI,CAAC,iBAAiB,EAAE,cAAc,GAAG,eAAe,CAAC,EACjE,SAAS,OAAO;;;;;;CAoIjB,CAAC"}
@@ -1,46 +1,111 @@
1
1
  import { mapProjectDtoToItem as e, mapProjectSource as t } from "./project-mapping.js";
2
- import { useCallback as n, useEffect as r, useState as i } from "react";
2
+ import { readSseEvents as n } from "../shared/read-sse-events.js";
3
+ import { applyProjectEvent as r, parseProjectWatchEvent as i } from "./project-events.js";
4
+ import { useCallback as a, useEffect as o, useRef as s, useState as c } from "react";
3
5
  //#region src/project/use-projects.ts
4
- var a = (a, o) => {
5
- let [s, c] = i(0), [l, u] = i();
6
- r(() => {
7
- if (!o) return;
6
+ var l = 1e3, u = [
7
+ 1e3,
8
+ 2e3,
9
+ 4e3,
10
+ 8e3,
11
+ 16e3
12
+ ], d = "\n", f = ({ items: n, incompleteSources: r }, i) => {
13
+ let a = n.map(e);
14
+ return {
15
+ reloadToken: i,
16
+ projects: a,
17
+ incompleteSources: r.map(t),
18
+ hasError: !1,
19
+ watchKey: a.slice(0, l).map(({ id: e }) => e).sort().join(d)
20
+ };
21
+ }, p = (e, t) => {
22
+ let [l, p] = c(0), [m, h] = c(), g = s(!1), _ = s(void 0);
23
+ o(() => {
24
+ if (!t) return;
8
25
  let n = new AbortController();
9
26
  return (async () => {
10
27
  try {
11
- let { items: r, incompleteSources: i } = await a.listProjects(n.signal);
28
+ let t = await e.listProjects(n.signal);
12
29
  if (n.signal.aborted) return;
13
- u({
14
- reloadToken: s,
15
- projects: r.map(e),
16
- incompleteSources: i.map(t),
17
- hasError: !1
18
- });
30
+ h(f(t, l));
19
31
  } catch {
20
32
  if (n.signal.aborted) return;
21
- u({
22
- reloadToken: s,
33
+ h({
34
+ reloadToken: l,
23
35
  projects: [],
24
36
  incompleteSources: [],
25
- hasError: !0
37
+ hasError: !0,
38
+ watchKey: ""
26
39
  });
27
40
  }
28
41
  })(), () => n.abort();
29
42
  }, [
30
- a,
31
- o,
32
- s
43
+ e,
44
+ t,
45
+ l
46
+ ]);
47
+ let v = a(async () => {
48
+ _.current?.abort();
49
+ let t = new AbortController();
50
+ _.current = t;
51
+ try {
52
+ let n = await e.listProjects(t.signal);
53
+ if (t.signal.aborted) return;
54
+ h((e) => e == null || e.hasError ? e : f(n, e.reloadToken));
55
+ } catch {}
56
+ }, [e]);
57
+ o(() => () => _.current?.abort(), []);
58
+ let y = m?.reloadToken === l ? m : void 0, b = t ? y?.watchKey ?? "" : "", { watchProjects: x } = e;
59
+ o(() => {
60
+ if (x == null || b === "" || g.current) return;
61
+ let e = b.split(d), t = new AbortController(), a, o = (e) => {
62
+ let n = i(e);
63
+ return n != null && h((e) => {
64
+ if (e == null) return e;
65
+ let t = r(e.projects, n);
66
+ return t === e.projects ? e : {
67
+ ...e,
68
+ projects: t
69
+ };
70
+ }), t.signal.aborted;
71
+ }, s = async (r, i) => {
72
+ let a;
73
+ try {
74
+ a = await x(e, t.signal);
75
+ } catch {
76
+ if (t.signal.aborted) return;
77
+ if (!i) {
78
+ g.current = !0;
79
+ return;
80
+ }
81
+ c(r + 1);
82
+ return;
83
+ }
84
+ i && v(), await n(a, o), !t.signal.aborted && c(0);
85
+ }, c = (e) => {
86
+ let t = u[e];
87
+ t == null ? g.current = !0 : a = setTimeout(() => {
88
+ s(e, !0);
89
+ }, t);
90
+ };
91
+ return s(0, !1), () => {
92
+ t.abort(), clearTimeout(a);
93
+ };
94
+ }, [
95
+ x,
96
+ b,
97
+ v
33
98
  ]);
34
- let d = n(() => {
35
- c((e) => e + 1);
36
- }, []), f = l?.reloadToken === s ? l : void 0;
99
+ let S = a(() => {
100
+ p((e) => e + 1);
101
+ }, []);
37
102
  return {
38
- projects: f?.projects ?? [],
39
- incompleteSources: f?.incompleteSources ?? [],
40
- isLoading: o && f == null,
41
- hasError: f?.hasError ?? !1,
42
- retry: d
103
+ projects: y?.projects ?? [],
104
+ incompleteSources: y?.incompleteSources ?? [],
105
+ isLoading: t && y == null,
106
+ hasError: y?.hasError ?? !1,
107
+ retry: S
43
108
  };
44
109
  };
45
110
  //#endregion
46
- export { a as useProjects };
111
+ export { p as useProjects };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Reads a newline-delimited SSE stream, JSON-decoding each `data:` line and
3
+ * passing it to `onEvent`. Stops reading — and always releases the reader —
4
+ * as soon as `onEvent` returns `true`, when the stream ends, or when
5
+ * `reader.read()` rejects (a network error, or the caller aborting the
6
+ * stream's own `AbortSignal`, e.g. on timeout). Malformed lines and
7
+ * non-`data:` lines (comments, keepalives) are skipped silently.
8
+ */
9
+ export declare const readSseEvents: <TEvent>(stream: ReadableStream<Uint8Array>, onEvent: (event: TEvent) => Promise<boolean> | boolean) => Promise<void>;
10
+ //# sourceMappingURL=read-sse-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-sse-events.d.ts","sourceRoot":"","sources":["../../src/shared/read-sse-events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,EACxC,QAAQ,cAAc,CAAC,UAAU,CAAC,EAClC,SAAS,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,KACrD,OAAO,CAAC,IAAI,CAyCd,CAAC"}
@@ -0,0 +1,33 @@
1
+ //#region src/shared/read-sse-events.ts
2
+ var e = async (e, t) => {
3
+ let n = e.getReader(), r = new TextDecoder(), i = "";
4
+ try {
5
+ for (;;) {
6
+ let { done: e, value: a } = await n.read();
7
+ if (e) break;
8
+ i += r.decode(a, { stream: !0 });
9
+ let o = i.split("\n");
10
+ i = o.pop() ?? "";
11
+ let s = !1;
12
+ for (let e of o) {
13
+ let n = e.trim();
14
+ if (!n.startsWith("data:")) continue;
15
+ let r = n.slice(5).trim(), i;
16
+ try {
17
+ i = JSON.parse(r);
18
+ } catch {
19
+ continue;
20
+ }
21
+ if (await t(i)) {
22
+ s = !0;
23
+ break;
24
+ }
25
+ }
26
+ if (s) break;
27
+ }
28
+ } catch {} finally {
29
+ n.releaseLock();
30
+ }
31
+ };
32
+ //#endregion
33
+ export { e as readSseEvents };