@axiom-lattice/gateway 4.6.0 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/OrphanRecoveryRuntime-MQDEJX3M.mjs +8 -0
  2. package/dist/OrphanRecoveryRuntime-MQDEJX3M.mjs.map +1 -0
  3. package/dist/RecoveryCallerDeps-6SJUYJ5S.mjs +8 -0
  4. package/dist/RecoveryCallerDeps-6SJUYJ5S.mjs.map +1 -0
  5. package/dist/{a2a-standard-PIOKEHPS.mjs → a2a-standard-PBYPNHOA.mjs} +59 -21
  6. package/dist/a2a-standard-PBYPNHOA.mjs.map +1 -0
  7. package/dist/chunk-KDQKTU3N.mjs +288 -0
  8. package/dist/chunk-KDQKTU3N.mjs.map +1 -0
  9. package/dist/chunk-NOXGKYUV.mjs +37 -0
  10. package/dist/chunk-NOXGKYUV.mjs.map +1 -0
  11. package/dist/{chunk-526UYVNQ.mjs → chunk-NPHK4SZ6.mjs} +4 -4
  12. package/dist/embed/{embed-page-AgentDetailSideApp-7NYLPLAX.js → embed-page-AgentDetailSideApp-2C2ZR62Q.js} +1 -1
  13. package/dist/embed/{embed-page-AgentGovernanceWorkbench-LNGNSI7X.js → embed-page-AgentGovernanceWorkbench-GG4ONSTS.js} +1 -1
  14. package/dist/embed/{embed-page-MessageGraph-E6DZDT65.js → embed-page-MessageGraph-WMYTVUUC.js} +1 -1
  15. package/dist/embed/{embed-page-ReactChart-3VE7F5VJ.js → embed-page-ReactChart-7XCMDMH6.js} +1 -1
  16. package/dist/embed/{embed-page-TasksSideApp-QM5TZ7EG.js → embed-page-TasksSideApp-4ZJ4Q4CL.js} +1 -1
  17. package/dist/embed/{embed-page-TeamWorkspace-E7RFY3ZY.js → embed-page-TeamWorkspace-H5OOEN3K.js} +1 -1
  18. package/dist/embed/{embed-page-TopologyRuntimeView-DLPDUB7Z.js → embed-page-TopologyRuntimeView-QMXWERVC.js} +1 -1
  19. package/dist/embed/{embed-page-WorkflowAutomationView-FKSVOHHB.js → embed-page-WorkflowAutomationView-L2OEGCA5.js} +1 -1
  20. package/dist/embed/{embed-page-chunk-H6TK3FAR.js → embed-page-chunk-2G54EIW2.js} +1 -1
  21. package/dist/embed/{embed-page-chunk-I7PWCKAG.js → embed-page-chunk-CZE4IEB3.js} +1 -1
  22. package/dist/embed/{embed-page-chunk-WWTU55RX.js → embed-page-chunk-N2ISCAS7.js} +1 -1
  23. package/dist/embed/{embed-page-chunk-EXCJ42IB.js → embed-page-chunk-OHDEKFTU.js} +1 -1
  24. package/dist/embed/{embed-page-chunk-KN7D66KL.js → embed-page-chunk-SUMYB6ZA.js} +1 -1
  25. package/dist/embed/{embed-page-chunk-U276WBDI.js → embed-page-chunk-XIXSRYJY.js} +6 -6
  26. package/dist/embed/embed-page.js +1 -1
  27. package/dist/index.d.mts +226 -3
  28. package/dist/index.d.ts +226 -3
  29. package/dist/index.js +638 -257
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +86 -78
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/{open-AMEMJOFJ.mjs → open-STFMNRO5.mjs} +8 -8
  34. package/dist/{open-exposure-I44Q4M3T.mjs → open-exposure-VU227IO3.mjs} +5 -5
  35. package/dist/{open-files-EJ6O2SGX.mjs → open-files-NPNQQ6TY.mjs} +4 -4
  36. package/dist/{open-session-LBTCU3AE.mjs → open-session-IHDGAXL3.mjs} +4 -4
  37. package/package.json +7 -7
  38. package/dist/a2a-standard-PIOKEHPS.mjs.map +0 -1
  39. /package/dist/{chunk-526UYVNQ.mjs.map → chunk-NPHK4SZ6.mjs.map} +0 -0
  40. /package/dist/{open-AMEMJOFJ.mjs.map → open-STFMNRO5.mjs.map} +0 -0
  41. /package/dist/{open-exposure-I44Q4M3T.mjs.map → open-exposure-VU227IO3.mjs.map} +0 -0
  42. /package/dist/{open-files-EJ6O2SGX.mjs.map → open-files-NPNQQ6TY.mjs.map} +0 -0
  43. /package/dist/{open-session-LBTCU3AE.mjs.map → open-session-IHDGAXL3.mjs.map} +0 -0
@@ -0,0 +1,288 @@
1
+ // src/services/collaboration/OrphanRecoveryRuntime.ts
2
+ import {
3
+ createTaskLifecycleService,
4
+ reconcileAllTenantTaskRuns,
5
+ taskRunRegistry as taskRunRegistry2
6
+ } from "@axiom-lattice/core";
7
+
8
+ // src/services/collaboration/TopCallerRecovery.ts
9
+ import { ToolMessage } from "@langchain/core/messages";
10
+ import {
11
+ reconcileStaleTaskRuns,
12
+ taskRunRegistry
13
+ } from "@axiom-lattice/core";
14
+ function hasPendingInterrupts(state) {
15
+ return (state.tasks ?? []).some((t) => (t.interrupts?.length ?? 0) > 0);
16
+ }
17
+ function pendingTaskCalls(state) {
18
+ const messages = state.values?.messages ?? [];
19
+ const resolved = new Set(
20
+ messages.filter((m) => m.tool_call_id).map((m) => m.tool_call_id)
21
+ );
22
+ const calls = [];
23
+ for (const m of messages) {
24
+ const typed = m;
25
+ if (typeof typed.getType !== "function" || typed.getType() !== "ai") continue;
26
+ const toolCalls = m.tool_calls;
27
+ if (!Array.isArray(toolCalls)) continue;
28
+ for (const c of toolCalls) {
29
+ if (c.name !== "task" || !c.id || resolved.has(c.id)) continue;
30
+ const taskId = typeof c.args?.taskId === "string" ? c.args.taskId : void 0;
31
+ calls.push({ id: c.id, ...taskId ? { taskId } : {} });
32
+ }
33
+ }
34
+ return calls;
35
+ }
36
+ function outcome(task) {
37
+ if (task.status === "completed") {
38
+ return JSON.stringify({ success: true, taskId: task.id, result: task.result ?? "" });
39
+ }
40
+ if (task.status === "failed") {
41
+ return JSON.stringify({ success: false, code: "TASK_FAILED", retryable: false, taskId: task.id, error: task.failureReason ?? "" });
42
+ }
43
+ return JSON.stringify({
44
+ success: false,
45
+ code: "TASK_INTERRUPTED",
46
+ retryable: false,
47
+ taskId: task.id,
48
+ error: "Run ended before completion; the task is interrupted and awaiting a decision."
49
+ });
50
+ }
51
+ async function backfillTopCallerGroup(tasks, top, deps) {
52
+ const registry = deps.registry ?? taskRunRegistry;
53
+ const results = [];
54
+ const eligible = [];
55
+ for (const task of tasks) {
56
+ if (!task.context?.caller_thread_id) {
57
+ results.push({ id: task.id, reason: "skipped:no_caller_link" });
58
+ continue;
59
+ }
60
+ if (registry.isLive(task.id)) {
61
+ results.push({ id: task.id, reason: "skipped:live" });
62
+ continue;
63
+ }
64
+ eligible.push(task);
65
+ }
66
+ if (eligible.length === 0) return results;
67
+ const target = await deps.callerFor(top, eligible[0].tenantId);
68
+ if (!target) {
69
+ return [...results, ...eligible.map((task) => ({ id: task.id, reason: "skipped:no_caller_client" }))];
70
+ }
71
+ const state = await target.client.getState(target.config);
72
+ if (hasPendingInterrupts(state)) {
73
+ return [...results, ...eligible.map((task) => ({ id: task.id, reason: "skipped:hitl" }))];
74
+ }
75
+ const nodeName = (state.tasks ?? [])[0]?.name;
76
+ if (!nodeName) {
77
+ return [...results, ...eligible.map((task) => ({ id: task.id, reason: "skipped:no_pending_node" }))];
78
+ }
79
+ const calls = pendingTaskCalls(state);
80
+ const matched = [];
81
+ for (const task of eligible) {
82
+ const call = calls.find((candidate) => candidate.taskId === task.id);
83
+ if (!call) {
84
+ results.push({ id: task.id, reason: "skipped:no_pending_task_call" });
85
+ continue;
86
+ }
87
+ matched.push({ task, call });
88
+ }
89
+ if (matched.length === 0) return results;
90
+ await target.client.updateState(target.config, {
91
+ messages: matched.map(({ task, call }) => new ToolMessage({ content: outcome(task), tool_call_id: call.id, name: "task" }))
92
+ }, nodeName);
93
+ await deps.resume(target.client, target.config, target.agent);
94
+ return [...results, ...matched.map(({ task }) => ({ id: task.id, reason: "recovered" }))];
95
+ }
96
+ async function recoverTopCaller(task, top, deps) {
97
+ if (!task.context?.caller_thread_id) return "skipped:no_caller_link";
98
+ if (task.context.caller_thread_id !== top.threadId) return "skipped:middle";
99
+ const [first] = await backfillTopCallerGroup([task], top, deps);
100
+ return first?.reason ?? "skipped:no_pending_task_call";
101
+ }
102
+ async function recoverTask(task, deps) {
103
+ if (task.status !== "in_progress") {
104
+ return { kind: "skipped", reason: "not_in_progress" };
105
+ }
106
+ const registry = deps.registry ?? taskRunRegistry;
107
+ if (registry.isLive(task.id)) {
108
+ return { kind: "skipped", reason: "live" };
109
+ }
110
+ const { convergedTasks } = await reconcileStaleTaskRuns({
111
+ tasks: [task],
112
+ actor: "system:on-demand-recovery",
113
+ lifecycle: deps.lifecycle,
114
+ ...deps.registry ? { registry: deps.registry } : {}
115
+ });
116
+ const converged = convergedTasks[0];
117
+ if (!converged) {
118
+ return { kind: "skipped", reason: "convergence_failed" };
119
+ }
120
+ const top = resolveTopCaller(converged, deps.orphans ?? [converged]);
121
+ if (!top) {
122
+ return { kind: "skipped", reason: "no_top_caller" };
123
+ }
124
+ if (converged.context?.caller_thread_id !== top.threadId) {
125
+ return { kind: "skipped", reason: "middle" };
126
+ }
127
+ const reason = await recoverTopCaller(converged, top, {
128
+ callerFor: deps.callerFor,
129
+ resume: deps.resume,
130
+ ...deps.registry ? { registry: deps.registry } : {}
131
+ });
132
+ if (reason === "recovered") return { kind: "recovered" };
133
+ if (reason === "skipped:no_pending_task_call") return { kind: "converged_no_call" };
134
+ return { kind: "skipped", reason: reason.replace(/^skipped:/, "") };
135
+ }
136
+ function resolveTopCaller(task, orphans) {
137
+ const tenantId = task.tenantId;
138
+ const runThreadToTask = new Map(
139
+ orphans.map((orphan) => [`${orphan.tenantId}:${orphan.context?.thread_id}`, orphan])
140
+ );
141
+ let threadId = task.context?.caller_thread_id;
142
+ let assistantId = task.context?.caller_assistant_id;
143
+ const seen = /* @__PURE__ */ new Set();
144
+ while (threadId) {
145
+ const scopeKey = `${tenantId}:${threadId}`;
146
+ if (!runThreadToTask.has(scopeKey) || seen.has(scopeKey)) break;
147
+ seen.add(scopeKey);
148
+ const parent = runThreadToTask.get(scopeKey);
149
+ threadId = parent.context?.caller_thread_id;
150
+ assistantId = parent.context?.caller_assistant_id;
151
+ }
152
+ return threadId ? { threadId, ...assistantId ? { assistantId } : {} } : void 0;
153
+ }
154
+ async function runOrphanRecovery(deps) {
155
+ let convergedTasks;
156
+ try {
157
+ ({ convergedTasks } = await deps.reconcile());
158
+ } catch (error) {
159
+ deps.log.warn("Task orphan recovery reconcile failed", {
160
+ error: error instanceof Error ? error.message : String(error)
161
+ });
162
+ return { recovered: [], skipped: ["reconcile:error"] };
163
+ }
164
+ const orphans = convergedTasks;
165
+ const recovered = [];
166
+ const skipped = [];
167
+ const groups = /* @__PURE__ */ new Map();
168
+ for (const task of orphans) {
169
+ const top = resolveTopCaller(task, orphans);
170
+ if (!top) {
171
+ skipped.push(`${task.id}:skipped:no_top_caller`);
172
+ continue;
173
+ }
174
+ if (task.context?.caller_thread_id !== top.threadId) {
175
+ skipped.push(`${task.id}:skipped:middle`);
176
+ continue;
177
+ }
178
+ const key = `${task.tenantId}:${top.threadId}`;
179
+ const group = groups.get(key);
180
+ if (group) group.tasks.push(task);
181
+ else groups.set(key, { top, tasks: [task] });
182
+ }
183
+ for (const { top, tasks } of groups.values()) {
184
+ try {
185
+ const results = await backfillTopCallerGroup(tasks, top, {
186
+ callerFor: deps.callerFor,
187
+ resume: deps.resume
188
+ });
189
+ for (const { id, reason } of results) {
190
+ (reason === "recovered" ? recovered : skipped).push(`${id}:${reason}`);
191
+ }
192
+ } catch (error) {
193
+ for (const task of tasks) skipped.push(`${task.id}:error`);
194
+ deps.log.warn("Task orphan recovery group failed", {
195
+ threadId: top.threadId,
196
+ error: error instanceof Error ? error.message : String(error)
197
+ });
198
+ }
199
+ }
200
+ deps.log.info("Task orphan recovery complete", { recovered, skipped });
201
+ return { recovered, skipped };
202
+ }
203
+
204
+ // src/services/collaboration/projectTaskScope.ts
205
+ function isProjectLifecycleTask(task) {
206
+ const source = task.context?.source;
207
+ return typeof task.workspaceId === "string" && task.workspaceId.length > 0 && typeof task.projectId === "string" && task.projectId.length > 0 && (source === "project_room" || source === "project_task" || source === "user");
208
+ }
209
+ function isRosterExemptProject(project) {
210
+ return project?.kind === "public";
211
+ }
212
+ function resolveTaskOwnerMembership(task, project, room, membership) {
213
+ const active = membership && membership.status === "active" && membership.tenantId === task.tenantId && membership.workspaceId === task.workspaceId && membership.projectId === task.projectId && membership.assistantId === task.ownerId && membership.roomId === room.id;
214
+ if (active) return membership;
215
+ if (!isRosterExemptProject(project)) return void 0;
216
+ return syntheticPublicProjectOwnerMembership(task, room);
217
+ }
218
+ function syntheticPublicProjectOwnerMembership(task, room) {
219
+ const threadId = typeof task.context?.thread_id === "string" && task.context.thread_id.length > 0 ? task.context.thread_id : task.ownerId;
220
+ return {
221
+ id: `public-project-owner:${task.projectId}:${task.ownerId}`,
222
+ tenantId: task.tenantId,
223
+ workspaceId: task.workspaceId,
224
+ projectId: task.projectId,
225
+ roomId: room.id,
226
+ assistantId: task.ownerId,
227
+ role: "specialist",
228
+ title: task.ownerId,
229
+ mentionName: task.ownerId,
230
+ status: "active",
231
+ roomThreadId: threadId,
232
+ joinedAt: task.createdAt,
233
+ updatedAt: task.updatedAt
234
+ };
235
+ }
236
+
237
+ // src/services/collaboration/OrphanRecoveryRuntime.ts
238
+ function createOrphanRecoveryRuntime(deps) {
239
+ const lifecycle = deps.lifecycle ?? createTaskLifecycleService({
240
+ taskStore: deps.taskStore,
241
+ workItemStore: deps.workItemStore
242
+ });
243
+ return {
244
+ async recoverAll() {
245
+ return runOrphanRecovery({
246
+ reconcile: () => reconcileAllTenantTaskRuns({
247
+ actor: "system:orphan-recovery",
248
+ tenantStore: {
249
+ listTenants: async () => (await deps.tenantStore.getAllTenants()).map((tenant) => ({ id: tenant.id }))
250
+ },
251
+ taskStore: deps.taskStore,
252
+ lifecycle,
253
+ include: (t) => !isProjectLifecycleTask(t)
254
+ }),
255
+ callerFor: deps.callerFor,
256
+ resume: deps.resume,
257
+ log: deps.log
258
+ });
259
+ },
260
+ async recoverTask(input) {
261
+ const task = await deps.taskStore.getById(input.tenantId, input.taskId);
262
+ if (!task) return { kind: "skipped", reason: "not_found" };
263
+ if (isProjectLifecycleTask(task)) {
264
+ return { kind: "skipped", reason: "project_task" };
265
+ }
266
+ const orphans = await deps.taskStore.list({ tenantId: input.tenantId, status: "in_progress" });
267
+ return recoverTask(task, {
268
+ lifecycle,
269
+ registry: taskRunRegistry2,
270
+ orphans,
271
+ callerFor: deps.callerFor,
272
+ resume: deps.resume
273
+ });
274
+ }
275
+ };
276
+ }
277
+
278
+ export {
279
+ isProjectLifecycleTask,
280
+ isRosterExemptProject,
281
+ resolveTaskOwnerMembership,
282
+ recoverTopCaller,
283
+ recoverTask,
284
+ resolveTopCaller,
285
+ runOrphanRecovery,
286
+ createOrphanRecoveryRuntime
287
+ };
288
+ //# sourceMappingURL=chunk-KDQKTU3N.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/collaboration/OrphanRecoveryRuntime.ts","../src/services/collaboration/TopCallerRecovery.ts","../src/services/collaboration/projectTaskScope.ts"],"sourcesContent":["/**\n * Shared orphan-recovery runtime: the startup sweep and the on-demand\n * single-task entry point share one dependency shape and one lifecycle.\n *\n * @remarks\n * `recoverAll()` is the behavior-preserving move of the gateway startup block\n * (reconcile every tenant's orphaned ordinary tasks, then backfill the\n * top-level caller). `recoverTask()` is the A-lite on-demand entry: no HTTP\n * route, just a programmatic call used by the `task:recover` CLI/script.\n */\nimport type { TaskStore, TaskWorkItemStore, TenantStore } from \"@axiom-lattice/protocols\";\nimport {\n createTaskLifecycleService,\n reconcileAllTenantTaskRuns,\n taskRunRegistry,\n type TaskLifecycleService,\n} from \"@axiom-lattice/core\";\nimport {\n recoverTask as recoverSingleTask,\n runOrphanRecovery,\n type RecoverTaskResult,\n type TopCallerRecoveryDeps,\n} from \"./TopCallerRecovery\";\nimport { isProjectLifecycleTask } from \"./projectTaskScope\";\n\n/** Dependencies shared by the startup sweep and the single-task entry. */\nexport interface OrphanRecoveryRuntimeDeps {\n /** Task store used to enumerate tenants' orphans and read one task by id. */\n taskStore: TaskStore;\n /** Work-item store used to build the lifecycle when `lifecycle` is omitted. */\n workItemStore: TaskWorkItemStore;\n /** Tenant store supplying `getAllTenants()` for the startup sweep. */\n tenantStore: Pick<TenantStore, \"getAllTenants\">;\n /** Lifecycle used to converge orphans (built from the stores when omitted). */\n lifecycle?: Pick<TaskLifecycleService, \"failTask\">;\n /** Resolve a caller's agent client + config from the resolved top caller. */\n callerFor: TopCallerRecoveryDeps[\"callerFor\"];\n /** Resume the continuation (tests can call client.invoke(null, config)). */\n resume: TopCallerRecoveryDeps[\"resume\"];\n /** Structured logger. */\n log: { info(msg: string, ctx: Record<string, unknown>): void; warn(msg: string, ctx: Record<string, unknown>): void };\n}\n\n/** Entry points returned by {@link createOrphanRecoveryRuntime}. */\nexport interface OrphanRecoveryRuntime {\n /** Startup/interval sweep over every tenant's orphaned ordinary tasks. */\n recoverAll(): Promise<{ recovered: string[]; skipped: string[] }>;\n /**\n * On-demand recovery of exactly one task within one tenant.\n *\n * @remarks Offline/maintenance: run when the Gateway is stopped, or from the\n * Gateway process. The `live` guard reads the process-local task registry and\n * cannot see a run held by another process. Governed Project tasks are refused\n * (`skipped:project_task`) so this never bypasses their managed runtime.\n */\n recoverTask(input: { tenantId: string; taskId: string }): Promise<RecoverTaskResult>;\n}\n\n/**\n * Builds the shared orphan-recovery runtime.\n *\n * @param deps Task/work-item/tenant stores, optional lifecycle, caller\n * resolver, resume hook, and logger.\n * @returns `recoverAll()` (startup sweep) and `recoverTask()` (on-demand).\n * @remarks\n * Governed Project tasks are excluded from `recoverAll()` (they have their own\n * observer-based reconciliation) and from `recoverTask()`\n * (`skipped:project_task`), so the on-demand entry can never bypass the managed\n * Project runtime. `recoverTask()` delegates to {@link recoverSingleTask} with\n * the shared lifecycle and the process-local live-run registry, so it never\n * converges a task a live run still holds — in-process only.\n *\n * @example\n * ```ts\n * const runtime = createOrphanRecoveryRuntime({ taskStore, workItemStore, tenantStore, callerFor, resume, log });\n * await runtime.recoverAll();\n * const outcome = await runtime.recoverTask({ tenantId, taskId });\n * ```\n */\nexport function createOrphanRecoveryRuntime(\n deps: OrphanRecoveryRuntimeDeps,\n): OrphanRecoveryRuntime {\n const lifecycle = deps.lifecycle ?? createTaskLifecycleService({\n taskStore: deps.taskStore,\n workItemStore: deps.workItemStore,\n });\n\n return {\n async recoverAll() {\n return runOrphanRecovery({\n reconcile: () => reconcileAllTenantTaskRuns({\n actor: \"system:orphan-recovery\",\n tenantStore: {\n listTenants: async () => (await deps.tenantStore.getAllTenants()).map((tenant) => ({ id: tenant.id })),\n },\n taskStore: deps.taskStore,\n lifecycle,\n include: (t) => !isProjectLifecycleTask(t),\n }),\n callerFor: deps.callerFor,\n resume: deps.resume,\n log: deps.log,\n });\n },\n\n async recoverTask(input) {\n const task = await deps.taskStore.getById(input.tenantId, input.taskId);\n if (!task) return { kind: \"skipped\", reason: \"not_found\" };\n if (isProjectLifecycleTask(task)) {\n return { kind: \"skipped\", reason: \"project_task\" };\n }\n const orphans = await deps.taskStore.list({ tenantId: input.tenantId, status: \"in_progress\" });\n return recoverSingleTask(task, {\n lifecycle,\n registry: taskRunRegistry,\n orphans,\n callerFor: deps.callerFor,\n resume: deps.resume,\n });\n },\n };\n}\n","/**\n * Collapse recovery: backfill the top-level caller of converged orphan tasks.\n *\n * @remarks Only direct children of the top-level caller are backfilled; middle\n * task runs are frozen by the collapse design. Four guards: A skip a caller\n * with a pending interrupt (HITL), B skip live tasks, C derive the tool node\n * name from state, D use the task's real terminal state.\n */\nimport { ToolMessage } from \"@langchain/core/messages\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport {\n reconcileStaleTaskRuns,\n taskRunRegistry,\n type TaskLifecycleService,\n type TaskRunRegistry,\n} from \"@axiom-lattice/core\";\n\n/** Minimal caller-graph client surface used by recovery. */\nexport interface RecoveryCallerClient {\n getState(config: unknown): Promise<unknown>;\n updateState(config: unknown, values: unknown, asNode?: string): Promise<unknown>;\n invoke(input: unknown, config: unknown): Promise<unknown>;\n}\n\nexport interface TopCallerRecoveryDeps {\n /**\n * Resolve a caller's agent client + config from the resolved top caller.\n *\n * @param top The resolved top-level caller thread + assistant.\n * @param tenantId The orphan task's tenant, used to scope the caller client.\n */\n callerFor(\n top: { threadId: string; assistantId?: string },\n tenantId: string,\n ): Promise<{ client: RecoveryCallerClient; config: unknown; agent?: unknown } | undefined>;\n /** Live-run registry (defaults to the shared Core singleton). */\n registry?: { isLive(taskId: string): boolean };\n /** Resume the continuation (tests can call client.invoke(null, config)). */\n resume(client: RecoveryCallerClient, config: unknown, agent?: unknown): Promise<void>;\n}\n\n/** Dependencies for an on-demand single-task recovery ({@link recoverTask}). */\nexport interface RecoverTaskDeps {\n /** Lifecycle used to converge the orphan to `failed(no_executor)`. */\n lifecycle: Pick<TaskLifecycleService, \"failTask\">;\n /** Live-run registry (defaults to the shared Core singleton). */\n registry?: TaskRunRegistry;\n /**\n * The tenant's other orphan candidates (normally every `in_progress` task),\n * used to walk the caller chain up to the true top-level caller.\n *\n * @remarks\n * Without this set {@link resolveTopCaller} can only see the target itself,\n * so a nested middle run would be mistaken for a direct child of its\n * immediate (frozen) caller. Defaults to `[converged]` when omitted.\n */\n orphans?: TaskItem[];\n /** Resolve a caller's agent client + config from the resolved top caller. */\n callerFor: TopCallerRecoveryDeps[\"callerFor\"];\n /** Resume the continuation (tests can call client.invoke(null, config)). */\n resume: TopCallerRecoveryDeps[\"resume\"];\n}\n\n/**\n * Outcome of an on-demand single-task recovery attempt.\n *\n * @remarks\n * - `recovered`: the task was converged and its top-level caller was resumed.\n * - `skipped`: nothing was changed; `reason` names the guard (for example\n * `not_in_progress`, `live`, `middle`, `project_task`, `no_top_caller`,\n * `not_found`).\n * - `converged_no_call`: the task was converged to `failed`, but the caller had\n * no pending `task` call left to resolve, so no continuation was resumed.\n */\nexport type RecoverTaskResult =\n | { kind: \"recovered\" }\n | { kind: \"skipped\"; reason: string }\n | { kind: \"converged_no_call\" };\n\n/** A `task` tool call that still has no tool result. */\ninterface PendingTaskCall {\n id: string;\n taskId?: string;\n}\n\n/** Guard A: a caller waiting for a human is never touched. */\nfunction hasPendingInterrupts(state: Record<string, unknown>): boolean {\n return ((state.tasks as Array<{ interrupts?: unknown[] }> | undefined) ?? [])\n .some((t) => (t.interrupts?.length ?? 0) > 0);\n}\n\n/** Collects every pending `task` tool call, keyed by its `args.taskId` when present. */\nfunction pendingTaskCalls(state: Record<string, unknown>): PendingTaskCall[] {\n const messages = ((state.values as { messages?: Array<Record<string, unknown>> } | undefined)?.messages) ?? [];\n const resolved = new Set(\n messages\n .filter((m) => (m as { tool_call_id?: string }).tool_call_id)\n .map((m) => (m as { tool_call_id: string }).tool_call_id),\n );\n const calls: PendingTaskCall[] = [];\n for (const m of messages) {\n const typed = m as { getType?: () => string };\n if (typeof typed.getType !== \"function\" || typed.getType() !== \"ai\") continue;\n const toolCalls = (m as {\n tool_calls?: Array<{ id?: string; name?: string; args?: { taskId?: unknown } }>;\n }).tool_calls;\n if (!Array.isArray(toolCalls)) continue;\n for (const c of toolCalls) {\n if (c.name !== \"task\" || !c.id || resolved.has(c.id)) continue;\n const taskId = typeof c.args?.taskId === \"string\" ? c.args.taskId : undefined;\n calls.push({ id: c.id, ...(taskId ? { taskId } : {}) });\n }\n }\n return calls;\n}\n\n/** Guard D: the outcome follows the task's real terminal state. */\nfunction outcome(task: TaskItem): string {\n if (task.status === \"completed\") {\n return JSON.stringify({ success: true, taskId: task.id, result: task.result ?? \"\" });\n }\n if (task.status === \"failed\") {\n return JSON.stringify({ success: false, code: \"TASK_FAILED\", retryable: false, taskId: task.id, error: task.failureReason ?? \"\" });\n }\n return JSON.stringify({\n success: false,\n code: \"TASK_INTERRUPTED\",\n retryable: false,\n taskId: task.id,\n error: \"Run ended before completion; the task is interrupted and awaiting a decision.\",\n });\n}\n\n/** Per-task recovery outcome. */\ninterface RecoveryEntry {\n id: string;\n reason: string;\n}\n\n/**\n * Backfills a batch of converged direct-child tasks that share one top caller.\n *\n * @param tasks The direct-child orphans whose top caller is `top`.\n * @param top The resolved top-level caller.\n * @param deps Caller resolver, live-run registry, and resume hook.\n * @returns One `\"recovered\"` or `\"skipped:<reason>\"` entry per task.\n * @remarks\n * Reads the caller state once, matches each task to its pending `task` tool\n * call by `args.taskId`, injects every matched result in a single\n * `updateState`, then resumes once.\n */\nasync function backfillTopCallerGroup(\n tasks: TaskItem[],\n top: { threadId: string; assistantId?: string },\n deps: TopCallerRecoveryDeps,\n): Promise<RecoveryEntry[]> {\n const registry = deps.registry ?? taskRunRegistry;\n const results: RecoveryEntry[] = [];\n const eligible: TaskItem[] = [];\n for (const task of tasks) {\n if (!task.context?.caller_thread_id) {\n results.push({ id: task.id, reason: \"skipped:no_caller_link\" });\n continue;\n }\n if (registry.isLive(task.id)) { // Guard B\n results.push({ id: task.id, reason: \"skipped:live\" });\n continue;\n }\n eligible.push(task);\n }\n if (eligible.length === 0) return results;\n\n const target = await deps.callerFor(top, eligible[0].tenantId);\n if (!target) {\n return [...results, ...eligible.map((task) => ({ id: task.id, reason: \"skipped:no_caller_client\" }))];\n }\n const state = (await target.client.getState(target.config)) as Record<string, unknown>;\n if (hasPendingInterrupts(state)) { // Guard A\n return [...results, ...eligible.map((task) => ({ id: task.id, reason: \"skipped:hitl\" }))];\n }\n const nodeName = ((state.tasks as Array<{ name?: string }> | undefined) ?? [])[0]?.name; // Guard C\n if (!nodeName) {\n return [...results, ...eligible.map((task) => ({ id: task.id, reason: \"skipped:no_pending_node\" }))];\n }\n\n const calls = pendingTaskCalls(state);\n const matched: Array<{ task: TaskItem; call: PendingTaskCall }> = [];\n for (const task of eligible) {\n const call = calls.find((candidate) => candidate.taskId === task.id);\n if (!call) {\n results.push({ id: task.id, reason: \"skipped:no_pending_task_call\" });\n continue;\n }\n matched.push({ task, call });\n }\n if (matched.length === 0) return results;\n\n await target.client.updateState(target.config, {\n messages: matched.map(({ task, call }) =>\n new ToolMessage({ content: outcome(task), tool_call_id: call.id, name: \"task\" })),\n }, nodeName); // Guard D via outcome()\n await deps.resume(target.client, target.config, target.agent);\n return [...results, ...matched.map(({ task }) => ({ id: task.id, reason: \"recovered\" }))];\n}\n\n/**\n * Backfills one converged direct-child task's top-level caller.\n *\n * @param task The converged orphan task (must carry `context.caller_thread_id`).\n * @param top The resolved top-level caller.\n * @param deps Caller resolver, live-run registry, and resume hook.\n * @returns `\"recovered\"` or a `\"skipped:<reason>\"` string.\n */\nexport async function recoverTopCaller(\n task: TaskItem,\n top: { threadId: string; assistantId?: string },\n deps: TopCallerRecoveryDeps,\n): Promise<string> {\n if (!task.context?.caller_thread_id) return \"skipped:no_caller_link\";\n // Only direct children may be backfilled; a middle run is frozen by design.\n if (task.context.caller_thread_id !== top.threadId) return \"skipped:middle\";\n const [first] = await backfillTopCallerGroup([task], top, deps);\n return first?.reason ?? \"skipped:no_pending_task_call\";\n}\n\n/**\n * Recovers a single orphan task on demand, reusing the collapse logic.\n *\n * @param task The candidate task (any status).\n * @param deps Lifecycle, live-run registry, orphan candidate set (for the\n * caller-chain walk), caller resolver, and resume hook.\n * @returns A discriminated outcome: `recovered`, `skipped:<reason>`, or\n * `converged_no_call` when the task was converged but the caller had no\n * pending `task` call to resolve.\n * @remarks\n * Mirrors {@link runOrphanRecovery} for exactly one task: anything not\n * `in_progress`, or still held by a live run, is skipped; the rest is converged\n * to `failed` (`no_executor`, ADR-143) and its **top-level** caller is\n * backfilled. `deps.orphans` must carry the tenant's other `in_progress`\n * candidates so a nested middle run is correctly skipped (`middle`) instead of\n * being mistaken for a direct child of its frozen immediate caller.\n *\n * This is an **offline/maintenance** entry point (the `task:recover` CLI): run\n * it when the Gateway is stopped, or from within the Gateway process. The\n * `live` guard reads the process-local {@link taskRunRegistry}, so it is\n * meaningful only in-process and cannot detect a run held by another process.\n *\n * The convergence actor is `system:on-demand-recovery` (distinct from the\n * startup sweep's `system:orphan-recovery`), so on-demand convergences are\n * auditable in the task work-item trail. No HTTP route is added and recovery\n * semantics are unchanged.\n */\nexport async function recoverTask(\n task: TaskItem,\n deps: RecoverTaskDeps,\n): Promise<RecoverTaskResult> {\n if (task.status !== \"in_progress\") {\n return { kind: \"skipped\", reason: \"not_in_progress\" };\n }\n const registry = deps.registry ?? taskRunRegistry;\n if (registry.isLive(task.id)) { // Guard B\n return { kind: \"skipped\", reason: \"live\" };\n }\n\n const { convergedTasks } = await reconcileStaleTaskRuns({\n tasks: [task],\n actor: \"system:on-demand-recovery\",\n lifecycle: deps.lifecycle,\n ...(deps.registry ? { registry: deps.registry } : {}),\n });\n const converged = convergedTasks[0];\n if (!converged) {\n return { kind: \"skipped\", reason: \"convergence_failed\" };\n }\n\n const top = resolveTopCaller(converged, deps.orphans ?? [converged]);\n if (!top) {\n return { kind: \"skipped\", reason: \"no_top_caller\" };\n }\n // Only direct children may be backfilled; a middle run is frozen by design.\n if (converged.context?.caller_thread_id !== top.threadId) {\n return { kind: \"skipped\", reason: \"middle\" };\n }\n\n const reason = await recoverTopCaller(converged, top, {\n callerFor: deps.callerFor,\n resume: deps.resume,\n ...(deps.registry ? { registry: deps.registry } : {}),\n });\n if (reason === \"recovered\") return { kind: \"recovered\" };\n if (reason === \"skipped:no_pending_task_call\") return { kind: \"converged_no_call\" };\n return { kind: \"skipped\", reason: reason.replace(/^skipped:/, \"\") };\n}\n\n/** Walks caller links up to the thread that is not any orphan's run thread. */\nexport function resolveTopCaller(\n task: TaskItem,\n orphans: TaskItem[],\n): { threadId: string; assistantId?: string } | undefined {\n const tenantId = task.tenantId;\n const runThreadToTask = new Map(\n orphans.map((orphan) => [`${orphan.tenantId}:${orphan.context?.thread_id}`, orphan]),\n );\n let threadId = task.context?.caller_thread_id as string | undefined;\n let assistantId = task.context?.caller_assistant_id as string | undefined;\n const seen = new Set<string>();\n while (threadId) {\n const scopeKey = `${tenantId}:${threadId}`;\n if (!runThreadToTask.has(scopeKey) || seen.has(scopeKey)) break;\n seen.add(scopeKey);\n const parent = runThreadToTask.get(scopeKey)!;\n threadId = parent.context?.caller_thread_id as string | undefined;\n assistantId = parent.context?.caller_assistant_id as string | undefined;\n }\n return threadId ? { threadId, ...(assistantId ? { assistantId } : {}) } : undefined;\n}\n\n/**\n * Runs the whole collapse recovery once: reconcile orphan tasks, then backfill\n * the top-level caller of every direct-child orphan, grouped per top caller.\n * Best-effort; a failing group is contained and never aborts the others.\n *\n * @param deps Reconcile source, caller resolution, resume, and logger.\n * @returns The recovered and skipped `taskId:reason` entries.\n */\nexport async function runOrphanRecovery(deps: {\n reconcile: () => Promise<{ convergedTasks: TaskItem[] }>;\n callerFor: TopCallerRecoveryDeps[\"callerFor\"];\n resume: TopCallerRecoveryDeps[\"resume\"];\n log: { info(msg: string, ctx: Record<string, unknown>): void; warn(msg: string, ctx: Record<string, unknown>): void };\n}): Promise<{ recovered: string[]; skipped: string[] }> {\n let convergedTasks: TaskItem[];\n try {\n ({ convergedTasks } = await deps.reconcile());\n } catch (error) {\n deps.log.warn(\"Task orphan recovery reconcile failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return { recovered: [], skipped: [\"reconcile:error\"] };\n }\n const orphans = convergedTasks;\n const recovered: string[] = [];\n const skipped: string[] = [];\n\n const groups = new Map<string, { top: { threadId: string; assistantId?: string }; tasks: TaskItem[] }>();\n for (const task of orphans) {\n const top = resolveTopCaller(task, orphans);\n if (!top) { skipped.push(`${task.id}:skipped:no_top_caller`); continue; }\n // Only direct children are backfilled; middle task runs are frozen by design.\n if (task.context?.caller_thread_id !== top.threadId) {\n skipped.push(`${task.id}:skipped:middle`);\n continue;\n }\n const key = `${task.tenantId}:${top.threadId}`;\n const group = groups.get(key);\n if (group) group.tasks.push(task);\n else groups.set(key, { top, tasks: [task] });\n }\n\n for (const { top, tasks } of groups.values()) {\n try {\n const results = await backfillTopCallerGroup(tasks, top, {\n callerFor: deps.callerFor,\n resume: deps.resume,\n });\n for (const { id, reason } of results) {\n (reason === \"recovered\" ? recovered : skipped).push(`${id}:${reason}`);\n }\n } catch (error) {\n for (const task of tasks) skipped.push(`${task.id}:error`);\n deps.log.warn(\"Task orphan recovery group failed\", {\n threadId: top.threadId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n deps.log.info(\"Task orphan recovery complete\", { recovered, skipped });\n return { recovered, skipped };\n}\n","import type {\n Project,\n ProjectBotMembership,\n ProjectRoom,\n TaskItem,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Whether a task belongs to the Project lifecycle scope enforced by this host.\n *\n * Host-owned business predicate (ADR-118): Core no longer interprets\n * `context.source`; the gateway decides which tasks its Project runtime owns.\n *\n * @param task Task snapshot whose durable scope and host-stamped origin are inspected.\n * @returns True for Project Room, Project Task, or human `user` origins with an explicit scope.\n *\n * @remarks ADR-118 §6: classification is **explicit scope presence + host-stamped\n * `context.source`** — there is no `\"default\"` sentinel. A source of\n * `project_room`/`project_task` is stamped only by the host's trusted run context,\n * which always carries a real workspace/project id. `user` marks UI/human-created\n * Project tasks, which share the same durable Project queue runtime.\n */\nexport function isProjectLifecycleTask(task: TaskItem): task is TaskItem & {\n workspaceId: string;\n projectId: string;\n} {\n const source = task.context?.source;\n return typeof task.workspaceId === \"string\" && task.workspaceId.length > 0\n && typeof task.projectId === \"string\" && task.projectId.length > 0\n && (source === \"project_room\" || source === \"project_task\" || source === \"user\");\n}\n\n/**\n * Whether a Project's public (general) kind is exempt from roster authority.\n *\n * @param project Project row being inspected, or `null`/`undefined` when absent.\n * @returns True only for `kind === \"public\"`.\n *\n * @remarks The public project kind is the workspace-wide general space: it has no\n * authored roster, so any available agent may own its tasks. Every other kind\n * (`business`, `training`, `personal`, legacy omitted) keeps strict roster\n * validation. The decision is a project property, not a task-source property.\n */\nexport function isRosterExemptProject(project: Pick<Project, \"kind\"> | null | undefined): boolean {\n return project?.kind === \"public\";\n}\n\n/**\n * Resolves the owner membership that authorizes a Project task's execution thread.\n *\n * @param task Exact Project task whose owner is being resolved.\n * @param project Exact Project row; `kind` decides roster exemption.\n * @param room Exact Project main room the owner executes in.\n * @param membership Roster lookup result for `task.ownerId`, if any.\n * @returns The active exact-scope roster membership, or a synthesized membership\n * for a public-project task whose owner is not an active roster bot, or\n * `undefined` when the owner is not an active roster bot and the project is not\n * public.\n *\n * @remarks Public-project tasks may use any available agent as owner, so the\n * Project runtime synthesizes a stable, task-scoped membership descriptor instead\n * of requiring a roster row. Roster authority is unchanged everywhere else.\n */\nexport function resolveTaskOwnerMembership(\n task: TaskItem,\n project: Pick<Project, \"kind\"> | null | undefined,\n room: ProjectRoom,\n membership: ProjectBotMembership | undefined,\n): ProjectBotMembership | undefined {\n const active = membership && membership.status === \"active\"\n && membership.tenantId === task.tenantId && membership.workspaceId === task.workspaceId\n && membership.projectId === task.projectId && membership.assistantId === task.ownerId\n && membership.roomId === room.id;\n if (active) return membership;\n if (!isRosterExemptProject(project)) return undefined;\n return syntheticPublicProjectOwnerMembership(task, room);\n}\n\n/**\n * Builds the stable, task-scoped owner membership used for a public-project task\n * whose owner agent has no active Project roster row.\n *\n * @param task Exact public-project task.\n * @param room Exact Project main room.\n * @returns A descriptor-safe `active` membership matching the task's exact scope\n * and owner, with a deterministic synthetic id so subsequent `ensure`/recovery\n * reads resolve the same canonical Task Thread metadata.\n */\nexport function syntheticPublicProjectOwnerMembership(task: TaskItem, room: ProjectRoom): ProjectBotMembership {\n const threadId = typeof task.context?.thread_id === \"string\" && task.context.thread_id.length > 0\n ? task.context.thread_id\n : task.ownerId;\n return {\n id: `public-project-owner:${task.projectId}:${task.ownerId}`,\n tenantId: task.tenantId,\n workspaceId: task.workspaceId!,\n projectId: task.projectId!,\n roomId: room.id,\n assistantId: task.ownerId,\n role: \"specialist\",\n title: task.ownerId,\n mentionName: task.ownerId,\n status: \"active\",\n roomThreadId: threadId,\n joinedAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n}\n"],"mappings":"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","names":["taskRunRegistry","taskRunRegistry"]}
@@ -0,0 +1,37 @@
1
+ // src/services/collaboration/RecoveryCallerDeps.ts
2
+ import {
3
+ agentInstanceManager,
4
+ getAgentClient,
5
+ getAgentClientAsync
6
+ } from "@axiom-lattice/core";
7
+ function createRecoveryCallerDeps() {
8
+ return {
9
+ callerFor: async (top, tenantId) => {
10
+ if (!top.assistantId) return void 0;
11
+ const load = getAgentClientAsync ?? getAgentClient;
12
+ const client = await load(tenantId, top.assistantId);
13
+ const config = { configurable: { thread_id: top.threadId, runConfig: { tenantId, assistant_id: top.assistantId } } };
14
+ let agent;
15
+ try {
16
+ agent = agentInstanceManager.getAgent({ assistant_id: top.assistantId, thread_id: top.threadId, tenant_id: tenantId });
17
+ } catch {
18
+ }
19
+ return agent ? { client, config, agent } : { client, config };
20
+ },
21
+ resume: async (client, config, agent) => {
22
+ if (agent && typeof agent.resumeTask === "function") {
23
+ try {
24
+ await agent.resumeTask();
25
+ return;
26
+ } catch {
27
+ }
28
+ }
29
+ await client.invoke(null, config);
30
+ }
31
+ };
32
+ }
33
+
34
+ export {
35
+ createRecoveryCallerDeps
36
+ };
37
+ //# sourceMappingURL=chunk-NOXGKYUV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/collaboration/RecoveryCallerDeps.ts"],"sourcesContent":["/**\n * Shared `callerFor`/`resume` hooks for orphan recovery.\n *\n * @remarks\n * The Gateway startup sweep ({@link createOrphanRecoveryRuntime}.`recoverAll`)\n * and the `task:recover` CLI both need the exact same caller resolution and\n * resume behavior. Keeping one factory here avoids drift between the two entry\n * points (for example the DB-backed assistant store fallback and the\n * `agent.resumeTask()` → raw `client.invoke(null)` fallback).\n */\nimport {\n agentInstanceManager,\n getAgentClient,\n getAgentClientAsync,\n} from \"@axiom-lattice/core\";\nimport type { TopCallerRecoveryDeps } from \"./TopCallerRecovery\";\n\n/**\n * Builds the caller-resolution and resume hooks used by orphan recovery.\n *\n * @returns `callerFor` (resolves a top caller's agent client + config, omitting\n * the in-memory `agent` when it is absent) and `resume` (prefers\n * `agent.resumeTask()`, otherwise a raw checkpoint continuation via\n * `client.invoke(null, config)`).\n * @remarks\n * `callerFor` uses `getAgentClientAsync` (falls back to `getAgentClient`) so a\n * DB-backed assistant that is not resident in memory can still be loaded.\n */\nexport function createRecoveryCallerDeps(): Pick<TopCallerRecoveryDeps, \"callerFor\" | \"resume\"> {\n return {\n callerFor: async (top, tenantId) => {\n if (!top.assistantId) return undefined;\n const load = getAgentClientAsync ?? getAgentClient;\n const client = await load(tenantId, top.assistantId);\n const config = { configurable: { thread_id: top.threadId, runConfig: { tenantId, assistant_id: top.assistantId } } };\n let agent: unknown;\n try {\n agent = agentInstanceManager.getAgent({ assistant_id: top.assistantId, thread_id: top.threadId, tenant_id: tenantId });\n } catch {\n // The in-memory instance may be absent outside the owning process;\n // resume falls back to a raw checkpoint continuation without an agent.\n }\n return agent ? { client, config, agent } : { client, config };\n },\n resume: async (client, config, agent) => {\n if (agent && typeof (agent as { resumeTask?: unknown }).resumeTask === \"function\") {\n try {\n await (agent as { resumeTask: () => Promise<void> }).resumeTask();\n return;\n } catch {\n // No durable processing row (e.g. memory queue after a crash):\n // fall back to a raw checkpoint continuation.\n }\n }\n await client.invoke(null, config);\n },\n };\n}\n"],"mappings":";AAUA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcA,SAAS,2BAAgF;AAC9F,SAAO;AAAA,IACL,WAAW,OAAO,KAAK,aAAa;AAClC,UAAI,CAAC,IAAI,YAAa,QAAO;AAC7B,YAAM,OAAO,uBAAuB;AACpC,YAAM,SAAS,MAAM,KAAK,UAAU,IAAI,WAAW;AACnD,YAAM,SAAS,EAAE,cAAc,EAAE,WAAW,IAAI,UAAU,WAAW,EAAE,UAAU,cAAc,IAAI,YAAY,EAAE,EAAE;AACnH,UAAI;AACJ,UAAI;AACF,gBAAQ,qBAAqB,SAAS,EAAE,cAAc,IAAI,aAAa,WAAW,IAAI,UAAU,WAAW,SAAS,CAAC;AAAA,MACvH,QAAQ;AAAA,MAGR;AACA,aAAO,QAAQ,EAAE,QAAQ,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO;AAAA,IAC9D;AAAA,IACA,QAAQ,OAAO,QAAQ,QAAQ,UAAU;AACvC,UAAI,SAAS,OAAQ,MAAmC,eAAe,YAAY;AACjF,YAAI;AACF,gBAAO,MAA8C,WAAW;AAChE;AAAA,QACF,QAAQ;AAAA,QAGR;AAAA,MACF;AACA,YAAM,OAAO,OAAO,MAAM,MAAM;AAAA,IAClC;AAAA,EACF;AACF;","names":[]}
@@ -1,10 +1,10 @@
1
+ import {
2
+ grantCovers
3
+ } from "./chunk-HVIKCUOF.mjs";
1
4
  import {
2
5
  PluginToolScopeError,
3
6
  invokePluginTool
4
7
  } from "./chunk-73QZQQOT.mjs";
5
- import {
6
- grantCovers
7
- } from "./chunk-HVIKCUOF.mjs";
8
8
 
9
9
  // src/services/open/tenantOpenPlugins.ts
10
10
  import {
@@ -154,4 +154,4 @@ export {
154
154
  mergeOpenCatalog,
155
155
  buildTenantOpenPlugins
156
156
  };
157
- //# sourceMappingURL=chunk-526UYVNQ.mjs.map
157
+ //# sourceMappingURL=chunk-NPHK4SZ6.mjs.map
@@ -1 +1 @@
1
- import{l as C}from"./embed-page-chunk-I7PWCKAG.js";import"./embed-page-chunk-H6TK3FAR.js";import"./embed-page-chunk-KN7D66KL.js";import"./embed-page-chunk-WWTU55RX.js";import"./embed-page-chunk-KEL6XU6R.js";import"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import"./embed-page-chunk-EXCJ42IB.js";import{Fa as T,rb as B}from"./embed-page-chunk-U276WBDI.js";import{r as P}from"./embed-page-chunk-HEMNMC4X.js";import{a as I}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{U as c,W as p,oa as D,va as b,xa as l}from"./embed-page-chunk-O4QK5LWZ.js";import{a as U}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as u}from"./embed-page-chunk-6Y3UYJ6Z.js";var e=u(U());var t=u(I()),G={component_key:"workspace_assistants",data:{},message:"Assistants"},N=r=>{let i=r;if(typeof r=="string")try{i=JSON.parse(r)}catch{return{}}return i!==null&&typeof i=="object"&&!Array.isArray(i)?i:{}},H=({data:r})=>{let{assistantId:i,initialTab:F}=r??{},{get:m,put:f,del:A}=P(),y=T(),[g,w]=(0,e.useState)(null),[R,h]=(0,e.useState)([]),[E,v]=(0,e.useState)(!1),[L,S]=(0,e.useState)(null),d=(0,e.useCallback)(()=>{y(G)},[y]),a=(0,e.useCallback)(async()=>{v(!0),S(null);try{let s=(await m("/api/assistants")).data?.records??[];h(s),w(s.find(o=>o.id===i)??null)}catch{S("Failed to load agent")}finally{v(!1)}},[m,i]);(0,e.useEffect)(()=>{i&&a()},[a,i]);let _=(0,e.useCallback)(async(n,s)=>{let o=N(n.graphDefinition),k;try{k=await f(`/api/assistants/${n.id}`,{name:s.name!==void 0?s.name:n.name,description:s.description!==void 0?s.description:n.description,graphDefinition:{...o,...s}})}catch(z){throw l.error("Failed to save agent"),z}if(!k.success)throw l.error("Failed to save agent"),new Error("Failed to save agent");l.success("Saved"),await a()},[f,a]),j=(0,e.useCallback)(n=>{w(s=>s&&s.id===n.id?n:s),h(s=>s.map(o=>o.id===n.id?n:o))},[]),x=(0,e.useCallback)(async n=>{if(!(await A(`/api/assistants/${n}`)).success)throw new Error("Failed to delete agent");l.success("Agent deleted"),d()},[A,d]);return i?g?(0,t.jsx)("div",{style:{height:"100%",overflow:"auto"},children:(0,t.jsx)(B,{children:(0,t.jsx)(C,{assistant:g,allAssistants:R,onBack:d,onDeleted:x,onSave:_,onAssistantUpdated:j,onAgentListInvalidated:()=>void a(),initialTab:F})},g.id)}):E?(0,t.jsx)("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"},children:(0,t.jsx)(b,{})}):L?(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"error",showIcon:!0,message:"Failed to load agent","data-testid":"detail-error",action:(0,t.jsxs)(D,{children:[(0,t.jsx)(p,{size:"small",onClick:()=>void a(),children:"Retry"}),(0,t.jsx)(p,{size:"small",type:"primary",onClick:d,children:"Back to list"})]})})}):(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"warning",showIcon:!0,message:"Agent not found","data-testid":"detail-not-found",action:(0,t.jsx)(p,{size:"small",type:"primary",onClick:d,children:"Back to list"})})}):(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"warning",showIcon:!0,message:"Missing agent id","data-testid":"detail-missing-id"})})};export{H as AgentDetailSideApp};
1
+ import{l as C}from"./embed-page-chunk-CZE4IEB3.js";import"./embed-page-chunk-2G54EIW2.js";import"./embed-page-chunk-SUMYB6ZA.js";import"./embed-page-chunk-N2ISCAS7.js";import"./embed-page-chunk-KEL6XU6R.js";import"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import"./embed-page-chunk-OHDEKFTU.js";import{Fa as T,rb as B}from"./embed-page-chunk-XIXSRYJY.js";import{r as P}from"./embed-page-chunk-HEMNMC4X.js";import{a as I}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{U as c,W as p,oa as D,va as b,xa as l}from"./embed-page-chunk-O4QK5LWZ.js";import{a as U}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as u}from"./embed-page-chunk-6Y3UYJ6Z.js";var e=u(U());var t=u(I()),G={component_key:"workspace_assistants",data:{},message:"Assistants"},N=r=>{let i=r;if(typeof r=="string")try{i=JSON.parse(r)}catch{return{}}return i!==null&&typeof i=="object"&&!Array.isArray(i)?i:{}},H=({data:r})=>{let{assistantId:i,initialTab:F}=r??{},{get:m,put:f,del:A}=P(),y=T(),[g,w]=(0,e.useState)(null),[R,h]=(0,e.useState)([]),[E,v]=(0,e.useState)(!1),[L,S]=(0,e.useState)(null),d=(0,e.useCallback)(()=>{y(G)},[y]),a=(0,e.useCallback)(async()=>{v(!0),S(null);try{let s=(await m("/api/assistants")).data?.records??[];h(s),w(s.find(o=>o.id===i)??null)}catch{S("Failed to load agent")}finally{v(!1)}},[m,i]);(0,e.useEffect)(()=>{i&&a()},[a,i]);let _=(0,e.useCallback)(async(n,s)=>{let o=N(n.graphDefinition),k;try{k=await f(`/api/assistants/${n.id}`,{name:s.name!==void 0?s.name:n.name,description:s.description!==void 0?s.description:n.description,graphDefinition:{...o,...s}})}catch(z){throw l.error("Failed to save agent"),z}if(!k.success)throw l.error("Failed to save agent"),new Error("Failed to save agent");l.success("Saved"),await a()},[f,a]),j=(0,e.useCallback)(n=>{w(s=>s&&s.id===n.id?n:s),h(s=>s.map(o=>o.id===n.id?n:o))},[]),x=(0,e.useCallback)(async n=>{if(!(await A(`/api/assistants/${n}`)).success)throw new Error("Failed to delete agent");l.success("Agent deleted"),d()},[A,d]);return i?g?(0,t.jsx)("div",{style:{height:"100%",overflow:"auto"},children:(0,t.jsx)(B,{children:(0,t.jsx)(C,{assistant:g,allAssistants:R,onBack:d,onDeleted:x,onSave:_,onAssistantUpdated:j,onAgentListInvalidated:()=>void a(),initialTab:F})},g.id)}):E?(0,t.jsx)("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"},children:(0,t.jsx)(b,{})}):L?(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"error",showIcon:!0,message:"Failed to load agent","data-testid":"detail-error",action:(0,t.jsxs)(D,{children:[(0,t.jsx)(p,{size:"small",onClick:()=>void a(),children:"Retry"}),(0,t.jsx)(p,{size:"small",type:"primary",onClick:d,children:"Back to list"})]})})}):(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"warning",showIcon:!0,message:"Agent not found","data-testid":"detail-not-found",action:(0,t.jsx)(p,{size:"small",type:"primary",onClick:d,children:"Back to list"})})}):(0,t.jsx)("div",{style:{padding:24},children:(0,t.jsx)(c,{type:"warning",showIcon:!0,message:"Missing agent id","data-testid":"detail-missing-id"})})};export{H as AgentDetailSideApp};
@@ -1,4 +1,4 @@
1
- import{a as Re,b as Ne,c as Dt,d as Rt,e as Pt,f as Ft,g as Mt,h as Et,i as Nt,j as Lt,k as Bt,l as Ot}from"./embed-page-chunk-I7PWCKAG.js";import"./embed-page-chunk-H6TK3FAR.js";import{a as Ue}from"./embed-page-chunk-KN7D66KL.js";import"./embed-page-chunk-WWTU55RX.js";import"./embed-page-chunk-KEL6XU6R.js";import{b as Ge,e as ze,f as xt,g as wt,h as vt,i as kt,l as St,m as It}from"./embed-page-chunk-AC6X2XRH.js";import{a as ft,b as yt,c as ht,d as bt,e as At}from"./embed-page-chunk-SV2BM3WO.js";import"./embed-page-chunk-S4XZPBRM.js";import"./embed-page-chunk-EXCJ42IB.js";import{$ as dt,Ea as ut,Fa as Ct,G as st,J as it,P as lt,Qa as Ve,da as ct,k as De,oa as pt,rb as Tt,va as mt,w as rt,wa as gt}from"./embed-page-chunk-U276WBDI.js";import{m as et,r as ye}from"./embed-page-chunk-HEMNMC4X.js";import{a as M}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Db as nt,Fa as Qe,Ia as Te,Ja as Xe,La as X,Ua as tt,W as J,_ as Se,aa as Ie,ac as Ee,ea as Me,ka as Ke,la as Ze,ma as Je,mc as at,oa as Ye,ra as R,ta as V,wa as _e,xa as v,ya as fe,yc as ot}from"./embed-page-chunk-O4QK5LWZ.js";import{a as ue}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as x}from"./embed-page-chunk-6Y3UYJ6Z.js";var u=x(ue());var te=x(ue());var Y=x(ue());var $t=x(ue());var ie=x(M()),Kt=60,_t=72,je=(0,$t.memo)(({data:n})=>{let r=Re(n.type),p=Math.min(12+Math.sqrt(n.subAgentCount)*10,48);return(0,ie.jsxs)("div",{style:{display:"flex",flexDirection:"column",alignItems:"center"},children:[(0,ie.jsx)(ze,{type:"target",position:Ge.Top,style:{left:"50%",top:"50%",transform:"translate(-50%, -50%)",background:"transparent",border:"none",width:0,height:0},isConnectable:!1}),(0,ie.jsx)("div",{title:n.label,style:{width:p,height:p,borderRadius:"50%",background:Ne(r.color),display:"flex",alignItems:"center",justifyContent:"center",color:"#fff",fontSize:Math.max(10,p*.4),fontWeight:600,cursor:"pointer",boxShadow:"0 2px 8px rgba(0,0,0,0.15)"},children:n.label.charAt(0).toUpperCase()}),(0,ie.jsx)("div",{style:{fontSize:11,maxWidth:120,textAlign:"center",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",marginTop:4},children:n.label}),(0,ie.jsx)(ze,{type:"source",position:Ge.Top,style:{left:"50%",top:"50%",transform:"translate(-50%, -50%)",background:"transparent",border:"none",width:0,height:0},isConnectable:!1})]})});je.displayName="AgentGraphNode";var ee=x(M()),sn=({assistants:n,onNodeClick:r})=>{let[p,l,g]=vt([]),[o,f,k]=kt([]),[d,S]=(0,Y.useState)(null),H=(0,Y.useMemo)(()=>({agent:je}),[]),m=(0,Y.useMemo)(()=>Pt(n),[n]);(0,Y.useEffect)(()=>{let w=m.nodes.map(i=>({id:i.id})),P=m.edges.map(i=>({source:i.source,target:i.target})),N=new Map(m.nodes.map(i=>[i.id,i])),z=bt(w).force("link",ht(P).id(i=>i.id).distance(80)).force("charge",At().strength(-220)).force("center",ft(0,0)).force("collide",yt(45)).stop();for(let i=0;i<300;i++)z.tick();let F=w.map(i=>({id:i.id,type:"agent",data:N.get(i.id),position:{x:i.x-Kt/2,y:i.y-_t/2}})),s=m.edges.map(i=>({id:`e${i.source}-${i.target}`,source:i.source,target:i.target,style:{stroke:"#1677ff",strokeWidth:2},type:"straight"}));l(F),f(s)},[m,l,f]);let T=(0,Y.useMemo)(()=>d===null?p:p.map(w=>{let P=w.id===d||o.some(N=>N.source===d&&N.target===w.id||N.target===d&&N.source===w.id);return{...w,style:{opacity:P?1:.2,transition:"opacity 0.2s ease"}}}),[p,o,d]),K=(0,Y.useMemo)(()=>d===null?o.map(w=>({...w,style:{stroke:"#1677ff",strokeWidth:1.5,opacity:.25,transition:"opacity 0.2s ease"}})):o.map(w=>{let P=w.source===d||w.target===d;return{...w,style:{stroke:"#1677ff",strokeWidth:P?2.5:1,opacity:P?1:.04,transition:"opacity 0.2s ease"}}}),[o,d]);return(0,ee.jsx)("div",{style:{width:"100%",height:"100%",background:"#fafafa",position:"relative"},children:(0,ee.jsxs)(wt,{nodes:T,edges:K,onNodesChange:g,onEdgesChange:k,onNodeMouseEnter:(w,P)=>S(P.id),onNodeMouseLeave:()=>S(null),onNodeClick:(w,P)=>r?.(String(P.id)),nodeTypes:H,fitView:!0,fitViewOptions:{padding:.25},children:[(0,ee.jsx)(St,{color:"#eee",gap:20}),(0,ee.jsx)(It,{})]})})},Vt=n=>(0,ee.jsx)(xt,{children:(0,ee.jsx)(sn,{...n})});var E=x(M()),ln=n=>{if(!n)return"\u2014";let r=Date.now()-new Date(n).getTime(),p=Math.floor(r/6e4);if(p<1)return"just now";if(p<60)return`${p}m ago`;let l=Math.floor(p/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`},dn=n=>n===null?"#d9d9d9":n>=80?"#22c55e":n>=50?"#f59e0b":"#ef4444",cn=mt(({css:n})=>({row:n`
1
+ import{a as Re,b as Ne,c as Dt,d as Rt,e as Pt,f as Ft,g as Mt,h as Et,i as Nt,j as Lt,k as Bt,l as Ot}from"./embed-page-chunk-CZE4IEB3.js";import"./embed-page-chunk-2G54EIW2.js";import{a as Ue}from"./embed-page-chunk-SUMYB6ZA.js";import"./embed-page-chunk-N2ISCAS7.js";import"./embed-page-chunk-KEL6XU6R.js";import{b as Ge,e as ze,f as xt,g as wt,h as vt,i as kt,l as St,m as It}from"./embed-page-chunk-AC6X2XRH.js";import{a as ft,b as yt,c as ht,d as bt,e as At}from"./embed-page-chunk-SV2BM3WO.js";import"./embed-page-chunk-S4XZPBRM.js";import"./embed-page-chunk-OHDEKFTU.js";import{$ as dt,Ea as ut,Fa as Ct,G as st,J as it,P as lt,Qa as Ve,da as ct,k as De,oa as pt,rb as Tt,va as mt,w as rt,wa as gt}from"./embed-page-chunk-XIXSRYJY.js";import{m as et,r as ye}from"./embed-page-chunk-HEMNMC4X.js";import{a as M}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Db as nt,Fa as Qe,Ia as Te,Ja as Xe,La as X,Ua as tt,W as J,_ as Se,aa as Ie,ac as Ee,ea as Me,ka as Ke,la as Ze,ma as Je,mc as at,oa as Ye,ra as R,ta as V,wa as _e,xa as v,ya as fe,yc as ot}from"./embed-page-chunk-O4QK5LWZ.js";import{a as ue}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as x}from"./embed-page-chunk-6Y3UYJ6Z.js";var u=x(ue());var te=x(ue());var Y=x(ue());var $t=x(ue());var ie=x(M()),Kt=60,_t=72,je=(0,$t.memo)(({data:n})=>{let r=Re(n.type),p=Math.min(12+Math.sqrt(n.subAgentCount)*10,48);return(0,ie.jsxs)("div",{style:{display:"flex",flexDirection:"column",alignItems:"center"},children:[(0,ie.jsx)(ze,{type:"target",position:Ge.Top,style:{left:"50%",top:"50%",transform:"translate(-50%, -50%)",background:"transparent",border:"none",width:0,height:0},isConnectable:!1}),(0,ie.jsx)("div",{title:n.label,style:{width:p,height:p,borderRadius:"50%",background:Ne(r.color),display:"flex",alignItems:"center",justifyContent:"center",color:"#fff",fontSize:Math.max(10,p*.4),fontWeight:600,cursor:"pointer",boxShadow:"0 2px 8px rgba(0,0,0,0.15)"},children:n.label.charAt(0).toUpperCase()}),(0,ie.jsx)("div",{style:{fontSize:11,maxWidth:120,textAlign:"center",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",marginTop:4},children:n.label}),(0,ie.jsx)(ze,{type:"source",position:Ge.Top,style:{left:"50%",top:"50%",transform:"translate(-50%, -50%)",background:"transparent",border:"none",width:0,height:0},isConnectable:!1})]})});je.displayName="AgentGraphNode";var ee=x(M()),sn=({assistants:n,onNodeClick:r})=>{let[p,l,g]=vt([]),[o,f,k]=kt([]),[d,S]=(0,Y.useState)(null),H=(0,Y.useMemo)(()=>({agent:je}),[]),m=(0,Y.useMemo)(()=>Pt(n),[n]);(0,Y.useEffect)(()=>{let w=m.nodes.map(i=>({id:i.id})),P=m.edges.map(i=>({source:i.source,target:i.target})),N=new Map(m.nodes.map(i=>[i.id,i])),z=bt(w).force("link",ht(P).id(i=>i.id).distance(80)).force("charge",At().strength(-220)).force("center",ft(0,0)).force("collide",yt(45)).stop();for(let i=0;i<300;i++)z.tick();let F=w.map(i=>({id:i.id,type:"agent",data:N.get(i.id),position:{x:i.x-Kt/2,y:i.y-_t/2}})),s=m.edges.map(i=>({id:`e${i.source}-${i.target}`,source:i.source,target:i.target,style:{stroke:"#1677ff",strokeWidth:2},type:"straight"}));l(F),f(s)},[m,l,f]);let T=(0,Y.useMemo)(()=>d===null?p:p.map(w=>{let P=w.id===d||o.some(N=>N.source===d&&N.target===w.id||N.target===d&&N.source===w.id);return{...w,style:{opacity:P?1:.2,transition:"opacity 0.2s ease"}}}),[p,o,d]),K=(0,Y.useMemo)(()=>d===null?o.map(w=>({...w,style:{stroke:"#1677ff",strokeWidth:1.5,opacity:.25,transition:"opacity 0.2s ease"}})):o.map(w=>{let P=w.source===d||w.target===d;return{...w,style:{stroke:"#1677ff",strokeWidth:P?2.5:1,opacity:P?1:.04,transition:"opacity 0.2s ease"}}}),[o,d]);return(0,ee.jsx)("div",{style:{width:"100%",height:"100%",background:"#fafafa",position:"relative"},children:(0,ee.jsxs)(wt,{nodes:T,edges:K,onNodesChange:g,onEdgesChange:k,onNodeMouseEnter:(w,P)=>S(P.id),onNodeMouseLeave:()=>S(null),onNodeClick:(w,P)=>r?.(String(P.id)),nodeTypes:H,fitView:!0,fitViewOptions:{padding:.25},children:[(0,ee.jsx)(St,{color:"#eee",gap:20}),(0,ee.jsx)(It,{})]})})},Vt=n=>(0,ee.jsx)(xt,{children:(0,ee.jsx)(sn,{...n})});var E=x(M()),ln=n=>{if(!n)return"\u2014";let r=Date.now()-new Date(n).getTime(),p=Math.floor(r/6e4);if(p<1)return"just now";if(p<60)return`${p}m ago`;let l=Math.floor(p/60);return l<24?`${l}h ago`:`${Math.floor(l/24)}d ago`},dn=n=>n===null?"#d9d9d9":n>=80?"#22c55e":n>=50?"#f59e0b":"#ef4444",cn=mt(({css:n})=>({row:n`
2
2
  display: flex;
3
3
  justify-content: space-between;
4
4
  align-items: flex-end;
@@ -1,4 +1,4 @@
1
- import{c as W,d as V}from"./embed-page-chunk-KEL6XU6R.js";import{b as N,d as U,e as k}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{Ha as b,Ja as z,Ka as F,La as H,Ma as L,Wa as R,Xa as $,Ya as J}from"./embed-page-chunk-U276WBDI.js";import"./embed-page-chunk-HEMNMC4X.js";import{a as g}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Dc as D,Ia as O,Rc as G,Sc as w,Vc as _,W as v,aa as M,gb as P,lb as B,nc as E}from"./embed-page-chunk-O4QK5LWZ.js";import{a as C}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as p}from"./embed-page-chunk-6Y3UYJ6Z.js";var s=p(C());var S=p(C());var o=p(g());var se="tracePulse 1.4s ease-in-out infinite",ie={running:(0,o.jsx)(E,{style:{color:"#1890ff"}}),success:(0,o.jsx)(P,{style:{color:"#52c41a"}}),error:(0,o.jsx)(B,{style:{color:"#ff4d4f"}})};function ae({kind:e}){switch(e){case"human":return(0,o.jsx)(_,{});case"agent":return(0,o.jsx)(G,{});case"tool":return(0,o.jsx)(w,{});case"ai":return(0,o.jsx)(D,{});default:return(0,o.jsx)(w,{})}}var I=S.default.createContext({}),le=()=>S.default.useContext(I),de=({data:e,selected:i})=>{let{onJumpToMessage:a}=le(),t=e.isAnswer===!0,r=e.status==="running",d=(e.parallelCount??1)>1,m=!!(a&&e.messageId&&!e.messageId.startsWith("summary:")),f=e.toolCall?F(e.toolCall.name):e.label,y=()=>{if((e.kind==="tool"||e.kind==="agent")&&e.toolCall){let h=H(e.toolCall.response);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(z,{data:{name:e.toolCall.name,parameters:e.toolCall.args,type:"tool_call"},component_key:`${e.toolCall.id}-params`,interactive:!1}),h&&(0,o.jsx)("div",{style:{marginTop:8},children:(0,o.jsx)(b,{content:h})}),(0,o.jsx)(L,{ui:e.toolCall.ui})]})}return e.content?(0,o.jsx)(b,{content:e.content}):(0,o.jsx)("span",{style:{color:"#8c8c8c"},children:e.label})};return(0,o.jsxs)("div",{"data-testid":"trace-card",style:{height:"100%",display:"flex",flexDirection:"column",border:`1px solid ${t||i?"#6366f1":r?"#91caff":"#e5e7eb"}`,borderRadius:12,background:t?"#eef2ff":"#fff",boxShadow:r?"0 0 0 2px rgba(24,144,255,0.18)":i?"0 0 0 2px rgba(99,102,241,0.2)":"none",animation:r?se:void 0,overflow:"hidden",fontSize:13},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 12px",borderBottom:"1px solid #f0f0f0",background:"rgba(0,0,0,0.02)"},children:[(0,o.jsx)(ae,{kind:e.kind}),(0,o.jsx)("span",{style:{fontWeight:t?700:600,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:f}),d&&(0,o.jsxs)(O,{color:"purple",style:{marginInlineEnd:0,fontSize:10},children:["\u5E76\u53D1 \xD7",e.parallelCount]}),ie[e.status],m&&(0,o.jsx)(v,{type:"text",size:"small",onClick:()=>a?.(e.messageId),children:"\u5BF9\u8BDD"})]}),(0,o.jsx)("div",{style:{flex:1,minHeight:0,overflow:"auto",padding:12},children:y()})]})},ce=({data:e,selected:i})=>(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(k,{type:"target",position:N.Top}),(0,o.jsx)(de,{data:e,selected:i}),(0,o.jsx)(k,{type:"source",position:N.Bottom})]}),K={trace:ce};var Y=p(C());var u=p(g()),pe={running:"#1890ff",success:"#52c41a",error:"#ff4d4f"},Z=({graph:e,activeNodeId:i,onSelectNode:a})=>{let t=Y.default.useMemo(()=>new Map(e.nodes.map(r=>[r.id,r])),[e.nodes]);return(0,u.jsx)("div",{"data-testid":"trace-overview-rail",style:{display:"flex",flexDirection:"column",gap:10,width:160,padding:8,overflowY:"auto",borderRight:"1px solid #f0f0f0"},children:e.phases.map(r=>(0,u.jsxs)("div",{"data-testid":"trace-rail-phase",children:[(0,u.jsx)("div",{style:{fontSize:12,color:"#8c8c8c",marginBottom:4},children:r.title}),(0,u.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:r.nodeIds.map(d=>{let m=t.get(d);if(!m)return null;let f=d===i;return(0,u.jsx)(M,{title:m.data.label,children:(0,u.jsx)("button",{type:"button","data-testid":"trace-rail-tick",onClick:()=>a?.(d),style:{width:f?12:8,height:f?12:8,borderRadius:"50%",border:"none",padding:0,cursor:"pointer",background:pe[m.data.status],outline:f?"2px solid #6366f1":"none"}})},d)})})]},r.id))})};var l=p(g()),j=3,q=()=>{},fe=`
1
+ import{c as W,d as V}from"./embed-page-chunk-KEL6XU6R.js";import{b as N,d as U,e as k}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{Ha as b,Ja as z,Ka as F,La as H,Ma as L,Wa as R,Xa as $,Ya as J}from"./embed-page-chunk-XIXSRYJY.js";import"./embed-page-chunk-HEMNMC4X.js";import{a as g}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Dc as D,Ia as O,Rc as G,Sc as w,Vc as _,W as v,aa as M,gb as P,lb as B,nc as E}from"./embed-page-chunk-O4QK5LWZ.js";import{a as C}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as p}from"./embed-page-chunk-6Y3UYJ6Z.js";var s=p(C());var S=p(C());var o=p(g());var se="tracePulse 1.4s ease-in-out infinite",ie={running:(0,o.jsx)(E,{style:{color:"#1890ff"}}),success:(0,o.jsx)(P,{style:{color:"#52c41a"}}),error:(0,o.jsx)(B,{style:{color:"#ff4d4f"}})};function ae({kind:e}){switch(e){case"human":return(0,o.jsx)(_,{});case"agent":return(0,o.jsx)(G,{});case"tool":return(0,o.jsx)(w,{});case"ai":return(0,o.jsx)(D,{});default:return(0,o.jsx)(w,{})}}var I=S.default.createContext({}),le=()=>S.default.useContext(I),de=({data:e,selected:i})=>{let{onJumpToMessage:a}=le(),t=e.isAnswer===!0,r=e.status==="running",d=(e.parallelCount??1)>1,m=!!(a&&e.messageId&&!e.messageId.startsWith("summary:")),f=e.toolCall?F(e.toolCall.name):e.label,y=()=>{if((e.kind==="tool"||e.kind==="agent")&&e.toolCall){let h=H(e.toolCall.response);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(z,{data:{name:e.toolCall.name,parameters:e.toolCall.args,type:"tool_call"},component_key:`${e.toolCall.id}-params`,interactive:!1}),h&&(0,o.jsx)("div",{style:{marginTop:8},children:(0,o.jsx)(b,{content:h})}),(0,o.jsx)(L,{ui:e.toolCall.ui})]})}return e.content?(0,o.jsx)(b,{content:e.content}):(0,o.jsx)("span",{style:{color:"#8c8c8c"},children:e.label})};return(0,o.jsxs)("div",{"data-testid":"trace-card",style:{height:"100%",display:"flex",flexDirection:"column",border:`1px solid ${t||i?"#6366f1":r?"#91caff":"#e5e7eb"}`,borderRadius:12,background:t?"#eef2ff":"#fff",boxShadow:r?"0 0 0 2px rgba(24,144,255,0.18)":i?"0 0 0 2px rgba(99,102,241,0.2)":"none",animation:r?se:void 0,overflow:"hidden",fontSize:13},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 12px",borderBottom:"1px solid #f0f0f0",background:"rgba(0,0,0,0.02)"},children:[(0,o.jsx)(ae,{kind:e.kind}),(0,o.jsx)("span",{style:{fontWeight:t?700:600,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:f}),d&&(0,o.jsxs)(O,{color:"purple",style:{marginInlineEnd:0,fontSize:10},children:["\u5E76\u53D1 \xD7",e.parallelCount]}),ie[e.status],m&&(0,o.jsx)(v,{type:"text",size:"small",onClick:()=>a?.(e.messageId),children:"\u5BF9\u8BDD"})]}),(0,o.jsx)("div",{style:{flex:1,minHeight:0,overflow:"auto",padding:12},children:y()})]})},ce=({data:e,selected:i})=>(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(k,{type:"target",position:N.Top}),(0,o.jsx)(de,{data:e,selected:i}),(0,o.jsx)(k,{type:"source",position:N.Bottom})]}),K={trace:ce};var Y=p(C());var u=p(g()),pe={running:"#1890ff",success:"#52c41a",error:"#ff4d4f"},Z=({graph:e,activeNodeId:i,onSelectNode:a})=>{let t=Y.default.useMemo(()=>new Map(e.nodes.map(r=>[r.id,r])),[e.nodes]);return(0,u.jsx)("div",{"data-testid":"trace-overview-rail",style:{display:"flex",flexDirection:"column",gap:10,width:160,padding:8,overflowY:"auto",borderRight:"1px solid #f0f0f0"},children:e.phases.map(r=>(0,u.jsxs)("div",{"data-testid":"trace-rail-phase",children:[(0,u.jsx)("div",{style:{fontSize:12,color:"#8c8c8c",marginBottom:4},children:r.title}),(0,u.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:r.nodeIds.map(d=>{let m=t.get(d);if(!m)return null;let f=d===i;return(0,u.jsx)(M,{title:m.data.label,children:(0,u.jsx)("button",{type:"button","data-testid":"trace-rail-tick",onClick:()=>a?.(d),style:{width:f?12:8,height:f?12:8,borderRadius:"50%",border:"none",padding:0,cursor:"pointer",background:pe[m.data.status],outline:f?"2px solid #6366f1":"none"}})},d)})})]},r.id))})};var l=p(g()),j=3,q=()=>{},fe=`
2
2
  @keyframes tracePulse {
3
3
  0%, 100% { box-shadow: 0 0 0 2px rgba(24,144,255,0.18); }
4
4
  50% { box-shadow: 0 0 0 6px rgba(24,144,255,0.05); }
@@ -1 +1 @@
1
- import{s as C}from"./embed-page-chunk-OOZDPBUK.js";import{Ga as v}from"./embed-page-chunk-U276WBDI.js";import{a as w}from"./embed-page-chunk-HEMNMC4X.js";import{a as x}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{ga as b}from"./embed-page-chunk-O4QK5LWZ.js";import{a as D}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as d}from"./embed-page-chunk-6Y3UYJ6Z.js";var c=d(D());var E=d(w());var f=d(x());function p(s){if(!s||s.length===0)return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical"},xAxis:{type:"category",data:[]},yAxis:{type:"value"},series:[{type:"line",name:"Series 1",data:[]}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}};let i=s[0],t=Object.keys(i);if(t.length===0)return p([]);let r=t.filter(e=>{let n=i[e];return typeof n=="number"||!isNaN(Number(n))});if(r.length>0){let e=r[0],n=t.find(a=>!r.includes(a))||t[0],o=s.map((a,l)=>a[n]!==void 0?String(a[n]):`Item ${l+1}`),u=s.map(a=>{let l=a[e];return typeof l=="number"?l:Number(l)||0});return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical",data:[e]},xAxis:{type:"category",data:o},yAxis:{type:"value"},series:[{type:"line",name:e,data:u}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}}}return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical"},xAxis:{type:"category",data:s.map((e,n)=>`Item ${n+1}`)},yAxis:{type:"value"},series:[{type:"bar",name:"Count",data:s.map(()=>1)}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}}}function S(s){if(!s||typeof s!="object"||!s.series||!Array.isArray(s.series)||s.series.length===0)return null;let i=s.series.map((e,n)=>{if(!e||typeof e!="object"||!e.type||!e.data||!Array.isArray(e.data)||e.data.length===0)return null;let o={...e,name:e.name||`Series ${n+1}`};if(e.type==="pie"){let u=e.data.map((a,l)=>typeof a=="object"&&a!==null&&"value"in a?{value:a.value,name:a.name||`Item ${l+1}`}:typeof a=="number"?{value:a,name:`Item ${l+1}`}:null).filter(a=>a!==null);return u.length===0?null:{...o,data:u}}return o}).filter(e=>e!==null);if(i.length===0)return null;let t={...s,series:i},r=i[0].type;if(r!=="pie"){if(!t.xAxis)t.xAxis={type:"category",data:[]};else if(typeof t.xAxis=="object"&&!Array.isArray(t.xAxis)){let e=t.xAxis;if(e.type||(e.type="category"),e.type==="category"&&!e.data){let n=i[0].data;Array.isArray(n)&&n.length>0?Array.isArray(n[0])?e.data=n.map(o=>o[0]):e.data=n.map((o,u)=>`Item ${u+1}`):e.data=[]}t.xAxis=e}t.yAxis?typeof t.yAxis=="object"&&!Array.isArray(t.yAxis)&&(t.yAxis.type||(t.yAxis.type="value")):t.yAxis={type:"value"}}if(!t.title)t.title={text:"Chart",left:"left"};else if(typeof t.title=="object"){let e=t.title;e.left||(e.left="left"),e.text||(e.text="Chart"),t.title=e}if(t.tooltip||(t.tooltip={trigger:r==="pie"?"item":"axis"}),!t.legend)i.length>1&&(t.legend={right:0,orient:"vertical"});else if(typeof t.legend=="object"){let e=t.legend;t.legend=e}return r!=="pie"&&!t.grid&&(t.grid={left:"3%",right:"4%",bottom:"3%",containLabel:!0}),t}function j(s){let i=null;try{let n=typeof s=="string"?s:s.join("");i=(0,E.parse)(n)}catch(n){return{data:null,error:`Failed to parse JSON: ${n instanceof Error?n.message:String(n)}`}}if(!i||typeof i!="object")return{data:null,error:"Parsed data is not an object"};let t=i.series&&Array.isArray(i.series)&&i.series.length>0,r={table:Array.isArray(i.table)?i.table:void 0},e=null;if(i.echarts?e=i.echarts:t&&(e=i),e){let n=S(e);if(n)r.echarts=n;else if(r.table&&r.table.length>0)r.echarts=p(r.table);else return{data:null,error:"ECharts configuration is invalid or incomplete. Required: series array with at least one series containing type and data."}}else r.table&&r.table.length>0?r.echarts=p(r.table):r.echarts=p([]);return{data:r,error:null}}var T=s=>{let{children:i}=s,t=(0,c.useRef)(null),r=(0,c.useRef)(null),e=(0,c.useRef)(null),[n,o]=(0,c.useState)(null);(0,c.useEffect)(()=>{if(!t.current)return;r.current||(r.current=C(t.current));let a=null;if((typeof i=="string"||Array.isArray(i))&&(a=i),!a){r.current&&r.current.clear(),o(null);return}let{data:l,error:g}=j(a);if(g||!l){console.warn("ReactChart failed to parse chart data:",g||"Unknown parse error"),r.current&&r.current.clear(),o(null);return}if(l.table&&Array.isArray(l.table)&&o(l.table),l.echarts)try{r.current.setOption(l.echarts,!0)}catch(h){let m=h instanceof Error?h.message:"Failed to render chart";console.error("Failed to set ECharts option:",h),r.current&&r.current.clear(),o(null)}let y=()=>{r.current&&r.current.resize()};return e.current&&(e.current.disconnect(),e.current=null),t.current&&typeof ResizeObserver<"u"&&(e.current=new ResizeObserver(h=>{requestAnimationFrame(()=>{y()})}),e.current.observe(t.current)),window.addEventListener("resize",y),()=>{e.current&&(e.current.disconnect(),e.current=null),window.removeEventListener("resize",y)}},[i]),(0,c.useEffect)(()=>()=>{e.current&&(e.current.disconnect(),e.current=null),r.current&&(r.current.dispose(),r.current=null)},[]);let u=a=>{if(!a||a.length===0)return[];if(Array.isArray(a[0])){let l=a[0];return a.slice(1).map((y,h)=>{let m={};return y.forEach((R,A)=>{m[l[A]||`col_${A}`]=R}),m})}return a};return(0,f.jsxs)(b,{children:[(0,f.jsx)("div",{ref:t,style:{width:"100%",height:"400px",minHeight:"300px"}}),n&&n.length>0&&(0,f.jsx)("div",{style:{marginTop:16},children:(0,f.jsx)(v,{component_key:"chart_table_data",data:{dataSource:u(n),message:"Data Details"},interactive:!0,default_open_in_side_app:!0})})]})};export{T as ReactChart};
1
+ import{s as C}from"./embed-page-chunk-OOZDPBUK.js";import{Ga as v}from"./embed-page-chunk-XIXSRYJY.js";import{a as w}from"./embed-page-chunk-HEMNMC4X.js";import{a as x}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{ga as b}from"./embed-page-chunk-O4QK5LWZ.js";import{a as D}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as d}from"./embed-page-chunk-6Y3UYJ6Z.js";var c=d(D());var E=d(w());var f=d(x());function p(s){if(!s||s.length===0)return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical"},xAxis:{type:"category",data:[]},yAxis:{type:"value"},series:[{type:"line",name:"Series 1",data:[]}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}};let i=s[0],t=Object.keys(i);if(t.length===0)return p([]);let r=t.filter(e=>{let n=i[e];return typeof n=="number"||!isNaN(Number(n))});if(r.length>0){let e=r[0],n=t.find(a=>!r.includes(a))||t[0],o=s.map((a,l)=>a[n]!==void 0?String(a[n]):`Item ${l+1}`),u=s.map(a=>{let l=a[e];return typeof l=="number"?l:Number(l)||0});return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical",data:[e]},xAxis:{type:"category",data:o},yAxis:{type:"value"},series:[{type:"line",name:e,data:u}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}}}return{title:{text:"Chart",left:"left"},tooltip:{trigger:"axis"},legend:{right:0,orient:"vertical"},xAxis:{type:"category",data:s.map((e,n)=>`Item ${n+1}`)},yAxis:{type:"value"},series:[{type:"bar",name:"Count",data:s.map(()=>1)}],grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0}}}function S(s){if(!s||typeof s!="object"||!s.series||!Array.isArray(s.series)||s.series.length===0)return null;let i=s.series.map((e,n)=>{if(!e||typeof e!="object"||!e.type||!e.data||!Array.isArray(e.data)||e.data.length===0)return null;let o={...e,name:e.name||`Series ${n+1}`};if(e.type==="pie"){let u=e.data.map((a,l)=>typeof a=="object"&&a!==null&&"value"in a?{value:a.value,name:a.name||`Item ${l+1}`}:typeof a=="number"?{value:a,name:`Item ${l+1}`}:null).filter(a=>a!==null);return u.length===0?null:{...o,data:u}}return o}).filter(e=>e!==null);if(i.length===0)return null;let t={...s,series:i},r=i[0].type;if(r!=="pie"){if(!t.xAxis)t.xAxis={type:"category",data:[]};else if(typeof t.xAxis=="object"&&!Array.isArray(t.xAxis)){let e=t.xAxis;if(e.type||(e.type="category"),e.type==="category"&&!e.data){let n=i[0].data;Array.isArray(n)&&n.length>0?Array.isArray(n[0])?e.data=n.map(o=>o[0]):e.data=n.map((o,u)=>`Item ${u+1}`):e.data=[]}t.xAxis=e}t.yAxis?typeof t.yAxis=="object"&&!Array.isArray(t.yAxis)&&(t.yAxis.type||(t.yAxis.type="value")):t.yAxis={type:"value"}}if(!t.title)t.title={text:"Chart",left:"left"};else if(typeof t.title=="object"){let e=t.title;e.left||(e.left="left"),e.text||(e.text="Chart"),t.title=e}if(t.tooltip||(t.tooltip={trigger:r==="pie"?"item":"axis"}),!t.legend)i.length>1&&(t.legend={right:0,orient:"vertical"});else if(typeof t.legend=="object"){let e=t.legend;t.legend=e}return r!=="pie"&&!t.grid&&(t.grid={left:"3%",right:"4%",bottom:"3%",containLabel:!0}),t}function j(s){let i=null;try{let n=typeof s=="string"?s:s.join("");i=(0,E.parse)(n)}catch(n){return{data:null,error:`Failed to parse JSON: ${n instanceof Error?n.message:String(n)}`}}if(!i||typeof i!="object")return{data:null,error:"Parsed data is not an object"};let t=i.series&&Array.isArray(i.series)&&i.series.length>0,r={table:Array.isArray(i.table)?i.table:void 0},e=null;if(i.echarts?e=i.echarts:t&&(e=i),e){let n=S(e);if(n)r.echarts=n;else if(r.table&&r.table.length>0)r.echarts=p(r.table);else return{data:null,error:"ECharts configuration is invalid or incomplete. Required: series array with at least one series containing type and data."}}else r.table&&r.table.length>0?r.echarts=p(r.table):r.echarts=p([]);return{data:r,error:null}}var T=s=>{let{children:i}=s,t=(0,c.useRef)(null),r=(0,c.useRef)(null),e=(0,c.useRef)(null),[n,o]=(0,c.useState)(null);(0,c.useEffect)(()=>{if(!t.current)return;r.current||(r.current=C(t.current));let a=null;if((typeof i=="string"||Array.isArray(i))&&(a=i),!a){r.current&&r.current.clear(),o(null);return}let{data:l,error:g}=j(a);if(g||!l){console.warn("ReactChart failed to parse chart data:",g||"Unknown parse error"),r.current&&r.current.clear(),o(null);return}if(l.table&&Array.isArray(l.table)&&o(l.table),l.echarts)try{r.current.setOption(l.echarts,!0)}catch(h){let m=h instanceof Error?h.message:"Failed to render chart";console.error("Failed to set ECharts option:",h),r.current&&r.current.clear(),o(null)}let y=()=>{r.current&&r.current.resize()};return e.current&&(e.current.disconnect(),e.current=null),t.current&&typeof ResizeObserver<"u"&&(e.current=new ResizeObserver(h=>{requestAnimationFrame(()=>{y()})}),e.current.observe(t.current)),window.addEventListener("resize",y),()=>{e.current&&(e.current.disconnect(),e.current=null),window.removeEventListener("resize",y)}},[i]),(0,c.useEffect)(()=>()=>{e.current&&(e.current.disconnect(),e.current=null),r.current&&(r.current.dispose(),r.current=null)},[]);let u=a=>{if(!a||a.length===0)return[];if(Array.isArray(a[0])){let l=a[0];return a.slice(1).map((y,h)=>{let m={};return y.forEach((R,A)=>{m[l[A]||`col_${A}`]=R}),m})}return a};return(0,f.jsxs)(b,{children:[(0,f.jsx)("div",{ref:t,style:{width:"100%",height:"400px",minHeight:"300px"}}),n&&n.length>0&&(0,f.jsx)("div",{style:{marginTop:16},children:(0,f.jsx)(v,{component_key:"chart_table_data",data:{dataSource:u(n),message:"Data Details"},interactive:!0,default_open_in_side_app:!0})})]})};export{T as ReactChart};
@@ -1,4 +1,4 @@
1
- import{a as Je}from"./embed-page-chunk-H6TK3FAR.js";import{c as Ge,d as We}from"./embed-page-chunk-KEL6XU6R.js";import{b as be,e as Ce,h as _e,i as Fe}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{C as ze,Qa as He,ab as Ve,bb as qe,cb as pe,db as Ne,eb as Ke,fb as Ue,ga as de,gb as Ye,ib as Qe,jb as Xe,k as le,kb as Ze,lb as et,qa as ce,va as G,wa as Oe}from"./embed-page-chunk-U276WBDI.js";import{j as Me,m as Ee}from"./embed-page-chunk-HEMNMC4X.js";import{a as $}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Fa as ae,Ia as De,La as se,W as ne,Y as Ae,Z as Be,_ as we,la as je,ra as F,ta as Te,va as Y,ya as Le}from"./embed-page-chunk-O4QK5LWZ.js";import{a as ie}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as v}from"./embed-page-chunk-6Y3UYJ6Z.js";var i=v(ie());var ot=v(ie());var a=v($()),vt=[{key:"pending",label:"Pending",color:"#7A7A7A"},{key:"in_progress",label:"In Progress",color:"#3b82f6"},{key:"review",label:"Review",color:"#f59e0b"},{key:"failed",label:"Failed",color:"#ef4444"},{key:"interrupted",label:"Interrupted",color:"#8b5cf6"},{key:"completed",label:"Completed",color:"#22c55e"}],tt={high:{label:"High",color:"#ef4444"},medium:{label:"Medium",color:"#f59e0b"},low:{label:"Low",color:"#22c55e"}};function wt(e){let o=typeof e=="string"?new Date(e):e,u=new Date().getTime()-o.getTime(),n=Math.floor(u/1e3),g=Math.floor(n/60),s=Math.floor(g/60),r=Math.floor(s/24);return n<60?"just now":g<60?`${g}m ago`:s<24?`${s}h ago`:r<30?`${r}d ago`:o.toLocaleDateString("en-US")}var Tt=G(({css:e,token:o})=>({container:e`
1
+ import{a as Je}from"./embed-page-chunk-2G54EIW2.js";import{c as Ge,d as We}from"./embed-page-chunk-KEL6XU6R.js";import{b as be,e as Ce,h as _e,i as Fe}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{C as ze,Qa as He,ab as Ve,bb as qe,cb as pe,db as Ne,eb as Ke,fb as Ue,ga as de,gb as Ye,ib as Qe,jb as Xe,k as le,kb as Ze,lb as et,qa as ce,va as G,wa as Oe}from"./embed-page-chunk-XIXSRYJY.js";import{j as Me,m as Ee}from"./embed-page-chunk-HEMNMC4X.js";import{a as $}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Fa as ae,Ia as De,La as se,W as ne,Y as Ae,Z as Be,_ as we,la as je,ra as F,ta as Te,va as Y,ya as Le}from"./embed-page-chunk-O4QK5LWZ.js";import{a as ie}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as v}from"./embed-page-chunk-6Y3UYJ6Z.js";var i=v(ie());var ot=v(ie());var a=v($()),vt=[{key:"pending",label:"Pending",color:"#7A7A7A"},{key:"in_progress",label:"In Progress",color:"#3b82f6"},{key:"review",label:"Review",color:"#f59e0b"},{key:"failed",label:"Failed",color:"#ef4444"},{key:"interrupted",label:"Interrupted",color:"#8b5cf6"},{key:"completed",label:"Completed",color:"#22c55e"}],tt={high:{label:"High",color:"#ef4444"},medium:{label:"Medium",color:"#f59e0b"},low:{label:"Low",color:"#22c55e"}};function wt(e){let o=typeof e=="string"?new Date(e):e,u=new Date().getTime()-o.getTime(),n=Math.floor(u/1e3),g=Math.floor(n/60),s=Math.floor(g/60),r=Math.floor(s/24);return n<60?"just now":g<60?`${g}m ago`:s<24?`${s}h ago`:r<30?`${r}d ago`:o.toLocaleDateString("en-US")}var Tt=G(({css:e,token:o})=>({container:e`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  height: 100%;
@@ -1,4 +1,4 @@
1
- import{d as Pe,f as Ge,g as Be,h as _e,i as Fe,l as We,m as je}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{$ as Ae,$a as He,A as ye,C as Z,I as Ce,Ia as Ee,N as Se,R as $e,T as Ne,U as Ie,W as we,X as Me,Y as B,Z as oe,_ as De,_a as Oe,g as he,ia as Le,n as J,o as ve,p as Te,q as Q,qa as se,r as O,ra as Re,t as G,va as I,z as be,za as ze}from"./embed-page-chunk-U276WBDI.js";import"./embed-page-chunk-HEMNMC4X.js";import{a as N}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Da as re,Ea as V,Ia as E,Ka as xe,La as R,W as ce,Z as X,aa as z,da as K,fa as me,ga as W,ja as j,ka as pe,oa as q,ua as ge,va as fe,ya as ue}from"./embed-page-chunk-O4QK5LWZ.js";import{a as H}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as h}from"./embed-page-chunk-6Y3UYJ6Z.js";var ie=h(H());var ee=h(H());var f=h(N()),pt=I(({token:e,css:t})=>({container:t`
1
+ import{d as Pe,f as Ge,g as Be,h as _e,i as Fe,l as We,m as je}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{$ as Ae,$a as He,A as ye,C as Z,I as Ce,Ia as Ee,N as Se,R as $e,T as Ne,U as Ie,W as we,X as Me,Y as B,Z as oe,_ as De,_a as Oe,g as he,ia as Le,n as J,o as ve,p as Te,q as Q,qa as se,r as O,ra as Re,t as G,va as I,z as be,za as ze}from"./embed-page-chunk-XIXSRYJY.js";import"./embed-page-chunk-HEMNMC4X.js";import{a as N}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Da as re,Ea as V,Ia as E,Ka as xe,La as R,W as ce,Z as X,aa as z,da as K,fa as me,ga as W,ja as j,ka as pe,oa as q,ua as ge,va as fe,ya as ue}from"./embed-page-chunk-O4QK5LWZ.js";import{a as H}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as h}from"./embed-page-chunk-6Y3UYJ6Z.js";var ie=h(H());var ee=h(H());var f=h(N()),pt=I(({token:e,css:t})=>({container:t`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  height: 100%;
@@ -1,4 +1,4 @@
1
- import{a as ce,c as pe}from"./embed-page-chunk-WWTU55RX.js";import{a as xe}from"./embed-page-chunk-KEL6XU6R.js";import{a as ne,b as O,e as j,f as G,g as oe,h as ie,i as re,k as se,l as ae,m as le,n as de}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{Ha as H,Y as L,h as Q,pa as te,s as F,u as ee,y as M}from"./embed-page-chunk-U276WBDI.js";import{r as $}from"./embed-page-chunk-HEMNMC4X.js";import{a as I}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Aa as J,Bc as K,Fa as Z,Ia as D,La as X,Z as E,aa as P,na as _,oa as A,tb as q,va as B,wa as Y}from"./embed-page-chunk-O4QK5LWZ.js";import{a as U}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as k}from"./embed-page-chunk-6Y3UYJ6Z.js";var r=k(U());var V=k(xe());var ue=k(U());var ge=k(I()),fe=({steps:t,graphDefinition:o,assistantId:n})=>{let l=(0,ue.useMemo)(()=>pe(o),[o]);return(0,ge.jsx)(ce,{dsl:l,steps:t,assistantId:n})};var e=k(I()),ve=`
1
+ import{a as ce,c as pe}from"./embed-page-chunk-N2ISCAS7.js";import{a as xe}from"./embed-page-chunk-KEL6XU6R.js";import{a as ne,b as O,e as j,f as G,g as oe,h as ie,i as re,k as se,l as ae,m as le,n as de}from"./embed-page-chunk-AC6X2XRH.js";import"./embed-page-chunk-S4XZPBRM.js";import{Ha as H,Y as L,h as Q,pa as te,s as F,u as ee,y as M}from"./embed-page-chunk-XIXSRYJY.js";import{r as $}from"./embed-page-chunk-HEMNMC4X.js";import{a as I}from"./embed-page-chunk-MB65DZAX.js";import"./embed-page-chunk-VW3NF5NT.js";import"./embed-page-chunk-5JDQ456X.js";import"./embed-page-chunk-Z7USDLHI.js";import{Aa as J,Bc as K,Fa as Z,Ia as D,La as X,Z as E,aa as P,na as _,oa as A,tb as q,va as B,wa as Y}from"./embed-page-chunk-O4QK5LWZ.js";import{a as U}from"./embed-page-chunk-4BKXE5ON.js";import"./embed-page-chunk-IX4WLWCY.js";import"./embed-page-chunk-EUOOO2LS.js";import{e as k}from"./embed-page-chunk-6Y3UYJ6Z.js";var r=k(U());var V=k(xe());var ue=k(U());var ge=k(I()),fe=({steps:t,graphDefinition:o,assistantId:n})=>{let l=(0,ue.useMemo)(()=>pe(o),[o]);return(0,ge.jsx)(ce,{dsl:l,steps:t,assistantId:n})};var e=k(I()),ve=`
2
2
  @keyframes spin {
3
3
  from { transform: rotate(0deg); }
4
4
  to { transform: rotate(360deg); }