@agimon-ai/po-dynamic-workflow 0.0.1-alpha.2 → 0.0.1-alpha.3

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.
@@ -5,6 +5,7 @@ import { View } from "react-native-unistyles/components/native/View";
5
5
  import { Text } from "react-native-unistyles/components/native/Text";
6
6
  import { ScrollView } from "react-native-unistyles/components/native/ScrollView";
7
7
  import { Pressable } from "react-native-unistyles/components/native/Pressable";
8
+ import { AppState } from "react-native";
8
9
  import { StyleSheet } from "react-native-unistyles";
9
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
11
  //#region src/constants/dynamicWorkflow.ts
@@ -142,6 +143,35 @@ function activityCounts(run) {
142
143
  }
143
144
  //#endregion
144
145
  //#region src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowView.native.tsx
146
+ /** Only a visible running duration ticks, not its surrounding workflow tree. */
147
+ function Duration({ startedAt, finishedAt, running, now }) {
148
+ const [clock, setClock] = useState(() => Date.now());
149
+ useEffect(() => {
150
+ if (now !== void 0 || !running || startedAt === void 0 || finishedAt !== void 0) return;
151
+ let timer;
152
+ const update = () => {
153
+ clearInterval(timer);
154
+ if (AppState.currentState !== "active") return;
155
+ setClock(Date.now());
156
+ timer = setInterval(() => setClock(Date.now()), 1e3);
157
+ };
158
+ const subscription = AppState.addEventListener("change", update);
159
+ update();
160
+ return () => {
161
+ clearInterval(timer);
162
+ subscription.remove();
163
+ };
164
+ }, [
165
+ startedAt,
166
+ finishedAt,
167
+ running,
168
+ now
169
+ ]);
170
+ return /* @__PURE__ */ jsx(Text, {
171
+ style: styles.dim,
172
+ children: workflowDuration(startedAt, finishedAt, now ?? clock)
173
+ });
174
+ }
145
175
  function DynamicWorkflowActivity({ runs, connected = true, onOpen }) {
146
176
  return /* @__PURE__ */ jsxs(View, {
147
177
  style: styles.run,
@@ -295,9 +325,11 @@ function ItemRow({ item, run, now, defaultExpanded, onOpenAgent }) {
295
325
  children: [/* @__PURE__ */ jsx(Text, {
296
326
  style: styles.title,
297
327
  children: phase.label
298
- }), /* @__PURE__ */ jsx(Text, {
299
- style: styles.dim,
300
- children: workflowDuration(phase.startedAt, phase.finishedAt, now)
328
+ }), /* @__PURE__ */ jsx(Duration, {
329
+ startedAt: phase.startedAt,
330
+ finishedAt: phase.finishedAt,
331
+ running: phase.status === "running",
332
+ now
301
333
  })]
302
334
  }),
303
335
  phase.executionStatus !== phase.status && /* @__PURE__ */ jsxs(Text, {
@@ -374,7 +406,12 @@ function DynamicWorkflowView({ runs, now, connected = true, defaultExpandedKeys
374
406
  }),
375
407
  /* @__PURE__ */ jsxs(Text, {
376
408
  style: styles.dim,
377
- children: [workflowDuration(run.startedAt, run.finishedAt, now), run.executionStatus !== run.status ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}` : ""]
409
+ children: [/* @__PURE__ */ jsx(Duration, {
410
+ startedAt: run.startedAt,
411
+ finishedAt: run.finishedAt,
412
+ running: run.status === "running",
413
+ now
414
+ }), run.executionStatus !== run.status ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}` : ""]
378
415
  }),
379
416
  run.error && /* @__PURE__ */ jsx(Text, {
380
417
  accessibilityRole: run.status === "failed" ? "alert" : void 0,
@@ -623,7 +660,6 @@ const styles = StyleSheet.create((theme) => ({
623
660
  //#endregion
624
661
  //#region src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowPanel.native.tsx
625
662
  const EMPTY_RUNS = [];
626
- const TICK_MS = 1e3;
627
663
  function dynamicWorkflowTab() {
628
664
  return {
629
665
  id: "dynamic-workflow-runs",
@@ -658,14 +694,8 @@ function DynamicWorkflowActivitySection({ sessionId, openTransientTab }) {
658
694
  }
659
695
  function DynamicWorkflowPanel({ sessionId, openTransientTab }) {
660
696
  const snapshot = useWorkflows(sessionId);
661
- const [now, setNow] = useState(() => Date.now());
662
- useEffect(() => {
663
- const timer = setInterval(() => setNow(Date.now()), TICK_MS);
664
- return () => clearInterval(timer);
665
- }, []);
666
697
  return /* @__PURE__ */ jsx(DynamicWorkflowView, {
667
698
  runs: snapshot?.runs ?? EMPTY_RUNS,
668
- now,
669
699
  onOpenAgent: (runId) => {
670
700
  if (sessionId !== null) openTransientTab(workflowAgentTab(runId));
671
701
  }
@@ -1 +1 @@
1
- {"version":3,"file":"native.mjs","names":["Button","Dot","fontOf","StatusBadge","PoNativeTheme","useState","StyleSheet","DynamicWorkflowItem","DynamicWorkflowPhase","DynamicWorkflowRun","DynamicWorkflowShape","DynamicWorkflowActivityProps","DynamicWorkflowViewProps","activitySummary","activityCounts","statusDot","groupSummary","WORKFLOW_STATUS","workflowDuration","DynamicWorkflowActivity","runs","connected","onOpen","styles","run","dim","length","itemTitle","link","map","counts","key","label","activityRow","inline","status","total","activityDetail","running","done","failed","error","progress","progressDone","width","progressRunning","PhaseTrack","shape","phases","kind","phase","find","entry","tone","leaves","node","some","children","grouped","phaseGroup","phaseSequence","child","ItemRow","item","now","defaultExpanded","onOpenAgent","runId","expanded","setExpanded","toggle","track","details","detail","title","startedAt","finishedAt","executionStatus","undefined","agents","agent","index","DynamicWorkflowView","defaultExpandedKeys","screen","content","notice","empty","heading","body","runTitle","groups","group","concurrency","items","includes","truncated","create","theme","minHeight","padding","spacing","gap","uni__dependencies","paddingLeft","height","borderRadius","full","overflow","flexDirection","backgroundColor","colors","deep","green","yellow","flex","bg","flexWrap","alignItems","minWidth","color","text","fontFamily","sans","fontSize","base","lineHeight","flexShrink","hi","fontWeight","semibold","lg","sm","blue","red","borderWidth","borderColor","border","md","paddingVertical","paddingHorizontal","paddingTop","borderTopWidth","borderTopColor","maxWidth","borderLeftWidth","borderLeftColor","activityGroupDynamicWorkflow","channelDynamicWorkflowRuns","fillDynamicWorkflow"],"sources":["../../src/constants/dynamicWorkflow.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/dynamicWorkflowState.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/dynamicWorkflowStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/dynamicWorkflowPresentation.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/dynamic-workflow.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/DynamicWorkflow.activity.dynamic-workflow.native.tsx","../../generated/native.ts"],"sourcesContent":["export const DYNAMIC_WORKFLOW_CHANNEL = 'dynamic_workflow_runs';\n","import type { DynamicWorkflowSnapshot, DynamicWorkflowStatus } from '../../../../../types/dynamicWorkflow';\n\nconst STATUSES: readonly string[] = ['pending', 'running', 'completed', 'failed', 'stopped', 'skipped'];\nconst SHAPE_KINDS = ['step', 'sequence', 'parallel', 'branch', 'foreach'];\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction count(value: unknown): boolean {\n return finite(value) && Number.isSafeInteger(value) && value >= 0;\n}\nfunction status(value: unknown): value is DynamicWorkflowStatus {\n return typeof value === 'string' && STATUSES.includes(value);\n}\nfunction named(value: unknown): value is Record<string, unknown> {\n return record(value) && typeof value.key === 'string' && typeof value.label === 'string';\n}\nfunction timing(value: Record<string, unknown>): boolean {\n return (\n (value.startedAt === undefined || finite(value.startedAt)) &&\n (value.finishedAt === undefined || finite(value.finishedAt)) &&\n (value.error === undefined || typeof value.error === 'string')\n );\n}\nfunction shape(value: unknown, depth = 0): boolean {\n return (\n depth < 128 &&\n named(value) &&\n typeof value.kind === 'string' &&\n SHAPE_KINDS.includes(value.kind) &&\n Array.isArray(value.children) &&\n value.children.every((child: unknown) => shape(child, depth + 1))\n );\n}\nfunction phase(value: unknown): boolean {\n return (\n named(value) &&\n status(value.status) &&\n status(value.executionStatus) &&\n timing(value) &&\n Array.isArray(value.agents) &&\n value.agents.every(\n (agent: unknown) =>\n record(agent) &&\n typeof agent.runId === 'string' &&\n agent.runId.length > 0 &&\n status(agent.status) &&\n agent.status !== 'pending' &&\n agent.status !== 'skipped',\n )\n );\n}\nfunction item(value: unknown): boolean {\n return (\n named(value) &&\n count(value.index) &&\n status(value.status) &&\n Array.isArray(value.phases) &&\n value.phases.every(phase)\n );\n}\nfunction group(value: unknown): boolean {\n return (\n named(value) &&\n count(value.total) &&\n typeof value.truncated === 'boolean' &&\n (value.concurrency === undefined || (count(value.concurrency) && value.concurrency !== 0)) &&\n record(value.counts) &&\n STATUSES.every((key) => count((value.counts as Record<string, unknown>)[key])) &&\n Array.isArray(value.items) &&\n value.items.every(item)\n );\n}\nfunction run(value: unknown): boolean {\n return (\n named(value) &&\n typeof value.workflowId === 'string' &&\n status(value.status) &&\n status(value.executionStatus) &&\n finite(value.startedAt) &&\n timing(value) &&\n shape(value.shape) &&\n Array.isArray(value.groups) &&\n value.groups.every(group)\n );\n}\n\n/** Validate every field the two presentations read before admitting a transport frame. */\nexport function parseWorkflowSnapshot(value: unknown): DynamicWorkflowSnapshot | null {\n if (\n !record(value) ||\n value.version !== 1 ||\n !count(value.revision) ||\n typeof value.sessionId !== 'string' ||\n !Array.isArray(value.runs) ||\n !value.runs.every(run)\n )\n return null;\n return value as unknown as DynamicWorkflowSnapshot;\n}\n\n/** Session identity is checked by the channel before this monotonic fold. */\nexport function nextWorkflowSnapshot(\n current: DynamicWorkflowSnapshot | null,\n next: DynamicWorkflowSnapshot,\n): DynamicWorkflowSnapshot {\n return current !== null && next.revision <= current.revision ? current : next;\n}\n","import { defineSessionChannel, defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { DYNAMIC_WORKFLOW_CHANNEL } from '../../../../../constants/dynamicWorkflow';\nimport type { DynamicWorkflowSnapshot } from '../../../../../types/dynamicWorkflow';\nimport { nextWorkflowSnapshot, parseWorkflowSnapshot } from './dynamicWorkflowState';\n\nexport const workflows = defineSessionStore<DynamicWorkflowSnapshot | null>(null);\n\nexport const workflowRunsChannel = defineSessionChannel<DynamicWorkflowSnapshot>({\n channel: DYNAMIC_WORKFLOW_CHANNEL,\n parse: parseWorkflowSnapshot,\n apply(sessionId, snapshot) {\n if (snapshot.sessionId !== sessionId) return;\n workflows.update(sessionId, (current) => nextWorkflowSnapshot(current, snapshot));\n },\n drop(sessionId) {\n workflows.drop(sessionId);\n },\n});\n","import type {\n DynamicWorkflowGroup,\n DynamicWorkflowItem,\n DynamicWorkflowPhase,\n DynamicWorkflowShape,\n DynamicWorkflowRun,\n DynamicWorkflowStatus,\n} from '../../../../../types/dynamicWorkflow';\n\nexport const WORKFLOW_STATUS = {\n pending: { label: 'Pending', tone: 'neutral' },\n running: { label: 'Running', tone: 'running' },\n completed: { label: 'Done', tone: 'ok' },\n failed: { label: 'Failed', tone: 'error' },\n stopped: { label: 'Stopped', tone: 'neutral' },\n skipped: { label: 'Skipped', tone: 'neutral' },\n} as const satisfies Record<DynamicWorkflowStatus, { label: string; tone: string }>;\n\nexport function groupSummary(group: DynamicWorkflowGroup): string {\n const count = (status: DynamicWorkflowStatus) => group.counts[status];\n const parts = [`${count('running')} of ${group.total} running`, `${count('completed')} done`];\n if (count('failed')) parts.push(`${count('failed')} failed`);\n if (count('stopped')) parts.push(`${count('stopped')} stopped`);\n if (count('skipped')) parts.push(`${count('skipped')} skipped`);\n return parts.join(' · ');\n}\n\nexport function activitySummary(runs: DynamicWorkflowRun[]): string {\n if (!runs.length) return 'Workflows appear here when Po starts them.';\n return `${runs.filter((run) => run.status === 'running').length} running · ${runs.filter((run) => run.status !== 'running' && run.status !== 'pending').length} finished`;\n}\n\nexport function workflowDuration(startedAt?: number, finishedAt?: number, now = 0): string {\n if (startedAt === undefined) return 'Not started';\n const seconds = Math.max(0, Math.floor(((finishedAt ?? now) - startedAt) / 1000));\n if (seconds < 60) return `${seconds}s`;\n return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\nexport interface DynamicWorkflowViewProps {\n runs: DynamicWorkflowRun[];\n now: number;\n connected?: boolean;\n defaultExpandedKeys?: string[];\n onOpenAgent: (runId: string) => void;\n}\n\nexport interface DynamicWorkflowActivityProps {\n runs: DynamicWorkflowRun[];\n connected?: boolean;\n onOpen: () => void;\n}\n\nexport const MAX_GRAPH_ITEM_CELLS = 24;\n\nexport const statusDot = (status: DynamicWorkflowStatus) =>\n status === 'completed' ? 'green' : status === 'running' ? 'yellow' : status === 'failed' ? 'red' : 'neutral';\n\nexport function activityCounts(run: DynamicWorkflowRun) {\n // Root rows describe direct steps, not foreach items.\n const groups = run.groups.filter((group) => group.concurrency !== undefined);\n const total = groups.reduce((sum, group) => sum + group.total, 0);\n const count = (status: DynamicWorkflowStatus) => groups.reduce((sum, group) => sum + group.counts[status], 0);\n return { total, running: count('running'), done: count('completed'), failed: count('failed') };\n}\n\nexport interface WorkflowGraphNode {\n id: string;\n parentId?: string;\n position: { x: number; y: number };\n width: number;\n height: number;\n data: {\n label: string;\n kind: DynamicWorkflowShape['kind'];\n status: DynamicWorkflowStatus;\n phase?: DynamicWorkflowPhase;\n group?: DynamicWorkflowGroup;\n };\n}\nexport interface WorkflowGraphEdge {\n id: string;\n source: string;\n target: string;\n status: DynamicWorkflowStatus;\n}\n\n/** DOM-free series-parallel layout. All child coordinates are relative to their foreach parent. */\nexport function workflowGraph(run: DynamicWorkflowRun) {\n type Box = {\n nodes: WorkflowGraphNode[];\n edges: WorkflowGraphEdge[];\n width: number;\n height: number;\n entry: string[];\n exit: string[];\n };\n const edge = (source: string, target: string, nodes: WorkflowGraphNode[]): WorkflowGraphEdge => ({\n id: `${source}->${target}`,\n source,\n target,\n status: nodes.find((node) => node.id === target)?.data.status ?? 'pending',\n });\n const aggregate = (statuses: DynamicWorkflowStatus[]): DynamicWorkflowStatus =>\n statuses.includes('running')\n ? 'running'\n : statuses.includes('failed')\n ? 'failed'\n : statuses.length &&\n statuses.some((status) => status === 'completed') &&\n statuses.every((status) => status === 'completed' || status === 'skipped')\n ? 'completed'\n : statuses.includes('stopped')\n ? 'stopped'\n : statuses.length && statuses.every((status) => status === 'skipped')\n ? 'skipped'\n : 'pending';\n const layout = (shape: DynamicWorkflowShape, item?: DynamicWorkflowItem, parentId?: string): Box => {\n const id = `${parentId ?? run.key}:${shape.key}`;\n if (shape.kind === 'step') {\n const phase = item?.phases.find((phase) => phase.key === shape.key);\n return {\n nodes: [\n {\n id,\n parentId,\n position: { x: 0, y: 0 },\n width: 200,\n height: phase?.error ? 88 : 64,\n data: { label: shape.label, kind: shape.kind, status: phase?.status ?? 'pending', phase },\n },\n ],\n edges: [],\n width: 200,\n height: phase?.error ? 88 : 64,\n entry: [id],\n exit: [id],\n };\n }\n if (shape.kind === 'foreach') {\n const group = run.groups.find((group) =>\n item ? group.key === `${item.key}/${shape.key}` : group.key.endsWith(`/${shape.key}`),\n );\n const representative = group?.items.find((row) => row.status === 'running') ?? group?.items[0];\n const inner = combine(\n shape.children.map((child) => layout(child, representative, id)),\n false,\n );\n const width = Math.max(360, inner.width + 48);\n const cellRows = Math.ceil(Math.min(group?.items.length ?? 0, MAX_GRAPH_ITEM_CELLS) / 8);\n const height = inner.height + 112 + cellRows * 40 + (group && group.total > MAX_GRAPH_ITEM_CELLS ? 32 : 0);\n const status = group\n ? aggregate(\n Object.entries(group.counts)\n .filter(([, count]) => count > 0)\n .map(([status]) => status as DynamicWorkflowStatus),\n )\n : 'pending';\n const node: WorkflowGraphNode = {\n id,\n parentId,\n position: { x: 0, y: 0 },\n width,\n height,\n data: { label: shape.label, kind: shape.kind, status, group },\n };\n inner.nodes.forEach((node) => {\n if (node.parentId === id) {\n node.position.x += (width - inner.width) / 2;\n node.position.y += 72;\n }\n });\n return { nodes: [node, ...inner.nodes], edges: inner.edges, width, height, entry: [id], exit: [id] };\n }\n const children = shape.children.map((child) => layout(child, item, parentId));\n const box = combine(children, shape.kind !== 'sequence');\n if (shape.kind !== 'branch') return box;\n box.nodes.forEach((node) => {\n if (node.parentId === parentId) node.position.y += 144;\n });\n const status = aggregate(\n children.flatMap((child) =>\n child.nodes.filter((node) => node.parentId === parentId).map((node) => node.data.status),\n ),\n );\n const node: WorkflowGraphNode = {\n id,\n parentId,\n position: { x: (box.width - 160) / 2, y: 0 },\n width: 160,\n height: 96,\n data: { label: 'Branch', kind: 'branch', status },\n };\n box.edges.push(...box.entry.map((target) => edge(id, target, box.nodes)));\n return { ...box, nodes: [node, ...box.nodes], height: box.height + 144, entry: [id] };\n };\n function combine(boxes: Box[], horizontal: boolean): Box {\n const width = horizontal\n ? boxes.reduce((sum, box) => sum + box.width, 0) + Math.max(0, boxes.length - 1) * 48\n : Math.max(200, ...boxes.map((box) => box.width));\n const nodes: WorkflowGraphNode[] = [],\n edges: WorkflowGraphEdge[] = [];\n let offset = 0;\n boxes.forEach((box, index) => {\n const roots = new Set(box.nodes.map((node) => node.id));\n box.nodes.forEach((node) => {\n if (!node.parentId || !roots.has(node.parentId)) {\n node.position.x += horizontal ? offset : (width - box.width) / 2;\n node.position.y += horizontal ? 0 : offset;\n }\n });\n nodes.push(...box.nodes);\n edges.push(...box.edges);\n if (!horizontal && index)\n for (const source of boxes[index - 1].exit)\n for (const target of box.entry) edges.push(edge(source, target, box.nodes));\n offset += (horizontal ? box.width : box.height) + 48;\n });\n return {\n nodes,\n edges,\n width,\n height: horizontal ? Math.max(0, ...boxes.map((box) => box.height)) : Math.max(0, offset - 48),\n entry: horizontal ? boxes.flatMap((box) => box.entry) : (boxes[0]?.entry ?? []),\n exit: horizontal ? boxes.flatMap((box) => box.exit) : (boxes.at(-1)?.exit ?? []),\n };\n }\n const root = run.groups\n .flatMap((group) => group.items)\n .find((item) =>\n item.phases.some((phase) => {\n const direct = (shape: DynamicWorkflowShape): boolean =>\n shape.kind === 'foreach' ? false : shape.key === phase.key || shape.children.some(direct);\n return direct(run.shape);\n }),\n );\n return layout(run.shape, root);\n}\n","import { Button, Dot, fontOf, StatusBadge } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useState } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type {\n DynamicWorkflowItem,\n DynamicWorkflowPhase,\n DynamicWorkflowRun,\n DynamicWorkflowShape,\n} from '../../../../../types/dynamicWorkflow';\nimport {\n type DynamicWorkflowActivityProps,\n type DynamicWorkflowViewProps,\n activitySummary,\n activityCounts,\n statusDot,\n groupSummary,\n WORKFLOW_STATUS,\n workflowDuration,\n} from './dynamicWorkflowPresentation';\n\nexport function DynamicWorkflowActivity({ runs, connected = true, onOpen }: DynamicWorkflowActivityProps) {\n return (\n <View style={styles.run}>\n <Text style={styles.dim}>{connected ? activitySummary(runs) : 'Connection paused. Showing last update.'}</Text>\n {!runs.length && (\n <Button variant=\"ghost\" size=\"card\" onPress={onOpen} accessibilityLabel=\"Open dynamic workflows\">\n <Text style={styles.itemTitle}>No workflows yet</Text>\n <Text style={styles.dim}>Idle</Text>\n <Text style={styles.link}>View workflows →</Text>\n </Button>\n )}\n {runs.map((run) => {\n const counts = activityCounts(run);\n return (\n <Pressable\n key={run.key}\n onPress={onOpen}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${run.label}`}\n style={styles.activityRow}\n >\n <View style={styles.inline}>\n <Dot tone={statusDot(run.status)} size=\"md\" />\n <Text style={styles.itemTitle}>{run.label}</Text>\n <Text style={styles.dim}>{WORKFLOW_STATUS[run.status].label} ›</Text>\n </View>\n {counts.total > 0 && (\n <View style={styles.activityDetail}>\n <Text style={styles.dim}>\n {run.status === 'running' ? `${counts.running} of ${counts.total} running` : `${counts.total} items`}{' '}\n · {counts.done} done{counts.failed > 0 && <Text style={styles.error}> · {counts.failed} failed</Text>}\n </Text>\n <View\n style={styles.progress}\n accessibilityLabel={`${counts.done} done, ${counts.running} running, ${counts.total} total`}\n >\n <View style={[styles.progressDone, { width: `${(counts.done / counts.total) * 100}%` }]} />\n <View style={[styles.progressRunning, { width: `${(counts.running / counts.total) * 100}%` }]} />\n </View>\n </View>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nfunction PhaseTrack({ shape, phases }: { shape: DynamicWorkflowShape; phases: DynamicWorkflowPhase[] }) {\n if (shape.kind === 'step') {\n const phase = phases.find((entry) => entry.key === shape.key);\n return phase ? (\n <View style={styles.phase}>\n <StatusBadge tone={WORKFLOW_STATUS[phase.status].tone}>\n {phase.label} · {WORKFLOW_STATUS[phase.status].label}\n </StatusBadge>\n </View>\n ) : null;\n }\n const leaves = (node: DynamicWorkflowShape): boolean =>\n node.kind === 'step' ? phases.some((phase) => phase.key === node.key) : node.children.some(leaves);\n if (!leaves(shape)) return null;\n const grouped = shape.kind === 'parallel' || shape.kind === 'branch';\n return (\n <View style={grouped ? styles.phaseGroup : styles.phaseSequence}>\n {grouped && <Text style={styles.dim}>{shape.kind === 'parallel' ? 'Parallel' : 'Branch'}</Text>}\n {shape.children.map((child) => (\n <PhaseTrack key={child.key} shape={child} phases={phases} />\n ))}\n </View>\n );\n}\n\nfunction ItemRow({\n item,\n run,\n now,\n defaultExpanded,\n onOpenAgent,\n}: {\n item: DynamicWorkflowItem;\n run: DynamicWorkflowRun;\n now: number;\n defaultExpanded: boolean;\n onOpenAgent: (runId: string) => void;\n}) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n return (\n <View style={styles.item}>\n <Pressable\n onPress={() => setExpanded(!expanded)}\n accessibilityRole=\"button\"\n accessibilityLabel={`${item.label}, ${WORKFLOW_STATUS[item.status].label}`}\n accessibilityState={{ expanded }}\n style={styles.toggle}\n >\n <Text style={styles.dim}>{expanded ? '▾' : '▸'}</Text>\n <Text style={styles.itemTitle}>{item.label}</Text>\n <StatusBadge tone={WORKFLOW_STATUS[item.status].tone}>{WORKFLOW_STATUS[item.status].label}</StatusBadge>\n </Pressable>\n <View style={styles.track}>\n <PhaseTrack shape={run.shape} phases={item.phases} />\n </View>\n {expanded && (\n <View style={styles.details}>\n {item.phases.map((phase) => (\n <View key={phase.key} style={styles.detail}>\n <View style={styles.inline}>\n <Text style={styles.title}>{phase.label}</Text>\n <Text style={styles.dim}>{workflowDuration(phase.startedAt, phase.finishedAt, now)}</Text>\n </View>\n {phase.executionStatus !== phase.status && (\n <Text style={styles.dim}>Step: {WORKFLOW_STATUS[phase.executionStatus].label}</Text>\n )}\n {phase.error && (\n <Text\n accessibilityRole={phase.status === 'failed' ? 'alert' : undefined}\n style={phase.status === 'failed' ? styles.error : styles.dim}\n >\n {phase.error}\n </Text>\n )}\n {phase.agents.map((agent, index) => (\n <View key={agent.runId} style={styles.inline}>\n <Button\n variant=\"link\"\n size=\"sm\"\n onPress={() => onOpenAgent(agent.runId)}\n accessibilityLabel={`Open ${phase.label} agent ${index + 1} transcript`}\n >\n Agent {index + 1} transcript ↗\n </Button>\n <StatusBadge tone={WORKFLOW_STATUS[agent.status].tone}>\n {WORKFLOW_STATUS[agent.status].label}\n </StatusBadge>\n </View>\n ))}\n {!phase.agents.length && <Text style={styles.dim}>No agent transcript</Text>}\n </View>\n ))}\n </View>\n )}\n </View>\n );\n}\n\nexport function DynamicWorkflowView({\n runs,\n now,\n connected = true,\n defaultExpandedKeys = [],\n onOpenAgent,\n}: DynamicWorkflowViewProps) {\n return (\n <ScrollView style={styles.screen} contentContainerStyle={styles.content} accessibilityLabel=\"Dynamic workflows\">\n {!connected && (\n <Text accessibilityRole=\"alert\" style={styles.notice}>\n Connection paused. These are the last reported workflow states.\n </Text>\n )}\n {!runs.length && (\n <View style={styles.empty}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n No workflows yet\n </Text>\n <Text style={styles.body}>\n Workflows appear here when Po starts them. You can carry on with your conversation.\n </Text>\n </View>\n )}\n {runs.map((run) => (\n <View key={run.key} style={styles.run}>\n <View style={styles.inline}>\n <Text accessibilityRole=\"header\" style={styles.runTitle}>\n {run.label}\n </Text>\n <StatusBadge tone={WORKFLOW_STATUS[run.status].tone}>{WORKFLOW_STATUS[run.status].label}</StatusBadge>\n </View>\n <Text style={styles.dim}>\n {workflowDuration(run.startedAt, run.finishedAt, now)}\n {run.executionStatus !== run.status\n ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}`\n : ''}\n </Text>\n {run.error && (\n <Text\n accessibilityRole={run.status === 'failed' ? 'alert' : undefined}\n style={run.status === 'failed' ? styles.error : styles.dim}\n >\n {run.error}\n </Text>\n )}\n {run.groups.map((group) => (\n <View key={group.key} style={styles.group}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n {group.label}\n </Text>\n <Text style={styles.dim}>\n {groupSummary(group)}\n {group.concurrency ? ` · Up to ${group.concurrency} at once` : ''}\n </Text>\n {group.items.map((item) => (\n <ItemRow\n key={item.key}\n item={item}\n run={run}\n now={now}\n defaultExpanded={defaultExpandedKeys.includes(item.key)}\n onOpenAgent={onOpenAgent}\n />\n ))}\n {group.truncated && (\n <Text style={styles.dim}>\n Showing {group.items.length} of {group.total} items.\n </Text>\n )}\n </View>\n ))}\n </View>\n ))}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n activityRow: { minHeight: 44, padding: theme.spacing(3), gap: theme.spacing(2) },\n activityDetail: { paddingLeft: theme.spacing(5), gap: theme.spacing(2) },\n progress: {\n height: 6,\n borderRadius: theme.borderRadius.full,\n overflow: 'hidden',\n flexDirection: 'row',\n backgroundColor: theme.colors.deep,\n },\n progressDone: { backgroundColor: theme.colors.green },\n progressRunning: { backgroundColor: theme.colors.yellow },\n screen: { flex: 1, minHeight: 0, backgroundColor: theme.colors.bg },\n content: { padding: theme.spacing(4), gap: theme.spacing(6) },\n run: { gap: theme.spacing(2) },\n inline: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: theme.spacing(1.5), minWidth: 0 },\n body: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n flexShrink: 1,\n },\n title: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n flexShrink: 1,\n },\n heading: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n },\n runTitle: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n flex: 1,\n minWidth: 0,\n },\n itemTitle: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n flex: 1,\n minWidth: 0,\n },\n dim: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n flexShrink: 1,\n },\n link: {\n color: theme.colors.blue,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n error: {\n color: theme.colors.red,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n notice: {\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n padding: theme.spacing(3),\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n empty: { paddingVertical: theme.spacing(6), gap: theme.spacing(2) },\n group: {\n minWidth: 0,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n paddingHorizontal: theme.spacing(3),\n paddingTop: theme.spacing(3),\n gap: theme.spacing(2),\n },\n item: {\n minWidth: 0,\n borderTopWidth: 1,\n borderTopColor: theme.colors['border-soft'],\n paddingVertical: theme.spacing(3),\n gap: theme.spacing(2),\n },\n toggle: { minHeight: 44, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n track: { minWidth: 0, paddingLeft: theme.spacing(4) },\n phaseSequence: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n minWidth: 0,\n width: '100%',\n maxWidth: '100%',\n flexShrink: 1,\n },\n phase: { maxWidth: '100%', flexShrink: 1 },\n phaseGroup: {\n minWidth: 0,\n maxWidth: '100%',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n padding: theme.spacing(1.5),\n },\n details: {\n borderLeftWidth: 1,\n borderLeftColor: theme.colors.border,\n paddingLeft: theme.spacing(3),\n gap: theme.spacing(3),\n },\n detail: { gap: theme.spacing(1) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react';\n\nimport type { DynamicWorkflowRun } from '../../../../../types/dynamicWorkflow';\nimport { workflows } from '../_lib/dynamicWorkflowStore.native';\nimport { DynamicWorkflowActivity, DynamicWorkflowView } from './DynamicWorkflowView.native';\n\nconst EMPTY_RUNS: DynamicWorkflowRun[] = [];\nconst TICK_MS = 1000;\n\ntype WorkflowTab = Parameters<WebPluginSlotProps['openTransientTab']>[0];\n\nexport function dynamicWorkflowTab(): WorkflowTab {\n return { id: 'dynamic-workflow-runs', label: 'Dynamic workflows', panel: DynamicWorkflowPanel, retainComposer: true };\n}\n\nexport function workflowAgentTab(runId: string): WorkflowTab {\n return {\n id: `dynamic-workflow-agent-${encodeURIComponent(runId)}`,\n label: 'Agent transcript',\n panel: ({ renderThread }) => <>{renderThread(runId)}</>,\n retainComposer: true,\n };\n}\n\nfunction useWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => workflows.select(workflows.store.state, sessionId));\n}\n\nexport function DynamicWorkflowActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useWorkflows(sessionId);\n return (\n <DynamicWorkflowActivity\n runs={snapshot?.runs ?? EMPTY_RUNS}\n onOpen={() => {\n if (sessionId !== null) openTransientTab(dynamicWorkflowTab());\n }}\n />\n );\n}\n\nexport function DynamicWorkflowPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useWorkflows(sessionId);\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), TICK_MS);\n return () => clearInterval(timer);\n }, []);\n return (\n <DynamicWorkflowView\n runs={snapshot?.runs ?? EMPTY_RUNS}\n now={now}\n onOpenAgent={(runId) => {\n if (sessionId !== null) openTransientTab(workflowAgentTab(runId));\n }}\n />\n );\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { WorkflowIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { dynamicWorkflowTab } from '../_components/DynamicWorkflowPanel.native';\nimport { workflows } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineActivityGroup({\n name: 'dynamic workflow',\n keys: '',\n icon: () => createElement(WorkflowIcon),\n order: 35,\n transientTab: dynamicWorkflowTab,\n activeSource: {\n subscribe(listener) {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId) {\n return workflows.select(workflows.store.state, sessionId)?.runs.some((run) => run.status === 'running') ?? false;\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowRunsChannel } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineChannelFile(workflowRunsChannel);\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { DynamicWorkflowActivitySection } from '../_components/DynamicWorkflowPanel.native';\n\nexport default defineFill({ slot: 'activity.dynamic workflow', component: DynamicWorkflowActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport activityGroupDynamicWorkflow from '../src/extensions/workspaces/sessions/(frontend)/activity-group/dynamic-workflow.native';\nimport channelDynamicWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native';\nimport fillDynamicWorkflow from '../src/extensions/workspaces/sessions/(frontend)/fill/DynamicWorkflow.activity.dynamic-workflow.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'dynamic-workflow',\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'dynamic-workflow' }, activityGroupDynamicWorkflow)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'dynamic_workflow_runs' }, channelDynamicWorkflowRuns)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.dynamic-workflow', id: 'dynamic-workflow' }, fillDynamicWorkflow)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"native.mjs","names":["Button","Dot","fontOf","StatusBadge","PoNativeTheme","useEffect","useState","AppState","StyleSheet","DynamicWorkflowItem","DynamicWorkflowPhase","DynamicWorkflowRun","DynamicWorkflowShape","DynamicWorkflowActivityProps","DynamicWorkflowViewProps","activitySummary","activityCounts","statusDot","groupSummary","WORKFLOW_STATUS","workflowDuration","Duration","startedAt","finishedAt","running","now","clock","setClock","Date","undefined","timer","ReturnType","setInterval","update","clearInterval","currentState","subscription","addEventListener","remove","styles","dim","DynamicWorkflowActivity","runs","connected","onOpen","run","length","itemTitle","link","map","counts","key","label","activityRow","inline","status","total","activityDetail","done","failed","error","progress","progressDone","width","progressRunning","PhaseTrack","shape","phases","kind","phase","find","entry","tone","leaves","node","some","children","grouped","phaseGroup","phaseSequence","child","ItemRow","item","defaultExpanded","onOpenAgent","runId","expanded","setExpanded","toggle","track","details","detail","title","executionStatus","agents","agent","index","DynamicWorkflowView","defaultExpandedKeys","Omit","screen","content","notice","empty","heading","body","runTitle","groups","group","concurrency","items","includes","truncated","create","theme","minHeight","padding","spacing","gap","uni__dependencies","paddingLeft","height","borderRadius","full","overflow","flexDirection","backgroundColor","colors","deep","green","yellow","flex","bg","flexWrap","alignItems","minWidth","color","text","fontFamily","sans","fontSize","base","lineHeight","flexShrink","hi","fontWeight","semibold","lg","sm","blue","red","borderWidth","borderColor","border","md","paddingVertical","paddingHorizontal","paddingTop","borderTopWidth","borderTopColor","maxWidth","borderLeftWidth","borderLeftColor","activityGroupDynamicWorkflow","channelDynamicWorkflowRuns","fillDynamicWorkflow"],"sources":["../../src/constants/dynamicWorkflow.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/dynamicWorkflowState.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/dynamicWorkflowStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/dynamicWorkflowPresentation.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/DynamicWorkflowPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/dynamic-workflow.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/DynamicWorkflow.activity.dynamic-workflow.native.tsx","../../generated/native.ts"],"sourcesContent":["export const DYNAMIC_WORKFLOW_CHANNEL = 'dynamic_workflow_runs';\n","import type { DynamicWorkflowSnapshot, DynamicWorkflowStatus } from '../../../../../types/dynamicWorkflow';\n\nconst STATUSES: readonly string[] = ['pending', 'running', 'completed', 'failed', 'stopped', 'skipped'];\nconst SHAPE_KINDS = ['step', 'sequence', 'parallel', 'branch', 'foreach'];\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\nfunction count(value: unknown): boolean {\n return finite(value) && Number.isSafeInteger(value) && value >= 0;\n}\nfunction status(value: unknown): value is DynamicWorkflowStatus {\n return typeof value === 'string' && STATUSES.includes(value);\n}\nfunction named(value: unknown): value is Record<string, unknown> {\n return record(value) && typeof value.key === 'string' && typeof value.label === 'string';\n}\nfunction timing(value: Record<string, unknown>): boolean {\n return (\n (value.startedAt === undefined || finite(value.startedAt)) &&\n (value.finishedAt === undefined || finite(value.finishedAt)) &&\n (value.error === undefined || typeof value.error === 'string')\n );\n}\nfunction shape(value: unknown, depth = 0): boolean {\n return (\n depth < 128 &&\n named(value) &&\n typeof value.kind === 'string' &&\n SHAPE_KINDS.includes(value.kind) &&\n Array.isArray(value.children) &&\n value.children.every((child: unknown) => shape(child, depth + 1))\n );\n}\nfunction phase(value: unknown): boolean {\n return (\n named(value) &&\n status(value.status) &&\n status(value.executionStatus) &&\n timing(value) &&\n Array.isArray(value.agents) &&\n value.agents.every(\n (agent: unknown) =>\n record(agent) &&\n typeof agent.runId === 'string' &&\n agent.runId.length > 0 &&\n status(agent.status) &&\n agent.status !== 'pending' &&\n agent.status !== 'skipped',\n )\n );\n}\nfunction item(value: unknown): boolean {\n return (\n named(value) &&\n count(value.index) &&\n status(value.status) &&\n Array.isArray(value.phases) &&\n value.phases.every(phase)\n );\n}\nfunction group(value: unknown): boolean {\n return (\n named(value) &&\n count(value.total) &&\n typeof value.truncated === 'boolean' &&\n (value.concurrency === undefined || (count(value.concurrency) && value.concurrency !== 0)) &&\n record(value.counts) &&\n STATUSES.every((key) => count((value.counts as Record<string, unknown>)[key])) &&\n Array.isArray(value.items) &&\n value.items.every(item)\n );\n}\nfunction run(value: unknown): boolean {\n return (\n named(value) &&\n typeof value.workflowId === 'string' &&\n status(value.status) &&\n status(value.executionStatus) &&\n finite(value.startedAt) &&\n timing(value) &&\n shape(value.shape) &&\n Array.isArray(value.groups) &&\n value.groups.every(group)\n );\n}\n\n/** Validate every field the two presentations read before admitting a transport frame. */\nexport function parseWorkflowSnapshot(value: unknown): DynamicWorkflowSnapshot | null {\n if (\n !record(value) ||\n value.version !== 1 ||\n !count(value.revision) ||\n typeof value.sessionId !== 'string' ||\n !Array.isArray(value.runs) ||\n !value.runs.every(run)\n )\n return null;\n return value as unknown as DynamicWorkflowSnapshot;\n}\n\n/** Session identity is checked by the channel before this monotonic fold. */\nexport function nextWorkflowSnapshot(\n current: DynamicWorkflowSnapshot | null,\n next: DynamicWorkflowSnapshot,\n): DynamicWorkflowSnapshot {\n return current !== null && next.revision <= current.revision ? current : next;\n}\n","import { defineSessionChannel, defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { DYNAMIC_WORKFLOW_CHANNEL } from '../../../../../constants/dynamicWorkflow';\nimport type { DynamicWorkflowSnapshot } from '../../../../../types/dynamicWorkflow';\nimport { nextWorkflowSnapshot, parseWorkflowSnapshot } from './dynamicWorkflowState';\n\nexport const workflows = defineSessionStore<DynamicWorkflowSnapshot | null>(null);\n\nexport const workflowRunsChannel = defineSessionChannel<DynamicWorkflowSnapshot>({\n channel: DYNAMIC_WORKFLOW_CHANNEL,\n parse: parseWorkflowSnapshot,\n apply(sessionId, snapshot) {\n if (snapshot.sessionId !== sessionId) return;\n workflows.update(sessionId, (current) => nextWorkflowSnapshot(current, snapshot));\n },\n drop(sessionId) {\n workflows.drop(sessionId);\n },\n});\n","import type {\n DynamicWorkflowGroup,\n DynamicWorkflowItem,\n DynamicWorkflowPhase,\n DynamicWorkflowShape,\n DynamicWorkflowRun,\n DynamicWorkflowStatus,\n} from '../../../../../types/dynamicWorkflow';\n\nexport const WORKFLOW_STATUS = {\n pending: { label: 'Pending', tone: 'neutral' },\n running: { label: 'Running', tone: 'running' },\n completed: { label: 'Done', tone: 'ok' },\n failed: { label: 'Failed', tone: 'error' },\n stopped: { label: 'Stopped', tone: 'neutral' },\n skipped: { label: 'Skipped', tone: 'neutral' },\n} as const satisfies Record<DynamicWorkflowStatus, { label: string; tone: string }>;\n\nexport function groupSummary(group: DynamicWorkflowGroup): string {\n const count = (status: DynamicWorkflowStatus) => group.counts[status];\n const parts = [`${count('running')} of ${group.total} running`, `${count('completed')} done`];\n if (count('failed')) parts.push(`${count('failed')} failed`);\n if (count('stopped')) parts.push(`${count('stopped')} stopped`);\n if (count('skipped')) parts.push(`${count('skipped')} skipped`);\n return parts.join(' · ');\n}\n\nexport function activitySummary(runs: DynamicWorkflowRun[]): string {\n if (!runs.length) return 'Workflows appear here when Po starts them.';\n return `${runs.filter((run) => run.status === 'running').length} running · ${runs.filter((run) => run.status !== 'running' && run.status !== 'pending').length} finished`;\n}\n\nexport function workflowDuration(startedAt?: number, finishedAt?: number, now = 0): string {\n if (startedAt === undefined) return 'Not started';\n const seconds = Math.max(0, Math.floor(((finishedAt ?? now) - startedAt) / 1000));\n if (seconds < 60) return `${seconds}s`;\n return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\nexport interface DynamicWorkflowViewProps {\n runs: DynamicWorkflowRun[];\n now: number;\n connected?: boolean;\n defaultExpandedKeys?: string[];\n onOpenAgent: (runId: string) => void;\n}\n\nexport interface DynamicWorkflowActivityProps {\n runs: DynamicWorkflowRun[];\n connected?: boolean;\n onOpen: () => void;\n}\n\nexport const MAX_GRAPH_ITEM_CELLS = 24;\n\nexport const statusDot = (status: DynamicWorkflowStatus) =>\n status === 'completed' ? 'green' : status === 'running' ? 'yellow' : status === 'failed' ? 'red' : 'neutral';\n\nexport function activityCounts(run: DynamicWorkflowRun) {\n // Root rows describe direct steps, not foreach items.\n const groups = run.groups.filter((group) => group.concurrency !== undefined);\n const total = groups.reduce((sum, group) => sum + group.total, 0);\n const count = (status: DynamicWorkflowStatus) => groups.reduce((sum, group) => sum + group.counts[status], 0);\n return { total, running: count('running'), done: count('completed'), failed: count('failed') };\n}\n\nexport interface WorkflowGraphNode {\n id: string;\n parentId?: string;\n position: { x: number; y: number };\n width: number;\n height: number;\n data: {\n label: string;\n kind: DynamicWorkflowShape['kind'];\n status: DynamicWorkflowStatus;\n phase?: DynamicWorkflowPhase;\n group?: DynamicWorkflowGroup;\n };\n}\nexport interface WorkflowGraphEdge {\n id: string;\n source: string;\n target: string;\n status: DynamicWorkflowStatus;\n}\n\n/** DOM-free series-parallel layout. All child coordinates are relative to their foreach parent. */\nexport function workflowGraph(run: DynamicWorkflowRun) {\n type Box = {\n nodes: WorkflowGraphNode[];\n edges: WorkflowGraphEdge[];\n width: number;\n height: number;\n entry: string[];\n exit: string[];\n };\n const edge = (source: string, target: string, nodes: WorkflowGraphNode[]): WorkflowGraphEdge => ({\n id: `${source}->${target}`,\n source,\n target,\n status: nodes.find((node) => node.id === target)?.data.status ?? 'pending',\n });\n const aggregate = (statuses: DynamicWorkflowStatus[]): DynamicWorkflowStatus =>\n statuses.includes('running')\n ? 'running'\n : statuses.includes('failed')\n ? 'failed'\n : statuses.length &&\n statuses.some((status) => status === 'completed') &&\n statuses.every((status) => status === 'completed' || status === 'skipped')\n ? 'completed'\n : statuses.includes('stopped')\n ? 'stopped'\n : statuses.length && statuses.every((status) => status === 'skipped')\n ? 'skipped'\n : 'pending';\n const layout = (shape: DynamicWorkflowShape, item?: DynamicWorkflowItem, parentId?: string): Box => {\n const id = `${parentId ?? run.key}:${shape.key}`;\n if (shape.kind === 'step') {\n const phase = item?.phases.find((phase) => phase.key === shape.key);\n return {\n nodes: [\n {\n id,\n parentId,\n position: { x: 0, y: 0 },\n width: 200,\n height: phase?.error ? 88 : 64,\n data: { label: shape.label, kind: shape.kind, status: phase?.status ?? 'pending', phase },\n },\n ],\n edges: [],\n width: 200,\n height: phase?.error ? 88 : 64,\n entry: [id],\n exit: [id],\n };\n }\n if (shape.kind === 'foreach') {\n const group = run.groups.find((group) =>\n item ? group.key === `${item.key}/${shape.key}` : group.key.endsWith(`/${shape.key}`),\n );\n const representative = group?.items.find((row) => row.status === 'running') ?? group?.items[0];\n const inner = combine(\n shape.children.map((child) => layout(child, representative, id)),\n false,\n );\n const width = Math.max(360, inner.width + 48);\n const cellRows = Math.ceil(Math.min(group?.items.length ?? 0, MAX_GRAPH_ITEM_CELLS) / 8);\n const height = inner.height + 112 + cellRows * 40 + (group && group.total > MAX_GRAPH_ITEM_CELLS ? 32 : 0);\n const status = group\n ? aggregate(\n Object.entries(group.counts)\n .filter(([, count]) => count > 0)\n .map(([status]) => status as DynamicWorkflowStatus),\n )\n : 'pending';\n const node: WorkflowGraphNode = {\n id,\n parentId,\n position: { x: 0, y: 0 },\n width,\n height,\n data: { label: shape.label, kind: shape.kind, status, group },\n };\n inner.nodes.forEach((node) => {\n if (node.parentId === id) {\n node.position.x += (width - inner.width) / 2;\n node.position.y += 72;\n }\n });\n return { nodes: [node, ...inner.nodes], edges: inner.edges, width, height, entry: [id], exit: [id] };\n }\n const children = shape.children.map((child) => layout(child, item, parentId));\n const box = combine(children, shape.kind !== 'sequence');\n if (shape.kind !== 'branch') return box;\n box.nodes.forEach((node) => {\n if (node.parentId === parentId) node.position.y += 144;\n });\n const status = aggregate(\n children.flatMap((child) =>\n child.nodes.filter((node) => node.parentId === parentId).map((node) => node.data.status),\n ),\n );\n const node: WorkflowGraphNode = {\n id,\n parentId,\n position: { x: (box.width - 160) / 2, y: 0 },\n width: 160,\n height: 96,\n data: { label: 'Branch', kind: 'branch', status },\n };\n box.edges.push(...box.entry.map((target) => edge(id, target, box.nodes)));\n return { ...box, nodes: [node, ...box.nodes], height: box.height + 144, entry: [id] };\n };\n function combine(boxes: Box[], horizontal: boolean): Box {\n const width = horizontal\n ? boxes.reduce((sum, box) => sum + box.width, 0) + Math.max(0, boxes.length - 1) * 48\n : Math.max(200, ...boxes.map((box) => box.width));\n const nodes: WorkflowGraphNode[] = [],\n edges: WorkflowGraphEdge[] = [];\n let offset = 0;\n boxes.forEach((box, index) => {\n const roots = new Set(box.nodes.map((node) => node.id));\n box.nodes.forEach((node) => {\n if (!node.parentId || !roots.has(node.parentId)) {\n node.position.x += horizontal ? offset : (width - box.width) / 2;\n node.position.y += horizontal ? 0 : offset;\n }\n });\n nodes.push(...box.nodes);\n edges.push(...box.edges);\n if (!horizontal && index)\n for (const source of boxes[index - 1].exit)\n for (const target of box.entry) edges.push(edge(source, target, box.nodes));\n offset += (horizontal ? box.width : box.height) + 48;\n });\n return {\n nodes,\n edges,\n width,\n height: horizontal ? Math.max(0, ...boxes.map((box) => box.height)) : Math.max(0, offset - 48),\n entry: horizontal ? boxes.flatMap((box) => box.entry) : (boxes[0]?.entry ?? []),\n exit: horizontal ? boxes.flatMap((box) => box.exit) : (boxes.at(-1)?.exit ?? []),\n };\n }\n const root = run.groups\n .flatMap((group) => group.items)\n .find((item) =>\n item.phases.some((phase) => {\n const direct = (shape: DynamicWorkflowShape): boolean =>\n shape.kind === 'foreach' ? false : shape.key === phase.key || shape.children.some(direct);\n return direct(run.shape);\n }),\n );\n return layout(run.shape, root);\n}\n","import { Button, Dot, fontOf, StatusBadge } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useEffect, useState } from 'react';\nimport { AppState, Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type {\n DynamicWorkflowItem,\n DynamicWorkflowPhase,\n DynamicWorkflowRun,\n DynamicWorkflowShape,\n} from '../../../../../types/dynamicWorkflow';\nimport {\n type DynamicWorkflowActivityProps,\n type DynamicWorkflowViewProps,\n activitySummary,\n activityCounts,\n statusDot,\n groupSummary,\n WORKFLOW_STATUS,\n workflowDuration,\n} from './dynamicWorkflowPresentation';\n\n/** Only a visible running duration ticks, not its surrounding workflow tree. */\nfunction Duration({\n startedAt,\n finishedAt,\n running,\n now,\n}: {\n startedAt?: number;\n finishedAt?: number;\n running: boolean;\n now?: number;\n}) {\n const [clock, setClock] = useState(() => Date.now());\n useEffect(() => {\n if (now !== undefined || !running || startedAt === undefined || finishedAt !== undefined) return;\n let timer: ReturnType<typeof setInterval> | undefined;\n const update = () => {\n clearInterval(timer);\n if (AppState.currentState !== 'active') return;\n setClock(Date.now());\n timer = setInterval(() => setClock(Date.now()), 1000);\n };\n const subscription = AppState.addEventListener('change', update);\n update();\n return () => {\n clearInterval(timer);\n subscription.remove();\n };\n }, [startedAt, finishedAt, running, now]);\n return <Text style={styles.dim}>{workflowDuration(startedAt, finishedAt, now ?? clock)}</Text>;\n}\n\nexport function DynamicWorkflowActivity({ runs, connected = true, onOpen }: DynamicWorkflowActivityProps) {\n return (\n <View style={styles.run}>\n <Text style={styles.dim}>{connected ? activitySummary(runs) : 'Connection paused. Showing last update.'}</Text>\n {!runs.length && (\n <Button variant=\"ghost\" size=\"card\" onPress={onOpen} accessibilityLabel=\"Open dynamic workflows\">\n <Text style={styles.itemTitle}>No workflows yet</Text>\n <Text style={styles.dim}>Idle</Text>\n <Text style={styles.link}>View workflows →</Text>\n </Button>\n )}\n {runs.map((run) => {\n const counts = activityCounts(run);\n return (\n <Pressable\n key={run.key}\n onPress={onOpen}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${run.label}`}\n style={styles.activityRow}\n >\n <View style={styles.inline}>\n <Dot tone={statusDot(run.status)} size=\"md\" />\n <Text style={styles.itemTitle}>{run.label}</Text>\n <Text style={styles.dim}>{WORKFLOW_STATUS[run.status].label} ›</Text>\n </View>\n {counts.total > 0 && (\n <View style={styles.activityDetail}>\n <Text style={styles.dim}>\n {run.status === 'running' ? `${counts.running} of ${counts.total} running` : `${counts.total} items`}{' '}\n · {counts.done} done{counts.failed > 0 && <Text style={styles.error}> · {counts.failed} failed</Text>}\n </Text>\n <View\n style={styles.progress}\n accessibilityLabel={`${counts.done} done, ${counts.running} running, ${counts.total} total`}\n >\n <View style={[styles.progressDone, { width: `${(counts.done / counts.total) * 100}%` }]} />\n <View style={[styles.progressRunning, { width: `${(counts.running / counts.total) * 100}%` }]} />\n </View>\n </View>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nfunction PhaseTrack({ shape, phases }: { shape: DynamicWorkflowShape; phases: DynamicWorkflowPhase[] }) {\n if (shape.kind === 'step') {\n const phase = phases.find((entry) => entry.key === shape.key);\n return phase ? (\n <View style={styles.phase}>\n <StatusBadge tone={WORKFLOW_STATUS[phase.status].tone}>\n {phase.label} · {WORKFLOW_STATUS[phase.status].label}\n </StatusBadge>\n </View>\n ) : null;\n }\n const leaves = (node: DynamicWorkflowShape): boolean =>\n node.kind === 'step' ? phases.some((phase) => phase.key === node.key) : node.children.some(leaves);\n if (!leaves(shape)) return null;\n const grouped = shape.kind === 'parallel' || shape.kind === 'branch';\n return (\n <View style={grouped ? styles.phaseGroup : styles.phaseSequence}>\n {grouped && <Text style={styles.dim}>{shape.kind === 'parallel' ? 'Parallel' : 'Branch'}</Text>}\n {shape.children.map((child) => (\n <PhaseTrack key={child.key} shape={child} phases={phases} />\n ))}\n </View>\n );\n}\n\nfunction ItemRow({\n item,\n run,\n now,\n defaultExpanded,\n onOpenAgent,\n}: {\n item: DynamicWorkflowItem;\n run: DynamicWorkflowRun;\n now?: number;\n defaultExpanded: boolean;\n onOpenAgent: (runId: string) => void;\n}) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n return (\n <View style={styles.item}>\n <Pressable\n onPress={() => setExpanded(!expanded)}\n accessibilityRole=\"button\"\n accessibilityLabel={`${item.label}, ${WORKFLOW_STATUS[item.status].label}`}\n accessibilityState={{ expanded }}\n style={styles.toggle}\n >\n <Text style={styles.dim}>{expanded ? '▾' : '▸'}</Text>\n <Text style={styles.itemTitle}>{item.label}</Text>\n <StatusBadge tone={WORKFLOW_STATUS[item.status].tone}>{WORKFLOW_STATUS[item.status].label}</StatusBadge>\n </Pressable>\n <View style={styles.track}>\n <PhaseTrack shape={run.shape} phases={item.phases} />\n </View>\n {expanded && (\n <View style={styles.details}>\n {item.phases.map((phase) => (\n <View key={phase.key} style={styles.detail}>\n <View style={styles.inline}>\n <Text style={styles.title}>{phase.label}</Text>\n <Duration\n startedAt={phase.startedAt}\n finishedAt={phase.finishedAt}\n running={phase.status === 'running'}\n now={now}\n />\n </View>\n {phase.executionStatus !== phase.status && (\n <Text style={styles.dim}>Step: {WORKFLOW_STATUS[phase.executionStatus].label}</Text>\n )}\n {phase.error && (\n <Text\n accessibilityRole={phase.status === 'failed' ? 'alert' : undefined}\n style={phase.status === 'failed' ? styles.error : styles.dim}\n >\n {phase.error}\n </Text>\n )}\n {phase.agents.map((agent, index) => (\n <View key={agent.runId} style={styles.inline}>\n <Button\n variant=\"link\"\n size=\"sm\"\n onPress={() => onOpenAgent(agent.runId)}\n accessibilityLabel={`Open ${phase.label} agent ${index + 1} transcript`}\n >\n Agent {index + 1} transcript ↗\n </Button>\n <StatusBadge tone={WORKFLOW_STATUS[agent.status].tone}>\n {WORKFLOW_STATUS[agent.status].label}\n </StatusBadge>\n </View>\n ))}\n {!phase.agents.length && <Text style={styles.dim}>No agent transcript</Text>}\n </View>\n ))}\n </View>\n )}\n </View>\n );\n}\n\nexport function DynamicWorkflowView({\n runs,\n now,\n connected = true,\n defaultExpandedKeys = [],\n onOpenAgent,\n}: Omit<DynamicWorkflowViewProps, 'now'> & { now?: number }) {\n return (\n <ScrollView style={styles.screen} contentContainerStyle={styles.content} accessibilityLabel=\"Dynamic workflows\">\n {!connected && (\n <Text accessibilityRole=\"alert\" style={styles.notice}>\n Connection paused. These are the last reported workflow states.\n </Text>\n )}\n {!runs.length && (\n <View style={styles.empty}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n No workflows yet\n </Text>\n <Text style={styles.body}>\n Workflows appear here when Po starts them. You can carry on with your conversation.\n </Text>\n </View>\n )}\n {runs.map((run) => (\n <View key={run.key} style={styles.run}>\n <View style={styles.inline}>\n <Text accessibilityRole=\"header\" style={styles.runTitle}>\n {run.label}\n </Text>\n <StatusBadge tone={WORKFLOW_STATUS[run.status].tone}>{WORKFLOW_STATUS[run.status].label}</StatusBadge>\n </View>\n <Text style={styles.dim}>\n <Duration\n startedAt={run.startedAt}\n finishedAt={run.finishedAt}\n running={run.status === 'running'}\n now={now}\n />\n {run.executionStatus !== run.status\n ? ` · Workflow execution: ${WORKFLOW_STATUS[run.executionStatus].label}`\n : ''}\n </Text>\n {run.error && (\n <Text\n accessibilityRole={run.status === 'failed' ? 'alert' : undefined}\n style={run.status === 'failed' ? styles.error : styles.dim}\n >\n {run.error}\n </Text>\n )}\n {run.groups.map((group) => (\n <View key={group.key} style={styles.group}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n {group.label}\n </Text>\n <Text style={styles.dim}>\n {groupSummary(group)}\n {group.concurrency ? ` · Up to ${group.concurrency} at once` : ''}\n </Text>\n {group.items.map((item) => (\n <ItemRow\n key={item.key}\n item={item}\n run={run}\n now={now}\n defaultExpanded={defaultExpandedKeys.includes(item.key)}\n onOpenAgent={onOpenAgent}\n />\n ))}\n {group.truncated && (\n <Text style={styles.dim}>\n Showing {group.items.length} of {group.total} items.\n </Text>\n )}\n </View>\n ))}\n </View>\n ))}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n activityRow: { minHeight: 44, padding: theme.spacing(3), gap: theme.spacing(2) },\n activityDetail: { paddingLeft: theme.spacing(5), gap: theme.spacing(2) },\n progress: {\n height: 6,\n borderRadius: theme.borderRadius.full,\n overflow: 'hidden',\n flexDirection: 'row',\n backgroundColor: theme.colors.deep,\n },\n progressDone: { backgroundColor: theme.colors.green },\n progressRunning: { backgroundColor: theme.colors.yellow },\n screen: { flex: 1, minHeight: 0, backgroundColor: theme.colors.bg },\n content: { padding: theme.spacing(4), gap: theme.spacing(6) },\n run: { gap: theme.spacing(2) },\n inline: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: theme.spacing(1.5), minWidth: 0 },\n body: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n flexShrink: 1,\n },\n title: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n flexShrink: 1,\n },\n heading: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n },\n runTitle: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n flex: 1,\n minWidth: 0,\n },\n itemTitle: {\n color: theme.colors.hi,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n flex: 1,\n minWidth: 0,\n },\n dim: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n flexShrink: 1,\n },\n link: {\n color: theme.colors.blue,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n error: {\n color: theme.colors.red,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n notice: {\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n padding: theme.spacing(3),\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n empty: { paddingVertical: theme.spacing(6), gap: theme.spacing(2) },\n group: {\n minWidth: 0,\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n paddingHorizontal: theme.spacing(3),\n paddingTop: theme.spacing(3),\n gap: theme.spacing(2),\n },\n item: {\n minWidth: 0,\n borderTopWidth: 1,\n borderTopColor: theme.colors['border-soft'],\n paddingVertical: theme.spacing(3),\n gap: theme.spacing(2),\n },\n toggle: { minHeight: 44, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n track: { minWidth: 0, paddingLeft: theme.spacing(4) },\n phaseSequence: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n minWidth: 0,\n width: '100%',\n maxWidth: '100%',\n flexShrink: 1,\n },\n phase: { maxWidth: '100%', flexShrink: 1 },\n phaseGroup: {\n minWidth: 0,\n maxWidth: '100%',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.md,\n padding: theme.spacing(1.5),\n },\n details: {\n borderLeftWidth: 1,\n borderLeftColor: theme.colors.border,\n paddingLeft: theme.spacing(3),\n gap: theme.spacing(3),\n },\n detail: { gap: theme.spacing(1) },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { useCallback, useSyncExternalStore } from 'react';\n\nimport type { DynamicWorkflowRun } from '../../../../../types/dynamicWorkflow';\nimport { workflows } from '../_lib/dynamicWorkflowStore.native';\nimport { DynamicWorkflowActivity, DynamicWorkflowView } from './DynamicWorkflowView.native';\n\nconst EMPTY_RUNS: DynamicWorkflowRun[] = [];\n\ntype WorkflowTab = Parameters<WebPluginSlotProps['openTransientTab']>[0];\n\nexport function dynamicWorkflowTab(): WorkflowTab {\n return { id: 'dynamic-workflow-runs', label: 'Dynamic workflows', panel: DynamicWorkflowPanel, retainComposer: true };\n}\n\nexport function workflowAgentTab(runId: string): WorkflowTab {\n return {\n id: `dynamic-workflow-agent-${encodeURIComponent(runId)}`,\n label: 'Agent transcript',\n panel: ({ renderThread }) => <>{renderThread(runId)}</>,\n retainComposer: true,\n };\n}\n\nfunction useWorkflows(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => workflows.select(workflows.store.state, sessionId));\n}\n\nexport function DynamicWorkflowActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useWorkflows(sessionId);\n return (\n <DynamicWorkflowActivity\n runs={snapshot?.runs ?? EMPTY_RUNS}\n onOpen={() => {\n if (sessionId !== null) openTransientTab(dynamicWorkflowTab());\n }}\n />\n );\n}\n\nexport function DynamicWorkflowPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useWorkflows(sessionId);\n return (\n <DynamicWorkflowView\n runs={snapshot?.runs ?? EMPTY_RUNS}\n onOpenAgent={(runId) => {\n if (sessionId !== null) openTransientTab(workflowAgentTab(runId));\n }}\n />\n );\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { WorkflowIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { dynamicWorkflowTab } from '../_components/DynamicWorkflowPanel.native';\nimport { workflows } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineActivityGroup({\n name: 'dynamic workflow',\n keys: '',\n icon: () => createElement(WorkflowIcon),\n order: 35,\n transientTab: dynamicWorkflowTab,\n activeSource: {\n subscribe(listener) {\n const subscription = workflows.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId) {\n return workflows.select(workflows.store.state, sessionId)?.runs.some((run) => run.status === 'running') ?? false;\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { workflowRunsChannel } from '../_lib/dynamicWorkflowStore.native';\n\nexport default defineChannelFile(workflowRunsChannel);\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { DynamicWorkflowActivitySection } from '../_components/DynamicWorkflowPanel.native';\n\nexport default defineFill({ slot: 'activity.dynamic workflow', component: DynamicWorkflowActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport activityGroupDynamicWorkflow from '../src/extensions/workspaces/sessions/(frontend)/activity-group/dynamic-workflow.native';\nimport channelDynamicWorkflowRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/dynamic-workflow-runs.native';\nimport fillDynamicWorkflow from '../src/extensions/workspaces/sessions/(frontend)/fill/DynamicWorkflow.activity.dynamic-workflow.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'dynamic-workflow',\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'dynamic-workflow' }, activityGroupDynamicWorkflow)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'dynamic_workflow_runs' }, channelDynamicWorkflowRuns)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.dynamic-workflow', id: 'dynamic-workflow' }, fillDynamicWorkflow)]; },\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-dynamic-workflow",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.0.1-alpha.3",
4
4
  "description": "Tracked Mastra workflows for Po",
5
5
  "keywords": [
6
6
  "ai",
@@ -55,17 +55,17 @@
55
55
  "access": "public"
56
56
  },
57
57
  "dependencies": {
58
- "@agimon-ai/po-core": "0.0.0-alpha.34",
59
- "@agimon-ai/po-native-components": "0.0.0-alpha.34",
60
- "@agimon-ai/po-web-components": "0.0.0-alpha.34",
58
+ "@agimon-ai/po-core": "0.0.0-alpha.35",
59
+ "@agimon-ai/po-native-components": "0.0.0-alpha.35",
60
+ "@agimon-ai/po-web-components": "0.0.0-alpha.35",
61
61
  "@deepseek-ai/cordis": "4.0.5",
62
62
  "@mastra/core": "1.78.0",
63
63
  "typebox": "1.3.37",
64
64
  "zod": "3.25.76"
65
65
  },
66
66
  "devDependencies": {
67
- "@agimon-ai/po-build": "0.0.0-alpha.34",
68
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.34",
67
+ "@agimon-ai/po-build": "0.0.0-alpha.35",
68
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.35",
69
69
  "@earendil-works/pi-coding-agent": "1.3.0",
70
70
  "@tanstack/react-store": "0.11.2",
71
71
  "@tanstack/store": "0.11.2",